From 73b8af0fe8fc410c42858d8a82f0399614f6ceee Mon Sep 17 00:00:00 2001 From: Bledar Muca Date: Wed, 7 Oct 2020 14:21:37 +0200 Subject: [PATCH 1/5] Aumenta il numero delle variabili per le query con sqlite. --- deps/sqlite-autoconf-3320300.tar.gz | Bin 2904404 -> 2899605 bytes deps/sqlite-autoconf-3320300/INSTALL | 370 + deps/sqlite-autoconf-3320300/Makefile.am | 20 + .../sqlite-autoconf-3320300/Makefile.fallback | 19 + deps/sqlite-autoconf-3320300/Makefile.in | 1028 + deps/sqlite-autoconf-3320300/Makefile.msc | 1036 + deps/sqlite-autoconf-3320300/README.txt | 113 + deps/sqlite-autoconf-3320300/Replace.cs | 223 + deps/sqlite-autoconf-3320300/aclocal.m4 | 10199 + deps/sqlite-autoconf-3320300/compile | 347 + deps/sqlite-autoconf-3320300/config.guess | 1480 + deps/sqlite-autoconf-3320300/config.sub | 1801 + deps/sqlite-autoconf-3320300/configure | 16004 + deps/sqlite-autoconf-3320300/configure.ac | 239 + deps/sqlite-autoconf-3320300/depcomp | 791 + deps/sqlite-autoconf-3320300/install-sh | 508 + deps/sqlite-autoconf-3320300/ltmain.sh | 11156 + deps/sqlite-autoconf-3320300/missing | 215 + deps/sqlite-autoconf-3320300/shell.c | 19550 ++ deps/sqlite-autoconf-3320300/sqlite3.1 | 286 + deps/sqlite-autoconf-3320300/sqlite3.c | 229787 +++++++++++++++ deps/sqlite-autoconf-3320300/sqlite3.h | 12168 + deps/sqlite-autoconf-3320300/sqlite3.pc.in | 13 + deps/sqlite-autoconf-3320300/sqlite3.rc | 83 + deps/sqlite-autoconf-3320300/sqlite3ext.h | 659 + deps/sqlite-autoconf-3320300/tea/Makefile.in | 440 + deps/sqlite-autoconf-3320300/tea/README | 36 + deps/sqlite-autoconf-3320300/tea/aclocal.m4 | 9 + deps/sqlite-autoconf-3320300/tea/configure | 9989 + deps/sqlite-autoconf-3320300/tea/configure.ac | 201 + .../sqlite-autoconf-3320300/tea/doc/sqlite3.n | 15 + .../tea/generic/tclsqlite3.c | 4016 + .../sqlite-autoconf-3320300/tea/license.terms | 6 + .../tea/pkgIndex.tcl.in | 7 + .../tea/tclconfig/install-sh | 528 + .../tea/tclconfig/tcl.m4 | 4168 + .../tea/win/makefile.vc | 419 + .../tea/win/nmakehlp.c | 694 + deps/sqlite-autoconf-3320300/tea/win/rules.vc | 711 + 39 files changed, 329334 insertions(+) create mode 100644 deps/sqlite-autoconf-3320300/INSTALL create mode 100644 deps/sqlite-autoconf-3320300/Makefile.am create mode 100644 deps/sqlite-autoconf-3320300/Makefile.fallback create mode 100644 deps/sqlite-autoconf-3320300/Makefile.in create mode 100644 deps/sqlite-autoconf-3320300/Makefile.msc create mode 100644 deps/sqlite-autoconf-3320300/README.txt create mode 100644 deps/sqlite-autoconf-3320300/Replace.cs create mode 100644 deps/sqlite-autoconf-3320300/aclocal.m4 create mode 100755 deps/sqlite-autoconf-3320300/compile create mode 100755 deps/sqlite-autoconf-3320300/config.guess create mode 100755 deps/sqlite-autoconf-3320300/config.sub create mode 100755 deps/sqlite-autoconf-3320300/configure create mode 100644 deps/sqlite-autoconf-3320300/configure.ac create mode 100755 deps/sqlite-autoconf-3320300/depcomp create mode 100755 deps/sqlite-autoconf-3320300/install-sh create mode 100644 deps/sqlite-autoconf-3320300/ltmain.sh create mode 100755 deps/sqlite-autoconf-3320300/missing create mode 100644 deps/sqlite-autoconf-3320300/shell.c create mode 100644 deps/sqlite-autoconf-3320300/sqlite3.1 create mode 100644 deps/sqlite-autoconf-3320300/sqlite3.c create mode 100644 deps/sqlite-autoconf-3320300/sqlite3.h create mode 100644 deps/sqlite-autoconf-3320300/sqlite3.pc.in create mode 100644 deps/sqlite-autoconf-3320300/sqlite3.rc create mode 100644 deps/sqlite-autoconf-3320300/sqlite3ext.h create mode 100644 deps/sqlite-autoconf-3320300/tea/Makefile.in create mode 100644 deps/sqlite-autoconf-3320300/tea/README create mode 100644 deps/sqlite-autoconf-3320300/tea/aclocal.m4 create mode 100755 deps/sqlite-autoconf-3320300/tea/configure create mode 100644 deps/sqlite-autoconf-3320300/tea/configure.ac create mode 100644 deps/sqlite-autoconf-3320300/tea/doc/sqlite3.n create mode 100644 deps/sqlite-autoconf-3320300/tea/generic/tclsqlite3.c create mode 100644 deps/sqlite-autoconf-3320300/tea/license.terms create mode 100644 deps/sqlite-autoconf-3320300/tea/pkgIndex.tcl.in create mode 100644 deps/sqlite-autoconf-3320300/tea/tclconfig/install-sh create mode 100644 deps/sqlite-autoconf-3320300/tea/tclconfig/tcl.m4 create mode 100644 deps/sqlite-autoconf-3320300/tea/win/makefile.vc create mode 100644 deps/sqlite-autoconf-3320300/tea/win/nmakehlp.c create mode 100644 deps/sqlite-autoconf-3320300/tea/win/rules.vc diff --git a/deps/sqlite-autoconf-3320300.tar.gz b/deps/sqlite-autoconf-3320300.tar.gz index 2e6f2a8af3aeccc7172d6a91c2d14552cd8007af..71975531c98893398564673f260de16ed05b1f39 100644 GIT binary patch literal 2899605 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

{|JU>vtM6LIb(n(o^#N% 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 z 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 z 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 @?^adGb+6pIE%g8}Zo?^AdVVM? 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

OO0e&~3+Ub*A_@GRkwO zvz&17-S)=vYQCn4H;W30x%u254aV-({Hg4Jdq-(|J!S=gr{)1{QIxEztf8;sjHqLY zt1jpT#%nM47j?9xGuD5l5O%l3@Wv+lnhbkg-k5lcf`^%*pxr3g3G?r9)fRGWDOBcG z7vxEi`iXNh2eJ+E@>lA{*pS3?$0x1tPkuDbu9r~%5hv!!NhF>vlv({rrLcE@}I1yPIs>ZnP?Iz*@)d z&)u*Yc!ceFk+IbV<-n4&&!$rdKwQefTa84{rM~6?omd+nF>;Y(dQ_{=Jp)BBo~A!# z7}1r$hvW)X6V6S*sKtYHf*>RK^G0D$Ci%R<@_IS5G(bGe|a!d09Az1@sQ zsD6Ag4K5zf(HOJk@boaoW&bEOzs$Ub%gD94{S+>KPWX*|uEdVlVDH@D=c{xw!A(Da zRB5PJ;ALkMZnHLlFX3|R$Hu^EXu~^%m^w7yRCv!JdNFr8=r;E6eLkOb@s;dipqEP*@-L^Qpv9VrNk}4#JCy9KNTc z3^TorC(xL>;1#%S%)D}U)XQ7!GpFNbxxoX5{9%+zJ68dAOpvtj*DkE?lnF^dmwD1&c zo#Me)W(|0=0{0$$|GMxptJy6fMivs%U`=`G0phm@gj2N+){IMTri^O4n9;E*H(Czz z>;*3hS4Fbmm#$6N4vbNqa}AoWsv!#PVd%i^WjZfRu-s0`dTvNufzYsY62&6#2-FIIoY6tF z{t7J-Grra=?bJT!ScHoHQ#Mh#t-f5)4aNYX7#~LTC3h1El|~ zzpB7JJ{LvSgKZX3?i>W}6FyP6Y33soUU8}i0vV_RnCakeD@&bfa{i&;CNik`bMQf0 zFNHB@bdUNJfCUDAF&6A(EvpR!to>o^8%(MsArcb{3=GH1tpa4R2opjy3EEpQmq(`_ zv*iYqHB6>;wv-o*xE*$d^6CnpgmIc)wE-~&1pn#=Zn2I##-6=?I zf-qU3A1Z|lk+UQoJY2RB=B^doywy8*k0V*g$Ih*2mx5N>qlzt(uwn4tMu3UnG~dTW z;8>Y4XZEA=n!#5_v|A(pLN`B0UR<(FHuBDX-Vu^`n9j@|(STd5`()r0K%1N9V~z`k zO{tr2KC_xfsSBcCZxL@*cu18vm{s*e@}W6}2(2(Rt7v;1FHjZm#)5mo9 z0E_8NffHf_#t3MOa8sj13+Q%eh%j6nH7(!bQ1c_0g+>oo@jfv(u*rKo2pYx4eoy9L z&3#H|dms$UyA2L7$HNgfxKuM6aY0{UW8y~v4KdqgOJ;~N;a_Rz1_fKYT@2`*ufktSOX$0JH;A4lqi%sfFlr3we+_~o3UV|O4})Q2LGmWw$}Br2mg!*MyZ z0PaOiQy@ost#92OX6dvRyXvO(AnOc(JIQ)C{DPO=yaGBGUBDJVSR4=hnCkTyre7^8gn_;waUI0b z3Az^C!CTBxd3Kz&fwR3fnRMo}2ot?}$4SN?LB&~o>CR8?BmkSkOVF16bFdO6|P?Cwn(YH04Rs|H1~vn7_ZFAO9@X{bi%6FIs1cYS{NJLW^n0ok-L=! z2)o1qbzmTh5iX_`9w&WXIVZfNrfB;JVok(BF$@|5h}s1h3`=$x=z-SXg0VoY7V!Ed z>vq`nt}l2=75+Rv_i7`ND!LV+B0?RC+3(J= z;avp}4GWEhvpC^%#}j!Y;WFCgE>?i!?|0hW?%DA>Csdq4L}s!W!9Ouz_B32#3BeRX zss^wet;+^P^TRgZ=_??dTvFyiR-i`7I8FiEs8SCUi;Nh@8bKA?tt>gSSHPcB#Gbbm zQX0u$=EY18C22+kPpy0JS)o{0(d*6&5ppaV`DYmSJ=`iRuU0(=6t_Ekz+6b@LwGhd zE30REA~MhCQws2z+_50d@0Nz9R1(Y00Yl=*H0dt>!wA~9 zvy1}|>=0}K&Op;w0&W2Gh`0X`RQY3j*kN`PRg~a*A|rRjEvgf(Ypu=i8_DKcR6$VN z)shrkj1^z=3ZJh_Gw{!vmdj1)$4K4QaW(LEZ59UcD5d7Y1MaYM&_2+bBus47DSoH< zJ(b`6n19#l-G%9PLOKHA(y3ikZbG$wi5|~pG2J|VaXbMyQteId>;Ox9rNIoOUcG5Z z-dJHS3`KxxG1v8y-ALYzJsgiG6rxgaUQ+2)1(*)nN_{bX54tCc<$s3d_i3B`F;`93!zZktL87R z!*BIh+kf)=>p@)$d5iB>B+|KElG0fg>2Kx%TL0~jcJ^V%ksjBS+`;sz4H;Jf2ec*gPYqOS6o7s5GCU+@xvv=%% zxTEM93t&5*v8@;5h1`qkjZ!}-YsQZQkYyr+|Gg#*YrinS6_UjaO+o9J_0QQ&Nmzrc zypPFp=yn%Oe68$yZ&cs;`fB@`-^QT=vq$DLHk+Y_WxC4s z64%!1lZn#4JN9NUgQbHateaU?-qH~}xRyMJB!e4uC^Q+qCMyp;D(MhKUZMxco z9PF#Fup=j7J6uW@=v{u-GjbazZOdK)yT!KU1@>xrTd$bYF62#2M!cMlOWlm>=nqAr4q0 zbIk=3X;q5>T~%mg{K!aOwj7X?rHn}FWAjw>DsJZMSp6bi&j1-!%)Sb}1pz{1?#yWN zqj9<5>mn8nF-;KexRf^|{7kjKs)A*eIWP8dR~1JP^4*m7kRMcYNFOX;ax z)piyAl%nCymZa!--LU7xZ(3$+;sc>95V$G5OKjm5i5c@^(cGVbhCJzMVPJf=J?5W% z_%Q#V!G_w15%GC^8{r0Fl@a=W9_+iPYZ{l~hzAl+08={m33~8X;n!s1c;Kc;VueF@ zNqIK8Yw^6XPN9f#+got zPRyF5XEn!S5cN$nemRyBLHsoLffcL?nL8$mA@6P^{7j5LBI%a!4Eu=!8V-202JX>g zVK+DfObRF>OvP0`6T~!}Y&XEs#q5$z9!psuR-XD+@$~N_Q{oC%J8Gc;HgT3D%Lhrv z1~tya-Rry8c!d_cd;jn$I(jv?NYcbXyF9M7&Ul4Eb`zgLxgPs|%z^W;J-;;rvw|c;>i^v0Wd;?x5vJ+7{8dLfGxM&1inkJQ0$@QHn*;4T zUerQfV?jy7dpI*;bFp26yLOW1!w2qrxhz}12BBV(yk0lRU6XV7v%xF@#LWn*sPg$u|NJKRq>G8Y)eRs;#5wlU zO`{cQzCBY^Fl-|V8Ndl@haM~$d}JmY)W=4`y`FB?g`Uj|M36HCS$YvKG1PQF{*q5> zJa;^sQ`dIOhA|1^2$ENg{SkaKayNXQHgBDhYJkLoTQ?h$55O}`cQ*lxAkiT!%}9J= zZ#*25=Z9+Q^(d*!g7W+2QN3Vhkz(VU{0U6l+nm1PM1qk-(?No8B~xAl?Ly^ax)u{d zJwz^@3vDxZ;4B~9nb0+Aa*z(eO)8%221o_r_zIKqQW3|e z(CVY4(>Y-637E^M2k`P4;t-a)w*CrlJe&6F4CsYcxN)F?-^+ad#d!W6jOS6f-v3kB zPKn*rgY&Y0x-*E;J)X?+E6fG@+A~!AanbpR2@4F2kS2&UL86)wnGMgOgim5S7H-Ae zbVZxawex!aaHspr{l_WD3;&|(YO1C-z(c|xCoRxSAb)4Q#pwHkUTADbbWLE7*Jdv?-t5L50%yg*XYHZ60=O z(6ts=;99ub;)|Pfk+vdWL2jcj{c2LXcB^*n7NK^qe^?u}@TO!vX+5hy-SpCWRv1Bq zo*%Wq?YrG*hGD7MskALi-~cPQ2Gx zbeu;EIhxaZ;HSM|dQpJi_NVqQ`-gj-vrhL-yLz~cJuwDu@jclP(mBz7Nl9Lm#))2tMjuhKKd0}%= z8#LZ!jr{XisOOfYo|lF}8;l+%?kilOR8vjAN}bs4ClD~1(8f#xE=aO#RER+KQv47{%4k-RB&-qQEk zh)~HlFpgytvB;k{k{6BSd-OxX|0ll_yV1u+5VQi17Ohj`rQ0&RpH1U#yVmmUjjbgA zVdVbvW+%*P4_Q_yLi(+-sjFBSkC_gw``o&lgEjVjQP!QeQnR( zO!p)|I&PV~OrEshOCrfU>v`8YtgINitLt97_Vu@&_Wq0g?R-+?A44TR(|%rq z7yn7CW&ZUpw;C?DdNcHVf^Sq=DJ{(hH3y}-x|IJ)H5YoDn*xve&e@!ASd z@szaZHAiJP!?I7pE9d`zm-+9xcmM3GKfcAA?{8(sK=fdXn?gxS*zp2A+9}01WwH0r zO-1T{OX;*bDil|8Nm`(1n}?w_-l@}T*Jjb%AvI4uuy#SN0Vblh@s}*+xS$%SMZ$x1 zdcPRfiu&YY3MH5@8)1JqV0a{02m)2-k}pd-tgBfL=}#b<5vbrfCj##H6`>Z0;a~!| zZ`9dHz_E0m(&z0Q?`@y%86IeN?9~8s#6DINTL1YOxin4l1 zUaCoX18a|HeH4dwjmhP$-wlL3aC!~$NP|de)&jZ6*>J*7DxG?sl6t`GDBOF*lA#Dd z%n?}=La@lLZ+^6)oHYCQ7`ke@WNsuhs?jWA+6@G;A10j^r0B+srP!)6`PVA^a5>McO2QwJ=jE#29Pht_4T0=Yhyg6tFNNotG(9M^6PvI%s33HVgS@>ek*%La!wkWt^c}sYbR6apT&c48 z=;@Zt>C5nl-u*Sh{HTQWOj$6RvwW;Qo!_Sy>%t>*P5^T^?lYcmYj93{HG4`AtMh!g zgO0+z^BqHw4rWG_RD6q!NnGk2H{{-ci){WH`u+=d>h=D?{%O#y4|Jh>v#?u9P!}Vs zP?mHzbQyC?rxSRBQD8JHb$f-PQz`&MD;Oa}vLq8k04mTIPg}ns4LJvQ&~Ted#q*Ue zCwz^Y25ThtcQ#m^>B-CKU2IXtS3rzTjl|gR@4P)mIA3a%%GwhJ95ThtTiw8uIebia zqrJxEcdFs=r1<9=*XJs7Bm?S_L9fYcrMw`{TaH^_L%~=F!`*XoG5p!EDJ>xRrl}{c z|JXWpcXrWpRSB))72-d&rmfKzQSIZ1X@#2IuQF$VVF5mo(meE!`Bn+&vKoAUYCFM5 zvdm5T;M|FWxXW+_VDWiQeK*Z`u|SiEzi8pd^Ar^)N$Z^W5)zDkUrgb80dm;F^SgTv zP?=`4Ngt&S%0Se&i~K}9*K7&I(k7qLc1wzNvyHGO1>Fs${T5zC#c^&1=aH=Jf9DI% zvDOTA9`XfUd!-F1@#PkOOL;D9kD6$y6C=O*I=i_;`74R$3oqz0mn+8wr+u{v*?Dhr zw?-ae#&@>MG8UVi0KUSn*VvhsOLA|7K=T5hm`68x_XPsAona;cCEW5i&pp)vWa%=u z|5c9paqvSzZ6g6>CzI@gwX*79(3$vB%C zF=beC%r3a0_>sprUw#&^lY{Noug~CrM>{mhj+ruG}#OE7dQE3dKb1DhA)y!Ft$cDrV zI56Yg%i$EBw3C&13X#WITC)M{A$;p7xC~Zs{~e>?;r0I(f%G>RHPHF#KQNfeQfS7C zpy(<-kJD;wp((9j#oAL3%E*F>0l=SzAFe%5&oP69rLc!I$`gY6c#>RzB}KpB+yrm7 z;zt;~yFwSixX<5iWn=SSA76^UEdrNed?llp(ac#^1G@#i8M7zZmk7^kQq%?mU`}{`P=)7=hB?=3>&1*Ddfc^jr6I*VhdlmnVh@s#W3^g$p>74Gc zWaiY9KArHqEEujTF6V-9h4aobUx}IcND;#1-d^u`UyUJ0i{}uoV2gVYM-;|4?F_5B zc%`~5C7Wv5T)vu3uO30tB3-cq($b7N`GuIx0kmXJX1az$55#8|(#0i1G|4=2aSaKG zKJR@pCx)~jhHILNX})BBjk*ajH-TCi**6VOX2wog5>Cq-Fr0q#buxZ){O+>uWRGca zF2`WlziidhK{1(hvemx~hl6K-8DxK{|7Wz?$)+9ZNGIcd!n8EeImlx~gI+Yi<{r!5 z{d8HMT|!ym7>?-S>juw(N6+CAu%#RX%+>1^FnZfMpJqTdWXv_Ss9%JASG#Z z_le+U8s22;+BO{B+3C^Qo73YKKiNAzK01!>6*ZAeG9O_BW+xP2o?qoJF!Wp4YL)KO z9~ngqO&`?C9pp6MiWDcN=P&>>j+Ux2xHdVn=Z4&u`mxh+1hcQgbW^_kuQ79NQ$mf& zY?R$WeGnYip5s+Bf&5{-U(ysH(?6)}#zr8=J;URIZ!&zKq2y_?TWi>fHshRjyo!#i z*|ektxzJroLM`adJQP)z8Az7?0ddkYnq==o%psb9wlyjQt1`B^Vo;svEfupizVj%R zrzvYa4!6`DTbj*$t7XCy3|zArEMVXdT(Sk1eHd6}CQX#)5shTn4h4X@w3zb`zTvN1 z3429{&wM%Z2>?8?mzO{so`%llf{2Yi=EChG={3tQiuWFJw8Yl#hmw?q_~tq&&!Hx@ zX2>AlLwJdGX2-h7_k3K{b$Kob=0XsCy_K){>TZ1K@zQWbI?bs{iwwD7DX$)>94HeC zuTU>Lt+E{VU!G0!i-PKMA()sDAk+Eb^C9Hmr21>yfc3SZGt$AQD~ufVpwW;w9qTqo z?-!Qc%E}k04D5FK8h()CkG99A=Ut(0m9b@Fk}*oMvo@2&tMN{j-Fw%;ZJM?4pQe&t zR}?OW+^+1!D2R4BTIV!EvdzaZM&qzqdxYDEJ&Mp@7{JZ3crGfh9F5H>7VEFPha)nZ zRyS}a(PI*cF+i`6y}0plb<1X(+p4E4fV5d)=wTC0g9!zaLi5SN2B@!^9(YMpV8Yac z!{WAOkpT)9HGXIoE6S?t=ql>RAZ4oVeD1T(qlO=MHB}3IwF!3B_Ymf&W zUxCIG>>mj%<`q=HC^$ch2ePrg-p;5_^t`loGXJ?v@GfuWt-ey~XNkvDML?TJ z_i{$TNzup!kjBt48bzDnZlVjtHQ8`ksn{dIv7tLYiySV}{fJrkNXQi%U81`nBSR;Ywr(i(<+ zT^bewnk{d}LrPK{ro{-f$OO2JAaCA=jvydAs1PO&Ru~XQdMA9z6rLm~XBJ{avW`gk z3ynZWJsW*wYVq}&^ObN&lBQ!j)o41YhCd*j2Xv9Q+N+(z)7NJ^KfFEs5qDcBdu;1# zKe!&K;p~U~!_xpOWFDv`=LC5?4$E5PKSBIktn*e&6lkIYS-EyezP-v)X0fU$djZ2p87zj?1X%pvvF-cLKP z-=6HhOMJDv_j>Pi@91#n_0b6&zsbc4hvqb5~h^FbLXrbO~)<f*&PdVD6}!kL3<+w(G7`{hy+J^(P*ktMky()7}h8zx35_juLYWp z#!#$8c(vEwf@BIY@W@E~PnQU5YpTPLGlXl5EkQmgH*Xe7h&<&;Pj*oPUaW>dU`*<{ zNrn*%(T1FwS|H!6NI|$l)l1rkcKnRe2?#dpwX_kEOPkOY9jy>voU_`4Kd z`S|0M6V)q}xp`{+cYwhS0vQ$&`^dS47FqWZ(>5Nl0cq2st%DS}wWXkHF**N^E6Lq9yDkIyAiky8b3m=iYMFk9wbKC}-v;o&Ad#2SJy&ga^pk;XK(p{zW_jld5q zqnPo;b37Uwfs-WHYLk_u!(z2xYWM~BV>9jt1&2q^y>(Ds+e~+DV}92H)g`aEQr}nz zCzjeca?P5yR5TmMRs&)SWsW6N8IoWUY96Nc^jma?@%v&b8^;q49mRAGl>L6nf6_)H zQ)GGqV*%-ni+pXW5K(Iu)ON~?r{*~-qoy35v#+H~BWy8fISJ@MUuB?kkZUZ6%3CfH zuT}O87pqBon=yQsfKI1z!2jof@1t5|jWj2oDlXyK=@>o#WqvZOroVji^@kW^+rLYl zT4+IH6i^Mo8G&x`Jfgb5r%s+7Q0+bcV#D^>j}CjP{pj#P+q1G*IP(TaR^G|fwZNT` zBl|Jlq~C8UN{Oa4D?>E;UWN&@!fAWi~{=*!?*yNeZ zPTcNs0wIC6M)|?FV2r($qbpp(;XC#lJ05x9>SwF~_k7Hp3jBI#k2PBC`YqGwUB+cO!u>AZup{;R2!Oly%IZrL~NFlCS-*{xxKJB5)2Vc zq(z(W?6M(e zDW+;8#6>6EIso0qZ#XFf#Gt-n1>99R!fvyJz3_A5v>Rl;rSY^$@wouAANp?z9@aRwnh2?JIi?&s7TlQ)|PY`0Y(UCgYATM2%(ccbKOgNIuy zVfHj&wq<3)Jfu zgP2YorZ&tIFMSwuT>P@%Pvs!hJJaej$a#!2d)iwn%MxA0-SwfPJK^s<{k^wSpLoT% zlnV~?H@#F{hW%L8;B}BObzHfEEWz zDn!U9lC)B3M(3+RaVA~{K{cXIMTBZ52?APvb5jh!AHhf^E;k~}F~i*4s6bGVAWw^t z!*w1eH9hvs8_BAyuLBxDpytqtgo@KU;^xS2zka{{kCT?$%WWnEygOcadoMx37o3wn zc1jkV5o<8zN$*qU;rNq1Rt);4H9xyNGXHjHiu0a#8K(4$bWc#AYWWU)5Js?V7!HVY z5XM)=?~<|}cxAZ6g!<9|2Ez2yT@(VD4v1v%`!5@m5YPH+(KNo9*`#-5RKZ%HV029Z zb4g{yP7_QQ2Jn(ADQUMxL>OG2T@qcpD7q3Cib^;3HB@Tj%B14r_4tAnF+k|i3VKj`U|Xb4ifluF=b2p-a4RRvSmIxxVAu+3yLc|*;d zsO{oG{qo@ytN7EP$jA)UzWpL$4Q2`e%&ky95`O+tJL;rmvC*g(bh{IE^od@mC;#R3 zN@+Xm>4F{vQ;sS}QHUs?ta()=)Qw3EoV9Xf3B5x!V7p~gsra-Yp?|_z^8MIg37hqX>U#?$M^R3uLyDEtNEUq1!ln%wjZ!p`4R@yxl4J z^|^>LfYaGcp<)BGF@?(L?ocOQ@Ct+3HIhht?(C?)j z+&lIP1_p#|oQ0jAT&7M1o=mD+5AGUfD*WL)`Skeh9^90BN3YDK2v0EW2l@jc55}xr zltYSb8jN-19Oc2W9-;{l)D5slA-|GNb0reiO%^&tT9t5>h~+7iV=(=g|Y-^>^5>+2is4?I{hWVHMU zktfvMr<)LA2S$#5`E*mKY7~>1bP=5{sPSHQ0(k;;I-qid@&iVomB&S`0gGTO9gEjM zrc!NgpxPoZc0bJKsjNpEd6 z_M-fv@S+S;E0fAHC=+UN$3-Ou>9y#5l^^83K+xkJ*G1y*2n))-(8Mx%F2MRhty^4P zR~-QKdN&TCdsUaV{xY@*nVwddkjPd;$pk`wNtRbV)qw0M`>m^FduT575kipxWOM2I z;7RT>X&m$Fkl{P7s>YebT|FZr>1HLF6T;O7Bp|<-B9ycZ13s@l6`Wl%a^*6Di0!kh zCTC?8=t0eI1x=JYVim2cOeMffVS!13I2E>@RQ?J?;~ALwM&*IbTYhDFkecfKaPG2O z*aDdDjtAvns4db@H5?SR>If!fRB+cL$nOAJU|u4kq|VQy$8_rhQAJk~c#)FJ7q&(1 zpu2f-YktH17M!3OOYzZBlWb`A$nD+BOUW0#@thyFH8LF#8K4x;5ihI-zj}Eg-B+G% z-scd|ysR@z17>|dtF`65nV?5CXa675cF5^qYe={eh14$~xrReee6)BZn@fx&d6_LW z66eR132O(c<)EsFAN#=Kypso*4{!OL&3AL$5}z3^$f6=G0cLV4umKz_gG^J|J&@cZku_!|{e339vK0vu=M8OQ}_CYi%g2Ja4k5pOmI7jr1Y#5x&IkG<&Tc+Tm}eDhQerDgGqj3ph@Qu6zKp|gPiYU)ARn(_ zvx*a&hViFE6c=JiCj-ayB&Fs$46Iv6+pLaNf?!1jNu9vP(e7H&W};-W4jDx}UPU!Z zKprxQ%6r0sAqQZu-3=>?oQS$=nB&zialo8xX$r}q!9Q+9%5{sO!R9$ukRDA4uI0Rd zgv|HXpyQ){q~}xG20un{78X;)l-!Du0l18|k$CD^I|wx{T6?y-_T=JZpGZK?cYyo} zuzdys!5!9}RObK?TTE{YzF$caiDwWYX$(ufcXv^Y0TJtRg)g@v0hxn$rWn zOt)cQVQvGMLGCK|ss31wAr#A3xhDGJ>ZKG8L$2<8R^M}7m+(~Lf}M?-@-fKwJr(K} zH^ZIs+A`xHt1@|;-XmmBg6MW#YkoB@$%hA0sNhE^MGxb+YbP&+L@Q8Z1_jO$roEolb%W;1GSyo@O;%OvO)d69BM5U zz9snprmG0HUBylV)fh4ml#&fBF_>n8#!aTkTEx~ooeLZ_uRGwc1L{hv`Lx%ph4uCB z!bch>_u4eBvZ^r*25LutXOE zDCD3EOT!}14bxF7h2V5~IB3kBCE3dkZUirM%U5DA!Hzwm%pOYJjqp+=>3ivXmQD>r zE-fnp&KO3LJ10%HIoT{vg1d8L3W5Vj`sXP`7ZJ#9VXi5bA6+^ls}636R$tx*y<<7+ z$SidmeFNAxcz_CuQ+B-7IWAe6m6xQBW~PaW(flvl1I;_1S355LIVTs*OYwZ*&&5wm zRbZ-HrUKLlU%+8=WK(P3XWS@cK~lO&=BMk3$FeiC}HsNN|BSd#U^4GbVG}jUJeBK0!H=)on?Ha- zarX9C9H{3?+ zyq!tjCn}H93C!3fY5l3N9^errcB4UBlt`U20GJn*ld6*#2vrq~hDTDAv~tYJThB*S z{~B`fOmzkvlTNJzl%Kw!5H_mt9KvdJ61u``W+Js@q-tx8^DE97v8ED8U{vk@rB*lA z$q2(2%MV3v2yQ+Z-oKg+hb_5RYn%yO7NAK$6oE3}SsyvfGflbi?2m{wQ3WG^8hYhm z&193hBojJS(s;X>g2(i<5T+{Qg4C zs$c$GHNBH?-!2!j4p2Qcv88t1Y zg+YPP&M#8Khj3CG1v9mO5@OlNzLqdSnv5tSF;)F9;SLvTd9?BS+40fa!`*LNNGg>U zX5OYFlt_+zv^EjkeXYcY?WX;w>4f6d5(CYm_^zP4<{QrhK7Y}_tmt7_f3djhmb`FC z5W9ZCR_pMk_gQ|SD~^#m-ys44zfkOUu$2f=b0zI71qL3<4vRWWAE%HU5F~Cdgg;b% z;40ZGg`Z3@{VHHrb7}E$Mik?mtu*3sJ1MSA6BD%4AOKK-TGz}bydux&Zgtru&uHg2 zUEP4D+9mjg!f;RioDjHf)BO;H!=&s(D* zKqFmlt)#uTR55x01tWKBEp9N}rt^4R(aw8*9)ifNcqQq;X~sptFAH2Zd8%;BGTCo* zd>YJdZuqVU9guL;3(cF(s)?7dxxrzs=zH=I;kU4aWap&L_jDAEJd%Jt`~*C6u8WJ0 zl2*)!YUA0Ie1Opne27ka{1$!voGGQayUu5jbBvq-FmhL<1$6xYZ%Ojut*Wv0;j!jp zoXuCEGMQu8aUf4h`X<=7zVlwcPiI9ZQb@Tz`X8HZin~i0t1UeF9M@Oe<<{wS5mfoY zBV~PJeJcEKuzg#CZE0_Xu|9!uEJ6uxFp+DznYNKf#1w8;_t06$7o_lr$uyB>)+H(O zn6`04#Y?BSNX-(p(R6vdyjpO5I1oWm^TVqYHCEuqN%OO>PgVo(L~~^I%F3F*Vz*6@ zMu9!2ZpFLEky^t5O^SM4afXSCft?K*ql{~CIxuBjZsV>z4_5(K&h`N>YBm{HH4;Zt z)9R!!q;j~5h$vhR{GG4e{qFj~N-ey_O>5GgA(3*!Lp2!H&*|OBD*=!-{cP;At2<X=M;Gl^SVmcb7UhI1Jy19613Sv<+kEUzHN0_bm^miH{GzZ%XT6Ft)a(3HAu+@L zCD!pHpD0}g=OL+Cw-QYj1&(>4B(Hx z{y7Kt6Lq2ja(4DHM&#(|KxLOHYYfPq0XGjvm)iiZR_ljMJm@87S%8`>y%Q|tc_}sZ z8KdtYQ%F+6AtNHkoya|mzIx82l!M=3K&Sn2CV0t;FaKi^B4FemB!?_{mT zMQ(Lg3-3^`lEa)iLISxL@`YZC4C1Lx}!5zgT^3Z=`kL*EAGK0s~+9M?E*2XoZI z70<%VjX70@2}8(nVo9(=bpvR)+93)7vw=Q56<|}2aZ|nr$Y+zT7~4DvVG0 zmfKQm8LQw+kdjT|C$vq~LB$#p!(Q9`pgv6&c(U=q%HiXr<9bOY#!3JDa`S^7=Qs*x z;*cYnW#v`0*;Ftb*isRMSV0)$CJ!xEYZGD|d5+;`!izk}&~adPCnX(3diOxU*Rczo za#2&8_SvS2mC`xb0<>3eb^>0_n__K$OC5qfZ*!050f-C^c@d*?aR6LASmkeuDaB3& zCml79Z35M_NH26wEVZRF!Vw(-FzWu{&hh@?{;9bvjt{n9X9z_yEC-Z1!Iu}$XCTR?urh4I*bxP|JsSAqtPgx*^<>&!;2}1e*6BjKClE ze?5M4x_$DaS%{7J&GFIEsd=+$UH7ZWZ9V~B6MT9{+DVAPWW5`WrW59Sg+rdaDd*Rc zx&%kh`h}YrM`}$9a1+C5vP`BGrD9`!K*=z2t1|hpIoI-No=_Dl4L%JuF{LoD!y2)#iMQKzt zv>7W^5JfGH-EIR@gI+#foF;`#mJktvAcoW0EwCjg4lxbfePm5wvdIZaGJhH|EVWP! z959b^QG|xwykS3u>#A|5iBiQE1Jf#$B_X!vYEeR3JV(Y;?9yo{=RvAo5liOEb*hpO z!@*6FW!7jt(mzib28!5HyEc$_30)3z(0cYyRAg+0V`}_^)2Eo1qbg%m4Wd)TT z?|eNen_yE_hZZHOHgj)^)*e{>3bmJ)!`Z}7k!jDhxo|+oif0s$@xWZVh@Ui`lyD~ZrQ5*e!ShelLyJAva z-aC4xw-C|G@@gc`lI-xPb4CZ_v-T(UJMtep8QQ#({Fy;=$Q3`_B}^CzT-dxJ8#X^2 zGT!bwPDIHwE+lva_IbF9-KlYSXC1f#$!rN2@&(t0M-Ybq)EsH5I}*(6OYY)Khs#smXdu?4H-en&mUjuM zJzfK7dWH`m6vTcWEa) z*bCyLJnVQD8aM&9cT^|=wU>XoLF%`+MQPzN9{`|z>hT>uOBiQ^i_*H~$jp{zf+)w? zusfleIBwgt4zu?NWd+|5XGqH@qS^qP#xl)Q@F4IxS9jbd1@TYlhhN*PEN1e+o7(R{ zdoD|f3|JMeB(p4Vczi96q#}plJ|J_PP2v2W1JOA?vDTOLpobZ-*Z~NKJFM_COeQn6 z*tK;ErUJ!1Vsg2!f^XsHu?1GV9O2vUB-Xw)D=36KP}>a94lTCnJiCzKu3Qtkhme)dN?ewC$5c<-{>nki`wRwHP z8E3p?$tP6_iB?>IvT4bFz^kXS7l`P}>Cd*k29WV~24nD?dpQF{4MRK_ObjhG(^6-K zvAYL2W=sW>YNX>>Ydlzdk?F{h*qY1Nt7|RU5XZ{^FpEzQ2{~qJSoURM zR2DMx$Ps1MY;r|W2J?|fvox{`bBPbS#O@;F>dB${FpwF^-dx^tBQf+(Tf^4mGg}cA z#MbqpWcf9X9u^R)C8*TDPi$+DHRozl9%kI~mUn6A#>LRH|Bnb0DJL_BW7!EzZ5^kK zvH%Q>4sXdE+~`EG$*g4Pq@0KJaaduN9KWy88e>_5n(3}Ny&X`o0jabiP3VZS!VK&1 z-qi+?qgOz1!2d&Apq4_W|qxuu_z%K%ag@!tTUu`00(W&2` zu2Fb#Jhru`o*RXp=oncofmury!58Z~fzYCHM4$VJo}1o?QpQ@1ZnVtACT7eXZrkKm zSl)S4^y5y<>)(@pCRSv%C?s4g=fUF-1<(YVwxt4M5Q;y?nb6RIPpJE^W>?pl1$xBGI>GQ2NETWr2L`q;4%0h0AG9|31aH=)!b-WzeVh34MjX?f}y_L2&j#C3wJ7rHDr zxF~&5z~9OJ*_vmSvaLVzTW?2xX+Fn8S9k>G^~YV5=W4qxN(gQnvt^RPQG-{qt@Y)V zW%UBLgqzgg0_oHNo8Er!W++Be_I`%Tqtf0z_pA-#C)ZH_ALMuabbr; zr&kI8fg6~Z-a^u=J+pd_`1ku8?aqo&+mt7{sfpcR2Wh)g!a6O{=t18wk+;%BleaCa zUSltA2cj0=Nq>SlwaKyHXZJIPCJq*0;;b3-j42sktg%H!JG3psQ8qf*YpU2llNWHK zj;bifew+m1JLZDHM9%vO%H^ZNgiPgp^=v?Slmz0Kp+)|u=;oNPP+PlF=qQd6`F=hc zahg|9?Qs4^l?PldnWNAjGNH_aj@X;mdd1r9)03lP@z7BVgmvqxSwn;Pt=hYGPL8Yh zNis)A4N|X{oLbN+Krk@M<{M-?Kha#69?yL3P0KbYNZ{Z`lT(U0J8q&ev6jlJ#d=|Q zAX$PU=Uw&`j%ROrZ6WahGmeeg7&+vPUgss7XC;0O+hcu6J28Wz2uz@xI1d45PO?a6 z6~(|aux*&7pbFf(8wLOv~7+$b*qswhz(S*%r_*0Kz z^(>qKTCfXocuuU0E+F*y!{BCXW(xRbMf;o%MoYCFoE}kIn|IWx(0Z0K`4STWQ(^Nx zO6P8g+>#vp_U)qQ70u{?>My>8cnKI@}0WO zM*tZ_2b7VC;CejRJN|y}Z0G3h;c1VR=d4bo6K&PzB_`1VklY-|^q{c$DIlM<&7uXZ zKksjR10(Ie$iPCk3w<>VT;B{?7ux*WH_1X9y3jX&``cIFBnoXd!oIqKLI+&_HheBq zPg|@62)*=#Kq0}OfO5|b&-=~SZJc0UYyKYpX`0t9E(vW@mKk-$(qpyA8FK-OI+WVJW$#@}&6ZU(MIJyllN146O4P zR%O2KWEdb~ZT+8%Nfp{F&383d&UX^K>twbV&fwtwr$Z5Ld}sOD#FuidnWKp^9S zFqJv@z}thtX$4cVtaB2)6S!S>(cpxpuNw2wt{hY{#>vva%;+8M9D~d{%(=JB+ZnoI zy5w)TVz3QBi2{uz{G?z{MdLZ<&DHb~PGk6yEUQ^$%70TVig2Mx!eg@GT|ItlNM=os zl6C`MweCj`*`!paXQGB}tNUgH?;AR1>VjGJ~`5$+R^T?-a8dy4G<{_H#w zk-p#DhbnXgR_w>g0)N;VWHZACfo)v(_&J_eM!DC_#lr}GY?>EI|=b-nPa8^x$ zrZIf}Kx@m;CdmMw*2W5O6QcXIxpi+V>uau&@X_%^`Jsa?iA0wnB$3&liYGj?BBnQL zn>}^w{xt1CjC4F7QAi(MIO?u5;tR=?=;i?30b4#Gdq3bl!E1r}u7tItv3lEg62(5l8Y5OE)6Bayd#P@?N)HG#?(+q za8PPxhZ{3=*Q%iTzJ8?#a(_e9WnwvqT@RiD;W4Ko_gRds^RcC z7|?^T8<7|3MiwI#;;R=MmMrmfaFMA2-#qtQ+oGrT zW=z`pWAt_N{}0Kis1YR}HFGr2Mz6-W$o!$|ZMr>?O_IC|mTwxND+M!87Rj6jrqgO! zkt4;0tJdA63lckQ9uhs*Eoith1e0i#zIl?C>sZes7qF|)+{4l?Udd*Z?S@O;vT*9p z6GZ3KnQD0A9?o|NcVoU^v_0uZDHimCCU`Wk0XMYnhS!LtWm*s%Xm>$+Dr`L^BO(E@ z!sbx%?*2Wi-SXvUWQ|b=`-ghVWZkUnG>v9U)v$OQa2vrE@ItBG!Zh0Ry|zLbOIl)a z3HHmAC!LH%lT=$@R>I%D=(7-YV;RN2-CRKX9{GIjLS~h^`WU};Y#>srp3k}_)bjA7 z+j1cTLWT9%g`QiHD3}QUJSH_x{sB(0x6A6Tpf3`kudnVeo}v)mG-wbus$5oT$FmwX5H;tsv7oD|Ttsr>TbC9m$Qs$W<+_c|1jo)CdKu&S z*rIi19YRA^7chm88JU3Z2ZhW5gF$I*95SNgZvOpVfHVy!rb?QLh73x-FNamk1FR>Q z00OINVjJfk^_8T%;CeDuz0I>^Q}bmKHto@|?~ADoBTyj5`r-*0AItQF?9GRsYC?Vu zd98qs2JF4%=O4Sn`EZ)(b65#xG|XsXnNGz-rg&Hv8SdD4dXQ3aSf0V(8L#ttn%Ed& z9wLiX^0G>}PwWJwJFm?Vc-O74Vp2a1~p!t=;1+wxzwleKWAu;Vi@E zEag(ybc4YJbcjYb>RT4x?u`H@P4xvL14#&p^kadPAU_E;pni>zmR8Nud?|-4%DjO@ z1MrTBGR{Bh(*_L+e_2WY{>Mcp`LXDtaG^Z&UfF!1@+b7YjiP>JJy5PK7uDzzlS&LI z8CYQ*;Jlj5&!oJ%p0XqjF6~j7^EL?L_-@oht%YfKw!I}dAX2ZvxzVBompyQwZ< z_ydMhzgmtAF7SQvw?n`zFLbO)y7;eKGMkQf)Hj2|+sYlpd@$rc%CyH?WoF8cB%wX? z(iVf*0Wh3X_GILu(^;T8*5NL}-cv4Q>)6+|d(l}M7Js^~NNx;ie zS&wK@OW%!)LYk;9Qeg{(Ds}|3dDnQn&>+NeE5?xNS}sk$0N1DHbgd_3qnGqOBM9Tn zAmHzwEFc)?S&pWS+H1XfTe0Yp$o@i83oxgQ%R*uUR-eE^HO#z|crXv~ibl|;(@*%> zs}uZV)ix42&v85;+Gh~vl4DbI(c{(A$?RfEXc#MuA)w7s6cafbD7%z-D}J~ zrILUj)5R(H0H-@Bhf8|T6bNHe zk}g_JO;4du$XsKzB>bksv{GI9PEo{X;nu)-X!QECZ+)Kd=x{o1zs-CDTTac18Sc)o$S2#Q!Epgv zY0SFBnQ|;wIVb-ZEF-0`0nLMKCsQpbN6m0v4f89m6F(bP=hzRvfH^Lc<{fl*etxZOux@XSb_O~J53FM`b;CRJ*Rs`?wHADXn~i$1vr_|H(=?( z@D6zz>g+MzVTX{1PpKOTsNChbjjt}@z`js~9DNY=+WHAlqD_^Ple^q-Cwf2G9^EZ4 zZ*X9H7unhaex644y@V84gboOGewyaz52*7g-`Sh%o9o^6uezIGtvI-~d^Wv?;Lx(Z z80O_ojcgK|3M--+bv2t@6cj)Uc3ny;#g}ewuDPomGqRT#hAyMyFk%Lr4+#oQX_yZ3 z`|Q4&fs*^Gsz?zBO7G%RIqU^xEUXt#q4!^Ij(Q;up zZ~!+W#ppCgh+F4d3M2zkI!S_VOR6 zdpk$FduQ)Xw_mnF&VLjXJUZAvJ$tu*eEN3#^(lPQ_S+&mytD-Gwjt0BFqSXu{Vk&b zz-t(B7deZ8Rj1<+riLz?##wo5zkzM;{js%@D)BEzea`5Uye_Q2?@PdaGh5qipl)_E zgXn2tGV%ITs>a}!0U*nB{JI*A3R3>t8}s}W*Uw0cgDv;TCOH%1t25w6T97+noiaGu znLxCyFIzNa!W^Kp8bINM7B=~A!9<;LJ&9+@X_NBd?Adx~5|^LBvwC_1oWzOwM@`8o zrRk*&Yxpoo6==7(IUk1bjKN+taC2K81GgTjZ@DsJS~hT)M^giOsY>t zIsjVfY&^9qN_8BKv$gzaoKjl@4+c(@n7Lq*Gw*j{C|tJo`OVkKp&lCn2U3A$Z@y-B zo<2gZl|KcBXiI;jwr&qLTjHCOi|gVh-%5W|qFv9Fmf78Iq%XCiSVm9!NS!-Lt#aDl<>3xj80AFgoqnCnR=dr+YuChvN;u(0DWW`>WvZufq!d<`*!m zJdz2&6rYsvDV)e3_IG#p4(Zuyduz30^BbRPBE0OlamxqI(3k#0+_3(m+hD?$>ooKk zcv2T4E4yY;7?L|FaQC3f+Agl$2p{I#AvtnXD!idQ_nFNp2cQO-wMF9Y1kXvmZP(he z7bBpESn8l+H^og|Oj{Hiy58}d6F+oBeL(MCa^{ss>Q)6b1sUkt<~)u2DFL||Hg+KK z@PmSGJib@Gf@yI`+(yA&`=Zj)J@H zlQexni#J>IFaRSm96%>|*#mW=`z|%Occ-*7f&p#?C2eI;70Slu-+3F*yw)~O^XJ^X zB|B>e0BrQmf_g$3)LbNtWpCbgUzpPfqMR8B?7L33f#vO}QLm2$k?mQqM4+oh&jB>> zK;S2{>f}|E`}0S$5?OJ)TL+6^y{*O>ZT~CUOxR;{|F>nf@h`EC`Ll6cnCk07O-N$O zPKqfA)?p!89wQJdc1h@r?Gr!eej&?btqkg!^e<7P_XfF>;1Q9);34o9^vJH!ZV{ZK z#I(-k1BQlAZ6%M&#VkG~-a>^(gB&4Bj9_%}`f29YGF%LQ&1p`nTsvRe^$dbk7QQ;|3qU;Jut_sEqQZYcFo@5YAx z_$9c+;Z(sq9wGDOxddZS4xm!nW6{yC`TY43MfP3h4rcbu&_M4KByQ>k_1^M_Bw8ik zfM}F@VMG$eXCxe0mm(oDBvYF=Tg_ya4e6)HZ}$X0kvExjq`avNAsU5i1*dUwij=6 zN@^jwVen6h2ZL`w!`J%Q-cp~SH^_edj-6 zh>e^HNSirHEu@BuFxa_J%ZW8^aE+`{X{r-wELGY9<&F(wBwhlhr-g@>s%dwExzaz~ z4U4REa=LxGzth;aP43%xV~MdM$=GPD>no{ibJ@B!8|(U7>iTNgy1r_x>u*xm*HRZg z{!e}^Dkz5oqB+jsoN3-tu|d0}(|+@HONpFg=A*ogNO!~Ebe)a+z&6&Iv!Z;V{6~2S zb^_nzv-i`R*W3GtXFEp+2YZL7C$>q}(e4=GH8qYMnv!5JszdGQ-iUh-wNuA6w+?>6 z8fD>2!=ioj3?IX?{cYJT@VCY-@a?ngUsRiD>1>s(gx43o)FS3`^9VAK(825XkKUYt zrXlv-<#OY%d!N~(+Q_7%i<@yvz3HrWSF_b_w%Yls?cqqcZAUzNzpsePlMTINXn3sj zr#$uSQ6$_XV)e5a;l}E6rmGHxuo{gEs=j&h)e>8BagD33S3kB_JK5KbHO1@sMG;n@ z)r~fcWsVlyEb~SZk@AhWMPJjrxJ|l{AJpn*+^VynEYl|39uI2qtGLD6Wv)YaLE$+8 zg(L=5#Vsu-3@TSX-r3?8HGzORo9xTl+Yxr8BVKIuDeH(aR+ya**^G$d*gWA0Phz9M zD5MQ008yy1_#cy5xDrc`*fu(Uwp3E|-02_13B#~{hro`l;|kmq`3Q5!-l9rVStWzw z8)0!wEoG^TwdsP9vbr$@QB^f>PG6P7X)$RONKq6cHJKRRs7Jo(%{)7qPJGjxt&gmq zXqfwbB4oz;{2jKZFC|O*A4S@%EJW>Is29{bz*m9drQkmbbw_=-?oh~HQf8(+j5=@9 z&VYWlVBR3U#M+p^re(Qg&o=zeAXT=*)x~1bIjSN zP0gl2y+r69YfW3W?!viKN@x{Ws#^3_*p>=_NiQ5G$9~92J81Xo^3zqT6nA$#)~aSe z)Cq?A_P|VhP+w_F%6MXGy0i+#RjqdUOHD})G5rgWG_zUEOgblwRVynblosEyOiEOK zHG7t=%DyBcrVg4B_VW1n=y=PYtVortj>25H)b|CsSWwwm`{yg7n@+AQ~Enk}*g1Ri}bN7WAa(M#)1UnVRbF~K5%zV+_SYK}_Xeb&GsHgx@ETL=cENa+_ zzAKXN*byR*lYKGrULaVV=U8eulUWTTA)6y;HOtYg*wO{6u_bxvC9Y=tZ12BOEo3@L z8r6PZrb;vCF*YimyHxkz*7;QdZmxKFS|YTlG>{n5&IAGRON?Rv1f_(Aaj2-O-`QWg zewv^*oO^PXw7E`P95;C-)*NeI@Ikhka`={gDv3YU$I%kZYA_r6I`jj2L~b&Mw=Lfl zlNwz7G6(=C+lqO7$F4=uWAYE+#|alADQGD`RM5VWqR#CgEb89avS8q>?!#^Yht0%2 zr~=;D&VzL`Sqk4sF{Ye}V)RDJVMu1OI(Q?cAl5xy3X)aYX+@=fa$4bylp`J}Rn8i? zpxE2-AhmepP8~fyxgT9*@ncYbl+)<(vDvGTA}n}p*oeUaIiq-`3l!0!Ce1BJVAert zG}bpYd0P3ET<3%8_K-xtY#sgL76h}r?2hYhPbIXtF{DN|JUXrzW^%+(0Y!$ITKs>?p=oDWEw=;hYN4V%4x$Wrq zAK7@4U)|)=hG-&)Hb2XPuBjejh@^B&U|`E3pjutf#V>J){1NAsg=K?HaWN^)mNIo= z`t9nrm~_qcR%5iMSxgK=#8^@Yz!(E1agOTg8mCp2otIZu?zk?7n3~aiQBDA#$A-az z&S?fs4Q3Y-+2OLj;F|6~JtBOrj%1j}ZDnEcVAr|tJrrC*5CU!mG7nE{E7sIFEw=OL zW~6|KXS$7nnK%=!gT+0LtR9yF_=UL{GRWAwLWo`*Q+s2Y0#%^;YF5t>Q3uz65270w zNYpjw`orke#jz^z)~p7g8<}xm8Zt1t;FRa$XJ@%W^#2Z`Ar6Y0zw_pCzix%4AZPO% zym9Ss$uc|Fv(ZQQ+m_=~i{$ZvD8#BpcNFyVA3)M&WnO$7tp23a04=Ii>kPpUkWr#oQCZ#vRHWAg~lQ~j~ zZ4Sl{ceML!jSx99{|7%E;H z-X8vVvj6j*kw`bcmga#_P_J-$-4xoeZ2yc?e~^6C*VT*&#d%@7K1lV@ZV|7Om+~H( zYq^%&S&N-uZ4K@0N!HRuy5F|j)=e;s&oXnza3FOt`2@7Qwi;unLTS8ExFCaKGZHt9 z3h*;9%w>XLcg`g#ID-H36d+ShcL-Syz0JY-^(#p7Y50dMo+RqTXP>(Hg`}T*u&NcvVze2%Jaa4L zv6Uy*0c+B;q{tae6X{g#WL0M(2SbJf_zklgyvflTLX~9)Z%fd{9pr2~h?xiL<@%6rK3$9RaC0yd(Q2cI zOT5}Y0N|Ucs0>Dhq}f(N+tIM>xb_ir#02vD8&h36>LXNUh5JyS(-sHDf&Sh2ERqu@!Ds~`v8LyRWGIy0XvcDwpIV)>2jH8 zWAZB4wk`PV33j>tV%&WpXQ?OIQIj|}`$v1n$7d%$937vY0n(F*@d{Pho+hbD;OX=$ z>dYgJ&6xW1QJ?12e2%{;i%WbBIcIOsJW~sOa4aE8BSw^L`}O zJiDnah?acp^mnuepTNNZZ~o{Dx2o=_&9V9;+MWf2HS{IHRsxAaDE3@47(Lq3QH&Ck zQm7c~sXcl!ZimvrKI5fC5(8Uruz)&38GVuQbDT%s&+8uCPARg7{1iEcg_>E%Dw<~SyO0W%5v5G+2EF#w zzvSwxm39;m{3DSHN>5%;PnvEQJl$TOqmo^lrCSIoUQ6Cw67n-o84(=n9?_c)w?XO0 z1N6+S?R#(w6(1>Tyf7^)@CgigjNvWmX6maO zIk-7ul2aFItCpV>|D2Ub9pQLTU3VA77>~6Wp-Msl)Kn>HbvQ3zbE4Vd{2sJn4*ka_ znz7xPRyXBEmu93g?cJ20QEu&7S5$PMb-qv@oBUoMOOOqfNp zdsc~hj=y+;OtHOLSpcA$SgLThvD@4_Uj&$c>mr_%7a~4VH8KlvsuO}1aiI)FNnGYiU+pcIjuclzy^Es8I6o>YMr(Vp;1C(U ztgzXxL2cvZ5%O971n!8h!}f<5N8n){VRF)h<{*_%){g=sV37be+_l837c`}lI`MYh z@(OseAFREFN#Py@F%PQFN6nQg`6a4w#VZ$VwCIB`Zqb9Y6MWeyLVxDHMH^1_l&{n$ zzVr+~d;@pmHz_InMUF8bODfx=pB=O~xRrvL^L;w(Sez%PH)ZHLb2_7B<*!Apq=wM0+#c5_xM$t+! zgC36s)jfn+GTWYYR`4Zdn)sI}S^~L2m=3il>-I^!3lr~3U!~Hd<4C;>K3xzaLSAhP zSZp8I!%gV}=C5gz=5!4`%Nlm0(>+*R17<=yD2^a@2l=Ln53_@GMkfgK3i;_2lZA$= zQPr)+4HE(tC%2fjKj757J$!qzw|n+x`*{0c?{x2Ylle+2v0(WBJu4=h^MDfxSaw;m z2sHE#t`)p679N7N@yWxE0e#@~GE`4HwRaZ`kHXARrQ}>wRhwSlW7sCP>;>-I&cNqt zI^ZYdw7L-iK5I8tyq)!???@4L|I`IY7i$X~TYH2SOkD-g6j+ymou(SW z9j)KXT6e7XDgH@i)>DJMdtF_8ocI3iXtb&1oTgd6K7l zn0b#xYeNIqImur7`bUQw7WUZ{iv&$`dAsDIzPU7Lz+wHvRZp$0a5`{72Xk#HkvX?C zyO&`I61aVpx@t_ZYtRT( z6n@R#ALs~Z*ruxq#B}Iv06d_W399%jCVfonNby0TOstigkI~QHp&EQ8VG8$v`C+et z&6`u^B1RbbPFWAOG=`~H%REbXqY{t5eFOJCdjfT`^I>kdAm#!_0}W=&%KF3!gQ3E1 zR1N^nK_m46c~y|Q7}Oi21+BQ6hv?qq8YN8;q|~;bcXh;e zw5iVJ>lrrMPEX4d9vw&8v{V!B+)*{M%R_L(ystSN#Qav=6&JH9Wgp4ejE{;I@XMsC zP^DbOhmFT6y5eOFHo$q)TmbH^K2y!ca%#P0SP3MGdV-Fe!Nr7z0N9DG&>w zOkj3`oE~}hk=d#SdYr^5xVA%)n;dy(rJ24>UnUB9u{{UNNNn20EHow*?2M=aJ2HUfH+@N zW*0SPD$Q$KO`aX@z1ur(LFRe#KhJ)~+oIr2 z&QZMcsTxe!DfHuU^B!~BV*$>ZYr{zdD&gnK#a!Q{eu6AKJoY4(bV}fYin(eFn=z4O zPNw*(F16|d2s*y>x-i^7M+z{Lc9{cQj7{{q+?m*~_eYeGF+3MIQG$|aH+P-d-Dx0@ z(A8Qit8pM^M!23=w5{_g8J7)Dh&(mWdPpEdM?GLFs!|)k8m&-AsRd+n~Z+>yq*q*<$3S=MdHl_JUi$O zu_npfGVk{fcaPq`dV9Dde8zjzV-%T-yD{YHz}Pd6rLksqac_HXmJncQ2+y6VBo2%L zehM=;14}AH4I|7BRRQTRTkmoAn-fdFbfo$<%9aUd*gi48SeG{QdmoEzW%xX!C+2@_ z9WuXpw*4)4KQO6)7Wd46u^+a5uHtB7DALP&&-U*y(%&ENoNb?1lj#F%eUne7B}h}h zzuu@$3JPCb;fj*M5tDj)TOqG7o?#5#C5Ds?hqVHcrSNHJ7WGmsvM!so241AJ(i5!^ zDQ&TjkbdW7agl?NkM?sxFF=eah}V*e&hMKm;ixx=bD@)dnH!2ik&EK`J*cE6AUQYr z6j;-Ibbk%NRLqtvHH{}zvo>lLiItgLwEx)Zn2X~9l`0Mep6^(6jF4BM6FX7|7HJGp z@=w)Ax>aE{(M_v@h!-37G{US#*1_LZ(P2-sK~Y~oYv3jZprb^Kv)gJis5@TGD`b@` zu}!Pl_*B;9YII?$8yFs^*H(AaL}4(yAO+i3=is8$2rwB~0q&%nMW7lZitaN&#e(#* zlj@=nxdpxgQlkL4^o){j#{T6-Y&O*Gh`l_DBKZ2vWHu_SW@ndJbpDnIC5{+p*vu3t z{Xp4t%T>fb(o4#x$eqFd1IrKH!K#98;CAu5LARewA_S(s9o?2JfSDP)_$V6Iozba}P^u1vbsrC2!NZcfSZxj{4Ez?(YSZ5MGJoCYi9_blR~IE(_V9u}*?YaWbE=>##yz-;SC|tm z9UI0a6*rcRi8(M5a|_vHkbm3!4J{q5ue;Ilt_*78Fn7e7z+1SUotu@Ol*BQJ(#GAz zW_RczFR>Ab6s31Oy|Wu(A&r66nMYpcudn&~J*Xib@O9k&_l89ozr6q5J@_I2WSFu) z)CCbNe{UCFmp5g@6fPt2H)fpOeto)k%=u=;7xxWlFU$hdzlx2aCyp245~l9`!?WYP z!|el8>&w5xX4SDZsA08Ob6^h-2f-<4K#2%gCnIzGs^KSa^x<02@#^NhGGc10=otYe z=Paan6b4m6hK1q|HyY@*vs=<1;Gj#-X{$0){C?KNfR4VByV-kb|Z=yn5%Tl3NhQuwRLMM|8zMW1~3Qu)EaRL8&0vqHB zG3uZRP${qAsefsiCt%)~T-a+1pDet&abcnp2%@T2C;g-hL z%xrKvF5rDqj)(xfnUoI7dmr49#l#9go}?1FqlT?)*LH_3(vYlhAPfrEks5~Xdeu>i zuL&C1Y=KfmCE%1M9D#j66KHG#a)4$oLxj&OLx+MU@uRRCNT{*&s2X))K7>$|3tOe{ zlKW(BE#P3RjsR^%rm@KlWq=$YO|LDn@h%gdX|`Sj3~}HQ%%sKMAq0gyN~|n%rLN*M(XBK6Yy%tL3NV^RjpPv&bc^_Q4;?+z$s;QhyQ5g`*n})Lx`{OjVt=1gGzT zu%wH{Yh?WAPsXOg-EAro50~m4^UZ;D0%c2%VH#V+hh}1EXc$;R+2xO{fxE@n91L{N zDQ8so;SX6i!5P#Gjpgz~I zjCBPU4@YcX&W7&Zh8kq^$)&5TpbPdRbO_o%tg5kH=EG`=i8Wcr!hdcy1W4G@w%q*l z_khL5HzCtavi9#EGEH;ypk;6W$;0-3#J}Np_#(j1T>l0V;fjY;n)Gk@cIAKl8~)Ay z4J&`t#ewf7UUEv-4K8QpWoZVBf!!?X^4B-wWeB0x<;856qmKlM^e|nNj&vy$(-kdV z2gH^2u*jC`>o&i-nwXt1Ev%pO3f`-5{kEV0eAcVRn`TOi;h+seILrtD)*SZJAJ4YG z|Naa#E2sNMheV6*ED9JaA$brmBb z>gpAb053Dvw2#_y4`IM0uVgQiZ>Ve!4YYIsu8ZLqD4n={cOe#E?f{{Ti3{)qmLHIV zl@mEBRQB$slbriU?X}&dG-CBk?;`LM@jAHJ#^)>`ka;1T+qQeTiO^nh{m*)%Ib>3U zG9@Qjb%P@J4sCA^opU(%p5uhsWBu{1c3HobVC>uAQto>bA!SUr&6`8|GZdnsW@k|R zq5|f`g^vz{Ct%b5%71Pw*ibX?3IUN=6dSY<>wrcGx+3 z{Tl8-FbU<;YQj-9Hvo@P&zy7|mV=t0#~3qawy=VbR@7SV=lsceC%bsU^5%3SJ38Lo zJI-GIBipbwk1DY2im-WNJr5Az!OX%9`#(LX`j&asZfF91Z%%|&aK6;!$pC5!@MS<; zT{OQF#;KI&*{4N9m;lPeZO!%;?#C@HyUQSUF&peDkcdK~A#!?}-Qdk>22M!W>~${9 z@IAmRDXLVpPLP!g&29T66v_w36KYXVX_$xTys(5Cx6Ra>x%{S@jbh+5zIV2v=MaqK z>94&IB6xxxDw0(j6vE23gXNg?@)To`G`?^w&lDqC+NO3^ReFRQQd6&>TbBE zEg|u$JC(i2a4OzO6{O&xb6)rqWmn|dR=+wx+1C}gdsxxUhEg-he$Li z*!db;hCp8}P>Jah!wtf(&%L!`a6xRXpUJEI7by9mhikW`>cWCn{-=E2xDh3xH;l=7 zkiqBXL5tG7nol)Q928X!K|j-$oGNOA>znmHqw|SXkF46&8q*iUaz1wnt@Y@5eMMlu-MNij{haL^*P zJuXBo3-(?)Ht~G&_q1)8{b5c{?aw*BHHPVb2NxM7i1%mSOQS0%vBiZXo}}emwtn+G zzWh|c;iC54G?^n{&uVhx+pnq3-}=z;gW?9ugeu90ILWB9OO7x>;$ZI`n451wVqmAJ z2KOPEr@?vm1;GZr%1g*h5o7@Vq8B>cqT*81yj}2GZfhMIE9_5?-|h+5f$5q)LmD&` znm}oPe@o&y9f7we`-k6)VPwTK6TI4fePS!pZ5_R`&5Zl`;3r{=od1_H{9PZGY!x z+>)~SFCRbjI7Ag2^wjw2ly4fA^~7D^7_L+M?3-MYok$4B$*|HvIq@X{w6F;W)ysb| zeLNZGqmHZ_vM{T=+o#(vw@>zZ=xNY1_s-jc!&MZS5fTF3dJD^gVil+4zKunGv2QQa@M3zDI2QSFOGav(2 zTWyVu=eaM%KkrFsF6`A2>{UiC!h*kyJ|OLtKMV`f`|DOVg8eH1r>2h>9O*XkA?{+{ z6u25AL~s7>H~0&yafnE|b6;!+0nYWw#vkh!WZs)qYg3M6;O22PGyjLS19;hY1Qb?j{>S1ywJAaVq{DS%qT>UzmXW_-DUd?hN zK28gY&IF84Yo#X+8I_K}8yaCEBSF9rh<>bXW#D~?j4)4?(%oM zOfpyVo!GPfxOE*}?Y7kLK5wF4gXC z1pCdkHfrq0$ZH(IEvUIRt^$7Lb*$CmHEwUTpFbZ3Tkw0jtc8`sv|PS~kDS0yy?^w6 z27ZkH`4yBtKXlL=o3fMI^pj3mhU(L{j@;r1=9Z$`ug0Aho#xKy`X72NV;iK5OIbj4&Am|d;(BAC+*(6)=|Ee zX$~5tLntNRSbz#>f%@aba5H4H@OCisn*0e?^C@f)oOB*B87kC>RpwfM#LTkNh*@!I z2OSKd8taz17M~ir!W8`?KiebEQw=#(2hw5wK&^zGT|egKfpvK4>&z~b9CBjf87W*O zyQ|QOwffU)TN3_|5}3fKpf=wZjyVuHJ;j)lYWtsGd5dCgEAtbZP4GxOrSyqZvvq9<^qNIhq9FWf0Sfr1n?wb{%_3o9^-9vszxo$S|!lwwr->&lR!3$SZ|sod)0FGd8! z+W4JQ&7-X9W|QT0T@!In$;#3-(Lx0kITJyuE=c}1$A}f`>3y}hu4RtOey%&WtKltU z%$buhMr;vqr?A`td{fV>4aIpLBlpKnj8{u)_n{zz0MR>JYET3;4HGJRk?$p!7>`60 zaAu=l;z@>Viu5k>>~*VD92U2*g^xgyZ!a@7JAn1gA-s@%(O!j)!cb+xoi}furvk=$ zT@5MZcmjY8@G;-dYh&|EWAegn#UWxdzEuV$vb`mRr{Q6C^q1}fY*)TTNt{0BCHxs? zoY+tQOaH?;3TQ99R>%IXa3V*6*Q35x#4e7iE-90+8J}b8XT)Q(^7P%i?L@PO6}4p> zLet<-Fmy_D_wObT=% z!I@$gC_D-H5=TaLkxCGaD+tu4g-7rHGyTD&!?=MZC!_MI&YW5R1`|tJk)iEQg#W6Jf<2&HCre>;m$9Do1r`w!zL1dpkdR za2Vh*MKytO3!I<;J=!ddIe#vg#}ux4_At9NDz%YoVbeVXwYqv(y8^2ug|*K6dN!F_ zl_usM2jPo*FUBaW$PNW|l?t1J^|09Co;87@WFQdcIY>IAT|?7LrP%hZ4Il`WA9|*` z6TH;Z(bA$mOMKBWzqF%#3XXEBPx#@MD(5APav?N2l&0+Wc^nCS-YT4kRn%sNop{PV zVCUwHnllf4FM93TjO}=s?EG2`@(CiY3~W7S5eS=8R6j3wjt*b#e~&!pN< zhrXT|I<227A@iAvKA0m3_1q9JG z9+3sgZl=|6Cf4#MaR;F@2KCH~@50~ubhzbj#<`K;Ek72XH>Zx=Vk186SNA7`cj2~; zL%A@&(KTFVZpv9F#W7o~k@7eDn6*-1u|$2%XHv+o>n*Pfv)*StJQ8sjS<8RaePOsz zAz>%4&JGO`ECvuW(S8)36JQgr%P2tyO}HA8)T~#+&FHUi+<*0bCCmeF(xm&bq2#f1 zr1BdD1563D@5t6}Xp;&_8A+5q@_{MT^HWb}^>#Gs^hDQ%d(EM!pk9ArQ{W}a1 zK48lMS>{6E3H^yOmC&m5QGL{xgY1oeVO1~*;TN7HhGfa?4e5 zO~D3EQf(5t86WNpf$+T(7ChDpx?(z#@djO|t43SUPSUMm^PMAXXLr%t` ze?*6UMB5ZqBq)myw@=?5Z@k=G|Ml3_jCzRw<{^~Z9oTJHIuJoWyB>A`Df zBc?EZ2<@-HJ%f4VarXDqGwEIGSi7%dw*eug>@|QB-B`&N|9Hd%Zyr&5iYESgT25yy z85m)#900B}(zxzM+pfU=;pyJ@d&k+EkPB1)Ol} zzL>V1bySbtIS+AN(N@5^e3u~+B$_^Xz4z)grhv^ZGdua{WpOwgYQo?q(eZlT`0XVU zFmsrv#N&%l&Td4FI5h(_o1+c4S+c;}Hz#|?rxbrl6ymm^s98jx=JZZhDJp`y_4mF% zw|;LFQJq7I#~z~IR>Oh$Wok$SWHPWeP3u-}WTT^re2rB}9YB~cNCYZiWo|Yb!)khd zZG81|hP=;?K_kNMQ9-NwNMaxHMCq-}8m;ju4M1#?ZqVwBRdCUxam*01m*(!? z>%G%GSPp*h_Ra3L_hA1JRwUey)%cP6JR!!ISzqno?VR<^D1!?vID{T6B7zh55%M?mup&)=1ZFi%gB36Anp?jO8)mK}Hhw(<4G*WIr+|7&C2 zXA}~hkNcx$Kaf(0#aVdn?9%96+wX6Nlj$^nH1927dV;i%NvR@Ql!*QDH?vpBu^+)9 zgP#U z|7(d`)U6S2oajv1dC4y?(NJd-JZ!&ub;f*cVs=y8CsBF0fxg-Zw@;$XW?V*YBy+K$ zSJZEifEG`tDg9lxes{?~z(TiLv#&PMsRoL)!x>L)jz7Dfh7 z)K$fqZrCRzY1ltgCXD?7MwEgHAwGA?|4tawfR9rkW@S$4W4mbQYHMj7}IR~ zB)j7nQ>6b?=iT!S=6~IX`;@8$fcx1^p#xD(h<2&vGz`e@sruhf7nnmvo(I$ ze&=*ib%!$}N%Hty((%QkmY89w%k>?0GXR|rz>;E)h-^uu9j&XXy1Z}0b4Un^8Nvy_ zU9VwTE5!!vVDNYZ%S??>XZf_`IRMD7UiJeJqYmuovaV;~DQwD)$U;m5wQ&Du!|JNl z#)Cir6<}1($187M3-qpc9MfF8R>^4j8;7kfV|N! zk+m7kFy4s|6$1EzVq^!33dSL^zp8jxJyG5kcx*PnHc-RutE)D5JaW3ANLXM(udX6v zkocH`UHqVSA*ri3Wz94f2|8qPvOphyslj5q9Wu1dVA8QMqPdrVOs%VhJ2^dQC@G-p zhdYn@>@cLi{{5q6$WsgA0b~ASLsstm?`)o38n`*WkrKVJuizNO9;n#s!Rqhqlo#u7 zW05&-|5uL7G!3rC@z3-V@GS77JiZd=KrDJdl}K+GnZ6dulgk^Wbl_|}_^S$XxS_u% z)O2Q;*OcCd{?B|=wmtZiD~1zuz-UJ*cG(4IIdbYL?#d~H&|#KY#r4qb%myDYg}qpB z+l;d2{bYtWD(p$!L>*lUunKLh)v#W3oX3Zr+9f1ykHyzR&#)D8QCJZ+5nadGZyeo~ zTBVo61l))b=TbY0BafI#B2&0I(Zk+mF|=8af5rr+qYKF9jXB$NAXd#Oh_RBN>AL37 zELiyoIQQ59)X`t3F22xn+9bp(zRlMtuPWZnqe2{430)C++59%Yx2RMU^bPe<)B?qW zgL4t$aI7#Vgcx1q8Z@euGy?e_CBT6Yh-B#q=9FmJadAm?aI_@MG)B{6n*;Lvy0;r^ zMY(dZuZO$Z<%|T^jcBxYwTo8TC(qE`-SZ(uusPXferOxUEmIJi&s&foBM-vs9Ez25 zqjF34aRkW6Y5_Z386nvq1XYemE4kYcJzK^VX0hYqBd$X}7|>iI&zw)pjvYWCU3Dp} zAA+$MLV7hTp(tcOx*1PZ;~4ZM>>lTk%nt4$0ohl*J52av#(?h7-Zm!mT$(c1(QF^G za%Odf38Tz?YPMl!xMuP8n@aZyv9`Fp1RoXg>$@ftK|M9-z*g7e0uoK@NhUc8wpA_O zb!IaeW^*bj$+&Z_wn>gB91+rBV`FF?yWDq#=v_``;Cd$sjnUm25Z_!i<4JWj$&Cmz zF{kjfLJTvG4CZf54^*K}c4H3TxH3F3;_k{w#%X@ z(Of=D=kK?V4~>W;+d9iulhLP4;+|#yv-+3Y|ADKQRr<;7pNB`s2ivdrf8O)keK$BS zwg&@qqOo#wZt1X!Z3o`FiglU~=faE%qLb5O)8|0(U=>mJik}1#7NUL-nxiVkK5nW4BddQl**zilh{~%#oHKAG%sfk12%@=!| z1|GJVy`FjVhvZkWYo2$IVb-Y2@SB+-?&x>fs<|QR*@YnWtY*)$RU6-;$=<4?)XHOb z4mbFh`kCQPd-xyh7E_|5BlVR<$Z2nVC#S`AyNZ)_E?JSQMSV{k3-8Pea1XXND`qTh zK(qOlc^7dLSCNrqre+n7j%Y+R2H(vCHk?n23&X{%FbM^Jn*73s5!fI-Kwywq-E)f9 z>{)mGb)=C0hq*WJZsWMphyUlNXmQ@ifCR!MWhV}0$Ulk%WlShg;Ud}b=;$JHY!L4E!1Z z&_7T*RMu&)okk>BtuX@ z`&5wXh=^{IR}Foaq7H)Emk$)!NeyUohL#jPFjw?SkyTt$ExffhS~$i)i2e zV*dWL$OlRcCWs{>MlIh%+M`_pKaS2dC>0vkUSypyGC!XDMwE(F6=t~{))dknjD;h# z9;M)yo78ckn4hpKde{^ zVuAF5y!e#moQ@^D@IgB~e|dr^E#1Eau80+k0pJ^q6Hkn_R-=MKq0-4ttPjRBRX*ed zDZfC&Z)qj`kg}<^4~Aa!Q*HXDm!A6{cEq{9p>IW}Q+h52)08dByZpTpjr;NIeCC-T zNqM;@j0F6lG0p)=5Jun{SQ7B3ltwCqNr6R}TUV)uYRY`$R?Gt-LK(&gFpb%k=b8o z#~3B1t@~j%+2^@?7GnW&vv{08_(N*#P|V7AgV2qfO5K*d_*7s z7=n}&zR(b)GN_{=L2n!|hbCI{Kh0LE62j1(Ean)Y=Rl6F@*FTLIS30ho>#L;1UxG% z+`E~MAo#vE`o3Wb+`^d4Jl6{jG{DkJAa<~@J^{aioD#k%7auBmMrtlcecDaa;$Kz zgNd0g z*ie4%jh~ti|EuBV?sE|Snsg(9(CYu-ZZ#VHrssU}6UWN>$AjAMg4&)4bl2^;saXGw zv;tw%c{Vi66G~9TToPw`SG+}Ym!2HgTG+S2$DI*iNxV6G7( z=1qn0hs`+fk#tKQ>;~*t!>eDi`CCw~@W7CkESn+Q(cZQT2#bcU&_~B7`{xcYjqX`t z>*tfB#?(QJwz7wYsdo;jqhkDITNg0&jrZ`y`O$Z{U1W7J5RpZ-TBL3cE4+HH=k;ZF+Zt{mmDBU=;k0g32B3pH=3yvPZ^E0W1-$%jL;Rq zr9l-KNN@d4!o2sq_S;@6bpqwcXXes^+Uy-7RvjSZ7SA5W7$=}0%ylxPY>*B=z)KHzAe%x_E}a+C z)!7olYX%nIyRj%GBFRxMRRWhxiLNe1D9T(mJ*X{ozUO@VfXpP3w>u; zH5lj`^aDd?P&{!t7S;$1&N7t_(u-6N>z44}SW0yf!w^!=f{18Ck}tovu9YshFvu8M z-Ihj1R+cXq6vpKQo`$SAr?3x>=XiJAGZ$8UUe~jW=YPNGp8jmZbYKf&z5#P<+pP$G z!6$E6<-DkL+?briAt0BCxbOQ$dASO$qtZe__hTpVq}2F4nTzj=GVcJ}!GSGMo}*TD zx+VOQv4o>#88!;)bgcG)WnLXw9@Jz6Ms}xkl5SH)vr4Q( z>}nHS_r3#pfx*ds*U7ylfu< zKj83IE8 zMMD+90~EbQBnwCK*!2$gyx)f>=k6GW@Ldez8NI^&n0#|+_b%UHsG)u8#T!N50!}&M zp_Jf*MDW-ryU_zA_Zp1{_k{J#TJ4lGKt!j-OJ>#gn=q{dCy2>-F!{*O&d z;x}9BNG1PLOunf5=+A1%J&k$b3yIHaRwS_|QCNc|xqd}vYx(|GR1?m8ylB{4StG6} zSR_3hDG`k4w|M8&wx{+H*A|yq?IO0yK}>sxxnItd@rCvH&6S=_WlvA`uxL-$L6hw^N@}5VlM*Xr8#13Z-R|Mefa9QE; z5AKW|!qV&_+L!n*QT)79qdj|O2v zA4J{NUn*oHN**_aOhCmjhQsTP@xr1T>=HZ==kHVFS$qeo1v4q#{z1dx4kAEY2swy4 z2u^3@W~0hK76bI)B`V!X2Hl8XbM`sY4!_N`LhDVhe|Yi+HaIs#iSs~$E72g)tLO>L zg7}^M;OF{)-5NT?tbt{B*Q;!jc{%WAY3i@TF}@775atudr@}hfB1fj#*ZFbK>0l1jIBqgre0&BBwrv*c=u4re0THTcM$LTKAirXxtQVK^?v zZuk4P^$a?3)!{ym#{4r7(aKjMA-8L)kcG}ya zr+JnIo;mI>if;8sV<<)Ub??y7knYyW5yVCRdFRRYH(R@Z{pOp$QocQ&|He;EM}@2} zAN>I|`9Bxs$9xnI^QRW{{Lj1JHrwGhLCf1ayWc(8+S&Q@lRtk+%hmhIjInnRAyqfM zX3J0h{N1V`SaE{+kgGblO^rCsST?O zXIh#Kk#FEWxB$1uJvXUMP*hy1NGF;rBY)Wf_z-HWL(;LVB%XN04)|sJZKw0q;wwYc zzkBlCcYogg&XDt+-EY6!{p-%I7mT1ISW{QY{>Ax^C#SuC>|4MaSh6$8IAMW6-6v~XYG8&Nn87S2%{6d#=P*sBh8jhM|3J!Nm$ixE5`Co?kZ z!snDX86sP%;FzbcP(49O=q2(8S$bv5QpJcM?C=Ku{E&@BJPFJt3n>rn%winx%*^@Z z2C^eUu2!%?_!9u@_BDpU21^2S`_*`I`&BEsY*4vh6CJ*H9}No+Tvb!!%kugnel|Ad zkdr~n>sLguzhulcOBvci!M$`bD;XLemtO(w$5ln3xuya$&u5SZ*f2X7%s^v&HL2!C zlmT~mvnBkR$c?`Ymwzo~%92G|hwS)z6=hOQsaR^&As|&4PJIaec@Ghg!E7w`%!n`m zQ4h?~utay@@5s^98?Q=(-AQPhxU!JC#{~gT6q7P7;X%2~?>#@DQ9kYOA8W5F!aT58 z6@YBo3EnDkVC&hqEI6L*+K5|}D5>C<*_B%uEvD!opgfmV&RMMu zcK~4N4mp|k9Bf2@04_M(e~L*J$&-XP9-*^hk0H_M%&!2bAWzA8_w4-O{PfsPi@luB zP=B}uHqY5)#PE!MJ>oiTsG{MCFm8wj=f*T9vTJHWE4W-3-sY*7l&pLfD)v?_xOcf7 z_D;J8{?&HTKifa*Hlsc8AXKBJ*HO7Minw@D0s9rX%9@@f6<$gz-R^W!%Dc4$dX-`r z1wxMeU2z0n_WCdPf6}%P_st#VK$UoJdenmmDKN8cFZ(9`Ks`A_p1}PUdDT^zkf~L9 zuUDX!NUq0nA#n3g?MD?zdii~(ZW#)m3qqSAyccACBlxRY{P6S?S7*aXg0>qhuqVJ& zf^c;&&Ku@ff9WslL%pc9H^^W+4dccAdT;`l^n_!`o9WFTWdRS#`ik8r9fb(>XeBdB zKn>1Lv?7}xlN-y-wzyR{Zl>AdwF2G$RH@*0+%15J2bs=cH)w5C?GDJahSX!qBf7Qz zo>*(U>wx`O_bS8r7YxLcF0A{SN5<8C>Lqc6t1%h1chUb_|Kv^ooq1}npac)3>Mic3 zBg400jeeKbnJgE5ro=rnMe5*x!D$awcxx?Jy~5qxsnNQHlko+;T=y=qqj8r>3OmDc zVsRSjCBqGg@lo&Ca2yda#zTq``f9i6m+eYR$y~sJ-;uz<5H!;b>*qFA@lD~5S#ySwrHO7k z&bIIf+;Xflkts#b^=7u#>o-90d<)G=xR3-Cp^O)I&BYYNeaE{(Z+^i4PH&CMkP72&?ESpE52l{qkfsC}z*^mwgv~b5xFuSd#n%hksm-KQv&p^hJV* z@LvAhf$eX0ohcOxBx$rjw-dC;qn9G|nPdUl>w~Ws)GnLJV!QQ_(#f;`<;Q9Htn1C0 zp8kjmXPHA@*+mvsEOJ)7Dk@OQoz1SKZ%|Z)AJ$l(%ydL3_jZZ%OkS^6>mlXO zlR}OUPD^0acC?rN3##PaPua`v9)yP9Od+v=a|Q&S(Oh&0JTiSVBzMqk59;hD8 zdPD&&vRx_{lPtxv&Y0A!9;*P)9&~J>bz%PYS6jVlU+OgO)n^|{0E~x} zjr-%lFUyzOT`$(Et5<_e5SHqntktO9nGvV) zMWClOx46PGum(*~k)bla=7fSvs3Vqp0e!OZn+%?eFiGeP4T0h==9**t3D(@yejnm< zy9oJQfXZ!fRvU;XRSo8Hb_I}-FYpEs{A>vqi^421tP(Y=Re?^*QejmB(zpf*q@KET z#ubN4LWlRyw#J+$9(+dx*Qfwo^BDUa=7F*wBb-xfL!h;!SAz30M$;*vdE3Zfye0b# zd(+2EuMn*-+G426aB!pm1ZXdYsP(ciORsHual~4u9$6ef41uL0h%s*GhC-O5`DqCP zzRIbL_~{fVD?zTjA5;cfhE2z{d{5AHH6f?_6?*?~Bmoc1%?H28_)Urv1fA002W(+h zp8PyL2$qo8ov<&!UBrF{pE$~mu9P$aqCvCF|Na;Na1j}@m~m*? zMgQWgd-(3v{^|b9?s@l=&m;-jbZaFT9~b(BoJQzNtpiYfC~_To>f?)-%kae$=;Gd& z1YI7XjjQ`X5d0tS`1C0tN!uPdq2pN#fJCR1kMQ_f;?rIRW5I*wAal`ezuCxk99xCnDAX3+>h=7ytxU8+_+=iaN`O%pHHmnj7=Mb@UNC zoMXT`@?MDU2|T%tg@xu}J93X)ml3?x?NT$d`8A-=%{BRDKnV%G9YHt}prAk%33AL~ z@sv3OyDa3-(i*A}XsEP1u6L3$9%hW8b4r_{p@Msc2UTv(1s{@Wy6T(4qT3;8 zV}-`tQt-;OzX1HAl7*-!pFPbwmBMb^Vi&|3#j^n(H+J;Uc^*n3k^ioT8;>4o>Z(Yq zC6IRZ2rj}R2u-f87PG2`B(mcB+-#fkiB*sPVG5}&5au7P%*LyPi%ym~onAs>te4PC z8x%e?qw)9tml4ZE;%?i3Y+c@fYE$EfTEjlRvXNIB_6BChC0j9r&=7%uc&5Ux4keDq zd^|2x91zK(VekMHCXN&0+&{FBkGkE0i!GSFU_;8?C zz_HN{B7DC_ldXERtqqlKWe-c2O4Q}I2s3YQctLXl&u6KDzjBUfZm@dwrnoWF-FS$> zF)a-JoeUe}E6U+CzG^!h2MgfM74U;ru?`SYk_y7K06osEY7aORyra*D9KwX}3w;3BUI?z=o(PoNi)U z7U_I;?`XNVIO;MJ0`Fa!8{+#K-7Ke;4c*xyg*&_1`Xqfr66HuL8)7GA7p%j01jxsr z^*5YUW4q-uBVyt)8+dD{`MnA)3Rww-gA8;xMQ*Wk2^K>D_G)Db-0kKz-I@%yX6UKR zz{dehmyqbi{A73vHBCA$8Oh*3C>r1+l@LH$WIc znRpL?*@0DArrE7Ig9%n8BVHBu<*Qj~_JLICKX%_vwQ*2(Mkg#UP5X_2y1*`=59BM$A0r~E z6=z@5dR`UY)@EYkxoi;%QAbT$-Sl!%tr}qrV-KWAt#yW;o@|68ymWY6_$1Ka*7A8q;$x#InZaqHCH%8PjEp|H-L(u|G%Q0u;C`?;# zX8Nm(Sf?5FHGE-$EoP7X0i^=n`k+?R5CklUW)zVhpWP1X*> zO-Wk-yeW9jwXaa#Lq60cRq*Bt@-Sc~h6-7rP-@qLAsmB$F3K6QetxR;H4@DM=|f@M z^O%dHGPs=1l(3j`ngl;EF-{5iAT|*vo#>#A5HZ4|F=>^V_HspyS5!~bp*7R*;V@M~ zi28a%W4=(jXC9%0cwS0Ql~BTPe7GT09g=!z8^2Im-H z5k-taYgGs$wANJcCD|`-{lyo!e@62QcK~@!7PlVj=7#~Aw_DGK;=$B?1p${B6Bd_R zv`dOd>qL3$)oqPeEqGE#TU@$-~5v*~#?}%MyDU zdErrJ9%U$7W<+;l7s>l6cEj;bm?vm_Zw*^sCi;BCDh>moK5OJ*(gTE&U~=8g+rg$m z{9{ND*%TH^NF-R<9BK6Ok^5G0*O3j2Ijd|pFbW0n51j+2;}#@Nbk-Vy*#~M$;y7T@ zI72wZFnua!6Q^EWHJ43RsytaP3tHDLMxCj_A86h zvaLq=8jRL!wn19mDcwqIJADm=(kn#be^L*zOh!%U7?yan>)Nje3yn~nR+>Rg%r#R z<)t!k$gemw%O#nl)BW7qX?fg35(R|%Bpg(djEgMrZc}*+ZS0UEzPTXh%GmzgiMg=DMMC`$;VQ zzcKFjvf0U7*=2LB;5_j=5}t=ZOqbnRkW#IV9THy^&&`0Dk?14S)UXd=5RWjAzZ36d7!VbG%;5174qV`ZMj2fAnxm@A@zaDV=7Ii~vkGNdW@croqJBGQVdZNOEvHgLYZYkY`%0=~H@W zE+F<68xTDaRnBP2cA@K9B5XG)>BW`O#wzlQ`VCdliY{rQuGFhvq9O}zj9T5b#A>)3 zn+-$JJaMCoM+;=?2BQ=udv;#08+PDK2PEIf7fq!&D1aIc zhrd(m?=zmjpkvT}hnLRf!CES&Sy*YZY;$>J$ku692s8zeI*{mMX1O zuU+V0S43GXIhL_)%rY>dJ5mBMu_~UUa4Zj@5CD@0o`7>u^;TC#ddV^4R+6)$w$mBs zEPIy7H)l?BG3y^Z6~h@mX0{y_maLKDK1ROb6@F{?SuD8)-%>IRan5oKhf0Jo6={Th z)++A4Wme*^gY*~jC9x|`KWb>~FrO{wmX@(eWr9Ik<#x}z#3c?f3m)>YJ`)Y*Bk;m| z>Kd?)d7%5C+4SRc>Rj)oh8q8S?F>J)4ndq1)6BbtH92~BDzXw2mSpC3VBvU2C9@Se z{?1Q5m~=SXV4s!Q4MskCYEv`8=7`9Rc*#LA1NKBjzeRZQKK}?r3?YZf&9lG{0fE)+ zOmj#7IJqql!C3iW>AVo4!Sv2Gew^=$sd*+oaxsal7Mpv z37k%gaRsgx^9{{<(KoMV=HxfC!9>UgMqIf(euU%ghFo6-XDa(R`A}q+6T^k2C!TT$ zgrS+%2iJ)Fpr8XnXkFb2<}%z^U0xA=YsLMtM7Cvjn6HzMB6HV?$W=QR`e*49>_lf<@O4S^41AmzI;)R0#-mq0b#%>S>hC$-i0ct)sF)9vz)^ z&m~hdIMx)EO;QKeHuMx?d}WlkhZ0+OPd8Z$NbA%L0Z+%xbbhZd2`^in)s+I<|$2z zsB#O+Me#11la#lG?UP>^QV;ZJU_Yx%bB;bpHNb9>ip%P7AfvCaakj2@)|*>0NU7aH z;ca^}#2D50!VUqoj>4XK+a&KKw=i~9ohoW^$*1^ib|uIYK75b8`J|Af5Cs4gH=)ka z!zCbHTw1qaOhSskwd%t4T;{ zH1q)di01mNtEMXt)%2Bb6W+VZd%591T292AY!YQZ)?CX4L#3NuVVH#0Ncvt@4z4Rs zux6ekbB1@IWlt~<1N=K#p{GT}m_q5K<550gsup^zK;Dp#UW_@5^<-{jC8r3sq7`bf zz0NpxU&~5#2yGwR**+c`=P2vf=+k+xB5!$G1npqi9f~`GXl|AT+d%)S2`i{oJ+ZLj zZw1K+g)9K5&P-Kjh1OQ+?hLQnaO+A@B(RzXqj=}4@T5N2*=DPBobWQ`{~_=%bX026 zhIs4&xVa7E_Aq9jVSli2S)H~JOF22xzi!x+PwD_+RD$^qxE4J3=@z~H<~w$;;&GCw zOuuX1wvxbimH;MKkD-s@lka^Hoto9|WDUY>bDoXA1;h`w&SFa8NfXdJ01em@$!yMC zhvT3Vd^jsC1OMo>MhrC!nu-F?Q5!fbP``>jQNg(`ESKL&oQO<+#Ho2&0Uc|qF2Q)5 z&|b*wbQ#^VhRe~T(pbYd7M}r{70d#rAeQ~UZXs6$w9J$i8CT|B%S=W}u`H#lmhQ8$ z)maiOfud;M!qoH2`%=zrBaLI`LM~uA6mBhcMCp*#VnD_T&ERUjK!PwnQ)Hv14Chg#Pmv5fYRSw+T7wfI6ox` z0hf@1W}^U01Gp-CbX@&gQ(4e81`ILejwo&waQ)N$3y2rs-rzZ+mh<${^Un!@pI?}5 z2STIhi|DYj4D_7Ny-N!uvdbG=k~u>i1&qOU)-)0!Xp{`6=_P-t88c@fo07nvGZD` zr#tzrY^N&zRsm8;EjVQ@){Q7#u4Az%b%lCm5$z^Jy<|PUuyFi$r5D##+9Ls<_^4% zxFDw~{=VZB!)RzhI;O^61E?nAtf9%Nqr`_T^e4f>tqy zoMR^F5C|Fui7LTQ7nne5MHvGz3{-`WQr9KS(=STn6tO129%|7In^B;T8f_46}(*Mmg+;hd}e z?`7Ea!Iavu{i&L6O#d=9i9eKM| z7iZ!b0pCE{um0i&;*u-h@klEA0-^C^&XNsEh^R@@?%X^3a*thJ_Z>6mTdQ2l*PyoJxXp}** zlu8oDCQc40qyajYV!xki7`LF0oKXDFcrq|g8o(wlE@ALhQ+cKXqn`cL{<-}R@HyuH z{0a(}e-Ne>w~Bv1?PZyBzQ*G^VAqW{xRsdKn>Xf8B>!c=D20F7&+%_=(I3hys>cZI z<@MM~3;XBi`v*U6ncuc<-G`s!KF~BE?$^=j$xC;|pUmj#+)#__BIt;Mj*t`xBr0!C zMgtnbxVYW)8vjS!xC-jUZv5;V?+cv!jGg{wlZm!x;x;r}RZzRY`Z=5+Uc{bj5@=3) zGL=3buq&LIDT)@qc-hw_r$(lxlCMC3vk?vF*fll)!=^ARuD>hU>pN56n-;egw?_uZ zrjl-bHn}YkKi5@2EpP>|51)54Fbl%=Biig5jkmEnTy77y+zwWUmo{^-egBa)IK^Q0 z6P~S~L5(;p@0twD27UgAMUipr|9cMa1uMS*nVhLmpg+N9;|04`tsXY1B_i{x5 zv-f!R0eWqj?<>U`p}vNWi22CU5EU3h@UkK*fG@PUsTUxN`2B*-X1aWYlbHkfcgu`# zPj79Z`j0PR4(`mo`*;BVx~DTW-*MN)-BY#2H}5vR>j|A|VDQ0QY?_)kNftNzYW92E zHf5xB$s>kRJ~4zybLo6oWV4R>8j`NQsI+ z5sBh&P+om*vwL|uY=oXY#T`m@`1U3|-JT|_8`q0EaZ7b0FbF6O*{ zlLdDzvRxZpF(q4~k+@`TUhe<&uKUxg(|3p6SLZ)I+g9B*L;bP92(-sGT9}`Rx2Sei z2LeHF8&X3nt}Em~C9m=6>B%WEp*Hhd6yJL5B3r+71Y7Y4Y&&Aspwo(}1$mp`>Z#Y5 zPSma~yKcX$9S};d!_DexD&YgPJjXmT+BnIM&6-fbul$#p|_b!_HW;t5#Q1xgN8+dp9n&i&O z=l@EQ$DZK$pL&ufM$1~dhX5S`0hEL7h#=EIXw0L5VS=pxbHwO>lQL_ITnz@dzPmb^ zO*SR4+sc!`T|X{lX*r!*o7VneYFn=yQHeHxKf(P{lDm@Vt|Ytb6W;YnugysNW&6*~ z@gJt$xC-hteEyxs0semHkk_JpTDE0*1P zc)eky*Q}h9>`A@;P*VR$%w*GVE+U4xAyG!Pf`gf#*v`l<;ZB)o<6scvU?YqLv0)w* zrh>^^K28V-T&e$3H!DJ~)cZ$ntityP=N#vi8^lKWp!{_R102<8guFpJ4q3B7Z|RgK zY_3ls9pC}?VNL`OvFg2E7dv~rjqU=MPC}1sE-(h140Dt7+uiCGsxwT0zJwG zMj=ZcxO{BAI;bolY(cRKv~^}MsLn)1N#$uOzU*%kFkCiK(Ept^Y^gu4qOsF7|9kLb z_uy~j2tLbE)mQiDvf4@oyHJ7l{z45Bm|#E&ig}QV%Bz5L;YtNhpn|S%YC&xw)udNP zdO#U;rGjt#3Y3n;oaNX12NxGFvtIxFq)k28mhZlW?_PBK-BWXx53~K_H~T-I0bvW9 zv^}SMy#fSC1e!A4G8b?9Lf|V}k4X;aaNbw}E9ji8Z`EqZSW5zf*xIoQ9Z$nbH9M`3 zWXY zO4IoW^wJ)B3+c*<653-pz+8p>i{oP#)H=5rQRrj0n_FsQw$vVLxn;-twj=G1?TOlf zPEs!5zinY_6*>yWuB7|*^p^W_yV zznd;r7;GXExoO_C!I{wk%i<$+-J(#74u0T;RJbBo7nKNKl?P<+a0v#aaqthjdSBe+ z4>}rMGC#b;WWe;!gYP)N^J`=ZKnyrMJXR;yY&NY4wuA_vNzc14UvVWsU8r8`eq}>c z5Lk>H5V?NGQN#b&L^uWk1UT#R+{GYJ<#bHBW(=%do<@t@4N!<{KImA5sAJu!DXTkx z7wHNk9|jCHP~1G!gp7svmvzSjih!a6e3d==lE1H``kq4qn`~IJs^<$U{F)h`-R+)kU2De3^ zJ?4ekN24K`vgjqb=2hYM)q6~4Fe{1?#Ct;IyI`FIE;K39pdi%2x8J|$Z$lgiaN(@^ zgyjjAqe#;SIxtMXt2hrfCqe;Eo&+Vx8af%UB}&}ctI%1+Z2NLfH?pAt|3+e9k!{i@ z?~Ui}_nVAr2$nodcx0r=Q9fgFD*%`*5SnFBJSXtJ2AWyxw~3PSA!MqU-(v)0el=(Fuw~ep z8FIG$6qkb0k9_{|G9w0SpX+XToQJ@kA(53!3?YSxK;!kJsRV)ynS1C5rr^2x{R=#N z+qS*m6IIjx(UHL5dqRsH@K^H9R|%exly+n;Q;604xUwz=EscF67)r!bmN_tcU+tfL zMbR0k9iSOqT#6qon#k=p;zmWCM6T2sDUm$LFtNwEPRwczbsF7h`)+$%zr;RBdRTJ` zAVf>56h8vr;Ef-&4W){LQxaZXK#ANC|pkBiT&Ta6t zr8|g71`o|B?s^q#SCsCP#J&cXy%V2%c25L%zTk~G@!0}3HE77HZC0J9-I-HMwpMLE ztEJ}SwELoW21#_9!MyE0P5Pc5?4O>E)5h8WYk9(RQ!USZTeIeV>nV!veb$m%Sg^L6F4|(!mGn;I{2TQfZpngM zX~wTBxdHs%@@}B5mFW3v)9;hh^wiYsx#Uh$5Mf->&_pr_*?a2DA^(ktR1=`$RS`O0 z5e*<&#QS0cl^OgIDCyASXNr3TR5+50*30~EIJ;XSaAV<(@CE>-8|#AJyF@mWRLW^P zFnZJofRouhx`1;Ma-DU%MfcXwa2RwkU4d`Xz$rgK4#TUC6*V-zso_a(AbEwp&9cQ< zpa&9EoXE6ZpTU5kIdKk_sFmwgCy~NJeIS9Qn>;<63U5}y=s6HUx=ye&rcUS^2uUrc zCm`JBa06KVz`#72%!^3JfT(DuQF(8xcD7-V+2pC=v>bLQ4=~Cs1c4k^4Yx$10E2+(9rpx&)ajxJvt-mME=8zt)hJmK_ z_7FY}a746tl~%)iIq^?{9P zzs88#Yng!R;)bR0^JcgB)~oz!q?0 zEJZGcFrc{mPL4cJGc*>e-p@{zM{EWkQ4S*}P>L(xydYdcM1gR^ z0G~H83sQ~&0@P{Vb7ir+Tp;2etmDUWvZzM)nZvUH#`7x2Ea@1hGAphjrgx^Gug!%0 zN;AQtgAfmxk6)kpaAiK%Knr9C!Ah)O-?s79Q~Q-HC9nHYIUdM<0p_dQKQRAowle%o z=XsRyzROvWe+a#Dv{35Sr(S|OA4K06a zo5`Qf;u+_r<&Dx;$ZfyHtWB_cMK!_40qwovfxshU$K%}%nvEg4^S{H!c*+OOV9ZB} z)|WCoE7%>!?AS2Wkm=F>;~S42S;hx_AIjmfv8B2G)TQs(uC=axceVTCc(m45yM#xU ze2J$Xr(llw;czsUYbJI>lMNAXhV#>lF3&(Vzx6SwP_GY=T;>8L*vW9UlMIpaXHnyM z3DJPdXJ#jSup3Mi{A_iaIfeaDqa{6r$hR9pci5wQrs)}AUsnpQ_M<2!&2tAR)%UlGi}P+hR>8iEy5e&q4lah)oRBFBWf!2hh&M} z*dbpJ_Tpvtw0Dq@iQ}@*k58Vfo5U4{%qV8y7zpdxINkOlbe%T9>?#+z$_+XMe1oxl z-wBt+j1`6yzX$-@(_jBU=V347iOYflbi*aiTFvQFS6=PG*g%{m$oVxYDV7z1?yYEO zot_61o3Gb4rW0`BW_Pbv*cRnzcof@HVs!tWP;B($XUD+tD@MeB`{F$Q;zdGba@<{3 zOFyM#IZHk3pPc*7Yg*mHZ-&EV^nlB{JC7d{(<>TCT}Mclye|MgYe?o9I1nooXIcfe zeoIS@kf{!sCkp$Tnn)aE#m(VXS+Voo?cK_X>vr~4=c`us)%WIqdi_Sb-EL+8JBenW z!QDH17#Ji{Upu*Y7!PdzFF8xI1zt4FG!SY5DQ9eby7C+H%v=b1x7eFD6t)R>zZ8~p zIakqxCS?UqKGfbqx*Oh+Gjp9drqNyWy;_j-?oa1|ebDB8w(GgPyzWj^HdyT1>%tpT znzw)TEqguJUH*A?NvW^gB%uC{0^u7cuikb4*~-j+UKAO@l*;1K2W+_`k8Awrt|o(v z@3?+GE3dw7ggPtyoc)-!9!?w2RMA~7da9Li&RF*A;%3?#_7_G7;y?5jp3ibl(U1=Y z)PFNIVka}bq@939n`SLB+Eo;*vG}gJj1KJ3Ne2*LQ_^+oY27JK8ER|9v(#c<-lI7+ zUQT-j$}>o?i4%=WhV!T_yMmU1=!04S1V$-ODR#+C9Q~KdIlI?Gmo(F~Le3=3YS7{a zfqFny=u8d;MJ?TU-s|t5{@eu0Gp6jmOZqCjuyxnxkOv-p)&NZ*xKz?zBV;N!jG@^_ zydG^Y*#@~-%>{=LApr+Qa7@~$LkaP@J`y5)Y=m~|aQ8#sqK7zujf8CE-Ma3&B{$w0 z)mErPSSE?uTiM-XJe#OM!+)+)pRLmlR^%G`9UY`WKcH{wG>t3Tj?F?!pCZu+q$gQ} z1Yj|iL@$H zW+cR?ST;NjM92K+RCBayOMhW)NDN%PHkCVHCNIbZn*7iCqOX(jm76h?mW+}SJ>tt$ zA~9iE8fZmJB+ZLhnx*f0Vp0_N!g+XJuxl%nEQKNy@$zp)NZQ+U?08wvLXtvKwJK;`fK zHNb)YQFHoDD|__~+Of{Mf7jkXP%}ZsK{x&OfFqoKt5uA&ToDJ)c`rjXJY6v#F%|$> zqhStr@I=@x%ja+zC~pzBD)fj^RU+jjC^T~MzMVjw5br_6m~=lBp<@a`eC|hpGItii zF{5S~Ns(K;EGQ6?DLRL4BhWbTOV>i5a#afoj>FV_`K6+~aSTDje;I65QL?!?YtRPe0) z#O}S#XFF>3dvTmXUNMRQ-nS5JEn&MjxFKn@>{L3t2H}`4!)T>RFwDBU|05n;2Q#$N zHOn?BEgl}1Z$rQgxq9BSdJ#M8^~P4Zv&KZL*$b!INODU(-hIk&g zn~WTX$x3IK5C%Qr#tz`GgcdkI!3;>Aj-`2RNzkl7E>(^uaSxmHW0UVx3cRXx<~r03 z<#T6D^g@*$G>I#fIp*dTV*&S+zQ`L>5Ch95w}u2&@4<~w&>-30*qh8iG-8xPBIrgCP(JQ z$JRW%FXp7+1~-~Xg}~BlcvaKH9hJpsa7I%j=k7IMLCCrI0bbwNkURQ!(@CQ#3hGJ) zE~fMx53Kk!xJSVWcd}nthS$yidN*-!vtV1*D0js>bAeCh zqhS5`CBZ0SY>=N6-5G?c>`6p}LX!EqYZ&h30uo)2@@PNxx}^wF)>0+{G;_qD${^`GW+KIg%mR~m+8Ybd2qiAkAk%2w*O+lI#KXmuBwOo_ zNVLlw`N}`)dhVDXr#vTB3Fl`>Hy6@6viFEruv9?WRU`3^=L@86*O-Q5Rye|=I*_D2 zGFe$bE)}cO;w2dSjmx6LQo8U&se%(=$WP4VH7fuk8fr5gFP;5&R1S-X4pQ~$emOov zF34a3}eEj%jw@7rH|HNxG~dY(yMoFgH<%ld60z*KorWDY{x4rLrPIMF_Ab0t-i% zVYq(4_1Vx=iJi2PCw4@MIHtBY1lf~1?TEO6R7eC+5#I|7{#iqJ>xjBi7Dl09Jhb$* zgZQz>)_XDHqhz?Jh9e8ik>xO>wl*_Yeat3<+sNkap-rGFflHKB+bE38RQ}!YTXq?B zAETuz#4YDe*^e;xPBpkKitm`wW}M*TAJ5oEM_BG?PSbO+^~}|Jgs#s7#hK4$`8`Q> zffj^V4+3zJs-nNrV^d1YV92ErWfIc#8RyDeLX7Bqg_N`UP)>zB^Stt`s`N#q$|fWZ zeMFmVjVd&xM`y7%zV+gniH-P50amy;UF{#yHk=w8G=n<`{m0C9?IwH2IMlK1e`CX&b#O!k)3dxZ>{>!*^O z(~HSjOI3ygEbEvj-bf0R-#uh-3WjPy?g05=Lb+l1BjGGO{voX)s9SsFC9Nr=CQN=FWRhnK)f31I!-Rm_cZFB49E7tZm{%7@cVPKvAjJ68%lfOkWSWJ?b?aKzvx|9 zlU4Y*M?#}(mA^#1dBDm-6f3%%iVGk6j;pq(#H&1ZtWOdRBW`zvS}A5$)Wt#NgErGu z*H#!?CV))BGTH0P?g~pl)Q#0ma4w#q`I7Lj(6GWc7~T+uQ9tmNOUxg{PTP$gWI!36 zvWaSq+nMQaCa@L4T8vR9<=q8lyo3e@FOJHPg=$D-%z+s}xF^sS4F6X6YZCaX{90K; zbH2IgO7*Svxt=;Rj9;8|{+aN!ffH8ktqZfBx&N`uknF#)DTRoC? z@EOj|o%zMaE;jxj0*mL_zF!*g^*FyQMtrtiYtG=`squ!^{x2R{sl@%ge!U-m(t|I6 zGAea{()mDM;v7Bb)J)N-m$0BVW9e*i%WUXPS%J1@)1%r#D%bb3?{~!$V12ju+Aoe% zF8E7|Cw%Q+Kz~wh_3+*h0`oy5>gL0Tj$El^q||0q931!E7yWKCXzyDQ)#bYf&~Q}7 zKW_d&s607#e6|knXXbM6zEalMJDG+iZ*!c(@cj$#{fqObl&Mkh$Zi4DuEh#QO zDH|$Mb;nSauk{+IuKnlX`Yn)Wa?}R1yDpI6ZYW z?Q%`psm%2PY5>ohyB3d5Ja4AowiHDQ6Li4NIeGQ&*sKAP>jOY$$ghjuu<@~_UZ%e) zmVH&!eDz{kTQBO`da0-RmJMD z8N@p0BTJgSGCN}mkxpb_z<^R45YRG}F%oK!tPzc`Yb5|caZF`#3OM%C zb>68puUzODTo0Mjt=3wJhhqgtgdIvZ3VL zolhp&$jp3^HF!pO4*xW0ZnkVcu?o3{)QD6Hz!*{-MGz;<&EG?t7R?JFwxQ}1L||+* z{of!T6EqmeQ1XT|qL{J}<|JWH7QIMs4E}~S;Gusd^u#4v5dB#-pDnKD;6vqk_dy+` zV3aNDc_2a7Vy{iq`WZSqw_cO)(eDRS)esv@79>;=f*$WaoAR2HBELeh*XiY0+XxD| zM^cgw0*TvLX*(1$z4>J}MgXb3Z93GLLl>Vp~|RnXq$NVGeYgd&+^0BlSF2Gb&TI&^kF`F!=&+peO%xUa{!oS4;tMFA@cGAauR!Z9P zx|2w7fA$Ds)?Ig`CFS+i`*Jjx0VppvK=~2KXNVr~qTNsq0SZgwb8862P8&1FOoH$= z_}nX+x{Fjb*0Gk9VV2O~DV&ZL;49#K!be~TH==ruIf;#w{>uI!2aLs()XX>n)*eFR z_#2C~IObQyD@F7GhGS-*?=B_?_M&o!8U>$tZ;@c4S2ZdlGKVfyAHEaEatB9nsQlp7^uFXGK`ohsp(5B*H}Mbkoe!U4N)J_)i-K_J6FYVmA7?uWP~r5R_pM@X zg&g#y0{K~X$H+cp{wHFLaFYaFkj{OS+Ku3bnAnko;%@P=cmY6NXipjzT$OaLt4F*) z9?&eO&Bg9^s8d+^^EcJOA0g|eBDdU*NX2WX4|hE?f$qG_Pq3-drlr%wOfwV9cut$+ zZ^k{hx6Z1gE2k*f^vtH&dmC)vaF_r{`T5D~?p~I0eZ|;ZYFE_tVhno~-K@IDCvWyr zWgso1P1f@2|MnJQL_=v7K-JczQh%6cm>H+opJ2n@H`yIQ>BU32iBq1~U{i6s<$!`K zu<$Yh_+(~twy`S~AMpdslefTh4B)P;HZwX_dH&4G*$F&avX_W5jyy5iy~P`gGue=T z6QMKffEXJi;NZ!TH@^g{JebU3H}LcwUcSUq4IStJG*alH4QuuMg3VFIv^X3EQBc2@ zIszL8Ua-1h0%tnyhZ!*pqCv4p#hqEds!4HM_{E?d*ML!9Ey5{-htM7K*z70B16mAt zJcHuz@CAoqIehi> z^f@O6ec=-VARiJT=m*)R5cLy)`hjCJqtN3WNQffJD#t5_Pm~d4;PUrTN;>SJl77K* zqP8oh;e#?;&pvfD4yVEmdr{2Iu6VNBuqDl%OYJv18k^MiQVNbA?}+lvS`qNOXATck z)NX!m0DtXZwK?A(`tLlZmfSE^DgaIt2#<80K>SYFVoV5tz8?@7D+)k*TvE<=Ke3;l zMb=Vb4>|!fYm{j~juW7$9~b%XbAu+}2Y6S(2H3-Y9RX=o2&q()J)j+)Hz^R{y-H~! z1cEE`sQD0H{Ic`b)oYDqvXl=b^CPcV3aM4z8E(|f?$z|Z;WyaI)XuP_6QiNxzt|#g zogqpZle6&9vKze$p9F3Gvi&x|RF$1W6_C_sK2hBeXjH~QU710iT6Fy9j>;FW9c=NS zIFph_JLAr~5 zip;4Nmmu*}5n_>OLoB~(o=+y8LnZv~bZ`i`jyFXvDXZ(#*MQyyQ`pRe7p%sxKjlzb+KSzUcuWCl2A?a2E@g6D(wTq6ljMYXY zpZ8xU;1ZpKy530ej4dF0Mz$&7Z~|BYVoVPGZN)q(WihTr2Qwtiy2*|y*C+?_o6k>9 zUItm2fTPwnAiXV6VS^r-UO$w4#_1@QQ@mF~^6H#x>q6SToTlkh5quFN$$36ne&Gm9 zPP2Wm=F>V(NQa3;oQ-E&5I(4u31SY&{LjN|`;M?c@o~Tb)l(5KW+erq@@4ud?{vqM zz-w(O&G1V4pe_k8YRIo8dUHkO+g3SC4)1QGThCJ@^^E~RQVu3bDnB$^-AL>ludm3t zR9+v#scATFa?{hZRS_qxEHLdjYK^5t%R_!qZj2r2kn;;N#Aq2tDQ3?i)P(zZDPo;f zB0j|}x8+M~Xhm>^P!Cee&4adtlNb5lCk!;>*s+RL(}r&C_YXB{TF=5JDdvqLHektF zD*u(@o2@D}w5ll9U?T9xtU+Q-Z6d(XxY20tRhc`&KU3)FB zM>#QIIfo)BI}*iQNZbsywVo6{9@K0+I{2F4txPUs?^NI)LfjI2Ylm2WirJ8|Hg}gT z+8}oCHoqsaihW%{%!%GmXO({$#Wljr~5JpgCPW*t@fVh$$7n>IM{ z9ZTh{Y;${aIbK^7L233v8pulFIV{(U5@?%^%R-Z*gpq37Cq#@c(;H0;_XV`Y4Fe?hE;YKC}8c1{poyDro&kzQ7RYHMu+{Qa|PuY)8*qIJSpK=`au7dY77L8er<|_Ud%>rfSyrP|A1-GkmoI`;r-+ zzCesNbyN|w7LBd>734kTXf<)lF%Qi-M_c`3ROm<(UN~5?cZa=G2pKYeTX-T)Ak>?y zC1ciPx-}|379;p9UB^ZLZ2ze1>bRiKO>fUnFV4=phwsh~e(b*7M+iAn=SC{f-~UUs z+6&G#2l7&9TiF#_j;#@R9r0MG6?J%tFrkQ60*Z32q^{yRW_v&WD9j>$27Ng!hUQE7 z-`dYE3pBr&k3T3-M!UVkJIwc$Z$RBf1~ru(F$hK@-VC4PwQV*%{c?1OESq>_miO@R z*vlB1XfL;sue*#g2*&#vAVH+i#@Nb`1Nb8Aj#llSFiIcJdAS$Tb3 zP{z*eV_Do*rh9w*9dF6Tj$zqzQ*1ytAva2WJn0|*92DPe;vP(V((Ct64lYhE&awtc z>ZBJc=Y9=1NmZ%>J^j$-_&e#`^MjNAQSZgO;Iv_g?=WjX!+=g5eQ#lgDx6F->P;#z zJ>F+v!JK3GJbxy6ziMgvVqE1z%3ES?;6GIj@U^6+r<^sumzs!Sh$e!ZDSM7^lrY%E zJZC8EZ83(k2bR~{ax}QgXB3evXu*`I4<^PrC`#NGU16J0O~ z;G`I^;^S`4u)y;&ACY6C*VDLu&m{T7csx$kOQYO`w?_7O13noa7#+cs#pgod;I_Oh zk+|nb!XPE(80?XzC3CVrmRAffLYKXG)p*kYadQPbDB#4-iy6#SHCfDDGOU_G?B#iG zR&(?J(SHpc-~9jJpYga5QG^DE+#^}=B{d?7H94o*w8dp9QPw7tFdaDF&T_ZI;<^yZQs*k2Sd{Bv4i2>Xr)<6%-xg3O=v6+7S`5Tv@5c+v}V)Oo?;jz=% zHQh5EJ9%|(IPQP!1Gl}^JKBPDYAP#Z2^JGG{aascfAv%c&E6OqiXaVUJU{eV?qkw7 zFobiS^>ubf(>~e0=x1Phq_^80iJ{z|Ps|7!520l+6SuPQ)=o=qsEhNX@2o*i%yBll z2%kt z)!w1u_P{Xm%fiOD|3C>)e)!X1(}#^-w-?GR>L`p}6?K?OJ@UI}`e1q1Z~feSY&LK6 z&NUEOAl9S@xN8RH_PEB4Xor5SuQJ4Kw09U?TyTZqZH7h< zfiuPHNEX4JVO|Y;nL%bDmA`+f{@JshDh)K8G+31TcYEw`3>eF6An| zj+e=sMFfg6a~aLzCvzgbt$Y{E>Iy2leCjPJr2@`g=Ji6wiNjA*l9U&TuEMehjv{n% zIRLObxoqyf_zbSrO91O6OHgfwIa9-~vXSGhadB-r^RdXZ^B--gdLF~$FPfa)R~%H> zpJ#OiZ^|*MV)*;}_S8IKAC$DtUnLi2-zCv7i9$DS#qv9f57IH{x^X7sE4tf6NeD`!i>s(`eo8xIT$!3oR`0+KHp!B=k@RJ zjAstx&e*M>`}3diAVLMQcIQrk)xGKU4^Q5}8B}-3s{TeCk9jqi-1_a(c~tD7-MM~p z>U3i-iyP7tyDf2e2|?phy_dPY?ks>!6Df5F`$2WdTHAYIh3LowtR?1bv9I4$;-X|| zI4JsjBuFTJF$N$=LMciio{~GWA4t58(2Mo%j|W`Q%76o<=8IL2!L|!~ZmDzyfc}2tcm;G%#ir3Sdl@Pm= z(AFr-;N)~m;i7}BiB##pAK<`cp>2||sZBNRPb{aM8RM1!{W?b|+}+)Aj1}bqF?R&| z#NApYwygo&o*b5DTSmp(&;>?#$649OGJmuCPxbLOETuX}emUp+vYB$TzBDYJ8tzswGnGkM2o}3KQip z4k+ytF7zQ~P*8LtH=o^CW!2(PmJ)*dZgMdp3XV8sKbd^wpd6@cgpsJGa)+s^`o|$I zV3dgJrIbcVkCX`;~B=8k0|5|M^EVR5KJa{3d^~TiNd+#EE`}cKwnUAvK`Ts z3iaKesRUKo$Vh@CCb?7=JU(Y=6DdL(>tY&tnrTtlQYBHbk+%R zn4SYD?3}yCVVI0Bi^~pHsqp?xHOiML0UY4obb+N%K#Q2ktqTGQzX0Kcve`2VI>s{5 zNs*{zPm1=a$M+pPi-94Qo;^e%EUB??cC^8DyVGI6;?E=!bs~{y4X%Bqyz5wR=G}0v z0Ikoz{F6R>tK{9!9>?)?oo~UK3@&`@mRG_+y1WM;h@bQ))Td@r0;TB=Lh*xX(HDZg z4ifU$GI2hrb=mddE5;=BnYQ(BULb9JW!nqcoJXGpbNm;@+)nT9?GoM5K>FfKylq2~ zIPS55v0r$0+NXmFdy6O?7SqWCl~$0?;7}dO(1?9Ka7q%?9c*Z91*iKu^9S_NUxGzEcA{S zx=a^I^+AJ(3km$`r=KzjQ@5N75j>Y`%%)Jo?WFr#!`z_}cU~2vp^Xl`Tp-_$Km$B# zbESKGiGvL8m0vB^>r?A=`e2W#kq+Z#ls>zu#en`hi7FSD0=fV(%-Qw~Ny7%CIBA8K zRT#TW-^lHb@7>X<1SSbuCkPkQ+?Aob5-%R12XMH%@=Ui4HS6!fHP4St$2#?Qdna)m z?YVN45`RAo7Q@j=IXHf|9P$bu)5nPd47;Km3@IMeUQ6*{Gn6;wh=Rz&tX;qiUKLZ; zmVjx){aBE(9@LP;>oG1#SN!%5fu4cb~3?^730a``n@O93QhI%BtiTH zzbOl3G8I8V-k9KTV2=X6ZOfh<_XToha$#Y3m{oTwuXl^3V@^^6G~XMcg6t=10<;Op zjLn=qoy_K(0a6`f>=VbdBWJGGLvK{tmIbdxN=w#~&5RCXEdU>WWV;yp4bh`~o6Yzrw=WzTum53R^q8$0jyr`-tyBUoG`u5aSWp#)!%~T=mA|DKb z-EaZ#A{o7HIRyWw%mi!B-Oupkd3Er7t?|(Y1NdK~0KR|(e}JuEWwTlb z$-gFiqp^8}Tp1q+l-6UdqC)nv#2u?4*c_uvQ*Veyi>Qd=2YtylQT;Q zm~?mq>3zci0-kg#F#-D90=q1`p2do{2fE|Mj*%6gTOOH5p4uoq-nsBXmz(r*F`(3_z)4yNur#a3OurXSac z3Q?caBwX5!7d~DH8+R}N{J|FR|Ae>H4gsw!R8I5GZf1KLjzmuxw?+T1Ybam_IRQcK~(o}7Dn7BO)GGX&3As;=ynk)dL0yqkk z)zOqf>M2prAOu z;cEZ>A)W!`$jJTxlW;IEwj^1CpF-3_?}7e^p3&}eFMp~6otAW| zP&wmWAIvStQ~*g0Z#+b5`I?ZZS6+;|n7Y09f?%8 zmpO4N0*G$>8>_1`*#dX1`)0N+mXcNE+xbXb=OFgcJP;|a8cm2$GncKX)FG|Q`(iW& zm8i>Cp7`>>to&tu^#MG96li<}MqW^4`Zh)ieHl{#IJm5e(sPh;#yA%x1l^zpu_8XJ z)GXQq*fvXcLDzR5=)AXs8b z|48Iojq;~jZ&4!?)(6gnw`TyN0f&Q{1m4y|%AhVnm++3|#_2K*{4=3MV2|om^gT4* z;N+B{Tc;^uW@-v*19gjdm-(@o-iAF}_8wQ8`OWFUy92Wv<#>Ur(&ZCQKkBF5N9mRG zVlJ#`lCmGXrVYyjKVQujW8Dq(K1&@8zaj1iM&IAI?@-F(KANdtvT^tWe^}{H{4&W8 zZT_U&HaVoZ-wO?>0*_>wOwSp+<>9UP^$F=v#K9$$xCUH$g!~Yv3AFah?a4adP_e5t z%5c^UjqDxDztBZ60Bx=WgO+N%A{hEhNrXPg8khGRYRvaD9q4j~__U@j@FQ=x+t%Sw zx{GkDKr2CuSQvipYA%i|;=|!tm4co_$GOWGmq>$Hb_raK}s$RCPbXx%GnSeVd%niY8Fuq+X9V`A#@gPK-LeR zn`WmFXET_Qg4j`GJujqVa6q~?`!VLdyaf0_rGQTw?!L%W=2V!@!pBxZ^JYx9#m8b+ zsa6*iK)!|W17`REz0mXHm>kw!i>w2dJuW(8~j@gtGvZVYJ>RV-K| z#E`;2@ePc{YNv91#3Q7V_^2+8N{hb7fACk9ljS)vkEK~I0f|KJBonT)Gr4C|RjNjE z;#y;ask|W$6cpC{pvJ35iZ!GQ&{5UC#Z8Em(DFejo0iYE{h-EVLB;Od3T;n0OhrB5 z@CwD3M|;gRV?}EB!~<*$WL=ku(37QYw_rAY+1lZ>I1f7MQt=>z5AB=BJIMFvvEG9!?FZ%^B&UfDvLaRup-S86~>Ubnr6m;J?P z%PH=y5!sQ)8300-P30F9~-r0&Muz+{i1vN zb2GfTgk^aYb5GvAWy?j^mV2Y{%uD$PyKa2R-IG+Bpo+vaWhlcBbs7}&dTR%-=mZ>B ze1}mx>)lspm^O}oh|!wcOk7LwRH;(<9_N{oYur@Em)k?W^L{DcK3(#GyA2;sb!p5M z4kiJ>KRGot{6POSCQ1V z#A2uY$rV^NF z3$8UYvGJ`&Ew6v6`Q_{Gw13T=QVx7lXMV4DEJQ6Ckp`bB66K|N6R}0|PFafVvp%37 z1rHxhr#K5}l<=~1rcV}U>@-c+r0Z0zt#{V^$OwDXRMKs>Bz9N&Gf0BYkmvz5ohgSu z#cs-%=27xHOg36?zT{k_i4Qpe=<@#BETM@CD1T{v(~{pb@hRsMUEa1$IvQ7i2<{jM zG_VblYcV0>jPUHa}l2KLri06zjb%mDP zNk}8)Hb)bVi>{@39(%u|NtkpBuB~)tLeG}crU0e9nvD1S1~~9R88)21aW$IEF=mEQ zqYbOVffPPtf_={Cl9x~?BMOHnA!}%mSxCZrkLjT*Bxc47_JKatjE+@D^|^T@i3#nY zc{w916sAIiJc|;X9{QZnwgRN3@Qq;lQ-<3Gz=q8W20gHo37c#@Hyye)@@}<2^k#^Y zzDKMuuuaujL6SBGp2v+ZPmrQ44ho5#(w%UQW*a0yU2CT@;3*q@rvLmrE0p=bj<6;t z)Dn}2vbHXTWDlhe0V0yj7(Vl|G!Y%bw(pzmQ@uOpwS43af>qlJSJ>`6ByJcq) zo;SDF>Ri*BwVVmb8k}r;3k0{{pb6X~nURqF0n#6iEK{#?C^1EVEjUCrfyK0%oD?{+ zryFae6A12IzHg^wB_SO<4FI80^X#L!&Ecj)JXgF6iB6Q2XZtF8=Qm^gcM5?FHr7%jvFl-};mt zou0e|*9C|_#(IwcR|aruATOVEG8#*ZiIgSOU{@ecBjJHTQ;4})DdvWOS97sS+>6wG z`s0~YjSNNTlB!%ieh2-3jl)=+bihEDiq? zoh3*Kl#fXxQ`{L|fw(~2Vu}lk5&#eZ?ss2zPaD#@AzXm!ghZHj@;jQ6cgW({OAtEG zLPc#+8W;PLnB7WT9TjE9=9Um^%A1>FKp{JXNhx_N5CZ@Q7HYYmKAOJIQ zU(5w3#WqK0qD7V5T4dM8=A+G~goBtZuo%rLo3l_FJolC(XCEKNT;%JMHj=B z{s~f1FfkSocJqu7jsk>W`SbeVKw+0{6%_ll(oa{Rb$@(N&lZ=lYlNY)G{PfDtLCQ# zGxA^P{m6AJ#R!dyi~BwQ+hTJ1@dV){k#CyX{af<=ZZO2BGQ>qLZ z#)Qj;qA8sYk(|e+_D4vvNZ^BD{RLcaox`*JI`PhrZ2V1vVIM?O4*NIZr~=RTkKgS7 zd`7(C10+4(e(*>qwvA8NaUxhre5IT?{1e49(jF$PDwbY5!W^oY3= zpc-e}511pg-m}48ViLJuE?`JG3OPPsx_4SoP+CL@fdZNi@~#sED5g$KO^J+JLaK=; zR8M8M<;TLQIo1KXgmR`4a6>^ws}=05I;ynq=y!q6E$fJ*k#$SU9paz% zEQC(x4xgR8yXYTwk9z&?;rH8cy4;KXvjeEsdv@48I}pbx>nUZs-svQ&m3sl4!IC9S zJ1fgTyQYxWE=|#@Hsex$d+~eMmM1PE9dtC%n`P~gY{|YKxhsyqhl(4m@?NjvPr=T7#w?$5pc(aF1$)5GrRyXU;=9s)Pk3bodYO{%ghMDz}68^OwnZU#Z|J|yz!9d`-gjP$QL)13-k`GQ2 z3p==Rn4@<;3ZtJ!2iB9*U*E`tNqin z?z@*Khh4MzU+%v`u8vymM0&Z*wtIx+G7ST24|U2m?kGuYO-d& zqyu^OYQLXk8hR0eE$KVS`@@DQ-H;RpS|M^5;L}C%YNI0m=u&l>tzA|5HDXfIVywGQ zF+1vUF}|L^kN2v-8M|Tt@%GCJhO=&1SiGA%Z$qTh%8<~Bi{^4l@dTih?1}NF%I4Zd zMb;-RQnJ`HsBnd1$mX#T^^lp_KUJG%TVnYVcn6fR;Wm9-^aw?IHq6v1k zOQ#gD0YA%6kkuhXM>RMvgNZ*yfe}R8g`VnyI(bCm-r{f~oIXRwMrJj)wrpTZ(hrbr zDJzpkC@FdMC3(Oe{_cn4B z5@cN*K#S)3{8Y>)1jT!41VHDK!a6GK46%&^*qcir{ImV7uUyxzghv|(Pgcz|g3RyjdrSWlOI zNyBVVw98XLlDS6bm%NCR~|RYxZO4XtTb5 z_`Q^it`PiUj(62+V1+ZgD*NNX$t)sYX}&7PI zXmuY4Ndn>NK5kH;i4A%!DKqE=lSyh-iQd9?MuYu9?2UVw!jAJ(1nM@q=2WB9o%Pzp zIoQi|P<@DTMO^W38idC5$zsmHX=N@?ILXSQOp!6toxF?Abm&yLZg8?sL?jDh2+XR0Q{31>=tSq@26-pRkhz1*xqO|`M`w7w5L3@ zE5)CCLzEHOTsD5-x26#KF0T%_X)j+F|M{$Kr?a!P2E!CXf)lTzu!h}a4QRZr=}1_^ zlcjwy_dmyXxoW~1z5#;$t$0rp$QZEHtbTNx1iWwbA{uI7C6t(rV$CFjiA}_LJ$E}p z`Pr}Tya+q6-3r(}coSuZ=EA)=KKI@9P{z%(gVQe1ymLqs?71I8i;3N6n)ntWj!^y1 z3Q!C&C@XA?0BaCLT~v?Q?{_zOh2H;YbcZ?l#?=ETa1~XB{)M%@+RrX=t{gDXEH|>e zAiR+}4TcZ3IJl>lxX@SSi1gXaFx$*~tfZcW1F0m;05cs`slilMw3S3pdDKf4<#=z- z>&!YPkZ3v?fuWTda2(78<8I2iSg6oEfo09eR9RI}P^VxUS!YL{TAfhNz>%7!LIf|oueJadeERZuL2p|Q#P%J-{LdVVk++zPOF(!+;50MXfstOb4S}{ zu(`UZaENUi4ENitStpzEk{%u&E6AE8Y#_Y~QLJlLzitNz7vg5GcPR5l>yH9_tieHg z!X#Xr#!Cj6boNLE81KuBFz6hdggpe}TG3oW1^zQN7{)KugCX>7+L*INxIxHLu;)G7 zfAJ#NIQotL!nYX&8Ued#b!D7u-12g|KkJnaYfhq5yG>T!6$2wAQ+ft(*E}#ZCq2{A z=2J~Y+>LTg6n{^JNC|KrU)YLTQb^uBwPO&?e3{_FkI9`GT1OP1hUJ;7kA4cLs39}uO$bXw$)wiif0 zTy(_u*qXGzLdA+b;#55L3n)2rOwPRlEz*V^(3LG=$Sie;G+oYpN{epsz2eV6%&2L0 zQ*{&Ofz=sv#}Byib5NGK<4skVO_SIH%kAl&|8AOGyXTF-mM=#0RU4RnZ7ES^+G@}Q z)`hu9+vmFax<8roaQ5Z()g12MeCXT4i4cB{G>}cfcE!I87727$->a+Z@~iFiVzk}lcc+q%Q`B)({JzaP^7eELZqcIq4mpCx1Kb4>a|!;?&{2Zy$~3y`;niCq60qAj?h1r4LY} z-UuKArdNz4J6q(}`A3e6+yBKJmoe!pr_39Ww(d2!Qe zEX90ZqyA!unnooRX!Qbeh1UY=E2j+yl%rwZ`BPN%lQRctM95H|D-)7ou;wB*!;zIa z9-h8@ksSPkjk5jAq%2yN7n2erUuflU1$ByBkGO*HK%lp_Q0NE}JOB@iYZR^aY&4o# zq@8y2d-XU0Bi~u}?-a>8@eK@v0e|bB{x%rKdm~w^>w)2@^IMG8oZR89X#=#P^NgXz zJB0LJnN^rjx!{xvsQ%Sf&4+bob&uNpfo{!iJ295}ye8C^K@Q&4Nsa?Xgx7n87vWq0 znmqZqO>VUb0woTWR23|jgbZUh5?u%wk!0Nx4*G-c@E_o2H=$dHP~%6L=ZzzmP40{+ z)~bPeEl*MStozDct_qvqTyEDWjEMFl`RQ42*yDoCDs8A#xg5PkC>f~4k zL*`ipT{O=sh3vgW=g|c4Z09>yb40WOD%cNt5W*dehpcjgB#mz8ATg4~39xl4)I{c-p~Q9>d`38@Tn~(HOF{1mK%nw3{G!Gpxw1OmJmhP4{H@{t?t`bQkf+ z-Hn06yS>?~SK^AdVSCd@p>4PBb?7pTsEgREW0R54FMsUQ&N?)T1{NJeNzy0hVrA21 zhPlG3wu!`uJ8lF(+bEnt2M`;fbb4ToBUP9KaNDv;!K9E)l<9Zl`r2(hzpu|iL*?K z8*HR@*AS0F?}15nm5y#Bwm*;5LbwZtF2Vj-&SnKU2jV)I$Kx0og{KE(PA0 z#z=&qEZ`o2wnE%ZA@t@VzY06V=qxq;A}1M&isGh0pfY0O)n@L+=C~k5UlGBiY{&&- z?Aq*<3>m~&LDnS~pO-KBnS$~gIYg@v#)3i^O}DHYgn#JBb5y1Wx;cmUKP=p3z9=J8 z!q0x0mxbh|Qu*B}bCr4lOn{LCz*2@m67;N9I17xwWB5bwxHkmuV^dEj_r1*V_ncoX z{5ap*<7{CHeYLMM#kZ3C^O1PfiZ4Z!t~{M(NjsDzJIBA`p3&AvLiY{LAP4fu;@H<$XkXQP_nsm{R^k1A6^@+&9X>5%O<@u}|a=VA(ewV+f3Z$5BMr zD~eteecbII6!N2di4j!!1uz8=CnnhkW($I4i8w7o>Qc{09`sHSh9Satc8f z01IKhN0w>5%8Uf`Zd%;1sg=2%85BF&u}Jp}o=PBbkl1M?k{sT7C@oU|;KV~0iE0jU z$D`CInTkRZm63J= z!8ckn>Vz|xpQjfrUlPXBr8(eutP6Rhnp-}{94Cc$Q7Pj&{xn=F?G*}jJLo`(!Ae{NPb;bnnJG?pU%&&^J!K@4Y^c zQA0ksf>x{!b4FWBiL~V3_5@{5!W&gLx`TW!XO; zUq(}JNU}nUL%~7kd1=IhaXvO(I4b7->FLax<6rwZcVJyyUP8{%r_}mA0wJuV&T~M( z(LmeR6@zK;m>%F%TE$Ym^_3{SO6NkULh2C2(+PT$06n6G-1YU&lMgyYy`&PM+%Fy- z{bRca&lB`mr}2 z*=#=cSdPcc9COr>s!myq`z&%HpdNDNjY0SCF-M#cFfLuDVB)4b86vE95c4g3G17{m z^Q^@i*|I)LY&w`y>LAGsU~bYw3$$o>N{%L`6y7OU=2W7-hHgnlcftG7=8oZ5!%J$_ zwlXC{oTF|jJF-lSDBH-s3MouYAaoVbFt~$(aa!?78H(dhX9~R~X zmztN>`(~`suec`3w=M2^wPjV0UT!bGp_)f0-Qzds|9H_mJ?ajRu`D%v4dPD&3T>lv z(i_a>^Cq7*{xWWEb00(6e_LM9o*5<%)o`#)FTd3Wd)hRQc6;3^hIs>9JR?H zhCpQwn!260W^2~+G;ZS7s>F{k?^>k+F8UE|!*_lXIhLvfySCy{- zUnUT+paReU*43Y?7peQpfeMwOmfZQF^{35BE$N$RlA(K{z3N<>Yc<9aT9PE1Je4?i z_|z;*1Cow7d0*Dg$lEGPBn;|Qc|sH^A<`o44Mw_(CYmE3dD%@J9rTP|53&bzboH;r zg*8MgMGe}p07h}{@}XVqpl3*dP;&NF!kS*33GM>wxl7EKE?#4A^O-1BU__X#0Slsy z2$Q1D#h~Xqo9Q|&)P19`m(5ygT`#)UgSdownxf}5){b=Ce~|^VD{%@STr*la;b_VO zidBkyK&V+gsgeLpn;N~Hqnyoc_W|jGYVn`k4 zhHPGilDr%5u-$+P{kMB|xSERjUpa#9k9kMTfa7!kq*vp1B|gGGn}`&)stcAWusO&1 z<)ITQcp&E`<@ljZtRMw=U)TeVM@(f%(Pnd2AE0_5^ZXgu^+$tRurT>ONj&W*E%|l- z31Fe25c@q&)DzzT7C$c3G;tkZGbmiJ*~|8WUi@2(S0KqhS;(Rxir>zKMhUQa{v_*x zkWq*8IwfE{3xbTSG-v}f^I6KNAt{uA=hg%j*`2 zR5U3U`2y{5c4Iy7JwNCT&z|*Pz|`1}Phh`+4GcAS#o{e#V5D7<)@n#8Gr5~538bLZ z78VWz%x08qQZZs+&Z0@DweZSn{I~W5J|9zgdO?!2cA2hN7!bC*(|4ELg1!A zAjwo39zeG66FlNRUQTnf`wdg!n^EvEawoNslfsK(|2ep`{@D8m>=a5GMasLEgT4{{ zv{o06oG{YrT&g{{$&5;T4(t;>hq6&*GSlh|!KCU9!863nq6&PS5= z8LK)89mblTko%+J)6q8^72Hbf8!oWdd;I;)>5s@iV)F#c2geY{&zDNRA5A$GL~2I0{M~??x&2H6?+vJ-k(j&{5?U+u*~X>SCY`7lvZXo zf(krdfspi!eKUP5Bt6t6JE6+Wg{t7or1$TzZi7tSV$O0`dRtTNJkx!`D6t$W+-?q8 z2z_Q*WO9)g{_p{&p5=ItWybE^Qt_pzwXy_>qvTPd#<8IO=gvh&gjeCUz}q@YFr%b0u-eb?3h2%)2*pFosT<%{*zuq^nD*)_qan3!U;hf8ts|p(&^TB9gn7f)|ZfCAt|!QP>4(m4ZKTCoH~>iImq75W^i z0bQ3Q1ecPOl3AmDN$?}HVtH}TL_U|a=YuyVi8Wss4oA6$CF3IY2Eh_VQWkzo)Gk$4 zJ!a0-FI*r@JH?L}Bp&ZHkfMI?QqoOAVr)fxrcf0jmn$`Bc(apT8$Yzn|26Sd%~O%K zl8aU{BB^!JW+X)RDMxmg=q47>hhM=5!Bz6UsTagee zeVsP#I9tGHoOYmTO*m{IF>GP<)}<^3t^1gLhONEewF9(gpAM2B1-oFI&2%xg|RV|3bZOjc;*&&9eB42;bC%RqQn#=4}3a;`Iy{VELt-x zX#18UVOos5$L!Du{acb`XK;E>WSrP<(fJ9{uDMHT=XIx0kd?+bYbtPX?>aZs_c#@* zB*8T6w5#)&>f(SM4eO=+oU1{?)>K|KtcONwZS&g9WL1sawvLrm0~T23Dn7%QPp#AO zT2P>>dbriJm^SL#q0VdIM}`uZ`;QlXtMU>U5vaVR3!D_NiOnZ4L-YcqVdzWRMv3~O z`hhCLTPk4?z4@GT1UA4gAm$x0dyUxMK^Bo}Hk=BFcq-~dvt6bcsW92INV`m|=A=}T z)k+ppFK>UFxvo8u?8x4)_5N zR>Ig6H>F1vdSbDLHktOP(zCYu>MU(cPi*N#&NHWPF)a*4g0xjH-kgI6Pf9BfTogWn zg*+)Z_eEu0pI)f=A!JzR1qnfzr-V)N#K|7({RpkT%I5jyEq!aV+Zd95N!tTmL})Lj zpqty1KR8zoYXZ)R2_HzZbTsB>b+rMa7NaJ#o?Merly*mj)R6Cc_&m!QSmC! zoL|K;({Suf3MmxWE$pcgq(JpS$~ugV_K3lzMY;SfxwF~5E^0CQ7OUq((#AD~gs?bt z0I(+DzTzn%Ej{(7#4mV9xGzFd(7J#l5PS=rtP}5Knfe&4sQSIDHw^sPKxu4p6h_wk>-DNE4nd ze4RyLd5KK`NA9pxfK2*v0v`d#zzYY$hZ8Df{$mOavJVSyLm%Xe>$H3a91x;dAKR{S z+Hqfvg-q9552=4`%DcM(6%wV(?=@P^=b(0DKI>7SOpVaHDc|}0(2!?V_BdJ^ZpelC z4IMjCu!~l}u6zKSW5V=d&mKHK+u3g+w}xNatx67ga}t*eeYDIbKIor6@1FhGn9`F; zAk;xvxa448Z)ggyQxCAy!RGy)y0UEBFI$D(t9-ooLv3qPNC^(qR(x2yb0<;TIQ4b6XTi-eEHSBC{x6HGO{ zJ)wc1Ww`i%eY_QAtw3MWSeu$w4Cr)T57?VVWw?e%bjWpK_I`!g`&DM|*UIeajhAu@ zKmYp6y^hyr&7StUOC&zR*bRZOFV-;^$7D8amd zM=dtEWa+e2w-{cLXygwCQfz$V2V=~K*8Ob!rmOz&E04@D(N`Vr(%@A`KXp#L@*Hw zIfP5|_0#3-JI}|uge@Q29kgb9_`k;Ty9dqt&|WKf@ijz&e*1M(Vaw>B2Z5IM;X}){ zpJ&%GK4}#*5v~_^Z+|aa%4@8`gnwVb1vgMggw=kRl;zHu3Qu>Y!~ZlD=Z{zicOsdHhEp_A}R10(s-ZFD3aBz#h7ff zzZMrvfer*_#x)ei1H8CS3W`P-reQyH=7IV1^!Ayl;oE^Kv(bC;%tcAnm?@QUsnVb_ zF}bu70q>6Uyr6?I7D#Mmg`L&Yvm5HCm;Hge3||umRQVCTHf_(=@K0T-sXG>(jbN3$ zokpUXXaVkZBKKqMmw5kb1Et{|)S0Ot8bU9fGs6Yl3#VDJPfqFKq@~83`kIIjLI=mM zqDZh~I*w$6*q*M$_2_J@jUQUc4`|vJ6Ss5t*u{4z`f*BtfjDB7$~_P`=yW;RA>@rz zfdl&PNJ_7axyB05p;&8~nNK?vwe^m&0T!lkzuI zTgZUyy_pX(rC-j$|Bo&!Uc#prN9IEx37s$k5MOX$m0od(R}cK$r4rToLM3Kt`YN5& zZymdBtal0jVuUH3WxirW|3MnFM)Kql@d$=G7-oydp8o_D4~{kzbG>_d@f>%-FuiFw z<8BMb@UU&;e6dp1im&&*so?7jc%r(ibp@fGfKX5T>2tdAt_PWJ1BIRF1|6kSSEpY0 z{R_1AfqcGLl=AbLIkKrOp%@l^4Kn~GzWCR@FXY7Y0jH(8)A>FrQW92ZJ91RgDxh3mB)9DV;qB2MSe4Tb`VOOm-Sh1T?1mTqxx64cJ!m*QKX@X# z=;P9|_I23M|J;f@CkX0`M)5ehhCLhW@?XZWKL2IB?OkKov*+cNy~BWF%k@k8MC%p? z^z~E-jRVwwkGq+e5{Qmy1g7YlDIqAKbKVW;YdIoV3}(Pv38<)FgVE2_TVBW=P??y0 zQC2qw$8!ELE8gDbI;ZoN!>&Xp-sQxsM`<{7I_EAb`jD}M9A&Tb5@urE&LM_i7iT5s zU3q4_gwiqg8Mw0qTh>Z80fTj1VoD5xI3h9!_W=Fp%AFRO6}!zoF)$tFUUKy>KydQ~0{|O{?7wG9T~kRO5~* z5NsMo7yH!2d6yg>E}FH}91_ITxnQbTEjnYBK-%i)Ii`6f2EJmvKvsMyhG_lQ&O9=MnEEF+`{x#w3f>w!YOI4N-W>8d?+* z<1iTU4Tb#620V%M#HzHX%UR&me&WX#Hnu-(JG5~0RV2A5V?j9lU(ak0!NW2OImm)(}gX)$=`iw|FjB0#yE@9wI85X3pMMQ(gbhEdl6 zZjOUJ_;her;4%=%ER5%)kS1s01!W0Uf%?#)DQiYPtv6eQUk4qEL1bx;tKV~5^?v4S zoXm+CCSLiFclb`q!4H85)8*#xT=BgYcnDBEhu+eFc4EGQD6+x=17g9P4=KKGKyx*7 z{Qzn)cOIV_@AsZ%sG6jn1C;n9w5nEqe@a-jY$(WYZgi%)`Oq|pFsQCcc~#VOA08Ia z9!n(jHql<$Q7NcY^4)iy>wuil!XT9X4e|DZ&Y$Nl`39Tnp5!ML0{joDfiAkXja_6`( zQ)oru+gU65_v~PA9j&^#Fcoyc}g?Yw3;8XN`WgI+;ml&17n%qkO_T;QFKLBZs&A~Qw_%biV+B!zSdV!)&Tq#KGxi#WdQ z>T6z5*tO=S)4_A)Zd)43Q^21ZXQj<|u5{bVd?iI8>rmr9ly4{ifynH|4nYMgg@rKFXt=K2JKj>Uv4sRK zDg4H4pKA!CT8LbW{uAZ~n(wnvE#0Uw_bC&*c4_+F1E)V7^wh)6Q4GRXLT3so=|xlw zd)U&kRyYx6M}vf90%Ca-^=lFA(o9^C{P~BHaDd*XIIaTCI-pQ|7Y)t$s+P>1j|EmVfw6`C- zq#cIsc>zfRqfcvEj>Aco&ey$?aocOHt>yV{-Foa57ejT)r*LG5;VQ{G45jnV!#Goi zVc#&9cCF^&Ykq<~H)}b}M#X&GLVkoS$;dKt;Kk4vrD0y$^5!0Y=wpYiN7Fvj^W2%3 z!q7+$<_hyqi|X#0V*5>TDu{8LDkkyQvX-r+ffj%VO{s)_v_JO#(H|V0dQ|PwRjIB} zzJLbWsa05&z-v{H&W!4$I#tEvnn7Xps&)henp9y5zk+WX@4o7id8bD z`CC}`RQ1eH=!$vbkUlH4&WLPSd z0hD|y@~b7NiV2j;$Sl%WsjYgv2^qDk^n1mEj>B}f04~rIozHnsU_9_?T8zL{^*Ja{ zz^tt6!8%8?%`ISJ{bGw3?Kil`g)y4xZMLz7MjSWP;Cbbrq4d z%Rw5gwRw5ZZqMzGPtM9RJYGK?MT`o#Wv{KdnTiZ*z;Z@)O~SA0eFePOaO3mfwr)bz-r#v^5>q}n;P#ZAi^5ppp<j@A?j##QGpSJF3cEf_u$HbVv&|M;6jc7}J;DaYIGC~t!d4s9 zTKLzNK`Ix=ZCh5p}1We6k%494LT4#zlJM5lxho5GQ@DBWxPhJ0zNHd0wc&4NaU4Rni$sLLD?A*i(w%E$Kv@p{!|wYeAAo*Ylp z=AgGabX#@v>2gMxZE7tn48&fu#f`-jBUs%WzC~6?L9V^(H<*$KMSFi^TK%AfxQ?u` z;V!ZlfP=Ly>RoIZv}MU#j`nt>dn+at8Kley%#Cbis_z>CS6kph^PA4Qh7M=Xew zx=5Hu49~5hfN$TX3N4O3aEnXlR$WS{5qs)56suhc4vEocqZJygpf@(R3-ien_8hci zFU{-hV+K;g+T7XbO=Mb$Yfm_l7&*)m@mhZ&o7c;3ZTf6AhAm(Q5S4o!EM6BaQjLSH z2|8Itq$Q1oFO9Ziq|T;gJJt>lrypqJHLW?UpEll4RD6fvwW?y2LQT{*Rys~U*aO{i z{BJl6fdAnFqPs*jo_pXo%--U-16IZs5~<{!BB+a+!azaL7)pKh9{8Be3!4y8qMsPx z83w0QDLJV^{A2y>M(&vTddJcxNX?nTsfQ}(+*eZIpir>sz9q>&3#sqZqmF8E{`JPU_Mtn8@MjIaaIFC zCvEo>O^)So^wii;4uw9sE>SiQ?R%vw12MlpMB@^J!pJTxlL7GiJo~IVQ*EC ziV9JI!;6cifU!3STd7Zr0N00F@|GC*$wE*W(EQ|WSpmJ4)*EHhW_a+pM(GncHLTZz zP*eqHn3o(4;RRqBVWPWRn}lOUYzxR=YXVtxZV7D=p|ld@62uG^vq)ezF`d=~X>eq6 z7qMJ54eMLO$OH%^>T>w$h#qVt%$2QUdCC>AnCPDKba{P!8(4<$GiA+NU?QkFL1qJ0 z@nDNbGV!rk6~jcHK}qoQl}4UJQx_96U$P zJIiT+#*En_=9IChjCHP<1+z~!JY>eE{LZ&Dtzp)WJ@4@Jg9Ii?vivS7-k}4?QObg_ zykWi1J;89XsLS4{z^IvfAo2dWZVy{MxVlckgd2)@^kJ5aC z=!91V#6E;K+nb`eeuIW(vA1;{-c}ItwQHCP@pUwaXR{Vt(co&oVu)k2gQu+Z4Z*Y| z9GE0PMp`0gbkzMyN?fzCwir*GFAJqhw_Z@ma^^bLzg*FrQK?uzYh~83`B!L3o z#LnurJNW9tX~lSKds}#hD|<l^3gB(`MVF z=P}I}u5+43SlCuFnyO4Q=8ukmxk?Ryb9GQtKmYnmr;`Iz>vZw(A^WoO%tGxBBR9H7 zvrCo1A`u-$cJf7$W1IhwT;SWgfmol?039-jMWjE;Eb!S zMUlNPSqd>CgN3nd%$6_Au%(`1)H9}~)Z$!{Oz2MEgv8Kr9AbkTo`8=)>L%|6FDV{8 ztFLtqFrZo(i86;L26To*H)=yt?AXr8=V5+2d^}UqR5vYMe41S1WvPYQAdQ}SL?B8w zdl?z#!+a3%sT`b&xPl@WgW(ERY=q2Df~8gX4pl_w;?{fZKtM+}DQ<+3hDY4H>^mJ_ zCh)9Tp}2s0WD(W*dR9`T!(2us|9uihS5gcFkJ#zN^bZW4W)2x2Rs^N&&NH{PrQ41_ zIBy5Q-(@<^5TxqB9)vr{ZDsL$CRA(tFsYam2G%uK_Kw$?bOi3CxIGG%I(*83zceVS z?F{-lzSSJ7-spE&%x+tD1P^oi{h>^zm>T?~RffexkNr4TIF0av!TiQ9c!HmpeAt)y z!XkW%%MhOw^>|>OC9s$RCdxGGQl7hmDA}-3if*)&5T8AvzFsr0EjNRfyF&*~f=14YXu=y^&X9 z-0EDzqrDI2X$J+nwaZG|2LU%>Iqr4Lg#G}1?)|$FJ;Aep-@dhjM89)$=kap#KF1NR z5LVGe{XrAY6S}7#o}QeX_5QBn3ba#D{}N$DD?>C31%4OU-!)Y`olmb@-z-nhr?*`t zP_=J<161J2{PW%~b%=#E%Q(nr8T+Nbioz(|2I=@4Wa9<*^rnBpqRTvGo0RH@*xaip z(>&GqVe+?^&tLS9Kp_>0TMXGl?agdGUN{-9I`D3y>p?^mx#MC{05LVYF;@yGI?T#q z@}BRJ_x1#C7G)B!pc>T$NUG)AY^)vgQ17c;Fvw3lm(RREnmQz-j zSu-TRA?M3%r8r3mW0XU+xO=DU2`+|V{1ppBw@`lO%<^cBF2GU<7=TE~v<#zlk7^5I zZ--4u&CtGBTwj0+30|n ziLRy6!LM-s1s>NFOBVVaoLkkqI#zW-eO(*8M;8&F0CY11{vJNF+&Qmm+H?}mL!M09 zggBS@>o?JvtOO~>0td|{e?%LsI+?39dfve5?~M&Oh1?sUN`+@D926R0%VjZxfO~|m zW%dd~N6rne=&>MANb1>@Ype$EjeKoxm^%#J;}&06{4iq70*7>yd9Pj8I!)ORgHbO3DKOH?yD3U1w5RY742>?(xnUe?qu z4VN0_93)4{;c-&Eh=lO6s?0Kp63ta&pDjjqFfuf*fTbE{H+hsJVg1N1Qx0cO+FCN= zox6#o<7wDn&fNKE1-IC@cvk-k+Ryy@IveLHIuFriB%QX~t|EBSj8^TjxWk!o`CSgh zxlN_2m|{q&X}(&oCb<)8%O;Aas();tE+ixo&gX0x%~v%w8+kEIt>MH*8iCkLZLDzkW&r>OSucM)lBVR61hJfUBkXW4d5N$pv@; zUT5T@K<+j0tOwGQqIieN404XC;rx~Y(*gN0HyLg0oa2R{0rSgyi`s7Fks`tz7)f}>_f8+5z7I5FgMwba9DSjyB`rmm0*Q$(%UkD zNyVE#+>5b&!I5PvkQMCqi0q9O@&57b5~jIVxEwk&jx!l8ck@?nk!*(0Ck`c!SC^L- zs_x{gFB%&=m(z-dVia^?#Kgb-TJLA?l;}>43hsG#gdDqB!CI-NhuKAac*Z@+e@ zLXD;|>U6$B93mbU=8}U?_vtqot|@|bJDs!V-IJ5v**Rx+tmLGOaZM5~YEy2&ZCj!R zkhkTdh*c)>srupc4W+r2M z@56R$zuECK=+^e}ZT2C7uMm{BFzhnF3VZp3>Ek2Q!;ij_-%ow%nzEb`6xuDd$z`7) z1zp>-8F-uVpO(?!g8q>Bt7K-58Bi^rv}QtP*M9r;YAz&cJ*khJ9>s8>+WaSw2q)kt z=9kkYqsI}YZ8i~Oq)ndc#EP=TJX4i){tmLzqgx=alXYZoe@mUmjL$)4Z0_DK!hX3R z=H%|Zele6o7G%XXMJV{{@rrK+jg#B37~KK(J!3kX33X@(!Rmw0g_k8*Hxh^3jP zt-iUvfSm`enWrPo>bj0SM}gN;)uOC~4Uj8)?{hdc7{zrYJh@4Injh?rK3kis z$hou9o-kX?xi9f-wAHs6OE;L-g|vsr{s+2?2#^lLYQ9P_vzZiTfz&l`^~zSs6eySz0oS$ zw-(b4LnjvS!twVma=Oap!EAQZo1=1?-R6o#IeFIxMRY%yp~k^6@JjYC*Xz3LLRG_y z!#wg%>4JRmqd11cmHAWu{MqTtbGBGHYI21nDh$D<{KT12lUR3u^eU6g_>Zw`L!Z|8 zsl%P=CokDV3x>0jhg?ttPumS>3Vpu^0&R|W5;SIx-V4ayvqrD4tZ3L?%>hOC4W~f- z;6&_x`6{17+QJ63stmBG-Zd?}qA`iY_W`akoT|-OxfKjKB${sL`!qzj+Mr_|ZH_nnDLZLiyn3**`WCtSk2lWlWzY|GNE` z@?SyVr#3zg((BBZtbO+x%sA}s=8(ZUr;?!0zjeG$t8%sS#lv>RMWyck(p)*%r!{Tp zanyGDekb|Av0jUKFJ~ZpJrKs&v$Vv09d1d7cn5ptUWdnq+>6F@UV!Wfs!`%)P)@-i ze{fsIt3+<90=D z>P1uB2AWSX-bn5f0O|s|rZQub+>m80_i~-0)5K(gipTz?bk*=(w8P<`a*fuEBjmv` z<|k~*O+Y2|bsUX3zDu}qcsXNGChEmzTER&Zd_zEifKFtC8NAySuP3JBU9WQ4yO>nD z-X|(#8Q*o)C!r(YYMSNKf(Je7BrF-%QvwTT-z4e>=H?sT4wAYIso$8u{XIHhLZxm(V1^fXJ%DG{{+*_=`5ga(O{6q=?vh!V9C*`kjK`f zFH8&OZumx|12&iBj0#gHRbB%?q~sgIHFr@u`H}g1cXt>6Wtc8R3Vu%(nf$ykU!E8I z)u!U+b5lQ-oEe+pU(bt{g<8dVtFo(L5dcjaT_S`GkeJdE*x?@*)AxYuZ7t#|R%XgG zk^(l;uy@=)JMRt6Y>-m|XPfs~45wrilo5i%6gE8EQqpL)0? zzFHZ+IxlQ&dqtI;%S=_g>kw7xU5=(tv-I8R_#}UqP1yII!en4yA;vxYVm~n-sJY;e zU79IIf5Ub4LD>l@(zK~3-{P(Nz^4uNoOB>O^Vs?{9rF*dnWt>FAwXuA8pG~nvrxkb zc48Dc(PnQAU;aVbS)19Gd*OBlc<{MS&_LMT12gF&^5T{x;|M?#>Amq_mV>>IQhTgx zk#8ulXX%C^NHLa~z|M1-Ep$WJqaxYUI}Z^V{9voNNrU#FqUO{Ul-TR>mc>rS&esM` zI|DhDR31ustZp^1!u-#5BY4iJ9;!eU;H?p$MDt9k%ku4aXHWF@;TKW3ZS5CPs{_~h zpBz0O0aCt?fI!NW!;f|w;ctR$J;8KRRGhl$S};8vc%*acm{otsor`#<`?nDF$T9=o z(~}f{fo38?r7nDooTW4N4J&rc_TIV9=2u{OPOr>!@Eb&DlJL${LlBP)1x~g>_G7F# zR&V)YnpH7hvc=P4P%NH9VR($3PEq~Dst{|otz6kg1~&I}a5c|j4{+`3-)0xnb2Azv zDdrQ-a*b6vLLK_;WTSeC+T6vE=o+y`%2_tb(+TWci_XSD^BDLl1vzQ-bZ3G%c&Uxu z2gAK{N?w-cg^zdKMLK#{)^Uga6v!NLdmEwURFH8v-t8!zUpcYygrTD>(46@e@qZM6 zNe=Dy$3CQv^d;#(1y#~Cb8)igM=uA5Zy>vMhzGMU)U!n(QYP-FL)=SKkvrWQM9+73^UR#<`eJZMRXv0=@tTv`m)MX*M!98C-83AiSgDcE>FBycwOREtjZfuz~G79Ut-# zH;RZ1IJLhdoqhKZ4_K^YthA`<&wG}q(jIL3?7NNZ8+TQldDr{x61|olTTRH4Qh{yI z};xzc(cf8?PF52c*hOi952n7f9#$7 zLmd{nKc~e`G2@4ca|^cWY?kP^>iLp*n-i%_wSlY+xlC1OFvBx~t!d@$~RQ98`d}M?k zMQ6=Y*31Z86?scEImV#4XbCvlk6~_*$uAZ2UE9|>_bkra8&pq}nXcUw>NZer=4vu^oOUJ%ZZ3;+H zX^=tFvhu{jRG>x!RZJOS+h~Ca>M&L&(wh`l`KWRaXs5jtgOnj1OHm^LbjJe%N{XAWHkzIilYQ*0+l<@rneB-=;5dI3}0kJ*{5`h>G-21kSjP7epL zSnDi>SNZ!4leH;DVWRQcLZwyd*+sUg7u!0un1=P?AUh2JN{CLP`}zq$+O%~9-{}_G z-uhjOYK!Q=OMHt$1ROvVb;Xxd2;#{r2A#e>oEj#tlD!ijny zj`oM^vZm!CqxZM(y~lY=c&ECGL!Jz`C~g_Bj&`O1?OMAE3VDg|FNCkYoa6q;W189u zsr^5K6eaqt&d95Do`c3XP{Ec8loaT`j#NFj?S&Qu+br5+_B^mVnp*Qzzki>9|GwiX z@2v9kz490dZB|R}AT2UjZ@NW*@lRvTip0Yjjr)J0#=aS>iAD5`fj*hf* zQwIFv%>t=UzL%yJO^R+MEJCYBuQJhzN>eoC&9(zfsd457jG8vby{pyqu&c3hDL_H?hQT_q_jXX4~FByQ1`{rA>K+-gi_|zreX6W*tp7n;kWHf<9*p?I_ z%$A^jpGuBH6kTj>PLGJuY%nJpmqe4{Ua&;=thj+dsusc2vPn2|R3+UBTY)v9ak@xR z5C@p?*=%wviui6I=zCrlv|^QUrB0=zgn5R1cJg;Zw(7O|8;!{lKeANfb{83ox3fJ- zUO6^7fnL|Ojqw3mb&!cNm*;d-k0XZxQByB3p9Dg@-%U1csP~S2?Q9?X>)zhpA^hhl z{HM3AkDu`EfO@C%MfZ!OxuztzD4UW8LCN*r%H%53UW;FGA4dUCogLFk^TGZv80>O( z-aYRhHe<8p`H%QtN)&|8lVc9#A=eg`6Q&WNY@)>tzETgL^$vg3=Q2SoSNSn}JM^rC z5?GbewiA3S_;vxxEM|IOBvnP@oV>E|eLS6|qjy;l#RH(eSNRmZm(zt`d2go?4z(#y z8MuX#2Ek%u0vF5}t&md{9StC$z@r^r040J}b-q-8g#O3!6I|~4TzMB3u(z}MsPY+y z!FUHSwt;6lejxl3>OFxN8HORMEAu_wnN!bg(e5&GZw{_V-kLk@oqAVTy_Kzy=C0@D zA-f{GGIw?n4Ln4#&t^I|ao=R`(w&Ge@8-VIZklR+m2Jgv3h(6MOh2FQ=e&_b=zBp2 zOTFiR{`*$7{(7(Hwc{R~o_Ak$`xTMwj;_$K37U84FnBySbeDe%I}}h8)*PH&9h13H zq)BXAK3Pr`P3jrBZ$RgwV(Mo|xHa;u9eb2ZRA#AOkRW7q@~qWjrDU<0af%O%JxuB{ z-t|+ne@jITohy{X8F~`>9R9etb5?^}L7+zBn$^0>g@W9xNR1uu_08hk%H6oxezM-UdX6eWj{msfaBKIv(Xsu0 zHin4pAhKC~^5?^sJwyp|4Xh2fSIdbQCm7hzo}8QYU;``=-AVk)b#Mb9XF(%SccYF7 z590kdo;l?zCw)6RADT{oZs*q73&I|+U*MS49vnyr?uj(YSb|0(K5Uq?=VEzfJ~fY2 zOh=GUCfQXwVKS1JQ(ToVAeOr<#=m?4EcV2)^)j7gM)o6-K_u-`p6>3uG{sG0UvT4l9{ zUa`6j4~7W}CJC?G-~_1KQ!W2JANeB$T#;76XKAp!J}*G>R^b%z`3n8Z%B}kYZr#R5 zL|!rPcR(bmF#L~A@7d(H4CvQr^PwoCd<3>n{00+}Op62rBqK=y=JIrsqGPX;mh_y? zW@a0_z>S63vK}-)#?&6aui8m^3rQq|+d`s^uc|uZoanH7=3lSyfp<^zl&_2UXchD8 zN9J27OZa<9_ssBJxQn#=;+=JPvF(Ip?seFuYXfHv5%{O5imIvweY0XP<#j|4({iz1 ztQ2T07V-f9xVqc+njx#eF8Q1yd@sRNd!Ae%4W2y;{x#ey6tb*JU+K)7`;&U4b6%lW;Ku{K@4zZ@QZ|WR%=IyolGbq`Q*qpVAY;Eoh9^nxD z4IGVqMPr2E6Ttwe$)Gl+RdPRMZng)4*ZS=Ibl7{bpO}078^3(~^67!44J@nKxLIYs zxF0ak;KZCYr@G>71NdPj7lHaRMz2TTW-)r%DtcLz-ZAy>IM%=8RsB1T_wShccO2{A z@v8nE$NSg&yG^lCp@$#V(esjWIC_JgO$Sk-H(1p_FM)(pLdw4G_zKoafqkz))L%^> z`|jYW&j(J2{@*W7UIu*5+?GL^=lwxgXxMx1e{j%0ue4=83!6JT>7G3cINRB?{!zfq zhLO(>PX~vwrzwpR=e9c?yKIfY{4uXKMXPcf&I?jFod*OWBu3NVw@i*eA43I!+{ zrGYbzM9!8M6fDn_Dm1WYl!#dyBr(jc(;Qugq&F2Jrf8G|ttL{Tq(Sv0sAwG(o>oJ| zo7otZnrX!ygG8R@?{jdTcw9#Wi$;mi9;1nUn_n*Q>O(>mB2+X!u>lpl5s*xEV(Y2U zKIX8osgZZ<=az~(D(i1aPu#0smY;uB*5XKDCaHEsB3#4a*6_DlzV?!M(j7z^`;OtY z*H0?=$oe(27BCcYDtbVgoaGpz#*CQ+(a~c3fK)JuV+e2F~y#J`TPn5YvwC;BV%4?7``DavPQxC{q`_D~pX0=*~ec&&tMqtfPCs z?zm8m&y*_tv!;d0+N37T+iMTa=imE=pW4@oeG;6;Z%-;Ke0osSaYiZ^+AW<`S9iWv%uY{g!C|y2)=)ofL*GQ1d= z7k!F(+bcCFZGbKQXU_?B-ftr`EC~B|vqSyYUY`5>@U1q>E!@8^)goQHS6^sF0+&8k zQp?v8LM>_a-zxNKSJph|&3n9ZLhwUxy;H_t47NPgSJ~cbP7Rf-J2jSuWP;Go33X~V z)0|tgQI)0q*&8d314g#pnX^UXS@Y~vtuM#(vH5gVZ3!!K39R2b;J_>)fH4>5)&9$P zzrzP+{)FHE_FFROz3L6+0HPQ2UUSvgPdYPpQHBt1Df$Np3AK(N*Lk@tF|0nlx|$<6 zJRnCmn%ng@vrx^$`cw9thMs$_)4QIB^SX7Yt^trzumUQoVI8i3oc5`%XKN1#tYuAo z7|v58=slR3|9Vjj;3;Nn8d(tZmuNe?_%(B>tODJAfBd+H0{9-dO3SbIsp9jreCGlv z&0Wr<tw~Yy5rrC_o zb*VCb>JOft{sg;A9ohO*^ixhpP#-?uP;k3DGlh1Zm_y@ZwYbCwt|67F{Pdl`4+N=z z`{f}oo4GgsR^-!0H48AQxK-Tq2(Ug79w?iZ`TJ})IV+OI{1yWc5fWv-oCKw~{geqScgpC&hRvQ%yWTez=_eZCNf(&4PrgH?ZxB^&CQux-j9xD80H`DR!2|3_9=Qk0r!iu4{OhtMn2rIPv9~Q`P`6Mlm@5Xr zQKkf}Vs<)ZVE3a~djl|zzIi$Lad7(6;EnmzvQvFenRdiOhtIXyJ`+ffs&?9%-fSb6sti|_GF%|dPQ8|0b8 zP+yArja|2m)fHb3&bmjvW}xQXu=3OXuy=SKR_1e+eTYKycxViPZA}6i&xdc$PvOnZ z?ayAC?mRW@wd!M}bQG1YHmZI7Ei(4l@|nI%k6)HP6crs3XiaSx{zYS5#lTX~!uh?q zAM4m>qXKWz^gSQd!=}^us;%ceQMc}Io#c7<>__uN{%XIGt3rM}!kYCR^m-V(SF#PBDbKP{n zn;cDRK0ked{<CCm+=K6J68p@VV|W}_wn-q-$m`8|x+rP;D|-C_oH9fPQ@$hvl;Q?j3Qd@fBz ztIHiy|1IolZMW6wUXnL(}Pwr>>c-Bzo4+f=iT$eXH9sps7O6zHHNW{9UDS_Oxwj)!jXcu ztH6aaKsGBhjm#k;Sk8uVN8VTzCde2d;4ZR}3WsDckO`PWKp=%)V? zf0IuA-T5bf4iGpfy3d!HVnhO-17J7 zBn!H*4MiFUtu91m{bc(nvu|F1xkrg7RkaTRWwK|~K-fq2CbOgt637LI^lYQsRcyIS z1qx>_@>P<*neNK-(U+)SnbkbyPI;0w6thBg1-K_7vsvuGKd7k+7)y;Pzh2}C#SamE zth@s-2$&1z&}O)WpE|cvmWfdJNB?V(TBSB8Ec2b}8|n1u=&W~cpGX@Ijq2%vv6Zr` z@g3bHKK3R6O0B?Js<$qkUS5{y#*PF8rkww(jli!+W_R_@R-)yqWN|)O*m0G3oC-ay$f_&mlnDvIcUdLmO+^AjCutJmppVWW_>3L}F(B0A*P#!TqlcmuyVEP}C2*Gg9Q3 zgWn@8V$`h|0k$1^Lt4aT)CIT)1P1A~Yb6g)DOH2q9I!b0w^l7p1ByZ=O!fG+#YGNk zu9o_ z0*G|;8A1E5jXq8MF6sz{;5kBAy)vvhUvjqwP60}Utg<$klhd=aqvgksyAB@5>&N-9 zf9!>jerd7q9qhd;$GG>gtPPThL_gOG@3ps}Oy0Ywb1Eid^UJKvmg8avUw;6jo#qpc zJXTcZ`4t4z%;v?_JiRV=lRiV6;~;RoncKnU$nYiAmYgMy4mGV?Y(Yo%Y<81smv)&t z@lHp|wWIPpaWssspCDdGI>v^~?>lX8Wbl^y;w+-6JoyRYnbcG1J?ZLfNo$Paw?wO2h2tL}SMFTASX zcvUY#)yM{DHEU665O1*^VvZ#bl7>TuPk@K5Yc>b>ee z?F|llJEupFlHty`d;jv?H#^___1kav1+JMhT2n?dm#`Mnw0O7R<)k1#7ficH84fu) zAtGgQ-Z#R%9TjuPa_A{8X|vL93a5V~yqHfydMG>e|QBJU-oyFiI0ZtQ_3A5-YF+1Wl#1#w=9mT*EyF4*~m5fvCFLx zd~-7kbwe*)&6?O`opvDFnjD_E4FR{k$IDUa}`SI;Yyo_6G!z*R>H{#}zKOW_e>Tcut@7 zl`6Kzy={|DLYslteUg|$RGtcy_ot(qJ^EUsz&wuYHkSK~i8}Mg?qz7L5 zw@GjCGurDk5aiy$_wRgXR;ji%Ky8 zKT>9cF26=Z#2gM&UM@<(MXc9Z@EZX0!)2V=%xrDn@eY`l|A~0p<(2~%<1rf%kuGLn zEHM48xp!@DMfZ;3#;^xWR7iok<~>A4;Ts*v71#L!?|>;iG`9;u)ZJF;cYqDr;q~%x z@RC*U!Tv8uXow{uUq5XBvKvgSLeDQ^*&g8&Lr?ApvU^{ri_u$PbG^J}=Sk8W2a}O;8h3BG zxDLFPr$)XxG;M844a(DYCV=388XDuGq=?%72epBa42-{A>p|^Pi91s(4|cS9#Qm_@ znLXAv!=nqGH-?#BCl6Bi9rijWjhoNY+d2w(qKX;AA*@I*@Ve76yIXC*FzZYOO20~C zRdq<<x$jnRep0ginlJ-LzMC-s}^tU$1+4RnRFNei7=)QxqmXF?LM$G)`oA&r$zPbFD(fFI} zvi;ZWU&jA3zDTq7cbDIc((k@)x7+`+x3|}RWb5*s!%vZ^%lSdcTL3f&5rKBJEOKd< z*QQZcl+FqdAw6A4IvOIWb1K7gWS-enMwAjpk(w>%vw~3b#^$A~oWLO8@*&uEKkNDte}^KpF#yv&p_G7+~F zoxitO6r5}lrzKu0G#twCqHZJ&+%osuA#1Enrzu?fXWnbISvCKdOlBLf)z8h_=})Df z8Y`lkW7C%>AP&3zvj|dOhzfh!dowI3GqE};N(HM+b}x$gVtp~Vi`JLwUrh^ZZSii& zdlt{`oD2t`*hb%dafLVg-oNZ>G*-G7`ez$wr_n?$1FCT@GKz!)*LHOKWShkf+w`{8 z#ttF1J;(o=S&MY`d3uXqg`DILfmx9tri|En7TTg zDtZ)kmb!>HTjn&UUhMZqMajj^$J?t*UJlnj>auOBJM{!0!#xV};IRzxhCpJ5_Udeg zCO630K^lVWLpEBX-!Lbv>sQ{yh^*^*GpCYx4v_b52>W}Kp^Bi1PkkT+sqOHIf6ehD zXby%TMHL2;O?^Q|?E9o@#lBG%xx&=jrBr6BFQip|5A1ZzN(RzMI%36gK?08XH(x+r z3ijIO_b?&!R_4V5k>`*PBmYQwvrCG+RdZ!l@2TNVpzODP2u_W`VVx?6A7%MtA&qq) zlqFBQ`amy#p}*o=Y%1nn zm%J-8Pz(J8J+K{WVY1nL3^>N4bmA*?VTWv?cRQ`Mifg6D#e94VSqM>iUQ8Dd7-{{; zAtNElr*F}Z1Jjj@*4gw87T1c*@wG~LXSwCZ(@ekZU&yB7FhwyF2To!hg!+#^E+Px z;v^M3-<=-Bf!#M{zHE%w%Af}GsTa~vm*mpUrNdZ}6@4#4LJhFUo_M=YMOCH798-J1S+lBlFQX z!+j2B;12e3@ekLp}Oca*w(|@n+(;5?BeD*HKuq87MUGw11-(?f#x0W+UuRz%EPAy%`?sXKb zIe)nUtjL!2%%>G~JT!)qw;s_$u_4OXTMYuYZ;WPrLorjeLYhJ*vft^?N{ zt=h%;#u%0! zUSM~~W^EHodwGy&^sq-?wman(zGEWg%^ey%by=8j8D*1u?Ao_733C-dUjd~c8QFQ@ z^fGhXGA=sx5E}B|m)ZPQMT4R>03#Y_w~4=S?h2pveqo9=Yfdfs8T*V_+kh3lwLeXqK^)=80S!D=+Td^!BTz=)EF z-Ubu#)`|u|h@^wj+oC8l`}ho~K$az67yymZru%_zQ$(Y=3lCI@QGJ2_ZWvyh->Ulb zI@S=|+$$=s+$pnV`8F%n109%vd2QWlXC3$!Fug0&GR!o$r_nA<1Uz!gQ=pPS8+rL`>+ zz=nfZNYV4lc^E3_Kj4nod_@x#92N|FscFwl361nRGuH!c6RklLk1kkzP@!(Ib1O{$ zZu;{tyUX1VyZI>y-UqkfalDtjP2Zcjnm`y2EEV`ITYpu{jK%>IDPhl)^AX--SgKI_ zl%G82;>y92%-KR5fkd~~P0XC4xAgd$awLiF z2z7eH*Mv-6TyM8hamV^H%JUS{+~FFD-|ATMD>=5-5+#$V`V+lN3w|&P$G0_PC0vcO zVmTjWYQ2K<1yhdIjf_P2;O@r-VPeq-TtKveYxHy|jkc0sTNHO~=z{=*U_^~eAFx3V zFC_Aj)Az^|t5)c+9JG9{904lA>uO=MNuF5)RCt>TC0%%zDLX%alOfF$#8l4$7atTO zYP6s{X^?le$}pg^Qem=j8q}EN5P^tlEm30f)ugUJ=!?=%*1!y&oes@|6PCI+geZqI zr%|HH7iY!XY>uI+=@f4}JM!R~%C8k{3ADk-7SpsPFlvooT`z;9+tgqvKr2Q{7=!i) zaeY(0+stZDo6zjbhjdtWY}C!eTp95!x%x3OsFDi7ho6n#^eW!|uEK`xsW)Kz{JYyL zObxs8qI#I?X@`k4=l8)(W0etb2h1ra)tKG7>44=or8{aRjIRi-E4wZ1ejjD zs;Oxy;RA&EuEJGmmgDBfq)@OW3( z3yY_Z5Ba5;mPxrBy@j#7!|N}l`)Mq}#MjrL16*GCCcm{ZuTMA8uJmold=zfq<>T< zQ6dS5Ww=XNm%F)rQTB|IR;;Ko&PpemKm{B*d}oN(KBM=h`Q79V?A2f;&OCg zm-rh$QFCRsHGvwa+Eki6_WhFRfcRLKL~^bq8)cn~qz;+7Mes9iij6r`uXLssZ&>NJ zc80~<2pNzr#R-U372_F<725hFr05my%%nh_c*q zFE}bFFI$crd;~}a7?FEHP=|1Vvi0jCU)YyCw7?0R5Lp8TcB6WRuXn_<5UfOV#E#5d zfzSz*5KQs<8Z4hKO3|$7&J&{gTSwQZF{cM|q`$JBQT+}+ZptMtRHKrk>=xzfC4aAU zY{V2aNWu*}Vy^=llXG&$9oXqqE_M_J-3DZI^-2`M=MuX2$%O9xQ9Zi%Nj)N*tUq9m z))V^l9(~#zttV99Bm8`&>@7m3Vp$*<6Z1(~Fo96zF-nlkLntV28&1!*$Spq81CbM1 zgY~xDV$|1s3K}tVgJplpWt;?xp!GhQqUA%?BuYw+X_k}f3>u#TIx7N$wXB2YA|`Mt zu?!zmrs+yVf)n)7#4rYbh#A7w7R2X3E6V;7MqU7qK1{tW3cyD8;SmMrG)3!YeFM!~ zguO#`VM-!PBrVVoKThTV4PH#gtPm#QkAQH`X4xoDC-{Pq2-WxIF}FLi;iuQ{sJXYh z>CL;O9L@6?To2+Tim^7cc>x&XiH$EWZSO!MKQUszX{<}qQqyvKAPaQN?f@8tY@T1< zx_gZD>}2Rc64{srGg?e;H!-ge!&qxpq3hb0xbco(p^bymD6{OzUt#c%`fT6(3{yFK z(xc`bm8}E@VxPHK!I085y*HnM0uFxY1^t+lzJsvCW)O5n8NJO$?>tx7K(=H%>7 z7J)Mh9D>})5My(3pU#yZiwJX2=U#{Oi}9Em-al3_?1JZijc}*cXgUk9(&oWdQw}B@ z$4*67Kho78Xv%v_jQ3X}R=NiMZB=a5ikaco_&rrSMXR9`_x-8-=O<4^v~N5UYrFOt z!&?j5>LtfqJF3l>x2{8X%Q!hG7A`H8&NJ!KP6ml2gG`m1q^evyYV1cW3#6gt%6vkC z$yoMCYAjOZUTqmv9!nxf{%#}gQC+eXXOam2P?ano=hK?Vp$#|8Dvq#W^Xs-*KY)D3 zMSN75Y@3;J1-3I*b>HLt(XiivMGeKJ1jVL7Ps%A_ts|p>ak!{wNbr)PkEanV14xOJ zAi3>H00?>>J}RDD^c z)}!yT7_~5Lz@wH$s2x+^j$?g0Ue&kbSl^DRZ^yB|9k1%!ajb8>zvFl2ol&I*A996w zN>wZqzLdQad3OT$Y6!S44`>1gu?ZMt>suUD9`|?ba!8=A%YRY|`;8J1{})L({Mq~} zYK)Xz+)8!#Cu9d+vwZa_)I)shwOld0ySpKaffBktSQC zrTr{0c|mFLw#6NhhijGL?jeZs2hQGdDoFRRqRS~biSKR&h+U?lX%9=7MyxkDYwqWBjE_;w?uLg9s$?+cFBch` z5@s{>p-MUPh()g3rqtSWk}sh+H)daS9QESN2cDZz1-|2h_hKrOeaNx_FN z3oHwNsHtE>1$mstS`E1`bNW1qyQ9ED%$j2M>|E=EA*G%XgCdtL39|%;%UK z>g)ucVsof5UwjFvJO1NM4n{2eA8K_t37~D{8PN2gZBjzmVN-+E`Xv|HC7@3W_L)S{ z71I{G0;daGbBw_Y<0QRYV2Vwz{4TmZWBen=GL%j!$4RFq4xH^y_&Gcv2${U9C!V{%a;Ihg4be!FJmY{hq^Q$GJabVET4u4PSU;$=_BadtryNhBu#lg#vac*QhhE?R0rfG89 zvYDQ0MkfyNIzt|!O|cg~od`F8Xv;0b1E)IxP3XY{1D#VrT(C)ESrN~P+?>ll(GFA%a_ZY7b1Y*cN|dFS|H^NPD!bCj^}>R37aK+{8I;>t}y#jf7aY(1Erv;e`5 zO1iI6nF7&QKr)5`%N*e4`O$aw4@m!baB_NJZi3m+o;^dHj~a9V4zu|u$l|JQiL-2B zzQ0b(cMZ?L*TU+|yJsi<-G7`d4q#bX2PE}|8Sg`?TJcNYxJm(;?DER*bgrU>o3 zykyWSQ3IPRUUP*5;Nki^SijPOVylp#8t?*C8oC3_6${5;SF-#zcG_f9=lrgSw`BPt zO(bUJGgm5Rz1H9cLL1V;bqQ0*BM$#+L;_O?(mpz@Dzd;SFi!zdOBa#`4kdL2k3UH0 z&IjgHsfg|g09tQBW?Vl7%5?!@sgg)S`gK-ZXTau5AGGyGmEEU=nQotWIa43lG?+Y7 z+$s&_2Em)4%d@)O4kp0zyYPN9%6{O3yOfLbC{;Z(R_(*b8p-lF9ytl*y^n>w*yAJA_xPJ1boQU92-NX&272{x7g@5rH$EYtKT_0@1nACV&WOO;bUCwb%urr((*i6+9&M&!#l!A%o;3`V9)=4>mPt9zU zu+vGl1cx9QU!{PhmH?Za8|e>;9dH_6O#!Z%ohN1$;A(;hX8aeX zbv8!73Cv6g;*OOoY^MA1Ze>j5o`d0Yg}Ln}ctV+n0M7|W$ph*Nq8n4<&~BnZn06S~ z2#w_nZ}RZ;cg+gmuns5&utW@MJR;UdV1FYNGP;lAGD+9|c0f`-urRzWmtXAzJG=l_ z1;{Q`S}CC``O^=Sa4tah<}=fEG9v7Y`0cP25m2XV_4Rh*%*Qc7%2{>I{~t7i#`c81 z*H4gJx;8l7RO8>J|9;{7I>n6@e=v=n5V>zj+}G)FI0hJsEq8PL%#8iO{pF+%Kbg<( zdJO&?b;%A7RLqqLbL{2{(+TMws_*1ljOQY7vnZ-Nv)Z`O-|tsC+18!JW)AM$ObhBz zOB*$_YA#%EF}ro}!|w5M@P*{nshOjrmxIIe{^=l?R-j|QiV2oyi+TSLR4A&67OgY= zK{>?KAY$6MpZbHRr$0eMzG~Wbh1cA(U{;J8U9f2Ulut2D!@W-B`vd)bB+tZts8Cto ziWhL{X2pCxE^cBw>~?o%zHH&Xk>4wM)~Y?y5LQYJryMrinvssT=5)m>$i|I69N>LD zy3+#t?Q~Cm>i*-bp=*F*3{S~oz5(T6Ap7oU$YF5I$S|yiS)Hdjz$J|qzj+oeqH_<- zq6eFl4+fi@068Q$t%xtX?iPh%jc3oM}GtVuIF6=#ND2H z81ri2%SBcwDK36ByD{<*rgw~bi?s1=qQ2wT!{pXJQx}+78{e=_cH?xWk{8Q@&&AsT z0;bk~6Y`DNdR$xq;}eIg1^mmD%~PP;R$5uAHn6=Zj=@@2-pq^PYGnXBgpX>BJKL zwqHyo;)857M7TxfPG*^0qfn)dY*_@WO6 zEb} zm|2lg)C&rO5jpFVJ(Y-;TaD~OJ5x?bmI;IB*hc;=>XyNOI;uC}IDHWH$~WBkPG{eL z;mRaeClJ0}HLeivaB_CiJ$vS# z;5CaO4?edV+|y=7Xb5_2p*$hSJoSJF;jiP_i|!zt8NB`d4_{W-<0UPK^UV9S?Ii<> zZL%<~VC`v~@k5Z^wJT-*SZ35ew{GLnh>Sm=wHgsl-)Xs6w5&NRGlJnhJs()m*YZfO z%|<(n|Fv&TiYU&tc}(oAL~>r3=bktv?7KY17a5~40yj>fhK4YQ_8ui4I-PHrJDIxP z-}E!YXU-#yLe4dx>?Ir36fkn#=>GrD+}n4xaU_ew|MMxv?1?R5Ap>@@UK2S719n(r zAb^v*H|vKpNCQkPW)zKNz`Oo^_NVKuySk@G5>EEs%Q=Z*rn{zJs;le0*8Q&L@5AHd zuJ`QeoR2=}t#3S4JteL|;znon{9!%$s-D;qTg~nnnJ6^#iYG{=w zyDh7#i*k?w#-RTvq6->(b~ie*^+w3gNLu zb;DKM&1ztUa$E5ojOFu%MW&YMF4W-jx9)!32-OR77<1@Lz2dC-x@Y6r-LQ(pLn&<9 zY8Y$y318*wOO=M}TO5k7>|IJ09Wncn^RQ=KM6nTrXHfIEBG(e?V$o-NIKW69$HbwmwW(+S2bfUX1 z(X){n&TTeA;juj=u8I@H&F{h$3h>}ev z?7R^B&qnDaN49C%+kS-Q>Wt@T`jW96u|!pegM2p&W%^;_<9H#dav`U z3iOzvk6`ZM1#AXEGzW}+srv;s1;Ht^Cvq~g+BvhPh}1P{lw=;2zg_XZzZ`F$9gU|2 zX6%?70j|RQ7Ku3t8rFixy}y6n-LAQM!TdHpuFY!67NbCF@Q}@umkg@wfD3yVp=kVc-0LxP zwk0W1J)j9n{Pe!M1+=I^oL8grhGnJCU`+U>o^R?FgSlx!H;^28FTT?atqw3KA{9<+ zZBxCS`!zq@IxHMDcjlrb(o*9>6YTZuV(a->Em1JzKfG0tStK7%&8ROd?Ib|g$B|<^F5qfoTrBqnaw|Z@xsxod zSZ?H#9$lye`44D-!gL%`1x9Vsrr#o{1*5CkG#~HXpBA8p3lN?C1?cbo0&w0e0OyT@ z!z%Qgb6 zZO+F=Jabfi(-K=x8&0EQdgJCKbA%x@Y(kc6eO&2~qGtjg@nRK@IC=Dvv-*t@YAY*4 ziUuP5YM?h#8QVxdMAezycj1dl@)eeuSYgYv5^3v$eUW04YQrL5f$}2>;4nl0gH|x{ z^{$VTxL{eIa{lO&WQ(UFL&Kmrb7a6I~9jKbdW=!euuF9*ZG{nB(=-C0bKSWXo)YVBY z%z8|)+B7+z0CJB9c>!hMpd}aD9=Sr(d?Wqxb;kJwdo$ETTEy> zc}j!QP*e+hG!Kb3m_Y=t*kp<0OwJLb`<|-d%x~rFvD$Ed4o7t$z|IMP?q;cKCuBCW@5-@A&Y>u#LFDJOKuw^dMUW z)>Kb9Kck<{j!H{IB!(QF^E*;!jI%7c!L4RjDbGL4&mzj$=uF_}cTOwGc|?i646<9i zMLI|_p#0iZ`UzErSjsd_sw^G%uegR=q;wD+8FL`VcYH?o2DcbR-5r_VxMmw4R{S2E zQfVS88DTG{;|gvQ{uo^bq>I3c+tLqN!95)O3Vg+@W=WG`Unj$?aKMCLFbz+T`S_+> z<)-sCeVz5v-XQ#WOD0zOl7aVS)4J{z9y%hY>pT$)*E`_tC40KC&BIc#9(uB+&nFD zD_hMIu%Z~ddbYn`bE?NCF*zo8Db=LUfw`c>;8f8bBPy4?S9H5FuG031t{&J9xluJg zg4U2Ew9GjiLSYOsRF05g5tm}(IFf~9@TvgCQ~Oh!?OH19m(8-!=@DUnH=`bB9ua6Jk3F`_nfDuO!Ie(vm{Nhm50N5*vY|Kzj zATke&gL+7clcwwm&TS9+PvOoA&`ilAW4lH4xeN8`FU2+0NaiJ&1{y-+~} z1=4jFKj6*E^2vNUa(g zhpS)=Fc>pJFABU*TLwD{NH8;o3}je3BFV<%a$L1l`R>pk2+3=8O_c?d=Z{WbgSspS z!d#NsSgs_L9Lp-R=?0K#EDJgAu!ZI%E#t+ptjc(srNHaQuEp2z_;*6N9b3TkofvIF zXGeul++w7Ovh`qI0rlRnDz!#c79&7C#BKWO|Z?&hgPv@_e$i2Y18DXIu3tkEwtB zYu7Tjc7TStnrhvyNLxJ9&S-N;R8f* zc@l8h0Mc>V*1f&GKos|Ehl((Mx{RxeC+K{*oRj0POPWV0QXNg^tfD`A%=S-#e zEU`BpQwbLC_b%A~4Vv?JD6<}tH=5M|%rfVht%}VgMrpNCwwUr*Ky41W@N`lh$+%Zd zAi4?|6YILT4dem=GQ(?_2`B}lSyW76r(=PtZ!KR4PeOs zP8i(^6WEQ*J1}ybPl<^`8%;P4rAWw;$0mD?S>j8nlLT}b(+IN6X2zCYJAI(#`i$U~ zn;kqdo14?*x6c<-YBAgUp!p2gi1B}`sN}Y<_!1O*&{H}oLAw=;fW5H2V=i*@#Jz{V z=$+@>sQDLqvZ;?{G<)GJ(mIQ+3VmTB;3WnBz^~uSgbg8-KyA+}-@Z=G z>tCS@$FlV5g)`{E{7j4i+Z8yVG=5QbK|7>G4p+}NBL@+$TVPHfIOoY)f2|dvAK!O!pHUXf4obZB@BcL6bZLs2Yc_vR6i8+*_}J(*|v z)>xvXa#m9%_X=vP=H@nKxJ=b(ATYK%W%H;6ZVB^AwuNJsq!;l_0X?zg!+RI9RWWkw zcc^n&oQDRVL$iaj9BG5tV8G&_g!c>k?H|++SUKuWG2B**T3(2bMS*b*Q)kZ?o!CV} zSy~MnoeyiOgmf_AZxhLCDKgtp)E)luqt-`mz;5bWFzzk*oVnRrf}jSJ{Hl7{XS`?X zmEjv*`0>M$M^xSO9Ihdyan0|!)OdXVSJoQ7eE*e3@^}BGhHg!3jY|++Y_HeMrPl85 z{vo2`k4k+F%;QA)N^nF5@6c>55xDwg*~~@&4!>zr-6n8^$JbF`?=-kurkyM|*5|2P@hoF#W3>pUBtaE!__bALl;r8QGu;k`OD zQ^s`ML(NNsl`0oy&zr^-}GSX0!mSMgT}0ZD>s0mV)YLo@L~IEp9U zpFkQuZhDVKbTj%N_nQEsd;~=KSQj45L&O#HSAZ&Z6U{5Nhn{!+!-qi!8Ig4@a6Lp= z3BTcG@pnI8mYV-UFWHYTd$rjF4yh15hD=t-et2oI`Bl69QWA~vPi?5Y)(?Z7{`esr zJS_pZxjI3V++O1?c{zLjiD_ud3+Wo`eB8Cx?~s5zek@Zi%!7ueC*^pOjV<`q^@eFR z2_dpIZh1y;#^rSM>MpkHSURAS)W+@QnRxTc!)<|A@56*mx(fXSpH6`A=9Nb}<)@H$ zMQko~a(;u8^V|34r2K{_1wclQiVPfXa)1iWc&+Mig*--lt>NK44jcSnm&K18c8Tuz zZ?Ta!oKN`qQhOFY3IA3EMSuJIwb(%8gH(qe-sHt4y%L*6)5rb4tho}2@r_T{xeh>t zq_?OlcSzAi0}0W(ShoNmlW7v{5AxbvZkU%Dt#)8qoV3GBC)p;$qf%yaoe7_7qWf=b zz30$;>H(^aon3ysX8!epKCaoMUYZ*2{DYD%`gU;t_-Z({LD6EI0TKW2S z?Ev*^*!TrD6P4q07!EaC=>wipqXa!~d{+#OG4ZejKR<=m^Z7|MT6JD|uQ1a?Ye3Ik zIdJxcyC*qjCmT(!?1?T%8{E{d02H#as^G?8IvVC6xRGBD`H5Jr#{vO)Mr?AzH8D40 zwZ*c%)_utJR+T4x?h=419@ZC$<9w{Ig`2_1HpHE;acic$R^zt1-tL7NXJe>TQ+Bb< z*yA-wL8w8QZLrHO6?lv!NgN}|^+;TNl0upR1;#s$)92t*V-{}rU|TUPK9lV+Hz@B% zS(}hC&tKLTV*$2bXSfQEEpPI}n%?q5q~S~+LJsYG#$|yK+w9!Y0fULn({{Yhi-8zs z^-9LBMLw1`kME2&Y(xZC2k(L8PkaG7MYGwyW>_|h`&_t$u9Ces!lClw*%r=*Q5d2a z-jPAMutpdmEBIy3nUUftw9P2RiDoPvjm$QUbD&CfEg2q@7-{)4gwp$7Z;`twuf3gl z@ihjt1!daeL2PbK7gM&grYi2!3@*W#f}|WroHHT6!ax*TF8vDL28AkiH5kzEGHGq( zCAE^W0OP)chz_nBPFW_peTuJw0%?V|9Scm#dsAe6Gl6t`7mbJFR1Oli$39^;@>0(q zd_cgni=v@$q0sf!7JLmv#YE3vnJ+=J}dvm7-1iH_LC zVSN)|)6f^9Os>k|fWidPZR9!|ApN)bmS;Iiy~!q0nz3%1bCpEkf}>{jBtvy3LJ?DW zm2&rAS64%bA3SHb)J5VVsUfWfe`%q;V=J zOc^9+Ld-DF?K;38fp-zrK1C?UJk-kCe4%|OSx1BBns!YHX8%3ffKKwyu0ETrmC|6> zmN5kL`0)pbl`y}}Mkcdb1HH!Q=C_Y(Y+85WlXa9-6>D?FY~}bdo@=4GF#STl@qN!KYH9$I$31Mb>AkjKl2!LwaTR(j zfb);ngZ{u>E6D0RpwVqXtZZ6QLM?x7^?G_p+E9NLaeGr8V;Se-xLx4?*K|Emc=WQq zioxo;7qP|9)c{REvcKEhE}+Hacj@?Jg1JG>jLI>DC|gWTkP87yF)bpr!Um3!k9%Hx zGCVDtLdK=xXTi_TmV_n0?`nE3><|Vzt*S)%el!$;<5+W220)NZCH4?-59BO7_+-&WaGd)cu0=ftPvRlEH>WfuOU9B+s*e=tnE?shttYXC~;I& z;rrx<4A_CYzyO(zYNNB_#0-UelVMH%l3ysV)1BQ{@88TIbq6KPz1l09k0y?le~0l# zssx1V^%9j-pr8s*z~lPbzT{6dbxFSO(TA6uCMzu9rBy<~rh1hG)L`wslYe;GqY>!O ztJmN6@bk0EaVc`R4v0d&w-^(q_5tKmgF@aq)tlabGNe$jBgMmeIkwfx5 z@CLpg&?k)I8*6LdCa<&e@f5In{o5ty|C&xGS8(U%RezY~*A+U%a{h*rXirs6$Nfwy z1@0A8u#k~IO@@YTL~ql)Z;(v1>Tq)dS6*DI47KmlJE_ZfS(XEg$pJEweaeU3pv^^I zVDKhpG=L7w7LsIueE4Om8qR4KcKS}mNFSR$Ou>ztAvvWK$%_OQIn`z~|I z`7|F6gl5%T<*_67lcAWCX(S{duAf0v66YQam%)r!6l-cV(&rH4%zB6+1{wksw#d+h zqes{6c9Y}XgROVF$>||njp56!ot=bC5MC-wPVIvQtM4k1#_&mpmrE4o=03t?G$KP@ zgPP)!(?D3V^LckXPFfmH#j#!!H4lnSllrBSqsUdSz+}L7k+?XuH@10Isq<WfOYdgBtbPKx<;N%J59 zH%P%`BLPLRRuIQgP(>sxS%p(wvJoJaVRfff8iX1kZ)f_MWj@WS$q9A}u@b|zAY@~l zteDjzrUloDR42^yU@$j!kxgbKTIO)&^<-I|pc~LXm%q9B=W^GefPGGRkC662s?Yts zx4X$B`oMpkee=zuWcOry>&QI&uSd2|0!evH8`Xm>yOPV#^s6<76GQVp1An#FH$QdY zu^}&aBQxa!kJdMXHYOfSmSrk9{dZeX>iGb3;nzO}yS$AtPTQdHcbT{W z)@G<1+8Pit&=3wsEe}3+@^wQr;iP>ZAnO8R)~b8?Ad+QGo^Ee%)kS`HcejkBPBA{S z9RGo^9}}Iyi*G4jj){J_D3gw)MH`goMH?&4#H>om8_V6O{OrmIZ|)@04fLg)y6u-1G&0mpxq1^k(u|JHOytOHePY+~awKdl;29AQ`_w}h;% zHi3q++m+!o2RpRz;J3L zG`Rh5^NFRt;+1I4J~nb6)q46B@8>J<%m1+)4h#c2d^a^`%IDqq&SF)T(5+?{rBIimjaq|}>qD1OK zVP%$E#pR&(&FitG{f01|m1Jrhb4&^y?MDdckyG}GQxHmuOXSO31XrVxqN=jv(3|BW z@H?{^DU`Pb5oMSJOBH5$+bk=nX0%r`o9$IfJ~+H+$%b+lRa~J#GH{H?#Og43!s0s> zEE6j^foC^gcwuCUW%(Linavpag?Hhd4WD*}V}0R{=`BkrSZEduPv(@t;RmQo&fnb= zV0}V8DZM=qIqmI(UQIZ(QGt{^@?Uf3QUhr@5rbogCVn62zA2uZ2F-AY|_T zB8p2szg%c~jvV+YH-~L;F>uzvSoVx7KHi`HczC?`-&^1sxWpMlSg$YIH_3i$WASTe zWy`d~)wJX1Zy=|1hMZD|qybMzUt4HlXN^A);?M z%x*tBdVwvK)$(WB{GTWI&%1Ik9U8LE*Qw|H=k8{u@RcRN4I-s01eK*ll@h;EmjX^9 zavw_>-Dz>5kBm1R%2t(Aj$mJF$MugY)vew2JR#ntcbH|dg+X(mW|hV%WHfVrJFTpH z*$t&6T%>l}T6`#QmH=_?Gqc5%9XZV_3Twf7v{YIJvG0?=@`lIpteqfusAZkK$>FRl zAX@K>{1QkYCNV5;%(#lXI?u*gZ$3Mw&9ZPkjr3@8b#M67?~#v$M+~X zg(qh1V+|3IzuJ&c1UJuL_OLttAGVFY#oLYF@>?d$4BA0HdjzbO84@sD)AMRFZXt4g zGkCoIyd8dNcmIU7L%Zg40lGCK7Y@!_wU)OmfSG#e_V0-i&@Qv_qxR-}g_(zE^bfx( z92WXW*Kn;L?j0CH@ox9vbVv=#r<}%UC z!N-@0Q@)QH(5E`#WT1+dMe#(b0pV|@d!u7bs~PfA!DZ{&U3{LE8RC3`CO>diu+q0y zv+)&~4b0LZR|mv^aRLfPzba|); z77N>2=-TttFS_nd$NAi3N)=MM*qpk#!f-Kyw({3c4f!-$K^Kc48A$=L6G`%50vy&&vVwrp<(9 zLH3{cXPqUoAy7jpiT6R#J%M<&)~60Q*=fHCS+lyFRpo$-ULxe0%}!d=5~C}yOlY6k#47=S*L<0=m`!Zi*y59 zyL8*tM)^dBw~*OT3}Lv=t*uvw$ETfderhM$bV&cmeFtAw#E7^CKXZwrAeA4cVD@o2 z;+e4Q#ET`)YKeJi#pt^w8SWrRcE_Aq-wputbt*-&mtg#?yA5>?JX&Oz8r)iN4l>fG zVOXmH3Wi?vR$)IAv3dcYB4427&m%&Ph3qqihsmoebM!epKXguDGYZWV_fWL#W_)!s z#WrO0D=#9mxSxrGwLvOD_*|0=M;pXW!e&E{MiazleO#(BHG^Ca_2EF37Hx5iAqZvWi7dY9FsPe)Hhn8gbO%l;rQryx zQ#<#CDL5u@S-)vuHyW=;Kq0J%-!7R`B1r)~he@D7MnDRUDb|4;y-^J|YD=ylryovZ z+O)llJG1O5Y)6@C=O8;lc5^TL#%EHLJ*19!d;Plp-G@yg=pXYDS!+dDg!5u{?`#>i z;v&D5$S#MrHiHHN#K3g=6%u%?u4Aw$;uowCWt%{3TMA7?f$f0w{Cut3RYW$WS$_LJ zp_bLY?ZUh)g$A17B=JRFjj}%RcZN6{;`(mu_#esJ-G5-^v4g#z-tTsaL)??XImqzZ zV)d@trK-U-h#g}B!(YFK6b7s?ry_JpSfWicEycOZh!|uOGvkA?&C|+nrv=(TFteJT z6n%X;8WMnCCgi3HAq!f1g3r;S&HYlVaguL#4|b2u6}O|K&7FuFU0c1eaLc+~C6h41 zFslzU85@RO)l9>Z+IU*bjl9O5U=>#DLhUlLOi);gL164>fvR6b02$A@VUlksGX#g+ z+9L$eVJ?u^6n?iEOHPiq{Dh`B4)D09W_}S%UG~hKaHW9fl?6(KfzA*49K9~bS$cPR`yWMwwKG<>p zfodM9UR+}Udc9=5Uc^}b{-R(%z$K{Hi@q1e1Sk_?vQ2}}Xt3N4N8&HCkzUoZp}ou% zNob;lC#Q$UyE`#TJaZPwa$gUfp=gr)MJ~v9PO+j5Hje!h{|PU7s9|p=;{(aa+hSb; z$rk2*?j-j2!Wy~|f@CmcVbe&}hLQPRC*pi#t2_d%m-q=tScaf`y+@mm zJm-dLl=d@v*;Zkf_+WL_fPeJQwMUv9E#{k|_U0a1;h6D*^_XNE0G;4^2W(Ad4xqlP zSr4Fvwnh1>KQkTH`GZcfu3)a)k(i@I8S?Pr!d#6V+_u=8$LkgjiR($?YofHu#`NNs zGj%pGmkwnP6h9x}z__Y#^0b>^C7D4

(6maXMgL3!^F^eulzSp27|PtV32{Q3OGi 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�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 +8Z zvt_E9u{8Pn$?n;%WbB%{VvvmHSP7=pxZMEhk!E`_)Ewm%U3mwU+g#R%kFGE8?4q~@ z4_!+8Z5{U^?Mx1YQ5Zmyncf#1{E&KV*$s4}(C9XFD`?)~dF0RKD1cCe6EN0dk>iUM zLv0*Av>3}H4Dd^NNGdbZo2h6#;G(*x$W<2}A{rRRTR3GCRBBZs%Y|&&^UU%Tklv^U z=5(h@D%OV|9QA__(@|Covc>?S?b?jFvD-cE!HOMXqdxqyne-0ahwY?y_-yI9+Aoe~ z&zUo=K3e6|u#cepa0^Et<1|)%e$=mQ;Xbc!0;5}b6nr{K(DwPO!`=S=(V?|q57|zG zzLeqCn@4ZGt!T5;5uXoz0buvXbHu|V=;0e^Z?nOYAGuQ3tn2&Y(TvkNCQD)%&ttjCB;Nh zQ@5B-Q63kV(-)oSvEV+!1fBHu_D=yR+H(fPqt_m&3hiD7^&2PC#Rzq4d9kvqQ8Cea zt`&=5*-k8Mz>Mbx^LbjHanwOYM92&4j&1M-Kz=U_?io+66eU|}@x9pOw9a6Dd^cfs zIYNv38AQuCH749Jf)XOUdkL>{lJD�JOXh+_?)6*xwKh>aKr_t{TVycOw}fjAx&r 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 hIvEADZaF< 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 hFgkOh>x|>; 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 gfIH8c)BeujCj10QE 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�M8}E4ts7|k?L4Nh8@C|(gK=xaGzs;z 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�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�JoM4&WQAK~-UCX94| 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�cilhf`_JnzU!IM)U_IInq1{w{_UIp(B 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 z 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 M>)-wT5#Pilmd)85*~+ePahc|2 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 @HKmgRa)#;)f)YwhM?P;RSw-0VQ}f(5Po6#6 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%0DLL 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 z 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

~`$#YJ2N!&$(L1}BAkN`R3MbFX{) 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νNBgdobR7p9Pi4$aR}EavA)@zL9Q7F;wKYX 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

=r<^vWndtLcIsL{pCXN70TLFRgi1 zBy^8Sb(~r~vV;nvHelVdsXTpRT#kR@SqeSdU>cj8OA(%6IuP^_LN<)KyIOWBHgGTml6Rd4S9^#rK&&^w zB!$dNHUXA&SZ%&FUs^%+R z!vX?54~Wo?UuweumWzCFVKl6X3}W3EwidFN2U92p$)*Z6g9_MaKCgz9{hJ$C??z-U zZbrVI%2Y($@o2~~eBe6*AhcKw*w|?8`dJI7zOA6F@C9yJJn6zf=U`Uw7)d-UXh)7# zlIlZX;=R4SUR&Z?Xd32x@i+Iy#>Pgs{ecHdR*hB|GxC_a`(zVh?!e-)RX*9Yc^t)l zCS61)3~GEmJAovEHce1DL;(V0(#qqavN%Stm5#-WATxP5yQsd1jNec++cF5&#+FOX z&-rRC{Hpdo_Fjmc7J>_2I|+FjJO0n1`ExUTyGd`g8oelgH84_+sg+4(F_a0lIOw7( zgY;W;zRC}BUmzIrI@d)K@DK~izOckHc`m>ZLai%audfb(dxIN?K)*(pT7OwL4!NF= zFj0|KLrDf=4@#C;1NDIHDE-z~vORDY`VbMy0Lr=aeF%hinKTZA^@#BuUsdBw;;x<% zk@T~Y%oX8l0}_y5Oc7#QLxaypp9@YrS##}jf{6CnSCg~K3iP4ww}K|hAF&awt4t+; zPho*cf#4NdPb#kkLiF_Ae53wA<}JT+JxERUemr;C4Qv5SgvW#O@YD+bGaB@Z%5((N zH5wS~A>@4kbucdxQBv>svCees15rg^5%`so3mCRV?VtmCapQi&{T7{|3QO_PF_Y|Q z_R#O$%S%Zn-Tjsywk=>C5E-Bp-y(`w3w{kUM*6P;Lw(30psm@aodzuXh*n!Od^16> z)tvo*Oxq#XgVvC6D~hRKL~^i}PL{ zU_QJRayEaS6B+{f|NBFXCLfMK8-i})>ulbV_R)QS>uM2HT|SiWoh^i!ITIkcCX@-E7YK7wT&N+poMgefK*3O;n^oe z6LNO*vBLuMSd${#P?~`%uOXfu^ZYV2!yTnVMB99Q1)Fu8*ffkk9kjR*VmcX0W+y2% z*Kw%b2AXMY^b&+G8l>t3V2<_Os%<7pGwb0}!~<4zqm1sslV}_%6eBspfL-gVEOH|1 zszHudzeEOe5~e96js|zRA?eo@SA)%Tq9Hw;5Qxip0lAv*K7x{uI+C7HX&f9I!FyQj z5mWLrMh@VzwvWVfPmLkexM=R#{<}Pk``uxEk1EYm?DA0LK>7n}RP` z5=H7$h(I-tr|#We6l1{2x?JJgtw;dr;HBwDS|Q6&j%Kdgu(2@b0n8wGmHSkED#s9= z73y3Qeev~DZifL^cRs7`xUNfhDxt#O+DwTW?i9gne7Mdx|AUpXf*x!VMAZ%bTHhl(()KrfzEA03Hq=pn_tTJ$H4E zOO|HlCEcT&Y2som2h0{h_b%ktj*I`ElceUAxIggc;<05aaMdkS0cr#=EVo|Abbgu} zn?4b(=)flM`cPWV5Gm=m!wG~bVl|^Ac*MKCwD$5BOc^^>f7>Z}a!$YP(!US3G{apT z68upT6I@+zxk9R`HASuOMz_6meS#*QN`hfv$v5=okDyV!#eJ{5f_O_O)&fRc9H5^P zvv`-N=7(88*o-7JkY5fXWV5F{KxAY1^{A8effJ8__&n1n;eLp^Z-O|lG5E#bM|u&q zNn>TYL0wOt3l#`Kzu3y#p&Y_KWfj#WQLMn)Gy1>dHd^QHOcFv-c@$4z#x66n*SCrH!)J9_clOgFeEovIsDnAo5Y zKB@@(!YXtWy25*Al1VigsoPrP{EE{_teV^s7-{=I)ogczEHQkyd{^X-=H`>Z-QH|4 zXvx)D;auR#09gXM2*d%8`_Mz7S>lbye@NVkDOhu=p;sR5O!lcyKwU#Ock|$F z{k9yYHqT>X1bpBv6nt6ZmvzojXhMuU`dgelN`S-8hJ+8eiGYIkO*^hpd3q43VfHA1 z#M|!bqaty^+WY)>HiuJCd@VgSp}N_}Wq^Rv|OA)eGm+05*p zgk(0<*Ah5LlTnLNOjZALyu-z0UfcLv+414KgWYdhNGgpYX5OYF@JNn@RKp1FzE5c_|@R_pMk_lx{OR~!R) zzDHOBeqlK7Xe$xW=1SUO3amVoIu`YqA$%cuAxIowjEZRd!A&Aq3Pzb?YF0qC=F;Nn zjOfNWn`*@Ec2ZoqCMIaCL0q5$HLsZ_!y^CawbA7o`A2*2>CrW)t9|xg%CnO)BtY*4 zkiQA%vQdZ6IK?I+aZBcd{&uHQ)coK~hw+t%vni@0!+C4823P>h7b|HOE>nyiK*5^R zwUsy+h10veu2>JgFhfDjw|FJ##p%YykudZ9H+iaX%QD$-^nU8kuCMv7h`o?-)C+B# z-n5CAu)D!wuIPJm6XCb8gk(ZB#rkB9YR7>*rqL$Y zVtC$ezm#~=$Fdu)Z%=+{`|4znK2QbySs<6MM0(+fwR7|QT(Qj;wPK-*tB#DkdCWJ_ zz70M2wzlZ3*c1yX|HtrSw@q<(8H=@|me28j#a*tRuZs}O7al2fj18&q-@yQ`1Y2qE z=n~UbhX%45cyNQA+|tdop}a;+;b!#@y_tMLa*sNhCeqC6Btst4hHj{M>EsuwS)w+Y zE{|7N3$723Ehw6Pc$K2Y1`|1HgAP^7X5gLL9I0yAnDke4+eG;l*nR3oT#P)abqvs? zsKz7CJuzauXGg{;7aN=o%x0Hs{8ixQDwxaJK7dHgCgV|s#L?CCa8fu@Ie3T|DO?Vm zom_T6l}Q)}%d0BISmMYB0*56Tgvb0swA?nc8JncgQRSK%W=jl{cV~oP&nL zO*J9$b2CuYTxMue@V-Iqjt<)NB06Q-39!-PcuS9l#uIdtyW!1-({hkWxLAG5!b-|2 zv?yU*8Nj`%FYGX@Zt`&!OgFspte870gZ!dU6ErDu&CVzNGNjDJ&!Ah654TGoeDVvANJ~ zPA4oPwjMCui&ZMl#kmNBN|IG9IZt0Q(&RYP2}f(GM+{CW9*jD+KRW&A9PUp9iVDct z*~eg!!^5{G^GsP`eD(}DdN{h=2DrDXLo)H9mz;nBYEqIXFv;^0ZrU?O-$4?Qq?ALp zL=HfayBMAJ$j8VSBBD7+r2X(gEnHy`@FQ1?sRJ9iARtew&^E9-MuAOwXqn-lC+Myn z2C>8vV~Qc->LbobHh(JyYBh;I>Zv_gQO*Rc?bY6rqrq%OBRG1AG32Jic_DZMGD5~# zn)^`npf)TzH?CESzEFfNZ0YLdXRWgCeMX-R1PAe+LRr1W3NUW>2X!&xQ#L-mk6 z=iCtzEWVgG460TEhGX$c=yl8wc=U23xq|S)jRgr^+#6 zh(=B<33jMzz!Nt+#6V*<(1$02c*?kitGN?GpM*{{Pc&w4!sBDG@aTL-M?@3>FQKt&yGfw7OYBggudX(}zbe!W_R1?P@(JUM1qRpm) z@xYb}CBzEiU^jWFAg)a~a^ygUn+Y%SD0#v2%A=0~hBEgP*43!U`+SF&8CTPm0 zXNzE9gV~9AwP1>^4K8&Ews@NdJP)8{aO{g%o{P7@#e;4Bx|mWBRdmu(``9L^O~rko zbE4Fi$_Phv2#Bfs2Rq062m7b)vN(Rb{U$?Ll0n(0qza+Tcs?s3>39nyWFw9woyyxt z!z2|Tj|RvG;u-(^4^Q2jO_=iON;}yli0cy#kMNCuG=~n zl(7-@A0q3rBSXjdY=fE;WD^?I$tschR z2DS#heS(lpik>VXI0B&!r^&pwAh$eGoJ5xyv=-}r_88%vx z^v@H9g(B8eR|nEEq4!}98n8KnU0hi$qHA6hKYs%nLa_4y=^K3xl7`Bj_imq*Y_O@S z1I3K0+}yjORe)r_Lha?{U^WReXzIy!mk#J!@s#30?z@W@(UiuM5^m+u3I&J`KaW0< zY+yL{Fo=y7%sa-rw*Bd#)WEfSxPJX!*P`R*i8z1z8?~{u6<4i&cwbD)%R5ie>=q)5 zSzZmrZ<2iNU*dd{z=_QpvSan*A>$2iLq?2D zJ?#=69zxUvCxFfFfPt3<5Pcv|nn@{Nd z{-KGU|IV>}pDE9Dcm#0>K+ln?`Xj;ozN9wJZ0tNGmIiW7x+BQSuIx)p@9`o)6Eu7P zQAxg{04G4$zbHHjUAs#LZy|_Hj1IrxWED}>zMc`^OTPQ8G=s~5iB4o3u+k^Yp|9+` zm;w)s((*LFLaId{k0&D_;3Lq`Px?0qnNg4XS%6!D`);jtbD9eDsn?>+S0c4(CqCE< zLZt#!c@`WvKXq_aC_i#L@92<&A@n8gQ(WF0p(ECaJl zDodFKG>NirHuZXu^ka9 z#MbS(WHC04Cl(W{#f0kbC%ZLBoO3lQ_p@>Z%e%Cv<6<=0e-eoz<#FbbEjy9Tt>cwa z3dz90@k;36S|^fC_9aItUj!Em4RsI@VeO#gS{ypBx#GGsvg(QsSTzSHw0J=cawlu&DLhdYx zs18Ieya(Aii#^wd5vM{&xFhv2W>~~?%B^TXQtJ1=R1q4Wg&pO$Qpj|vF2Hl2tVY_j zj4E)h2F307yRUl6_P!FmvHR%oQ%55NBsF9{1n!P5L#ahPIrvh=`hbptfDBHK+PD8TFCX#HC}`G`t3f;bM@Ye9D*AMHce7UYVcFmYF}L` zzZW?wCnF0y`?Iv8vQi=cGiPAjR3}`4xDL`MieLQl&d#C7?|$TWu~46Z4y40`{sL-i zDGDU_XiMY06V%4lwFVIk)tk4!fF&H`= zI=;y2n+d9W*VPEHb<|q-SHRX5q*z@MqMPzAcU7@FY(H&8LH3;l#y=~_t z!TKRd=;)|HmiCg<4|+Wa21{v9LUx@asteN-7_)%9 zB!&l)L#XD>%dW%q>6?C3tUQ2sV;eVy69vP!smtb>jNici*jUnN%wQ>kALwT;K*pJq zQPP`8aWhICnz2QPkf;Ml*uj&-cc;%Y(t6625ADJwY}eM0*w=*>LC`TCo;CJF6l-&6 z{I0pV!4$>9&K@BMNNyjv5tW&(bE}Vj^f7 z%)STdtS&V_We*RaQ@bH1DSuwJu*G^TU@en)zZg3{2vbd=!XNxoCnetRIJForO)6IM zrMk?A03}2Rlo5;Ietg?Ie%(9UIed3;y3Sg3Rx8qpR{eR28MXjEHwQZ1FEn!nkA4U@af&~ zxlBE6u@a#5(h~xO1e5~Gee2lXub;JXf_bg^d;F(qUSDuYXq)oSm^+ppn?)WUk4BpP zYXZNIE+amiDFrS(^24+ncyuiYW}AR*p6|8P)U?~{+4v1CCAUI;Tdxvx7JMvSQ8|CeGiij9}ZD3LymjQdi|%7o_p{blH!Z>v z$haVGWe#%icE5i*f+<zq??B`vh>;f(6ZB$BL6sj&RA4NCdnu&GHKecbbZ5e(QZcm2yeJ#^nHRcOUo`hStXbfWP}kGW z)hCZ*F*88Gh?n}w+!auN^~Uzha=^kiE$D}Jm4L0nbL*<}FfW%j4y8qchV z>y6oFPyD(+Y49gTLY@yP$d7IubJ;ohg``S!d4T?aRUa_F?{T5vy}*oD!tC1MfX$wP zatX^#mJpIu&P0fsdAC;j%8KPEM$O?KFOs5Y>2UyXr@VsYfIBS#n<|$8$3>!MoFQ9D z$$mX1&{Ot(2VnL^f=mz+Y0CxikdYT}j!FqFoy8}n7gr$$xXQk0&a`j{9+0oBy2kkG_7FlSFrWSebi#* zbA(`kZ8s#h(r#9VFvM3cyGojPQWJze{KRUq;G6k^TWD#(n-II?g|}c``3}#-G4tML#2k4n$*qFJbS$v<03PNski9{MOI0&GAQpfM7IiNpcLht24<6P zso0U?#7*n|;svQ4HV=uP8wx0HjKU-yrEj046}zr$kxSTD=@S~r%_{_Exf+V>#jZ5J}E)YV7$t!D+1TCIodYeF{< zKejC&Lm*Vxj$P=vibc^xgy%7-bqWt~ip5=4e+7M!uzh=Z{~9O@;Z2kFY8fteSjV8R zbF?euQZG!c=V()$teh&Jv)c2mjuS-d<7_OjYbH~XocPwI0tl(4ja#nT=v8p+t)iE8 zm>(@#jnp|b=5_&W2-%Sd_<>Lq9dHO8Ga6?*QKr){ktrV5hl_hgo*tys9Lh6j1*rY4_Zqt$_C&Bd%!4wsnRcAy?v1D>P4z`014#&pA4+z^#l^#Mx8`2!IHOfbRv=HYeRvHOdD%Ek85j3=U`5-;J6cdtuEmC zBc9W~T85^a) zl)BR}1N4}I?hzgyuL{^r*&x3YbUd%`?3Zq>rUTBzsqx=oei+en*7!pwkXfXqMPUD$ ze^^g`#1+GTm&?bhr@2#37@z?!7Z+nQ92yS`LiyrVRm{ck6N3R!+Js}HIty4 zrLrQ?s+OTU7lk-cU8KksY*p+D=KHSje4$~8Wmk+Tv$b5hjsf0J#R-v4$W|}OeTER& znLz;H9T`F}^0ORH8#UN=`Cin;mqcn9np?m>Ww;g+9kBWYNUCG#z0`x5idQVWHXVNg z*M2y`KOSl$H7`1j4@5H!;$L#KYA(9GYC4%+Oc^3$g^>lUS&D)rhkaw8a&HAb4zf!( z%@m6Rs_|*O#Nxf~rSUMoPIyXwT{tiO(XdEij!Wi1MB)?g4aEGDTzH`tA`@DOW~=Aw z1!VLR@WaZ8@ZIj=LC^i=E>_s5Kw0>`swL>#k>kWZl~f8>Zt42~0~U-Lpwp1YaPf6; zAMM89^E&V;m4iG_WMkpEsvci0X4UuIt|X*@FHzPRvRTYtba?++)m~`epMXRIr5!Zs0Rbvcn~VX9k|J zDTNoUrlqIQCuFZNd=h@MFVU%S$m+~YpY{SIMPHZ(bXAqbU9jXx`pwF zn7&861vrd?bF<8&TlL7T--|vNrCoH$zw9K}>wQ!|ldK>}yx?3mA1trR^PNm*GmhTm z{KlLy|9O4OQWmM8Do#IDFIxlG!KQQ{?~KNG0q@M)l~$g)jBAq#7|cn_OMSF&o1{KU zLhLG>cgvgYrb&YAo$q%%r@py>Az|Oq^!0mR`#j;b!|8SYnivPRoS73h+?_#@Pqv5s z;{tTkn3RbV=_p${Cp{S~BW1V&<%4V|S1qVW-Ej5>`4!iRpAAOm*bh!oMxR1fGMm3= zC2kXZe9ZnJO9*TOrUt=ofNW+O_lFB0pl!U7$b$*Jr{@JV^7eDAI}%h-XRIUc9>x<= zW|E3ss!h4}xWW7?c3r>q4&{lWg=P(&ZVN#Rq+ge(E# z=asuvKD!s-5{`D!QB}edN#3hLPrSs~bBK=u^f^Yx>}17%1KQ~nYrs^)44GLcA6%6T zF~AIm+;bvVPc+c!@aQZw^Nq$ZS^&f--NKbQlHLL>S_9D3f z0g=Kh-W}}!?{~dy|6sTG? z718~Mu#X3`>tSVi0N51sd4OX=M+YuI&)A}D?_$XlmT-a?)2_Sw!^;s7Z}=^+>V5%T zr}253^Lvx_$!5S%$f$(s<6z{=U`)VIZyMEELq*w^-DrUglxD6awOWYpO%_?^=B=Cn zK=>Zgy)D@&a%E_eUM;h=#YI?$d5=5I41oGfBha4Hy&`waWHYwIOWz{+Oz0c%^k9C6 z6b@DP2=A~1NYiIDj)YezG3jEii9z zVAn6Q)qDIrsnz!iGGq~GAk_JJnxEgJ&L@0lZ*FXEtZh79+kCp>5!mwC^dp3cmes`| zFRv?Plh|4~BAQW+W|ND8Vrjv;OZlew(#_p9ca>w#_VU8fWpp4$0D(OvnkosS5%=1%RKPN5rU-(Zp$)y-yodGw}g0un~l;BZk z0`a$geL+(u%mKQr0WwZ(WRvd}Ow<|IlX#Y#HYp#^p4RjKv-j@ZZ5vs>=>Pf@u;#Qw z+7u(nPC8?U&Xpy~W=E#nde}}fURn?dNr)+eO^}x4j?ZVmwO>`c3I&pOx@XS1_h@pAd{fo;^ur9!ZQJr)zHmtegxcl zMSshc5i4JK$y;&8RRuf4Vd%e06~GIiC60H>vLRw3LZ)$_ZNhmdL1|MaI4Uw6zyw_I z7r^e@s>-Y4=6HTSnHHDR^tx1Y@OoN&G|~akN@wLMT~VszaFRSo4<|9bHSl2IN{KlQ zrYZA&14H4G2cKR)jt=$62sn@>EP4Hy*?Ia1xmNxZ7^0{8Beiwgu-PKt91pIt>-1^- zn-X6}zUrsf^(~FTbHj4SW@2jQ;MkwC&o(~<0dh#T!c|C)@|@JCVwaA3!zTCs#j9_%qvQJ3t zN=~}()WgY^Uud!&{QW5S`*B#ocYXoG$|ITZOYuqJr-^+GNAhKFZ?D^@qU+74>n)rA z_(W6TRR@lHK4_i3^dI7m^&i~?Gqz%{q0_*Xx^P+9H^a;j-D!sV2esCAdF@tszt|MX zQKVAgHF`ld5}R-i01gssj>P>59+Z0HK4{8rtbj&T+#6(B93i+s@18|c1ky6mQgGLOqNcBCacQd`2H-}9187CBd!SEr*QLK`twJ#QnBNB_YM}pdKds%RbBGbB%6BrpzwGllkgL(CkcncLC6@K}k zIiO=vxAM5iRf-``qdPM2|A>xLAl%U_#PH9+eiG-rXa=+^#=mg_FqkAlT?V*agoY|! z$Zkd0>ERBno{Gr1`0Q7MyGO3fa6_qwdNks+Ddyy>c^ zvusR1IXdkMnj-Hq>rQ!Hd<37@1ORC0(3$|%7E}aIyS|kylG521a-bn4<5b42(lBe=g%r1dI)mA*LMPbwO?S@m z_>2H~&)V&_hnthcf53MW2Te2Lmc2~V7_@hK08q=)QPb~=}mb2w8w1T z={!~eR;IciluLqr4kdr=Y@?f!qdEba3)7qj6PCs8i4STSQ@w`)b%zig z@F;l2@!s@u+r12e@q~491tymE4b7W$@BBB@%=>nwS0SbJN`KlrKSt$%Ee=M34;^Y9 z287!R9G>v|jc2p-5j<`_O+J|ase*W6eQ0`tHz%YSk}C%Pl)y0f29$h_56!3Q6Lbja zm2XH<3!wq$s2?TjIvdZgI~|&|AjHSNJE-_4e{8B4-zMv*qgeNgoKLg#gMJi?uLy3i zP8b!vY##IB?dtOgdjDZ|3jtk2gh|Cem&~LfuMTe)&Rb>X@Po+ARpu^-P6Tro59M;9 z=-e?t6xj0OG|Y~_$!CKra{{G@m_}stNkXAGpcJw3GXZHcC#iwdP!R?@7iu}N#x1Uq zl`3_00*$3g8=&8@@r=Yw!1Ofm&{8$cRxnrkXJgBv>>Qu$ob+~U`?k$}n{2HxRwNl) zwRJs`y0%xXYrD3t$5Pj$RqJ|GTi16|*JG&*AODpfix$cOf@qdAIA@x&f~?vfg^s^Z+H?wj-Xs(^16b;g;SpG(6V(Qxkh zU)1V$wN+LN7WW@R=Ez{1%>AXG?ExvRc&cCVNiMV@y-_4s40Za*$iOT zr50SHNr#s8el!j)Kh#OBe(v!ybo zr%nMWei(-J>jOKsi7RlOrDM!4dxJVnWta?#Z-vD%-;|{;)~pM5%HrA(L{-(IIo;1k zvus)`kfJC?dNNdzpwxn0^38AN+3{@Zo9AqWWC2Cv+}FvF32XFs*`~gdFzJ6((Pt$g zhWApbQl6LiUz2Gv%Sxd6RYq1hfJ320RD%O-pF;eU)^ z7Thz-w@Q6Li=;khS%MEe-l_tt5s{ZYgBd%>oPFHZdVbt&y9akjXwIf7CC;MXTy+GJH&$-mF zCi4{ll&jfMtD~zFcjABB~I87|ut&7X1}HB3~K9-R5tyX$gLQ350=@b;UfsW&fheV{#GT z#}PjwDQHPRrJ#KyMV;qCSk%3-Wx>W-+=bl&9-FCqPzAiPod*MFv=qLPVoW+C#psQc z!@$gFb?`)yJR! z$!C?vM`p7^%CO+E;Uk8x$REWkouQCcY0_MC1Z^FZMtgl-lP85=$yGWmZu%qyCY$IS zwtcPo>^<%M=m>%@^!A6Jg%JeT+4b+m9K2RmuGK{lZ2piO z4rT@5;Qn>(|3(q~w?+}zXh9UR5$&yTdJalBBLFv3AxyH=vQqU$bOfC|GS~dLOb3+4 z^MdTn>rbeHC+mm+0`duFO{X9`xQ_X2IKo-S2yTZ*za*1sdU>5n8={LK+WaI5x~6)B zagx$4L4?gmfNnJ)m5u}>@<*JZ0G16l#bBD7EoJJ$tlY&-Hr+7STZti`W-&1q5d%sg z3S$D4#Cfa7Yn&BDa-LsW!Q(0$VX8*+MLq?X9vce_TBkWQHJlG5yu&4d!8PrDdq_B4 zElE6&+seY@!LD=Pdw{qEBm~?FBqW}dR<0>=T5RXf%}4NB#^~-jgY-Ku=d(C1I(bOH}TB3@h40@y4~kMa%47&Bq_yZ%-YgnnjNf zgd!FtI;5bp{}_V%5S^*ul~KKSQLtI^iCQA(e%$qd7X|Jgzyr*Z9~f%^aTPyh$%dWz z>-pdc_Y7|29%MZpARmn7@(_yHO-g%=Z6dV8M{}eU+Z>D^?r8Vd1H$D<{2#et2Kw-@nUFlm#cIrpi1||L1pbm8bI&07puCOBdNnv*hr&FuV#P zyj}m5*X(}~R{#Npe>*%q>hBz!?d>0&obC4xy1Oq=`#&G|e(f5Obo;S14}^kxh12V% z(8gx_XPo+j<4RWXeJMnhAy)4L$hf; z1;ZdMGk1&$QfAYSK+8+3Gj=+Z+6#pXGCnqga>J+qL<3`8rU-iHoRWeg_)kv*GUM!r zko3^o9Gq^?V%MDmM>FPN8bS_`7$Ch_>EKqj+VLbCMqv7U$#UuqG<2jXo~b)qV-EZ>FL=7!{IcTM2DP!?NSr zS0E%`J47FaA5qJshoLmZItC4%X$({&6I7OYTs=1{5^8-$LeP8r*?7@)PdNqD&s07K;pwg*@Zk z8b!dO#mkc@>P?27LAqyWD&>*?1;rsV&J; zqhL0@!|u`1+40N6qmwg$dlE5Tp)1?dBsB?0oqk1~xu+2tW1rsZ(43mj@fT%ssa`|Q z-y2lV)ItYbOPJD#870{{c)RniCC-Ew(F;3y4bYinYA2>)1Z>9*NSgkVb8uM+lfxZ2UKL+^1h~BJ5#~eZvkmQ3d zLYkXkd8ylsvhc+-LTqfrR<3!EUQ$7x-Pj&PV?K8JC)$J$;pBirf8`6e zs_v{UF#IFvo&|+91SY~)0*yjU_Ed8iZQ9e7I3=c~P%+k1dIV+C48?;Uqo!0u2DaZ| z0eyz(i-e!!Jo1KSv_E{qQ~cCBs1)zf6I9jD3C$kW97F^mnC$}K-V_Kc-vTaQVeDEV za{!DlG8Il~8r(WZP`ff3!($GjQ?(4}aDb(5%|*QFa5q=D=`ef6HMGQ#Kd7V)SAPrZ zYs)20IkQLn6nTcFx>?68nr863kPPJ&S{d68dhw}$(dAc5?MNW_NFo`Oo;;(T)ZH(5 zyuChGN^aP+-9kz6V)EvaFrazLh~iN9h~Tui4a!FzplBvd--}zw_*jwSrFl|;Q()|4 z40#dc2uY zU{#FHR!s9tOqp3t$BFFUO?uZ7Xfw

5Wio5`GOCOW>ReP{e_3YFO6sB_xqF)J-~L z^+uEQGTR`nAy>q`@G?{E>`wTz{OgHgGdu!z|$hBqN#Qq zEHb+CumOKHiQ!$-DM+z3QqjO%kPQm7nKv!TJem^#$c=@Shq!FSz-FLv-Ep}<6r#Ri zaZqZ0M*Ks-D$_enbdeTSZ=8wpnW`ZhQ7VSJhjsuhC$+69Q4~g>CrIC!xL!05ZpxgV zQ48meI~9DOnD{5vpg$qnSU^WMnE-^z5FsCr%+wdxa&S|`CZ{fxRxv-#{xQ#yI>Paw zx^4&A1dp|tp>hHP)Kn>IcR0^rbE4tl{0{VC4g|=ioUz@R71#M-gJz^K?Oo@eP;zZs zcT{wub@-OsKR8vTs>qv@>-0_^OOy;jSvOkRlLe>9FlL!ee+`-&FQt&r^heM~d^NT| z#A+BG))A&EjVKRd*=7AuFoG8e@WWk8ym~=XI=>Td*QZ_qPx^zkw_qvUgCOuh)p@VJ zQYFAtDqQo*1skpM!DqMV!PyDEtQDd^@!p~hr+UhF>O)_Ch9ACyH>z)9RH#yc3=uCy za>hj}@Gw!j6N}`yKomZi8lFyahBLpV0e*c33XEGR|-7Wcy}*mxnfY8zulNbMu5MMZpS3e9UeJ2m zx1=sxPT&j3Rf`H(BCN~6PE(EGp4RVWty|Uy75}6%o3X*( z9u$KQi{77(M@vdzdd{N^jo`y&)ghl_M51XiT2$;f0|cUFec#JI<^w}R(y8I%vngOi z4$6hqUR}RRCre5!8-gkFJe^MSY`Ub>>G*naWBb``aK#0}_dNL*QiO3&;jp0LG7ap2 z$|>eNyGlRi=55r_ILtsiEaA3>cNE}d3K}6PHRr{Q3hE)Tx{ay$NWwOBaFes{#hC!~ zykVIi1pYNEaGE>Zr5p7Pr$Gx2`X6q5YHp2lgbP%dYfOpGsU_U)1f!9_0W8;5W6CWb zsDHt5a*6{4e>qlZICUCmzznCtawcWAvkqVhq>(f;ACqB&MxdhbYxV;{mq5ckT}~mq zLnjB|0abaSg1=(&$MlXAAQaWa+PTG${rnxO!`C84aSx{-b{kl~If*U;hLIPQ^<|4g zntHV?vWeF!^Z47>aQm}QP%AkfrG^(`USK@b*tV>+kDM|XD(pt(3gBEdVjqxy1*wfe z%|Y7Gf~)xw9h_XHq%nd#+xGJf9spl<>X_W1Mgvb39g^I}tg=RJrnCEc29BoF*Ybo{ zjw5YastI@QxER~zA@pJ1*BlsPe#>sN!F)!^NK!WFqrwF|G^r|7Ef>|p#^V&7@hXNJ z;J;}ubcz6CF8txrhUFcnxGgc>*d()7!zdOsPb1I~znwMTZX6W)!H8OmUE(%mNY3TV zH!v^!ywh2v1W+dF3FcD5FbW${TIGr!H1AjVBDSLPPSfKyPw9Yk*s+G5iG>W@Aq02^ znl}@VVQ&}Z63&kTG;6Zi76qAzKfK_13-vYG&(ggM=$nlXT4?kw^ zhF8}<5bx5i(d%yi>=i(s@P2Hfqjg9!@Cp;r3;KAM%|a2(S^*$G?@E^sUs^S*84Cel ziOO1g0w0b}r+NU;#1O}T(JM--7G;`H%2LK*8?k{5)bZ&Q*BB-UB5sSa%t79P1t|@~*o@Q61s0SD6QFhycM8|*-kQqXmOs4Z8hc1sY2>L~}c2;8U(zLYIq)ET~ zrhC+YZ1m)do&bB8nsMKiq}(s(=inn~&h`yh0z^4U->HE%MbjIdqw3zLYA}VTP>}oe zo6M<^1x9P3H763Zgr6&SbA6Zk8ME;8*t3|^F@Y;84M~s#(U?khCsTY~msZ#*kM9hUoO zIY*N~lxe8XHS-lwUGTFoQtT!jeaNO?T;G~RitWrVA&h_P`?dcYDfVxU6pMw4ab`7+ z>Vo0Gf(k=zF3b|T2#zEi*+uvUUy@%&zx=VB4M+KT`|4Tb%@mwG=nZiv(QGqsd;Pt` zxBI94U12renjWLnoZU_!a|Z^ZabS(LxQnaXTeF0KN<;YWOeS$)jQ5k7xfxno87dlK zcBl$SklA>PyWgBx`lTh+KcM`XaE9#@^NV$FGrxDR$kPO$C-lVp!*(L`n`h>K>MjT- z70_bW3>f=i+vh3{r-mXuzw_Jx9A^64qusNe^I|&t!dhRa(^(Dz)z{Zssgokamshx^ z#Bju@p4}A4EKKGYP?0)Pd7ceY zkn_=$E?5Q#83n;xQqlQceI*FD|BMV>cAq6K}!Cy_&~QRtR{MF z6%hVnW1z;E=g4~dyDD1jbT-V&0kj4lV}LKXf&8?o6?H)D4A$g<$;*VFkpv&x-4;?enAB9u5{oMAIlp!WlP(+yWq{gGZ$ zhDGiS_8)kD=nhsDbOX1G-wnF`WD+4t^>lobvj}EpZ16!MU!y;~CU!Mu#bje-j@*cP z2lcj>ETKv=YJPRy1Znjg{EFPHVx@Ey4*gY8)1dDSi%-?-AN2ZNdyn9WtK1;))cgtm z34Db?*a3N_fn{E%r%KdQPQNy6OFM;F=Z*RqH^g;+J{~l+R|md@$=3C{*FNx& zM&+z;=C)TJXCuSsH2($tQ=o4!T~u*p>dboBCTpiJ@OV+P$;;{c*aR&{*c0#LMJ>Y} zWjM>RlI8=Z((BbKGZgkT;1I)3-nHRsUE0Sg+AaMXL&6O2+Iore?aEX~WNdu?Q}w7& z$>d3;aq+J}l*pjfCf(uysi3cZ!-*kxJ^_Wn+*CDUK_f*H3=%r3c}ma(jh6`3-VTWl z6E~OZk6wx`ScGgH+y1twfuWtyxt0gQp3h_(Zkg1^(JN&XBn)oyI?Qwt>)-NkBi zKw;pwa8~Q~#^=TBzDOK0hrSr(XxzgK`nY@0-91q_7LzvI#cRxo=8g^Hl8PHkCd3>V ziMfI7G04A7{)U#0*4N$Wcvl8Bam+gcPv9+F&d<$CPjliJL}}yhVzWE+kXP6UM2g}& zp5EDwu$0EY>MSBJi`UnD{T9>^U+{Ic{TGHsnLNMy>K?pIKN_a&Pjx{A%dhRiL4KXr zOyMdLe{Bxhor9C^5oe$kuiV$5y)X+*|5a=ZJ#oAUmoRnr`e#So{?02?>+`?CX4PRf zsA9Fqb6^q=2f-O=K#2&zCu4K`iqS{#_u*R50qgp_Fk)&WYa0P2<-DYL6oy4cmWAvV zHyS9mlN-_>;GlEy-xiu8=7HKv2lib)-pek=_A2*0_=Tw03ugt|Vl_j^4p(Ul0|fI~ zW}pxFdjII~6+jNKTwOzhLIPCcK}GQ?N`ts)K7+>ulcCz-j@${u4mxi`o>c!X=2H|9 zQFO|c^ppq*!jadJp{J{op?yQ+mXV?3>42}NW0loYT~J)Wzn{Pkc}$!-r~*_DEO_eQ zTILBDIHm)8Z{d@rSC`yS++TB67BPcfVUJ0w^)D;d#@WeGM_Var0K^l4`0PBX4iBOk7y>rAaY2TbvFIxS-@? zA_1?bc`>zqQ$6ra7DFo_dy-br4=Xq%vc?FQ&o zR8CH5!qM0-XaWsRKoQW?W$5sEVMtNXBz_cj18Fsu9v9;cm=B>9`O;SDyXa1N@E~Af zteODLMW(UoH6?`{B3UmTz0vmx&omn_0-iYV4rbzFuMxsV9!FM|eZid8gH>Vd{p*4* zzmDTt%5C|X`n-gm{w#6{tAOxFvhc%U5mjLXbKxk*7b-B~Y^JKtT7%;^L0Hm7=GF54 zizj1S0rA!qsScOwo$%d(gaXA&4rrQK0El|Vzz{JohO*-y83gyTi8&bPq?bW(ExMfB z%h&?hf%cI;#iC%?x6WK#c7;vH%}F;F>^{DbVlL_pd5La4GJ$F|4<9a=h6R2*s)u{o zzqN-O8#+%8o zmf%Bjyi584JfUVzqi=}cYcPsj8*Z4K2X12hu~y3ZP6?X|Zv*O&8U)no8n&@4;O5}~ z&Wrg--P}-xY(Keol__+|j)X2j2l_=Zu?yWVW|(Y~6)pVdc1^H^Ep5v!K7n7b-1sKs zyh-5x`XSRi*AH5D_rG}9-j6sre1$^-{48{GAUQ7kl1iga4nM5@Unhruvy;QxpY?O# zn~9g4GI)dIS$>h5!D65{%e(ybwKy9>=yg7rk5Y7$Ah{l+%AYsj6Kl%A==f#UNP_LZy z4*Nun?JNpBDTIkJ=gEwXxH@{iOs$VuH}w55mLr<+q~)1pP?KLH9M=~XB9jretdKo zJQ`nqY=fpz{rm`vfPFkZQLQY{}TdiA^~nNDsS*2M2Hmf?X(` zLCz`UJ+1*RrJOtYI4lP>L60$h%xqx=Dy^us+|TL5^Hwr=$P(vlD>*#c>mDV~e@V7% z&Eo>hyCQBLTlWJ5d@!?c%}!8XRDHv|YSuJ?4miicDma&Fa%TWd1voSy(k|NI3H4OU z^X$_iA!-0+=eD+c3;*MmmVIUr&6utB6i`Hw(hx{JORn+eGy^AWZ1z5vX80aprWEz6 zS~1A#h5ELA5(?#m;|aAW>@-YGbe>s4joW7C&0Kn2%*RzEHNJOtpyv>ji!%=xII_Uy=cVNTF}Y35_I-KM(P0JgE^nzn?*tL{Yh zBEzeACsnY6gU)$jRFrX%Yg>PDba?uD9rUp4xMS(pbsf$mldOB;poo-K4fXEmADEtJ z7&~Y7BLmPP>ElrynynGQo1WB>m&#bUj=lLL1bRi7LkLKO`n?!1$QTi6P|)->)(pYG zTHF%TCB`3wUw`!0iqQtKwN4_h(%+!u`!=rKQ&krhv>E`)@r@f%l6=FMoEsT@ZXPr! z^{e?*1IIy8l{FO8xxu>rw)y^E=bIPbB+VKoz2wiH)PVM)(`18+$!sc1>_8KZMevq>?TkI)js^o9{VnxZ6j zy44XdQBv25+^BB&Oi?N63?5m5LDU)5fX$c2q%xkEy>mc4pv_?B*LDFRjG=W46Lk(@ z*BI?_PS+>o1K`T=N=*s!kdN04yT{&o!y<_O<7S&YHZqmL(2lcN#F2wmsp+vHYFV)N z%Dsu_lfS2Z!~74ka%zJv@USsl{~Nf;C~Lew^ImRUIf@M~Bw-~D=eYHU=lA932M!mt zKI&`NuJ_TlB7prRY zhRh@2Lq9_*)ZpY1ET9qR7^n)Yi61(fPm>QnQW^oHioxW|jxYrWm;Nkht}zkPV$ z=2%s1(9`6{)4*w*)?;^rW6)0N^KWuXwklFMPKFf^@~JNhpp{KnsCN3B>ErPv9k*oN zkcU~{+d0{JzH{7dqrXAhTs)_*`s*k&BR&K=_hyy}#VSzQ;SlCTcDzn!gDdX+r#;9- zdIISl+5Uu!nGnDxQa@M3zDI>C?hCf*09XfdsU;HWHKd^ctYGRuediKg-YY2Fg{5g& zHf(`+R4e4wfT67LZp4P)V&V*XFyV{rrH__&vQqL zf9gt%F6`AY>{SLb!h*kz-y`jnKMW7j{^n^ihW#sur>2h>Bk4AAA9pct3S5mb;yM5E z2mFQAIDjPGxzDzPfbaTn>(BKIvT-iz814|)GxO&cb`4vB-R11O&5@o_GI(=s5r#Z;Jcu^k z`$xI=>Y(Y}t5xD^pVd{dhgIN`dLW(A&cBLueo6hWT>U!3XXb^fUd~e^Kh83W(FD*> zYp5p<8MThU8yaaMAxXdxoYMM1Cziq}VUzy3-KiGM3_M+SG9+|Q3;U-zL_GcF`AeD?w zC7sUmSH~M$!b~kFWD`GI2V(pF8NUC?kh_EDy_4hQN%Csv_-FHLLzil9Yy}(6wKlHp z$JlEeVJ@h-CN2Yh<#nvl;6-k3HGlkZ9PGgtbXyBAhpD=J86R1JckN%=zXC(X|M?x% zKEJk-QBizI<`dEaro@2>4*?P)=pe|pLs=_P1u4E?aI>S-V4 z#(o+g_yX~NhYmm2lTmJVZaZk2j*@PgbVQtXi9@)pBA@Wo&PljP zuEnQ^t}sQx$j{E$^H)P2)!}uRKTt1WXV;H?`NBH9oOWiHNn$y%@{AQklHFBk$Xb85 z0Bk^$zuuHAK%@sITq>vyuY>C>Wn3bA=t}Rv@;UvrP2EjD8W|DWmWI~Q%@os=VGc?< zM4xB}Eb1xkLh9x(wwq8L^^_~cZsy3z+su{ljM#i`M>kedVAIiHC95mkS)E_4!8fCn;$)f)F>yNU&8a!EM{SOqgK zocf3kIz4ZNb>V8MN@(&I)gtQlphrTo@dKYp?eA(pe_ASjDJf6IR&CcZ)W1r7!k^b~o^J)4^{NJ;xVYWI3c#X3=3eq0+wIFtJTx^g!37hdbwoXD!HmgtHyxEB~+b^gs+Ynj@ zM}nn8(zNB6@t#C`A<-z86md`(8MK@f827$Lh6ntXu2Pth3vh>TC9(t2W--msiv(wi zy`bz0T@hG%&Mpg0A`~%yp0H3 z5v>Ag9F^SD2ud|vjeoc=n!auTj$%II)R_b{ZfVv(=4Ka=^HV-9bF&S0Uv_tY_Fyr< zX^LtB^A`9)0h+W~8gu?!P>(5G^6X*CX;f6VSdkqH>?##L1?yqK#65cg1N+wl)rDA>W=YJ zk4H_50xj}I%ly);WLR*NQ+>h@pQ>_R4k;H&qa$kaPKU=4(deziiC9N{X4r{u*$wR6 zoKbV;f$v4vU7N-o50jl=3rapklru|(QTQ&vw{bqhV~z31hWZfELq{NpvGIs3 zP2{V#BljB@w_>802kZwVZXXRA<7H4Z8f3` zQyyKxW#*=wwNf0q#X2c}vrkwr1vX1m*nA?D{HEUWx-ct#Hp3%PjV5dOk2aneE>uX^ z@%~xg5W#E+ffLPp;W+^|;VQ4B?4Su(Lz0^HO1K&Q9gh3&zPp5Z;7yuzziKME?|dnK ze^1(R(Zj>B3X_H;uvsXeAb3ctupPd!T$~L__ul$ygpT3SgAz19TmEC6C`A7bLxd05 zc0jhd5P(8|qKqZ9>U>o1b>tv><6l}8OhWjDCy61Mb*3J)$|gSre?QTiRFB+pRa{fB zfumGg%F?PQ1LMcJQBo2hK7uBz-d9RS+{cuf-sf3oJ%Au)2o6uKYsGZy_L z`s^d@rl=x8Tio9{IX&7rNd9)%>nG&+iEf8sMcTyAUZmxRe4?6e`=5O4{R#7f_s&+8 z#Q34KzXSUW7LxnP-%ie?d$DuvzOH%>2rXsD0i5aDNQMGT;%3sd%*_=fK zBaP)lz<5R?x3SfJIDLKGJvyN%Od=6C8O6>b5;bRhvRYA*+^x^|osqop z;|C8ousVgjk8K3NEk;B0%ghi7NNZs2n%1}6NJocL`I_qDI)F4`qzF{N>fB^Lf#vjk z+xYV3ta+ati$DfE~jIdIkSsvT<~ zx40wR%ScDes&hxGQeDuE%`fhTJq`rgft0ekim*Lmi%h#+t#PO@=C`%XM) z;%)TYlbBe9TFwM10vDre!uRXj5oJ7JnPRLH`E@JqDM!ZX-_Jl%Qb@4$>#MWMc+jkD zED$$Vx>a3+&pK|ns`I__2zUaTZ+QMDN3?l*ihOV-X=U%#>nF+4#&=tfw;pdi+Wyb2 zO`lbWbiUdjHT!{}LQKxmgJ+jUZ`)31JDg0X{G)kq0NWGff{Y3ll|`vAK>lX-3ONQO zIA!otqmlQQx|-86!UhGz1G4#D?m@EYhtbZ34Ig!1^o~!uM`5|;-n(8`^%mq@u#2gL zEC0_Gu2Hu}xN$0H%FauAae=lvo9tm{fB%d*+sN$3wojz;a05Ns3b#+B%yzYmTuJ6; zL)WN3AS*4NOjG)&Wb^ide}IW@H0F=C(Xj@KG{YH>ZH|9+KMgDJr~4TbAQl{r$_YbZ zqPmmAea!pi>GJzL);C`S(RbXR;)d;Y`0WGXPG4u!t8`L&o(HLll4Qfo(c#0gk%l-XUvMx8)953STSB?=qlFKb;j-l`_jJ{lvovjuaKSE(*DYlZiKIv zpW4siJhInCKAunxSnZ(lYtjIrgZ)&{zGu;Tc-DWl(gGSy$PbJn>d0ud0WM}3Tqn*l zSC}WgY!Su<#hbRg9OpL#Sw}(+A~&P4oUOWVUv`hW3c1aXB!X1q>3H~r>yj$r$3>bZ zJIBc_N17u2r#f$c++qgUeb}S4Er8+Ao(e4pZ9?n=a%bRxdmR+yc^;)RsS75x41@BF z05-i#8tbN8>oP>1m8SM!$*-@oAz1uIcQ#V0U(7P+jN@Z`1J_KWmIU=$pk#;mLi{j$03C|%#D5ec3 zD0jVvd8t$zu!F(r5sWh>VxFb5oaX?bzuL)5AVw|N(Ro?U!Clyt9g~rm25OQ2&ql>% zqlpKBU@E|_oK9p;8E~c|ZO0@g!UnzP(>P6@Sd;FP8)u`iypU&{a4x~{)YDV1YO`Ra z`A+EteE$Bv?E)m|hxiFqfC4T$9B={uxC_Y9+cWUmAAp8@r*x8oEm_eJNieN?9AJ8* zYa**N>JhyoA1W~LCB?`TR4G^ujQw3j#p;Rjw!nR}0d{~I?p$6rx#JbT3yOyYCiL>M zVh<8Wb1;p+DqUde`gLA1%|(I^8J#TL$6rb?+U|r5Z9T4Z)gDpbO8}|X)xw<|A2gH{ z{Pq6sy$<^f>94zR!{U=Dk> z*|Z5}&HL#buTyM!-w$ERIZKB6&^W>O?Plo72#yLH-r2R!)GZJGZztVlp z0a~#1Q*iLHVW{J8W-iLmbKE50D!$GiP?}Y|oX43suM*56GPCJTdS}6@DD)fZqsRq{ z3I_)xgyUFaRtTZG$USIWC~*X`K}wJV0TId45#A{gv!m>S>fo43m}!iu#WsiJ{dH$I z)|ztXVt)^Jx62_3?iRkktaVxH1B?K_sda0asGDA=qs&Nec5`K>pN+z%FAQ{=C_AMs=F=IfNXm1-6jxJ4^>uA!0 z6rD*~VDcz)p_*-&7`9nF{$|pBg09UjF2GMkeEY5lO;Aq_IhTEJ;dNS^ut8JR%2}htb*w`3g$8Ps6A$k|nIk?|Req(gG2H-bW&170!PE#Yp zOwB1gDG^5Def?lHUB<=S5c1;!7tkygQVsC&bJYY4zU{JT zN;I3#;`!U1qrQ=GWLqc6dNc-=N!*jlN=OrHbIgVjXYJAN8OS&05YXpUlidc%|A zWIE6GAwOqB@=pA7X+@v)1;qqV0#vdo5nW4B+Q^$c+wx1mKajkwm{KhW*u;VG=8G<8 zg@!;A^BDOn&%;8xHalB{AOl|JNi?yZf=NjJ`lj3_2fyiZev_D*;{v%T6yg* zU((P??zuHtB&D^}!cQQs5C!aH*SF2dGm#hj%L zYc}69?;@_^Dm;=5)vV*uVU4KA;JbOqw)1H=FkH+UlTh%fNe4ERzy|684ueGOo>S0f z+q&d$B8AMD*)gxp6S^x1t%{3n5xfJu-@@RpA;8T5k%C?N+&upNkz<)M$>d<3PKT%l zp_~CF;BJqdM#U)zgcUit^23YSlwV9{`E~w@$hE}n08U{t1oX6P1QGm6_hVg1O1-^fteqUk9OzIx3E)Cusn@;w&G0Firn<{-4{~ zci9iwV0$n;Pt&dUO+AUYp)Mt|S zOuP1U&6mucXvTM|!tH|azo~iL1;Hm|iL21Qo%!tQC`*S*4kn-_B1SFWOWLDdf_DbQNZ~9O4wx9*l=0%pR+Fr#s3e3d;9|-EZK1gMa|y(b?Z72N)^thsgmgrLW@g&EHnzo2j_R*&BA&76*4! zbIW5hR1`>o?Z4{JF=1{v(vSK*&=(l-_bNABgg_g_gQmZQJUvh^MJa;T%uRVQc3o)x zv)yig=84;>aDIRlh6q4(!;f&jGuVBe6i`IhYm|09sk%-t}Yz5%{$s_;riS*W=1j>{L9y$`AZi=CXB> z?JF#j4QBV+>jAA?S8DUbp(KSFLxgZZr9>HRbExc-OrDzZ-7u{s>}VqmCpHU;SU)twy8Y z^xRM0alov9JgEIH=mewW#dPix`3f?yoXOu z_J6?bBC9(!B3oNwV@;pIh=O(n<;jey*_b}qdh~dE>#u*^{-M3ue5#?w{PZ$jl7LEX zH;2?oa2u4#(M+BA%4oP93;FH>g$9J02324*z4bit(mXh{lua+MIw5nUQ*&uSrb0oO z$210}fo)1vjycQavCbgx4HaQ$Q2S3r5%oQ!WgZf7Mx*2$?~Dt&+Uy-7W*s2p7S|re zSWQGh*z06TStBKWfSVrfKsJV=U^>et%d;kg*9 zRWa3t4MSWxOCq8UiN5^NI#;>~!ytWVd6OFcAGnyaVRewp$TAgAd=b&Us$y*fBYY7XV)(^1kmK4o?Os?vo_)BYw6IfFE!mMb<^X~om6w4VZ1GhBh~=~1L+AlEpsVN^ARH7 zK^ms<2ExWmCHgD6fDnq^+#$m`T~*LWLl(dZ6#Ydc9Y^%s_4b~4fA1ZhxN{hScrln~ z+e!Zp6RP-mt<%`0Peyon%)0qeEkoc@-MIvib ziEOYm*RRNIE#KveYQmYXE*kb$)`%+#7D*3BN(AHiT-`af?WujlwN=Y3_Yzy?Bc>h1 z++WU^@rCvH00^!^YgqB;LH^5 zHAh3G*wO7!F=c&F&&{+LU!INU*Jq}o($%Eu!6M3NSkt4tJTuZo6}L^*#OaYMGDt8q zNKz2_@umeRb~>05;+4Oet~OtRGz>HQAoi~QQsEm>7P$*Z36xz_LGgNHys+p7I|tvx z*;Q;j^B+LBU?!#8-)%VbL4=75fd^3u!Fi3`Y?SH8Y=}<0M5Q~?xEpb8PX0)=&u=rX z(R$nK?;XB{4bBZw20akrax_WwN_qmbAf6{b`8hvew}vh;DT- zj4wkqg!#lVs<2MB$iC^gWG7NH4l1o-D>1~uOtZdaDDP2r5k%&FNu?Xxm0D}-O~RAA zwcu*19L`9evA|b95F<5x5=8jt@dWz z%iI0#(c?$oZ#>@o&%Zue(5{=>u)1)jrP&bv2JVAXaD05?CbbEgigOk0L~~^XFk1j0 zLXCBBI+m5h6OZr#ziqznbiSE?V~F|>kAC>!`^_H=Ip5m;?uYIF+}ify5kBi06GeSu z_sY)c$;-o|-mg2DZc)nWy^Og)=CdnDTEU$J4FHy>Q*;RG0XG2E_10#E#z2MlI?|D! zV~7Y)q$5Sl;{LKS!2o~68E1kvbaW_De6sfBt+!0pktK2C_&VZHQOl4OMi+=XhK5yr z_HXXGJE5U3h26vc@ySmA`&{GsFQH9IwegJdx!BQJbT*_0vBr3}t|{65ta6a`}<_mGA6w=7i^ zA%y+kz`Y+*w1{JYxp5&8qMccc>z$f8FRmeHB4ls{i-bP`ux{UCNNlhqFt^`~i<@s+ z(Pe|m{hH|ToqaU?Jg`_z4LQr}i;&vbm;+M=ov&XJApw(V*DPgd83k|C`7~#=d|ZBo zxnHfSf}?9HF!Ov2$$<^$gRu=X#@9tTGja`h$D1wT*F;|ZdAR&5X;v02(kf)fSF$Jr zYfRr#s~Z6k!?5ia;I4Nc0UFH4QqPP$1E}@DDP82~9sC3NeR|_n$+0^T)e~11Quk^> zfEdM0O$!)OF7vhL2lUHF{hb5tWJMSV7P|t#PCLO{B^zu!yWX>|TYJyZ{i+8}dxjs! zlU*Bui{d2}+%UUx1B1sD9R%R#yi7UQwP6(iKiz>T^PYo^2&ljrhyPD7(<1qm@Wvy+ zR_rlkAD#LY02SmZIq4ps?4BGQ*lDqs^D!zDH^2fqEk=yk=+`5j)P^b=1_{H6XmD;! zVYohotP$XCFx!z9!BYqBY~G3fmgl$tDSe+GUC3u#l)x*|4om2 z5HJNs*Ud%WR6kHpj*%yDe~a+yDvSu&s=U`L&{0I!BV_ObBD(&U_Jb1SzVt3p*9-;I z1+mT$?+Y4$Pd$Bi`0?s7w$6o@1dTUXeviPb1Oe<``V5abQEIND{GlhVrp=Hq9s}P*xafJZHrs&<9eJiUMckb zFQp21$L#_jd5{4ewu4qq)oy`AD@;AMyh6EF-xDiscpbuDRmIA1{sjZ^<;cHTn~rB6ae=0F~$}HbF9EN zcnZQQzK%r41Z3XnA-ne0zZFW|S+`oz^Hv5j<>A!-f`J5r2HMGU5Xh>v`IS-XHB})x zRafe&gCUJ9eG;(ao#cNv)OC=U`vY&47N`*p696`|S1TFUH zr3k$!S%~)f;Ohpp6KAy8c0JB?^z486aaugK^! zqVKELeb+laIerpkW>(H*R3Pz<>elm3`JvQR(Ca7O-Lsk%Ufq4*d~t-T6dMY=qLZ1Q z<7`>+AbZ-<+W%Wz*f?)wo<;Sls|Tw1o=2*AAbT|H6%uIS?qWHbWGS9?#-wZYcm;TN zuVV|XYOsHkPAe@&FELxN-aX6nzSW!d&CXE|q_*hRUA~FFXbXMO2Ktiiv(o07q*HS} zgF8}n^L+i*sh!x~@sr^1zV?LG-m89?_3?)sP~;(%IR*I_(+>jsDo*IXHHInIZ6NN3OxL;@(nuWkqogpm>ii zas|c670?`q;VbSehHi}*xisi>Y;3-ZV2U6HMx0S$G}z~8dI`3J$R7(BIaANcOZ{H; zVz)L?m%cp70yUk>)cM=#dH3XPx7!cytH1ky_q+bz2f_Vz5WIg8ynms{0Nym<^w~1> zOZ&j;geGW10W-&7KSkq30KO1|B=y*tF+1eez)6On9=3h&QsuePD>#lEtZK#V6e_te zf;)joHzB4{KYb^$FKr^?Dplhl7ET+s6tID-H6I)ponUE9i^288AqITr=kGPwyH~2; zU8U5)$x5YGs_Vr{b-h@ru3imVL0GDPxKg8bXI40kFG51~Z*hU~^Z*X5Sre3GsF1HY zqTnU!sO6J@K-rj1hEzuEB=nDl;Bgm+&2j$(c5Z6F3sJjW)O;%N5wuF#XLN77Y61A&khJMRZVVMK|xJC}7p1M58C5KQ#hj)%Q#+*MMJV*rW zC!oLwUfaCmh`>%gvfzLi7E47CdECwog*8{^rzN=fD%moks#EZ+1itcqP^oDd zOdZ$qity@c!cccg3p^ir|$GtBJ(7b{{t}Y0{^?$hK6R3bB zZF=N{j%O_@5}i^$!sE+PW=R8+5l0>fChvNJ8H9 zk$dF2jEJsomztSPF9DKnrpYgZOh`EH2qKgK83n3{kYf&&r+gaNWg&l-)=-T|^U{(X zxbgux;7Kldm@&rF$!+3>67CruRK772&`74~s&5LQZj11a6-0AOVJ_4D0ziyX7NVp? z_cZHN3cGQGT@Zs5&j$G2*wI7hc_^8n0k|HnJ$Rt0t0JwIK-$?O2nh=-R1605X<0)O zS@nHlw#`Xl736=KLTVd?`K6WE5SDP!$vCHzPDtGK0-9+9#V^cg{JsBW#4?i6+cqFu zmp7o=)cB#+v5yBf7)wLp!0fmbEM^cIHxOXZR3z4(g!Y(^$C(NZB4IR)N8+VMC=x_# zE9d7Js6L!eWfA5-kgoK2KA8Z7Dt&njj~r+?uw{TL4)h8*Ho8HC@z)TuWskPCq0+77 ze(q9?x~vyrO71l;j!rQ9EH&^~&JoQu)~{Y?*JipK_c30kh0(ypMPodm%ueG$+hIFc zSO<8jV(V>>062kOyR;lOH3YvA-A+dvB>%AKK%^9b(4qswP^WhsVo0!_@}v{a@6)vf z*0joEuxSx>5x#B-Rs{B1NwYKQHmN(|_ud9r6Fr4fPHf5|olNf>E%z2jU1mbyy(@D~ zJYXv~%aLV6w>C)S&d#pX zsG^NRRziUz1Ko|0TkKqf#SqlJT3G^jySYs_ii?dY`YSUUasb^WBzitOyf}h#D67>F zXGIwq1cr$aUi!qGSufOuTv*7oGJoNbWA@Gmc|^F*1>$5%V1V=SH4H09ajdR7uA{WTc1SnKZy)8) zEl@ue^UEt!@ufOUbV}+gR)QDKiNzrw#yC?grr{KMbFzl07MJ-Lfao2M;&?aAe^8~ya&td5UecM?ADwS21~O{ zHN4+051Dzudcsm={LCsu@B&K(7#MJXK7pt(fedGjv#2M>=jMENjk_H@wKuh9vxLeN z)9j?!E9hQb!vs-ShsPks&vLd92lkYDGs-`E(8I5Lcq^WH+$ z*6HJB1zbMkJKpa3I3y6FpX0va4fZ*>IQ>59tJA&0D{=_>C+2RT5;rg4(;#oevBJK5 zJl z`Lec#Nv>P+RYBZaj}i0D5j9+k-Oj{Ow1Cxe+}XGix~(@e{nSOV(~SBmzA*0=^T+;x zV)1T$P^h+!Zx|stIn7JK17wN|^+*|D3Iyq~tOG!^Jg4hx5q@ zwHQnR{kmLFT1ueABnAjth*Tk;wInChm@?~3B}<~M2onA9Rfued8lqKZu!^L@wD>h0 zI^bJusg!slaIq<`I46W1SLO>0x=Vmq3>f%BzlESVNN8|jr)@f?i&>|$949;I{d)p# z1dJ^NGv-&s`-Jcp-Q>Za>0k!yqbHkm)piiU9GG*~qLf{BOX%6aM3)1=j=PwTT84K> zx!t;{Nbwt39m8*7jlvCJ!iX7bD}@(GZO?II`E|iAYlmT{q%Q#G6ujr!1C;oX5p}s1 zyt#t(449yyL>?%V+qGy2=indne2ToEpMrgb1av_AP#pKX=Blw7TuvuYm`^x+f*+t* zO%-^rY9)?3(m@*`jD$yI;z~2^>54k9Nkcx~}oA1#jxg z7FX}lZ7#c6ve|jmW?yBP6H?dkG`4dSE^DnjvI4<&7S2jaGjdq?QKFjmiY{rKGrmqL z?fNBRlc0XDOOoPyq0yAg+qdnUk0l+|#=MfOUAdGh&Pu!Q`%B=93%ZWawG6B{{;tk{ z`yzwo!9C`r9+!I>oZd(dKp%=`-N#3D0x_{494Pa0{M3jrY|m|VBhcCcv>6&bQdHid-}5(#!TM;g66 z<-T3qb!5#V(JJc=j6wnbL+8NpxCQwXoxMiD_ko&{JPrUg&J+%TOrNr8;S{X!7o)hT z>aFA-BxymUFi)9`bMRtX%qRb5EkMiGw2BrWv;+Bazp^PU+G>Qe!5F?~8^jf!(yh3@ z(^o+##X?2?k18S-38@h!!vdd~c&vb@l=$z_K#)e2)eo#6thEBtTf?Fvukua?A>xo+r`e-csuAB+aRXm-+8a^74iKuAs3k>hXAVC%1gl5eq0eTqPD2a0=cAvRe^jzY+ z^=RZw(uv{ZCes`hiXOL2_+RH_qC?MByckV=jl;uNTqBxWZwJ`~w2jRL9#M)JjwZf} zX1=OBgvcv%=QbE~aUcm)k1^iK(oyxWRtge1EU=&5LgoPrcA=1`h> zA*R#pkr9CDCMiH52{qWbTjuZS2a+7z&Y)eEGW3~NYx_cq;?e>Myum0% zIiQ{2>zW-n(*ems@f^J%g1oo-0{YA6 zG8yO_9=;CVJG#+NGQM%5`2U`71%j{gD~##ySgQoVMee_s-3vEW!%ZDW>! z5#5mzh>2D4T!pLh5DEb>dEg5;166N1Fw#qkdAOpS9km_LLuc8uNESMCnzLzt_o*1p z@G-OPsIX*>6!)>>9bV$McAr%xx8PgKkRje#j^R+*F(x97u+v(}-M7q2_3I!fhI~ov ziqnr88hepW7jsLC*rYtdAT4ve=Uw8miI@csd03x`2J;cP;XQQ?SkFAreb8+B5ju6w z_fkWx2flWQpIDzD&X#Fr-h!L#pB;&`#H1yf(jAyM-c!*mhK|GYQxZmf&eqs%WqOU# zkDlVxOtCp6awnd1V9b!65z%!KUR6gV#hFHeR6C+I+ z4C9VH1h}TLC#BX3h+)^D4)D=UshSD8l}TQ)=-^Dh-jWQQLRjErl8sAnwwSGH=8L|0 zJvC>)nG6dd92j-w^7|2@w;OVO6`aBBWAPzN&I`kb#V4Lp3xwgB)(zJP{h*=)QfS@X z3GOo7SY2KbeQ#C!Wyx&I?l4~~Uy06LB`R0#TGS6^CAUQ;C|)P?@&=u%HBNuK<>)!sWQJLLZUarZ&xoB;vOkKY(C7Yz@`%%+)0Kw$NXbvuEA-@Ljt{bs7?B)X)g^uL_e;%J|C;;%zZV1 z`TK|quX15-_>UHoF(;o?@*-=_<&`Pb-JoRn5F+o+E>Xx1eQEFed~2 z9<9*RBw}QtbkcDtpD=9;Jyu|E$V<=1oZq^b8F|SmgROXlnryE#j^)?#5*nZmu>P1+C-JsdZ;VcZ_ZOf>8h z7A~vP7-A_WOZpcMoAXH}AgoF--vQr(CqLezx8Hp4?qys~6rAa+=4~U2e`iTxboCen z89w>Z$I_`;?M~7l=r-rw__;#S5DS^@o4EQ$)!b>X@EPQpcG0X!-n(GKXSQ*{+qM+z;5EKiq_K5KX#JuZzq z%%kxcp=rjfU<`2C@9hS1M?ld`X)Eo@0%+mMh%1)2boJ7;Hn!?Z!YELL&0C#%#(767 z^f+f0$$51|KzB@ryoW3R-V8YeP~zL=3X=|KK+;afv>$;dt@7=*lZoHneO;Y6u4pgL zy46F}=$0^QPB-p<*x5rFrZ)Sy*J3=&ynhq$Zu&vB}F6uOLjLAQQLTx3f|= znPbVv-ZXB=RK~qs58XB^{JITdWK88ez`VBOKh$g!MggJ%Nfc+;DZe zI%bYRARq;Pb(7m~-@fb~S%>jPHXF2?n03iYQ~H~8n}9q8U#KWO;1W{MY!={d0BGe2 zomu|^RR(np3PaqvqmCOHZ~}A{0|W+mJ9vJn`7D0?{Iddh=%;2YLW)?#891Flxu!mf z@P!Xq;D@Z~8VQE;RJ~nI>Z1)>PXkx0{S&{qy^BtCe*-I9S~V-n$7tJ#N#SU@Z3Vo*$Sm!vS}0xp$> zf#wQRNqJ=i7EG}D-28imdS96K#qV07+{)at6<(9(G``G+EE0g$tf;!Pm3q3P-^zX} ztKTY+Dyaphti`$#rQ3C^7A3S$uPn-4aiMpk-Nz9+@bPgHFL?9y& zN(_=%g73-)pp(r)s(}H_XJPYR2(}~V##bqjQe(~a3EEyzjbc$9HDR0(T6g?ADvAz z%5QC5xjoG_`e0*{c5!g$vc6wp8NEh^93P0miLh_k)!)ipb9ALf?jQr;15q=Bnkkk+ zj4huWX-ETfzQ%q()i7>AMOjc_(6|_yCk@~h=jSl^(&B|-K&D~XlXvZ3+P{J~GXLjy z(7yaia97+c{=9pVB+e}x&+Cw#I@;iHVqULbn~RY=n*qNRezTwB&&=XN& z*h&pMCnr0*FE`BJwr<^rU#fkec|b_8{iDNI?xH`O($kqC7nfPk5d|tC`4LEJUN1&N z8o@ZbS@# z&%5j-XJ(4x$WLGOb;*eluc_o~5aevE!wGhc4a2Z2%!=#pa`p#L6fmd7w8ia_0P3kE zWS_RSZ`~I3VI0Iqw z4iDEapi{iaZ<~zR27Uh30?aru;EDr(!TK){C&wyCDA3O1dV4s;zlK3Ar6mgh@U&G`DzQY%EglaGq8Rs&^Vv5SZdo zMAjd)oTLLUPRHjI+dddF{73%??xzV|hWBe|FQZi+#DNix$NYm0337Lc|VNi#gBW zXu)j@d)G!MP06Ncgf5wzS3B>{y6;{eo$YmBpS*mwsk&>1`ZB}lw1+m5n4gFrsdi%r z5Es z`whdurul@#PwMrDocc$SCR>415i-mbiDIf19nAbxO^)m>?i7kPL!E>Nt1ZAaKgZ?5~3#;E+cn<_+7`cs3gm7teUY zmirhC0v>Qr;Hbt`{rBCTk?;w1r7GXUYEoXL=nI1u^%0|3K?tuMqi?$S3Aq$gph{W8 z5M@admyWHA2bBf*Ehtuk!p;l^HJYd^DLrMym;I~*z{@&{`d?YYhWgM+wK?x)RO_^|+jW>NEWEQQ;Bu{iWZ>)nA=uTF-YE5KSPXdG3*s>}ePsvI(JH3x2 z)$%eAU|KAUw87rlrn%h#swi#F2CJ2^_=kQ0jd^&UVXF?oWhLpuoXd+NIV@2cSr@cQ z)A;~Y(;l=7smqBH+G9AxREGW2g98`wIDznI;yV%iL-cRm&ZZQDL1}-&|FG6B>2qC0GKP!=Asa2Jyn&v zBVHBfz|t26%(|c@nv(YV@ZYOc;ijN{CK1>}PV=S>u8j_L79XJ(7sX(7@B=T_!WF@~s6_ZG-zAfWOFtlugR9u!D!Wea zbu{#3x_6Grg6W-y?XipJ*T@tAC$P77piZvYY+4s=2@&9yo^)Tm=1PFNP`%a@%f_xC z>KHjAa{Z2@hX1b#ehlIYaMtCy3r(QP>6miO7<0Qg%NDsDpb*!**RdK=$GTHfR(Aj| z;uTi>7%=`oar00UG8W!X(j5;eG>Q)JAbId5Ki^jBdk*Psl8c;mJzrSix6Jr#Z*FcG z_HtsFJg`S>eYfUpF92^qkiY4Cc4hY4FfYv|o?n+}ZbH)*T`K4iKA#QlcF$sF?)z3^o$V6fgMgGP&IicZT`>nE_hnHGIkIAwWFPZUJ1BFJkI`}aGXI#3 z!GjTKk9lGC(ddG#S@e>;^vdx2@(ME@OtWkRp`Z{HFF@!38cmusCZLKWr%(YN;Mud zt1ry|H}RjR8t6mnqx|EIfCu3FwS`3=O!AXr->e{H#T6djrcp{SAdSWB4nrH$!Hg}$ zmSJaR$eH(JTndIo^7+Thj2NsPuDjuJ9)gL6L{=^_#2X?4jn|K+5{N)#?xCNUf~V&1 z-{9fY?Il zX?-jKJgyl6LHLR5B^LoOUfzq|{uywtXGe!`ZP1$NmZ_l1RN&QZSw-L^ii!JxdJQ)? zx53jE?;xTa+&81R?Uk%vQOZw}`x;#KR{ZbTM-hDbf;ZyHXA9KSpaHEmS$7_HZH_J3 zO11gCmYR>F?u*_rq}XW&^S1po>VUetbA00008hgCyjQiR>IVF7}a3{8@j zODYhhm`5&;I|9B5EU}uc17lMR%G45aW`DCXz+SUR1{p7jQ(Rn&1`( zS?GX8G=PK=?~66mX7ER#r9-cu3GNlp;YhApFEhMh?QV#`jfFYF8vwL!tPHwxX>KUx zlv8(LIH{2Ui|HNufpd~_ot3*q_tu4BG3a6%fPd1^X+J;^!>f)pH8j47VM?wcwS~UT zlKEIb2_jUS$h2Oc;gEqlaSj&fmFsmU6^(`ZK;lf-d3x3r8m$7^a}a}conU87ozORs zl3GqtK&Z~)2Cxc(p?OlwvWk)cG1E+=^4?bMjKd(b$y38>Ib=~DU?uMm1a%A=Ziz$# z1_Ny+s`K2aXBIP+Sz1k*g={(;X9*{m(dt8dk3&B`gSy-xY;YxsjdzvmXQ)t{H{Jtbi>={D5fySrneX4|3X zlfq|QSZCPk4PbM!qb7UJnTpdSeJ4$x#Mv4PXYXgQN-N9;pHdDiCaj8q@B7bUb^Q#YdaFtm zW}xUNtVmPuARA)Y1fe#m7^W*QrPk0lSBem^Aw8cIi_rj{YmW@b{0A3LT-02YiOE)u zR7H%wUOoE44PgmMilw-vLLunYNkS|INwF2g4E5mTsQ2PU_ecqcB0`wE)0gcGKNEH# zC@&b85L+PpFaYcoWbrc%d3G@XOIm`cveKT^F>teGam#fK951# zMay#=DT7NNIsZLA1Sev(zBL>R+qFp#PmV-E>>DT(u{c$wQPLE?Auo-X6{X>h57Ncs z=fW^P`wAg`!T@LQEo*hE%tXLQ)C99yH&*%afl+)e!v{xkov*a*ZOYuDq^ng7bD5%a zayzT+=seib@}u^d{ODAl)daS@Q~C{B6uj*naGU%VNd~L#ns*EXipbl_%pua?*tm+tXxp{~pn9^sCPffah17 zi2wG*N%e~t5xvPlcTp|wVVu|)l>%mrUX`wMP)&cWGp<`1Mk%O$bIov8scD}p4TS<1=PQK}U(@MVi z(frfvH`?uXGXXS8H2(~5&+K7f>_~m>q~dBkv{}OBEKTQl(J<3M2nM8{vGwW7ugOJo zF8JPJcUn_GC*1v9SkA>x^6ZJC(A*V%J_5-k9RN{p;`8{kiV)Pm^;>kmV);HEjyC4^oo zi$@=@1&>^>@z-rl2IoI;{d`tlf7b}LR`@wPG;2+qHlnGb+g$WWtK*!}?DzTgq<7Ju z8zG2)&~11&O*xH2Ivi5}&D4m!%=D6W0vd0cwZv#!QLM)Nhvp(Wutg^w@O@25*R7{@ zr#NP?tr5>+i+O&BX4UF)+AC0=K^jh+Xk0R!M`hs^BjS3f9L3zCQzO+kGL%|7DwXnP4c$kl2l*n|iZI5dJ|)K(ozh|l$r5aDC3Vy_OjKXk78 z6o;@Dk&e83*Il^e(OaY55;7HN;-a#sy_elh#`B3vH2ig$3T>5kup-ycS9FjDeUHAW z(>5+?yK0118WjmlAWg{%OlTT84S0T4O4`M;nRA@QEy(GzFql3~Zl<6!H`IMf+0+(n zJ4|UDWWvgT;G1&SbC;XJ&weAgGa{5Sf4nA`Jf^Oabn7#xpozCn;IWbllO5}bXV?7;X{cCtl4=f@|~5@I2cY4i6`ft*g@n zp0(^o!hJz24tpig`g=bO@a2EdoIGwNuOFi=>$v-O?H2?!6M!6a({B%W!pV19$wDk-{BZ2*YJL9WDdqE&NuAjxnlAq`U--M$X#Dk=+P*3u>Xq zGYF{1YYO0@u{?V+Tdx8>R5B&(iEnO}bc*T7@)Bc}X*9yBx#E-_4Z%*`&?W1FXbhLD zw|gZAYJ~cosv8&;JkCF{qi^%smRkK@HDn!_jGm|eLeE$kbg zf(9)mB+Z>cWV*Qy@jz}i8AlFtnocoU40^(? zAJ*xQb-q+72&>fT?NB|G&YV5b3tPI^B(_xMn46oA1?yA#B5zDV3^FTj3=Jx;z@1RQ zA=&lVo6JBub`&*D8obJ=Pn$(Dt=JkB*i}$O_A9+DLuynD~=8BQE@AE;{qxSsh;;FS3&SeJguLyCACD@8fK#9 zGfj$uHpeXh8#PKn^o2#ew`Yg0DFT?al!?I295E;p$PSMQOR*udz(9M}9&k2PgdL%z zMjCb+P5c@{4hFe5pOA2Cy%LFfnL}Uthh5Jev*eTjrOe?3UC`Zy)Q*fk;vXy(kc!m^ zz2n&&>Dwjd=a^=W^r#L*sgF!o5)e$q?X-9i#(v|n?68f`;Q8`4ES(lY8RU9^G#7K6^8qijZOOj#5h66sb_xnnp6)^LB6 zMTa3a6#M7zBdL5=nCZVlUXw1n+QrTh{3M;tF#pa~rYpohNu6~8TMXUA|%+8f`z9`FnB-U`)r`91X5bz6FZ`$98=p{0`Q5Qcf{X7IwUfv zNbs4(0O$=!rUL%w7-7q*$Cd@_n`VC=S3ggm!(SfjB9HX(cD!Ek}XphMSJ zNyH#I)Xi9b;d!gTDRs(`*RUv70~2-;J#IHOLj@l@UAp5iH`b6waukM;7WLf8i#4`-)bCcy%sK=37cAs?B0 zb)qz3z_$w<8@gj6fza|&_ArD>6qE^ zjlzlj$S67h1Mw$wARw^Mw7<|rNKE*il(x&ojW@NJD8t4)L+YB3=m<7Ly>-THt&vWs z?+Zfxtg_T}l3ZnD!QRKG&;NefJ^ICWJgE`xFSS>Q?nTveQw4AfK2CP2_JT7`@+O|x z)Dmfg&)#sluaF~i{Zztpd@(ttsmghPWgYj#J4vDRyN3)_!N@Jh9w0+Zpf`+$B&>zU zK*W^#ub!~-J`vlNQSSEXc*%0Vo&ALam zg;cKYZ*R`0I0Srw|9kBx2Qg>-Mdc%I_b;$ZF&BF%V2FYFqEYGT{riq&sVt?`Xr(v| z!hO;2HiP!Q6Nz2Ey9W(d%J@gl9|@Hw7mq)z^ZT*6;JdGtS@u@up~+hvXEA*L!h8SX zTE42F5W3?Dr|MjP?v+kj3>LzXP6&-9fLa8AAGCBSNQkNa7gW4^oyBn z47u8Zu{J(Bm={e-e(rW(1LaZXS+D(mca`@4b&X3~flzax5gT6UKZy7{s_(MG)bzG% zS~2ql(Hon($NX7kgSaj%FY{uBG6&ri>TzYfU9)WoxImRyplml>axm|d|fSxYvBz~^)%T9WJZHou-<`XG|dMi3|-GU23BPTBb6F zM-7rVq7inbv;ZiRsoYKh+n&45JMHGc#gS2}LwI_9%VYF|#?yoRI-mW<#SeO*0d?Q{eJ!CU zF8_jP(aPC$KA3?!mFMXPb&#G>_NeEK1o@1;Hc|Iy2<^;zP+p-65N5C;W|&M#s3-(& z-d!@`MJ0uPiNdeb&auuB)N&7`B%K5jy0OxBC~A81%Z!ZRRD1jMLSqyW5Q*$D*PJEI z?omgT)Fk3_Z8vaP<(HMZ8HuW{I6s4R&gK09!}nZZL-q4O0k#eN7ULbD~I%BVKH2Qi72*KEBazu%qP$9Rx8XI z?t{XgtFWu^Raz9;B;bT}R;1W&1gFHv zjwE<@3z@|W0D41v)UY5J))wZY>*^uzjE6MManrH8A?j3D{sc~RFi6P1sYoujC1MfW z@#9_3P@s1&^Av2gv>EF>f~FXXMU1CS|2O5H+nZvHbk- zP4`KXaDCa>Txqs`;;`v34f#4v}_EqN~iub)i6^| z!9c-|y=$^>f>M!((i5jcvC*gEgv$X212Fb7ICwF&`P|qsix2rO=FppCrUr0dR=XM9 ztUUi_<@yBvEy*hcAVi6N=CfHw`wN}bGJ+e;}pez+wnIBQG5@18l3P*J}5X#@PVgVp9-fauEekXmxXR9ONzi6A`E zIRx=LVT>_X0J?!dsH~^~>2Xf^;Qge3dKOt%g+1s5c&(Kr1ah1JUHu?SFaBuI1pEZ= zO4tBT@V9*+tqL}kYO)8k!}BHu0uWd!O@u(8W*#)}!;9ax-n)9O%}kc^o@9mO6^p^Q z$~(i3n%Nyp?izlBtwik%TRJitD*l@-^4{5_q%k=Q_bt28EAdIt=5L$t1DsXaIaC43 zZRQiz4S`E#Y}BRM<*7x-fNn`Hc?5CS4!3wzos%U~#To_#nSm6Y0yap&#}xEK#$iZC z9=(38&JMrew(QA1VozjE=O7)kY*2_}>fgkWN8sZ-jV;8<0IC+Z4b# z0Y3qOColYM#at=nIIe{ZGbGLW%#JA&DTnr(&kqk@1u2_=r`EP0y)95_gYKDLKa_;V zSt=G&yw^hV>O5`hLfpQbrs-1=d{Kp$^BlJP!WDoy&G^BZPwIFf9X3+oZ9Ef$a6+|g z5c5FhpZm$?Edhk$8?@&ueF6V!z=0IyhISHA^Dal&lQnx zTLmq7zq^fY-B6L#H->~$IV_@7{=#f^BeQb^zar;Sd3{Kyrs25BO;3-P1)#K&z{2CG zHI@=R4>?G=F?OUw&Oyi!qeZ}_m|BZ)6z-}^QPo;S!d2XITh6qGRs>fF^&qy~JZMWe zd6EBCF!qdN$4XXD8@jdA-_t;9J&UBIm^X^wfF)D(bMf=+qwTXPyPZcrI>fQc?gAaGU9rEMtjlybvm^@UV%_La|DLWzE-lmonQQ80TEcep{D!M05h)#} zs9Wt;6J-NTo!wrYj^0$w`W{LdFO7z;S74_y!_;Sp+op~xLfN9lH61`!RE}K}=N$9U zoO3kT&qtY#JK=?cB|F>e9YFw*`Psk|aR{;BTrC;2ipj<(`F%8!@4oE5+Cf-3Q|DSN^56f7wb~2LH3#-mXIset&BxXfyo!7*)QUR1 zK$=iQD*{isQp#6xA+x<7e-v&JKZCyPWf$g4__y}6^9(I8=Hm|vsL^ik@DB66<{MDA z5kgI6`;3awsBVTos%zV9dMf71A+mhpzFFSAy#p_qWTe$@>f;%qW>>@-feDO4Ge3{2gz}#+KpPQ&Vh6 zHz7AleLUn%4dEJI7wx!0zLiMVh#|fR@}}%R!a>7e8}po^u(#P54j))wZ}QP_kWMK;Ss;Wd zgC9(c^HLzZCn)xoKPd^bvBblRq33MMUH@qvy)g;&Bpb5w<95bq!LvLak&mL+*LJ0T z&oKGZcs!2POXFOJx2BJ8!8L<2MWVeIp9_(L3-dfj`ko>cgKU*!uu7Vi%;El+4;XTU z?tAgB@g@QS=`!|Hz^R>OQ<$x?m``1nteQbQNz>G<=lcIc|23q1{eQu))o~%p2n`My zNV4Ng)i_2o7yiJB-0;0BY@wCkTr}9-Rwoa7|MY5c9btU~NmVJ{>`&h$5 z0et>wI~gw(fIR&;Jh+4ELEWw8bxOnK+<;cdu&a$uN7-;b$cFGM@=$Q6GgtG;1rdr> zMK|!tl6m{&x6SvJhvQDCVaD66sNz*P-lyNT-YeeqTeq=-!vTAriGW?jaOr~NK+vg9 z=bN9t5d{Hw_BU`Un~jGLtveO`9qNz4G+Ti7$C{z2x3)%glhpK>53G@_KAP_EK_zk} zW^hBV9k~UHn9t-O)Qrva zfIMp|VPg(f6EpoA-)w&KR7cTX8!C#Z4Q4z)^;z^|(l<1ubC&dV;z!dyS-|MezyL{a zH#-tkxic%w2padHWiS@ElJUk?OYW%Cll>p8Sx$^{Hqr^-sY`qM$VhRlQdB08xZCUkv%DZ zQBc^{qzbrg21fU4jcb)1`mMgo5X;ftVRUi96^6GN8a@Q%6t5#$1b2pcHSA>uS-Z$h zsdAT%F^iw`Z-T#FMTnbFfU}u-y-DA=uBHn(4V2A8WQfOV23 zDAz-^+EE3hFXUFIndh=D(aMLt{z0!_^;L>_um+$ecmnq* z+(?$Mx1L?dMvgbe*`?{s$1KqU zQQ~@km3Npum_*4WO5JKJmful)kPb-KjWZcv(%mM4c_}Qfz3%hV7j=R#ehW@N%>@p) znkfqmA#7Y$x1oL&CR_G1Gn4wtLEAZ4Fichx=}RM=G3p9lnJ#sP2$u{jG33=GCyc@!O^IsMtfhbN#f{@y1?d*Q6?TTVn4V0?4I$ zFR6RoSpd5xQtA)~gzA#Dw)emi(UAvOOU&77U%#ouP07%3(DnJ~kWl<|4B(KY8j7Ky zl2fxERJ@ANi}mh|hg{Lpumh#(t7;#EZ5Q_5>e1CrA3tcGxwm>5N0LXJ-+`OB^Hz?e zAa{{@6) zfe_0i0~fn!eh*qA036JxHh>tt+|iOfkz}E2$$YFzWU?>VsvA1V>mG@#`!F<(dtbK#o>=t`?w)Z{Sy`0ReHXAE3W$yc+s|>*Bt5HQylO_I!_n+z`Zum-dmi%(wS)_9I+^X3wd87CvVDCIkPX|GG*J=5|fq%MT zu%C#Z!~ip`++JK%|K34B~#?P1k*5)hJSQNs#KULhj~CLp>U!1D7Av36{-2` zuFT68N44Y-=y#opDNz8%DKSd%k>hiqt`UZ%n#vv2s_Gv{yMS$?QZJ>Gx&-|4tHOx; z?9g*jO^QU(UpRV#jfc20$zhn!Yk9z#r!Lt|` zWa-&`l*FQH`({TQUN<`(b};^f+(6q5Xdr`I3d)wa0=0y68nB&4I0N0Qcd%;xhX`p`9i@a?ElQ;^pffO(0IL0Z5 zk#YvXcC+p%TZU@UL4Iy}Z)PiY{>=wenBAQ(mWY5(%|)6AI}AAo*w({J6beWvO3-|0 z)3@`Q937ta_kL*L=QVNpb!;*E^ssLWjB!N#PT}zN6`@`x!&o>TFOr!qlk$Vc7Z)=4 z?%g|@LXCM#M9-xnvl-TKL+K9JaCm6Vot4?>!Ul_;&yjye-~k@Cxz@eS#1RK~%E=b% z^(l5dy|BmF*bd`%luoI7iHS4d$70-~(*gEldd?#`w?b&kV692v*tcN3( za(Mi1IW!hNst+Rt7>Y$V7?M4xy_W33e#o!$5rvh9S-pTK9Ap#LoP)Rjr{}aC*C^;2 zR*z%6(DPJY!|5r@`8DTx5sdj%b~C||W#eLgd6jqqt|hI7pQ@uJZ}JSeO+{9aNhVMn z*rx!0+p@>UeSs{R+*=qhW|g1H58fi|nBx?|)c1y{5dDdy0EGftW7BI-is_8AM5?ol zed0KGWYN`%=&ec{Gvn2W>C9TPoza7=1=z$7Y!^c(T_ryQVm_XDFR>J28$bAjez-wt z0)r4i9S$Jp8Zjf7=OaJe7ghCWJE3tv-=4avtVR*0nJR>Bx-j8%)cenqp^8}%o!gC z6x*vhMg{q0={r_KSUOO#(t?7#(@XV4j!g40`+bca&sEQf*)@5ps=(VvX0_v0q*yk-rL4o!pJL(?nXPItv1Z~3 z^s2(T+iy3u&KfP>Jie+~XR+?pp0*-J*vag~%sJ?F##4tbS%D&XvZ!8FDSH^f zlOMf}2o6Wqgu~H=_o`@@5V(ln$gIzHvBY zz>`uXYQTZtKMiJf7Y=g#6kFC=W)9aoI2K;qey1K{Le`%*=KFAu2||R1ix}$}=Pt8K zqtOrmsz20pHhJcUqS!iM6@uRqxW{*N%1+CQL`glcNu+0EpM#wgKK#%b&XY8W9em;=05*BZ0|Gz zGPAq=#in@aC(e7-8o%Hcla;EvCw#8rz6Im(k6_3y!jBU{I*D**-d@*-XaPI0cpnL) zSEEh!;AY}`?x`xF^m^>3w!qV+@`)=Ed}6n^Mz-;3NZ7kT#P#?6rmm-MpV!pDdwH`$ zc^1Lr>`HK!!r>cc*~H^LS*r4NSgfyF^U!j87I?xYRzgmCJSgUXTLCNuitA`qAuW~Y zXb_kzbT~tu5x|~-R2n;gyC+?dR^Ni1>j7B1D$**wBD+2RPI*A9dKLce%<#3}Kek#H zhHNlZfVG$YK=fyTJ~GljKqu_ZvJFY3;HMe&5PhIOqHnYt-OI76@TeuFDpbx;*t;_e zJr$r;!y6B*TD~Tb>ZLcMF6Qq=U5z#mt>ip^vh{dO)BmnjH-G!I0J%SID|*34}ys&&Zua+QrHpc!>J%_Cp# znw39K2Oq#ANa4wsVDANWrf+VfP?#~rgo6vKs6K}Yr<8M1L(mOs5G&%tO3k8OfX%dI zQl1eCIGo|@^ATH?uajcTGO2k4k&772oz4=QoX*r2YA+X!@@+c$0KpRz`X!Q%wUT1h zdXE~Zus)C`ygmb94LBUsBrvxgdIoh7x`dZ3H%_-{;I9cK0>f0Vr0=2e24}Af-8@YR zGgA{#9H?u=yUh>G^fv6-vKP79%x{l&&vwmn*8ZJEmf=Y5;6${ zHez-UqNMeVVoPv`;8Y`@8sf&V71IoMfcTWi`(bKk5u(>9T6rZrlEwA}X9Ej-KsJ@z zM@*wGbk5K;Pt;=r74Rb@(^dS0WtV!rlx7Dmk*QR2DTb^60(Al8#9M_qsZ=cZBgB!yulNSW zV)augKH?ElNqkh7Vx>jj<1hS`Wo3Cz%wuVmOF)v5TgjE{Oik|DM3t(Mow(Mj)zr2} zJSZrw`AJ+TwZ$6J2k5El0HQTusfs3Az6j;h{Mn`-=NK)hIDT89?J7sEs0SQzp;+_E zZgb68vD!WHa2x}9*Ci_Su8SKFsv*-V;o1?iDjYDkG-H@%1F{rPC*w?U8m zQpcv?3JE-h2{Z28)zEL1qYFN1>jH$;zx_&KJfA<@H*geQpzll6xV=} zKD5|0WWmlyL%s{g?Cd}D*fP21t?$4EJ8)FQUc+{<*DdCX9=0Pz@b)dty`EoZcr#K_ za;i;9nc*ea03hRg>_64eqUM`k_bo=*Mc!hBW+Cr$sTZH@5JWj-Yf^uQ6(8 zwJYlwv&!)wV!GxwBR3N~Rq7PJ%6X>bCO4Jw{dS+Pz2EZpPZxaPF2ws2T^bY019n<^ z?kre*cMzzKf9=t;u;`~fVaAryA}QId)Ug^Z)1=IOyEDqua{0$ttn&56r8mZl%dkMc zizLJ=#m~Z`kR=jqEywe7uef?1egYY7Y1ilv>{G=Us2;cTvS*}`+idv!PDNMS67#M0 zCs$zE#CWB>;48Hqde5 ziQ``K1J`Z4-3i^^ymlQlf0<)w{xuiR!-qAKu|%t>4h-vFbT?H!hvRzo&=#rv`V=w9 zI#tm&r~=DXJ|7gL(-M=hyQ2K8=28tV0BXAKvLInqDlwmM$LpR<_ zk{E)j$N=~+o#qfgl}w5oMxDJWTK>MV8Vf-FXXOX69aIsg#c^)2YR;NWsGg zlL^iOS|+^go$-^!89hzYHR(K6Ypb0#KTg6PHIwfaTkN3~ag;aJY zhVRU#=}3PCOx2+wTIS`oA-)Q)KJtF6`hHBi{HVAQj$HosHxCG19c$mSo5uXT8a9Hh zXIzsCZ$7tIWlMP$a1E{{4#inoeHKYQndT!c(x*FBc&GO3e^ak&D`tojA%& zo5c=AcGL|~$h8_<>7OH%bz0hqwSKuPv|>a76e5ParT|6piZ#WmaphoCAP{(R!XmK1 ze4GQ6pt(pD1iX!H3E;G`3Z<^6ifo{b0C};yuOz|qa&2&i5BQKQtJ+mOW!R|!nsbYg zM#ycBb{rRNOR+unen-17DHU8>@uY>GL8VR6N@-b)pZE=M0E9AbIJe_+RLn4ZhS8)A ztHJ>lK4XG?PG^#`P-iI$hbIASXq1`HBsfDeJyeAR&v=19(5ITwvGS-sX^&(#p*=Lq zr(}x4EQyeU5kdbrTYz>vp=|~5OW_*<`=|7`bHEatWekL1ClfZ=cxF0uV+7uEj;PKM zH+_cyVql=EvxG$L3_Oo(U!FNdSsfHYJLN&)1kN^Ag1Xj@CC5{S`b7Wu30Np4f*oN^ zvZw`S4`p&)2-O}+AA(LKDKmWLWnqpw#Ln@!qM))Qxh%}U#>Lq+b+fu1d|IaVrnW2{$rPj4@ng z2D~f9*?I2Ux^>$RAHLV?SRk8WIuhFxE!K#4I?`KhE%Bpd7FR@H*!xF3;ywL*YqMo% z5uP_UR_a{S+P0h>$y%Lk;tNE*U!w_pf-_2zBjNr7;6EH(reXPo1Q-GA-~}=ZEUeXJ ztia(tU0Wg9Kydr=tvexW3F+Et6o{IdCLhh64)+~Gz2c2X)FLlEEAVmm1l8Z8l!2tp zJ$3qe4``Z3bUpw;M-W0iypAMkq^2ua3z_W^MR5NsfApLDV^mKKvLORmAbK>S9;8H1(}leba;4r8*WVx71X z+570_u~dz0Md+TYygt6-7I=fhSPl1nm8;+jZvv|s;yu&yYcUf7Xi@0ha`5ulDnQ%@ zT6CX4y%oRuQ^$tURS-TkdP9bgYa2o7m`NHL1+)e4La z|B7xCqzX#Mq?gHV4aY#dAZ{_mi&fGC5Ebrs-*k@}(z>BufcJ!yn0E3RP01NDI`%4r z&a-GyTa?DdUL|I?5^qOEnZ3Co9Gm?5IvY~>4#8DQRtscxXk?+X3n~Oc0?U7$&IVVI zu6;fe_!Qe79f}s$a${j%8|x3&n-UyiHo<%}qlC{wYw+Y-&RiUR2#}R4quviyydU=7 z-29Nm7u?hR7s=f4h9f^m1cbXLDmYSX`wG?&&HlVVs64yZX^cDS*wSvMSPG=lAy8cv z%k(dhs)EU}AherjgnSgh2g{Gw2ZtEDXtSXBrNVXi$BqMQ1Y^8+0}OKj}D%9O+Yjrgp<^PPjY zJHH$gi+B%-kGCH@;)!kJ6Lz5pRuW$+cMktWT@(k8aE)(E2OBacUKM2z1bNkhh+|LotbBq6#1@ z+`o{7LRBRZQgh)<>00;6RM_MCU2e8QgdRNcS;qiOvYHLhwuRMutDDO0JNi3AUzb&6(~7A} z%OK*g_ACTf<_;epo}Kphy8FF;ckjndIAZR_&hai(>pk1+9`A~uly#i4UGH=v)mo7d zoWr6;O+(8ILCa9eYnoLI8wXSWoKnQUTx-4P&%`!Qo_PkBNmvz;NPuX8x94(ODMLaL`40A zF9zWxvE+lRVG|;9etD1o1JLg&2_wz`J$6+{PWnpjF}dB5!K#_oDy#_?%<#Xj%w=@1 z^Lpp#xO?{MaIb4N|ErzX$ly_{or@quNFKKTe-_DuF8vRXJTI5l@yu-EmVAzX zSvXyovFaCHvwK~G-SIFizf>0#qkOd#?@K7w7Z9Q-HN&_iy>v~o7^sNIgMd#L#j%aD^rOq_X|{G*rk4m> zNsF=SKE*_;2if>?c2(W0{$?a^lyJWsVwmfih0MFY^)^I2{S3*UxM(i-6i)yO%$`JV zs%)-YRK$K#C`F4sg9?}Eh-|(a(G;1P{Y$xSR-OhNV(ss_WH)33tx~qdId3vgT8<^W zQ8dBMcJA~8HV$a<39{;h%25r@%dqgLD6oiVOVLwZP$!v)+*=%Fgwtop*vPEr#)gen ziMj@|VP$D@2_-8ppFBr*s#EW`TE!$i&u2He+24mp$R98&W}5;LFF;Xe!7)*~hR+uX z*oc+qkAo5_(@Cpce3&u#_BxDDv!vHLxrq)^?*M2(m%kMaR-nxVTIJ+vn_T^(WE2{B z4RRCfxh^DdMtKNchX|BPKfQqo*9Q`G97#xVLt)JVl*_>M>v(%ZnzHA2^v62QI_jC= z6yIc+UKZ|cyn-&Dsdu{|k=cU4$D(nyDlO`_DB6L^!7Bw@$8hI`~ z&_3LM_3`5UVg_!mnc@4*b#l@@YRF48i27sU^;fa%J20YZ#%v5Ioy=!~ zV&_t5le@(_c!^LFxQldDnqM3F7|~f_O07o-{q!s_KLHnmfl$dzbYhehQfjaJ0Tizi z#4PU{?#H5U_MwRW$aL8313y0h>a3FcT-RnuiylU|P z(Gaduhsdy=F8Y#&+4MZK-QX&AWuKX#HC5XZ&es@X+tI1X3agdn<-o2nT=ydS6Cu56|*aZm{b>+UZqGF@bQNnblQ+hqJgVwL{iIB#23?z#w!#Ys$eZz z?qn)W>9TM1nbaD0zua$+A*HV$Y)M02yDg?z>Nsw!3wbiYE#Ob>m-VFalx z?0`gJ>jZuLbrmSB?&BbtAUxf{4GJ`|L9ZpL2EAZ1Nv$f;TiDLZV1E*;z%K51T zb(>sstWoODYHi{iJV|t5kv`uUwdG`(h7Udedg&N1Z30h87?Kc^= zH!6w`On6Lt%4xe){JA$o8IetQ<41#Q3Zd`va+jO-vU>54&)Rl6TMKJ2OfjTD@hS>y z*pAkKCfu5igf%=`*avg}bI6ygCamEx5bW>7p_;(QfTd>jquV6lh@%(LPy;KWRM{xj zOftw=A^z;C+ZoFBetG9b*n#bq!S2DEDA_X??&-ma@3V(8Zkp^Kb%ExcKssU17ZF;F z>_*eXcL;ri>UUOvV$?xiVq=73gYfF2dc=O8U8f}m1fc01=H#)f2hib4stTPAYkRem zoa0o~;Ts+u zJUJOuTIr^We7rLUc53|-NH#4-U}PBdHnz)mEMDC17-GVw4GFSu<7JB$I&Hsr^e8uYwacD8LUA@hPlh$6+51 z+UYUy_T(*Fk`ZSFH2rr&Dw1Jd{$rlvjaG)o3G2Zi3Gx|)W0Vg;Mp3lZd8~zmW-*AK z%GbmqK~##5$?@!CRGJkUTq(9d0rBs0S8e=h$qO$XN33hYJj|z7R3JhwWw0_90XQTl zPRSBh)7VrZSAqbIxi|5qTU9>{Vr+N31_^ddwT~8$R>&>NUuVC>zdWC+X2FcxY_IN z$-L3}qXb`7;UGO>8ZIv6IU`RxgQS9z_k~6nbP6uR9yW2UY%b9Q|BMZWferOw2$!2S z=5!uz5Hb}!@t*CxcoA$I{YHP`8w~=LfL*k@GJ%_1Z8_ba)k=poM{%p&Cd+TLp^=g) zbAz{Q?irdBpXtixQ%zOa8|9`bzMl%J5->i#uobnWnB*r|)!zOY+?QuZhj0A_JnFva z9iMcM{HJ?|C(G7TK3qQks_o^4P0PxSwD!QpkE?Y5&CXE|7?CFnmf$-*!C7Pr z5Us#ulBJN|7f3%`bj0}BnzX}0$(lW4RXqL+C^@rC&c6Xo(uN(-l`Y`NEOn@;x}5)% zmffoNia!HYPEGThs+%wmtk0M^e!z{NqwKo5U7ac2D>Gt7&rWo;MO(Iv>rJ zZD4k}rDU3Mvq2MB7iJ@EpX=)DzBA|H_{;07IozLpOx(=L5PkwR5Kh5(#eW&f5kaPv z$(6$NG{mc|vXoq|0#h3u9)_f=i1fYg^V1ix3btc4?4U|!TLp;&cr8-G4h~D1E1^8} z-9p#eS>&NA-5`_=f~+}RcU83>QJGslEmYHvKNh2pW>dTTdWGWz37J(y!F^`kCiCf} zC?z|Z0xoF*41F;-wQR6go8&yoZl5IU>G@#2$%3cik5k(=1?nU~S>jcEW2*S3$?@F^Dw+I3KtLENnE+kWTd>vX6-kjKM+^Qftm08jxHsPv>;!Ia4 zsvLCpPm;eK_WHW^NAcQ0;I~4fk(U&^;MgZsKk#znVd;a`C>a5G!1R(4W+$`!I{(Cx zIy50~2?kdMSJ~95h68NTUZmvXD)!x1STO7#d4#baoVbikaP@F)(JclA5z<7M!o_%y zQLF)rdrZ`a>OLrEn38%99(Bi=r}codcr+jXZC=g}O-+sF7wtGvH7(zG+kax?Ejjcy zStcGXvj{hGC(|vA_CA7oL^4I;lm$w1H^p>F`lcZI60JqBlcp58RbUg)DbXE*N@L*Y z$(VY9tANc?1LUp*t*$b!z5>p_MdaRy&+nramCy>X(Q9jB5iCne^kN=Sow~#e^6ZO z$hR=``~234{x&AYlaZ|1^|_&_(>sja9DRYTX@j+*^NfMU8w3GgnN^rjx!{xvs9tKT zX3F|vb&uNpfo{!iJF%Afv?kP+L5kkRNst3Vgx7n87U5g~%se@{jqbD!0yz$qZxv0K z1Q%m>65R+GnPeRkp7;7YN56oh-H5Iof|DO)oIp?@`(hYp?oq1a`O&(UF@n*&aQ)Hf1&_?sDQs~|lx{oG+ zay#9)oFdE()PnsWi4ZPnJY|(DBx&q)o+pO2H~_j%g_>vs%1Mz9ug$81ANE~sM-~hg z>agRrqeS();UWh!xoQO72D@ms6uN(>qmq`174y92{`&AdStvnR9CStj+xy4Nb(idN zJav3_yrm$^z>INvu3^hurMQK}($^xVwMgZ*X11n{2gUU@^52*;hWz9(Af9%xX2>wo z`UbB34>X1>EddSZ4lO5$=?p7!Clg$mSJOQizJCPu8hr_W0K#cC)s9`^ycl!&CTx_J=A8^7I_Qo2E94Z0S}kUB@HByDpW#hw&fN_{O$>lDoaN`aDRrmt#KI{C ztG6?!KzI;c9y&o4`mOzcN{69r@0Lc+f8fdSJcH;dKc2AFv50B1X_WCEss|u@Ian6vF?%;)K@p>+3(|yPR>_#dG&OSJu+4KV|%-=4z zbRu3r#D=>M3Can(DA-3UES%#el zg*Ed_7pTH9A3fUMIM3}T_IB7J5UcsD$^vsyzQZ0&&>6IyM7qZKgrF|q9)Z3>JWe6{ z<~+X)JH%KmHT@z#848Tzrh%g}eB$M59>(UlV2!>if~&Go7l^!T6IU{X5Mu{fuUr%` zPgzbu29A89RTN`EQH-Wr))B%#bmTlL(*xa{f(8Ht^7UbS_?nUz4k>mGld>)>ooGM zLfd*3ccY(_b%R4|+ z2@1>EH^-m8>h*Qquw6bz)E9N_-2dpQGGrA#-s?0rwznSt_3;mnzJL5z$j_nt4cxqJ zd~{E7SX-fms?u|@O}RJ9#}U$UgyB!*5n#zT9%G1&0O=^A?G;rovOezi4+{B#zC;MB z^a6+iuoI)~mI=cwGuxOu3+@Vr(kxOLqZ^II(6>Jnoz~S{~sswMx0f&shxzz()*+lUwmJP-V8CDwkDebKJ{QBW&WjNDkFjMcN=Z~m+6e>)X-%pV&ToE_o->C@ za7!2Fh~vR7L{2sLe2&Ra3h$~?26X&sxJ2L2{97SOH1d_Sy74SEr4a+`TZpB-$i^W4 zTmqLj!)ww=aE2+rE-Ou;=Zas?Z?5(CZF5Xv$Z$bFjhW;9yCWobcwm_t5l~WaK|9Wh zV)AeJlt3Mp`2gF4Auu}^DCFNc)n_VCsBV@bDYrL@6)v^a>Y7kAF{;+ceakn!ac(aw z@bamY*`SCYaF+F{1Pe@xy6gl5ua#UG0rDfTAJCK|3(%{ZX+a7#CJW2YeBVf)WxtTI z?Baa-=f6dvd1fkoN&q#@K{NR(AJ0q8vzek6xoBs99}k&h-nPDuj4%Teyz_e?p!@$_ z6vr_+tarJ%c%}#5KYi6b>g~o@8KOmhq5>vxVGZ}xgqV{XF2zar-ASxAq=O6UihaYB z(SD_vTJmvwhTJD1kg6Nq;lAv??C$>n85ohRw?_veK#%)5Pq?ahYf25P)6v`Y7D?x6zy&lE%=Y zQE=#aUK;*jm=8@C_KRt6d^oW-`FDOY9#|Ncv5>R(Db;?L00}Ee^&B>EG~D)G#cCSJ z(|w#ut6Qo!!BS0c(y7!`scIMa(-FFqKz&pflGk?|&u(=Bd&x0ENnyNt^pEWxNGRyG z$ZP6i1-yJNjpO~ZJ&Y3>%>FRH?_6F^;gZd)1nB(w8moS44v=~$LgH6fWdBb5Amq)b zG~8s*+)TZ`8RUoT4h(~+fHCr5YCm+L2sjU)ecgiCU^+~Qg9$Zj3bk2-68T!_`P&cVgv^?l)$$(bZDXyW*DreYpo!No zO$fVQ=`+>@83kmYR;mL}RQS}=AE%I=V$xUcKIa2e74lKF!!UnW(dm%W=C-SACyh&> zf%L((i^yf=n|wN(r=tc`*Nn|bP?6MvUumCXn@Y>(%<_8M^}tZTvDk>Md^(9gEv-47 z(S9PC+qyN#DNG`dGR)c3jRU9PvY8@QohJVO!R>GRjAgASzFQy3z}bB2ksObhIpV0} zRh_;V_gUmZKvm?z8-p(37aVp*Ah~pzf|;8xWeBs{K;*YjWTX{C4_b>lvSuBX*m^Lg zoI;W;z}%#}7H-kdlpL*0DF`Z;=2W7>hHgp5c)|P8CY9lc!wYKFwlXGLoU7f|?5gF; zsAe1ASE&kfAWsRb%QabQPcjWtbezq&ejvh)H$zkZgOASVjec{zuv%wG;kBjA((vWZ zaCkV`ZkW#xQC&(}-_4f(9!~;%>$IHq(=Gn=D7(o)CqyoF3B2Dej0l$+QR`zf*61Vt zk{H|;cfH!O`i?}m*Wb~X`v*HO&Q5-L-96mjIeLL*so85_e;QC|9X*uJFv-tZK5qPF z*j(p6hIRjKem!|heG_dmbT717ooJJ-hFU^vk_45f67CL9&AK!o5sBmY zWdRMttzt#O&`y;*L{%k~v`Bx0@vfqc=J-cmck_*oeMZj**#tVs`uF188l#n}2JKjY zrZ{z((#|)~J)}THIV+a1t`}#5yMVgxl5(lD>)2I35w!}82-7!UL9`QLy40x{^?Z*r z{Y?wC-{|mV^O;)riyiAnT*5q!(f=C1j&$6Y$%5IHXa(S|89JTdG)019r6L~?YF1CG zqz2RGMsMdRmvh@a06J)a)}M@S3a_NsKkN1Py6;G?C2nH_8{!c|QZYAVBNj?tZ@k3X zK`rzzpl~m&#r&@v!1l*nBxbkmq6dr0}J>?`DP#!;t2C(4<@t;XC znG>UtO@M2@7Dg=WLI3dZwe5kC6jTQoeifCEC;m1OHf&KBEKy*Cj&sgKS5)vr&P&Ss zLz`G33-G?M2ON)>N}8fg=d3_L{XpjVG_d=R#lZmSAi3q0CVB^zYie&MdQ=pX1eh-*+Qdw1nqA#2USN*ju-vB&US>G} z-k{u-LAo)DT_iiiOa|F>GbD#dLPjL`$iF}E-1#)ZHY>ztJ_aKKHw6qyrV{f2zJ;Iq z5%=+YoSWTmhzj3~f{Kwlwv8MWULW;dfluqt-Ctm*P$DVP-ktV)hWFEYT{v<=NUL+H z_S{M{Dq%XXQS>CrPLbJ6t5bxts<#Bs5tEbhnNTHE6U4?UQWwPMu=hP|HCA^LPK>ob z;RS%oPuGAUs^DE><+#9X?~(Yk!=I6a#HI>X5Kbb_0N*S5id3({W6vb&47qIPs))!9 z%@C{{3Oh^iWGuPjHS(D!+)^3QD|Rk01!qLPgRu zcG2`vk@QgK?29Uw7pj9VlI}lX;rf}n$ej7E^meD(e5U&ZR$_@%xZxbe5W3DX*W{R8 zxhT-l;pQsCqXif^#msSw9AF+{?VR|o@YW|&Bff}?Zk0eNBa8YRrrB)^awkEk(ZHXC z_X1A z$`*IVR)cPyRmDrJ)^QP37Lb@Uf0a&rQ4Tf_<(keJ+tRWoz*bME>7CTiF&ofz$wzP@ z$tsyRT4{m>&5HTOiHdwMY10RCC$To)7!pUBh$Ryv_6Bhig|2iXFv+(dka@P%fP!W_G@o*XboyWoe|sO9hJS9OrfBQ)atl?x1#{mFqc`rs zSQe#NNET;V0Mk~hDq?*5Km?P}#RXtynWqfD`}Tp)e6fTUr?l*e;5VAxvBtM>KKR;^86t68q9QQX$SvTDZy16{>?7?Z1YI$jG3VO0;e znl95uU^@tUjRMKA0#jdpVTqNOz%W7O1zq8!hD~g8fe9iRU>&A@$>eC`zo>#hqv5TU z(1`AI%6S7D;2#k4l9;?hr0*c7NHsT3g-Gm)R?+O2aYmXt4ztb@DGcLR{e{w1k-=ry@-K!e=O)s9a91qsQ*c3OV zN0s`-at&>A-CtXuwb@r^Y32IFrcTv)X7x3$3uBTXiPh_~6Y%6oY2|^C!XsG7gMu?* zRMvIxT!j)L#X2d755lY^Y?>!h_EhgjX!T7t%`figt<7~~s`N|R9_S)c_iPL*x=s1> z6Q_33bNP|2)4|QwM2JX+FvoZkb4Wkt#k>Rsw3iqbP9SIW+0yBI+)69&Ixoi?FmCI& znw6b`s~a=2FtFx2c?dc%Lm;v{!{IbyBHd&|C!odHn2U;ml%Mm*hm&lKQ|PA8{HZ39 zYBZ&eveadf5=O_jO~_j_=8?Ir{tjgB^(Y-TY~`DN!s>Ox6(YmNad+ov_a*S@6c75B zGTA>oGEHn8zV06FoE#plxAZ#N&eRxJahkZ02WCku<%3CYcw0|$fV-G63t_`7y=4%8 z=(FO34qtKbC~|^qPG8@Rn)3bz+D#6YAPJD`K&6FMv9RrmKmba=N-+B=(GhqB=(nq9 zp;?jD(5NYGv67OK3^MD2cNy12$?Wg6F)Y(8t(z-#y%X&vS6Z1n|CV>Q;wxprRawQ4 z=jR~kAUnd5NVy6yBHx5!6!mYh=g^f$e^PUqm=3w-80!a0iZeGl{EQpjI6~?s*XFyH>x1w^u1zXa7)&O#r2vyrly+RkAsGuct=$6QSncpIsX$! zO~bJ_DZEfXxUi>&l>+q#Y3wjg+N%sUEwbiUlvkyq*_88xArb*!8IFLW#ZmEcA;*5Nu@u?q`-x4Y?thFUJnEz-{Rp;G6Jlp@bFz z=_N7&B)P+E0aEFw2|NOdfj16>5+_v1{9_9Bv)h@sp`Yio>$Lm;6c8d>pW3c+E^=R$ zg;dvD5BdJuly{c{DkVyn?rSigPC@m?bk?hZ5;sEc#(e3ss3C$@_B2`=uE?4B4Lv-O zvx|O!UAYC@W5V^ro_+r6cw@VT)Ea)>YE=@;o0B-7>7!*f@$=rvtDWPY8)Fih1W+Bg zg$oY+^@gUmOaUgCPmY#oSoxWV`aWn~JQN|`jk1tRvtfFgWe^MBXGm$tR2 znEZXM_Ox03i*)K&9Nxp>#S1@w?($VN99=DPF_j+&vvy?uwJj1}8ebk3Y)vrM@cx7b zf|lXx|NW^yU!IrhKP0oY`PQ-mozA;Hd)BC=*C0uUlo#gjcbLE5W&VDz%%9$TDYx+3 z@9*z*yf$n0wbxy$;uDPCR1o&Xdgbmqf_`7lgg+-ui zzjr!9_9Er4i9-Y8V`xz0_i!cQfJ2e{cEd|GnCDlqxVYQ#PDixO;3Ub{e{_hTS6U(K zO_MDE`Fqo;-=EeWKYLfp=**VkHtuyAG8`hOLF7BN$Avr5!v2zwdh-Tse=uIWI?;~Q zV$(~Oj!Siy;YEoi|Bx-k##fdbV=lGsXJyf@`oqE=8Dyfu9q!XWxTBvspI#A6MQo)i zNbGm2f=DfpAmOpO9eU%7!jTpr_5LRnM_LiV=AAgjs8WM#LqS`|%%^u-H?1IMsQPtoVW%w$9Az5xxjZIO>bh6sqd$3v$>-QIqqN~a zcDCVTJ}4D(1RbGJ@SyWvejkB-Lr3xj#uB#6rp_gsTrk>L6?hP76i{a$$!gYONQThIr9owF za@i&V;vJ`XK?h?bkjTmcqpPQJH?<#L^!n~Td`A>euXr>(ZmQa0wobaDa^h6J)`zW|F0MucSJaz0hwYT`+R zUhNh~Ap2-$gbeE!Q}73*>xvg~?|k1p^dZs-H~?V>`&R!Ihko@?(Or^Jok>)}n8t6? zQT^tz8^=1E@Gpj+()s5r7WJQ`F>5hTo)DE_{DY%x_SAEypyI*dhGMRFd*`ok8yuxK z4QJ?W;TRrn+1OwFsA|&JJKucZD-U?0b`~oQLWKcAq4?A1)Z{xJmbwidcFY@el+In9 zrrmco&}s;B0b^#$Pju$0O>GH9vhX#`0F?OVzc#;-GtWnymgb92_(72pyF%NM1C+J$j`T@_j5(Dpy#jwZqc3?v$bDJW-5&`Rj9cLVBMjuaOA84y@PFzVF+_;c+o zKN1hB8JW#dR(A&ndH!oweQTY+Ih?i}t|dD5&PQfJN<*I0Dfdy;5BWUEdGvN_-4q-qa_vQuk?X?a)_1L~ ztspn@#zr+JnPSAoVc@Y}oA~sS6U2G5wl;?nF?ODrDvXQHStZ7{I(iQGW6ydPT{%*K zrdvV?y@0aPvL;*)k!W!0_ao3O?hS=eqa9}05<8M=8r|oOu;?7+y)1_a!^41Ok*}@G zHAhJlUNVOkg~~X9MwF(IhS^vs;i6ctwl|*yzU~Kp*kNP+cHM!AqX%Qz6refe2RWjE z0xzP@>y8!mKd}*9+P48t0xgW#y~J(ee4dYnN*VegyDO2}Vo=XFx8I0LKzX9K+o~Ug zfR2=r8y}Oc)OCQH;}{S=9o!YT5Cl&PL;Wb$$r*h?Z9<>G_t2p+>qx$?H){lL2OWyx zXK9M7CA+nH_wyyb=R^z>uY5>5eBb5ZhcJfeg7bH-xMT}-1n8kdCu%@KF|Q!Jtgxto zSTN^9iee7vuqLh_P+QE!$FGg|d)E?FU8SA_ECo{%Tt1RY3j_^$dIrTDVy!698N7=uUn4-&jKTi|KcX+q&jZfR;$JL6 ziYkCJt9<8yXX4GJE?ArVLD%$_0OC2jDFC14mzV4oPUU)((po}q&Wn%q38z$;F@mqM z*W0W6_c`931EoowW*kd;jrq?EkuN=!;)0~o3T+G=7I}Gd^X!6QRh=g9C}USrrBD@x zE$i0A6JN2e^p0BfzeQAa*_*rC6OV*FNr^nsopm%(dSl}Zg>x7oJDi3Qo z-QLidro_5XhsX1xFmq^m;k&l^t8JKn!h@-|>v`pUn?_wr%ve}^on~;BIdsYb*>c1@ zh(b}e;`8h>$NeU`g5Cbmp5pNo>AWkRdV13ZCkgT4567dsKe~WTG@K8zp|$(Q=d(st zTb<0Lvt%+gj8eRQ;>Z6oUyn(`ii#*DS+zQvGBsW6{E-uw z73afq#1D2rC0Wr&lGyzfV})G+4ys#E@Z`W9uEk1FmGf;QmrfvT7Z_VD7;Xf(Cwat4 ztzfh9fzh;>rpQl_;g5h=y%1=Iu))jTGe}i+!r=luwX`aXY6+vLq+rcevW0#N3$774 z@;|MwKUv>BJUZ$^vb?}aoauNSA|X?D?&&Z}bj zim&i7D>rA&B;0@ty@ENRI{_o6vfCU2J3wFL&w-kt8m!LhE8d6CA_e@>_sX|Gb0`c) z=D>Zl(Db5H;C_Ma#ZhERLoo6zDNzSZj}5eYq7`xSv?T)u^z)iFa@#X2RF9{#Ld&-U zS`NQ}L>5x=eX&M5$*skjA?wHTA-i*+Qc73_%onZ()o+v<+$ZxkTKgjT5t?|WbzLmJ zk*^E8fuu95ZMRw^Oe}((a=tTGTji=X^it|^Eg-OLpa}Br6iF_CZ^Bsd9Z!=MYAl49 zMuT|e-tm@-EiS}xN#QfIeXb$4Y9@Rwx>A@MXu8czwREG#?x(En+PmpT54!%a-&KN} zt1$>=3H>Uhq!(pz)ZIB)R#_x>09qe}t8t%y%>fUO;^upQaw;y+ibb~m6mn$Hi$ajG zg5v;N`bRlFE>2SeuD-}-CuYMRWtTR(pUP}6FGGZC;+aoyC&;tZ(5`1d$Tl|kP1T6p z-9~&*^A7kM7n`g34Lzd3y-SoRNYoiBh`%>yX_%KR3uFXRNkTzdDl9e9%P_pjhpbG% zA;DEa3QXV?(d{_9%?5LDtSBf;u*BXH{2E})NY`8ys{1NwcDG}fv;(+3DIkepRJ5k$*d1l*beWWl+g__}EzNi9)@28|7}`rdh9g4+ zS8>*1c%641hM77H+lIJo)oLCdvk3OetmRQQD5k>}(jz2EhL@28FP6S&9Y)d?nR|HK z!wy^Lrfsgz^K9Z8jtuu;t}y?!sO~N)w%ru(f*7@_0v11(wQMB~Gyyzl%17u@`*Zh~ zUVs14tJN-Dwblj77f?YvwF;{ec&+N8n^B!qr>b~bGbsGLsvW@~Csmk2vfxeQBly$% z-fggvd3txvxym%*`n($2c+577iPyGnJ))9Ai4;@Gj3k+fMgZUe=i zjSZ*7=F(hI>?2c}->Q$6*hjgVY7g1(3-!2S7i5K&hfqci62)j(DjC`k#(hEuHGkwA zY&8>97O@UW0;W=#K*_Trznp`zn9!;W(;}^v+OEgDkm0;azgx`dIK+1g>;hfU37^4dVpiJX_&@G(Fl4cP>fjevkSBR1+! zD<~qLS4_F+yoaYkeeR^~;PaP|r4W*VrJRM^$J=o>Fw@N%8`zQE1c0o@S{L772eNgf z@BQp18KK;*?jo{xIjp0lRxeNP_8jo|=qxP5JaD+9%K`ARXD=XaB8Q@m2g?ai*+{+bX*MFapOVX8SZT`Q{8ukB6YZ6Abefxm9 z2Vod4L!G^s;F};EQZ)2PaP*pu%po@|@X(_KW#c-oV(OS10XeDE!XLDKqF{|(V4t9>d z&LH8P`7yCL(L3@dF7BhgJxO$Snz*hX4uLvV>>#fnB@a8qoveATsKF&o#0}Nb88Sm1 zG$Yu9if?i@9q=D}rWO5q%&(=j`gmBv<=kv}HTi!%gj%e8R5`~m2Tp9EOJ}`e1FVdv zi#s>oxfp@bJzCfmW`g{Vtht~7msZVQW+y~tX#{eM;f+RnnQ)HS3uU9a&)+!>uDR_% z2V^%nm3jB$vrP-I;lBd5hdcwf;7o4@GI14WkEpd6fs~R1A<|raR5Kr&>q;-`k6NnO zc$QvV;2y76UsjuYjqSLH>TAQTKMb88XM{&djTlemW9KMErYf$dCRf29_ikKNksxF^8s@sTbaK1 z4S|cTaG?oKCuYMM11|-Z0z>k`jK`ZdI}zTaUywVC4Gj8nMbZBUHAQPKMHCX_e^s73 zQpWVgHZep^RG*FLvsvtz1aa0EiT8*By)_gn?p3N_XFzmCJVYD<_% ztN~WXQ|=1rk4^u={XAd~LR;^JkTu#HYdrkS`7g>#LO<1AHP>o#Olf7#tl z&lUsR0*V0Da<7BM>!L=gk+C(wCyOd+Nn@eBvE^u~Gi}+9ZH4F454iD~)tqWFTJjDOev1mj zKu^#(k_wbi@F|-XHfy3pLNWd`j83Opa-4-Y%K90Q)JgNykCf9B!}!2QCMYUp*d84@ zkbbLl_#_XU^i>X@C~stv+KHOc0Apb`b%_z+TdP`S-3bd3F2u;Dw{xmoREFqEK$6JN z=8}yF23viv7RT10lRm&IN&+ogp`&#!F*;N+%qX_mbdyr*a3)PVV5RX8k+M`lSHGKU ztt2g_5e_c)BO?)FS34oNHoA4z2*HQ8f2vXr>~Qs|(IGzyopODmj33$$OMeWN`Te0f zE-*rjY{W7f0MSogZeSCbfzZ2Q-5;;b3>JgA%Wrs*k22|+8BH8|qM(c~p#iiy~H3yb2s(Tr~xqy+RC2ed+|bL)4nLY5a(maZZq~bj*gQF;mUoDzD;tdfc;|#_Ce-?P)9GB3MvDd z9$b|bRBUOzQ8sNB2#;`-eg%hy{CW_Js^A0@n4?j=0F)z4h<9fbbu0*U0X}R=REy3( zp=~3SdV<`8n8;$L3CudCQ=ecR9ICv7Sg*Pc>u1Ao1qd|ia{cM>9&98`s;vWi$_22Q z=&G|fzrMZ;j70cMS@vd_Eow@b+EA-_v&F-j_*g6oXd*A6B>4IE0bv%g*5BX%$Fpp* zt+QoQCUes_BxvXsMccfjun#kR*(BMn*7CibZ(8f=j4nxLH=s!Jy&nU1GM&$^4ks?; zO4-qhi6i)yAlq0`IYeGB`o# z557%g>IqzA(>p!AAj?UT%zsFV59kfDpE5fv!mRh)Ly{27K~*R;JaO;(dQQ0Hl8v_p z8Y9Tnzv}VX%CM~w8!QFnz7|3P|k6Hg4f^11}FtLG*z(k(us0EhXxn^UnG2l4g7D}sb zU80it#C5E9v7kApFo*ktAe?6q%cZPJf)&1s&DCvpaNLFCiqYBjy6}ux_LcxICr`6@ zjz$^2_*tnaz)q2*P2M(K0&^J4F8D_U#A`_i!0(BOZVAf zT}`Nmbo$31vgH9F&-}%RUK->|8j8Gi;7heH5qyb`iy!8)*L{BaVokz#F7oL$?K8RR zT_QF<`C>rfO?jTpZeS~IvJ0=-Zd`I>iw%*U|1@8@&V?FbV_V5!tg_LVKRN>SDqjHD ztHYrB?f3VcP7Xk>FClN+1b@~3~$rtTzGa@3w&_c zH@qY?pnk_b&u2U1A?;K9uT<=r4e?CSp~!#KQ3mipoedqTAnZ1DN)amwSaNu9_wB@b z@%(Ox4rCqcbm`|RmDM@j$A>Kqv}Ad`kym2g>RiR6y$|MT19`ip%Szh^u{dEl?sd$B z{sevQ{=;ye;AOz_Z|xw_58d2(yqvtxafA!_RdiW@(8TkE?&`aT2M5R9zpFR{?IYB? zK!nlC5Y0k?4+i#k$)}yp*MD2zEKkqZw_UBEYU}(CY5}SFx6Su;P=+G&IDNh{WXB4A9dVS>r9^?b?83J$PF_Ni zRn}rL=eSa^u;Nx+%y51F)#ev$eqcuPmYWv4&!gM_bGWx2v4PN z_KNCC)0R*M4Prhmf&mDWlWB3D(RREj=3~~FSz{#2kkfg#ke#H2GRnVNyuVX+3>O12 z{)&a6TgX3i270tg7ho*}P(ZB6v<#zlLbb)Wx5K8yXJ}(AuFpXW28?o9+HLYzzd^}FayR)Q8|frRFg-=_^$oym^B-oGrkL~aWJmx+VKmTrgSt~ z3$m_~(uhug{q_R&jIIW^@T{w#pau3BLX9u$YUhSb4RQ{eqa^Y;t6qFUcw1GN6XGSB zi}*fUjBH_KZCrp;b(G!YQIdq;N4A-AJ$tsLStH)MtFStriVfz>9gtRVjeU=Y^{=4* z%&)JrVV z*d<5E7szX=b#`k}0r;pr+^QR+?02Mge|?hFCVMjveWp)cH?rN&Goi#aEL_c`xT7uC z#oy57ja(VV)^cLwj)3o_HWqk)GY0^JtY<);$lXY)2{AA{8e_{Rz9DfetR#jO4NvvfQ%q=ClKP` z0IQP30LIDO`J8|HZTud6q0#}P2wcw1ALALDO3uL-@H!(u1#+?h!5-=!6~zZkagcL_ z4QHVAB9A4wEpQYBHv1?`M-BD@YxxNzIQ2w!X?hIEY4kUY+~%QR_^D4CacWr1K?1|c z^v?Rutk`duTJN(Xvbc56rlV~9XtVLD*^>1=J=y<3L>|$+b8#aDr+sp1ZZiJZ2}ch> z1Ll{H7RcQ&B&kDX0-9w9V-5)|cPH7Xb~T!Y52gywJxqa0w#UOUBpFbU0yK=Z3g*Sq zjVZ=?*@$KzBDe#1Vy?0u;k35r?N11+N=U;u>0Oz?q~g^dZpPTY;5f4dPz!c@ME1r4 z0DySH3DevgTn?Qy#~F?0?fi{fB%49>nZu3a)#asyPdD<#H;s*?%V|YJJ_@=p;L5*$ ztoO5bN^~b_%Kc7$Qs8z2l}IQX98OZ>%b8yf-KH;>Fm5h}!vPs-UZ59r=ZcDTQ^0s`E{H4VFoznbI$@<26@+4U| z&pv@`3T63-5bT%e$%3I@+^o`votYys&Ii{MGa2ifx9hF#X2;L5TieI0>^6Z{2vb`a za+zO-z5L1a@rmi-CtuC)=f!kQS;`11?Uvf)vQMxE{k3N`@HXQ=Eup~${VDNR$;=!R zpjw1!O@z#@{r>S{DkM2SsgIm7#ZaNzlqirMC!i`Yo;*r1#Mi7?WXEc7@s-MiwW@(JH$y1$JUbdKK z>LZ=fgY5L^8_4Tq-PyOkr_N(e=pc7CckjKBUoMDQySwjRAITvL@@AVN6o>V6!CS%S zg>9sEJC`rvipWf9hmq;?QuYo=+dZ*DUn=Rs>mcBI)kyf`69L48q4 z2PO^i;^B)w-EUGt>-?xar5 z8PVEfy$BIudVSxo*XH69T7cbe)`_Bm)lw&ETK$^e8@%JuLy2|Cj zWOmh?qjH+v=8DBSdDjNTcR!e*%E1xvN$>YgeTEl@k@61df_(k6c!$H4`L=iR z^6>P8ZC0)}xk3^Zi(s>X;>@T?th+zDl}Tnq$k?@^Piy?t;m-8)nXIA)!&%8gDyX5T z?FKZ3e%u6xHpe>&8Z$@lH6-*|qS;q=G;FWtfT9D3(;(hD7Q0uz$)}LbumPmOv3Tq!Zn6d_5ZT>_FZip*}m}qe2O+_#gVWe2s?8!cH~(Ygu@920yvpD8DCZ- zHPEr>)~F=|p7?(Dr}kUbuIg$@IG%IPbMIx%#L!(;U9Y?L>u)bd$}MBa(b04}Kc*qV z<@PJI_O8AD(yXt5lbgzW2ivdDf8IYid#h1(JzDEiGJG@%(x}kEkF@;i?dji^VytWT z3Z+volE1HhRs9_pe)`78!}KQeIcwj62GbF{yE!DV&aEWq^Y1;c)2dt}fAOSSb5d!# zzcf`2_G!a6^f($j{kWI>?^v&ey_Yi(N)H4&_Cs3Xz7DsfgTRA5^QgyTL+VB2IV*v8 z1l=gnGAO42lJDG>@hXv{ssL_G@|$#Wk9emTwE>;rrd|YxL!S+A&6~dDbKnX`9cE=_`%dZFP}>L%qvf2ww>} zvXHrV`ka&ON(Ysj@;2tYz^Eg+Pyo0K8aA~Vs^pezYc7aK!l5BQ^pMPR+*d<*(GrKF z$~Ay94v|O4D4?(_mjRg2_i;4z_#sip;q8pEnWz{WYYivO@GU_H0$7oaXYj69yq~xg z?|zlr-i4;h{XSBW%P82@WkT10t7+Cxa~>qsNpv!{V`t;n;w0buyfzv00VSMZtXLXdJX{!C|nCqcNa+ z!IGn2A&;$1FU%Lr8Ot-JxqNJ&A2YwjX-@;&qS#>NKz%cxxl9{ho9 zGWl6)UY?cwYFU2sjj10?+Kiv!U(d>p1z*K^tJAAs5ddHty&|L;XriDcu*2Ueiw^+x zZEfNzT&Ca|NdYS9r2l&V^sIkkW`q0^z_g2)5FU-8O--rek;Lfa@leE~e~IIvAPpmk zD5PDsn-!jV7$v@58D5>0HpIQAOU`AcY7TY?vh+SjjVvi9X>F-E+R3mNPdn0M3DrJ zwQ&v>Kg#y8=!<+qfk8`u7$Oy8$qMW|SJ_m52zyi}n|kLVFoPd&6}M^79#pM4eFf$E zda+{Bl(F-T;nU7UP9>F-QXZ>YkF7BObKMB!8P!7-s{*t&f}3dMl%~wzes?xSaUZ^j z0&r{3h(;y2P6_4O^8q2{eFPIyrW}5>;|RYA68HquNr7?drt84;aO{yzvtw5M33o2y zpzhy7)FVp_cu$W~zz7-(3zfPEGV+(s*gdRVH`{ytCYxM=?K!#)9bC=hm;|o9 z{k!aCdS*srIK_O#nXj=b$EicV9dFdkQk%ONl3yd_NHxv|c{+lfYr)z$bRJ`0r64Dg zF4ji~i6WDW-L`C3}2ZJ%OW&;a}^0cWZ-zJE#J1Q4G(8rfBK>yM$+W($B%3xM-wb{^TA z<~E-Wu3IvdvUkz@cK`5T|FDm9HYn4P5g@YX*50R3BhqA;BU5AdnCD0VIj5%UX4-a+ zwh#KJJN;JMX1yYJNep!{Pi?o6!veYh2ee9NMUf56O$OJS2NCbuaJyridj5>g*_KPx zliI*`E`~ci#HE5F14`{LNpH(Z;sJ?ugq0RG{dLpQRN8}WpL}+OZ%rQd5UMz}rm{L<}AWKE!i92oey$!<)y zT94&9s`&+0g`YVjcX_fQyztKUX}|W8Z$>$y@}BR$kXOOEva_i=;>{xCw+~6rVg{8Y zi92y1cDyyi{;_}XH+5d<3N6a@a?G-c^9{BtZFg2m?VZ|qEWAC<=p6jJ+TTn#>#UhS z+{N47TjLcN?U(skq2TSza4?uQtKoXYcQeY-W!S&0fZx~${X?D#KX}$ZJ=-}uIY5_; zlf&(UbJ%}p`$wp_mSlLr?u5JYoVlNR^-i%_wSTe}^k}UMyu}3}j ziOo)At?Z+&JTi=rGVCr`%Z4d|>mtu8{NwZHWuIDrU;mYJqd&tt`oCh5WPZ#QRv3zY zJ}Ga#X*%gkHsyL>56gm0vwC7!YTNEcFD`GUOd-d6xG{OQlI^aQp2&JLFaCVaRL3S; z4WK^P_+`%B?)evlHdNC?5Ry)Zm@bmC5=Lm&g+4F4`Gjyb*)#Q`CKRH)u!yfFaq_qgmruK%z zXA8GP?1Y1B)G1CRth2B~db^mPmib66#b+BF^vto#z(KT1Nj~4j&$5;6l^{$X zf5A>=bxF=9ARG`zILQxSxz_m$uksHWrg2mH!bF3&g}STCvyZG&FIIKVF%9s;;dUAh zl)#-t1@;RdwrL{?it85e-uhpQhKt$(fqaEx1sqlsb;aja2<*u#1|Hl5GUsby6^@aa z5(#J;ni(jSb{6d!e8Ldpc!t{;L&U9OjTQiuj5np94N1%t<^US`W~h6xq)CUlphf<` zOm_Y`M{cylbY#kr?iK@o_d2-l?wQ2~UPw6t@gmM>|!3lC4`u zh`dBG3<0e#C%8ZIn8LQ!)Yg}1ic$dAXXNK}l7r$n(8N{>q7>TwYozL#{a$EDu%AV< z%%+EYM^kGg_Q#L;_wRe24$ta9KPb=R_hqdm$zTPX7<6|l-pNVm~hnaD*T(n`s62;;8PxG zerkq1a;`bv{Benfyy@6>ZpwgvyjdXin!dr^Ot??u{z9_$tTR!e_A5w-v01Te?=LHVPeU_&U4RLmICLwUNMixpr9E++&0TfB7KF9>RkeYp_SFvg36XP+YBAshqb-2% zyQ7l^)`n)Nr2gB zjumlSJ)TtN20wXcH$1lrBsh|s&YAi3nP^4_+sp6J@5sZo`i7y{xNp9Z3s_Af$fqtX zHv^gf@TonVOZ>=EiTe#CEZ)xcSb62(hGJIn>+BIUHDIbRUbd0+d=ES-q+h-C+!6#!ByFmd=->j?6piDGu?$q z7LRchAnL4}ue8^;-eJ(o>Dl(#{!TkKTb>(<|5BnMe3~3{BoC>!keo2F2&EYah+k``fPV@elHC9N=2RXZ9ElR@nnhr@UWFt&lmI*uTG3H4q=tPBGZHI@0E?##k-U$nc7+?<0e zlDFo1cfHvqR&Qm?q`B)kdBQHquFQj7MFUS!?6aB9W!yN~%XB^B)4RNnw40_zpJiJy zoWcirI@8bR`#Uei5&GWH!BTJf&p)ly>o4|xUO4WJ!ZYv^O4{Lav!(06<_f81W@oOO#z0hV@gRRzlv z4*)Rqqg%ha?JXT;>70*oz|}F|wcxAmCq z6KRyO1dT*o*)W68#q7#FH9{&TCdfyl>?$2`Gm@=SJeDsYrn{;<2RBi7BjOjj!kJQ# zXppSg+)R}gz;lAUi=b?iw7O<^mG@ajP^CPZZTyl=JpdRjqwK~t#S|@_f+xB1`WYGt zcm(rbZPX33Y&69ASZJGVvd%5Ny+IH=hd)oY54;ToFMQoa;kK-TtMDvWYad^YO3P|~ z-kuB8jodX`V)N<}#v_7;66ryppMYx5!rrbAM?f?RWCOtMX>+atUx8EqCby;HZ z^Y+R9_N#;bA0-zJ(>_nDtk%#g*0kZlFhMaT;dL9F0Cjt+<$vTOfP}y+@>OtMI-K2{ zmB4wcs0w&KNB=T+>;46|ZtEi=uo(FrkV$F;|6|(|oBS^W4mR3+DA*_;fbA3CU}}=0 zOn^Z$oD`rh7o!yYdlk2&=X5+a+u#^C7N*WxYk!QXJwDCbNqP%OK!n>uqK&VsI^&dR zXZzH@Ug3dvPxO_$i}-1klbh$}EtDl7zGVB<&|SETv=`%pb$GGugv~tav0K*??i|AK z7pRJ=s|9_tVld@Rjqaq?bTL~g5LwLR0TOb3w{5mVQh{CaDMctR!Bl(RT)+*UJ`esj z^4W848f{)JzSj0n!GFN~(*G%WPFd}(xd^O+{3W>k`aivJYY#g3b-^7CzJ74#f87u= z@9)>a``5wy!{G1!Pl3baT2o3r*%{hJr;;Q*m{-K7HWD!+4rKwOEJPh*PRHLidFo8M z3o~g@+8?nwYZKYREF3(-6Yw{1ZEUGF1_(kC41hiv)TRVW?uX3H_CWAjpPn6^^pCd^ zbFY8vmycgQeXz8FWi=bN>%%T*1y;D`u95Czt_~i*RlS+p4Y$E@&5IHvdK1T?cu|w_Pq2QuD!#)O$PMoiIY6SSPz3gr)KZi0$7wZhYC8u4Z})=I;);+DZicJmK8cu%}&Y6Oc$8=*}` z6MLOsPVw%;hH8ya(fGs$t>Be_&D1BhxfR;S96nYUhPQccsi=y(Oab0G`GQGQ9R$rh-S-wVBm`A(vBA1kxPWM_iLEmQ=xc zK0RKKuyD+4=wYI4pqQgiIL>*Qk!U2yfQ3WfIU7L3llUTdO=zY)-NE0@@7RN*Vssyt z7fe$Z#4C%9k?77tEzhdfW2~clzv#G7jX%g%`e#jZm5upLn6@__nm>N=8+vNR6)O`Q z#cxk4D|Gs>Y@&=*E=tp+zO5XNLNtI!Uy_H<`Srzg=IrF{*$;ugQw5n~ zBrp8_X#$FUa7i$~!uaq{FWT_p(1`RYrg5*;pacT8_`iBisPq0eLd$}Xe>XeSf9>YE z#gcFRv;2j}kEL3qYmb@>&B^7mkCoK&b)=z=eD#0T+G|`{BhMRwymmtHp|{>C12G0$ zp6aW_Zw;r0$~B!D+lJ(X(DH;jHOr~at=*_jQvTH&D~%&ZcHNn?MdJzd>{Kl-$MdoL zbkvOrbFvC7-a6pHEOCG_ALjWE%y_@U12ca@?|=V2Iqd)3Kam57ZpfSMd9Ppg#_XdE zq1;mR3or?do*y@PHLEbZKE1k{AWA$yNVnRn%|^3O&%+8-cAbWvd%n{fo{RIMb*Qfa zG^OALR9M3zd;vM_g|2679};NGg8DF=UBl?Djm>|(Fa~fHvo#Gb2ntLzo?ZNwxvW-! z@_v8#qM-$FK5&(0Pq(Pzo3wiGA}G)bX&%HoZ6jf=m#Q}nc|EKICJ|hH2IZ`<5f^I1 zBx^(MwlKVKK`h|qdXXZwG=%oM5EktIcS%-&A65Twr!~9~_Cc^h0Xo9GCr=FwZbRSP zymGDDrgp+q$(wRbZ-d{)h_KUa^5>?c8Nciw?jHRDyGtF}=2P@bPDfB5KHpMszcDt2 z)?b=K<72kC3<&N+Drx!Adx0ScvI6f{JG^Y>-uRC)FIx44z@+0=!OsK0{6LtXtf=x2 z*+z0&Cez71h9Dv|%4AjujO&eU2Lq`_(|imrEcs1Vf#upIi^=XKcLIc~DgRCi@=~^% zc%b~rtoV;vH9ay566%iEyETUQvvN!?Rn5vEs@hl}IcOQZwA=w;NAedBxFdP)1eVVu z#OC-nrA;s$12SW8TS%sEAz3hM41lB*1h8UuIwfQG<5>HLU>!Ywd-&tw(JzPR=BXv8 z`kpf15f>dk*Jk^SAXBQ^X$yL@Ix8?8-fF#1!6~SJ7%b!FS2Oo}kOVFNm_1rD;Q@ct z?tgn#naNSNow{6nmuLDc)E37@$KR1_Flgo=y{i{yt{wW-#H5_ z^SR3Iq7XeEBtu|alZeK%lk>A9klFeBx*GDDT^m;B$L-fW-# zXhh_vTdiCb@&ghUtnXpJzY8hL+K=eWJ)(Qe>(DZ}*lJ^{_s84nNWg+=b7S*9k8(sD zpA35!Vw7p5l!z0i7E2^m9bjkKv0wvU|Mdk2N&H4xaW%arkRgm}FE2H=P;v`V%&GWo z3J2s)0{BNU{@C%i;Pq*4uc`ChbO4+jPHUbY9izkULI3de*$>+%uXS69M~bh{{&w6y z+B2`=E*t~f^C267ud7_Q8s`X@8QlzIz%W;FJf0`Mlf2_cee;eV^{3qqC@67YW|tg| z^-4B}>Fc+(!2DW-0JW^KC8Vf?i|S!fX$>)9ZUFVr1&@Xv%0Zlsngo!q{q^#D7_UpS zW$U`d4C*=pQD2co-;GWQ=pB7BO=aur9X9`a*w@C0!5IC8yF=us;MPEu%M#ghg}2!0 zADr*LJ^o$)y|=w{c62h=0btY7_ZVBwVDD$ZxNt#$nJcR*hb(fSDZnf}Q!OgxG4LbG zuMIx{C6;_3fO{{-&VpjBxsrPrb99;CDeBS!bf!-7`rznQCpqcA?*H|e0t?@4pY8n6 z28l(*>LIN$ly&In5PD?VE_M=*6|`LiGL!+tS*hE|943M#Z5VmvjYYwN3;_%7A{(fH zNX7#hfjtB`Qs_12Bnn12MJNG!Z}|S(wD5Za0DqHmWEa4Ytv29#Rmp5D!wE+1M=+W; znL-V3Lef}<@0!dGv74<(&wpvHp_X$o$`2VC}!E} z8hTHJYqKbVU+7acK$Zq(elgP%G9beISdIsf5HKwa{QV*cX;{s*l-VLw|Ize#K`iIL z8l&)Q%-KUdv=w(bFL9jTtn9I!bTqQpj%7Zzc}zCn!fS~4bVr#hYKjDV78?29UdSeK zzjeY`k5z@9*4WiKbIJ_~)^}BJ$eW1n94>xo-*^w(*g6OPb^r7%bOSRh>o^n&-tVx)$$aa~964{Ky$H z6p{+RY86Q%2)OQM#DdYN+xg0cf}7FgSAdpoo)OCL!U)vF@1l-U2+mV?srNdA% zf6-MI><8e@x`g6OR(dGG4!HmQ!%*v@`d!O!KJSBb43TrNV8dMD^S)sI*uS|^K_kn5 zz#GAwc#^rvwz1?lBpev_F@cOeuli@d^!ta&eF7eFANidW5l-A=VS_Tz%*!6tzx%!y zHt|=e?|`}V_S}#%e`_einC`-9*z*55zkJs(?|Z59fZbjf9ptNQdYffMlQa0HUay65 z7^lbEhyLXRT-)|pKX4Fzi_WaJFZj&{XRxbsN>HO3G7E!Hwl=%pt#3YC-}>%(ay-dC zWOxpM39)OPwM9(LQo*LkB-E#}!y)Nv5(NS}uO~*_K>bCEYgX&jxa;Xecp$C9bW*-j zNZW-qhAUi`EFE0?>+I`I)Mmy#T-+z#Aicfp4^mIJn`G0sttYwa9jGUAG-;<5+1SlO zng#vy=8U+hv?G*AyiBPP`u2MM5GaFS&GB|LJwE#Y@h z?K`{ZVfC(8Jx$~X-aYfGr(xACuj++Y^;@s1ybF~iOF-8wgs4IA#cl{dmaHW$2Q_1M zF{D(Esa4I-lVuTHUWndw2^LzOb?ZiG!pbpp%P`B0m^d1Bhf{sJ44{wv44}0-T>&-h zey?U>ZR^Pv8kiTbR!H#R*wuKq07NfYo&5UM@Li9w^lAZoEq_S>V>i16h}~7QVOHCb zf)@SHlqG;aQ`*}XIwvUO@`>O8BU{?n+TF=afB>Wou_jy=;GBX`8KZY}udr%Uh}TzS ziTK@(u)b&X#fO;Gfv#)c<*Zw|}_PUq9M=o}8@zY4gwDeY^hczyIk^ zTY}!qd9EqVnM-2}xm&#J@N!g=(+lR}qqK*du@G^yI2jzF;10?Oq(1a?n6z1GH-*!` z6ne~O;lBh*#0Kni2=nfPRiTEcQ5P8j{EOy@+}O#0}q?H3=pc{dZ z$6y~^1HWOeLdQ!~!dWw#_XONx+$@7I-Z-dXY=W_yzUTUyY380WvN z)NREVvG7`9)0V}r^E#ORK(MBVbO)wWZkCgb*=;Y)fd825DWO}KX^lz-YVPXZwEKrP zFktpwQodInPs+ILJ+~x|syBI>206+#`LWBb@O*PK3&WhUKwRQ?2r%6_#i?b5{2?AI z4#I(%Hw@oZ<&b8i<8hWw7_~!M>#(~Nuq&mqJuo$}A7wKQl{S64$_ogKkL{rf1^;8v`>%|`k=!W^bNw%LmK^s!M7@7T- zAB@1Bb(1srchcp*xA^a^1hPlbvqOG%nDoJA|32v-?gsKXe&kj7kuU#=ZAw*(?tF%p z7ZqRzI9!-a>liMvPc>FD=-yo~?4Wt#by2A(;77_V(dEA)K4K1sDX*rLpd>bHFIX19 zq;VOiJ2P9`_re3BjdSc6;sWY>gaL%R|9N1 z|4uMhJ*wzpQ1(c#Umu+vneAYT;9xQ`RO9ZgrZ<7>a$)$J9rLYaTZ8hnoe3^DXbsJB z(Wa=itvj`Wuo)PCwa}f~Zzb+ot=!qs`Vn`^X3zH6w;3#5+BrAG^d?zL;dj{UoJnpn zN$;Clz!O!D8606wvVp($dS-X44H#yjsR8TPo0wM}QabtR0d#fxdJBo&b{jV6Z;<@K zK6_QqinE)I^bOeP#U2WM%efvqLx|9;P)v&xua`B{;Ku8)LuQULBvXmjhGQmGx0zesb&J_UG3qd zoU;B}v!J^Qu-#O$WoW+>Cc?G6559D9Q4fJ}kZg4J9O-m)_MvXlKC}_F4mw7^wGq#z zckaC$7WYB-4$fLWc%K~{PSS=ZFbrH_w3KZKMya`toz;Nw}bS%KXtp^ zKW}bscAwk2eCMzzQn(Btl*$Dlgb*KSUGpNBW_fLHW!2JY>EWfPQ%O!kP3lC;AdXBj zo7spG#Hgmmv&pz5485U|bd^IGBw?Org_dd)KXHkbIO$*QQH+}%GBWn^CtD%*^GNUna5H5@hv{CiC>C(od8X(ao_9%wrHww)amXxP2i;>{0*x zq@;Ako?_SOV0F>$i*hnuTnsLw#ijPI3dm1SMZ9bBk%hNABMSnkw$YPc9OKQ#_iwuf zm6h&={#nK8X|++!fO?#ZjN; zRIm#-3&aH2Tbmb)OP)h|jQk^I z)2=8ESIw1Kyj?-dV*>r+lKEq(iSJ-OI{jPXlW}q4R1^QsS)WHO_`4E7O z2kFSy>B1gaL1%YbZ58KAUl&XAJ)|W>{drkTAyCqKl|za`Vo|TrrvuZNi{jbz4VKq( z&GFSrcyGA{$MaBI^Cj~Y>eyRzVuQSe3B^~KKPZ1-fw9;wTb`seOt@rVW-tT6$-0%j z^z-hkz8hCodFlUP2@>1XX|VRWY!#L65AOq|Apx2r_f9;98p+aF=UT*a!bZdOB!;G5pq&}g$O;9u4vlt_?VU!T5atC0iF00R zKW0%SY^HKF`}E)SZaZ)rwMYwCb_V`7Jk(l>pHF-Zh{IGM!8=umL%(m!eA$?34q}cR z1taNLZY$jOJvY0y%tPnAVc)y9W3%n30c^|{D_%xlTd#?cQMr5ld?IM33lsIOkkde^ zaz&Z@D3+v`mCNpKQ!Ug}_A<+(l_zN|T`Hx$BMZ_n!+j2x;0|*XMFNTw@K&g#1K8U& zVE3Hmgm3ylRf9cqA7y3++_tbfOcmsFRb3vl-9{zy>qHm?(K7M8!#jN?U*?$8P>+5d z=c6uAyqQ>90;6J5PKFc#%q*DUIN){`D+?_&v;oPFmQ4-}XiJMy1LF+gnZkQ<>qVR{ zpT5sAhRICBwvoB>_t}W)t)p|gG%4j!#C}yoz$Wur}wtBsZ3LT;T8?wNp)f4d+2sON=}w(H`B|9+YhO zfti(;_i6AnW?=?qegzK2`5SUVxQ`Ue5@ot&Z#e$?aWCYLk-30p?&Im{0i5PioI1{U#xJN)FX1 z)dicWEiuYMT!U`%F@$_b7Ns7_>|t>+kq z)LYFc1)GvSxYl(moIz00z4a6`r|6o5uY!Y0bVsPuOG*p zH7+39zy*3bre@06#;TCkU_}2VOqNMl@(adD0*eZJl61Wu?Mo`!uLA$tMC4 z);glZG=OC0=LKqcJSRdbiyMtq2gkcvVx=Z0zn6`uFLRZm);Eixk?@g{1G1 za^GSIp8(~S>qR+TzX9h9zD@bcA3(kX?Zo7R0`jMx%<&545z?yXu6KkXU;lAd zt&6fW>seS+DY7rW0zAPxZo_l50&IJ35PE{6$;buX+;~~63i@U}k5;*aS88;>;ouNv z!i#3k(OCldUzq^w&u%s%7#s5e2};?WANL<+N)%55d>L*NR^~2mV3bXx*cHob471Ad zCQt!K4o~gEPLOF#&FMmox2=w&XszKm+a%qsb>Qo39n&)WzuiG!X;K}7krtF8_S0$( zxv%hg%Cjp$#?pD7M$d|gBib&8FZ5_(i_6)8UE**2M9r1i)`W1NYExgkM@WHmDb7eVuNco@tkBA5K}XMV zX(kQ2^xdj%Ld}h`%5v|lL$6uI7v2l;<+YO%ycW+}=v0H^`hC9A7HU^ROC+{OF zDMkj6z`UbFpfGPw_YYr7FbRg_{btxKF%_)Y1mNgG66K28P8$j;Iq)Wdgxfb`yasQ~ z<>*?=mD320ZbR8IL6Rdt#Ok`7jfQw|5dtE)$fq0`lvf?s96SP41B}YOAml^1K-v6t zkx#8C4`1MnP6)FB1G`l{L-8GfEd)Bz9I-t!SHN{bONgy_a|5PN7pZ7gbp0i@`g>2; zXt1XTjHJJ^o>lz;Zf?peF4Uuvv+N3G?4A z1>FW@xb<2j!5?kt(PuaG=u7qJ(P#CDP_w?k94&6>^LzApbF{dj<{shmxy-jPnTliq zV@$*+WyS=;m50bdG7X`?xK%hktHQVVL=RX_Bn{T#a)nV~^8!?2=n2a%m9uyg$bvSz zX^NT;b(6>`wTdh!-5Gqm0I*hs3F}xN&1sC`QfwJYQ|8mPs07F8qm5w*4iRI7uPuqr zfm)OuCJes-E`6AcTQq>J?Cv=Q=(I)cXPpC$EW!?=x-g}cr6w)v5DO<0zzQ#mA!~$* z`6FQ5({VP)(-BHA5~cdVNOKzl8-jZCo<4WIk>0*fs=*{5!}TD3q8M*8o|FJOp4b@k z%JvRa@*~6cn~!Z1x74=O9-4)A%G{j@niN3$agJEMrLdn?9Ilpn-!Q z5}{vk8hBuK*bai;D1+;4@Sc+0fZwRF*{&%uqPNi<$~ARpF5#3j9%6fSn@OAU^ zf-xRf!~4fFhTGu$-@x2yJ(^Antkik1)s%^ZNEW*0=so_|C`~_154aSBU3W#WJC!?48JmH}I&T0oUb2nt;RD z1RQ3Izj#;^?jP9Yuz{v7|BG_kFO`w_e@F)6KTNNp)<{XttyFjaf^@+PmajRddWd$t zkgA7fu?V_)r_P2fW)GLn?C>wZp;x!`U&y5RTsPaGrTs(D@`BXhZHouu$j76f6S=Kr zn)Kx@%#S!|Z({^3F^ZmN<}%%N5~pj5*}hs^D8;WEw#jnhv20ljPhafVHRp`kzjSA> z<0~W=N5(IKfwS9c_{s4?VLmeS+Z)Oah_)^8oQt<;X{WB6wRR{c?0 zhaN}FK@0xqDypAytc$G6k1Jpwt?Po0Ke0cK7YPaq7orLh;}e$aC*BWoqd^%XeuiZZ zv!KlDvs#&hu*^aITd${KJM}ULVVQ&aw_ayz=Jy2mN_6#l0fE(lvo|XQ_a0VsR)C-Q z#!7(OWh$EQVF~jQ>k!Vm`^f}DWE8QxOo*3n#o+Xnt} zM2S1$j0&OsfEp%;95lnA=>V(2VIUPk%MSQS%kG=U-FEwbb=&LS6WQ-S(`UFjvP?*L zLUa=3g8}FeM@sTeHOF2g2Fo)y){#x?Dp_W|xlUgdH-glhqGlhf?qu_dnl0vvzMfxH zci{DOUeVXO)q}aMzSgZCOqnc+F~L!l|2Z~=Kry$hQNaf>3v3Ht)L5{jiag%NLLIr! zb^eQuBJ(t`b8RA@V-oqi30c}EvPhKt1IC5VF_?UoZQ-*F3;)lmpk@GWm-w9hEA;=H z4mHf%|MA02-K1`*e)>!G)!u0#)eDX(K%Sial=4Nc^(KN56zAHpf5j&@2{7S@-a&q9TGKzi%kWeV|Hk;V0;4^ zJpSvg4u&uMzsm67%nko!Xj1 zj9(Zg>E#qNZhGZ6(DNBXATgYwa#}ggJvDLwZ4biG;Q>L+)KZH6h@O8Qqz*TNvH8mZ z>&%JHnkSFJ7aFANIe{WjOD}idnP|p8r;{i|QCa|*O+KWPoG^1~;sNR#-`=CG>3*E~ zs7rAuJp`Y~xIxhTu0#8|q~?aKV;wLz<;7JexfqofE0hWdZ#k(k_0U^&Dn!gGD9Ez} z&vThy%@~mb<9^opJ!OXls2vVIvdQc&%2|Pfmm%Za$aoB?$SGUX=)PkUJ~fO^eBgDW zJVcygM|?UFZUE6QcMJ_I)&ZW-g9?Urjs$hV=8R=cJm+(BUjLLH$@Ue)x46I1knM6O ziG0Wg*5;gkjwPF)xtk3~3Hz>&mBSD;JybTX+!R#g>YQe4ZG6xH6gw&D3ZOm(La?CG z7#1wkfVXFR-`PJP59F(ZqgUoG7@yeFXPW232AzQ8Z2k%IxvG2OG@F|DH)-|0<=OZ; zSe>c&_`tvZUuV--u&}HKl6of@??kFx>nOK|y*%&%AiRk>hqKojAG9rpeb)c$S>!^N z;@RC4ioc*3LYM6XAe;>y#vGhgVkU3>J9Y00%Zy8xY}%-yH`$GqbIpQ{PaM#@kMTx} zmYHIbORxUsfC<=&!Z@uIz1jtQCQN-kz;EUiV`ko#9?Y|8ta8|;n>L~HZRz7a(LsT> zfJT}VXpy#E?XCmS&Mz+k+^HBL&AYfao#C|aE+U$*si|RFM%jl;;wh39tYaIU7umq+MHHnsNOUK-Ve6rbDOs_lL4WxeCXC&Rd$OqXS#jjB~M+m`7n8=_^ULOTZC|e zE{`W*cC@TYu+PvLLH1V%s@abtv>;u#ReA}y^rt0t#>bPR3RSYj=kX{V05lbBe+vEb zQTD+sjMXcl1E6R z;Yc=QJ;V^p!yRBu@(5DsA{w0G%>*r9vov($@lA@{3C<6s|J^>>r{wCGwN4$JiyUL< zDvo}u-vlzRnCTFBXCB9xDQDU>|9{mEKDH_Cd;J8? zW!uK6n`->K^xrT1SSP!&3=n42lSUrfCLZg=I2;NL#bz5hJ~Lx~<^FPfho9ExlOBUV zN84nKhgQs`33Ke`3KI+I9;$b8F~)NexLFkaomp*M=7)F(Q$&h!VR z6H|kTspNjyKioa~1wQ2Kr)^hw%{?<_&9bo#W{qF+0@F1->eb%A((fbrCbmMQ%Hpqh zahGmZ%KF?1C(QUN~V(~S`G%X<&K6N21kqx!D^Y++06kpX)yiWGjmZpkH9wi zYMJuEpwwVm5h{s2J~AACoBSr-DT@@gSUt6g!|_CF?B#da5HS9Ff{(W>HA@`1q5CWP z%|%VI@e$kN-GIW>DkHt;cGj1^#%<8=nY_B&RM7vLdL~q z!t#C|n{6x9(@n#F)H4i)mK?b+@TR zV_prEU1Wul^5QqM8zZ7HNis?r>7sO^-m&~Jy0?Pr6q9VD6zh05&TMKkWLXfp_=lhc zQ|*7U3|mX?A-IB~ghN)^wJwv*slQN`hiL=(WC|* z4)RTbSgR9%^`eXHDHU+7DCvn3U_|7lyth2yTlUBwm!O87h)SdYF@9pTz=5EcdUfza zl#7izz#!5oPMR*c1n;g%iyfn7+WD`Lakt5?9J3AwjF@%rvW#)_9)Bi>7;$Uq$Py5@ zUrZ(CwWSe=R;~!rbJF=$O3-a))zctdt}5~hioB{9k)Gl6s+>%b{81PEXF*^2{vq96 zC{$uqN>4_5F2Si`gvaHDJjgrKS}56Zr=x>c z3|iuuPU0zTw%ZS_@hYr=-BR;+5|9{k%yArJ)CfpMRScB@E&k!57M*z^|rt1TkSq?_g6%P+Pb1SlT z5gh0Q)iSXgq7!@+?_)9^IWTvJ7S0o@Y6##ztOrgY%$O)|;6k%g$)*g()U@JH;E{fK z=%RGyacrFg2adZZqJ}s;bl&>rMjOkWSHq(Wq!2fvdR4EcJ`9Em zx5k!d6#at2VnoXNa#Q8x<*!C|p`9tmCCh|?Jhqfqi@Ig-pPuSXI8Gl;z4nGX-|KDp zBCbqweFEX_ym5s%n85&LV$Gy3(@J-4D|K$P8%ok&bS3&f&G#Ywqduv}2X6yc-8cJ( z;iFgkXGbT&cTRuU-wWD4p=XKraOdc7XZy^0%g8GC+`P?mxjjAG4nBO+e^cvRE%4;@ zVEgn3{|ql!4w3oXdT>wMHMSw>u?6*njPuk39)!P=r^nle&x5JK``>@~w!R{7X-S-i z-sf#F8BlDSh4BRo&*PY7L3Z1&mHD#dX#dQ*k4GajzQETSm^gi_*YcVDT*)MBD~P$Kj?NV!$8y9u3OLFuA?X2iLXlQ=GH4$R%nh9K^1MLdQy! z3O17zA4E>_T_GnLd}l*1lo`aZoLx+9InBkGnryg~|&sqFY2$U_VTTbe3W&_ie+XV1nGhZw) zGQC8vp$6x_uKRT>R52`I&Y>>VinHfk&(PD~vf9KW$#U9i=xg{1U+?QnmWK0Nz7=2N zyOJ#1WA-TLZqK`lVm$^2q2_NzE+*8;v9AcO4p0*WCb&ok?@=FDAM;^ZKvz!6+g4i) z+yN>DHZuWLp66joWCk+I{gRH}XXp+#Lmd~QhnEF<)7_NlV#jjc0JX^~t+1_|?Qkk! zB6;aWIhjV4jc{xy2Sm_>Uc)ii|i`JW}&qf=^MHIpz$_&IbNren-QS(-sDvk=rTiR!Q9&y08v1$zpxn8 zqB&snOWi@RDI8AOK9QH1SI*fsMXat#q$Kw!EO*8I{&KQ&emt2Kh~2R;7F-4VEfakb z6s(1jdw>7j->JzXJKLuLBfTGR+cJFrDKWlGE|v^BoKwuh-fAjW1L^uB0g;ByT3CiA zY;if5#3g!lxVVhJ*XEUEvr!;7c$>|Wn9Nq!cu)2)LI(NSq}Sut*`TDv^?)WQ0o42I zHqfF5kzV!6>z0*2gFfMxdcM6|tmdW&-9U2Wy+}{jwR(d=MyYUEn=jPcgl~j?lM@)20IJW=h>V4?X4XcrOfhfj~`{$(=MJKAvQ5#ndAobnikn$iF}f z6asTdMi{k7FZ>cgUKpL(rulgHe_DbbE;&z2Xoa2yLK-NGu5M{WfJHaS#pY;Q@269ah-0NxVzwHTCF` z820D#z%Qf*~rNYO!rUkx-z3cHOo zM3k!8eHXr{Bwt~fi50dyE0MMV*cd4|sn#v>7bxG81P)z8c(yRfrW*8`-$Y3C^;-@@;j8ixT{H;|^6hqDko0@2wY9 zj0~5m;AZs2mV4vzsJ9!$v%?omH&Lt%c*n=LhHbvn36R{hbW6!eJAB@-#d_=HoBqDmRsP=94e`;9DSMQ6>6d# zDkAoxxjOtB3;vW6i&Z&w+&SX3SaImduST4090Zr=BZI}seedmkSkR)Bxn#xLgSpaznFW(K24_3gy$)-?_;Q z3la;B;|+=(w^WDrC^D(;b1;}Xtr?Z&``K8=9-KBsVwUkI`v4A)ukLA2t;90^&Z89` zc?f-s9E}R7M6AcylA=;!OZ;(|OciGtAy>6)J|u^CrZha4bhWoSQSB{ZNI@BUdjaK> zXV|qKZi5%m+f-8vxd!d|gsidh`RHYcWJFzvkMxcBg|Ebc+1=BC(t77XcD`_t$m6CI z^_E^;O@Qk+-)2W!V6=d3gF{*R`SdXSpN6}~rGfE1oeW%xRef`r7dzNFSW5E;yC#|6 z7!dKu5S(#3F%)_>N+-$Q$uwN9}gj+d<06k0<>g`e- zH32C&=RK&8oqplA2lf5aePq#{wNS{YpCAg9+9I$+-ekt>Wm@Shreo3&g){sM1H>kW(Y`yKiVf^p@ zeUE;$!sHZEG zx^06X{W04XGE|w`a9LKg(=6LnkpUBK^ZRVd?ObH&vf+uHp0#bm1t*{a$lSQal>qk- zXN<&cYTaUVoTY(PvhK&ton*HY^Oxxy=qeyi9pa%W9VZTvT56aL^emZVDcU6ov89?_ ztkdq_2=M7c%^tY=HyRV2zkW{a--8ZFK$Kb71oCW~E%-V7^Or=Oisxd%P{9NRQg#R=4!weqz*aYuXF&P?Xe=AlXSpWKHJMH1 zQbOsmtTKx{fP7GV51}A`d9B!O*)u%kB0`f0j%ir1# z8vd61X#Uw4J0c*S6mTn=H6Z+oO`}gMHook$ly!3w4s@M`N*6sMgX$W(0l;w*j{4bmK&L2NFuI6scfCl z-ADLBt8y{MsD@ygxyWpmY$h>EvyIZljQawra{$KE_&fr?S4|10{qRUL?dLh2IJ z3Us=0QsL!)@vMfQ{GT$dOEHK0MLx~bk>M`f6~qJ%rLmNqoX13P>`@0DWuEDKV}%gr zth!2W7F1g;ggWJRnXXYspl@~B=FtgU6Xuj`3CAu;E#jI2ied?f_bz0tVg%Q(Q0KE4 zk_MkcvBR<)YqQvJ$O54R`U?Z@AJuo5N$Os)+*XxZUW%SYHRB4V&Z;kZvCD)&TMZ+f zk80|KbU5U16VYlZLfcXF9scp-*T=5IZs^<4?``;;x!YQ@K}}QgtEy$6@tUbuhI4d* z$dAV!S#{5IxQLY6)pY9=!)F_5;Ns~{!uf`JO%slD5S?+aR&>5& zp6~uiqKuGAkqtcLRJl!Xa0V~Yd~FeU{bkwQLeLz3)56~-aE>Q8QMd0jsJ;YCB};Oc z-efzXZ5|))1ge+A9Vk>|ZVq=eV^b3*Z4o7XMY${}G&|hcaD0{)G2v}75YU;!o%6R+ zmEg7)W(~89Pc1qUo<)H5=exkqD;t*kCTe09XO^6l>xH$VOl??{XrG<-g|*yvD?2n|tdvf4Mf2BxoaS5+Q=Ym5)KkgTSt@0kW%KN$$VIJacF@FV{#V(_HrB=~%wSW9Ls31ME zZU(M~NG;(vJZyjW^J%5|FLarG|FTybP2imhp=8KwgD7s(P)B#p@0xak?co|LoktNYlpV@82aQtP*eJn{OKx4EUgdL5>1QdLMOcz8k!uU~o8 zQ+^70SH#9bN9Q*>O%RG`VoS&@#zWe%-EF`lb>yFwu&p4ag30jCXqu*&l1 z4XZ>~{I^(78xAP^e5ySQpM-xailV>${bsDA@lL8!4{!3~ie8EJqUq!QU)FSq)cDpX z?3^ATLepE6tve*?qKkysT})>HEwh=joY>dqenYTkwBLb|aoXMpo7y20q*7~g`U#(L zqAPG>ed*AY>NQmBJNy55#r*pPJzleEJ!Lgq`-dgn_3hvS@)dGwfuiLwd!ILwXff92 zwes$t+QHVV?Z!{An5ZUSz;me4N*!>U8Yk$6tN?yGV>Ugl6XcE?vc9qG=8v4 z-k{JQWo|;|JbziAj3roq4SE%vTVCYHH4WywNWr;Ggq+&NoXZkDwus%)4uiGLQ+e#= z#ZYXtdM0D{BA-i(?VHRg#0Euhd+;6zrs8wZE}GT$mBg}IT<6lEyb7dmgh%Dsvn8B8 zqcCJKyd{G?VvTKt%;2X5hemR$&^n_iC;G8;JT~hz$$T3*e3-Y(cgWBAjE~j>9byeKO89am$lBAqOTr~l2VJO-yhsT1~L7}o>4Tto* z3|bp}Nw=h|!MN@qr-K`Z)0l~tpW>|`b6TP8$kHYu;S|}x3?QA{N8_Uy+Ck#@*h9=l zV(RgOKL~hvQFIhe6neti>~NSn5M~W@ZxzC2EX<=;*CK|BySk1~dvnxXE<&AQquYgZ zC16%zzW~Ovir3hRR@u#T6~%Vwh#l5GlFIRR!)hBhJ--vJSF})o^BkI;w;}+mE%4(* zuwe{7R4Yo}P`<1G$oD4lTp-B@%L84eXK-z!D^JIZ$iviWGsF*>L_K?&cLREq#J7S1 zRn&f{q38-U7^cvN^u@|d^nq`}Vm(1J>?FcRsmrB-iJCj%*jas5d$4Ja-mq~1bEp+p zBeG*yKLuDc^ouBy>vA-tut9Voxygn||1AddJg2GG*;H~i)~$3dy$D=zRICmbh{s`j%9=Y;(nI<@hlkYoWO?{X)L+eb1_DY7Hb$dRXR#_u4j-th?8W ztI&OcJ^!Q|)CcxjwXDtqTHco2l}$5BTg#tYJ)hntZAi?Dd;5ht#?sH__jZB*-PDOj z;nB^8rJGG8 z#Ta_>&n~`kZ98{9iVm02<%oNDgBbhMYul)8iF!~)T3kd6cg#Xhc#G_$gX=7E8H5x^ zn3UM6YIjK^BIb}EjM?2XvT)!jJR&D;R*6iYEjHojdk`(Nv5_C7nDC<*jAoUgP~x#Fk3PKObXj3mFRc>_7S+oxpgL>so&4R)9`!(f zUcLUlho7I9qf3#)E^HL?!^H?OwGJSknl0r0B>iG2DS$Ty$=U;dzNxkM%Iv@*xy%8K z4?Ke(*6269#kV#$zfJbCi^&Xjb@$s9=L?(8rq^)i=G9=7<~J2O$1wj~ z$1n7=B7!Qen~iSXA!^9vfW>P8_^@8Pl+W1|T(PEX@n9j!xqSe6K+iCH9*|oz6-X+~ z_WU=bJ?0y$L=g6i>BjXcZ&X=v=MpSEM5>hCLH-uTDVBie@+Kz`MD|wJ-yW4$`M@EW zT+H&(P-s@oZ5}IPJ?V-$nMOha;`$LpCGqgV&>2L?qR>;TlD>eDXVycEFzgUoVVewH zIJ$Qm8ym?<|8V)WDq)p@lIpMt_? zv0T+;V_X|+m{*tG_;flsq(pe;y%`krq$6AGe6^GOdpn6P`p^3(XK&5ChbnCsEDFSrfXYGQ94rN`trqWbRBoGtFmNH9f^j;kLxsEr{Qk zBx`22h-<-lBHalyJs8`KRqP`3E?VXA;e0nkdTo20Ql#@ z{*V3SYx=@p&%gTW>!g3Wvwduy{q<{GCjpoqQ%2Pw>#m^tnR>OtaAs)W=is*1`s$|+ zJT?U8er$SP;Nkje*hVPAWL2yWIQ}==kOTT0mdcJ1U*M#ypbsSbUQecpsUaLOJ!Y29$n5`V(rz~P&AAhOkt?<56+}7yfwE z>vo{T3QJ2cTduS@BoHdvu=`K&Q}O+eqySqDeo8RBxuL?pv zvOme9NB|)3Cq!-V{#%J>YN8*`*QA4M(G=x*)W)(lF~?H!(sDIQO}jS63p|Nb1GOo` z`b#Y*mF-@76!j7yOYdv$vf~F{)T-%JQ8dt@_c3f1 zL~Q?K=47r@&@j5ce1PBwx{hdO*1kzr<^*GTV>ZJrGGfFO7)N>m4ZWxh)0zO@p6#uF zhuusEqOkbL)p!W{#_<{ikP)`+TOKu-Y(Ao}&3~2|{F&SUH#Jh$p~^xwwXvEX)=g6! zbyy^Kv|C$kY8rBKSBB#p?h@DZLJ#m1Ubx)gL&Lw^a5-fC6R)c2jV|#5eP7{R6L3ie<(*o!-|gH%*?U!nK-_> z*lm(49iSE%=Mu~jmXK|BlE)4n!)o^)VeNVSg&ppKX^>c1_$=)@flT0-3Sjdeu_8=P zx_j}fY3ALAd31{VVT#l93UjaD3kY-Lt793DM2K@G7>*N;QK8fQH8%9MQ~Qa35Xy`z?4gJy9ml;Z`_Wf%m@7iN0fEHtQMv{rMA?N>@rIJ#`ff^rp=cA-f` zaQw&Asxx@R;z$+D6YD#HdpDnWZlsG<`5axG&0F#lFT)!fRqYbX`f?uAT$WWZ5iQuD z%rS%W53Q~^|94N8^@;Vg^cF!RwjUq$YI33t6(n5Ae=ZzLtx3y|m`!$s0s+j5G)#*~ zBH1eawbW-C#LfOMqQm3^%!#NMNQ579bJ~^{2zzDEFwd!2Rq929{I?%%5rTf1ct$Z_43pWav8IsGcLByPlQqSEc|Li1e=z zWR@0HN-RfR7C3`|eoS+8uZ4yIvfp$lTUAc*!M*~Ib0bx%T6@EDig=UWBmQCwgXlox zDuq*kI&&^Ot!(3JBNUc!lG<%+{NZR?YKc+N%o-DNa++5Z<%0QYDeVewzYqS@8$QRg ze1iO;=5_umhr_ZB(S%>-S3m<1->|$j{VMM3d>fz2Q&4onC%t zD9bd#b@Ph!XDNHNCsaPgW1OY+rE;c^h?Af4&qRD19EIi_FH zFK87Galv|DWBDxBQaHDmU#~KK~lH zEz>37xn>vDbkf4j_0{l6_q%rZrT)PwtBLyNbHR3N-dxx@Z`NAgw7|~PUAKQvjg)qk zO}=iwSoL*eQRSJp)A%2LSGbMn@4JS({b>Kt5Q{hc!?P8MX;ho8GW(10qY00dtu1VZ zk?Vxf(Py-&nX{fcb9z8O7V^@o!Pi%bVP32hbS$t>dBV{^nlHP}6QvV`zm+16jy6qa z$WaAXu4jnxIag+j^C{W@!F$1q;acU!7iBgyQ-{1A5Cq;AkWnHpa=J2=LEqQeHIfCb z0DFL9l_!yB556T-C?p)8PtAcs1}!Nf6rAd06{!!Ao8=FoqaBGG`!br@dMiTLkUrRs z_G=#$N@1Ea*KgAL8dmh{PT~%_E8ld5s0Vf*wzcrJ?`dLmYMzdB!^xCZ#u@_A@Kp(=;9WM6@gC_rwH#WZh?^W05%Zp?LJyBYKK6W6CEju2`w`CB2YBPrmdlu z0(iFB8apfh; zN(3{|^PvO^WW=PSbcOtxDQ8R5K`)jMB>rMS%RB-qPsTMMg!4Pvx9{R*%i>s<^W z#r*{{L=Y6X+g3tbQD8(Mg+E{Gb{3IMX%^xBN2q7DySp$iE1{((I7xhwSL19z{GB1r zhPb}jKKWbnWB+fMoa}J_r?>qL;t=;Gw+=GAHlw{uh^f+a4P(ccn&GeC0ImTm&M8lw zl9p)EOi6L~G9m^U$4vjAZ;Q0^J86No5QJRQgQBmmMxzAq%e1*EhsgY|IElmm98KE7 zFSQy6`MQ7DKQUL_u8u%=LT+?!^}@m}>sFO9X|WMA{V_P?-s}8^my9`JjH&1 z7d9316J6@mXzqwBO*~I6kRl9ze#{4HubgE0RqYr$*RH=853 zUsxPxDX&8;D~wzN9my4u9g)kRO)x!UTxVN06SyZ{8{xw6C9QlT+d!JI^Y+Bd-r4!t z{+oW1O$Qroy{p_l3FqUSI=(hGAJb`$@uIc>5)&1_@AnF?H)z>X;J0Uc-#K!;w|D;P z;OG^25}1lM?pwAwcrsWsChT?f;PB{8|BVk9I~hDu#UmMxYaBqYmvrlij^*!9s_jQO z1@)ZL585%omI-&Vg~{h_u-XoL;!m;>U)8js;mjpbXd;HEXGbUf-54pJJBnm=pu5hk zXqx;1}|(upbc5tG-9>k zWIiGfV{0%EQ}^Ks9dWP_XM%*bUg9SJ#|)e9^}c@bwddwgjnhF!FWV{<6CbRvo94g% z`{vi094+UiqSj_9rDohFg(X;%Nj3t|3U)hSb25Vf1zydH0420d%2)oG@v!b6w3156 z+^pqirV_=-qsvQkId*X2VsD;wt*b3b>`CG)qqNq>)Z&+O)iyEj4rLe=pC4etIQMY! zbR)rBGsBVs?8aAO$10WEwBgW=1!vg4%|wh z$Xa2Zx8VbnGAf%^q~qLhilQlJz*wO?Pr12CP9%^kK6RDG2z3j!LMWg#AIv9->}d5} zhMvP^C&B>hWk3@G9~T`PWyY`>E#f04s|2N?fF6SCEdK}@>~R%wfmt<&NEoPjb5ngH zSSxe1b8R9$4uSZn)q&5Mmcur%vSSu(pJHg7rw6D`Wnv|m%SBkK%n4{|V!vEGPZ z46QEP^*`*b8E@8Y@VZNuuQ~JirI(w_X&3`nYMS}u*_1Q;#HbdyMTGR%(>vAarMt>7 zGI)|_m}RhJTPrhF^v8;I(8BA+5JdoVr)<5AnoDTG7KH6Wt$O)ffVEb8(^J`Q zM3!MFt(I04x4-$Wz4l%E$#=Rs6@J-MUo!F(J^kvt9_50eKi6HE@4ur@Ih8bgj&|C@ zsbeteHELD06FBd`Ii8qX=F;=hv6~Lv$3r(6yAs?dBR4(LP4jtgR5&b6W^S^Z!T7%A zJ|%sj--Cg=dBYEA><0Trqc&(8Q=s@4xJXhU1QUirx=pI%O0;#IYrl@EvHwF_UALOb zgCM80OUl3?4?o!jWEvJ)NBFVYFp5apjjbOx9Eg?ZqAcfFAj+dp_2~LB8~Pb^1;O>^ z#sG7AdL3Tp3k#@2u6#EGcAPO}0uTi0wqCJ>t)(0>p-`ntMecNV_i9TJ$qISFflyNq zxu+?}CB5_+8`_h&+z`QTcX1zh{8IWtMI$Cj^JT8LCR9qHLi(V+zH zEA&>ou>6m9{g|^tb5s}RWQ~TBa~u=QA~&YbsW`d2RUnzsQQ^~!NDr^kRHdoYddvv9 zVM5a!lx*Ism}DqDcQ2v@VS0i>1c+lwG{grU0GtO?q)>`TpfLY2i_fm#&<~v=UQ{ah zv7Y!Ib zDu&v$1v&vy2oS}0AKI^wxU=~BQ3&t9B*t!F6I%xGJvP8j{aX*VTPk2K@ezbD3MzTj zOClk9Xb)}s&xo=n`~mE8wC^ zB$}j?P=HC>&dldd%8H6o+?|wT7EY}N&-%5}Wx27~f~W4k1%V27HLwTu^Yq!_3PRvw zkqmsCYr2R&Wc6e89puRw;{PTclQ_?)KYY`m07O|mLA1A^N>~-OtAdp{q(5Ei)HA<2 zzkn7j3NEF0RG5^B`R}%5w@0mfL2k|1_9O#uD2(hi&-Zs#rLzcHp}1oftmdM-hd;KB z`1DY`J{c7{PhDirGue!;<~YxD2|TOI7%vH>bT$Lq{F`*#B7DQ`sy4e7g|$Nl(~QyY z>n)s^jWi}~S_Nb)u$Aw#j0|6<&=^H9GM`&0V{1UB53_j@%x_=?$)ehf%^erJ2C&@)8s?hJU^V z*JwLVjsY>W<7xsR!vx%y4u|0Px?ZK=r|}VX$OJs6^HDn4pnM@>tTcy}y9Glw)Tw~L z;uXnxg8-laDlSK`+4 zf0kDzsYUaGzAjUTM3V54`yY_@l(Q>_D@qA!zRI#2Z1T38yzejq5lj=RJPpkql#`*& zH;7IhJ0LC;!*pV#$NpUk-X8FASIPBC-?rl23&6~+JHs&Wa}WaVdcAui0}u!)4m=xN z7dc4W_vq$!r>2|J3n2wcz4?ZPW3qH{KV_F6QLp+%DZ{X{Jm9rPF!tPcM+K`U{8HG9 zcrLa_qfn907m7I{^@Jrxuw)aY(=hrrI~6nF6G!$a{SE_d*?5H+VS3gIOBG%u<}x!+ z(JXs6wN9eg5%VzSstnH`_3%_H|KuDJMy$1F->tP}JWz!j zCL=?tY^~?42KO&T=n_Ok$i<10vdD0ZY{%q-;~4bQSW&BP>Uf)itWZ|LYUe_hx8Oo!#q9y3p}Sf9FPyP6!IS{9}78yD=N1UeAUWf z`@}F-)$B$@r#ik}^hi`yIe?T+Zr{aNR#5MRw&F>KQXVqywiVi=e7s^Uot2A|BLxCV zd@r7r_E+d#WFs!zS7)X5Ygm%H3T^H6@S|!!@Mbu(IRaG<(jXxc=ZUkx5dsF`jUSHr z+v0|0JP-1n#)L01$J|AWTU_Hrv-Q+;-V{PVB_l08QDT2>_Laq>1@pbuc8SC0XD!^H z5(x10dcs^umaxHE2&~1g5WtsT_RoGu2BQ>ppXqc831LK3tf;P2WwQCZ;qrzd{$e(C zeRjALYh0g__rcaTMRLrM$8XI1zyqN@^j2eGxa(OQW1tA=n!!?)tF&zPn>hPeDE&1D z9}|2byXG);spTrl%m+W_3azqf>v0A7+cqt!GJm%1Wo`c0n76=+MWb&XPqJ~#)iMX7 zlfW0+L1}1;YP9SWj>AH3*TRKLJ2&V=#~-*6#Hx7uIjl{ImaG^Dn`eJWLL!kal2WeZe`ak=zpOa+j^F4Vptk_+0ka9HoY@BZLwHcn z&bQ1dlSa&J@G{p3avO+;xM(C)Nsh`|1wW7~Z+qE!D(MOv%F!$v@e*wV-yr^0Y4nXgT>!}dZ}ek{QyxlsBQjIJ$pW41nJxj^OYj+jx^7=|Iz1DMA`+@6STNg~N ztJemHQ>Q-txrACMVt+1aZht0i?k`82?T!Hx+CnV@ra==PC*Wh|=%vs+r`*{(f%wxb zpWh*&tP4vl2$AH<@{baJtoX_@k++Jh=8mf~n z?~s-^8%0(lAfs-V^FL4M?2_uoo=2}cPCex5hHd~fB}Kg_DRqeyh|3W!oyw zq!UlGESJvOiaImhz)SxTwx>4Bip#Mx%?i>zoAmwc$8)ww7B+QZrmMo4Hq*)k1attT z*^GLwS@Tj}#a@#Q4`RZKFyWyBkpP;3%rV36kP-rbX#-_hM4PsRN*Oyt5g5)Jz>K>_ zP{0Z&Qq^q3shAsg#j?5}O;xn$Ww6u~o`Mcvmbm6M^ePTeCvulmNe9#meMKKb$Nd=$OQP@hSB1h-r(xXUAa z*{iIIT!xW*w)PlrUAgA*Sr1#2Yd5hh9lzA~uhwky^XbONm)wB))m#>~Z}$72G*_W| z4A=f6`g(+|fSSw~=>BQD2G(@vWLrYQ%E4epI|b6(3aSCT07J(upyXmA^@=@g#RX4s zjgnBd7R^cytL*wQ!9SQ-3!CEBF`yTP$yI)u0+D&AUapWKzmJ{LuXp}8QfW3)x%|~QctL| zg%!r_i1@JwrIu)dw9L;l|y$6c%w03ki|lWLLDRE@m8LOg1}0k z2Ku^qaxRLwL?Ca{>EK$t(h=bsleJ(lmzhyW;$rn209TY%V zS?C?eNg72ixtFdpos-BPy(0O=sS28c7|BsqJl$-;8Zv!t5FUL=QM)`XmJ>B@ zl#>>FNSV!iKUPnFb-x$yzVAJTGQUEn-zA>G)kVJs2Y*wk9f4RhARIz6s48+(fYN_F zN(XRVAX7m%ze|;aI^BC#*%gpOk=PMlIh&eGLMk8*iu}dJNWl?`d4;Trp?$10#E?hl zgNs`^CNa{h9Q7K`#uP6b*2BP}hp zVTVA25|?dE-3oZd`E*8E=0I0?V-6}ar544GKNZRRt@MyW&;oXS}aw<{y-*Ec|o?D$Yw9Q*tkbh`P+KrINCN1QNguHLFOFPXSpIR~DMHJi- zOz8vTT zXVjHD+5`W@33=HoIGYQAC(P80*Ffd)AU|;vh4#!fTBj#T*R3@)qi=m`7OGp{4Zw7R za>BqBjs;-U@nAii%LIsyN0*lk*>M=^OzaV;eWyt#fqOO;=dlKDc3c_Gy&;|*egHtd zIH8tBH1x=E@J{)O?N|FlNcr1Zb1G|3DwTF&(yTu{?rrztqk5rEO<3KXg0Q}R^GQYp z6YF%{ph{oI1=6FiFN;S#`zh6Xv$|k>X+4I?{uNt%V*B(Ccy;yMHTF)Sx#K8csn!iA z5Eir=A{`KfrJwZN*wonr_Lgb!_XQE3tMZfv>vU7OIe_ zM@f-O+EF|K>s<@Za(1$Pc)H&|48X^|p!eCd9gxbX7^1;cS>tLcXN*HV$*OY1zGBt= z%|$t~#7o4&bn06o=y8XlIM_&>)6E3|9L{NlMQL*=tu*-&Qk9>0w}6oq3@b>ch5^_` zE@z{S~xxq!Ijng15YE4^)b$8WwEcl?`Ln_-+T-cFd{Sfk>_8i%-~J=tvHB?Gzxq& z1ofyHMk)Ae+W{l3Bz_lUIgZ90VFZTr7kr76`nYXfT|6X6L2s9IyP^$2z}t@FerO}z zmb1~2AZ;<5;dMS0b(>-ote6`FcBzSKdjh)v^XJ*^Yrx`%n`ex+t<10IBebB_KZ|=f;o|V$i0PIe z`+$(KfDh*ct!o64A2FZ(fjV;H74C8&#e2Q}^5dBimNV5O7e0^AV@PY-^U`m|<$bfg zq!)@A4rzG*R0Q1g)lCb3ZxrNj z-whrEvfPH%(tGm|E6Koh<5~%zSJKN~^4RaF-aNmc0ItTi-2T?J)zCh9--v3l=6>VA zT2cJ($h+vLgbF{B(r?G`0Q8crNB%f5Usu?s7Z$CihMV#F&Ck~4WiKfGLY0l@o@(nN zT+3FcO%W^?E$0lD)P1%7IVe;NBy-K-&iUJVnPsOv=oX&=-O_^f^-QchwoG;0jX3i< z_|Pt%2HpDfkS;E>(Sz=W8~$JaMVkBh-}RS%Gj>P@m#uE{cJbIlAtmd08-3x3C-YSEZhJ9O5n^dr4HfHtgvBooI8XX zuZ4VCWuwc6qlG1Rj96IAf-t0oq8s_vfp^25=(Q}Dj;Wsg?Fx_fK&NY%rj}RGswzd6 zM{GMKJcYh}Sb>#bE%<&QIAYJ*j~x40dr2-5cd?)sSP~_JnNkh?V}excAyXlxxYx=L z-#;wG$*7fcS~c4mS$56sk}3R77nh>|MC(940SqH)76}Vcpdrah@{ye=$&E;w+1x-~ z*K=&KW_6ili0oy-rvO=uiXwo#+1awER|#vr!>IP0XH-z7s1(!`X9?%~kwC^h@qTz7 zWMOY*8&@02D(HV#xw&T>B%EMBTn=`6`RxXdo%$G}gyDc(**|UI%uv|?SDQ-w`v%V; z_MEdBh_D^#tCQ*)C24a?$gHqIZG5*uo)Oet_Pank?4UF(M9uetS7x_#UgR8#=+NLe zhj$G$)`qA-`y1lG4imCI6|mf-1t!FG#OE^N{bn1lbDT!nAq0a%ZtB=MNYO#=)nIBt zn~#HD3`Y&4v*uQ`wR$PzH2xVwJx#Mofo6B6bj_Z-k`2Q_sbK6+ih8r0ft6tod+05DVaR*3pnx4i&IK)Amy;eQKV5D?!$8Mtiir;*x{ zp=hZFp1reH(A>)$%O%YVD)?>WOPqOWneY6`eJ6x94!`v8swlcXHJ1D?(kB2Fw8~BR zjc)47Dk|&ozv1mH?u1@Cy=B1FrJHwvtDf8eYC1!<W0oWK9FfNT$J|lO!`BBw0k}Xz(kzYV=w|Iz$66>! z#llI`;Y%-@;l}ZE2cTA0p9_=DGv<06>KqDL)e;&#lxhhq`gHk&iz@HtR!d``=f^*0 z_wD2_$vQaG<&@cJsin1x$mwY$=?hA+fs^FpiWO$)*NF3m%meP`xC{hhV38599^J z_AaxT*m#Qtm`1RHgOXO%(}Gx_F1ENwE@rfs{BMpLwIU5QTz48#TU{xf?QXED=1nUd zVH>TQFW_H1`y04@$|pVDZ=-spF7+y00Z-ob)3HBnIRaBLm`_aMs~Lp)s$3q}IMDLF zACG{maMaxTQ!`bmubA&Fy=M+Dz@3?Y=Z`s8kQ!yFG1| zU1g?A?Co9eS4h%qD}mxd=xj%c6 zvUt6|K=F|N+f(wSH?#$a7+4GD&jy-?>EVBQ;wgEz9JE(w(dndkSG|$N6MI>!iwPM^M(^?x?xCe zAIg87wJ$smNnJlW|KMY-+V)>+PjXe@N~Y!vITfF}KJfAo^)Fu=aYqJ^=d>n zW@6J^p1`as?dwA>xfOd%P{FK^$!92|J?*bE3_DMyWo*NCj0=pzfq9q`bA?B7o_Vj? zY~@v&W4($8CWiamRrj(C)eme_kXfxk?w^E`)f!#4V}S<0)>3%jR%9zTm^U~9%+a1_ zJn{Kj4<^D}vn7Wg+oOyHS9R0?J}v6)hjfycvr0wGQaBJnwN%piy4fjyF)39qetM2Y zSRHV2rx(4BtPKfNIwuXtRnb%YJT7beGn{&f(}_;F3JAAdF$WN}5Z!nD%NF<}R-$Ic zN!AQP8avmP7jXFGg`;g=Zu1$!EZxJoXw`68|I)#q=5TwFDNDLix3-t)-@~28d}deEe3F3+?0k=P+`oBkPA9TNr^?k<1xP~lJ`bO=Xk-vdTur4uxqVS+w3QLy!3dJQ&S@rqC>T{fSiF=eQ-+14|&dSBf5SDWLWbCM!h zps9cva57(FM9q zucdo|svCal78S28U)GO=m$;v0vNzC=7h7WYh*!k2iu3qRztyFzI^2Od<{LfwAYP!h za1=D)PpG)OiY>>l9E9C@-H97=bbo@LXtjw_5Qd)ss21YhfKl7~Q893p7s@ObIWu79 zzKl_}y`z)<{_Df@ANzlsv(3O2J#rHEh)w)4yRX{e%tZ`8^y4(xJR1+wTB~K7rv(P3 zN#uawiatn*`;jy5G%Z!QaK5^pS8QJ;$_v;y&UxNRF7rEFQhGVbE-}hy=ZF5zkE$^U zRdUK5hzqXDWHuhAl0+K_C3z@g#>0xBCmGX?!ktuGtITNq`t$zD+1u@dcPzdp7rEfO z%$st$TvX=a*qp}<$<14>wqOe^JhX>G+g5#*7OlD-#3Efi|FTe1zsz^*O82l2b7$y} zY4d9Xi;)OM(N%+1_gd(k9^7s&#L+8Xvk%BPBX*jYa&)S^H~pYt!z0@L29%aFPb;T( z8*ixUJ;+$w*dcF9ms`Fi>>{CA;=s{#V{Oyxdr`pw=Guz9kznK#a6yWZojSBDiD(^3%^sX@)4^ez8Yl`bmqxyRZ z1-R-!M2WqefHqG-uCfyPxV;UEw}DDCOgRc6{HGA0IS3@exLm?-HpdvDRsdYrP=%X{ zFxNz-LDckjyk~#^dB6Y5@B4?l{l9uB&624+fW>yYJm>xlS~W_c3FVWtkCQ32AF@9!?DJ#0f@Wl|twgg#hJ^AVsMB8#cDc!A?O`K))6RnR-J z0!}n{&ubXfsF-`695FyWX!Ba6x`P%(m&capRha%&M6p|yHlNzc2%h5faI7J7+3G`w za~Z_jVq{n>7^PvZhn0mC2&b`t)TJZLxj^c(!?yu@vByE;jF~;XE4%1u(SjALv#gS#vyr*UTLw1vYAg%qtV1Dh#nDb>q@oH)3YqN zFGHpX*tSr85_uNYiZtpmmeXOx^%ucC7*j4ZcCMyqs3{p5v5p`~GpdT;7#dp%R79WpF%RxPK}o#z1J1{r0&7BN>{ z#Z$2szUEP|3|rJ7d@XPHS2#XbhK({i1yg^o8`3Y=726NZm2jPn#?I)dnT!SL-H?>+ zNqeX&Awo}=3B1`gLrAflHOExH0^AZ!>HeYl*5UTS`QF>Z9T-(B7Q5F;{@kf~crgt9 zq83;>O#ZzSnuV5aAOp{#B>A=zUX0klrx%V)?-!ujd<8R|V;`$lIQCAmJ(;BUrw|w# zzH6gX2CblAJ;K!Ef}9iAXBNb)toM`j4WkFPT4-%!kgPrI=bKu4ugsn?`vme-q(wTq z|Cl|b)o*y`ZEbFTyT1AF>zm)LxU}+cjTshgm{)^Qn%`6iqex0ANqI67$K}LKmD)m{ z>6z&QjHlb0UO+VQ5L7_sZ*y|zSJ=`O&}?3m^4r47PgUij{}1z@14ELEUHI>kO*~t! z320?|Ncg(unDJEI-~qkJAg2JOcDbBQLHaWSWtKvw^YW5G*lcXA9y^OBIiYPy462!Y zyn$vUUa`ajKyC~>x+3|Zrnj&@PdEOw(ftm$*wc-F-}nyT$_JxaWeya|Leda70zz$h zGX|%l6+zP!M5RNRp7YbQ?XxWo*^PI1n2jeHxb6-YjLYmD)8}lc6IavHbs%^j@~=@$ zE;J((fPHp8JZj_>j_}WkWS)PzvGwPTO`Bz^K8&Yi`GJ5l+Vp%Wr=}waQ>(kg^O{Pp zr$K=&I>vzhTmcNjt)2&Lf5o|b;O4@@kP*vJxq*)xt3NF5VsJ8&3rhxIXm-7t7V8<) z7oII>K~30q8(qTvOW__&5~{&g7W^c5#HL^nV+ShKSm0RX=<5uB7zmz@$D@3J+Lfx~ zQ2@~Be8?e-F5kN7E8d7VdBNEl%-3 zmp5vYs+swZ>0rlBlQew`Dx-^xu6E9Z0^&JLBc#W=RDipzFsWpVV+I7#qTnznY8}f< zpJz80kip;*KCj?+O+QUDtutkZt6+HKvWAlrt;yVEb~nhzl;Ra|e{w@A<<@I6JwdRa z6#@sySPug&nCoT&7?g8*M*9;lCg~V%byTQuK^i^Jq6OfmVd3&!=aXT>x0{F8^m+ca z>}2}*^cI(&`XH-v2zUze*%nkdeA#U;9z0(8wgzM<}0Z^5eSfTsjP- zrschs{P?76_mWj@x;=>*H2v;?uVs<{!=mF)B^{s)RGRK;#v|Ofk#8jfLp94WQEC8s z5O&4G_J5z<-@vCW@-8$an%EnqXtG_A>DmIW+Guf+4+-J1T z{vLJr*_k!>%&Hk4*zTsc=6aQ|5duz;{9!bRrd2g#0ojH2dQqdrA~jfkcoRqWXS!pU z5ys9@$x6oNP;J12+q*^h8|iz@6AUdG!4-B99{nNt4*`QyveUIJ!$CF;?pOJ!p)se> zP|Hk>BY4FyHKYP`P{THZGf$HpD7@&F=BX;=A{YaIh{a&2gzIy0uhE~(OKz~2wDPr` zwXNhyveW*ib-K3Ib_XuWgPA;C@0yYAlm*=FxV#-TNjM`Y6Xd}45$X*x<8U{i@Od#C zyw9dC=aNiGI$;d6d%8gh)Ef@ys+smFrffxf9&1g~d>FZc&6zSnMv1UbC~`2rnt&B> zD7aZj94HqMib$~YG1m#QSh$hlHc9cezJfkjm6u#rB10Fy}IonY=*^OY9$DZ=i00%U>xvB$-~ITz1OZDBBJmj3>NrIYjbqn7dbd(boJ z!hK!xrmjf;NMpd=;x+lvJ92)X!V>NTd$R?aOg*mrJ@<(ub#YViCeL4_A?h3k)A&r< zrSp2Hy5T8jK&-pK+!N{KBA-s+WGhxl(?I!})!o=>4wdnEWlitL`2bl@iS&z*R7b&i zyq44H607rU(=sPShhSuu0|(+hn3R=0(m;lg{{bq93Q3gEi0uJ33A;xG4LH%E<9*;( z!_5a?cu2PBj#+U18~$TByK7_utlkyZ*`H5;!A0jfD$Doa2s3w|YYOY}Dm0pypor&w z0PG@j)-|Tvsv@eX;i;I;@+F|DJ=C(1g|z8l-cwXiU6wN>mmxc|;U5C4*hf>>?t$CP z5fw0~EoFcF2I_(NLa)+~MQIZ}2d$@>28uDH^J?CB9bRdOJ>cEG^37WEZ?cJ2spft$ z-MC&w)2FE^n(kIaKippVH-4S$SEsli;HSItZ{S1`f4ONM&vbXNrSsG6H^&G4Q&%VU z7F#BN8x_hsF`OdQkQ2(bINXxuI4f!#;~^j0n319DHalnE1Eb4_6oN2o@QL$> z&=pc^+^3qi9xNT~W{UD#sU_^TKb%{bRqTHL$2^|E8TO)e6}+Vp0VU;x<*qt(U}rYz z_|=cb5uKZG;-s)oAi-xji6pSZnd(SWghTB~23VaNMSO0 z^@g75hKlSTonkcY6hreLx)!KiBz^J9n^eI1w)-WXN(uIIvEUQFBd3p)zI$P|-Y))% z!02lqoD0|MYzogDk~g)Po|NVESLGK&s9gx*F#9e^caS`sU5uh-{4~dU%IsFaw1a0Q zZpWV4m4=k%A5pUJ7tqWQJj#T=!_)x6=vML^LWO1eVl8#GyCt}deF))OExe&}VE>^U z4Xf?Z=#AmD?y?H}*!_&uTo|Tm_oDTo-RqfoCTLgmfPF04w9Kh}CupQJNffOwc1R&q zq}aU|GR(9Wa;1&36zwTDE0n_26--B<0%AhFv68rK4h+vxTMLcS5#kw}Uh|>I6%woq zg@swCCu+6xcP_aH%x(*d&4ae>zznUwl+0mmKLQP11izQ%Q=W_8)NWm-@j;5P4Vh(# zhdaa^xF{C5s3Ty{%$>NNnY(FVu_1h?4ChvlF`AU74vJ08F&Kk+OgE=euQDS5u;=X5 zXVY0_S8#?l5;17zH=uL_TeogYlA=L_FbBU(P)#?+TL{$Lw^lC(Shh&z{m4I_d5sv( z_ly@#v+9lbtDiQ$s#;%F?bTp?WYN^t03vFeQl6SbBXCCqgH~mNt#fp|cd-5X{CI2s z^rZhf2u}%+PtUB1$lLhUhP$bR zr4~ld4xEwoms2Bd%7}Tw1B>Tds_Z+5`m z$cCP%i;O3}ncFY)eOim8s#BU@yHB6JYuI|i^}r?rlSk|*!Y#2q93G9gS|2)Q%b$Zk z@kB3ct~{l6hNP879!>R$SS>IBxQxN-5@2GgNx$4;ksBiM!?|qNpBV{{dvD27$1;^q z@?bQb=olZrpD#Vr5QA3GRMss zVH{BNr)NoS8p?;U9MzQ26W+qb4v}$wu2N6|@u4@Y@LD>*A%Izct@+FT*$+o=&ytg) zU-oz9AY(J1k{Pnqn6G+nTc;Qxlh7B9EJFkP&fHhWyoT|55?7akN;5Bqh7DyKh!YnP zS~&hg011!mSI7!x&U0mE^b!R7xZ?fxLTEoc?QR|R5LWO$%EI2yvnGe_3j#YMjg_8Z8q;&c+)%l)e6-&)l}zru&S z%Ap;wbfgovF2#WnjA|PlpnV|>phDHw?Ro{;?GcnzHKQx)eOW04NmhT7jNgAV!L9Gw zF*~^4l-CYbmey{+A^&l|DYH$B)A#v!``X;6FB+Qyl@_T+P1*Gn3R8VWl?Jm3K-ax+ z^>^qA+VNAc=c&@mQk0^0hD^ghmJ&d#xsRAVc5TxGLixjr#hOKICf?;^bXpjEg+!ueWDA?5iC)ey1)&=brka*=^< zh5O_v!kawa3xd!9A0R`5*vxfLO!bYq31O(!00J!B7K&0QwQlvPadpk~_5bmo*`$2o z*EP>UP(zUj{aWCDGCd++oqOyZb7f@N3e z;*zLR6FuNEfWd(f9L}s~9ntl6UYWn0wHA`bfV^i*QNoVb^D(lB!XOSW9!YKoM2A>^ zNjFjeZLSl_0lq0+NX*r_N~|gPwDL)@Qf97m@Xj??8B&Q?2S=}*ohGIG@xh}!&8GOx zIRov`c9I;*7l!=IkbUj@s2ebJfshm8etdBnV)nhNIWcgpcS zTlt(c?=oK^v=w@l!Cz-(`{DBfUuZe51SY_n4*)BS=(2@hN*YRm94lv1!YpSQF00TgCnu|YHY8KDfdLXUKK2xwkk$0EnRijtGm0X zGVTg09S|j-0*pcJ4d^*#$1iXH^tO&VJh7b|X-zg(yMDe{N<|_L8UiNdc(B|iup(Z~ za8yZ|-HZwuu^wNnjRAA#pM34eUIK4Q`}bOVjCtDTGCO>Z8+GW`bod(JS7B)!R|*@VI900IO`X@W4KYK|M$%X#@;3Pi!K8Rg~*gfz89H zc<(;P@FJY#aW;SmoB_yJ){){vHX$pe_1@92+R#o!NbV$ub^j&h(!a{{ z1MXX@xFBvtg*oClAyA5k{Q`+R(jdXZQ=^_<;O)3k$Al8$1bmwy z4tPxB)F{6y&_3o`nWLsLt-QLQvKWs(`XK1?R`RmjFONHvH0f*>%J=gmaI^0=F)|0^ zQepeqi0E_js~r^56F;d1>So zb%rKmTXqTEBCvNPZr8>c*2oafPT@vjgjzEEJ*hF2JmA=twasp%R)yW%L{yESn^;Df z4cu7BiWSL|+Hx%0ZP9gm9e2`2dySSu^nv$00s}zVx|%@Nj*ES>Qh&h zj*T27cw*0zkaT`-6{YG^%m?$o3ayZr(pOu6K$)vT=A5uqOkz5eIsCp2@+xphcw13-khsG!b5_vVXo zdJRiF%n?SvD2w&L3RiK~H|7$phd6wlgFRZ%E@?-5J!qPKZ*L^~S4BA?oeGBL+bDGk zE-Ao!5Z~ke#uNaPG#`=EHpfVL;l*Uq{y>u?5Ga3*jWNN4;2DS+-3~skXW4AL5fNYv)ywSb1pNaLS_&wr8eD$-%bISs-kyu zJ7hHmPH0iU5-wWQV&+!LgFq?WWyRQrhgTJaS&r#mAkFlz_OBdelXqrKZp~mR`oYY2 zKCC77qc84PuMn;5xFqykEvVzaog}d7jS&Ytd}zkKV$=RHM@J2?vUEjhQ*B<519uBN+37M^Op zV`S4WwcGz&H`l|r))(1U&fVl6l-oMNBQR+hyd9Zg(O*7ZZ}?3#W$l zQ%_Kr*epmhqxUjZwx2Q&+KI~!)}k@Ir2e&oT?8elfMIKB1hu^mjef5WOt8!OuLjbN z0LAsgFY7`Jfp(QJ!RV&4B1BDum0C=)4(5MF5JNvxOl8fPDa~Af^FZ z0zXtZV&wpW#mpK5SA?!xo{2>P?IWXts5$IXE$z_9Q|T1P@0+Elh#{k{2x1tjXE784 zmCD1RG=pW!0{r+XthZw%Vwxx#P;Qt!0$zl_uk)*G5Mt%IG=qNLPV3&(osC4~XuiKe zX+yUM+}|%zE?Zx>@>odht?(>aad`(Q3hq`gfDU&Bop*o^aH5}p;)9;mHR*+MNQjev znTY z|D`l>Rhmr(IK<~gc6)x47g~m15zkmh=7q+~0eh1d9wE0nY>WxxIB`oq+$MV2ix}y> zJp?Vw9s;G3`I~#~`D?={%_|yZ?LBHNpHO zyv-|ScHE!Viz}=Arhtx!%Q3F-lBF22;P24Q&1Kthzqt&IHUoMQWJuS`|cYgN-2v76y4( zhFRqk_iO+Fk7Q^BO5WyM8B+_CW6%>?_+6;rb=V6zZppddY9q^o9n)-&cVTIh0c)mt zAHiQvGtmpJShk>l&h)8iU_oACnh5`nRJ-02qFnjBUBBdMa&gaC`9N(d>wB(T;VoQb zc}dgj3jl`53;kzV>7#kqPCNl* zq;FlSQt_vU<5>BkSY_iPt)GPAV{jvUAC-cZ8xbu|G5l{0|;R_SbLk zVpK1b*Qf(aQ@MpMh;Z^e&%@`5iXS}g>~v1r8hNEsc$&x9+vE8@RThd?Vizb%k(=1T zCT!e84I2r@GJuthhu2P8=Ip5J&_106UvJ7A^yZ%=QKRw zcs3cA;zp=^(@1;B`_BO^q$Bdf3~~sSKSKr{lJ_vHMjosu#9+|J{^cogKTb;X(eBUVh18b|0(jey33gJcM)8sZ~ zhd{IX(`=nQj4*;peE!ChazN=>^kknnJDU$*3@c2Rbi{uSZmcikKj&R(XA51T<~T$9 zhI2IbX>TZdlP+*%T8a2w;W&tF*5Aq4Jq0Qgt(Spb)e%aT$rU$g4wjPpMRSuYurIX3 z+8jO3fqAz~atZUGFkxR;5%KM=U%3RO;4}mOva~uLrul%=9pqhZD!TMoGXuvU(peZL2^+AAznug~IRn zX7^woK}K4UG#{b{09 zs$;^D$hz3D9_voTzpZt4<0?~w)N8_w&!)kQ};#WJ*oRPUwG@}xOi`c z?C{#LmeiLvWugPhQj?uxgrKE9({z-5CmiOJS!Sw>FJ!0+2BSqMPk8q=Cc0QXg2rv9 zPeR?@>6g2QoEpKlN2mOy)q~i#tiBUJMevGKh7R|f$=|%}k2Qj~X`~W|{n6-h19yb) za%~j&D^55ff10DM>bh!b6VZO_a;G7tmeEzzBhQzs>YKOWl5!I`Q1G-zg28`Gj@cA=eTK{LZe z?JO4fKyo$6B=0%EndvCL1dT1 ztYM$LVMNl7Y4>%rQlAoi}Mg zVj5B?@D;>COew6xaKw-e05V&hW|^!D%sx!fYm_Es@e%F~vQ_Oj8LE?GRBYO*LD7>j zXzOsS;UY*9OboTdMCcAC)@EiyWIYOLVYB&vIG|f798eKXbaR~{nvuB~B>RmgtX}|h z6X&CZC0uu7kd^4D6>4{wMHhHoc9~;%Z$+6H;5@)Y3I$Y{=Px3key+f|C_;&*{~Dw6 z+|&plE6<{+*i26mD{bi*92i%xx8)0;*o5J${pB>QNcaNiv$76_ujw9$)jK$wQw{0t zO0s01JP|_NhvKE%79Z3femBuTa8{%h$26Vg=?sC`dYPi? zACQ*(#2_|93FBYJ8ln7@9IQ-gayzyl0-5qzFc=E@r-Ca7U5}*>ke-1;OBy1zqeXi} z8%#AW3v@nmUmykdM(A5Bt>oGSg>z!vep_khqV1f2HKMXzWNBu#ySWKi|68j}RyiY& zOaLh*o(KEI{6~G=S{$G)n3#?(w@PS^Y40zqk^n@KVIdk_ylk?4xSL$)I$H#681%&4 z5xcUR2IY*h4BG?^eEGsu{J3b(QHO92aKqRwz=_c)+d);I3jEmzviswcT_bFLvrF$t zAY)|P7uGtGv*gP!PBImzrNYaSmW#wPV$9msw_@Q$uuW6V^S@a-<}C4Ca#*sI+EroL zuwr`I+A^{Ve4~@Bel;4+Ryz(I)(-^xOVXPC=~-KX)tPiswc`fu-Rdnb)p?^~8vW-?#@ag1Pi( z!%RiOa{-Oo>HLV1k>R-PYo%)q)mPE*nvdpY?)AR@`{vgm>3)2P6DOW>!79VDI)Rne zYrX3-wh3I)>f-&Mo+$zUGyqM(&iN>;^Mi9vJ?tafi}^}6UV^ie?Zeak{^41Z z{=?TuuBAH#&!M+nVpGVv4RgZ`u6a$}tRVJi*48ec-|S~x1Q z<_t5OT87i{*xfGK9T3o+Hy}Nul!CTX1VD{Jwd^5*^~qyoZG2RW?)Qgx9dUuSAp9I8 ziFK?~zD@;GOHQNlHxUw?($Am*D4yn2sinoYGP}_l_id}qV+1w~WJbvDi|h(vi!?rI z4(TvdbtDc>Bk1zsP)eGnR4ZKDg47Vkg+Fg*&Z5vE+cvv!8G5F;Zkozwa-#Kl(jfB? zNT^X47jL{x4V?u;wmD-OVH{AWkxww;+KmzDNZ$uvhUCHsOyIse2MFn)EXO2TW(olL zH((@AKnZ}pvtEt=nB9!Yt%npAmo>z*3f=0wq)LtBu$yqGP=+Lt6&x4`WSnJ`<%IaE zt_K;6VB6@K1VXZng>ii_#O5%&wb+zq>l&VmEBo$LR^iO9Q@RNxfL?WJLNbvEetaA+ zhnry+n0hk~5|?~zc}t3DWN|Q(3 z90-ftntyuUygfZjUiFiMZS!xd%GdzWZgktJCG*g!g1RU(CCWobC}Uy1Y+kR^}fwqB5rO0qcp{(ExR|Jm>ea2P4rlz4Xy@57R+DM1-md?%`1O1DJDGG|#st=@+` zGbF>zt`IW~(jWVX6&4J;pTEyqoT%&Xe?R{UGLc{xK2jc%umAq{uiMLarMfqJIXv;up!I@LP5aMgpzO1 zemFYW|Ih8S{i8#F61Qj5YxF#^{25o|B$UB?ZVH2@^KNZO-j^i0Gv>ys*Y@_}^fY$c zx9}WT3s4QbiepJQ;mVVw`&20ysg*EEnY7LWhL3<)3)npP{8w?<5lCHKx>HMSXTK=r z7`fo7|1>{_Y!xm>rIr*XA{-o=Tf4&&&}N5wNey<6pPldi?GWt7J}lUZBu_9il2_M; z-34dzbu(x0MV-%Rm2`n({N-?cV3-Sto&J!GHb8H&#;J0+I&z-OxRhQL>h`Eo0EDR& z;xyah{|6TX;^;$wiKWlx{I!_zYD0!GQN>dez}`}xP6^+l6o@&(aR3CB#7xZ3_~hsn zPNdrFbbg6p12S%YBNYvI%6n$%E9H0dNG@{xxg?X~?!f$!3}L%NpHls@Nq|nwEQiw7 zL75Iu(TW8beB3P>j$wuLFTnrynA{-!d65uHOfSrT)?cD*uA&^8@iUvyGohW0Wc6@W zBZ#HL;p8N{HOm*vreR(}7HQMYsu?YnlPRt>10Ag8^az_N0O`(fq0en~F9V-x8guS> zgMp*&g*>Sb!!(>_VG@$YX#htI2)ThBO)Okx0njLdm?SuYaG>8G;R@6O%&<5ujoBnq z^P8khHAMqnSmg$M^g~*)^Cav#_|SfJJjrhi7iQ=TT|dySa%K}m75th4#e*N2GI;Oy z)(chhjAD$ik#*~`s+EO)`#U&SvG(zOQ~UIGR^Fn4MH00M>wK-#8Q+!o%#x#Ae+7=vS0RFRPlaHWI z1L}`JT%(NU=u4!y`nu_k57eNVxMxOOgKN<|Yg3@Lxg5^R%X6T=FI+Jvq-?r}Sbkt0 zpTl`P-+U2%(Vo5q4WS?A@UCT;mPb8dm*KB=?HjR{y7iX2UQ69bORCbw#zw5!!^V*w zh67a{^v5a#>GAj?HM)@+U8&J^HC!+4BePaw&4W|nH)KUZ(+qk9x~9AsCmC_aR#F8~ z2@`IZNB)kHRjw_++DhEDZ|o6#1JU>uW>`bD0b*Vi2p7rPqCo~5+QHvZo*r|ON^}aA zukaB@0gD1FG4Q~_gHhOb%SC`!qmq5+2-8+tf+XLlEg4eMY?k){(30Y)ZFG{2Jruc5 zcg9O3F2Lb}_qa$JcOLZ?7O7I0ZHWs@abN|NaHnk5jrURVNYN=o=tWh6X7h!4J@ zr2%4~Ty{m(z-cx;eumf1WoelmynPyoB@st=5h#+F>=z%(_nGtUq|mw`iGYh$!rTG8 zPHsCVaMpZhmt~U(s7A0MvlfWc9S6|&zj6Gde5T#eo!MH@8S$k7L;>58Z^rL+8&BKT zn`3VFfsUNX*eXlbOlx+49qAh#^u`j>(X%#yt)~4`YuUTC6%|?-ZUe-=0R-HplOz=I z&~c=m92E3~YA3TY%lS1}zSW8FwvjG3LIrFqwleMN57{KW%32?EoQs!Z{9pE|<}=(d z?2d)j{S>Y;s`%V0KU;d0L5wei_rd4|`?;-X8w>13PrAx5;QIz!uUU_{8-bsJ+$Nr-cbH!~V(s18x?@_MnFCl|nWzC^h{ zW`wpClAN57wIaRZU+N5O!vcOL6WhSXekLOuu(A!ztln+GlFECT?Qpkk@@|9a^T^^- z8_dnWEDHDngVd{uKR?^A-WsuPmPLhA+&6o8&ysm|o!PLrhxle)t9u_5)x*t{J%ttNNv0Qqfrb(;OdW75`NrjUnz zHzCR5kq zrsL2}zi|FK$?>!Eouh+;)BaEK@#zfQ%$C3=^olQ7(xtewGek}ar&?8ok+&Ll)=DB% z;Ss=^V7oxHZ4ho3h_}9g8z(|wX8yrQikPF^ksTFPy2QS3YESKn&)=i8ExyDqjV${~ zR+Xa`$v%@VP#^;=^+M-rcw{eXbGY$=2oeBYJXl zlK1!#Q`o(szdZvm5WEv0TC5h@V>8kN4hyr4aj!f7> zn$xRafAhUNWhvgjB+%pc-+L#8&4x`JTtdAH*=b0 z?_Zy(&AF)zq49?Mt-A!rc8K1~_S@=~oj0bYFK#VS=4lg^`;uMseCEkMi2OZ8 zt%^$5c{EynT|51%Ge$ey_olTkLdDqXt5>g9(ZyU`Dfafx&-#BoYf_v%i&F?|(S528 z7dGxrN%N%L$}MAEK9&F50zEIGdIWXp`+g(Kxpc%>V;nR1%ln=Sz*(O`D{T)Pr-8LT zI^H|jeto`ueB3|WRk|I$+z@4{7W|o7@Gr(Wn2V`SsJt)>_6b8=T-i1+{C9{GBk!Js zZ+HFITfu7!sA5Yz4N8y!*1mogZ9sTGF8{KRORXHyQDH??FhUI0}kmg zEcx~U@4HH#^PhVlu3Lr7GBy*48sr?+fo5VEwZwAg9JTqKV0t`F2#tHW+a}gV1N~aA zdx!m>I<%`ETJhklLtE~l6?eJj?mY!~`>ePB+#E}DamcqhJBdrh_<%Mno&Qr^@3B06XXSW6;g_fJTt7zT z=XV8UP2>b+dCj#94i{Ze?O}9!F5He)!ZFkY;Bm z5|>s0ZOJE@4T5QiJ(D1(c>`<=lrrzg(*t4$=$D@F$<2=?EQSl|*c@TJWiL2Xa$rKu!#%W-f{I&dHHC{N%%2@riAD&)zpMUweQT(|XLay#8`}F@nd2 zjJ`MjQw8B3ZM|>v22{a=HMe&t4V%K0W=a|aDO%K+Fp3M~BtZhIZ+)N|&JN8-aB#f9 z%pl6rK_l;8)c3gB4^aD2L%c>bLc|@)#gQVeY%F5rUwfQ9k7eGCOC2$(~u6ZH_7YnNFuEqDV<&RS@C4VVl{KXMRJdydfH3?;+@js`)ft zGl=mfPdlioBD|TaIzHL|*)UTKUdPc<)Mkxll<&>Tt&L$zcKtuM7T&-iJ%L|1Hlbtw zPj3`efGrZ*wVkvQ!mvCX5TskH3!_HWRL<8Z2f!zR{56&akfz*JIAx<9OKwhmY z$<7B}Pq5X2?9xoYBSyhTJVQUh(ZdLzp)eAw_TwY*RE6FXkrS>g7Fnh#Fi!p>idLkB zvFS7^$De)lPZ1bt=RP+Zp2Ow=rSaaJ(&8$DHjElR2xAU21?7lw=iG{Pl%WgA&yutL zn`5^c&c`WW>@3w$#@kO8z=+0adcuNY%ey%C%)Z~fAkSVLaJ&7|8}hd55A6p&4lJ75 zsA2IUZt4JGK%T#xFuNX1J)Oko-dE`6hmb8BT!CLpi`vJ$p`6{85cC40aAchi98Cg% zEZY;HBKstEQr74rHftv?`Ab9a;&TUX{n7OUUhPfF8$5G1YSa5DL+gaO0@1$duZ?rO zHfP;@xZQr_gYhIjuj0Gn(1$(mY1|-obF`R4^xS&;#xM zN@7k00u(L^K;s=Eq7Jw$T1FQ<+r2+tti(zL_X3iA9hfF(>;)pxd}Hx*31iZQ^8?as zML@H~Y_v}Jy?Db}R7;~olQ>*s zj14hE8i;B^+329)Md2#Mg$?7l;z${dmE55Z^)k z26l}qI%F}gHh!IOMj7YRfs!1QR{-+2mYQEW-nWh@mnt-6_HIYjv3E26tLywgI3z}t zo21DlVkh}1rIa&QL>|F8Q8-#MbHXePJgz|o2zUO%WDp<8`4yU7U42o*YW>LKi&X~M zo6q#boYee#SOb0eeQ;5Sx7WF$7)fi;186OC<$O)hT7&O&e#+UhAXF*Rh0E4pza81s5A#`aU@74@(E{%s=$b5<^&8)KJRU6;drNtLPYO;7IU3 zP*lPP9=R&>zh@O}(8D#e6kjJ_!(z~=KZQa2!JsXVgIkO~YRHKUgTh2{_W|mZ`xrf3 ze|hn?z&we*At5(%L}DtrxXERUgR_tF~a3y26@! zSd`!p3~v5&NAAt88+m+>?;M?;y?JZFo0~sAD68qsY&5l#)cAek7}j4xjW?!7eYD;j z{#pAYdbw%TmUu*0H~s4EoGFb(9V?nP-H!MP*Y~4s6H6YJzugcatw2}i7VC5N|)(HiQpqA|z$cc=* z)@QE-cuVm5+>2fh?|~}68INq*wg@USsnHzHg1U(D78Nf9(5g>bcsH+&fxYNBv~|8^ z5Mtf_aac})dBTn4@h)(?T|zd#mVUg}##TK66|n_;0d|ztcpXo9Mlj(|8wpM z6EZB1n1?Un5b^}u_zi`76XZ`$){;WIgf@Q80+W(axxuN3hQ#1jWS6RMg=8J z*b3__^Jyh+7S$pp?=H5c5-?XSC8u|^@^ulat3zx_eYo#h)?jj;Ctr3+L9V^$Rd*=m z$z!iwl{~kugc+MH@15F65#3l@Us%Hnac3MCuOPJ^)ERo0kLt7*DD<%9c5B9)Wx`T> z&dRNYUO%6f$Y}0?zHkS(KU}$N^a0@W-$jq!->|*ldE7WK}#j)t&1RM^zJYq;?%y{Dw~> zSh?`kk^IPXUZ zgF{*68bX->SzZD8IQ~&mWWyy7>}5_D4cmXr0=&=eDHFVHW`sp z>U{&HgS4EiDuGy5uoIYn#YGXg8f7YgWeAqK&`UiJsr4JD)-)%1LVKE&ma=Q@h=l#B zW;f_>ys05QPXUgUC~aZh^19XPrXQ}jZt$Y0;ct10I6<87P_)dzAg_h_G~`dw9SUlL zE|ci?B)^y;(*&@kI1axp2!u0@&FM*)B1LyfF+-1dd4;br0tBqv%bpjdj7BA|;IFv4 z9%GNYiLY`zsHQZge}z5cG!W8vVC2kL+VJa|s<9iX!smP4(@fOA>i2N7;iLMiVGT$Z z5+A6q*SFUI6@qqgXSk61k z5;GCCzzuQpT=26c+H_N8qxX5Qe_X1AYlb+um zWN`6!VPcQ4DGP_szWHSLhB{fYYyy&1BiBNVZHAe8&0eN;!QxVP7w?sbXGD~+H7q0 z19A~47S}{fQ|#Ea%Gd1UX2k6=b`X zWWPiUV3s5DZwTB)j%7?aCPpUskeV8vI3jFgB~Cfp7HaC_=|4u4lo5X0N^U@5fVMgy zMv!_GK9W&kTwdxjw1Nr*KqfOJhI4cVSTt6riJy6%oc0g;J7*B0-9gXt)>=E+J2`rj zeD%|Y2S)b#k6@Ykmt`3tHH{@H_7H9A~JNZCq_6t2b$0thTKU5TmjNb3pq~Q1^^}ITdZ|YIecK z>dHgDHEVY>MX>Ojsban;_klkef|8re3Lc4_g;+-rAO21Z#X(D+WfWpr=_m)BpXAfB zfNLZf*gz3q_>r4ZHL%Udel_8Yxja!ZgE(uNeV>AiuyJ9o5+qhgK45%~%Dg$I{6k2t zXa{MU_Xtb-`d$I}IC|56bN=eb<1jNh0|v_V^UuGn4yK z)afmn3Y&Vq$ z)uOUoi`NGB2&@e0*A-<#9lMs}spu11R_o%qBWuai##*jSP~YaXz+H%ZB6BCAg^{xv z>f$V22>|l(o57OXdeQ8gmz;l#iHva8^C+R6Vd}OvUj#Z$o{x8)LUEh9cs_g5%#&b! z7Kv2;msrAC+-$TWhGKtC#oc9U`uK~j*6cfo+Jd6(bzCqb7Q(ZZuft8+(Q7BNU=3Hv z{CjZg|D<~`yt``m;NqLCR%O|HEq?bV&DXE5wfge6&S%^t^R9<)*s-HPEGJ0%jJ}r; z?gt5)atbA*l-X_d&+?y26)TE*d1on^Vphf5-VrdN zrvcsaI`D3uk+XTRy6p~{Klvk|2<-o(v)Pd~d}w=H_4W>?f1tgm_4amcgLdHo;X5^} zKEAgJ+p+itL2}%d$>!bWW^!>a$>lPN*@j;)W|x=Q#KN+lvGpM@$O5lGxY;uX(^gL= zvoT1Mp1B_F6w;7#9;W!}LP#fI`U<-nl2hOeO9~c}#L?44uLbakg>hQ^_%Od1r zBo7kXiX+#C@TZZeFufo*luD<07&tYeV+>}<(8>?2FvwZTgD@K})jIb9BCug73V2*r zs;D!R*u0R5XTnlSh4CDgLAClM+0yjD*8b9rgV%cDnzku;St-iT;})H&rpf2%Ev*M3jc;0 zNm}y77#0l*OQE9LVF{Fs^=(q2F%@GM*zcj1oeu1zGYO8+rg7h^>eqMZML~*Aw9q!R z_^h!-^yiqXIo*#8Y^psy4DG83Gr&_TTIi+z$;r_P>(^8XOc%f1d`hn z=(9Q2ruV3XopD6M%{U)XyodmJ#Li?T9W+u@Ni2u9>YGf|59KXHyLG6VoiQ1R8$`HDNQm(JEiL%y88B(;_)C=f@8_ zqYheymy2wlxpBq%%8`czaSFL+L~91En85_GU9s8!5j`V9* zLaYb}BGZjOCP$;0MD9;2$yV2uye%0!PX1Z$R3W%#c5o#ZigK!;Dx zQEi9;dd0d=q~r0VG^Y`6RkL$aiZ&>mhZ9ph@r`I$)GvK6UcT=Mx48q3+)_RbGDs@*>R%5W+q8=KAd zZq`-J5L#+8nD9nBa#vcm(3uM`&kvAMF?pmax_^YK$C?h5#jYnL}tZEZGzh z4H0yKBE+i>2@a)c;=(1h19dm%;Z8?6ptK0{o^P0K%KSFt*;H9psck63+}%Fgezkqt zHyrpN**=9kOWK%HH!7>uWBH zSXh@vYO!lmu*(rl3(y8rhk@*9f$QEd{Cpe96LhTwT-FZA;dfJpn&~9)!u$dMv{xFm zH%zy&ko5zQ2kS4(@uS|^kLUZl0Vh-m4h!}J%EBkB7Jr$(8R3p>v!)Hx?&;ad{^4uQ z-Ncn)C-h8A1eAQ+gE~lW7;22gHaYi`>=LamE9^*RLFz2*kSWAILc@y%Qr_;xeg&V7 zi+F*?3=u&7=?2vDS-jKfWPj&o+=}wc>lIIJRF0u5hFq*-BdbYuZ|(#{kSlNU=@i37 zX;v_#Hb;eiWpQq3ocUyE#~J9QV9`LAyD`ZCqwGy~V`L(NaL7?Z!J!a3(hoaqQ8z&L za=MtosAL<4-J@nI?N@NWBBm024X7m|Cn0r$a+y0H2$kSp zI!qWOkX98XpJs{zc8+JcrtdA)8XYTxl|j0?ga25b<139a%={s6p;OHjN0)Bef+_QC#t_E-Lmb(+aZ|LC}X zc)oplZUlwhS0EE4Nh@}=+8iggpz3BjkVay~9N3kZ5D|zAZF5YDkn3hoYz@i>g~K8Km1vpE@q+CUxYY}@@19%^aCKihPot*y>%4t1`~h5>`q(2#zZomFjS zGbL$J91xnR4?De=JeIpg_u-wYY>KVF9KV`65gS3;c3=c8`?l>GrP40Qj~-d2oEn?uQ@F=i?Z?^Xj&v#!%FvVmMy#?esm8spi&Ia%8 zLA8FXJu(vi6U~Mt4>gIk``6Um!E_NB6Ou+?sS|DfbAXzKG4q10s2JH z#aP2dfU~ytWe*n+(?|Tu({r%z#E<^&J4muCyp|(35q;U}w0VHZx_NV#d^KEEdbNe0 z=8{&Gh3UAc@pGJMZBtzYoM&-|khFO5=`~&qSuo*$bl}MR39zg16>T711|#~LHL(2D z3)@=5cr=umY|3qR0k9GO1Pm`G7(Rs(WQqaF<}?z~P}qC2e-zYpbZex*8uBlvbpN}F zq@y3$>ucFjrBCL{SbOTvH?&YEDb~IYuRGF>XnR{RK_KkcNroN6KFw>a#oI+Cq?*@F zS{rTv!g=6AZ={KZC5L8k6{Nbr!EM@}AVWYXII`B5gx%xZKnt-UoZGoZC~njW}$?K{OhXM_K`JPP3)pN(0-K-BmtKAx@Qa z_0W|)VV8VbjYxZMCppeJkZTLGi|hcv06;~c+(^qGBZ~(AnuDh)FKkj3 z!jD{lgselSP_awkOTF9Q z+kSg+rn|w(2x=$I?p`4z8ilIyXnb1nN#;2m2w+iLM9Z8n0N-t>ZU>DvU1#1E*C8Jf zbxSEh*&+O|;H@QS5}*||loQZ^FR@W^e8ewZqNj&|OjwNx8EOm#Awv zCn#`$8EymqbAX2|dU3!Ia4=dwZ4b0W8vJv~Wnm>Tb6wzjv+hFAJtv(lpRoC+#oC;l8I zzO@ISw%pxn&Zlt4s%%MZ2f10XdOr(Gn2q=YiNK#!b0KCX-vXCSw#S;<%+AKa1z|Vfa z^`P$!(gG9%ytS47>meW2SI&O5UjR5fsz6&Zu^8hU7JFs*DkHwSG7sr^psE`gaU&Zp z*J;bJf~pf!Y)mKl72>+1X*d($Fy>N83rp<)v&qb4SusawYm05!Hh_(DEBO?>W`evY zvKhPXe#O4i3GsZh*ww3EWBny`fZV=TY+NI^ATF`gMR1BWzX28CC$*elRL=ujF(oO? zn!eZT(TarvcC8>{OVTrOK6Y1GWQ6FWroR74=YCU02iY$;QT&Gx8Lw-;QEjIjjnZ*t zGm}sl8?y`c_SD@WQMc9M?AjDD@IK^(8LSTkG-`>+7xzCDqo z3(z6uSjD+KfL%iGI!?&#z{7P*do0v;q@_bfX!7*8UX|SoSHY{|scFsUXOs^E6I2>j zLbvf_cJI%qb(wx|-cTOg!Q>tt7a%1>R^ZqIz!&qIcJ!%g$(`&TUP~HsOBpuGOl0M- znI*>=*wWiR*9kedtuFj=MUs`%hO4fSP8>^Ya1to_xcw574wcQRh2mD-nMpon7po0- z%4gK4mHXV?6K2l2M zC=K;g+1bWN%s>>ew5al%nkZ{o+RD*3uMZJ{kM`Vcdhy~78vV!&`Eqm3tyfPJI#;ex z8W8SRB=suqU#|?L±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 z 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

OdCeHF(iV-&XLr{%N$tl};;oX-(Tz@~F{z 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

fD+l6G>j@cb;;Ko8u8b!>BBH~k|p%d*@PB|A)y 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 z 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⁣h=-NeA{CA0=n1(SF80C7D-TGz6 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Ų%8&79l!{>|JKa&K_h02rR&$8+Xko}IxFu(%W)Ye zC*;7|+D08{M|8*?9?`Cm`oo*h|FGW5fl+z-0R$HC}V@+!YEr*V<0 zSMlPk9*YWvuJ02DaPx^|sG{_y90+38%o;%i07WVE0+i)=#Y--T4rkCFJUpaHWx2Lo zwaRE@L=C@+$ryymKnLAkM&7!;-jcYu!S#E3cQ0y011);4`~Y1#?SIHdl&$HH9W7qi zHG6^1`$WQQ9RL1VHl76G8|>H4UI`(LpHbn{4_|w70Yb7z@>%=m_QeviM+gYmyxzz3 z(-`w`p;68_?{~7`WUflw0aBFmGl-&OV1efl!MIO9WXVmI^*MVMEIbHitXzg7au^bb z{iuA0XQ^V#$wzOAv}=x@c-M26;QKpF25au2v<&78PQTVlP}-<{MPt-uRXtQe`-+M{ zNxY^b>&nW1hhIVpUr3i~V;s6NRMS6qI+U}Vlj%WhN*a=j#;3B!ajEyVlt(_7`~j{( z7*PVTgrW0MBlqmHxyMk#x>fj60Ve0#qugr^_MSBTUiwqQ$ydS+meghKmWoWIp)1Nv zAkIg!X+X$Gf> zet$l_xO#i|`s(o2>-M*ozu1@z=qdLhA5EqPcPEhOYUx|H^!zyOQTTR+{`GH5T)dVc!iW! zDKPw{Io}HasBlBM*Y+1o8Iv5rkq&5S#v<7OOZJXRStBWc5RC`@KHNPW8Ye5=8=&<_ zM^=W1Q=ez^crg54NC5}?00NW_e>PugcAh9=DKU3`QE``mMn)YOT5tLwHkD&9|6u#@ z=*R2-)&4uqQ$2W&tgd<92%ZDsh4Rhd`Qg?18+g7EJcp!+@Yf2S8x9i=v}7}Qeqye0 z(5J0J`KuoR&h`>-(8pKi#z1?GwRf)(iBW#gKmJpf}2c>)baPKRAFL@0D?y*TICFY~t( zJjZUDzukh(xeJaQzf>=90S64kr=yOFiATwpGDM(?LD+;&_vNFD_Tg1K!LuoOto)jN zsv)hZ0kN;8lfgqR@79JGLaKHb`(2OOEp zpiS6mC8Oli#G9ay-%VwAGX-rR_ox?Bm{HW_Z8IhP)NKGOaD$~oY0$sT?{JqnRem57h( zPa2-be4P!5`+7+S&keT@pJDfE(K8)L8Z~1t6RPDEc(+&F0dx^H?`9!^d0kab3FhZa z6c7Y3<$MGHI0(je6&-ubSHorlOY$w}Ru0tixxIoCUo*FK60nNUTPesPC?#j^z}WK0 zJT926(&Chh!+A~?vkJ<9L!_61V}v>8$cqQ8V$#K8!y zyzaAJS5Kph>R@4#Z9`#9kv$}N758FqfK`clpO}}#f)Ki{9S}<@5>uom+V7yqjml?z6x!?fk~1fwZMOV3n+EamgM~iWmqnJ*9a3K@ zCo(~ku-kB*6rMaF4JG|PgA4UH>o^C{P&-!3=>)C$HUq;d_36ezi^Mnlj@vo7yIiH%`>$rI{C-eQaOPaRtf$hPScS< zx{9jW~G^{q>jQW9JZh;oDPq8@m2t~o@>aay+yXKgl<8m^J zMij!^AeBe~yFYh9Pp|fEXb@*5$RTtcDqGSI#bbjZ@no}OD#B9L8G*P+2$_LfuAeukap2sS}R^9Y1iCdc!Pw!m7=MW)2Zd zwa1&#``kv$Ls}~$8%OZu2#uw!x^?Hpek>A?Ac91ff?fsDr96$=oZ}H`gbkjfdQjvk z{JtZtFUxMn0da~G6>XaF`R+XY`a|=1dhEJc zjx!GV0_-9FD5+Ft4G(kVEz}zlrxwY=0sKR$v>}*H*3C`p=Y04u$%!uM$Uk~7dZoeU|+mlN1pkQ z3nKT`j|J3@BS8$EW+2o&tSQCyvSF0mQ-CK4^km4gV^{z{Jn&{gB_rH3#)IS*jEC4z zkYPa3kUmQbunx`;@-Wg+;X33Q`mpp!&{c0Ld_X6#6kGlu%X3LTZ-%d<^niV?r#6P6 zK})A3sm|?!TO^d0J)twRZhnfFRXW?e>lCgLZWgy(sX#{LwH%0fWk@^psZ1o-3%QuG zfdJ$D&uKRL1lsv@lHGm6h)|S3i-d-KQZDC{Pb|7lVNe|R3C6aB(e!}~u<}_z!mHS{3I~Zar2U9EWKAueoVbt5&9-!hH}2;kO2STSK*m8VGDnMxC{TR1eS#E9A=b zRT(g}t!Ze^5*QZ9T$uOVFIW{NNOhGAWnjJkORaLQV$iC*Kb1%#rV#WtR&h;L^u-HM zVxNM5(bt9*Z!q>Wl9w-aU&GE37I_w*9wPs~ug9i17Y$@Ew92Z}v*Y&Pu8+>oF0U>Q zPtUHd+yACQm%>UxXJD~%d+0H$2Td)hfGJ*=o+bZ>t5j9Go);^ARC7>A*$t<6h{0j; zVFi@4@yA&-Vh@-ZDt$6ROvG>A9LthGeaYn zi`+tjBI`0Pw*mNcV5zzGGqpwhZW|O^X9;^Qo3YN4{^;I&3#mpSs4Q4a5RtW3lCvue z9`cDRYv;P5<~ll*23f70_j{k%^>jKM_Hs;d_7kjb!?JGrs*pR{vR42;Z$Qn(s`x{S z_I`tH?!fP+NN>ZTY-lcY7F$K3IaA4Rin(?B*+~s@^BO_9H^5s%z4T+tSFMlamUOZVE&(OyN=g_a&UcR zhEZnIu2k5*#l}{vlJr+qhC3-a&sw81{A4xrXc{jLAAP=Z24Obr?EuX?tWG~sXDXUU z6m5fit><9y;2l??N_*`9ZEg(w_Gl!zSK%-6E|!th24}&ouDDchs9*jyD#c(ls}T{&amo1T?y==EFP5Z(4%h=8M)W7m`Q^(Tw)=%s0m&4 zn>kWC-Lpj$JD#nE5^iIji%Lw1w$>;yPpN+AuM`bObgde5!#$x4S>g-nP0MN!2WXan zh75(rUUcG_#-Wz347$^vGmv^iKlf3nR`=7z>p#9Jqd%3r)xE6P&ZEA6aZwXMUWd%RGe(KK%G$pm+%GC;u z;A2y>gP-xL#JSeOs`MD@qD?UvlB0u3K`^7Oy@DYF9C&P?un}BIAKHW4aJHbXc?=!6 z&pIRu1Y;NT$T_i$>OY$0JBhQ&Vs%r8~a6y60KaMq&Yx3 zi*13y!$ZCp=3NYWJ+xe1q%bg7Z^(UNA=nujA}usDbK4&d^8SLIHurU_PFQe&R|76y zTADg?pLPcy&$!?0aZ^V2z~Ip*d+W359+*b|H{Dak%jh0V)PK{x|E7EYP4|4j|8aD$ zkifg(1^ll`=8f*Grtb#*`gam9c5F2#0}xRTr#HPEf}VUb)OVZ%yP0=E7=4?A+aT&u zNPBmiqifs|DX626P3gg?n~lg`?k*osIF93obd(RKV;Dbz;-GL8AOj0{46oG!QPNQq zkYn>p-*Sq~l=FK0baDDKc)bDg@KFQui3XYuD7Q}EwZ^;T6~pZC(d8+`_{!i3GXPQe zc7cI-4o7$D=dHQP@K3ZXuB<#l_`z!Ek-ky`RjenbSXm)6%_M~y@80t{nIylFSKe|F z>*+$Tb3H*-dHbcNt5Yy04P;GMx4E&CS=Bj(GeId-cX^W+sos1_b($q-OU&3ORBt||I>s+8op~EvR9A-x5<+T@ z+ppgKfB?Y<41OR1y=q@xfjPJ%tE`rB_%a%oFE|N%XDs-{u$GO|>R0eKtZw6Befc(| zP-q{BBcDL~R80zEQ>Ypi!vG>B#SA4qyt^wBQXQO*r>P;)UMw+!p8K>BI#g2+u<63& z>j-y3=M-!gF{$ocFH|(Su3~g2rBL1tu zR#>S%vz37bS)iURj|_@RFZpF&1jy+8n4RXP2e#eU%#LAC4J#f@5&%t&C_!DvzycwFu9r&G<{ zUo#Vz7Xr7y&e!2q-i+_)8PP$BYc|ZU?X72JcsR_-fH`w3-k7+}JIH0fn`=JMGe zn4`d;B${<$9C>pY9gocw_j_*5{Jlv(C7%XUNEvfCfZ#J`y1?c&`;hn6gED63yRgSF zHKc)rLMQXW?AG2b*5sFD$~q3~kMGg!)l6FNQ!VLZB$`S3E8Mvs26&54`&bZQa4MQ_ z^tU82d2!)v&P$j;97Pb$U1YhVwF!l1=q95T{EibWiDkzI%{#xQcVHlkc^?f{f-9?k z{U_>yM!mfH$EkS(;+m7e=pn`6y%%e6$R}4&1LYHIbN&>iyMtL@7 z{|5Fi$-6Q z>RyHOZpJATh5|QBQY_3Ln|pndoeO}nhvDSYI>KX&l0~%8T|nu^dUDw75lO~(VovU+ zQ^F8B&mD*posNB&)L@5Pqo75LT|A+;NX;f5t#C(;>Bp&Bi#&jy;0{b0RW>Sify$c+ z8YuB$l6Wi1D@9lY)6_L*>OE59 z2??lOVcxm|CN;x?yfsuAN{{-;t{`gKRPQ)2H<76u(0$$m2J?>3RFEje`Ne-2&eQOW zl{nLQadpvd<7FVMUAS9Rt8vc#1$608dB4+}n$9jWduy;_{eGDk-zW>+;4t3t>Ri|7 z_#-m?AF|2S;Mc6rc7j%9j|PJ^%pJE!&Nw)qe5`i{6kQ`6&*7WH*FTtlu1qJF3VkA0 z_kP(0N%hQt^R3oi;nkGhP4zpklgV@^@@8z9Uo)D5Yq* zPDLRaq`g!o5in&?rZ{6%(7&{xHGrMAmt+LKet(c4%kRDE=7ZP^@=M`2h#J1a>mluo z2CzBseg&~04A(RQHXOXP3|l)&KBl9-DLTe|A?vG+utCJ*CL?@Pd93o4&U~}u3c})E zAeqH~_oDCE++2N+mqVLB`>h04W=<~qt)z_eSPFi}%fA7A!r|!7{}nI$LpFE-4I%1- z3r{qHf-MF&Z%CW^8V7udo&!G(Y_HV=XIX-~&Mf>V$>=co2$8}X-x>%->#2O z-w<)RG?zwmi2=iqu@|p1T6PoLd6Pco57P%tX+x$b4(aeM_$s}A`{pcZ)a&FI0c?YT zaG#FvnYF;dt*1YlC+l~1fWhhD`~7UB_m7r0UO&uKo&h%aRa z9=>b)hrK!KtgoIA!fe-0+Urbv5?{45pd%T8h&q{FTk#+_tkQ5WMh$k2U896){JK{C3yi`rAz&@;+byrJFeyC)677 zpZ$Rkm$`BS;6s}Ch-)`fjZ;qT9Jfyn-@d-$w!9^X6)>pN+S%OR3h~SJR{jLX=sv+) zgC}{7#!FfS_MTP5>bIr9U6!M9%bypO+gt|T6r*x0nOZE;_K)Dr)s@R+j*>Bxasu^Fogo8n{6LH+u(KoDVz z1nGVuSa5WHesO$lF2}Don&>R3o|?VjsQJ-gG@1?zVZ{-B&^|{z)~Or}u$xVYsybehQSlh= zNX0Qjlx+?YK)0we*@F&teq7uSG-#IO=uH6x9Sv;sjaCCg<=YHkK}8T`W5$wuC+yR1Pj}7lV)OadfKN;=LKA`EYMhdlWjx{7-C1766(plGWc>RRwx+ zk=;g6o2y#ZX-qN~b6n&ozw4W7en9#x?Hc^N{AbT6dYI7C>`n|tD-p)fst@o|Ec=!y zGJv^4LT~AoMm7`Oq&uY)VGwz~Ysf@~LQIO6kb__atD)npA=|yY|0|yIcNq#JKIADy z{TtvV(7+x&py?KJxX?4?70f8$vb#n=?6B8|U^}_49w3dSYc*XVJv1IqZwP$|&V7bQ zDB5E&g{`QIEHYdH=>7e=IV2OBTgSt$438l_T4pnN=NB0n)clx%)P7G*IXyuuP43P( zkSV<@Qwy=a{+%X`PsXC^x?BEeZYMrHS&q6dZ?KpN-iDD8Yw{h}omNcNWKRrgPY z*N}NU4#-~ksjL6qzBtD`aUgpBMVB-Tmy#yiN#oM2*Du1gc74y&9frYc5G^$~;y-2m7Q-1|~><;Kml;{9T z&JQWb%xT;2WLCxK1U!}(0Z2@V@L)8|Zw_-qL8Fw;1CO(hY42C9VK9W$3I9{v!)rOj zI6!IZYe<@Nu-_2%h!VE0p|-@{YOTV=&axI-j53ft0WF1KN|@XSL7OwOmfR0M!X>^Y zu&5myc9=LafG_sa$ktFZzxbD+lmWFm+{30Z}r^oKjg0ob(Bh>e;2tR4; zTRz16YOWF|WOkkyQ@|DMub8EEF97q?;lSuqF#z&FVkcB3|1h0Ar2Xe83_`N2 z>=P0Q zbHr_s_<3MAUPQL>=Jf2S{rdG~WeD`7Vm{Um?8SerRega^yen_@#YQ!Na?w6LyKG-v z0h9vVq96|6B%2MrJY&IBks;9rN41`rpUP&Vxwh4+?(er+J0y2lMtoswh*M z4#D~e#Pxt1QeEmK75c(D*VSZV$UrLzl|&?1x&n^n7Pb}U6ZLd&q<|EWpP>Ta%rZ$f zoL=h^li>oKjsM-MLnrRgG;2ggBhCN4)v76Vs=LavuOV1`4XK#^cyRf~2(l z)76irn9ZbmR#58YHng6Vc;kNWq@8=%yH{4DD1tMQO_D&cbDuftdM36gN^-tFMvBFt zNE>L53Y3zHVzC5@(`IsTbVqx5#ntS6mV7dSe41;h=>)fWIk^PNyiIwjw^F`P8ovzLa> z69_}TZ3i$A>Ltf6ER#1K4ThhP1E=^!Jc_`S4o%5*sI?fRD6Xm?O6m@)AEqH(xS3Ed zlw;$%>Ilx)A%q2)*O75=FrfpYgCZ0>BCz_q_aVTtrHTN=-2{UxfO>e0oV6Mhoy8n5 z47!69iFXMiyPGA=KdhudC*kDvHWi6gc=-m-88mW-48)J#RZxjz)|{hdp+Dnr&H$Bw zEOg02L3gAeyr5VU{>GmY_M|RNDVH80EWwSgtlO7NoaGI2~P!g*TsM)}0Tv z3Q|fE_TuvV0yy`?oV8ebrOHgaAu8*XJgh3j`%qspz(Ll~nJh;! zR2p9Ygjax9VmXq45e@PV?qCx($y!yg5nt-g9g#f&3o^+ch}sskg_a>De)QI{k0*Z5 zRG!R8AWziw(+yWA)HDk=Efjn!Ds{kAII-8r)zNJ859C@tE^>V~69L(1xe=@vvnH^0 zi{d0*ae(I;3#A@EUg4`KS%(-tg*Aty0r!Gv0x{`{4h^sVL&726bja^jiibX*Ymj@(w0@8`BvsFhb|)S+78J@`;)jypAqtb#jt#1Azmjd`@07qO_az?lX@ z2$J8-zbB?uZddh6crZ(?*4aCzX{)Fc)y{SI9wK-Exg<~_-=DM%3Lb#bHiRA z42$Hs{ckXW`eUns%^em?yl!)eCb5B$5?5SegC@FI;s=4zA_u}q34yUm>YJD$!`0D` zP-2V7?f1!fue&y$d@_TMuiABotv@L7iVyDJ-nK9P4&b&C+z;O;XW7RnI9eGW7Mf5D zvks^T2`xb-WL51X%^X-|5r{4+h4KJSGuRYaX9_AHl3KEbHEC633DX;M!>uJZ(}}hE zggX#jqtu+xm19iy?xW1IS?a!XJ0LR+j&?zjw8zQg{@L5tuagP^J2`xP*{&K=4uBqC zK7ai5`MJD<saFdCzI!0R2;RB3WSjR`OW8rhAflU zJNzdluCh8pywsOus18gQ9cLTS=5ZazE}1K`xhA80P<%a9%Xso0=c7sS2BB^s&UjK` z2WS-FdQMSqf3+8zmCxXeP@+6_roIBR1}i+Kbiy})kqVlgNKnlMY%NAQaaIjt3Dg<% zdO3!&K|NobFAT*@$aEnrjT|T>p~2!n&b=1EoMI z543Brf5h>E3uhOU{!Ne}o~=E)&}jHQVsU_o1r;Zl;)iCet-aO?Mp_4A3321$=(-s^ zdh94qon_cS=1K`8Z?ewdft8}xJkt#C8g3Pa_=vy&H2`Qpm%qZ|c1_aTl!DchCmiZa z=hMZMGFQ%_cyRtuGW2vfH0*+y(T_w$ii8N&IF=adkQ|l^u(Ea$gO{9dYP9+h} z*)xgqwQ$K%O@?Y|a3~u*fL|~w*IDDOGC4nFkPkc`KbYy&tpz^0*B_eLmcJD|6G>s@ z=5js>W?JxgpTsghPi1|?+1;g)t+LmzeTxzL!S#JlU1<*cRvi;D2&wRC2NxB(lA;e0 z$(MmL;cgHWhqrTR+kC5iLd#G?RK&*9uJz4;t+IB{aB!RSt@8`dDj62j!7eRB z3i}asg-HESn$k=AcaX3g_8|U9J`P5|j?q4qS(m#`2Tj}!1w+TS?(jL%_ zPiV(L;}C8>HMfJi^nnewl2g=<8|ZcK~4S!dWO3M zj1)%?P+A?F(DQqE2AG-Op`ONYuRZjz%hSHinIm=3nQKA_DG;49aN1u3(VOJ6$$Qxv zi{h{|pccPDU0F6lp;W(v#5Mux)WZ-b;vwy#4fov??n;dIPHIM49YC<7wIOJ$2Zn)% zD-tfjSo{mg19RFpHzjy~JMGm_#)UJ!b}VwHw`W&|>AQaQ_pA2##c}&$zk%M0*@W#~ zl(Y^Hd7eQ$0!$M!-q=D}m>!zv8#`Mh<53Rw*VphEaNmFY=KAz+P~1FAL}cXZJen$7 zt*Q@*9s(#I(BGhB9MBtsQ^z47^YG$Lq@$12{dkYk(F1NJ!OCzZpmd|T(SpsU=45QB zd8b-vYB=o7h1S|=Ho~nND_55@LAa*C_>h7k2=n3pf6^IC^fbWjhKj>zLpr?1%8jf=!>t7 z%pRGmnkq>Smim&%f@{U!g^9S_of2-&LyVEZku54i$XoMrrwVbzG3&_}FNHQ##k(C< zt?5f2FsC3025^#{2+Rj4^8c`!tR?)tUVXMfxs~ZEI8>%S?44=Gf^vOY*aG71?*p>K zLh5-x*l%pq>r0sb$@FCHV4CbFlo#M*I=r6t2K~FrO2sgS(4RftE9J1&Np-N_s@Dzh z0`%*fY2KUU{p%ZOW23nUeB4?-9I3Tu4cheE3W?7vP^db@;4d#=a*Z@T+fOqcc)4w}}gYSmDA zQhEIP^;*19e=+B@%Bz?!0R7P|t8ULNE97#OW!?1G4qx%IwswlIcv)NZ;wxTO(5Qs3 zT2U0jSDR53!dF{S6v9{AWhfM*ecz7q5wWv3S+N6j4s~eZ!(v0ch|-=sau|GVL$dcNUmt-eg@F6MP*fp_*@ZDAF*{H_ZpKk+qli*r(5_Yt z%M>ZEk^FZqMW3;RCFB!nLmrvioj@0KJ9l#Y?p(^c&w?Re5v9al?)36uTP#_RJx+IBou%d zvcO0x7a9n>Yu5D=&D(5$Ug-6lSGw58I;&M!P&YtC2<<-t0+&O?ez~3K}=LQeCA-~ znoK;6Xaq;efQ0M6W}jdPQ_@Lln-X#_x3PBY;JmOA&=eG_SpA*HzE`AhmEI+Pwl3qU z-)swKHEhb4{dO>7?G`$W!Hu6Y0do_n__^_6noriXw>6il>j9_*knU3&t8k_KG3j-a zaGk?_StN1*a?^p;-tQTFF{ES2i}>9>t2j-)wF6Y=X|`;r=H#&3WrV{fnN0|$CyH~> z{wcY>&A>c6EMya)jy_E}XA}02&TA-%_^|KRoJ-|4tCX$==ZiNtSRM0L#-2+WDm4WZ zBwEjcwI^S69>^zbp?OdbSBAL2Hhq^}J)0Y92w5MWm8`utEu5$mkR{nmDh71*yZs?! z0YbrNf(^gP62QYfP9(L01@+`I_422?9uToZHVS2XdqgqFr^(jbGTb8dDq zC%vDI(?o{X(~0a0@rRzV&Cjxrv+#fn5(*n#yfY;an?7i4_CTA!PxGln?^cUcyz1eW zU=$w$Ln7DpTCzASiwJmnKqrBXsy@S~HdU;oVFNd2m)({DieI#(FcZvTGYx}$&h65^ z^$sC;?jOlArG%A^$OXIH9kq1oSch9yg2lEryr!gm-io?|pNHjO0TGtTllTTe*wk}& zD_6Pt0#9HBv|j}7Po-Xuq#GK$nms3L0(P|h zPrmyXZZpu~{UlKWJwY2x-D#iR9f4U0$G8d+Uee>1?2qn%rbneWlup?km4aU(0$H5G zp?|#3ds)Sn(q~~^p~(3Sd9Wz%&`gr^OHr0c-dGPi=&)3gJ?(aWp#8jv#$vF?e=!Ay z7@aT)GrfV>F-3zN8ko-5)XuFwM!W2p)kOQQ5P~87_(efDe|z~N5bVL z#9Sg{Bt$uhiJ1L!nvEv{74PPx-(tQ{ow&e>jRz2s8V?B2rbEWd$+*D6tJB9YXG`qp zk4e;}I{_PJ`7fkz1RGdDuHBDOPf3oh$Kj|C@GrYL*1M3`tDi(UVG zb@)okNNPxn>U~8~=h0M^G1QGOr~*&uE3*)hk?|onz+LS?PHt%V%^_)Oo{! zMXu7DSQh9%k1>+Ovbz{!WS6QN0Mwk5DY!UgG+_)8Vw+p&$L0rstR>69UoF>!8qN-6 z|Ew^?s(%b(VqXAkSp$FeXUx4rLPmiX=)5}ZOE@sfR@e7Yj4j~0*%(RYXz;N{j4XJp zfcY=MUI8`!P1Z>v_7)zwDhALvxgYepNj4e{`Wb{3gDG)#={`nKYG8{@nk2^v$Lu|e z*yE@}$O7)~d&@~#r;AHqZ!TZQ$gY;Lp3tZ7JWe(#OPXFxY+OnW7h`ElnA&o-Hu3Ir zrbg~aS%j^v2XDNKRv7_GyT#eBdBd5L#-T9NlKwyl$&#SGAL$qDAb$bla|&ZuLkl4b z45L%Yb?F}C<Dbmx~?^I^+AO$&4F)SEgp(XZ1_3um&dda zuA8Hn@5l|iv;3*vS9)!|`fA_!H4Z{2>2FCt9Mbd$NW?G-R5Ivb1ZAAw+jLapw3o~e zE*AnWFVn1|y{^o-@QRbcfV|v=H$(&^zLK)34@i(jFe2lL&$E|PL^FcgF#VuXDeM~v z4PYsO7aic6Pi;W|{eBJu;nA#%vbeJ66DUpD)8}V%;Y;6#Y(&BzbRxj$8cqt2AgnWv6A78SFBFUl1T91;G5=C{#c?Zu;IRv8 z(ILaX9co7vjA}uK_%;?x9{PlhC>ObB3$oUN&@BWrxol7iFT9KeXY4PK^?}x*r6lO-&-CsCX@Np-13lm z9Om$v2_QKEvy%7^9v_Xg3Ls z+#gKu?lEVM;UFN#PtJnL5C%m0iHp&o3kwjEucjqb5oO{iweQ#&3H;YW@)2!ZD9DY> z9+_C!ecz7+FR}oN;XbXu7*QAJVelq>j6;gX#3nFkus*glY>>l3kp74~h1t9t+V zX+OFEqsB)>KAEQ-5kw}X%c6?HqHs|w$#@)rl!v2oXbF!O__C;Ib6keKTNzqSVZh)N zXw+JYi*N=e_GQ2>D-#q~O?YUv&hU6& zUmeQ%?jm+Hw1m5GJzcZnk}pLF1-UX~t)4>n`O{p30i&3l6f(e8CwcoGKmrD<0UkZ3b?BH1R&cRu-YGB_T`)m$#F_=p%RrQ&v*)@wCw{#nYPnKnEP}0{wtp zT;o`7*5vUBMeiJx;_-+QxPT8W<^>uT9KoP>r(wS38pj&o=mt8kJbpJXyfic`D>X^Z zj8&GZdp0l$ZKheB<-SF`#=}|ilR+=pU0V zMbe@7gKUT@y;s)-b+ccvgAfd7@M&i6s7PtoyxnOnF{F3Gxxn?*S_JXYR5S|0Nnbv` zIRA;WWk3J(KcBCgf6!Fu`QCDQ0lb3FEJ5~(rbx{r3TPMPnIP4Yc?IUYUrL-L_B$CZ z)1s&`iIVlrAUB?zEqly5o}Cl7gT~f%XJg@8DN&igP$?qI@bJw;{D{P1E|#5x71In9 zgZBmeLQAb!cyKsmiAqPsT6R)rAm$YzCNbI!b$B!$p>Q3(*y8ebwoMUt$C<(dh`w46%j!O)zwsbX#i0+c`)Dpih)Jk*D%|N1)SheHzm(vOj&@C*nA=$~28w_G4 zKOH6nE1uj?k=m{l=65#1sDu+><9v}CH;}+znh!nUcq6faR>feU7y#M7qrK%g`v&re zF1;gErn#83hAkVVpTsl{mA$CzeMyaaQP!QdcW#hXyhsJTewV*rrwFWCgo&k zJ-BuAtOcPElM!ztY!=4Ti=qI~rgum^-224g)KSwzNg7nnrAoeTb2VkWJXgK%6(Dt8F^Dz*;Y~gyN4x+XK^KC|4W|*lrq4KSGcPl^x1V1_o!nxT33_ zB$OKXl2(daEg{~e5`|~y2wZCvcMF9heLv*z2hz~r+8AAHl$-?14}0kZ0F60;i2&!m zaHht*n3auVVu5xVO_3n7ErvgwNTrP?Y8ryb{R9}QOI-{#pBf&_bRm8BUVM~p2h)*D zxH~EKjRx4wFhw%X&LuRg<)I)|Umh*1+*_QI?-sIf+9>)GDG_6V@kD@X6D>`_>ND$S zqr5|J&@Br6Zm@>{O|nCS=Wz}xUCjl1yvF9F9Y6e?#Qb_%aDXsD^U?V+$CaKI&x^nQwhlg%OG^tXM`O}t1~0)5(L;oxbS~Tf|#M*n_jiE zoXOKYv!XfsKz~?)D!+Vb;Qa0$nA#9bEY`Pw?NU+jy8maE>KjZG#H#x*G9Q9? z5IZQvcyknnN}e>#lg3s&U57@zWL0W3C1zdvZsYx&>HStSsssD6BQf|?BbS02I2$1S z4#R|qLJ}26zy%DG^bS%&Ph6N|GQqKzm7z*dkt9)OoTCrBf>wp86JjYqHD?jv3VAc@I)%X>F{iO&7Uh+hs6U6H0D^ ziLW@UG?i8v(^$nxm*@VBR5P}tXNF(HbTh%au-J3e^&U=f|t{Gay)^;P9wT&mWZ6?jD-3)3Qv`Nk7 zv1GklLG8v<+D7WEYuCNn);re)Ir|r&X8wmzGyg-VxnSERsG0vE)LgLb64cE95Na;i zb_r_ce+V@fYr70JbKl@~21TbsMv4A~!SHR>z1q`t%tBHr%R*AcGhmLBGjEF;_uMQ1 zx2#Ov`3XfdaJsrxVO>>6%C zzQ1(y>?oUB1`mRdjZtN&yRcXrXmxXmU0C?4qHibb)++`WZ}*~;_9;AjGB&rBF?x&N ze8T8SWJMj=Dq_qt(B`?hG8YnubaCUGvq2wBz31J0bS$8+y!AwHJaK{Vy!%e}<|PeeB31_Id#yBK?*JNVcKQ^Fd984ZS`oGp(dHxOW>KcqdI6NDZ_t)QVa%;Kb**pIW!7 zRn^rJc#?g2&Q>Ny>aJRKU$yRwbPAlnl*nfYA8bx2o#!izGho#ZHU;glxTZuFGc%$| zat5Iz)dVeZ^det$KTdPVO#2Fw`9YQrx9e;J7@YuNBS`DG?vu1=Ufi&~1QC?)k2co0 zc(;etzW3<3^5|_Z;p0|$Q!U*4YvmE70jvQ)`TsnQLWOa*QM=U515A%n0b8|Vh^ zW7nS-f)$u&+M})%?$u2;e6KpLdE!jTjr*n3OLfT zpFpf*cM>FV7aMBZ-8W!1E-HMHI#{SUDRkTvA!A!GI}TEp^1d{f1=3diOj^&mQ z*WOs%_MOoF{wUMp_0snQL?kv#C#gB#bet{$^`_#-Ng1{{*qbg54 z)+a>$nxP(gVMTn#mSWyuOFGSN%i^0HfrJ5JY>0?TaD_0o!rCgEKzZhD99}{NcaaF4 zwLVz6If^VsRvadE43p3^#Ty=_6zH>GZec}Zz;i&pxLPYk| zzJIV6vdjh_X?J65Op*dx>BPiZX{sVq|unPf7_A zW0SGB>{-J)UTiqDOv}uYdL$9cGcNZaDr1v3QetR!py-* zlW8vQ-4JS$rA(ZB*1RKZ1fkKvSG1%?a3oaHwF4WET1t`~&i`$0kQU5=-*F5d4FtXc z=5j8e9<$`WFm#>OdXV*VRHmM%nA6w=X#iU-p4^ne@wKrdykISMM9u{ch2CV$Y}zm= zF)t=j8$Z=G-U)!yR7h%H2fNjp_x9D2iweGFWm@A`R*Khjhi<)6a5Gl$iC2(j4I%Ob z)!bvh30%Q;FF{rTjOgq}b|5@J34 zTmDfa{QTvoL=uwN0$%w~AN|*#;5DI{Cr{RsPh@`&6BJrJ>-c$}HaFrg6VD);%Iv>6 z-99-y+COZJn=NdbETcbK)=@okVs0;Zj7F8m+0~fG#FgT3?5|JN0yu1hr0=HK4WrlB zd5VJsp|p0kWFk<>bl`3KaP{B7(G1-S*kab&!GbOH83Fh+I2pt5l77G7*CTmNKT~$f|>qyYFz@6FBCeg-&wcHN0!6e?4$-d*|$y z2w%FsT+Ev+)X}TiQC=-GZJMw2*3Nu<`+@VEM2)%Wmp{F~t$ys7H?jn@BAt97x{t$c zc4wDx_mzVHD{W?FfHwV)f?iefGx)F7!XC`ZONilxg*CQLbF-GGs%hw~~sTDX;bT908# zLv&@={;Jbn*xb;+Fd>W9wv9|RRO|$0Rv^3pd-9K|j0+bf{#1I8v=Gz^`)dTdr>QkV zrkEEZd{sPC)Op@WWIRc=Z?M_;Eh-m-{u4?c>wz)UCzK%&UMUrtQxVY%tAwL3-hrf> z)~YUToLnd*K@K+U8H=ov4l(@+Z2t0gxA}C9N9w3zzuTYO^wrTP(07+uU=t@;F{IJU zn6~;Sb1-FnOw*sdMc279)CtAukEHp*-CG&9%D>?8D3B?O?;cD(59uci*+~9+hTzMG z<^3)h$guN2<~+yGaLfF`8wNKdeuF(4y-g9VlJp6;%jmCw(SD;|eRQM^fiZ^;Ru=9G z{B0>rJ_-D?;lJJ3;MZVu#c!C7q(7M5)R9Wwz2vfCSUz6uEe{RTGRYz^XiwizgEtbo zM;oSzCY}O&p|Zo7IX_(usN&nE9rgU{)xS8MMMUt{9awy_YUwYJrdvQO(iQ2$sl*@i zU+X~dD;~ltEiGa5Y3Qpvg8PCJ5hR%SYionu^Kv{2TULYDVKf#lIMSuy>$18;rjUJL z|0cz3nvb&5sffbkgJ6?@34uUQnIhBt^Tzzg;HFi@8J1}?uU`U6Pb3XSQZ7ScG#s9N z_;76i=_v*`oHNZ9emLknT>W7IkLA802Uy2N1uqG;m40 z)CV_;aWVaiZ)n$t@!v+v{^l~ZnD9~-DqP+awkuJYOvEuUnpX#0`Fb$P&hwi|TeM z{yr`)%C;XAA=mCvqpjq#A^p~w4nuAx%E|~QV;LD%e_94s1-!ibGzXsImVA&P#&5T6ZP#z9;K?jTA04?j3XXPLMbxwd?|SV2 z=t;LK0Dy-|)?leUe!#SA14z<*W$j6~`EukM`V3^@6YmoJY~DlQ*BWZ{ksHnDkHGOM z0ZjAdYUmn&e=vCnrjEpI!7lx*?rs|QXZIkuq&+>3zI%gmckK74-_!3;m41Kvj(+C#8V1O^;M zfo&U%2q66tI>hQWYVPyAOtPyn#FY+nfKJJ)7F|ftmAh|dzY?3u$#kdL__zRteT@_< zLLXRGTe2{&6%X+T8Gql_E#csyTGZMh#hJOf{2DrSXuspf1p5ETpDpsg3Wb-Ccz zUQmjS_cXoxA%#QfYx!A`}(+i>g zfA#E&D@sfqxI{-TneXD}7!>vFiQ>qjCfb`Z6K%#>eObwfzn$k>SFuePFS5(FpGQIf z2bS5c!?C?#QKQ`06%QdELd1S&e$OM_sNmolL)`lV_7=w4p*vdue=xEqU79g`s*O@= zQx?c)?)5RJA9xSIRicQFpffj)pBz_h+Sxcl%BX?ebmqEn(dTY7ziTKY+)W!B8`zRp z^e!1Wam5#A<@DF{n;sqGG0VjV`-#Vo%;9>Zp3JnKOD~iqPL6)|rc9lrZ}uLmU5oiEktw(f7D5b8c!NVc8Q3Fcn&AES#v8

h!tg4cLI_haMm^6jW)t*( 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 z zaDEk3#CvAZyqxm6st0fosdWoa`CxmT>X0dkefqaTX~06-Z)@xqj(W@IKJN0d!yt41 zj{ck@)L=a4$~Hu9c6|HD_>{KHh$$-}1tnx?sl5 zKQ!N_RI_RRYU%Z-$%d(h;w}8|wznU)mZJT!QQI;u_`Jqtt?S$8Qo0Ln-8bTy;ss31 zlwHFg3_CSs-{hYS_lQg^G8)~iHvAE#gvvLS5_|1Y1BvPD2r$@&SYm z(l3Gx+?||XM%x9Z5vuBv(uF-wT&8#nn51K}m_bis?=0yUY$U5o7E{*=-sqfDptjBM z&PXh|gFw@5!)~ z_3UcDPRmh&>M59QjqU6@G zO3M*rb*rZM`FF!BNb+GB?F~C58yHl_HISp+;lb{k!;?L6!P7!V%uA1TBTB5XJJKaT z^LMo&-fX${+~sD&em)tXyCH5KCR-E@a9$~0Jf-jTE z?jUBq*|@0#Arfv`Hu#l)&1J>#*~ z>`^tE^;3x_m_>+_NSC)m(9J>iARojhywg>~g%2oro3oWi=a6s}u>}XQh@kknMJv=+ zHyt3Yw}a>40Q{j2!bV?j>yWU2xOaSfcJkxl@#z_8K<)BxGqQ;NXc2+j|AO{UDsN1T zAmM|SctptpTcqAEA@bli7DGEvRZszXy7MJQ_{u z?DF;Z2+8C(oA1G+q$5~zwzu})u;toRNo&jQWsHX}rZ{pIRHIMMkg7uI%g8^&kM;F!erM|I1oh#WF`aTIwne(O`P5XUcY(!~ zS;Ynr@&Ft9>in`=vhtV{)OC!ATD?IiZW5OE>7psKZ3F!sw$}%a0&de=v74+h*1! zUo7Q4DjC<7I6-;_r11~BXeiP!XmX&6};kk691bup8Z7mk9?fRi__IC*1- zKja;|G4GI;E+}3!Kq7Dj{_@^eV5Q<7h;u{+hOp=6vM*#TtKnZrX8(UB7vq_5B2MO2 zkLJebWGZIzr z4IbaWz(A)Ui78KTETZBk9^FZR&FdW>lO6ZpYTisOXeD#@Kb~U!zlva;np>E`Mds5g zDV$PiwS6)KxAdY~uHUP4v7Y4VtqncV+p1LxG?W>Dtjkuo*UrP24(!G*?AG4X3><=A{We^$xU+|DQsJsnIaaY2;GiaEhW zW*epocf|ayyMkM1;kmau+G?_A8+U`GHblKw86554X(>M1fz1Za7$Eq8*3HawjwQ)& z55lO;Z-cyBa(Z4&W~g!w24dopOO$KF5K+j))b;2$t%XOWf>HR4R7pu*&W7k3QY&(1 zlCsl`18HB%GJU{9L6jc1q}YP;ByV481%ntjpKjIAM0A;0WK*HnM&%LC(eLEzF=APm ziLiphY9^-PH~s8%@9mMZeZz`iSM8#JtBLb3(UaXf7@v&~

+kWCDz4}9M&d_e+jGYo@H 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%0A9trcc=Z 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

w|!Ex5S0_wx&tV^l# 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

^qGCB~ExG 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

FqgDwjpT%qRZt4B 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

p;D|__x25nIq6opWzf*>!inM2c5_4ss|OyM)}X| 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%0D6s*o?uW!kF+q$ZwGy~Y8c~sGBW?Gx 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 z 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

v~y&P>i4KJ!Rz2gAf_m8?~fDJ&&d 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' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/deps/sqlite-autoconf-3320300/Makefile.am b/deps/sqlite-autoconf-3320300/Makefile.am new file mode 100644 index 000000000..20af7433b --- /dev/null +++ b/deps/sqlite-autoconf-3320300/Makefile.am @@ -0,0 +1,20 @@ + +AM_CFLAGS = @BUILD_CFLAGS@ +lib_LTLIBRARIES = libsqlite3.la +libsqlite3_la_SOURCES = sqlite3.c +libsqlite3_la_LDFLAGS = -no-undefined -version-info 8:6:8 + +bin_PROGRAMS = sqlite3 +sqlite3_SOURCES = shell.c sqlite3.h +EXTRA_sqlite3_SOURCES = sqlite3.c +sqlite3_LDADD = @EXTRA_SHELL_OBJ@ @READLINE_LIBS@ +sqlite3_DEPENDENCIES = @EXTRA_SHELL_OBJ@ +sqlite3_CFLAGS = $(AM_CFLAGS) -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB $(SHELL_CFLAGS) + +include_HEADERS = sqlite3.h sqlite3ext.h + +EXTRA_DIST = sqlite3.1 tea Makefile.msc sqlite3.rc README.txt Replace.cs Makefile.fallback +pkgconfigdir = ${libdir}/pkgconfig +pkgconfig_DATA = sqlite3.pc + +man_MANS = sqlite3.1 diff --git a/deps/sqlite-autoconf-3320300/Makefile.fallback b/deps/sqlite-autoconf-3320300/Makefile.fallback new file mode 100644 index 000000000..9355b147a --- /dev/null +++ b/deps/sqlite-autoconf-3320300/Makefile.fallback @@ -0,0 +1,19 @@ +#!/usr/bin/make +# +# If the configure script does not work, then this Makefile is available +# as a backup. Manually configure the variables below. +# +# Note: This makefile works out-of-the-box on MacOS 10.2 (Jaguar) +# +CC = gcc +CFLAGS = -O0 -I. +LIBS = -lz +COPTS += -D_BSD_SOURCE +COPTS += -DSQLITE_ENABLE_LOCKING_STYLE=0 +COPTS += -DSQLITE_THREADSAFE=0 +COPTS += -DSQLITE_OMIT_LOAD_EXTENSION +COPTS += -DSQLITE_WITHOUT_ZONEMALLOC +COPTS += -DSQLITE_ENABLE_RTREE + +sqlite3: shell.c sqlite3.c + $(CC) $(CFLAGS) $(COPTS) -o sqlite3 shell.c sqlite3.c $(LIBS) diff --git a/deps/sqlite-autoconf-3320300/Makefile.in b/deps/sqlite-autoconf-3320300/Makefile.in new file mode 100644 index 000000000..406f62b27 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/Makefile.in @@ -0,0 +1,1028 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = sqlite3$(EXEEXT) +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(include_HEADERS) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = sqlite3.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" \ + "$(DESTDIR)$(includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libsqlite3_la_LIBADD = +am_libsqlite3_la_OBJECTS = sqlite3.lo +libsqlite3_la_OBJECTS = $(am_libsqlite3_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libsqlite3_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libsqlite3_la_LDFLAGS) $(LDFLAGS) -o $@ +PROGRAMS = $(bin_PROGRAMS) +am_sqlite3_OBJECTS = sqlite3-shell.$(OBJEXT) +sqlite3_OBJECTS = $(am_sqlite3_OBJECTS) +sqlite3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sqlite3_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libsqlite3_la_SOURCES) $(sqlite3_SOURCES) \ + $(EXTRA_sqlite3_SOURCES) +DIST_SOURCES = $(libsqlite3_la_SOURCES) $(sqlite3_SOURCES) \ + $(EXTRA_sqlite3_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +DATA = $(pkgconfig_DATA) +HEADERS = $(include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/sqlite3.pc.in \ + INSTALL compile config.guess config.sub depcomp install-sh \ + ltmain.sh missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_CFLAGS = @BUILD_CFLAGS@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXTRA_SHELL_OBJ = @EXTRA_SHELL_OBJ@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHELL_CFLAGS = @SHELL_CFLAGS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = @BUILD_CFLAGS@ +lib_LTLIBRARIES = libsqlite3.la +libsqlite3_la_SOURCES = sqlite3.c +libsqlite3_la_LDFLAGS = -no-undefined -version-info 8:6:8 +sqlite3_SOURCES = shell.c sqlite3.h +EXTRA_sqlite3_SOURCES = sqlite3.c +sqlite3_LDADD = @EXTRA_SHELL_OBJ@ @READLINE_LIBS@ +sqlite3_DEPENDENCIES = @EXTRA_SHELL_OBJ@ +sqlite3_CFLAGS = $(AM_CFLAGS) -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB $(SHELL_CFLAGS) +include_HEADERS = sqlite3.h sqlite3ext.h +EXTRA_DIST = sqlite3.1 tea Makefile.msc sqlite3.rc README.txt Replace.cs Makefile.fallback +pkgconfigdir = ${libdir}/pkgconfig +pkgconfig_DATA = sqlite3.pc +man_MANS = sqlite3.1 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): +sqlite3.pc: $(top_builddir)/config.status $(srcdir)/sqlite3.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libsqlite3.la: $(libsqlite3_la_OBJECTS) $(libsqlite3_la_DEPENDENCIES) $(EXTRA_libsqlite3_la_DEPENDENCIES) + $(AM_V_CCLD)$(libsqlite3_la_LINK) -rpath $(libdir) $(libsqlite3_la_OBJECTS) $(libsqlite3_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +sqlite3$(EXEEXT): $(sqlite3_OBJECTS) $(sqlite3_DEPENDENCIES) $(EXTRA_sqlite3_DEPENDENCIES) + @rm -f sqlite3$(EXEEXT) + $(AM_V_CCLD)$(sqlite3_LINK) $(sqlite3_OBJECTS) $(sqlite3_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sqlite3-shell.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sqlite3-sqlite3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sqlite3.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +sqlite3-shell.o: shell.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sqlite3_CFLAGS) $(CFLAGS) -MT sqlite3-shell.o -MD -MP -MF $(DEPDIR)/sqlite3-shell.Tpo -c -o sqlite3-shell.o `test -f 'shell.c' || echo '$(srcdir)/'`shell.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sqlite3-shell.Tpo $(DEPDIR)/sqlite3-shell.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shell.c' object='sqlite3-shell.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sqlite3_CFLAGS) $(CFLAGS) -c -o sqlite3-shell.o `test -f 'shell.c' || echo '$(srcdir)/'`shell.c + +sqlite3-shell.obj: shell.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sqlite3_CFLAGS) $(CFLAGS) -MT sqlite3-shell.obj -MD -MP -MF $(DEPDIR)/sqlite3-shell.Tpo -c -o sqlite3-shell.obj `if test -f 'shell.c'; then $(CYGPATH_W) 'shell.c'; else $(CYGPATH_W) '$(srcdir)/shell.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sqlite3-shell.Tpo $(DEPDIR)/sqlite3-shell.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shell.c' object='sqlite3-shell.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sqlite3_CFLAGS) $(CFLAGS) -c -o sqlite3-shell.obj `if test -f 'shell.c'; then $(CYGPATH_W) 'shell.c'; else $(CYGPATH_W) '$(srcdir)/shell.c'; fi` + +sqlite3-sqlite3.o: sqlite3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sqlite3_CFLAGS) $(CFLAGS) -MT sqlite3-sqlite3.o -MD -MP -MF $(DEPDIR)/sqlite3-sqlite3.Tpo -c -o sqlite3-sqlite3.o `test -f 'sqlite3.c' || echo '$(srcdir)/'`sqlite3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sqlite3-sqlite3.Tpo $(DEPDIR)/sqlite3-sqlite3.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sqlite3.c' object='sqlite3-sqlite3.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sqlite3_CFLAGS) $(CFLAGS) -c -o sqlite3-sqlite3.o `test -f 'sqlite3.c' || echo '$(srcdir)/'`sqlite3.c + +sqlite3-sqlite3.obj: sqlite3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sqlite3_CFLAGS) $(CFLAGS) -MT sqlite3-sqlite3.obj -MD -MP -MF $(DEPDIR)/sqlite3-sqlite3.Tpo -c -o sqlite3-sqlite3.obj `if test -f 'sqlite3.c'; then $(CYGPATH_W) 'sqlite3.c'; else $(CYGPATH_W) '$(srcdir)/sqlite3.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sqlite3-sqlite3.Tpo $(DEPDIR)/sqlite3-sqlite3.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sqlite3.c' object='sqlite3-sqlite3.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sqlite3_CFLAGS) $(CFLAGS) -c -o sqlite3-sqlite3.obj `if test -f 'sqlite3.c'; then $(CYGPATH_W) 'sqlite3.c'; else $(CYGPATH_W) '$(srcdir)/sqlite3.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS install-man \ + install-pkgconfigDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES uninstall-man uninstall-pkgconfigDATA + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ + clean-binPROGRAMS clean-cscope clean-generic \ + clean-libLTLIBRARIES clean-libtool cscope cscopelist-am ctags \ + ctags-am dist dist-all dist-bzip2 dist-gzip dist-lzip \ + dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-includeHEADERS install-info \ + install-info-am install-libLTLIBRARIES install-man \ + install-man1 install-pdf install-pdf-am install-pkgconfigDATA \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-includeHEADERS uninstall-libLTLIBRARIES \ + uninstall-man uninstall-man1 uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/deps/sqlite-autoconf-3320300/Makefile.msc b/deps/sqlite-autoconf-3320300/Makefile.msc new file mode 100644 index 000000000..746162a00 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/Makefile.msc @@ -0,0 +1,1036 @@ +#### DO NOT EDIT #### +# This makefile is automatically generated from the Makefile.msc at +# the root of the canonical SQLite source tree (not the +# amalgamation tarball) using the tool/mkmsvcmin.tcl +# script. +# + +# +# nmake Makefile for SQLite +# +############################################################################### +############################## START OF OPTIONS ############################### +############################################################################### + +# The toplevel directory of the source tree. This is the directory +# that contains this "Makefile.msc". +# +TOP = . + + +# Set this non-0 to enable full warnings (-W4, etc) when compiling. +# +!IFNDEF USE_FULLWARN +USE_FULLWARN = 1 +!ENDIF + +# Set this non-0 to enable treating warnings as errors (-WX, etc) when +# compiling. +# +!IFNDEF USE_FATAL_WARN +USE_FATAL_WARN = 0 +!ENDIF + +# Set this non-0 to enable full runtime error checks (-RTC1, etc). This +# has no effect if (any) optimizations are enabled. +# +!IFNDEF USE_RUNTIME_CHECKS +USE_RUNTIME_CHECKS = 0 +!ENDIF + +# Set this non-0 to create a SQLite amalgamation file that excludes the +# various built-in extensions. +# +!IFNDEF MINIMAL_AMALGAMATION +MINIMAL_AMALGAMATION = 0 +!ENDIF + +# Set this non-0 to use "stdcall" calling convention for the core library +# and shell executable. +# +!IFNDEF USE_STDCALL +USE_STDCALL = 0 +!ENDIF + +# Set this non-0 to have the shell executable link against the core dynamic +# link library. +# +!IFNDEF DYNAMIC_SHELL +DYNAMIC_SHELL = 0 +!ENDIF + +# Set this non-0 to enable extra code that attempts to detect misuse of the +# SQLite API. +# +!IFNDEF API_ARMOR +API_ARMOR = 0 +!ENDIF + +# If necessary, create a list of harmless compiler warnings to disable when +# compiling the various tools. For the SQLite source code itself, warnings, +# if any, will be disabled from within it. +# +!IFNDEF NO_WARN +!IF $(USE_FULLWARN)!=0 +NO_WARN = -wd4054 -wd4055 -wd4100 -wd4127 -wd4130 -wd4152 -wd4189 -wd4206 +NO_WARN = $(NO_WARN) -wd4210 -wd4232 -wd4244 -wd4305 -wd4306 -wd4702 -wd4706 +!ENDIF +!ENDIF + +# Set this non-0 to use the library paths and other options necessary for +# Windows Phone 8.1. +# +!IFNDEF USE_WP81_OPTS +USE_WP81_OPTS = 0 +!ENDIF + +# Set this non-0 to split the SQLite amalgamation file into chunks to +# be used for debugging with Visual Studio. +# +!IFNDEF SPLIT_AMALGAMATION +SPLIT_AMALGAMATION = 0 +!ENDIF + + +# Set this non-0 to dynamically link to the MSVC runtime library. +# +!IFNDEF USE_CRT_DLL +USE_CRT_DLL = 0 +!ENDIF + +# Set this non-0 to link to the RPCRT4 library. +# +!IFNDEF USE_RPCRT4_LIB +USE_RPCRT4_LIB = 0 +!ENDIF + +# Set this non-0 to generate assembly code listings for the source code +# files. +# +!IFNDEF USE_LISTINGS +USE_LISTINGS = 0 +!ENDIF + +# Set this non-0 to attempt setting the native compiler automatically +# for cross-compiling the command line tools needed during the compilation +# process. +# +!IFNDEF XCOMPILE +XCOMPILE = 0 +!ENDIF + +# Set this non-0 to use the native libraries paths for cross-compiling +# the command line tools needed during the compilation process. +# +!IFNDEF USE_NATIVE_LIBPATHS +USE_NATIVE_LIBPATHS = 0 +!ENDIF + +# Set this 0 to skip the compiling and embedding of version resources. +# +!IFNDEF USE_RC +USE_RC = 1 +!ENDIF + +# Set this non-0 to compile binaries suitable for the WinRT environment. +# This setting does not apply to any binaries that require Tcl to operate +# properly (i.e. the text fixture, etc). +# +!IFNDEF FOR_WINRT +FOR_WINRT = 0 +!ENDIF + +# Set this non-0 to compile binaries suitable for the UWP environment. +# This setting does not apply to any binaries that require Tcl to operate +# properly (i.e. the text fixture, etc). +# +!IFNDEF FOR_UWP +FOR_UWP = 0 +!ENDIF + +# Set this non-0 to compile binaries suitable for the Windows 10 platform. +# +!IFNDEF FOR_WIN10 +FOR_WIN10 = 0 +!ENDIF + + +# Set this to non-0 to create and use PDBs. +# +!IFNDEF SYMBOLS +SYMBOLS = 1 +!ENDIF + +# Set this to non-0 to use the SQLite debugging heap subsystem. +# +!IFNDEF MEMDEBUG +MEMDEBUG = 0 +!ENDIF + +# Set this to non-0 to use the Win32 native heap subsystem. +# +!IFNDEF WIN32HEAP +WIN32HEAP = 0 +!ENDIF + +# Set this to non-0 to enable OSTRACE() macros, which can be useful when +# debugging. +# +!IFNDEF OSTRACE +OSTRACE = 0 +!ENDIF + +# Set this to one of the following values to enable various debugging +# features. Each level includes the debugging options from the previous +# levels. Currently, the recognized values for DEBUG are: +# +# 0 == NDEBUG: Disables assert() and other runtime diagnostics. +# 1 == SQLITE_ENABLE_API_ARMOR: extra attempts to detect misuse of the API. +# 2 == Disables NDEBUG and all optimizations and then enables PDBs. +# 3 == SQLITE_DEBUG: Enables various diagnostics messages and code. +# 4 == SQLITE_WIN32_MALLOC_VALIDATE: Validate the Win32 native heap per call. +# 5 == SQLITE_DEBUG_OS_TRACE: Enables output from the OSTRACE() macros. +# 6 == SQLITE_ENABLE_IOTRACE: Enables output from the IOTRACE() macros. +# +!IFNDEF DEBUG +DEBUG = 0 +!ENDIF + + +# Enable use of available compiler optimizations? Normally, this should be +# non-zero. Setting this to zero, thus disabling all compiler optimizations, +# can be useful for testing. +# +!IFNDEF OPTIMIZATIONS +OPTIMIZATIONS = 2 +!ENDIF + +# Set this to non-0 to enable support for the session extension. +# +!IFNDEF SESSION +SESSION = 0 +!ENDIF + +# Set this to non-0 to enable support for the rbu extension. +# +!IFNDEF RBU +RBU = 0 +!ENDIF + +# Set the source code file to be used by executables and libraries when +# they need the amalgamation. +# +!IFNDEF SQLITE3C +!IF $(SPLIT_AMALGAMATION)!=0 +SQLITE3C = sqlite3-all.c +!ELSE +SQLITE3C = sqlite3.c +!ENDIF +!ENDIF + +# Set the include code file to be used by executables and libraries when +# they need SQLite. +# +!IFNDEF SQLITE3H +SQLITE3H = sqlite3.h +!ENDIF + +# This is the name to use for the SQLite dynamic link library (DLL). +# +!IFNDEF SQLITE3DLL +!IF $(FOR_WIN10)!=0 +SQLITE3DLL = winsqlite3.dll +!ELSE +SQLITE3DLL = sqlite3.dll +!ENDIF +!ENDIF + +# This is the name to use for the SQLite import library (LIB). +# +!IFNDEF SQLITE3LIB +!IF $(FOR_WIN10)!=0 +SQLITE3LIB = winsqlite3.lib +!ELSE +SQLITE3LIB = sqlite3.lib +!ENDIF +!ENDIF + +# This is the name to use for the SQLite shell executable (EXE). +# +!IFNDEF SQLITE3EXE +!IF $(FOR_WIN10)!=0 +SQLITE3EXE = winsqlite3shell.exe +!ELSE +SQLITE3EXE = sqlite3.exe +!ENDIF +!ENDIF + +# This is the argument used to set the program database (PDB) file for the +# SQLite shell executable (EXE). +# +!IFNDEF SQLITE3EXEPDB +!IF $(FOR_WIN10)!=0 +SQLITE3EXEPDB = +!ELSE +SQLITE3EXEPDB = /pdb:sqlite3sh.pdb +!ENDIF +!ENDIF + + +# These are the "standard" SQLite compilation options used when compiling for +# the Windows platform. +# +!IFNDEF OPT_FEATURE_FLAGS +!IF $(MINIMAL_AMALGAMATION)==0 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS3=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_RTREE=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_GEOPOLY=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_JSON1=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBSTAT_VTAB=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_BYTECODE_VTAB=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 +!ENDIF +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1 +!ENDIF + +# Should the session extension be enabled? If so, add compilation options +# to enable it. +# +!IF $(SESSION)!=0 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_SESSION=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_PREUPDATE_HOOK=1 +!ENDIF + +# Should the rbu extension be enabled? If so, add compilation options +# to enable it. +# +!IF $(RBU)!=0 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_RBU=1 +!ENDIF + +# These are the "extended" SQLite compilation options used when compiling for +# the Windows 10 platform. +# +!IFNDEF EXT_FEATURE_FLAGS +!IF $(FOR_WIN10)!=0 +EXT_FEATURE_FLAGS = $(EXT_FEATURE_FLAGS) -DSQLITE_ENABLE_FTS4=1 +EXT_FEATURE_FLAGS = $(EXT_FEATURE_FLAGS) -DSQLITE_SYSTEM_MALLOC=1 +EXT_FEATURE_FLAGS = $(EXT_FEATURE_FLAGS) -DSQLITE_OMIT_LOCALTIME=1 +!ELSE +EXT_FEATURE_FLAGS = +!ENDIF +!ENDIF + +############################################################################### +############################### END OF OPTIONS ################################ +############################################################################### + +# When compiling for the Windows 10 platform, the PLATFORM macro must be set +# to an appropriate value (e.g. x86, x64, arm, arm64, etc). +# +!IF $(FOR_WIN10)!=0 +!IFNDEF PLATFORM +!ERROR Using the FOR_WIN10 option requires a value for PLATFORM. +!ENDIF +!ENDIF + +# This assumes that MSVC is always installed in 32-bit Program Files directory +# and sets the variable for use in locating other 32-bit installs accordingly. +# +PROGRAMFILES_X86 = $(VCINSTALLDIR)\..\.. +PROGRAMFILES_X86 = $(PROGRAMFILES_X86:\\=\) + +# Check for the predefined command macro CC. This should point to the compiler +# binary for the target platform. If it is not defined, simply define it to +# the legacy default value 'cl.exe'. +# +!IFNDEF CC +CC = cl.exe +!ENDIF + +# Check for the predefined command macro CSC. This should point to a working +# C Sharp compiler binary. If it is not defined, simply define it to the +# legacy default value 'csc.exe'. +# +!IFNDEF CSC +CSC = csc.exe +!ENDIF + +# Check for the command macro LD. This should point to the linker binary for +# the target platform. If it is not defined, simply define it to the legacy +# default value 'link.exe'. +# +!IFNDEF LD +LD = link.exe +!ENDIF + +# Check for the predefined command macro RC. This should point to the resource +# compiler binary for the target platform. If it is not defined, simply define +# it to the legacy default value 'rc.exe'. +# +!IFNDEF RC +RC = rc.exe +!ENDIF + +# Check for the MSVC runtime library path macro. Otherwise, this value will +# default to the 'lib' directory underneath the MSVC installation directory. +# +!IFNDEF CRTLIBPATH +CRTLIBPATH = $(VCINSTALLDIR)\lib +!ENDIF + +CRTLIBPATH = $(CRTLIBPATH:\\=\) + +# Check for the command macro NCC. This should point to the compiler binary +# for the platform the compilation process is taking place on. If it is not +# defined, simply define it to have the same value as the CC macro. When +# cross-compiling, it is suggested that this macro be modified via the command +# line (since nmake itself does not provide a built-in method to guess it). +# For example, to use the x86 compiler when cross-compiling for x64, a command +# line similar to the following could be used (all on one line): +# +# nmake /f Makefile.msc sqlite3.dll +# XCOMPILE=1 USE_NATIVE_LIBPATHS=1 +# +# Alternatively, the full path and file name to the compiler binary for the +# platform the compilation process is taking place may be specified (all on +# one line): +# +# nmake /f Makefile.msc sqlite3.dll +# "NCC=""%VCINSTALLDIR%\bin\cl.exe""" +# USE_NATIVE_LIBPATHS=1 +# +!IFDEF NCC +NCC = $(NCC:\\=\) +!ELSEIF $(XCOMPILE)!=0 +NCC = "$(VCINSTALLDIR)\bin\$(CC)" +NCC = $(NCC:\\=\) +!ELSE +NCC = $(CC) +!ENDIF + +# Check for the MSVC native runtime library path macro. Otherwise, +# this value will default to the 'lib' directory underneath the MSVC +# installation directory. +# +!IFNDEF NCRTLIBPATH +NCRTLIBPATH = $(VCINSTALLDIR)\lib +!ENDIF + +NCRTLIBPATH = $(NCRTLIBPATH:\\=\) + +# Check for the Platform SDK library path macro. Otherwise, this +# value will default to the 'lib' directory underneath the Windows +# SDK installation directory (the environment variable used appears +# to be available when using Visual C++ 2008 or later via the +# command line). +# +!IFNDEF NSDKLIBPATH +NSDKLIBPATH = $(WINDOWSSDKDIR)\lib +!ENDIF + +NSDKLIBPATH = $(NSDKLIBPATH:\\=\) + +# Check for the UCRT library path macro. Otherwise, this value will +# default to the version-specific, platform-specific 'lib' directory +# underneath the Windows SDK installation directory. +# +!IFNDEF UCRTLIBPATH +UCRTLIBPATH = $(WINDOWSSDKDIR)\lib\$(WINDOWSSDKLIBVERSION)\ucrt\$(PLATFORM) +!ENDIF + +UCRTLIBPATH = $(UCRTLIBPATH:\\=\) + +# C compiler and options for use in building executables that +# will run on the platform that is doing the build. +# +!IF $(USE_FULLWARN)!=0 +BCC = $(NCC) -nologo -W4 -Fd$*.pdb $(CCOPTS) $(BCCOPTS) +!ELSE +BCC = $(NCC) -nologo -W3 -Fd$*.pdb $(CCOPTS) $(BCCOPTS) +!ENDIF + +# Check if assembly code listings should be generated for the source +# code files to be compiled. +# +!IF $(USE_LISTINGS)!=0 +BCC = $(BCC) -FAcs +!ENDIF + +# Check if the native library paths should be used when compiling +# the command line tools used during the compilation process. If +# so, set the necessary macro now. +# +!IF $(USE_NATIVE_LIBPATHS)!=0 +NLTLIBPATHS = "/LIBPATH:$(NCRTLIBPATH)" "/LIBPATH:$(NSDKLIBPATH)" + +!IFDEF NUCRTLIBPATH +NUCRTLIBPATH = $(NUCRTLIBPATH:\\=\) +NLTLIBPATHS = $(NLTLIBPATHS) "/LIBPATH:$(NUCRTLIBPATH)" +!ENDIF +!ENDIF + +# C compiler and options for use in building executables that +# will run on the target platform. (BCC and TCC are usually the +# same unless your are cross-compiling.) +# +!IF $(USE_FULLWARN)!=0 +TCC = $(CC) -nologo -W4 -DINCLUDE_MSVC_H=1 $(CCOPTS) $(TCCOPTS) +!ELSE +TCC = $(CC) -nologo -W3 $(CCOPTS) $(TCCOPTS) +!ENDIF + +# Check if warnings should be treated as errors when compiling. +# +!IF $(USE_FATAL_WARN)!=0 +TCC = $(TCC) -WX +!ENDIF + +TCC = $(TCC) -DSQLITE_OS_WIN=1 -I. -I$(TOP) -fp:precise +RCC = $(RC) -DSQLITE_OS_WIN=1 -I. -I$(TOP) $(RCOPTS) $(RCCOPTS) + +# Check if we want to use the "stdcall" calling convention when compiling. +# This is not supported by the compilers for non-x86 platforms. It should +# also be noted here that building any target with these "stdcall" options +# will most likely fail if the Tcl library is also required. This is due +# to how the Tcl library functions are declared and exported (i.e. without +# an explicit calling convention, which results in "cdecl"). +# +!IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0 +!IF "$(PLATFORM)"=="x86" +CORE_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_APICALL=__stdcall -DSQLITE_CALLBACK=__stdcall -DSQLITE_SYSAPI=__stdcall +SHELL_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_APICALL=__stdcall -DSQLITE_CALLBACK=__stdcall -DSQLITE_SYSAPI=__stdcall +!ELSE +!IFNDEF PLATFORM +CORE_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_APICALL=__stdcall -DSQLITE_CALLBACK=__stdcall -DSQLITE_SYSAPI=__stdcall +SHELL_CCONV_OPTS = -Gz -DSQLITE_CDECL=__cdecl -DSQLITE_APICALL=__stdcall -DSQLITE_CALLBACK=__stdcall -DSQLITE_SYSAPI=__stdcall +!ELSE +CORE_CCONV_OPTS = +SHELL_CCONV_OPTS = +!ENDIF +!ENDIF +!ELSE +CORE_CCONV_OPTS = +SHELL_CCONV_OPTS = +!ENDIF + +# These are additional compiler options used for the core library. +# +!IFNDEF CORE_COMPILE_OPTS +!IF $(DYNAMIC_SHELL)!=0 || $(FOR_WIN10)!=0 +CORE_COMPILE_OPTS = $(CORE_CCONV_OPTS) -DSQLITE_API=__declspec(dllexport) +!ELSE +CORE_COMPILE_OPTS = $(CORE_CCONV_OPTS) +!ENDIF +!ENDIF + +# These are the additional targets that the core library should depend on +# when linking. +# +!IFNDEF CORE_LINK_DEP +!IF $(DYNAMIC_SHELL)!=0 +CORE_LINK_DEP = +!ELSEIF $(FOR_WIN10)==0 || "$(PLATFORM)"=="x86" +CORE_LINK_DEP = sqlite3.def +!ELSE +CORE_LINK_DEP = +!ENDIF +!ENDIF + +# These are additional linker options used for the core library. +# +!IFNDEF CORE_LINK_OPTS +!IF $(DYNAMIC_SHELL)!=0 +CORE_LINK_OPTS = +!ELSEIF $(FOR_WIN10)==0 || "$(PLATFORM)"=="x86" +CORE_LINK_OPTS = /DEF:sqlite3.def +!ELSE +CORE_LINK_OPTS = +!ENDIF +!ENDIF + +# These are additional compiler options used for the shell executable. +# +!IFNDEF SHELL_COMPILE_OPTS +!IF $(DYNAMIC_SHELL)!=0 || $(FOR_WIN10)!=0 +SHELL_COMPILE_OPTS = $(SHELL_CCONV_OPTS) -DSQLITE_API=__declspec(dllimport) +!ELSE +SHELL_COMPILE_OPTS = $(SHELL_CCONV_OPTS) +!ENDIF +!ENDIF + +# This is the source code that the shell executable should be compiled +# with. +# +!IFNDEF SHELL_CORE_SRC +!IF $(DYNAMIC_SHELL)!=0 || $(FOR_WIN10)!=0 +SHELL_CORE_SRC = +!ELSE +SHELL_CORE_SRC = $(SQLITE3C) +!ENDIF +!ENDIF + +# This is the core library that the shell executable should depend on. +# +!IFNDEF SHELL_CORE_DEP +!IF $(DYNAMIC_SHELL)!=0 || $(FOR_WIN10)!=0 +SHELL_CORE_DEP = $(SQLITE3DLL) +!ELSE +SHELL_CORE_DEP = +!ENDIF +!ENDIF + + +# This is the core library that the shell executable should link with. +# +!IFNDEF SHELL_CORE_LIB +!IF $(DYNAMIC_SHELL)!=0 || $(FOR_WIN10)!=0 +SHELL_CORE_LIB = $(SQLITE3LIB) +!ELSE +SHELL_CORE_LIB = +!ENDIF +!ENDIF + +# These are additional linker options used for the shell executable. +# +!IFNDEF SHELL_LINK_OPTS +SHELL_LINK_OPTS = $(SHELL_CORE_LIB) +!ENDIF + +# Check if assembly code listings should be generated for the source +# code files to be compiled. +# +!IF $(USE_LISTINGS)!=0 +TCC = $(TCC) -FAcs +!ENDIF + +# When compiling the library for use in the WinRT environment, +# the following compile-time options must be used as well to +# disable use of Win32 APIs that are not available and to enable +# use of Win32 APIs that are specific to Windows 8 and/or WinRT. +# +!IF $(FOR_WINRT)!=0 +TCC = $(TCC) -DSQLITE_OS_WINRT=1 +RCC = $(RCC) -DSQLITE_OS_WINRT=1 +TCC = $(TCC) -DWINAPI_FAMILY=WINAPI_FAMILY_APP +RCC = $(RCC) -DWINAPI_FAMILY=WINAPI_FAMILY_APP +!ENDIF + +# C compiler options for the Windows 10 platform (needs MSVC 2015). +# +!IF $(FOR_WIN10)!=0 +TCC = $(TCC) /d2guard4 -D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE +BCC = $(BCC) /d2guard4 -D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE +!ENDIF + +# Also, we need to dynamically link to the correct MSVC runtime +# when compiling for WinRT (e.g. debug or release) OR if the +# USE_CRT_DLL option is set to force dynamically linking to the +# MSVC runtime library. +# +!IF $(FOR_WINRT)!=0 || $(USE_CRT_DLL)!=0 +!IF $(DEBUG)>1 +TCC = $(TCC) -MDd +BCC = $(BCC) -MDd +!ELSE +TCC = $(TCC) -MD +BCC = $(BCC) -MD +!ENDIF +!ELSE +!IF $(DEBUG)>1 +TCC = $(TCC) -MTd +BCC = $(BCC) -MTd +!ELSE +TCC = $(TCC) -MT +BCC = $(BCC) -MT +!ENDIF +!ENDIF + + +# Define -DNDEBUG to compile without debugging (i.e., for production usage) +# Omitting the define will cause extra debugging code to be inserted and +# includes extra comments when "EXPLAIN stmt" is used. +# +!IF $(DEBUG)==0 +TCC = $(TCC) -DNDEBUG +BCC = $(BCC) -DNDEBUG +RCC = $(RCC) -DNDEBUG +!ENDIF + +!IF $(DEBUG)>0 || $(API_ARMOR)!=0 || $(FOR_WIN10)!=0 +TCC = $(TCC) -DSQLITE_ENABLE_API_ARMOR=1 +RCC = $(RCC) -DSQLITE_ENABLE_API_ARMOR=1 +!ENDIF + +!IF $(DEBUG)>2 +TCC = $(TCC) -DSQLITE_DEBUG=1 +RCC = $(RCC) -DSQLITE_DEBUG=1 +!IF $(DYNAMIC_SHELL)==0 +TCC = $(TCC) -DSQLITE_ENABLE_WHERETRACE -DSQLITE_ENABLE_SELECTTRACE +RCC = $(RCC) -DSQLITE_ENABLE_WHERETRACE -DSQLITE_ENABLE_SELECTTRACE +!ENDIF +!ENDIF + +!IF $(DEBUG)>4 || $(OSTRACE)!=0 +TCC = $(TCC) -DSQLITE_FORCE_OS_TRACE=1 -DSQLITE_DEBUG_OS_TRACE=1 +RCC = $(RCC) -DSQLITE_FORCE_OS_TRACE=1 -DSQLITE_DEBUG_OS_TRACE=1 +!ENDIF + +!IF $(DEBUG)>5 +TCC = $(TCC) -DSQLITE_ENABLE_IOTRACE=1 +RCC = $(RCC) -DSQLITE_ENABLE_IOTRACE=1 +!ENDIF + +# Prevent warnings about "insecure" MSVC runtime library functions +# being used. +# +TCC = $(TCC) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS +BCC = $(BCC) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS +RCC = $(RCC) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS + +# Prevent warnings about "deprecated" POSIX functions being used. +# +TCC = $(TCC) -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS +BCC = $(BCC) -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS +RCC = $(RCC) -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS + +# Use the SQLite debugging heap subsystem? +# +!IF $(MEMDEBUG)!=0 +TCC = $(TCC) -DSQLITE_MEMDEBUG=1 +RCC = $(RCC) -DSQLITE_MEMDEBUG=1 + +# Use native Win32 heap subsystem instead of malloc/free? +# +!ELSEIF $(WIN32HEAP)!=0 +TCC = $(TCC) -DSQLITE_WIN32_MALLOC=1 +RCC = $(RCC) -DSQLITE_WIN32_MALLOC=1 + +# Validate the heap on every call into the native Win32 heap subsystem? +# +!IF $(DEBUG)>3 +TCC = $(TCC) -DSQLITE_WIN32_MALLOC_VALIDATE=1 +RCC = $(RCC) -DSQLITE_WIN32_MALLOC_VALIDATE=1 +!ENDIF +!ENDIF + + +# Compiler options needed for programs that use the readline() library. +# +!IFNDEF READLINE_FLAGS +READLINE_FLAGS = -DHAVE_READLINE=0 +!ENDIF + +# The library that programs using readline() must link against. +# +!IFNDEF LIBREADLINE +LIBREADLINE = +!ENDIF + +# Should the database engine be compiled threadsafe +# +TCC = $(TCC) -DSQLITE_THREADSAFE=1 +RCC = $(RCC) -DSQLITE_THREADSAFE=1 + +# Do threads override each others locks by default (1), or do we test (-1) +# +TCC = $(TCC) -DSQLITE_THREAD_OVERRIDE_LOCK=-1 +RCC = $(RCC) -DSQLITE_THREAD_OVERRIDE_LOCK=-1 + +# Any target libraries which libsqlite must be linked against +# +!IFNDEF TLIBS +TLIBS = +!ENDIF + +# Flags controlling use of the in memory btree implementation +# +# SQLITE_TEMP_STORE is 0 to force temporary tables to be in a file, 1 to +# default to file, 2 to default to memory, and 3 to force temporary +# tables to always be in memory. +# +TCC = $(TCC) -DSQLITE_TEMP_STORE=1 +RCC = $(RCC) -DSQLITE_TEMP_STORE=1 + +# Enable/disable loadable extensions, and other optional features +# based on configuration. (-DSQLITE_OMIT*, -DSQLITE_ENABLE*). +# The same set of OMIT and ENABLE flags should be passed to the +# LEMON parser generator and the mkkeywordhash tool as well. + +# These are the required SQLite compilation options used when compiling for +# the Windows platform. +# +REQ_FEATURE_FLAGS = $(REQ_FEATURE_FLAGS) -DSQLITE_MAX_TRIGGER_DEPTH=100 + +# If we are linking to the RPCRT4 library, enable features that need it. +# +!IF $(USE_RPCRT4_LIB)!=0 +REQ_FEATURE_FLAGS = $(REQ_FEATURE_FLAGS) -DSQLITE_WIN32_USE_UUID=1 +!ENDIF + +# Add the required and optional SQLite compilation options into the command +# lines used to invoke the MSVC code and resource compilers. +# +TCC = $(TCC) $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(EXT_FEATURE_FLAGS) +RCC = $(RCC) $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(EXT_FEATURE_FLAGS) + +# Add in any optional parameters specified on the commane line, e.g. +# nmake /f Makefile.msc all "OPTS=-DSQLITE_ENABLE_FOO=1 -DSQLITE_OMIT_FOO=1" +# +TCC = $(TCC) $(OPTS) +RCC = $(RCC) $(OPTS) + +# If compiling for debugging, add some defines. +# +!IF $(DEBUG)>1 +TCC = $(TCC) -D_DEBUG +BCC = $(BCC) -D_DEBUG +RCC = $(RCC) -D_DEBUG +!ENDIF + +# If optimizations are enabled or disabled (either implicitly or +# explicitly), add the necessary flags. +# +!IF $(DEBUG)>1 || $(OPTIMIZATIONS)==0 +TCC = $(TCC) -Od +BCC = $(BCC) -Od +!IF $(USE_RUNTIME_CHECKS)!=0 +TCC = $(TCC) -RTC1 +BCC = $(BCC) -RTC1 +!ENDIF +!ELSEIF $(OPTIMIZATIONS)>=3 +TCC = $(TCC) -Ox +BCC = $(BCC) -Ox +!ELSEIF $(OPTIMIZATIONS)==2 +TCC = $(TCC) -O2 +BCC = $(BCC) -O2 +!ELSEIF $(OPTIMIZATIONS)==1 +TCC = $(TCC) -O1 +BCC = $(BCC) -O1 +!ENDIF + +# If symbols are enabled (or compiling for debugging), enable PDBs. +# +!IF $(DEBUG)>1 || $(SYMBOLS)!=0 +TCC = $(TCC) -Zi +BCC = $(BCC) -Zi +!ENDIF + + +# Command line prefixes for compiling code, compiling resources, +# linking, etc. +# +LTCOMPILE = $(TCC) -Fo$@ -Fd$*.pdb +LTRCOMPILE = $(RCC) -r +LTLIB = lib.exe +LTLINK = $(TCC) -Fe$@ + +# If requested, link to the RPCRT4 library. +# +!IF $(USE_RPCRT4_LIB)!=0 +LTLIBS = $(LTLIBS) rpcrt4.lib +!ENDIF + +# If a platform was set, force the linker to target that. +# Note that the vcvars*.bat family of batch files typically +# set this for you. Otherwise, the linker will attempt +# to deduce the binary type based on the object files. +!IFDEF PLATFORM +LTLINKOPTS = /NOLOGO /MACHINE:$(PLATFORM) +LTLIBOPTS = /NOLOGO /MACHINE:$(PLATFORM) +!ELSEIF "$(VISUALSTUDIOVERSION)"=="12.0" || \ + "$(VISUALSTUDIOVERSION)"=="14.0" || \ + "$(VISUALSTUDIOVERSION)"=="15.0" +LTLINKOPTS = /NOLOGO /MACHINE:x86 +LTLIBOPTS = /NOLOGO /MACHINE:x86 +!ELSE +LTLINKOPTS = /NOLOGO +LTLIBOPTS = /NOLOGO +!ENDIF + +# When compiling for use in the WinRT environment, the following +# linker option must be used to mark the executable as runnable +# only in the context of an application container. +# +!IF $(FOR_WINRT)!=0 +LTLINKOPTS = $(LTLINKOPTS) /APPCONTAINER +!IF "$(VISUALSTUDIOVERSION)"=="12.0" || "$(VISUALSTUDIOVERSION)"=="14.0" +!IFNDEF STORELIBPATH +!IF "$(PLATFORM)"=="x86" +STORELIBPATH = $(CRTLIBPATH)\store +!ELSEIF "$(PLATFORM)"=="x64" +STORELIBPATH = $(CRTLIBPATH)\store\amd64 +!ELSEIF "$(PLATFORM)"=="ARM" +STORELIBPATH = $(CRTLIBPATH)\store\arm +!ELSE +STORELIBPATH = $(CRTLIBPATH)\store +!ENDIF +!ENDIF +STORELIBPATH = $(STORELIBPATH:\\=\) +LTLINKOPTS = $(LTLINKOPTS) "/LIBPATH:$(STORELIBPATH)" +!ENDIF +!ENDIF + +# When compiling for Windows Phone 8.1, an extra library path is +# required. +# +!IF $(USE_WP81_OPTS)!=0 +!IFNDEF WP81LIBPATH +!IF "$(PLATFORM)"=="x86" +WP81LIBPATH = $(PROGRAMFILES_X86)\Windows Phone Kits\8.1\lib\x86 +!ELSEIF "$(PLATFORM)"=="ARM" +WP81LIBPATH = $(PROGRAMFILES_X86)\Windows Phone Kits\8.1\lib\ARM +!ELSE +WP81LIBPATH = $(PROGRAMFILES_X86)\Windows Phone Kits\8.1\lib\x86 +!ENDIF +!ENDIF +!ENDIF + +# When compiling for Windows Phone 8.1, some extra linker options +# are also required. +# +!IF $(USE_WP81_OPTS)!=0 +!IFDEF WP81LIBPATH +LTLINKOPTS = $(LTLINKOPTS) "/LIBPATH:$(WP81LIBPATH)" +!ENDIF +LTLINKOPTS = $(LTLINKOPTS) /DYNAMICBASE +LTLINKOPTS = $(LTLINKOPTS) WindowsPhoneCore.lib RuntimeObject.lib PhoneAppModelHost.lib +LTLINKOPTS = $(LTLINKOPTS) /NODEFAULTLIB:kernel32.lib /NODEFAULTLIB:ole32.lib +!ENDIF + +# When compiling for UWP or the Windows 10 platform, some extra linker +# options are also required. +# +!IF $(FOR_UWP)!=0 || $(FOR_WIN10)!=0 +LTLINKOPTS = $(LTLINKOPTS) /DYNAMICBASE /NODEFAULTLIB:kernel32.lib +LTLINKOPTS = $(LTLINKOPTS) mincore.lib +!IFDEF PSDKLIBPATH +LTLINKOPTS = $(LTLINKOPTS) "/LIBPATH:$(PSDKLIBPATH)" +!ENDIF +!ENDIF + +!IF $(FOR_WIN10)!=0 +LTLINKOPTS = $(LTLINKOPTS) /guard:cf "/LIBPATH:$(UCRTLIBPATH)" +!IF $(DEBUG)>1 +LTLINKOPTS = $(LTLINKOPTS) /NODEFAULTLIB:libucrtd.lib /DEFAULTLIB:ucrtd.lib +!ELSE +LTLINKOPTS = $(LTLINKOPTS) /NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib +!ENDIF +!ENDIF + +# If either debugging or symbols are enabled, enable PDBs. +# +!IF $(DEBUG)>1 || $(SYMBOLS)!=0 +LDFLAGS = /DEBUG $(LDOPTS) +!ELSE +LDFLAGS = $(LDOPTS) +!ENDIF + + +# You should not have to change anything below this line +############################################################################### + + +# Object files for the amalgamation. +# +LIBOBJS1 = sqlite3.lo + +# Determine the real value of LIBOBJ based on the 'configure' script +# +LIBOBJ = $(LIBOBJS1) + +# Determine if embedded resource compilation and usage are enabled. +# +!IF $(USE_RC)!=0 +LIBRESOBJS = sqlite3res.lo +!ELSE +LIBRESOBJS = +!ENDIF + + +# Additional compiler options for the shell. These are only effective +# when the shell is not being dynamically linked. +# +!IF $(DYNAMIC_SHELL)==0 && $(FOR_WIN10)==0 +SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_FTS4=1 +SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_EXPLAIN_COMMENTS=1 +SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_OFFSET_SQL_FUNC=1 +SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_DESERIALIZE=1 +!ENDIF + + +# This is the default Makefile target. The objects listed here +# are what get build when you type just "make" with no arguments. +# +core: dll shell + +# Targets that require the Tcl library. +# +tcl: $(ALL_TCL_TARGETS) + +# This Makefile target builds all of the standard binaries. +# +all: core tcl + +# Dynamic link library section. +# +dll: $(SQLITE3DLL) + +# Shell executable. +# +shell: $(SQLITE3EXE) + + +$(SQLITE3DLL): $(LIBOBJ) $(LIBRESOBJS) $(CORE_LINK_DEP) + $(LD) $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) /DLL $(CORE_LINK_OPTS) /OUT:$@ $(LIBOBJ) $(LIBRESOBJS) $(LTLIBS) $(TLIBS) + +Replace.exe: + $(CSC) /target:exe $(TOP)\Replace.cs + +sqlite3.def: Replace.exe $(LIBOBJ) + echo EXPORTS > sqlite3.def + dumpbin /all $(LIBOBJ) \ + | .\Replace.exe "^\s+/EXPORT:_?(sqlite3(?:session|changeset|changegroup|rebaser|rbu)?_[^@,]*)(?:@\d+|,DATA)?$$" $$1 true \ + | sort >> sqlite3.def + +$(SQLITE3EXE): shell.c $(SHELL_CORE_DEP) $(LIBRESOBJS) $(SHELL_CORE_SRC) $(SQLITE3H) + $(LTLINK) $(SHELL_COMPILE_OPTS) $(READLINE_FLAGS) shell.c $(SHELL_CORE_SRC) \ + /link $(SQLITE3EXEPDB) $(LDFLAGS) $(LTLINKOPTS) $(SHELL_LINK_OPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LIBREADLINE) $(LTLIBS) $(TLIBS) + + +# Rule to build the amalgamation +# +sqlite3.lo: $(SQLITE3C) + $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(SQLITE3C) + + +# Rule to build the Win32 resources object file. +# +!IF $(USE_RC)!=0 +_HASHCHAR=^# +!IF ![echo !IFNDEF VERSION > rcver.vc] && \ + ![for /F "delims=" %V in ('type "$(SQLITE3H)" ^| "%SystemRoot%\System32\find.exe" "$(_HASHCHAR)define SQLITE_VERSION "') do (echo VERSION = ^^%V >> rcver.vc)] && \ + ![echo !ENDIF >> rcver.vc] +!INCLUDE rcver.vc +!ENDIF + +RESOURCE_VERSION = $(VERSION:^#=) +RESOURCE_VERSION = $(RESOURCE_VERSION:define=) +RESOURCE_VERSION = $(RESOURCE_VERSION:SQLITE_VERSION=) +RESOURCE_VERSION = $(RESOURCE_VERSION:"=) +RESOURCE_VERSION = $(RESOURCE_VERSION:.=,) + +$(LIBRESOBJS): $(TOP)\sqlite3.rc rcver.vc $(SQLITE3H) + echo #ifndef SQLITE_RESOURCE_VERSION > sqlite3rc.h + echo #define SQLITE_RESOURCE_VERSION $(RESOURCE_VERSION) >> sqlite3rc.h + echo #endif >> sqlite3rc.h + $(LTRCOMPILE) -fo $(LIBRESOBJS) -DRC_VERONLY $(TOP)\sqlite3.rc +!ENDIF + + +clean: + del /Q *.exp *.lo *.ilk *.lib *.obj *.ncb *.pdb *.sdf *.suo 2>NUL + del /Q *.bsc *.def *.cod *.da *.bb *.bbg *.vc gmon.out 2>NUL + del /Q $(SQLITE3EXE) $(SQLITE3DLL) Replace.exe 2>NUL diff --git a/deps/sqlite-autoconf-3320300/README.txt b/deps/sqlite-autoconf-3320300/README.txt new file mode 100644 index 000000000..6e62a4e13 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/README.txt @@ -0,0 +1,113 @@ +This package contains: + + * the SQLite library amalgamation source code file: sqlite3.c + * the sqlite3.h and sqlite3ext.h header files that define the C-language + interface to the sqlite3.c library file + * the shell.c file used to build the sqlite3 command-line shell program + * autoconf/automake installation infrastucture for building on POSIX + compliant systems + * a Makefile.msc, sqlite3.rc, and Replace.cs for building with Microsoft + Visual C++ on Windows + +SUMMARY OF HOW TO BUILD +======================= + + Unix: ./configure; make + Windows: nmake /f Makefile.msc + +BUILDING ON POSIX +================= + +The generic installation instructions for autoconf/automake are found +in the INSTALL file. + +The following SQLite specific boolean options are supported: + + --enable-readline use readline in shell tool [default=yes] + --enable-threadsafe build a thread-safe library [default=yes] + --enable-dynamic-extensions support loadable extensions [default=yes] + +The default value for the CFLAGS variable (options passed to the C +compiler) includes debugging symbols in the build, resulting in larger +binaries than are necessary. Override it on the configure command +line like this: + + $ CFLAGS="-Os" ./configure + +to produce a smaller installation footprint. + +Other SQLite compilation parameters can also be set using CFLAGS. For +example: + + $ CFLAGS="-Os -DSQLITE_THREADSAFE=0" ./configure + + +BUILDING WITH MICROSOFT VISUAL C++ +================================== + +To compile for Windows using Microsoft Visual C++: + + $ nmake /f Makefile.msc + +Using Microsoft Visual C++ 2005 (or later) is recommended. Several Windows +platform variants may be built by adding additional macros to the NMAKE +command line. + +Building for WinRT 8.0 +---------------------- + + FOR_WINRT=1 + +Using Microsoft Visual C++ 2012 (or later) is required. When using the +above, something like the following macro will need to be added to the +NMAKE command line as well: + + "NSDKLIBPATH=%WindowsSdkDir%\..\8.0\lib\win8\um\x86" + +Building for WinRT 8.1 +---------------------- + + FOR_WINRT=1 + +Using Microsoft Visual C++ 2013 (or later) is required. When using the +above, something like the following macro will need to be added to the +NMAKE command line as well: + + "NSDKLIBPATH=%WindowsSdkDir%\..\8.1\lib\winv6.3\um\x86" + +Building for UWP 10.0 +--------------------- + + FOR_WINRT=1 FOR_UWP=1 + +Using Microsoft Visual C++ 2015 (or later) is required. When using the +above, something like the following macros will need to be added to the +NMAKE command line as well: + + "NSDKLIBPATH=%WindowsSdkDir%\..\10\lib\10.0.10586.0\um\x86" + "PSDKLIBPATH=%WindowsSdkDir%\..\10\lib\10.0.10586.0\um\x86" + "NUCRTLIBPATH=%UniversalCRTSdkDir%\..\10\lib\10.0.10586.0\ucrt\x86" + +Building for the Windows 10 SDK +------------------------------- + + FOR_WIN10=1 + +Using Microsoft Visual C++ 2015 (or later) is required. When using the +above, no other macros should be needed on the NMAKE command line. + +Other preprocessor defines +-------------------------- + +Additionally, preprocessor defines may be specified by using the OPTS macro +on the NMAKE command line. However, not all possible preprocessor defines +may be specified in this manner as some require the amalgamation to be built +with them enabled (see http://www.sqlite.org/compile.html). For example, the +following will work: + + "OPTS=-DSQLITE_ENABLE_STAT4=1 -DSQLITE_ENABLE_JSON1=1" + +However, the following will not compile unless the amalgamation was built +with it enabled: + + "OPTS=-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1" diff --git a/deps/sqlite-autoconf-3320300/Replace.cs b/deps/sqlite-autoconf-3320300/Replace.cs new file mode 100644 index 000000000..3475a47e6 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/Replace.cs @@ -0,0 +1,223 @@ +/* +** 2016 February 26 +** +** 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 C# code to perform regular expression replacements +** using the standard input and output channels. +*/ + +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; + +/////////////////////////////////////////////////////////////////////////////// + +#region Assembly Metadata +[assembly: AssemblyTitle("Replace Tool")] +[assembly: AssemblyDescription("Replace text using standard input/output.")] +[assembly: AssemblyCompany("SQLite Development Team")] +[assembly: AssemblyProduct("SQLite")] +[assembly: AssemblyCopyright("Public Domain")] +[assembly: ComVisible(false)] +[assembly: Guid("95a0513f-8863-48cd-a76f-cb80868cb578")] +[assembly: AssemblyVersion("1.0.*")] + +#if DEBUG +[assembly: AssemblyConfiguration("Debug")] +#else +[assembly: AssemblyConfiguration("Release")] +#endif +#endregion + +/////////////////////////////////////////////////////////////////////////////// + +namespace Replace +{ + ///

+ /// This enumeration is used to represent all the possible exit codes from + /// this tool. + /// + internal enum ExitCode + { + /// + /// The file download was a success. + /// + Success = 0, + + /// + /// The command line arguments are missing (i.e. null). Generally, + /// this should not happen. + /// + MissingArgs = 1, + + /// + /// The wrong number of command line arguments was supplied. + /// + WrongNumArgs = 2, + + /// + /// The "matchingOnly" flag could not be converted to a value of the + /// type. + /// + BadMatchingOnlyFlag = 3, + + /// + /// An exception was caught in . Generally, this + /// should not happen. + /// + Exception = 4 + } + + /////////////////////////////////////////////////////////////////////////// + + internal static class Replace + { + #region Private Support Methods + /// + /// This method displays an error message to the console and/or + /// displays the command line usage information for this tool. + /// + /// + /// The error message to display, if any. + /// + /// + /// Non-zero to display the command line usage information. + /// + private static void Error( + string message, + bool usage + ) + { + if (message != null) + Console.WriteLine(message); + + string fileName = Path.GetFileName( + Process.GetCurrentProcess().MainModule.FileName); + + Console.WriteLine(String.Format( + "usage: {0} ", + fileName)); + } + #endregion + + /////////////////////////////////////////////////////////////////////// + + #region Program Entry Point + /// + /// This is the entry-point for this tool. It handles processing the + /// command line arguments, reading from the standard input channel, + /// replacing any matching lines of text, and writing to the standard + /// output channel. + /// + /// + /// The command line arguments. + /// + /// + /// Zero upon success; non-zero on failure. This will be one of the + /// values from the enumeration. + /// + private static int Main( + string[] args + ) + { + // + // NOTE: Sanity check the command line arguments. + // + if (args == null) + { + Error(null, true); + return (int)ExitCode.MissingArgs; + } + + if (args.Length != 3) + { + Error(null, true); + return (int)ExitCode.WrongNumArgs; + } + + try + { + // + // NOTE: Create a regular expression from the first command + // line argument. Then, grab the replacement string, + // which is the second argument. + // + Regex regEx = new Regex(args[0]); + string replacement = args[1]; + + // + // NOTE: Attempt to convert the third argument to a boolean. + // + bool matchingOnly; + + if (!bool.TryParse(args[2], out matchingOnly)) + { + Error(null, true); + return (int)ExitCode.BadMatchingOnlyFlag; + } + + // + // NOTE: Grab the standard input and output channels from the + // console. + // + TextReader inputTextReader = Console.In; + TextWriter outputTextWriter = Console.Out; + + // + // NOTE: Loop until end-of-file is hit on the standard input + // stream. + // + while (true) + { + // + // NOTE: Read a line from the standard input channel. If + // null is returned here, there is no more input and + // we are done. + // + string inputLine = inputTextReader.ReadLine(); + + if (inputLine == null) + break; + + // + // NOTE: Perform regular expression replacements on this + // line, if any. Then, write the modified line to + // the standard output channel. + // + string outputLine = regEx.Replace(inputLine, replacement); + + if (!matchingOnly || !String.Equals( + inputLine, outputLine, StringComparison.Ordinal)) + { + outputTextWriter.WriteLine(outputLine); + } + } + + // + // NOTE: At this point, everything has succeeded. + // + return (int)ExitCode.Success; + } + catch (Exception e) + { + // + // NOTE: An exception was caught. Report it via the console + // and return failure. + // + Error(e.ToString(), false); + return (int)ExitCode.Exception; + } + } + #endregion + } +} diff --git a/deps/sqlite-autoconf-3320300/aclocal.m4 b/deps/sqlite-autoconf-3320300/aclocal.m4 new file mode 100644 index 000000000..53c1fc39d --- /dev/null +++ b/deps/sqlite-autoconf-3320300/aclocal.m4 @@ -0,0 +1,10199 @@ +# generated automatically by aclocal 1.15.1 -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS + +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) + +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) + +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) + +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) + +# Copyright (C) 2002-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + diff --git a/deps/sqlite-autoconf-3320300/compile b/deps/sqlite-autoconf-3320300/compile new file mode 100755 index 000000000..a85b723c7 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/deps/sqlite-autoconf-3320300/config.guess b/deps/sqlite-autoconf-3320300/config.guess new file mode 100755 index 000000000..f50dcdb6d --- /dev/null +++ b/deps/sqlite-autoconf-3320300/config.guess @@ -0,0 +1,1480 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-02-24' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > "$dummy.c" ; + for c in cc gcc c89 c99 ; do + if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval "$set_cc_for_build" + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval "$set_cc_for_build" + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval "$set_cc_for_build" + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + eval "$set_cc_for_build" + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + i*86:Minix:*:*) + echo "$UNAME_MACHINE"-pc-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + eval "$set_cc_for_build" + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" + test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + if objdump -f /bin/sh | grep -q elf32-x86-64; then + echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 + else + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + fi + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval "$set_cc_for_build" + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-functions 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/deps/sqlite-autoconf-3320300/config.sub b/deps/sqlite-autoconf-3320300/config.sub new file mode 100755 index 000000000..1d8e98bce --- /dev/null +++ b/deps/sqlite-autoconf-3320300/config.sub @@ -0,0 +1,1801 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-02-22' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo "$1" | sed 's/-[^-]*$//'` + if [ "$basic_machine" != "$1" ] + then os=`echo "$1" | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | wasm32 \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | wasm32-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-pc + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2*) + basic_machine=m68k-bull + os=-sysv3 + ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=$os"spe" + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + nsv-tandem) + basic_machine=nsv-tandem + ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + x64) + basic_machine=x86_64-pc + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases that might get confused + # with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # es1800 is here to avoid being matched by es* (a different OS) + -es1800*) + os=-ose + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ + | -midnightbsd*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -xray | -os68k* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo "$os" | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4*) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $basic_machine in + arm*) + os=-eabi + ;; + *) + os=-elf + ;; + esac + ;; + -nacl*) + ;; + -ios) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + pru-*) + os=-elf + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` + ;; +esac + +echo "$basic_machine$os" +exit + +# Local variables: +# eval: (add-hook 'write-file-functions 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/deps/sqlite-autoconf-3320300/configure b/deps/sqlite-autoconf-3320300/configure new file mode 100755 index 000000000..c37b49ae4 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/configure @@ -0,0 +1,16004 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for sqlite 3.32.3. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: http://www.sqlite.org about your system, including any +$0: error possibly output before this message. Then install +$0: a modern shell, or manually run the script under such a +$0: shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='sqlite' +PACKAGE_TARNAME='sqlite' +PACKAGE_VERSION='3.32.3' +PACKAGE_STRING='sqlite 3.32.3' +PACKAGE_BUGREPORT='http://www.sqlite.org' +PACKAGE_URL='' + +ac_unique_file="sqlite3.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +SHELL_CFLAGS +EXTRA_SHELL_OBJ +READLINE_LIBS +BUILD_CFLAGS +CPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_largefile +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_editline +enable_readline +enable_threadsafe +enable_dynamic_extensions +enable_fts4 +enable_fts3 +enable_fts5 +enable_json1 +enable_rtree +enable_session +enable_debug +enable_static_shell +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +LT_SYS_LIBRARY_PATH +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures sqlite 3.32.3 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/sqlite] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of sqlite 3.32.3:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --disable-largefile omit support for large files + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-editline use BSD libedit + --enable-readline use readline + --enable-threadsafe build a thread-safe library [default=yes] + --enable-dynamic-extensions + support loadable extensions [default=yes] + --enable-fts4 include fts4 support [default=yes] + --enable-fts3 include fts3 support [default=no] + --enable-fts5 include fts5 support [default=yes] + --enable-json1 include json1 support [default=yes] + --enable-rtree include rtree support [default=yes] + --enable-session enable the session extension [default=no] + --enable-debug build with debugging features enabled [default=no] + --enable-static-shell statically link libsqlite3 into shell tool + [default=yes] + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +sqlite configure 3.32.3 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ------------------------------------ ## +## Report this to http://www.sqlite.org ## +## ------------------------------------ ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by sqlite $as_me 3.32.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_aux_dir= +for ac_dir in . "$srcdir"/.; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in . \"$srcdir\"/." "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +# Use automake. +am__api_version='1.15' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='sqlite' + VERSION='3.32.3' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if ${ac_cv_sys_largefile_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if ${ac_cv_sys_file_offset_bits+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if ${ac_cv_sys_large_files+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi + + +fi + + +# Check for required programs. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + link_all_deplibs=no + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + + +# Check for library functions that SQLite can optionally use. +for ac_func in fdatasync usleep fullfsync localtime_r gmtime_r +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" +if test "x$ac_cv_have_decl_strerror_r" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRERROR_R $ac_have_decl +_ACEOF + +for ac_func in strerror_r +do : + ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" +if test "x$ac_cv_func_strerror_r" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRERROR_R 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5 +$as_echo_n "checking whether strerror_r returns char *... " >&6; } +if ${ac_cv_func_strerror_r_char_p+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ac_cv_func_strerror_r_char_p=no + if test $ac_cv_have_decl_strerror_r = yes; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + char buf[100]; + char x = *strerror_r (0, buf, sizeof buf); + char *p = strerror_r (0, buf, sizeof buf); + return !p || x; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_func_strerror_r_char_p=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + else + # strerror_r is not declared. Choose between + # systems that have relatively inaccessible declarations for the + # function. BeOS and DEC UNIX 4.0 fall in this category, but the + # former has a strerror_r that returns char*, while the latter + # has a strerror_r that returns `int'. + # This test should segfault on the DEC system. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + extern char *strerror_r (); +int +main () +{ +char buf[100]; + char x = *strerror_r (0, buf, sizeof buf); + return ! isalpha (x); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_strerror_r_char_p=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5 +$as_echo "$ac_cv_func_strerror_r_char_p" >&6; } +if test $ac_cv_func_strerror_r_char_p = yes; then + +$as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h + +fi + + +ac_config_files="$ac_config_files Makefile sqlite3.pc" + +BUILD_CFLAGS= + + +#------------------------------------------------------------------------- +# Two options to enable readline compatible libraries: +# +# --enable-editline +# --enable-readline +# +# Both are enabled by default. If, after command line processing both are +# still enabled, the script searches for editline first and automatically +# disables readline if it is found. So, to use readline explicitly, the +# user must pass "--disable-editline". To disable command line editing +# support altogether, "--disable-editline --disable-readline". +# +# When searching for either library, check for headers before libraries +# as some distros supply packages that contain libraries but not header +# files, which come as a separate development package. +# +# Check whether --enable-editline was given. +if test "${enable_editline+set}" = set; then : + enableval=$enable_editline; +fi + +# Check whether --enable-readline was given. +if test "${enable_readline+set}" = set; then : + enableval=$enable_readline; +fi + + +if test x"$enable_editline" != xno ; then : + + for ac_header in editline/readline.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_editline_readline_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_EDITLINE_READLINE_H 1 +_ACEOF + + sLIBS=$LIBS + LIBS="" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing readline" >&5 +$as_echo_n "checking for library containing readline... " >&6; } +if ${ac_cv_search_readline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char readline (); +int +main () +{ +return readline (); + ; + return 0; +} +_ACEOF +for ac_lib in '' edit; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib -ltinfo $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_readline=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_readline+:} false; then : + break +fi +done +if ${ac_cv_search_readline+:} false; then : + +else + ac_cv_search_readline=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_readline" >&5 +$as_echo "$ac_cv_search_readline" >&6; } +ac_res=$ac_cv_search_readline +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + + +$as_echo "#define HAVE_EDITLINE 1" >>confdefs.h + + READLINE_LIBS="$LIBS -ltinfo" + enable_readline=no + +fi + + { ac_cv_search_readline=; unset ac_cv_search_readline;} + LIBS=$sLIBS + +fi + +done + + +fi + +if test x"$enable_readline" != xno ; then : + + for ac_header in readline/readline.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_readline_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_READLINE_READLINE_H 1 +_ACEOF + + sLIBS=$LIBS + LIBS="" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5 +$as_echo_n "checking for library containing tgetent... " >&6; } +if ${ac_cv_search_tgetent+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char tgetent (); +int +main () +{ +return tgetent (); + ; + return 0; +} +_ACEOF +for ac_lib in '' termcap curses ncurses ncursesw; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_tgetent=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_tgetent+:} false; then : + break +fi +done +if ${ac_cv_search_tgetent+:} false; then : + +else + ac_cv_search_tgetent=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_tgetent" >&5 +$as_echo "$ac_cv_search_tgetent" >&6; } +ac_res=$ac_cv_search_tgetent +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing readline" >&5 +$as_echo_n "checking for library containing readline... " >&6; } +if ${ac_cv_search_readline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char readline (); +int +main () +{ +return readline (); + ; + return 0; +} +_ACEOF +for ac_lib in '' readline edit; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_readline=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_readline+:} false; then : + break +fi +done +if ${ac_cv_search_readline+:} false; then : + +else + ac_cv_search_readline=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_readline" >&5 +$as_echo "$ac_cv_search_readline" >&6; } +ac_res=$ac_cv_search_readline +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + + +$as_echo "#define HAVE_READLINE 1" >>confdefs.h + + READLINE_LIBS=$LIBS + +fi + + LIBS=$sLIBS + +fi + +done + + +fi + + +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-threadsafe +# +# Check whether --enable-threadsafe was given. +if test "${enable_threadsafe+set}" = set; then : + enableval=$enable_threadsafe; +else + enable_threadsafe=yes +fi + +if test x"$enable_threadsafe" != "xno"; then + BUILD_CFLAGS="$BUILD_CFLAGS -D_REENTRANT=1 -DSQLITE_THREADSAFE=1" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pthread_create" >&5 +$as_echo_n "checking for library containing pthread_create... " >&6; } +if ${ac_cv_search_pthread_create+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_create (); +int +main () +{ +return pthread_create (); + ; + return 0; +} +_ACEOF +for ac_lib in '' pthread; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_pthread_create=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_pthread_create+:} false; then : + break +fi +done +if ${ac_cv_search_pthread_create+:} false; then : + +else + ac_cv_search_pthread_create=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pthread_create" >&5 +$as_echo "$ac_cv_search_pthread_create" >&6; } +ac_res=$ac_cv_search_pthread_create +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pthread_mutexattr_init" >&5 +$as_echo_n "checking for library containing pthread_mutexattr_init... " >&6; } +if ${ac_cv_search_pthread_mutexattr_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutexattr_init (); +int +main () +{ +return pthread_mutexattr_init (); + ; + return 0; +} +_ACEOF +for ac_lib in '' pthread; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_pthread_mutexattr_init=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_pthread_mutexattr_init+:} false; then : + break +fi +done +if ${ac_cv_search_pthread_mutexattr_init+:} false; then : + +else + ac_cv_search_pthread_mutexattr_init=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pthread_mutexattr_init" >&5 +$as_echo "$ac_cv_search_pthread_mutexattr_init" >&6; } +ac_res=$ac_cv_search_pthread_mutexattr_init +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-dynamic-extensions +# +# Check whether --enable-dynamic-extensions was given. +if test "${enable_dynamic_extensions+set}" = set; then : + enableval=$enable_dynamic_extensions; +else + enable_dynamic_extensions=yes +fi + +if test x"$enable_dynamic_extensions" != "xno"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 +$as_echo_n "checking for library containing dlopen... " >&6; } +if ${ac_cv_search_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_dlopen=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_dlopen+:} false; then : + break +fi +done +if ${ac_cv_search_dlopen+:} false; then : + +else + ac_cv_search_dlopen=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 +$as_echo "$ac_cv_search_dlopen" >&6; } +ac_res=$ac_cv_search_dlopen +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +else + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_OMIT_LOAD_EXTENSION=1" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for whether to support dynamic extensions" >&5 +$as_echo_n "checking for whether to support dynamic extensions... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_dynamic_extensions" >&5 +$as_echo "$enable_dynamic_extensions" >&6; } +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-fts4 +# +# Check whether --enable-fts4 was given. +if test "${enable_fts4+set}" = set; then : + enableval=$enable_fts4; +else + enable_fts4=yes +fi + +if test x"$enable_fts4" = "xyes"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_FTS4" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-fts3 +# +# Check whether --enable-fts3 was given. +if test "${enable_fts3+set}" = set; then : + enableval=$enable_fts3; +fi + +if test x"$enable_fts3" = "xyes" -a x"$enable_fts4" = "xno"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_FTS3" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-fts5 +# +# Check whether --enable-fts5 was given. +if test "${enable_fts5+set}" = set; then : + enableval=$enable_fts5; +else + enable_fts5=yes +fi + +if test x"$enable_fts5" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing log" >&5 +$as_echo_n "checking for library containing log... " >&6; } +if ${ac_cv_search_log+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char log (); +int +main () +{ +return log (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_log=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_log+:} false; then : + break +fi +done +if ${ac_cv_search_log+:} false; then : + +else + ac_cv_search_log=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_log" >&5 +$as_echo "$ac_cv_search_log" >&6; } +ac_res=$ac_cv_search_log +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_FTS5" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-json1 +# +# Check whether --enable-json1 was given. +if test "${enable_json1+set}" = set; then : + enableval=$enable_json1; +else + enable_json1=yes +fi + +if test x"$enable_json1" = "xyes"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_JSON1" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-rtree +# +# Check whether --enable-rtree was given. +if test "${enable_rtree+set}" = set; then : + enableval=$enable_rtree; +else + enable_rtree=yes +fi + +if test x"$enable_rtree" = "xyes"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-session +# +# Check whether --enable-session was given. +if test "${enable_session+set}" = set; then : + enableval=$enable_session; +fi + +if test x"$enable_session" = "xyes"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-debug +# +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +fi + +if test x"$enable_debug" = "xyes"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_DEBUG -DSQLITE_ENABLE_SELECTTRACE -DSQLITE_ENABLE_WHERETRACE" + CFLAGS="-g -O0" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-static-shell +# +# Check whether --enable-static-shell was given. +if test "${enable_static_shell+set}" = set; then : + enableval=$enable_static_shell; +else + enable_static_shell=yes +fi + +if test x"$enable_static_shell" = "xyes"; then + EXTRA_SHELL_OBJ=sqlite3-sqlite3.$OBJEXT +else + EXTRA_SHELL_OBJ=libsqlite3.la +fi + +#----------------------------------------------------------------------- + +for ac_func in posix_fallocate +do : + ac_fn_c_check_func "$LINENO" "posix_fallocate" "ac_cv_func_posix_fallocate" +if test "x$ac_cv_func_posix_fallocate" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_POSIX_FALLOCATE 1 +_ACEOF + +fi +done + +for ac_header in zlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ZLIB_H 1 +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing deflate" >&5 +$as_echo_n "checking for library containing deflate... " >&6; } +if ${ac_cv_search_deflate+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char deflate (); +int +main () +{ +return deflate (); + ; + return 0; +} +_ACEOF +for ac_lib in '' z; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_deflate=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_deflate+:} false; then : + break +fi +done +if ${ac_cv_search_deflate+:} false; then : + +else + ac_cv_search_deflate=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_deflate" >&5 +$as_echo "$ac_cv_search_deflate" >&6; } +ac_res=$ac_cv_search_deflate +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_HAVE_ZLIB" +fi + + +fi + +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing system" >&5 +$as_echo_n "checking for library containing system... " >&6; } +if ${ac_cv_search_system+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char system (); +int +main () +{ +return system (); + ; + return 0; +} +_ACEOF +for ac_lib in '' ; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_system=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_system+:} false; then : + break +fi +done +if ${ac_cv_search_system+:} false; then : + +else + ac_cv_search_system=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_system" >&5 +$as_echo "$ac_cv_search_system" >&6; } +ac_res=$ac_cv_search_system +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +else + SHELL_CFLAGS="-DSQLITE_NOHAVE_SYSTEM" +fi + + + +#----------------------------------------------------------------------- +# UPDATE: Maybe it's better if users just set CFLAGS before invoking +# configure. This option doesn't really add much... +# +# --enable-tempstore +# +# AC_ARG_ENABLE(tempstore, [AS_HELP_STRING( +# [--enable-tempstore], +# [in-memory temporary tables (never, no, yes, always) [default=no]])], +# [], [enable_tempstore=no]) +# AC_MSG_CHECKING([for whether or not to store temp tables in-memory]) +# case "$enable_tempstore" in +# never ) TEMP_STORE=0 ;; +# no ) TEMP_STORE=1 ;; +# always ) TEMP_STORE=3 ;; +# yes ) TEMP_STORE=3 ;; +# * ) +# TEMP_STORE=1 +# enable_tempstore=yes +# ;; +# esac +# AC_MSG_RESULT($enable_tempstore) +# AC_SUBST(TEMP_STORE) +#----------------------------------------------------------------------- + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by sqlite $as_me 3.32.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +sqlite config.status 3.32.3 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "sqlite3.pc") CONFIG_FILES="$CONFIG_FILES sqlite3.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/deps/sqlite-autoconf-3320300/configure.ac b/deps/sqlite-autoconf-3320300/configure.ac new file mode 100644 index 000000000..35bbeb8e9 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/configure.ac @@ -0,0 +1,239 @@ + +#----------------------------------------------------------------------- +# Supports the following non-standard switches. +# +# --enable-threadsafe +# --enable-readline +# --enable-editline +# --enable-static-shell +# --enable-dynamic-extensions +# + +AC_PREREQ(2.61) +AC_INIT(sqlite, 3.32.3, http://www.sqlite.org) +AC_CONFIG_SRCDIR([sqlite3.c]) +AC_CONFIG_AUX_DIR([.]) + +# Use automake. +AM_INIT_AUTOMAKE([foreign]) + +AC_SYS_LARGEFILE + +# Check for required programs. +AC_PROG_CC +AC_PROG_LIBTOOL +AC_PROG_MKDIR_P + +# Check for library functions that SQLite can optionally use. +AC_CHECK_FUNCS([fdatasync usleep fullfsync localtime_r gmtime_r]) +AC_FUNC_STRERROR_R + +AC_CONFIG_FILES([Makefile sqlite3.pc]) +BUILD_CFLAGS= +AC_SUBST(BUILD_CFLAGS) + +#------------------------------------------------------------------------- +# Two options to enable readline compatible libraries: +# +# --enable-editline +# --enable-readline +# +# Both are enabled by default. If, after command line processing both are +# still enabled, the script searches for editline first and automatically +# disables readline if it is found. So, to use readline explicitly, the +# user must pass "--disable-editline". To disable command line editing +# support altogether, "--disable-editline --disable-readline". +# +# When searching for either library, check for headers before libraries +# as some distros supply packages that contain libraries but not header +# files, which come as a separate development package. +# +AC_ARG_ENABLE(editline, [AS_HELP_STRING([--enable-editline],[use BSD libedit])]) +AC_ARG_ENABLE(readline, [AS_HELP_STRING([--enable-readline],[use readline])]) + +AS_IF([ test x"$enable_editline" != xno ],[ + AC_CHECK_HEADERS([editline/readline.h],[ + sLIBS=$LIBS + LIBS="" + AC_SEARCH_LIBS([readline],[edit],[ + AC_DEFINE([HAVE_EDITLINE],1,Define to use BSD editline) + READLINE_LIBS="$LIBS -ltinfo" + enable_readline=no + ],[],[-ltinfo]) + AS_UNSET(ac_cv_search_readline) + LIBS=$sLIBS + ]) +]) + +AS_IF([ test x"$enable_readline" != xno ],[ + AC_CHECK_HEADERS([readline/readline.h],[ + sLIBS=$LIBS + LIBS="" + AC_SEARCH_LIBS(tgetent, termcap curses ncurses ncursesw, [], []) + AC_SEARCH_LIBS(readline,[readline edit], [ + AC_DEFINE([HAVE_READLINE],1,Define to use readline or wrapper) + READLINE_LIBS=$LIBS + ]) + LIBS=$sLIBS + ]) +]) + +AC_SUBST(READLINE_LIBS) +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-threadsafe +# +AC_ARG_ENABLE(threadsafe, [AS_HELP_STRING( + [--enable-threadsafe], [build a thread-safe library [default=yes]])], + [], [enable_threadsafe=yes]) +if test x"$enable_threadsafe" != "xno"; then + BUILD_CFLAGS="$BUILD_CFLAGS -D_REENTRANT=1 -DSQLITE_THREADSAFE=1" + AC_SEARCH_LIBS(pthread_create, pthread) + AC_SEARCH_LIBS(pthread_mutexattr_init, pthread) +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-dynamic-extensions +# +AC_ARG_ENABLE(dynamic-extensions, [AS_HELP_STRING( + [--enable-dynamic-extensions], [support loadable extensions [default=yes]])], + [], [enable_dynamic_extensions=yes]) +if test x"$enable_dynamic_extensions" != "xno"; then + AC_SEARCH_LIBS(dlopen, dl) +else + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_OMIT_LOAD_EXTENSION=1" +fi +AC_MSG_CHECKING([for whether to support dynamic extensions]) +AC_MSG_RESULT($enable_dynamic_extensions) +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-fts4 +# +AC_ARG_ENABLE(fts4, [AS_HELP_STRING( + [--enable-fts4], [include fts4 support [default=yes]])], + [], [enable_fts4=yes]) +if test x"$enable_fts4" = "xyes"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_FTS4" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-fts3 +# +AC_ARG_ENABLE(fts3, [AS_HELP_STRING( + [--enable-fts3], [include fts3 support [default=no]])], + [], []) +if test x"$enable_fts3" = "xyes" -a x"$enable_fts4" = "xno"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_FTS3" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-fts5 +# +AC_ARG_ENABLE(fts5, [AS_HELP_STRING( + [--enable-fts5], [include fts5 support [default=yes]])], + [], [enable_fts5=yes]) +if test x"$enable_fts5" = "xyes"; then + AC_SEARCH_LIBS(log, m) + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_FTS5" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-json1 +# +AC_ARG_ENABLE(json1, [AS_HELP_STRING( + [--enable-json1], [include json1 support [default=yes]])], + [],[enable_json1=yes]) +if test x"$enable_json1" = "xyes"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_JSON1" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-rtree +# +AC_ARG_ENABLE(rtree, [AS_HELP_STRING( + [--enable-rtree], [include rtree support [default=yes]])], + [], [enable_rtree=yes]) +if test x"$enable_rtree" = "xyes"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-session +# +AC_ARG_ENABLE(session, [AS_HELP_STRING( + [--enable-session], [enable the session extension [default=no]])], + [], []) +if test x"$enable_session" = "xyes"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-debug +# +AC_ARG_ENABLE(debug, [AS_HELP_STRING( + [--enable-debug], [build with debugging features enabled [default=no]])], + [], []) +if test x"$enable_debug" = "xyes"; then + BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_DEBUG -DSQLITE_ENABLE_SELECTTRACE -DSQLITE_ENABLE_WHERETRACE" + CFLAGS="-g -O0" +fi +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-static-shell +# +AC_ARG_ENABLE(static-shell, [AS_HELP_STRING( + [--enable-static-shell], + [statically link libsqlite3 into shell tool [default=yes]])], + [], [enable_static_shell=yes]) +if test x"$enable_static_shell" = "xyes"; then + EXTRA_SHELL_OBJ=sqlite3-sqlite3.$OBJEXT +else + EXTRA_SHELL_OBJ=libsqlite3.la +fi +AC_SUBST(EXTRA_SHELL_OBJ) +#----------------------------------------------------------------------- + +AC_CHECK_FUNCS(posix_fallocate) +AC_CHECK_HEADERS(zlib.h,[ + AC_SEARCH_LIBS(deflate,z,[BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_HAVE_ZLIB"]) +]) + +AC_SEARCH_LIBS(system,,,[SHELL_CFLAGS="-DSQLITE_NOHAVE_SYSTEM"]) +AC_SUBST(SHELL_CFLAGS) + +#----------------------------------------------------------------------- +# UPDATE: Maybe it's better if users just set CFLAGS before invoking +# configure. This option doesn't really add much... +# +# --enable-tempstore +# +# AC_ARG_ENABLE(tempstore, [AS_HELP_STRING( +# [--enable-tempstore], +# [in-memory temporary tables (never, no, yes, always) [default=no]])], +# [], [enable_tempstore=no]) +# AC_MSG_CHECKING([for whether or not to store temp tables in-memory]) +# case "$enable_tempstore" in +# never ) TEMP_STORE=0 ;; +# no ) TEMP_STORE=1 ;; +# always ) TEMP_STORE=3 ;; +# yes ) TEMP_STORE=3 ;; +# * ) +# TEMP_STORE=1 +# enable_tempstore=yes +# ;; +# esac +# AC_MSG_RESULT($enable_tempstore) +# AC_SUBST(TEMP_STORE) +#----------------------------------------------------------------------- + +AC_OUTPUT diff --git a/deps/sqlite-autoconf-3320300/depcomp b/deps/sqlite-autoconf-3320300/depcomp new file mode 100755 index 000000000..b39f98f9a --- /dev/null +++ b/deps/sqlite-autoconf-3320300/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/deps/sqlite-autoconf-3320300/install-sh b/deps/sqlite-autoconf-3320300/install-sh new file mode 100755 index 000000000..59990a104 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/install-sh @@ -0,0 +1,508 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2014-09-12.12; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # $RANDOM is not portable (e.g. dash); use it when possible to + # lower collision chance + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # As "mkdir -p" follows symlinks and we work in /tmp possibly; so + # create the $tmpdir first (and fail if unsuccessful) to make sure + # that nobody tries to guess the $tmpdir name. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/deps/sqlite-autoconf-3320300/ltmain.sh b/deps/sqlite-autoconf-3320300/ltmain.sh new file mode 100644 index 000000000..a736cf994 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/ltmain.sh @@ -0,0 +1,11156 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.6 Debian-2.4.6-2" +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname $scriptversion Debian-2.4.6-2 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type '$version_type'" + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/deps/sqlite-autoconf-3320300/missing b/deps/sqlite-autoconf-3320300/missing new file mode 100755 index 000000000..f62bbae30 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/deps/sqlite-autoconf-3320300/shell.c b/deps/sqlite-autoconf-3320300/shell.c new file mode 100644 index 000000000..974f57af7 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/shell.c @@ -0,0 +1,19550 @@ +/* DO NOT EDIT! +** This file is automatically generated by the script in the canonical +** SQLite source tree at tool/mkshellc.tcl. That script combines source +** code from various constituent source files of SQLite into this single +** "shell.c" file used to implement the SQLite command-line shell. +** +** Most of the code found below comes from the "src/shell.c.in" file in +** the canonical SQLite source tree. That main file contains "INCLUDE" +** lines that specify other files in the canonical source tree that are +** inserted to getnerate this complete program source file. +** +** The code from multiple files is combined into this single "shell.c" +** source file to help make the command-line program easier to compile. +** +** To modify this program, get a copy of the canonical SQLite source tree, +** edit the src/shell.c.in" and/or some of the other files that are included +** by "src/shell.c.in", then rerun the tool/mkshellc.tcl script. +*/ +/* +** 2001 September 15 +** +** 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 code to implement the "sqlite" command line +** utility for accessing SQLite databases. +*/ +#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS) +/* This needs to come before any includes for MSVC compiler */ +#define _CRT_SECURE_NO_WARNINGS +#endif + +/* +** Determine if we are dealing with WinRT, which provides only a subset of +** the full Win32 API. +*/ +#if !defined(SQLITE_OS_WINRT) +# define SQLITE_OS_WINRT 0 +#endif + +/* +** Warning pragmas copied from msvc.h in the core. +*/ +#if defined(_MSC_VER) +#pragma warning(disable : 4054) +#pragma warning(disable : 4055) +#pragma warning(disable : 4100) +#pragma warning(disable : 4127) +#pragma warning(disable : 4130) +#pragma warning(disable : 4152) +#pragma warning(disable : 4189) +#pragma warning(disable : 4206) +#pragma warning(disable : 4210) +#pragma warning(disable : 4232) +#pragma warning(disable : 4244) +#pragma warning(disable : 4305) +#pragma warning(disable : 4306) +#pragma warning(disable : 4702) +#pragma warning(disable : 4706) +#endif /* defined(_MSC_VER) */ + +/* +** No support for loadable extensions in VxWorks. +*/ +#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION +# define SQLITE_OMIT_LOAD_EXTENSION 1 +#endif + +/* +** Enable large-file support for fopen() and friends on unix. +*/ +#ifndef SQLITE_DISABLE_LFS +# define _LARGE_FILE 1 +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +#endif + +#include +#include +#include +#include +#include "sqlite3.h" +typedef sqlite3_int64 i64; +typedef sqlite3_uint64 u64; +typedef unsigned char u8; +#if SQLITE_USER_AUTHENTICATION +# include "sqlite3userauth.h" +#endif +#include +#include + +#if !defined(_WIN32) && !defined(WIN32) +# include +# if !defined(__RTP__) && !defined(_WRS_KERNEL) +# include +# endif +#endif +#if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__) +# include +# include +# define GETPID getpid +# if defined(__MINGW32__) +# define DIRENT dirent +# ifndef S_ISLNK +# define S_ISLNK(mode) (0) +# endif +# endif +#else +# define GETPID (int)GetCurrentProcessId +#endif +#include +#include + +#if HAVE_READLINE +# include +# include +#endif + +#if HAVE_EDITLINE +# include +#endif + +#if HAVE_EDITLINE || HAVE_READLINE + +# define shell_add_history(X) add_history(X) +# define shell_read_history(X) read_history(X) +# define shell_write_history(X) write_history(X) +# define shell_stifle_history(X) stifle_history(X) +# define shell_readline(X) readline(X) + +#elif HAVE_LINENOISE + +# include "linenoise.h" +# define shell_add_history(X) linenoiseHistoryAdd(X) +# define shell_read_history(X) linenoiseHistoryLoad(X) +# define shell_write_history(X) linenoiseHistorySave(X) +# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X) +# define shell_readline(X) linenoise(X) + +#else + +# define shell_read_history(X) +# define shell_write_history(X) +# define shell_stifle_history(X) + +# define SHELL_USE_LOCAL_GETLINE 1 +#endif + + +#if defined(_WIN32) || defined(WIN32) +# if SQLITE_OS_WINRT +# define SQLITE_OMIT_POPEN 1 +# else +# include +# include +# define isatty(h) _isatty(h) +# ifndef access +# define access(f,m) _access((f),(m)) +# endif +# ifndef unlink +# define unlink _unlink +# endif +# ifndef strdup +# define strdup _strdup +# endif +# undef popen +# define popen _popen +# undef pclose +# define pclose _pclose +# endif +#else + /* Make sure isatty() has a prototype. */ + extern int isatty(int); + +# if !defined(__RTP__) && !defined(_WRS_KERNEL) + /* popen and pclose are not C89 functions and so are + ** sometimes omitted from the header */ + extern FILE *popen(const char*,const char*); + extern int pclose(FILE*); +# else +# define SQLITE_OMIT_POPEN 1 +# endif +#endif + +#if defined(_WIN32_WCE) +/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() + * thus we always assume that we have a console. That can be + * overridden with the -batch command line option. + */ +#define isatty(x) 1 +#endif + +/* ctype macros that work with signed characters */ +#define IsSpace(X) isspace((unsigned char)X) +#define IsDigit(X) isdigit((unsigned char)X) +#define ToLower(X) (char)tolower((unsigned char)X) + +#if defined(_WIN32) || defined(WIN32) +#if SQLITE_OS_WINRT +#include +#endif +#include + +/* string conversion routines only needed on Win32 */ +extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR); +extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int); +extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int); +extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText); +#endif + +/* On Windows, we normally run with output mode of TEXT so that \n characters +** are automatically translated into \r\n. However, this behavior needs +** to be disabled in some cases (ex: when generating CSV output and when +** rendering quoted strings that contain \n characters). The following +** routines take care of that. +*/ +#if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT +static void setBinaryMode(FILE *file, int isOutput){ + if( isOutput ) fflush(file); + _setmode(_fileno(file), _O_BINARY); +} +static void setTextMode(FILE *file, int isOutput){ + if( isOutput ) fflush(file); + _setmode(_fileno(file), _O_TEXT); +} +#else +# define setBinaryMode(X,Y) +# define setTextMode(X,Y) +#endif + + +/* True if the timer is enabled */ +static int enableTimer = 0; + +/* Return the current wall-clock time */ +static sqlite3_int64 timeOfDay(void){ + static sqlite3_vfs *clockVfs = 0; + sqlite3_int64 t; + if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); + if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){ + clockVfs->xCurrentTimeInt64(clockVfs, &t); + }else{ + double r; + clockVfs->xCurrentTime(clockVfs, &r); + t = (sqlite3_int64)(r*86400000.0); + } + return t; +} + +#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux) +#include +#include + +/* VxWorks does not support getrusage() as far as we can determine */ +#if defined(_WRS_KERNEL) || defined(__RTP__) +struct rusage { + struct timeval ru_utime; /* user CPU time used */ + struct timeval ru_stime; /* system CPU time used */ +}; +#define getrusage(A,B) memset(B,0,sizeof(*B)) +#endif + +/* Saved resource information for the beginning of an operation */ +static struct rusage sBegin; /* CPU time at start */ +static sqlite3_int64 iBegin; /* Wall-clock time at start */ + +/* +** Begin timing an operation +*/ +static void beginTimer(void){ + if( enableTimer ){ + getrusage(RUSAGE_SELF, &sBegin); + iBegin = timeOfDay(); + } +} + +/* Return the difference of two time_structs in seconds */ +static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ + return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + + (double)(pEnd->tv_sec - pStart->tv_sec); +} + +/* +** Print the timing results. +*/ +static void endTimer(void){ + if( enableTimer ){ + sqlite3_int64 iEnd = timeOfDay(); + struct rusage sEnd; + getrusage(RUSAGE_SELF, &sEnd); + printf("Run Time: real %.3f user %f sys %f\n", + (iEnd - iBegin)*0.001, + timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), + timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); + } +} + +#define BEGIN_TIMER beginTimer() +#define END_TIMER endTimer() +#define HAS_TIMER 1 + +#elif (defined(_WIN32) || defined(WIN32)) + +/* Saved resource information for the beginning of an operation */ +static HANDLE hProcess; +static FILETIME ftKernelBegin; +static FILETIME ftUserBegin; +static sqlite3_int64 ftWallBegin; +typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, + LPFILETIME, LPFILETIME); +static GETPROCTIMES getProcessTimesAddr = NULL; + +/* +** Check to see if we have timer support. Return 1 if necessary +** support found (or found previously). +*/ +static int hasTimer(void){ + if( getProcessTimesAddr ){ + return 1; + } else { +#if !SQLITE_OS_WINRT + /* GetProcessTimes() isn't supported in WIN95 and some other Windows + ** versions. See if the version we are running on has it, and if it + ** does, save off a pointer to it and the current process handle. + */ + hProcess = GetCurrentProcess(); + if( hProcess ){ + HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll")); + if( NULL != hinstLib ){ + getProcessTimesAddr = + (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes"); + if( NULL != getProcessTimesAddr ){ + return 1; + } + FreeLibrary(hinstLib); + } + } +#endif + } + return 0; +} + +/* +** Begin timing an operation +*/ +static void beginTimer(void){ + if( enableTimer && getProcessTimesAddr ){ + FILETIME ftCreation, ftExit; + getProcessTimesAddr(hProcess,&ftCreation,&ftExit, + &ftKernelBegin,&ftUserBegin); + ftWallBegin = timeOfDay(); + } +} + +/* Return the difference of two FILETIME structs in seconds */ +static double timeDiff(FILETIME *pStart, FILETIME *pEnd){ + sqlite_int64 i64Start = *((sqlite_int64 *) pStart); + sqlite_int64 i64End = *((sqlite_int64 *) pEnd); + return (double) ((i64End - i64Start) / 10000000.0); +} + +/* +** Print the timing results. +*/ +static void endTimer(void){ + if( enableTimer && getProcessTimesAddr){ + FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; + sqlite3_int64 ftWallEnd = timeOfDay(); + getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd); + printf("Run Time: real %.3f user %f sys %f\n", + (ftWallEnd - ftWallBegin)*0.001, + timeDiff(&ftUserBegin, &ftUserEnd), + timeDiff(&ftKernelBegin, &ftKernelEnd)); + } +} + +#define BEGIN_TIMER beginTimer() +#define END_TIMER endTimer() +#define HAS_TIMER hasTimer() + +#else +#define BEGIN_TIMER +#define END_TIMER +#define HAS_TIMER 0 +#endif + +/* +** Used to prevent warnings about unused parameters +*/ +#define UNUSED_PARAMETER(x) (void)(x) + +/* +** Number of elements in an array +*/ +#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0])) + +/* +** If the following flag is set, then command execution stops +** at an error if we are not interactive. +*/ +static int bail_on_error = 0; + +/* +** Threat stdin as an interactive input if the following variable +** is true. Otherwise, assume stdin is connected to a file or pipe. +*/ +static int stdin_is_interactive = 1; + +/* +** On Windows systems we have to know if standard output is a console +** in order to translate UTF-8 into MBCS. The following variable is +** true if translation is required. +*/ +static int stdout_is_console = 1; + +/* +** The following is the open SQLite database. We make a pointer +** to this database a static variable so that it can be accessed +** by the SIGINT handler to interrupt database processing. +*/ +static sqlite3 *globalDb = 0; + +/* +** True if an interrupt (Control-C) has been received. +*/ +static volatile int seenInterrupt = 0; + +#ifdef SQLITE_DEBUG +/* +** Out-of-memory simulator variables +*/ +static unsigned int oomCounter = 0; /* Simulate OOM when equals 1 */ +static unsigned int oomRepeat = 0; /* Number of OOMs in a row */ +static void*(*defaultMalloc)(int) = 0; /* The low-level malloc routine */ +#endif /* SQLITE_DEBUG */ + +/* +** This is the name of our program. It is set in main(), used +** in a number of other places, mostly for error messages. +*/ +static char *Argv0; + +/* +** Prompt strings. Initialized in main. Settable with +** .prompt main continue +*/ +static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ +static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ + +/* +** Render output like fprintf(). Except, if the output is going to the +** console and if this is running on a Windows machine, translate the +** output from UTF-8 into MBCS. +*/ +#if defined(_WIN32) || defined(WIN32) +void utf8_printf(FILE *out, const char *zFormat, ...){ + va_list ap; + va_start(ap, zFormat); + if( stdout_is_console && (out==stdout || out==stderr) ){ + char *z1 = sqlite3_vmprintf(zFormat, ap); + char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0); + sqlite3_free(z1); + fputs(z2, out); + sqlite3_free(z2); + }else{ + vfprintf(out, zFormat, ap); + } + va_end(ap); +} +#elif !defined(utf8_printf) +# define utf8_printf fprintf +#endif + +/* +** Render output like fprintf(). This should not be used on anything that +** includes string formatting (e.g. "%s"). +*/ +#if !defined(raw_printf) +# define raw_printf fprintf +#endif + +/* Indicate out-of-memory and exit. */ +static void shell_out_of_memory(void){ + raw_printf(stderr,"Error: out of memory\n"); + exit(1); +} + +#ifdef SQLITE_DEBUG +/* This routine is called when a simulated OOM occurs. It is broken +** out as a separate routine to make it easy to set a breakpoint on +** the OOM +*/ +void shellOomFault(void){ + if( oomRepeat>0 ){ + oomRepeat--; + }else{ + oomCounter--; + } +} +#endif /* SQLITE_DEBUG */ + +#ifdef SQLITE_DEBUG +/* This routine is a replacement malloc() that is used to simulate +** Out-Of-Memory (OOM) errors for testing purposes. +*/ +static void *oomMalloc(int nByte){ + if( oomCounter ){ + if( oomCounter==1 ){ + shellOomFault(); + return 0; + }else{ + oomCounter--; + } + } + return defaultMalloc(nByte); +} +#endif /* SQLITE_DEBUG */ + +#ifdef SQLITE_DEBUG +/* Register the OOM simulator. This must occur before any memory +** allocations */ +static void registerOomSimulator(void){ + sqlite3_mem_methods mem; + sqlite3_config(SQLITE_CONFIG_GETMALLOC, &mem); + defaultMalloc = mem.xMalloc; + mem.xMalloc = oomMalloc; + sqlite3_config(SQLITE_CONFIG_MALLOC, &mem); +} +#endif + +/* +** Write I/O traces to the following stream. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +static FILE *iotrace = 0; +#endif + +/* +** This routine works like printf in that its first argument is a +** format string and subsequent arguments are values to be substituted +** in place of % fields. The result of formatting this string +** is written to iotrace. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){ + va_list ap; + char *z; + if( iotrace==0 ) return; + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + utf8_printf(iotrace, "%s", z); + sqlite3_free(z); +} +#endif + +/* +** Output string zUtf to stream pOut as w characters. If w is negative, +** then right-justify the text. W is the width in UTF-8 characters, not +** in bytes. This is different from the %*.*s specification in printf +** since with %*.*s the width is measured in bytes, not characters. +*/ +static void utf8_width_print(FILE *pOut, int w, const char *zUtf){ + int i; + int n; + int aw = w<0 ? -w : w; + char zBuf[1000]; + if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3; + for(i=n=0; zUtf[i]; i++){ + if( (zUtf[i]&0xc0)!=0x80 ){ + n++; + if( n==aw ){ + do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); + break; + } + } + } + if( n>=aw ){ + utf8_printf(pOut, "%.*s", i, zUtf); + }else if( w<0 ){ + utf8_printf(pOut, "%*s%s", aw-n, "", zUtf); + }else{ + utf8_printf(pOut, "%s%*s", zUtf, aw-n, ""); + } +} + + +/* +** Determines if a string is a number of not. +*/ +static int isNumber(const char *z, int *realnum){ + if( *z=='-' || *z=='+' ) z++; + if( !IsDigit(*z) ){ + return 0; + } + z++; + if( realnum ) *realnum = 0; + while( IsDigit(*z) ){ z++; } + if( *z=='.' ){ + z++; + if( !IsDigit(*z) ) return 0; + while( IsDigit(*z) ){ z++; } + if( realnum ) *realnum = 1; + } + if( *z=='e' || *z=='E' ){ + z++; + if( *z=='+' || *z=='-' ) z++; + if( !IsDigit(*z) ) return 0; + while( IsDigit(*z) ){ z++; } + if( realnum ) *realnum = 1; + } + return *z==0; +} + +/* +** Compute a string length that is limited to what can be stored in +** lower 30 bits of a 32-bit signed integer. +*/ +static int strlen30(const char *z){ + const char *z2 = z; + while( *z2 ){ z2++; } + return 0x3fffffff & (int)(z2 - z); +} + +/* +** Return the length of a string in characters. Multibyte UTF8 characters +** count as a single character. +*/ +static int strlenChar(const char *z){ + int n = 0; + while( *z ){ + if( (0xc0&*(z++))!=0x80 ) n++; + } + return n; +} + +/* +** This routine reads a line of text from FILE in, stores +** the text in memory obtained from malloc() and returns a pointer +** to the text. NULL is returned at end of file, or if malloc() +** fails. +** +** If zLine is not NULL then it is a malloced buffer returned from +** a previous call to this routine that may be reused. +*/ +static char *local_getline(char *zLine, FILE *in){ + int nLine = zLine==0 ? 0 : 100; + int n = 0; + + while( 1 ){ + if( n+100>nLine ){ + nLine = nLine*2 + 100; + zLine = realloc(zLine, nLine); + if( zLine==0 ) shell_out_of_memory(); + } + if( fgets(&zLine[n], nLine - n, in)==0 ){ + if( n==0 ){ + free(zLine); + return 0; + } + zLine[n] = 0; + break; + } + while( zLine[n] ) n++; + if( n>0 && zLine[n-1]=='\n' ){ + n--; + if( n>0 && zLine[n-1]=='\r' ) n--; + zLine[n] = 0; + break; + } + } +#if defined(_WIN32) || defined(WIN32) + /* For interactive input on Windows systems, translate the + ** multi-byte characterset characters into UTF-8. */ + if( stdin_is_interactive && in==stdin ){ + char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0); + if( zTrans ){ + int nTrans = strlen30(zTrans)+1; + if( nTrans>nLine ){ + zLine = realloc(zLine, nTrans); + if( zLine==0 ) shell_out_of_memory(); + } + memcpy(zLine, zTrans, nTrans); + sqlite3_free(zTrans); + } + } +#endif /* defined(_WIN32) || defined(WIN32) */ + return zLine; +} + +/* +** Retrieve a single line of input text. +** +** If in==0 then read from standard input and prompt before each line. +** If isContinuation is true, then a continuation prompt is appropriate. +** If isContinuation is zero, then the main prompt should be used. +** +** If zPrior is not NULL then it is a buffer from a prior call to this +** routine that can be reused. +** +** The result is stored in space obtained from malloc() and must either +** be freed by the caller or else passed back into this routine via the +** zPrior argument for reuse. +*/ +static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ + char *zPrompt; + char *zResult; + if( in!=0 ){ + zResult = local_getline(zPrior, in); + }else{ + zPrompt = isContinuation ? continuePrompt : mainPrompt; +#if SHELL_USE_LOCAL_GETLINE + printf("%s", zPrompt); + fflush(stdout); + zResult = local_getline(zPrior, stdin); +#else + free(zPrior); + zResult = shell_readline(zPrompt); + if( zResult && *zResult ) shell_add_history(zResult); +#endif + } + return zResult; +} + + +/* +** Return the value of a hexadecimal digit. Return -1 if the input +** is not a hex digit. +*/ +static int hexDigitValue(char c){ + if( c>='0' && c<='9' ) return c - '0'; + if( c>='a' && c<='f' ) return c - 'a' + 10; + if( c>='A' && c<='F' ) return c - 'A' + 10; + return -1; +} + +/* +** Interpret zArg as an integer value, possibly with suffixes. +*/ +static sqlite3_int64 integerValue(const char *zArg){ + sqlite3_int64 v = 0; + static const struct { char *zSuffix; int iMult; } aMult[] = { + { "KiB", 1024 }, + { "MiB", 1024*1024 }, + { "GiB", 1024*1024*1024 }, + { "KB", 1000 }, + { "MB", 1000000 }, + { "GB", 1000000000 }, + { "K", 1000 }, + { "M", 1000000 }, + { "G", 1000000000 }, + }; + int i; + int isNeg = 0; + if( zArg[0]=='-' ){ + isNeg = 1; + zArg++; + }else if( zArg[0]=='+' ){ + zArg++; + } + if( zArg[0]=='0' && zArg[1]=='x' ){ + int x; + zArg += 2; + while( (x = hexDigitValue(zArg[0]))>=0 ){ + v = (v<<4) + x; + zArg++; + } + }else{ + while( IsDigit(zArg[0]) ){ + v = v*10 + zArg[0] - '0'; + zArg++; + } + } + for(i=0; iz); + initText(p); +} + +/* zIn is either a pointer to a NULL-terminated string in memory obtained +** from malloc(), or a NULL pointer. The string pointed to by zAppend is +** added to zIn, and the result returned in memory obtained from malloc(). +** zIn, if it was not NULL, is freed. +** +** If the third argument, quote, is not '\0', then it is used as a +** quote character for zAppend. +*/ +static void appendText(ShellText *p, char const *zAppend, char quote){ + int len; + int i; + int nAppend = strlen30(zAppend); + + len = nAppend+p->n+1; + if( quote ){ + len += 2; + for(i=0; in+len>=p->nAlloc ){ + p->nAlloc = p->nAlloc*2 + len + 20; + p->z = realloc(p->z, p->nAlloc); + if( p->z==0 ) shell_out_of_memory(); + } + + if( quote ){ + char *zCsr = p->z+p->n; + *zCsr++ = quote; + for(i=0; in = (int)(zCsr - p->z); + *zCsr = '\0'; + }else{ + memcpy(p->z+p->n, zAppend, nAppend); + p->n += nAppend; + p->z[p->n] = '\0'; + } +} + +/* +** Attempt to determine if identifier zName needs to be quoted, either +** because it contains non-alphanumeric characters, or because it is an +** SQLite keyword. Be conservative in this estimate: When in doubt assume +** that quoting is required. +** +** Return '"' if quoting is required. Return 0 if no quoting is required. +*/ +static char quoteChar(const char *zName){ + int i; + if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"'; + for(i=0; zName[i]; i++){ + if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"'; + } + return sqlite3_keyword_check(zName, i) ? '"' : 0; +} + +/* +** Construct a fake object name and column list to describe the structure +** of the view, virtual table, or table valued function zSchema.zName. +*/ +static char *shellFakeSchema( + sqlite3 *db, /* The database connection containing the vtab */ + const char *zSchema, /* Schema of the database holding the vtab */ + const char *zName /* The name of the virtual table */ +){ + sqlite3_stmt *pStmt = 0; + char *zSql; + ShellText s; + char cQuote; + char *zDiv = "("; + int nRow = 0; + + zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;", + zSchema ? zSchema : "main", zName); + sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + initText(&s); + if( zSchema ){ + cQuote = quoteChar(zSchema); + if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0; + appendText(&s, zSchema, cQuote); + appendText(&s, ".", 0); + } + cQuote = quoteChar(zName); + appendText(&s, zName, cQuote); + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + const char *zCol = (const char*)sqlite3_column_text(pStmt, 1); + nRow++; + appendText(&s, zDiv, 0); + zDiv = ","; + cQuote = quoteChar(zCol); + appendText(&s, zCol, cQuote); + } + appendText(&s, ")", 0); + sqlite3_finalize(pStmt); + if( nRow==0 ){ + freeText(&s); + s.z = 0; + } + return s.z; +} + +/* +** SQL function: shell_module_schema(X) +** +** Return a fake schema for the table-valued function or eponymous virtual +** table X. +*/ +static void shellModuleSchema( + sqlite3_context *pCtx, + int nVal, + sqlite3_value **apVal +){ + const char *zName = (const char*)sqlite3_value_text(apVal[0]); + char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName); + UNUSED_PARAMETER(nVal); + if( zFake ){ + sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake), + -1, sqlite3_free); + free(zFake); + } +} + +/* +** SQL function: shell_add_schema(S,X) +** +** Add the schema name X to the CREATE statement in S and return the result. +** Examples: +** +** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x); +** +** Also works on +** +** CREATE INDEX +** CREATE UNIQUE INDEX +** CREATE VIEW +** CREATE TRIGGER +** CREATE VIRTUAL TABLE +** +** This UDF is used by the .schema command to insert the schema name of +** attached databases into the middle of the sqlite_master.sql field. +*/ +static void shellAddSchemaName( + sqlite3_context *pCtx, + int nVal, + sqlite3_value **apVal +){ + static const char *aPrefix[] = { + "TABLE", + "INDEX", + "UNIQUE INDEX", + "VIEW", + "TRIGGER", + "VIRTUAL TABLE" + }; + int i = 0; + const char *zIn = (const char*)sqlite3_value_text(apVal[0]); + const char *zSchema = (const char*)sqlite3_value_text(apVal[1]); + const char *zName = (const char*)sqlite3_value_text(apVal[2]); + sqlite3 *db = sqlite3_context_db_handle(pCtx); + UNUSED_PARAMETER(nVal); + if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){ + for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){ + int n = strlen30(aPrefix[i]); + if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){ + char *z = 0; + char *zFake = 0; + if( zSchema ){ + char cQuote = quoteChar(zSchema); + if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){ + z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8); + }else{ + z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8); + } + } + if( zName + && aPrefix[i][0]=='V' + && (zFake = shellFakeSchema(db, zSchema, zName))!=0 + ){ + if( z==0 ){ + z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake); + }else{ + z = sqlite3_mprintf("%z\n/* %s */", z, zFake); + } + free(zFake); + } + if( z ){ + sqlite3_result_text(pCtx, z, -1, sqlite3_free); + return; + } + } + } + } + sqlite3_result_value(pCtx, apVal[0]); +} + +/* +** The source code for several run-time loadable extensions is inserted +** below by the ../tool/mkshellc.tcl script. Before processing that included +** code, we need to override some macros to make the included program code +** work here in the middle of this regular program. +*/ +#define SQLITE_EXTENSION_INIT1 +#define SQLITE_EXTENSION_INIT2(X) (void)(X) + +#if defined(_WIN32) && defined(_MSC_VER) +/************************* Begin test_windirent.h ******************/ +/* +** 2015 November 30 +** +** 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 declarations for most of the opendir() family of +** POSIX functions on Win32 using the MSVCRT. +*/ + +#if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H) +#define SQLITE_WINDIRENT_H + +/* +** We need several data types from the Windows SDK header. +*/ + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#include "windows.h" + +/* +** We need several support functions from the SQLite core. +*/ + +/* #include "sqlite3.h" */ + +/* +** We need several things from the ANSI and MSVCRT headers. +*/ + +#include +#include +#include +#include +#include +#include +#include + +/* +** We may need several defines that should have been in "sys/stat.h". +*/ + +#ifndef S_ISREG +#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) +#endif + +#ifndef S_ISDIR +#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +#endif + +#ifndef S_ISLNK +#define S_ISLNK(mode) (0) +#endif + +/* +** We may need to provide the "mode_t" type. +*/ + +#ifndef MODE_T_DEFINED + #define MODE_T_DEFINED + typedef unsigned short mode_t; +#endif + +/* +** We may need to provide the "ino_t" type. +*/ + +#ifndef INO_T_DEFINED + #define INO_T_DEFINED + typedef unsigned short ino_t; +#endif + +/* +** We need to define "NAME_MAX" if it was not present in "limits.h". +*/ + +#ifndef NAME_MAX +# ifdef FILENAME_MAX +# define NAME_MAX (FILENAME_MAX) +# else +# define NAME_MAX (260) +# endif +#endif + +/* +** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T". +*/ + +#ifndef NULL_INTPTR_T +# define NULL_INTPTR_T ((intptr_t)(0)) +#endif + +#ifndef BAD_INTPTR_T +# define BAD_INTPTR_T ((intptr_t)(-1)) +#endif + +/* +** We need to provide the necessary structures and related types. +*/ + +#ifndef DIRENT_DEFINED +#define DIRENT_DEFINED +typedef struct DIRENT DIRENT; +typedef DIRENT *LPDIRENT; +struct DIRENT { + ino_t d_ino; /* Sequence number, do not use. */ + unsigned d_attributes; /* Win32 file attributes. */ + char d_name[NAME_MAX + 1]; /* Name within the directory. */ +}; +#endif + +#ifndef DIR_DEFINED +#define DIR_DEFINED +typedef struct DIR DIR; +typedef DIR *LPDIR; +struct DIR { + intptr_t d_handle; /* Value returned by "_findfirst". */ + DIRENT d_first; /* DIRENT constructed based on "_findfirst". */ + DIRENT d_next; /* DIRENT constructed based on "_findnext". */ +}; +#endif + +/* +** Provide a macro, for use by the implementation, to determine if a +** particular directory entry should be skipped over when searching for +** the next directory entry that should be returned by the readdir() or +** readdir_r() functions. +*/ + +#ifndef is_filtered +# define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM)) +#endif + +/* +** Provide the function prototype for the POSIX compatiable getenv() +** function. This function is not thread-safe. +*/ + +extern const char *windirent_getenv(const char *name); + +/* +** Finally, we can provide the function prototypes for the opendir(), +** readdir(), readdir_r(), and closedir() POSIX functions. +*/ + +extern LPDIR opendir(const char *dirname); +extern LPDIRENT readdir(LPDIR dirp); +extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result); +extern INT closedir(LPDIR dirp); + +#endif /* defined(WIN32) && defined(_MSC_VER) */ + +/************************* End test_windirent.h ********************/ +/************************* Begin test_windirent.c ******************/ +/* +** 2015 November 30 +** +** 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 code to implement most of the opendir() family of +** POSIX functions on Win32 using the MSVCRT. +*/ + +#if defined(_WIN32) && defined(_MSC_VER) +/* #include "test_windirent.h" */ + +/* +** Implementation of the POSIX getenv() function using the Win32 API. +** This function is not thread-safe. +*/ +const char *windirent_getenv( + const char *name +){ + static char value[32768]; /* Maximum length, per MSDN */ + DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */ + DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */ + + memset(value, 0, sizeof(value)); + dwRet = GetEnvironmentVariableA(name, value, dwSize); + if( dwRet==0 || dwRet>dwSize ){ + /* + ** The function call to GetEnvironmentVariableA() failed -OR- + ** the buffer is not large enough. Either way, return NULL. + */ + return 0; + }else{ + /* + ** The function call to GetEnvironmentVariableA() succeeded + ** -AND- the buffer contains the entire value. + */ + return value; + } +} + +/* +** Implementation of the POSIX opendir() function using the MSVCRT. +*/ +LPDIR opendir( + const char *dirname +){ + struct _finddata_t data; + LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR)); + SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]); + + if( dirp==NULL ) return NULL; + memset(dirp, 0, sizeof(DIR)); + + /* TODO: Remove this if Unix-style root paths are not used. */ + if( sqlite3_stricmp(dirname, "/")==0 ){ + dirname = windirent_getenv("SystemDrive"); + } + + memset(&data, 0, sizeof(struct _finddata_t)); + _snprintf(data.name, namesize, "%s\\*", dirname); + dirp->d_handle = _findfirst(data.name, &data); + + if( dirp->d_handle==BAD_INTPTR_T ){ + closedir(dirp); + return NULL; + } + + /* TODO: Remove this block to allow hidden and/or system files. */ + if( is_filtered(data) ){ +next: + + memset(&data, 0, sizeof(struct _finddata_t)); + if( _findnext(dirp->d_handle, &data)==-1 ){ + closedir(dirp); + return NULL; + } + + /* TODO: Remove this block to allow hidden and/or system files. */ + if( is_filtered(data) ) goto next; + } + + dirp->d_first.d_attributes = data.attrib; + strncpy(dirp->d_first.d_name, data.name, NAME_MAX); + dirp->d_first.d_name[NAME_MAX] = '\0'; + + return dirp; +} + +/* +** Implementation of the POSIX readdir() function using the MSVCRT. +*/ +LPDIRENT readdir( + LPDIR dirp +){ + struct _finddata_t data; + + if( dirp==NULL ) return NULL; + + if( dirp->d_first.d_ino==0 ){ + dirp->d_first.d_ino++; + dirp->d_next.d_ino++; + + return &dirp->d_first; + } + +next: + + memset(&data, 0, sizeof(struct _finddata_t)); + if( _findnext(dirp->d_handle, &data)==-1 ) return NULL; + + /* TODO: Remove this block to allow hidden and/or system files. */ + if( is_filtered(data) ) goto next; + + dirp->d_next.d_ino++; + dirp->d_next.d_attributes = data.attrib; + strncpy(dirp->d_next.d_name, data.name, NAME_MAX); + dirp->d_next.d_name[NAME_MAX] = '\0'; + + return &dirp->d_next; +} + +/* +** Implementation of the POSIX readdir_r() function using the MSVCRT. +*/ +INT readdir_r( + LPDIR dirp, + LPDIRENT entry, + LPDIRENT *result +){ + struct _finddata_t data; + + if( dirp==NULL ) return EBADF; + + if( dirp->d_first.d_ino==0 ){ + dirp->d_first.d_ino++; + dirp->d_next.d_ino++; + + entry->d_ino = dirp->d_first.d_ino; + entry->d_attributes = dirp->d_first.d_attributes; + strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX); + entry->d_name[NAME_MAX] = '\0'; + + *result = entry; + return 0; + } + +next: + + memset(&data, 0, sizeof(struct _finddata_t)); + if( _findnext(dirp->d_handle, &data)==-1 ){ + *result = NULL; + return ENOENT; + } + + /* TODO: Remove this block to allow hidden and/or system files. */ + if( is_filtered(data) ) goto next; + + entry->d_ino = (ino_t)-1; /* not available */ + entry->d_attributes = data.attrib; + strncpy(entry->d_name, data.name, NAME_MAX); + entry->d_name[NAME_MAX] = '\0'; + + *result = entry; + return 0; +} + +/* +** Implementation of the POSIX closedir() function using the MSVCRT. +*/ +INT closedir( + LPDIR dirp +){ + INT result = 0; + + if( dirp==NULL ) return EINVAL; + + if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){ + result = _findclose(dirp->d_handle); + } + + sqlite3_free(dirp); + return result; +} + +#endif /* defined(WIN32) && defined(_MSC_VER) */ + +/************************* End test_windirent.c ********************/ +#define dirent DIRENT +#endif +/************************* Begin ../ext/misc/shathree.c ******************/ +/* +** 2017-03-08 +** +** 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 SQLite extension implements functions that compute SHA3 hashes. +** Two SQL functions are implemented: +** +** sha3(X,SIZE) +** sha3_query(Y,SIZE) +** +** The sha3(X) function computes the SHA3 hash of the input X, or NULL if +** X is NULL. +** +** The sha3_query(Y) function evalutes all queries in the SQL statements of Y +** and returns a hash of their results. +** +** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm +** is used. If SIZE is included it must be one of the integers 224, 256, +** 384, or 512, to determine SHA3 hash variant that is computed. +*/ +/* #include "sqlite3ext.h" */ +SQLITE_EXTENSION_INIT1 +#include +#include +#include +/* typedef sqlite3_uint64 u64; */ + +/****************************************************************************** +** The Hash Engine +*/ +/* +** Macros to determine whether the machine is big or little endian, +** and whether or not that determination is run-time or compile-time. +** +** For best performance, an attempt is made to guess at the byte-order +** using C-preprocessor macros. If that is unsuccessful, or if +** -DSHA3_BYTEORDER=0 is set, then byte-order is determined +** at run-time. +*/ +#ifndef SHA3_BYTEORDER +# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__arm__) +# define SHA3_BYTEORDER 1234 +# elif defined(sparc) || defined(__ppc__) +# define SHA3_BYTEORDER 4321 +# else +# define SHA3_BYTEORDER 0 +# endif +#endif + + +/* +** State structure for a SHA3 hash in progress +*/ +typedef struct SHA3Context SHA3Context; +struct SHA3Context { + union { + u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */ + unsigned char x[1600]; /* ... or 1600 bytes */ + } u; + unsigned nRate; /* Bytes of input accepted per Keccak iteration */ + unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */ + unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */ +}; + +/* +** A single step of the Keccak mixing function for a 1600-bit state +*/ +static void KeccakF1600Step(SHA3Context *p){ + int i; + u64 b0, b1, b2, b3, b4; + u64 c0, c1, c2, c3, c4; + u64 d0, d1, d2, d3, d4; + static const u64 RC[] = { + 0x0000000000000001ULL, 0x0000000000008082ULL, + 0x800000000000808aULL, 0x8000000080008000ULL, + 0x000000000000808bULL, 0x0000000080000001ULL, + 0x8000000080008081ULL, 0x8000000000008009ULL, + 0x000000000000008aULL, 0x0000000000000088ULL, + 0x0000000080008009ULL, 0x000000008000000aULL, + 0x000000008000808bULL, 0x800000000000008bULL, + 0x8000000000008089ULL, 0x8000000000008003ULL, + 0x8000000000008002ULL, 0x8000000000000080ULL, + 0x000000000000800aULL, 0x800000008000000aULL, + 0x8000000080008081ULL, 0x8000000000008080ULL, + 0x0000000080000001ULL, 0x8000000080008008ULL + }; +# define a00 (p->u.s[0]) +# define a01 (p->u.s[1]) +# define a02 (p->u.s[2]) +# define a03 (p->u.s[3]) +# define a04 (p->u.s[4]) +# define a10 (p->u.s[5]) +# define a11 (p->u.s[6]) +# define a12 (p->u.s[7]) +# define a13 (p->u.s[8]) +# define a14 (p->u.s[9]) +# define a20 (p->u.s[10]) +# define a21 (p->u.s[11]) +# define a22 (p->u.s[12]) +# define a23 (p->u.s[13]) +# define a24 (p->u.s[14]) +# define a30 (p->u.s[15]) +# define a31 (p->u.s[16]) +# define a32 (p->u.s[17]) +# define a33 (p->u.s[18]) +# define a34 (p->u.s[19]) +# define a40 (p->u.s[20]) +# define a41 (p->u.s[21]) +# define a42 (p->u.s[22]) +# define a43 (p->u.s[23]) +# define a44 (p->u.s[24]) +# define ROL64(a,x) ((a<>(64-x))) + + for(i=0; i<24; i+=4){ + c0 = a00^a10^a20^a30^a40; + c1 = a01^a11^a21^a31^a41; + c2 = a02^a12^a22^a32^a42; + c3 = a03^a13^a23^a33^a43; + c4 = a04^a14^a24^a34^a44; + d0 = c4^ROL64(c1, 1); + d1 = c0^ROL64(c2, 1); + d2 = c1^ROL64(c3, 1); + d3 = c2^ROL64(c4, 1); + d4 = c3^ROL64(c0, 1); + + b0 = (a00^d0); + b1 = ROL64((a11^d1), 44); + b2 = ROL64((a22^d2), 43); + b3 = ROL64((a33^d3), 21); + b4 = ROL64((a44^d4), 14); + a00 = b0 ^((~b1)& b2 ); + a00 ^= RC[i]; + a11 = b1 ^((~b2)& b3 ); + a22 = b2 ^((~b3)& b4 ); + a33 = b3 ^((~b4)& b0 ); + a44 = b4 ^((~b0)& b1 ); + + b2 = ROL64((a20^d0), 3); + b3 = ROL64((a31^d1), 45); + b4 = ROL64((a42^d2), 61); + b0 = ROL64((a03^d3), 28); + b1 = ROL64((a14^d4), 20); + a20 = b0 ^((~b1)& b2 ); + a31 = b1 ^((~b2)& b3 ); + a42 = b2 ^((~b3)& b4 ); + a03 = b3 ^((~b4)& b0 ); + a14 = b4 ^((~b0)& b1 ); + + b4 = ROL64((a40^d0), 18); + b0 = ROL64((a01^d1), 1); + b1 = ROL64((a12^d2), 6); + b2 = ROL64((a23^d3), 25); + b3 = ROL64((a34^d4), 8); + a40 = b0 ^((~b1)& b2 ); + a01 = b1 ^((~b2)& b3 ); + a12 = b2 ^((~b3)& b4 ); + a23 = b3 ^((~b4)& b0 ); + a34 = b4 ^((~b0)& b1 ); + + b1 = ROL64((a10^d0), 36); + b2 = ROL64((a21^d1), 10); + b3 = ROL64((a32^d2), 15); + b4 = ROL64((a43^d3), 56); + b0 = ROL64((a04^d4), 27); + a10 = b0 ^((~b1)& b2 ); + a21 = b1 ^((~b2)& b3 ); + a32 = b2 ^((~b3)& b4 ); + a43 = b3 ^((~b4)& b0 ); + a04 = b4 ^((~b0)& b1 ); + + b3 = ROL64((a30^d0), 41); + b4 = ROL64((a41^d1), 2); + b0 = ROL64((a02^d2), 62); + b1 = ROL64((a13^d3), 55); + b2 = ROL64((a24^d4), 39); + a30 = b0 ^((~b1)& b2 ); + a41 = b1 ^((~b2)& b3 ); + a02 = b2 ^((~b3)& b4 ); + a13 = b3 ^((~b4)& b0 ); + a24 = b4 ^((~b0)& b1 ); + + c0 = a00^a20^a40^a10^a30; + c1 = a11^a31^a01^a21^a41; + c2 = a22^a42^a12^a32^a02; + c3 = a33^a03^a23^a43^a13; + c4 = a44^a14^a34^a04^a24; + d0 = c4^ROL64(c1, 1); + d1 = c0^ROL64(c2, 1); + d2 = c1^ROL64(c3, 1); + d3 = c2^ROL64(c4, 1); + d4 = c3^ROL64(c0, 1); + + b0 = (a00^d0); + b1 = ROL64((a31^d1), 44); + b2 = ROL64((a12^d2), 43); + b3 = ROL64((a43^d3), 21); + b4 = ROL64((a24^d4), 14); + a00 = b0 ^((~b1)& b2 ); + a00 ^= RC[i+1]; + a31 = b1 ^((~b2)& b3 ); + a12 = b2 ^((~b3)& b4 ); + a43 = b3 ^((~b4)& b0 ); + a24 = b4 ^((~b0)& b1 ); + + b2 = ROL64((a40^d0), 3); + b3 = ROL64((a21^d1), 45); + b4 = ROL64((a02^d2), 61); + b0 = ROL64((a33^d3), 28); + b1 = ROL64((a14^d4), 20); + a40 = b0 ^((~b1)& b2 ); + a21 = b1 ^((~b2)& b3 ); + a02 = b2 ^((~b3)& b4 ); + a33 = b3 ^((~b4)& b0 ); + a14 = b4 ^((~b0)& b1 ); + + b4 = ROL64((a30^d0), 18); + b0 = ROL64((a11^d1), 1); + b1 = ROL64((a42^d2), 6); + b2 = ROL64((a23^d3), 25); + b3 = ROL64((a04^d4), 8); + a30 = b0 ^((~b1)& b2 ); + a11 = b1 ^((~b2)& b3 ); + a42 = b2 ^((~b3)& b4 ); + a23 = b3 ^((~b4)& b0 ); + a04 = b4 ^((~b0)& b1 ); + + b1 = ROL64((a20^d0), 36); + b2 = ROL64((a01^d1), 10); + b3 = ROL64((a32^d2), 15); + b4 = ROL64((a13^d3), 56); + b0 = ROL64((a44^d4), 27); + a20 = b0 ^((~b1)& b2 ); + a01 = b1 ^((~b2)& b3 ); + a32 = b2 ^((~b3)& b4 ); + a13 = b3 ^((~b4)& b0 ); + a44 = b4 ^((~b0)& b1 ); + + b3 = ROL64((a10^d0), 41); + b4 = ROL64((a41^d1), 2); + b0 = ROL64((a22^d2), 62); + b1 = ROL64((a03^d3), 55); + b2 = ROL64((a34^d4), 39); + a10 = b0 ^((~b1)& b2 ); + a41 = b1 ^((~b2)& b3 ); + a22 = b2 ^((~b3)& b4 ); + a03 = b3 ^((~b4)& b0 ); + a34 = b4 ^((~b0)& b1 ); + + c0 = a00^a40^a30^a20^a10; + c1 = a31^a21^a11^a01^a41; + c2 = a12^a02^a42^a32^a22; + c3 = a43^a33^a23^a13^a03; + c4 = a24^a14^a04^a44^a34; + d0 = c4^ROL64(c1, 1); + d1 = c0^ROL64(c2, 1); + d2 = c1^ROL64(c3, 1); + d3 = c2^ROL64(c4, 1); + d4 = c3^ROL64(c0, 1); + + b0 = (a00^d0); + b1 = ROL64((a21^d1), 44); + b2 = ROL64((a42^d2), 43); + b3 = ROL64((a13^d3), 21); + b4 = ROL64((a34^d4), 14); + a00 = b0 ^((~b1)& b2 ); + a00 ^= RC[i+2]; + a21 = b1 ^((~b2)& b3 ); + a42 = b2 ^((~b3)& b4 ); + a13 = b3 ^((~b4)& b0 ); + a34 = b4 ^((~b0)& b1 ); + + b2 = ROL64((a30^d0), 3); + b3 = ROL64((a01^d1), 45); + b4 = ROL64((a22^d2), 61); + b0 = ROL64((a43^d3), 28); + b1 = ROL64((a14^d4), 20); + a30 = b0 ^((~b1)& b2 ); + a01 = b1 ^((~b2)& b3 ); + a22 = b2 ^((~b3)& b4 ); + a43 = b3 ^((~b4)& b0 ); + a14 = b4 ^((~b0)& b1 ); + + b4 = ROL64((a10^d0), 18); + b0 = ROL64((a31^d1), 1); + b1 = ROL64((a02^d2), 6); + b2 = ROL64((a23^d3), 25); + b3 = ROL64((a44^d4), 8); + a10 = b0 ^((~b1)& b2 ); + a31 = b1 ^((~b2)& b3 ); + a02 = b2 ^((~b3)& b4 ); + a23 = b3 ^((~b4)& b0 ); + a44 = b4 ^((~b0)& b1 ); + + b1 = ROL64((a40^d0), 36); + b2 = ROL64((a11^d1), 10); + b3 = ROL64((a32^d2), 15); + b4 = ROL64((a03^d3), 56); + b0 = ROL64((a24^d4), 27); + a40 = b0 ^((~b1)& b2 ); + a11 = b1 ^((~b2)& b3 ); + a32 = b2 ^((~b3)& b4 ); + a03 = b3 ^((~b4)& b0 ); + a24 = b4 ^((~b0)& b1 ); + + b3 = ROL64((a20^d0), 41); + b4 = ROL64((a41^d1), 2); + b0 = ROL64((a12^d2), 62); + b1 = ROL64((a33^d3), 55); + b2 = ROL64((a04^d4), 39); + a20 = b0 ^((~b1)& b2 ); + a41 = b1 ^((~b2)& b3 ); + a12 = b2 ^((~b3)& b4 ); + a33 = b3 ^((~b4)& b0 ); + a04 = b4 ^((~b0)& b1 ); + + c0 = a00^a30^a10^a40^a20; + c1 = a21^a01^a31^a11^a41; + c2 = a42^a22^a02^a32^a12; + c3 = a13^a43^a23^a03^a33; + c4 = a34^a14^a44^a24^a04; + d0 = c4^ROL64(c1, 1); + d1 = c0^ROL64(c2, 1); + d2 = c1^ROL64(c3, 1); + d3 = c2^ROL64(c4, 1); + d4 = c3^ROL64(c0, 1); + + b0 = (a00^d0); + b1 = ROL64((a01^d1), 44); + b2 = ROL64((a02^d2), 43); + b3 = ROL64((a03^d3), 21); + b4 = ROL64((a04^d4), 14); + a00 = b0 ^((~b1)& b2 ); + a00 ^= RC[i+3]; + a01 = b1 ^((~b2)& b3 ); + a02 = b2 ^((~b3)& b4 ); + a03 = b3 ^((~b4)& b0 ); + a04 = b4 ^((~b0)& b1 ); + + b2 = ROL64((a10^d0), 3); + b3 = ROL64((a11^d1), 45); + b4 = ROL64((a12^d2), 61); + b0 = ROL64((a13^d3), 28); + b1 = ROL64((a14^d4), 20); + a10 = b0 ^((~b1)& b2 ); + a11 = b1 ^((~b2)& b3 ); + a12 = b2 ^((~b3)& b4 ); + a13 = b3 ^((~b4)& b0 ); + a14 = b4 ^((~b0)& b1 ); + + b4 = ROL64((a20^d0), 18); + b0 = ROL64((a21^d1), 1); + b1 = ROL64((a22^d2), 6); + b2 = ROL64((a23^d3), 25); + b3 = ROL64((a24^d4), 8); + a20 = b0 ^((~b1)& b2 ); + a21 = b1 ^((~b2)& b3 ); + a22 = b2 ^((~b3)& b4 ); + a23 = b3 ^((~b4)& b0 ); + a24 = b4 ^((~b0)& b1 ); + + b1 = ROL64((a30^d0), 36); + b2 = ROL64((a31^d1), 10); + b3 = ROL64((a32^d2), 15); + b4 = ROL64((a33^d3), 56); + b0 = ROL64((a34^d4), 27); + a30 = b0 ^((~b1)& b2 ); + a31 = b1 ^((~b2)& b3 ); + a32 = b2 ^((~b3)& b4 ); + a33 = b3 ^((~b4)& b0 ); + a34 = b4 ^((~b0)& b1 ); + + b3 = ROL64((a40^d0), 41); + b4 = ROL64((a41^d1), 2); + b0 = ROL64((a42^d2), 62); + b1 = ROL64((a43^d3), 55); + b2 = ROL64((a44^d4), 39); + a40 = b0 ^((~b1)& b2 ); + a41 = b1 ^((~b2)& b3 ); + a42 = b2 ^((~b3)& b4 ); + a43 = b3 ^((~b4)& b0 ); + a44 = b4 ^((~b0)& b1 ); + } +} + +/* +** Initialize a new hash. iSize determines the size of the hash +** in bits and should be one of 224, 256, 384, or 512. Or iSize +** can be zero to use the default hash size of 256 bits. +*/ +static void SHA3Init(SHA3Context *p, int iSize){ + memset(p, 0, sizeof(*p)); + if( iSize>=128 && iSize<=512 ){ + p->nRate = (1600 - ((iSize + 31)&~31)*2)/8; + }else{ + p->nRate = (1600 - 2*256)/8; + } +#if SHA3_BYTEORDER==1234 + /* Known to be little-endian at compile-time. No-op */ +#elif SHA3_BYTEORDER==4321 + p->ixMask = 7; /* Big-endian */ +#else + { + static unsigned int one = 1; + if( 1==*(unsigned char*)&one ){ + /* Little endian. No byte swapping. */ + p->ixMask = 0; + }else{ + /* Big endian. Byte swap. */ + p->ixMask = 7; + } + } +#endif +} + +/* +** Make consecutive calls to the SHA3Update function to add new content +** to the hash +*/ +static void SHA3Update( + SHA3Context *p, + const unsigned char *aData, + unsigned int nData +){ + unsigned int i = 0; +#if SHA3_BYTEORDER==1234 + if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){ + for(; i+7u.s[p->nLoaded/8] ^= *(u64*)&aData[i]; + p->nLoaded += 8; + if( p->nLoaded>=p->nRate ){ + KeccakF1600Step(p); + p->nLoaded = 0; + } + } + } +#endif + for(; iu.x[p->nLoaded] ^= aData[i]; +#elif SHA3_BYTEORDER==4321 + p->u.x[p->nLoaded^0x07] ^= aData[i]; +#else + p->u.x[p->nLoaded^p->ixMask] ^= aData[i]; +#endif + p->nLoaded++; + if( p->nLoaded==p->nRate ){ + KeccakF1600Step(p); + p->nLoaded = 0; + } + } +} + +/* +** After all content has been added, invoke SHA3Final() to compute +** the final hash. The function returns a pointer to the binary +** hash value. +*/ +static unsigned char *SHA3Final(SHA3Context *p){ + unsigned int i; + if( p->nLoaded==p->nRate-1 ){ + const unsigned char c1 = 0x86; + SHA3Update(p, &c1, 1); + }else{ + const unsigned char c2 = 0x06; + const unsigned char c3 = 0x80; + SHA3Update(p, &c2, 1); + p->nLoaded = p->nRate - 1; + SHA3Update(p, &c3, 1); + } + for(i=0; inRate; i++){ + p->u.x[i+p->nRate] = p->u.x[i^p->ixMask]; + } + return &p->u.x[p->nRate]; +} +/* End of the hashing logic +*****************************************************************************/ + +/* +** Implementation of the sha3(X,SIZE) function. +** +** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default +** size is 256. If X is a BLOB, it is hashed as is. +** For all other non-NULL types of input, X is converted into a UTF-8 string +** and the string is hashed without the trailing 0x00 terminator. The hash +** of a NULL value is NULL. +*/ +static void sha3Func( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + SHA3Context cx; + int eType = sqlite3_value_type(argv[0]); + int nByte = sqlite3_value_bytes(argv[0]); + int iSize; + if( argc==1 ){ + iSize = 256; + }else{ + iSize = sqlite3_value_int(argv[1]); + if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ + sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " + "384 512", -1); + return; + } + } + if( eType==SQLITE_NULL ) return; + SHA3Init(&cx, iSize); + if( eType==SQLITE_BLOB ){ + SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte); + }else{ + SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte); + } + sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); +} + +/* Compute a string using sqlite3_vsnprintf() with a maximum length +** of 50 bytes and add it to the hash. +*/ +static void hash_step_vformat( + SHA3Context *p, /* Add content to this context */ + const char *zFormat, + ... +){ + va_list ap; + int n; + char zBuf[50]; + va_start(ap, zFormat); + sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap); + va_end(ap); + n = (int)strlen(zBuf); + SHA3Update(p, (unsigned char*)zBuf, n); +} + +/* +** Implementation of the sha3_query(SQL,SIZE) function. +** +** This function compiles and runs the SQL statement(s) given in the +** argument. The results are hashed using a SIZE-bit SHA3. The default +** size is 256. +** +** The format of the byte stream that is hashed is summarized as follows: +** +** S: +** R +** N +** I +** F +** B: +** T: +** +** is the original SQL text for each statement run and is +** the size of that text. The SQL text is UTF-8. A single R character +** occurs before the start of each row. N means a NULL value. +** I mean an 8-byte little-endian integer . F is a floating point +** number with an 8-byte little-endian IEEE floating point value . +** B means blobs of bytes. T means text rendered as +** bytes of UTF-8. The and values are expressed as an ASCII +** text integers. +** +** For each SQL statement in the X input, there is one S segment. Each +** S segment is followed by zero or more R segments, one for each row in the +** result set. After each R, there are one or more N, I, F, B, or T segments, +** one for each column in the result set. Segments are concatentated directly +** with no delimiters of any kind. +*/ +static void sha3QueryFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zSql = (const char*)sqlite3_value_text(argv[0]); + sqlite3_stmt *pStmt = 0; + int nCol; /* Number of columns in the result set */ + int i; /* Loop counter */ + int rc; + int n; + const char *z; + SHA3Context cx; + int iSize; + + if( argc==1 ){ + iSize = 256; + }else{ + iSize = sqlite3_value_int(argv[1]); + if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ + sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " + "384 512", -1); + return; + } + } + if( zSql==0 ) return; + SHA3Init(&cx, iSize); + while( zSql[0] ){ + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql); + if( rc ){ + char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s", + zSql, sqlite3_errmsg(db)); + sqlite3_finalize(pStmt); + sqlite3_result_error(context, zMsg, -1); + sqlite3_free(zMsg); + return; + } + if( !sqlite3_stmt_readonly(pStmt) ){ + char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt)); + sqlite3_finalize(pStmt); + sqlite3_result_error(context, zMsg, -1); + sqlite3_free(zMsg); + return; + } + nCol = sqlite3_column_count(pStmt); + z = sqlite3_sql(pStmt); + n = (int)strlen(z); + hash_step_vformat(&cx,"S%d:",n); + SHA3Update(&cx,(unsigned char*)z,n); + + /* Compute a hash over the result of the query */ + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + SHA3Update(&cx,(const unsigned char*)"R",1); + for(i=0; i=1; j--){ + x[j] = u & 0xff; + u >>= 8; + } + x[0] = 'I'; + SHA3Update(&cx, x, 9); + break; + } + case SQLITE_FLOAT: { + sqlite3_uint64 u; + int j; + unsigned char x[9]; + double r = sqlite3_column_double(pStmt,i); + memcpy(&u, &r, 8); + for(j=8; j>=1; j--){ + x[j] = u & 0xff; + u >>= 8; + } + x[0] = 'F'; + SHA3Update(&cx,x,9); + break; + } + case SQLITE_TEXT: { + int n2 = sqlite3_column_bytes(pStmt, i); + const unsigned char *z2 = sqlite3_column_text(pStmt, i); + hash_step_vformat(&cx,"T%d:",n2); + SHA3Update(&cx, z2, n2); + break; + } + case SQLITE_BLOB: { + int n2 = sqlite3_column_bytes(pStmt, i); + const unsigned char *z2 = sqlite3_column_blob(pStmt, i); + hash_step_vformat(&cx,"B%d:",n2); + SHA3Update(&cx, z2, n2); + break; + } + } + } + } + sqlite3_finalize(pStmt); + } + sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); +} + + +#ifdef _WIN32 + +#endif +int sqlite3_shathree_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + rc = sqlite3_create_function(db, "sha3", 1, + SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC, + 0, sha3Func, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "sha3", 2, + SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC, + 0, sha3Func, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "sha3_query", 1, + SQLITE_UTF8 | SQLITE_DIRECTONLY, + 0, sha3QueryFunc, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "sha3_query", 2, + SQLITE_UTF8 | SQLITE_DIRECTONLY, + 0, sha3QueryFunc, 0, 0); + } + return rc; +} + +/************************* End ../ext/misc/shathree.c ********************/ +/************************* Begin ../ext/misc/fileio.c ******************/ +/* +** 2014-06-13 +** +** 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 SQLite extension implements SQL functions readfile() and +** writefile(), and eponymous virtual type "fsdir". +** +** WRITEFILE(FILE, DATA [, MODE [, MTIME]]): +** +** If neither of the optional arguments is present, then this UDF +** function writes blob DATA to file FILE. If successful, the number +** of bytes written is returned. If an error occurs, NULL is returned. +** +** If the first option argument - MODE - is present, then it must +** be passed an integer value that corresponds to a POSIX mode +** value (file type + permissions, as returned in the stat.st_mode +** field by the stat() system call). Three types of files may +** be written/created: +** +** regular files: (mode & 0170000)==0100000 +** symbolic links: (mode & 0170000)==0120000 +** directories: (mode & 0170000)==0040000 +** +** For a directory, the DATA is ignored. For a symbolic link, it is +** interpreted as text and used as the target of the link. For a +** regular file, it is interpreted as a blob and written into the +** named file. Regardless of the type of file, its permissions are +** set to (mode & 0777) before returning. +** +** If the optional MTIME argument is present, then it is interpreted +** as an integer - the number of seconds since the unix epoch. The +** modification-time of the target file is set to this value before +** returning. +** +** If three or more arguments are passed to this function and an +** error is encountered, an exception is raised. +** +** READFILE(FILE): +** +** Read and return the contents of file FILE (type blob) from disk. +** +** FSDIR: +** +** Used as follows: +** +** SELECT * FROM fsdir($path [, $dir]); +** +** Parameter $path is an absolute or relative pathname. If the file that it +** refers to does not exist, it is an error. If the path refers to a regular +** file or symbolic link, it returns a single row. Or, if the path refers +** to a directory, it returns one row for the directory, and one row for each +** file within the hierarchy rooted at $path. +** +** Each row has the following columns: +** +** name: Path to file or directory (text value). +** mode: Value of stat.st_mode for directory entry (an integer). +** mtime: Value of stat.st_mtime for directory entry (an integer). +** data: For a regular file, a blob containing the file data. For a +** symlink, a text value containing the text of the link. For a +** directory, NULL. +** +** If a non-NULL value is specified for the optional $dir parameter and +** $path is a relative path, then $path is interpreted relative to $dir. +** And the paths returned in the "name" column of the table are also +** relative to directory $dir. +*/ +/* #include "sqlite3ext.h" */ +SQLITE_EXTENSION_INIT1 +#include +#include +#include + +#include +#include +#include +#if !defined(_WIN32) && !defined(WIN32) +# include +# include +# include +# include +#else +# include "windows.h" +# include +# include +/* # include "test_windirent.h" */ +# define dirent DIRENT +# ifndef chmod +# define chmod _chmod +# endif +# ifndef stat +# define stat _stat +# endif +# define mkdir(path,mode) _mkdir(path) +# define lstat(path,buf) stat(path,buf) +#endif +#include +#include + + +/* +** Structure of the fsdir() table-valued function +*/ + /* 0 1 2 3 4 5 */ +#define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)" +#define FSDIR_COLUMN_NAME 0 /* Name of the file */ +#define FSDIR_COLUMN_MODE 1 /* Access mode */ +#define FSDIR_COLUMN_MTIME 2 /* Last modification time */ +#define FSDIR_COLUMN_DATA 3 /* File content */ +#define FSDIR_COLUMN_PATH 4 /* Path to top of search */ +#define FSDIR_COLUMN_DIR 5 /* Path is relative to this directory */ + + +/* +** Set the result stored by context ctx to a blob containing the +** contents of file zName. Or, leave the result unchanged (NULL) +** if the file does not exist or is unreadable. +** +** If the file exceeds the SQLite blob size limit, through an +** SQLITE_TOOBIG error. +** +** Throw an SQLITE_IOERR if there are difficulties pulling the file +** off of disk. +*/ +static void readFileContents(sqlite3_context *ctx, const char *zName){ + FILE *in; + sqlite3_int64 nIn; + void *pBuf; + sqlite3 *db; + int mxBlob; + + in = fopen(zName, "rb"); + if( in==0 ){ + /* File does not exist or is unreadable. Leave the result set to NULL. */ + return; + } + fseek(in, 0, SEEK_END); + nIn = ftell(in); + rewind(in); + db = sqlite3_context_db_handle(ctx); + mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1); + if( nIn>mxBlob ){ + sqlite3_result_error_code(ctx, SQLITE_TOOBIG); + fclose(in); + return; + } + pBuf = sqlite3_malloc64( nIn ? nIn : 1 ); + if( pBuf==0 ){ + sqlite3_result_error_nomem(ctx); + fclose(in); + return; + } + if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){ + sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free); + }else{ + sqlite3_result_error_code(ctx, SQLITE_IOERR); + sqlite3_free(pBuf); + } + fclose(in); +} + +/* +** Implementation of the "readfile(X)" SQL function. The entire content +** of the file named X is read and returned as a BLOB. NULL is returned +** if the file does not exist or is unreadable. +*/ +static void readfileFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zName; + (void)(argc); /* Unused parameter */ + zName = (const char*)sqlite3_value_text(argv[0]); + if( zName==0 ) return; + readFileContents(context, zName); +} + +/* +** Set the error message contained in context ctx to the results of +** vprintf(zFmt, ...). +*/ +static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){ + char *zMsg = 0; + va_list ap; + va_start(ap, zFmt); + zMsg = sqlite3_vmprintf(zFmt, ap); + sqlite3_result_error(ctx, zMsg, -1); + sqlite3_free(zMsg); + va_end(ap); +} + +#if defined(_WIN32) +/* +** This function is designed to convert a Win32 FILETIME structure into the +** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC). +*/ +static sqlite3_uint64 fileTimeToUnixTime( + LPFILETIME pFileTime +){ + SYSTEMTIME epochSystemTime; + ULARGE_INTEGER epochIntervals; + FILETIME epochFileTime; + ULARGE_INTEGER fileIntervals; + + memset(&epochSystemTime, 0, sizeof(SYSTEMTIME)); + epochSystemTime.wYear = 1970; + epochSystemTime.wMonth = 1; + epochSystemTime.wDay = 1; + SystemTimeToFileTime(&epochSystemTime, &epochFileTime); + epochIntervals.LowPart = epochFileTime.dwLowDateTime; + epochIntervals.HighPart = epochFileTime.dwHighDateTime; + + fileIntervals.LowPart = pFileTime->dwLowDateTime; + fileIntervals.HighPart = pFileTime->dwHighDateTime; + + return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000; +} + +/* +** This function attempts to normalize the time values found in the stat() +** buffer to UTC. This is necessary on Win32, where the runtime library +** appears to return these values as local times. +*/ +static void statTimesToUtc( + const char *zPath, + struct stat *pStatBuf +){ + HANDLE hFindFile; + WIN32_FIND_DATAW fd; + LPWSTR zUnicodeName; + extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*); + zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath); + if( zUnicodeName ){ + memset(&fd, 0, sizeof(WIN32_FIND_DATAW)); + hFindFile = FindFirstFileW(zUnicodeName, &fd); + if( hFindFile!=NULL ){ + pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime); + pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime); + pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime); + FindClose(hFindFile); + } + sqlite3_free(zUnicodeName); + } +} +#endif + +/* +** This function is used in place of stat(). On Windows, special handling +** is required in order for the included time to be returned as UTC. On all +** other systems, this function simply calls stat(). +*/ +static int fileStat( + const char *zPath, + struct stat *pStatBuf +){ +#if defined(_WIN32) + int rc = stat(zPath, pStatBuf); + if( rc==0 ) statTimesToUtc(zPath, pStatBuf); + return rc; +#else + return stat(zPath, pStatBuf); +#endif +} + +/* +** This function is used in place of lstat(). On Windows, special handling +** is required in order for the included time to be returned as UTC. On all +** other systems, this function simply calls lstat(). +*/ +static int fileLinkStat( + const char *zPath, + struct stat *pStatBuf +){ +#if defined(_WIN32) + int rc = lstat(zPath, pStatBuf); + if( rc==0 ) statTimesToUtc(zPath, pStatBuf); + return rc; +#else + return lstat(zPath, pStatBuf); +#endif +} + +/* +** Argument zFile is the name of a file that will be created and/or written +** by SQL function writefile(). This function ensures that the directory +** zFile will be written to exists, creating it if required. The permissions +** for any path components created by this function are set in accordance +** with the current umask. +** +** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise, +** SQLITE_OK is returned if the directory is successfully created, or +** SQLITE_ERROR otherwise. +*/ +static int makeDirectory( + const char *zFile +){ + char *zCopy = sqlite3_mprintf("%s", zFile); + int rc = SQLITE_OK; + + if( zCopy==0 ){ + rc = SQLITE_NOMEM; + }else{ + int nCopy = (int)strlen(zCopy); + int i = 1; + + while( rc==SQLITE_OK ){ + struct stat sStat; + int rc2; + + for(; zCopy[i]!='/' && i=0 ){ +#if defined(_WIN32) +#if !SQLITE_OS_WINRT + /* Windows */ + FILETIME lastAccess; + FILETIME lastWrite; + SYSTEMTIME currentTime; + LONGLONG intervals; + HANDLE hFile; + LPWSTR zUnicodeName; + extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*); + + GetSystemTime(¤tTime); + SystemTimeToFileTime(¤tTime, &lastAccess); + intervals = Int32x32To64(mtime, 10000000) + 116444736000000000; + lastWrite.dwLowDateTime = (DWORD)intervals; + lastWrite.dwHighDateTime = intervals >> 32; + zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile); + if( zUnicodeName==0 ){ + return 1; + } + hFile = CreateFileW( + zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL + ); + sqlite3_free(zUnicodeName); + if( hFile!=INVALID_HANDLE_VALUE ){ + BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite); + CloseHandle(hFile); + return !bResult; + }else{ + return 1; + } +#endif +#elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */ + /* Recent unix */ + struct timespec times[2]; + times[0].tv_nsec = times[1].tv_nsec = 0; + times[0].tv_sec = time(0); + times[1].tv_sec = mtime; + if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){ + return 1; + } +#else + /* Legacy unix */ + struct timeval times[2]; + times[0].tv_usec = times[1].tv_usec = 0; + times[0].tv_sec = time(0); + times[1].tv_sec = mtime; + if( utimes(zFile, times) ){ + return 1; + } +#endif + } + + return 0; +} + +/* +** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function. +** Refer to header comments at the top of this file for details. +*/ +static void writefileFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zFile; + mode_t mode = 0; + int res; + sqlite3_int64 mtime = -1; + + if( argc<2 || argc>4 ){ + sqlite3_result_error(context, + "wrong number of arguments to function writefile()", -1 + ); + return; + } + + zFile = (const char*)sqlite3_value_text(argv[0]); + if( zFile==0 ) return; + if( argc>=3 ){ + mode = (mode_t)sqlite3_value_int(argv[2]); + } + if( argc==4 ){ + mtime = sqlite3_value_int64(argv[3]); + } + + res = writeFile(context, zFile, argv[1], mode, mtime); + if( res==1 && errno==ENOENT ){ + if( makeDirectory(zFile)==SQLITE_OK ){ + res = writeFile(context, zFile, argv[1], mode, mtime); + } + } + + if( argc>2 && res!=0 ){ + if( S_ISLNK(mode) ){ + ctxErrorMsg(context, "failed to create symlink: %s", zFile); + }else if( S_ISDIR(mode) ){ + ctxErrorMsg(context, "failed to create directory: %s", zFile); + }else{ + ctxErrorMsg(context, "failed to write file: %s", zFile); + } + } +} + +/* +** SQL function: lsmode(MODE) +** +** Given a numberic st_mode from stat(), convert it into a human-readable +** text string in the style of "ls -l". +*/ +static void lsModeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i; + int iMode = sqlite3_value_int(argv[0]); + char z[16]; + (void)argc; + if( S_ISLNK(iMode) ){ + z[0] = 'l'; + }else if( S_ISREG(iMode) ){ + z[0] = '-'; + }else if( S_ISDIR(iMode) ){ + z[0] = 'd'; + }else{ + z[0] = '?'; + } + for(i=0; i<3; i++){ + int m = (iMode >> ((2-i)*3)); + char *a = &z[1 + i*3]; + a[0] = (m & 0x4) ? 'r' : '-'; + a[1] = (m & 0x2) ? 'w' : '-'; + a[2] = (m & 0x1) ? 'x' : '-'; + } + z[10] = '\0'; + sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT); +} + +#ifndef SQLITE_OMIT_VIRTUALTABLE + +/* +** Cursor type for recursively iterating through a directory structure. +*/ +typedef struct fsdir_cursor fsdir_cursor; +typedef struct FsdirLevel FsdirLevel; + +struct FsdirLevel { + DIR *pDir; /* From opendir() */ + char *zDir; /* Name of directory (nul-terminated) */ +}; + +struct fsdir_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + + int nLvl; /* Number of entries in aLvl[] array */ + int iLvl; /* Index of current entry */ + FsdirLevel *aLvl; /* Hierarchy of directories being traversed */ + + const char *zBase; + int nBase; + + struct stat sStat; /* Current lstat() results */ + char *zPath; /* Path to current entry */ + sqlite3_int64 iRowid; /* Current rowid */ +}; + +typedef struct fsdir_tab fsdir_tab; +struct fsdir_tab { + sqlite3_vtab base; /* Base class - must be first */ +}; + +/* +** Construct a new fsdir virtual table object. +*/ +static int fsdirConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + fsdir_tab *pNew = 0; + int rc; + (void)pAux; + (void)argc; + (void)argv; + (void)pzErr; + rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA); + if( rc==SQLITE_OK ){ + pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) ); + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); + } + *ppVtab = (sqlite3_vtab*)pNew; + return rc; +} + +/* +** This method is the destructor for fsdir vtab objects. +*/ +static int fsdirDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* +** Constructor for a new fsdir_cursor object. +*/ +static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + fsdir_cursor *pCur; + (void)p; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + pCur->iLvl = -1; + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Reset a cursor back to the state it was in when first returned +** by fsdirOpen(). +*/ +static void fsdirResetCursor(fsdir_cursor *pCur){ + int i; + for(i=0; i<=pCur->iLvl; i++){ + FsdirLevel *pLvl = &pCur->aLvl[i]; + if( pLvl->pDir ) closedir(pLvl->pDir); + sqlite3_free(pLvl->zDir); + } + sqlite3_free(pCur->zPath); + sqlite3_free(pCur->aLvl); + pCur->aLvl = 0; + pCur->zPath = 0; + pCur->zBase = 0; + pCur->nBase = 0; + pCur->nLvl = 0; + pCur->iLvl = -1; + pCur->iRowid = 1; +} + +/* +** Destructor for an fsdir_cursor. +*/ +static int fsdirClose(sqlite3_vtab_cursor *cur){ + fsdir_cursor *pCur = (fsdir_cursor*)cur; + + fsdirResetCursor(pCur); + sqlite3_free(pCur); + return SQLITE_OK; +} + +/* +** Set the error message for the virtual table associated with cursor +** pCur to the results of vprintf(zFmt, ...). +*/ +static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){ + va_list ap; + va_start(ap, zFmt); + pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap); + va_end(ap); +} + + +/* +** Advance an fsdir_cursor to its next row of output. +*/ +static int fsdirNext(sqlite3_vtab_cursor *cur){ + fsdir_cursor *pCur = (fsdir_cursor*)cur; + mode_t m = pCur->sStat.st_mode; + + pCur->iRowid++; + if( S_ISDIR(m) ){ + /* Descend into this directory */ + int iNew = pCur->iLvl + 1; + FsdirLevel *pLvl; + if( iNew>=pCur->nLvl ){ + int nNew = iNew+1; + sqlite3_int64 nByte = nNew*sizeof(FsdirLevel); + FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte); + if( aNew==0 ) return SQLITE_NOMEM; + memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl)); + pCur->aLvl = aNew; + pCur->nLvl = nNew; + } + pCur->iLvl = iNew; + pLvl = &pCur->aLvl[iNew]; + + pLvl->zDir = pCur->zPath; + pCur->zPath = 0; + pLvl->pDir = opendir(pLvl->zDir); + if( pLvl->pDir==0 ){ + fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath); + return SQLITE_ERROR; + } + } + + while( pCur->iLvl>=0 ){ + FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl]; + struct dirent *pEntry = readdir(pLvl->pDir); + if( pEntry ){ + if( pEntry->d_name[0]=='.' ){ + if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue; + if( pEntry->d_name[1]=='\0' ) continue; + } + sqlite3_free(pCur->zPath); + pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name); + if( pCur->zPath==0 ) return SQLITE_NOMEM; + if( fileLinkStat(pCur->zPath, &pCur->sStat) ){ + fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath); + return SQLITE_ERROR; + } + return SQLITE_OK; + } + closedir(pLvl->pDir); + sqlite3_free(pLvl->zDir); + pLvl->pDir = 0; + pLvl->zDir = 0; + pCur->iLvl--; + } + + /* EOF */ + sqlite3_free(pCur->zPath); + pCur->zPath = 0; + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the series_cursor +** is currently pointing. +*/ +static int fsdirColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + fsdir_cursor *pCur = (fsdir_cursor*)cur; + switch( i ){ + case FSDIR_COLUMN_NAME: { + sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT); + break; + } + + case FSDIR_COLUMN_MODE: + sqlite3_result_int64(ctx, pCur->sStat.st_mode); + break; + + case FSDIR_COLUMN_MTIME: + sqlite3_result_int64(ctx, pCur->sStat.st_mtime); + break; + + case FSDIR_COLUMN_DATA: { + mode_t m = pCur->sStat.st_mode; + if( S_ISDIR(m) ){ + sqlite3_result_null(ctx); +#if !defined(_WIN32) && !defined(WIN32) + }else if( S_ISLNK(m) ){ + char aStatic[64]; + char *aBuf = aStatic; + sqlite3_int64 nBuf = 64; + int n; + + while( 1 ){ + n = readlink(pCur->zPath, aBuf, nBuf); + if( nzPath); + } + } + case FSDIR_COLUMN_PATH: + default: { + /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters. + ** always return their values as NULL */ + break; + } + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** first row returned is assigned rowid value 1, and each subsequent +** row a value 1 more than that of the previous. +*/ +static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + fsdir_cursor *pCur = (fsdir_cursor*)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int fsdirEof(sqlite3_vtab_cursor *cur){ + fsdir_cursor *pCur = (fsdir_cursor*)cur; + return (pCur->zPath==0); +} + +/* +** xFilter callback. +** +** idxNum==1 PATH parameter only +** idxNum==2 Both PATH and DIR supplied +*/ +static int fsdirFilter( + sqlite3_vtab_cursor *cur, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + const char *zDir = 0; + fsdir_cursor *pCur = (fsdir_cursor*)cur; + (void)idxStr; + fsdirResetCursor(pCur); + + if( idxNum==0 ){ + fsdirSetErrmsg(pCur, "table function fsdir requires an argument"); + return SQLITE_ERROR; + } + + assert( argc==idxNum && (argc==1 || argc==2) ); + zDir = (const char*)sqlite3_value_text(argv[0]); + if( zDir==0 ){ + fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument"); + return SQLITE_ERROR; + } + if( argc==2 ){ + pCur->zBase = (const char*)sqlite3_value_text(argv[1]); + } + if( pCur->zBase ){ + pCur->nBase = (int)strlen(pCur->zBase)+1; + pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir); + }else{ + pCur->zPath = sqlite3_mprintf("%s", zDir); + } + + if( pCur->zPath==0 ){ + return SQLITE_NOMEM; + } + if( fileLinkStat(pCur->zPath, &pCur->sStat) ){ + fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath); + return SQLITE_ERROR; + } + + return SQLITE_OK; +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the generate_series virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +** +** In this implementation idxNum is used to represent the +** query plan. idxStr is unused. +** +** The query plan is represented by values of idxNum: +** +** (1) The path value is supplied by argv[0] +** (2) Path is in argv[0] and dir is in argv[1] +*/ +static int fsdirBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; /* Loop over constraints */ + int idxPath = -1; /* Index in pIdxInfo->aConstraint of PATH= */ + int idxDir = -1; /* Index in pIdxInfo->aConstraint of DIR= */ + int seenPath = 0; /* True if an unusable PATH= constraint is seen */ + int seenDir = 0; /* True if an unusable DIR= constraint is seen */ + const struct sqlite3_index_constraint *pConstraint; + + (void)tab; + pConstraint = pIdxInfo->aConstraint; + for(i=0; inConstraint; i++, pConstraint++){ + if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + switch( pConstraint->iColumn ){ + case FSDIR_COLUMN_PATH: { + if( pConstraint->usable ){ + idxPath = i; + seenPath = 0; + }else if( idxPath<0 ){ + seenPath = 1; + } + break; + } + case FSDIR_COLUMN_DIR: { + if( pConstraint->usable ){ + idxDir = i; + seenDir = 0; + }else if( idxDir<0 ){ + seenDir = 1; + } + break; + } + } + } + if( seenPath || seenDir ){ + /* If input parameters are unusable, disallow this plan */ + return SQLITE_CONSTRAINT; + } + + if( idxPath<0 ){ + pIdxInfo->idxNum = 0; + /* The pIdxInfo->estimatedCost should have been initialized to a huge + ** number. Leave it unchanged. */ + pIdxInfo->estimatedRows = 0x7fffffff; + }else{ + pIdxInfo->aConstraintUsage[idxPath].omit = 1; + pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1; + if( idxDir>=0 ){ + pIdxInfo->aConstraintUsage[idxDir].omit = 1; + pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2; + pIdxInfo->idxNum = 2; + pIdxInfo->estimatedCost = 10.0; + }else{ + pIdxInfo->idxNum = 1; + pIdxInfo->estimatedCost = 100.0; + } + } + + return SQLITE_OK; +} + +/* +** Register the "fsdir" virtual table. +*/ +static int fsdirRegister(sqlite3 *db){ + static sqlite3_module fsdirModule = { + 0, /* iVersion */ + 0, /* xCreate */ + fsdirConnect, /* xConnect */ + fsdirBestIndex, /* xBestIndex */ + fsdirDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + fsdirOpen, /* xOpen - open a cursor */ + fsdirClose, /* xClose - close a cursor */ + fsdirFilter, /* xFilter - configure scan constraints */ + fsdirNext, /* xNext - advance a cursor */ + fsdirEof, /* xEof - check for end of scan */ + fsdirColumn, /* xColumn - read data */ + fsdirRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0, /* xShadowName */ + }; + + int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0); + return rc; +} +#else /* SQLITE_OMIT_VIRTUALTABLE */ +# define fsdirRegister(x) SQLITE_OK +#endif + +#ifdef _WIN32 + +#endif +int sqlite3_fileio_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + rc = sqlite3_create_function(db, "readfile", 1, + SQLITE_UTF8|SQLITE_DIRECTONLY, 0, + readfileFunc, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "writefile", -1, + SQLITE_UTF8|SQLITE_DIRECTONLY, 0, + writefileFunc, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0, + lsModeFunc, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = fsdirRegister(db); + } + return rc; +} + +/************************* End ../ext/misc/fileio.c ********************/ +/************************* Begin ../ext/misc/completion.c ******************/ +/* +** 2017-07-10 +** +** 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 implements an eponymous virtual table that returns suggested +** completions for a partial SQL input. +** +** Suggested usage: +** +** SELECT DISTINCT candidate COLLATE nocase +** FROM completion($prefix,$wholeline) +** ORDER BY 1; +** +** The two query parameters are optional. $prefix is the text of the +** current word being typed and that is to be completed. $wholeline is +** the complete input line, used for context. +** +** The raw completion() table might return the same candidate multiple +** times, for example if the same column name is used to two or more +** tables. And the candidates are returned in an arbitrary order. Hence, +** the DISTINCT and ORDER BY are recommended. +** +** This virtual table operates at the speed of human typing, and so there +** is no attempt to make it fast. Even a slow implementation will be much +** faster than any human can type. +** +*/ +/* #include "sqlite3ext.h" */ +SQLITE_EXTENSION_INIT1 +#include +#include +#include + +#ifndef SQLITE_OMIT_VIRTUALTABLE + +/* completion_vtab is a subclass of sqlite3_vtab which will +** serve as the underlying representation of a completion virtual table +*/ +typedef struct completion_vtab completion_vtab; +struct completion_vtab { + sqlite3_vtab base; /* Base class - must be first */ + sqlite3 *db; /* Database connection for this completion vtab */ +}; + +/* completion_cursor is a subclass of sqlite3_vtab_cursor which will +** serve as the underlying representation of a cursor that scans +** over rows of the result +*/ +typedef struct completion_cursor completion_cursor; +struct completion_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3 *db; /* Database connection for this cursor */ + int nPrefix, nLine; /* Number of bytes in zPrefix and zLine */ + char *zPrefix; /* The prefix for the word we want to complete */ + char *zLine; /* The whole that we want to complete */ + const char *zCurrentRow; /* Current output row */ + int szRow; /* Length of the zCurrentRow string */ + sqlite3_stmt *pStmt; /* Current statement */ + sqlite3_int64 iRowid; /* The rowid */ + int ePhase; /* Current phase */ + int j; /* inter-phase counter */ +}; + +/* Values for ePhase: +*/ +#define COMPLETION_FIRST_PHASE 1 +#define COMPLETION_KEYWORDS 1 +#define COMPLETION_PRAGMAS 2 +#define COMPLETION_FUNCTIONS 3 +#define COMPLETION_COLLATIONS 4 +#define COMPLETION_INDEXES 5 +#define COMPLETION_TRIGGERS 6 +#define COMPLETION_DATABASES 7 +#define COMPLETION_TABLES 8 /* Also VIEWs and TRIGGERs */ +#define COMPLETION_COLUMNS 9 +#define COMPLETION_MODULES 10 +#define COMPLETION_EOF 11 + +/* +** The completionConnect() method is invoked to create a new +** completion_vtab that describes the completion virtual table. +** +** Think of this routine as the constructor for completion_vtab objects. +** +** All this routine needs to do is: +** +** (1) Allocate the completion_vtab object and initialize all fields. +** +** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the +** result set of queries against completion will look like. +*/ +static int completionConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + completion_vtab *pNew; + int rc; + + (void)(pAux); /* Unused parameter */ + (void)(argc); /* Unused parameter */ + (void)(argv); /* Unused parameter */ + (void)(pzErr); /* Unused parameter */ + +/* Column numbers */ +#define COMPLETION_COLUMN_CANDIDATE 0 /* Suggested completion of the input */ +#define COMPLETION_COLUMN_PREFIX 1 /* Prefix of the word to be completed */ +#define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */ +#define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */ + + sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(" + " candidate TEXT," + " prefix TEXT HIDDEN," + " wholeline TEXT HIDDEN," + " phase INT HIDDEN" /* Used for debugging only */ + ")"); + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + pNew->db = db; + } + return rc; +} + +/* +** This method is the destructor for completion_cursor objects. +*/ +static int completionDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* +** Constructor for a new completion_cursor object. +*/ +static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + completion_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + pCur->db = ((completion_vtab*)p)->db; + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Reset the completion_cursor. +*/ +static void completionCursorReset(completion_cursor *pCur){ + sqlite3_free(pCur->zPrefix); pCur->zPrefix = 0; pCur->nPrefix = 0; + sqlite3_free(pCur->zLine); pCur->zLine = 0; pCur->nLine = 0; + sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0; + pCur->j = 0; +} + +/* +** Destructor for a completion_cursor. +*/ +static int completionClose(sqlite3_vtab_cursor *cur){ + completionCursorReset((completion_cursor*)cur); + sqlite3_free(cur); + return SQLITE_OK; +} + +/* +** Advance a completion_cursor to its next row of output. +** +** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object +** record the current state of the scan. This routine sets ->zCurrentRow +** to the current row of output and then returns. If no more rows remain, +** then ->ePhase is set to COMPLETION_EOF which will signal the virtual +** table that has reached the end of its scan. +** +** The current implementation just lists potential identifiers and +** keywords and filters them by zPrefix. Future enhancements should +** take zLine into account to try to restrict the set of identifiers and +** keywords based on what would be legal at the current point of input. +*/ +static int completionNext(sqlite3_vtab_cursor *cur){ + completion_cursor *pCur = (completion_cursor*)cur; + int eNextPhase = 0; /* Next phase to try if current phase reaches end */ + int iCol = -1; /* If >=0, step pCur->pStmt and use the i-th column */ + pCur->iRowid++; + while( pCur->ePhase!=COMPLETION_EOF ){ + switch( pCur->ePhase ){ + case COMPLETION_KEYWORDS: { + if( pCur->j >= sqlite3_keyword_count() ){ + pCur->zCurrentRow = 0; + pCur->ePhase = COMPLETION_DATABASES; + }else{ + sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow); + } + iCol = -1; + break; + } + case COMPLETION_DATABASES: { + if( pCur->pStmt==0 ){ + sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, + &pCur->pStmt, 0); + } + iCol = 1; + eNextPhase = COMPLETION_TABLES; + break; + } + case COMPLETION_TABLES: { + if( pCur->pStmt==0 ){ + sqlite3_stmt *pS2; + char *zSql = 0; + const char *zSep = ""; + sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0); + while( sqlite3_step(pS2)==SQLITE_ROW ){ + const char *zDb = (const char*)sqlite3_column_text(pS2, 1); + zSql = sqlite3_mprintf( + "%z%s" + "SELECT name FROM \"%w\".sqlite_master", + zSql, zSep, zDb + ); + if( zSql==0 ) return SQLITE_NOMEM; + zSep = " UNION "; + } + sqlite3_finalize(pS2); + sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0); + sqlite3_free(zSql); + } + iCol = 0; + eNextPhase = COMPLETION_COLUMNS; + break; + } + case COMPLETION_COLUMNS: { + if( pCur->pStmt==0 ){ + sqlite3_stmt *pS2; + char *zSql = 0; + const char *zSep = ""; + sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0); + while( sqlite3_step(pS2)==SQLITE_ROW ){ + const char *zDb = (const char*)sqlite3_column_text(pS2, 1); + zSql = sqlite3_mprintf( + "%z%s" + "SELECT pti.name FROM \"%w\".sqlite_master AS sm" + " JOIN pragma_table_info(sm.name,%Q) AS pti" + " WHERE sm.type='table'", + zSql, zSep, zDb, zDb + ); + if( zSql==0 ) return SQLITE_NOMEM; + zSep = " UNION "; + } + sqlite3_finalize(pS2); + sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0); + sqlite3_free(zSql); + } + iCol = 0; + eNextPhase = COMPLETION_EOF; + break; + } + } + if( iCol<0 ){ + /* This case is when the phase presets zCurrentRow */ + if( pCur->zCurrentRow==0 ) continue; + }else{ + if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){ + /* Extract the next row of content */ + pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol); + pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol); + }else{ + /* When all rows are finished, advance to the next phase */ + sqlite3_finalize(pCur->pStmt); + pCur->pStmt = 0; + pCur->ePhase = eNextPhase; + continue; + } + } + if( pCur->nPrefix==0 ) break; + if( pCur->nPrefix<=pCur->szRow + && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0 + ){ + break; + } + } + + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the completion_cursor +** is currently pointing. +*/ +static int completionColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + completion_cursor *pCur = (completion_cursor*)cur; + switch( i ){ + case COMPLETION_COLUMN_CANDIDATE: { + sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT); + break; + } + case COMPLETION_COLUMN_PREFIX: { + sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT); + break; + } + case COMPLETION_COLUMN_WHOLELINE: { + sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT); + break; + } + case COMPLETION_COLUMN_PHASE: { + sqlite3_result_int(ctx, pCur->ePhase); + break; + } + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + completion_cursor *pCur = (completion_cursor*)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int completionEof(sqlite3_vtab_cursor *cur){ + completion_cursor *pCur = (completion_cursor*)cur; + return pCur->ePhase >= COMPLETION_EOF; +} + +/* +** This method is called to "rewind" the completion_cursor object back +** to the first row of output. This method is always called at least +** once prior to any call to completionColumn() or completionRowid() or +** completionEof(). +*/ +static int completionFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + completion_cursor *pCur = (completion_cursor *)pVtabCursor; + int iArg = 0; + (void)(idxStr); /* Unused parameter */ + (void)(argc); /* Unused parameter */ + completionCursorReset(pCur); + if( idxNum & 1 ){ + pCur->nPrefix = sqlite3_value_bytes(argv[iArg]); + if( pCur->nPrefix>0 ){ + pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg])); + if( pCur->zPrefix==0 ) return SQLITE_NOMEM; + } + iArg = 1; + } + if( idxNum & 2 ){ + pCur->nLine = sqlite3_value_bytes(argv[iArg]); + if( pCur->nLine>0 ){ + pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg])); + if( pCur->zLine==0 ) return SQLITE_NOMEM; + } + } + if( pCur->zLine!=0 && pCur->zPrefix==0 ){ + int i = pCur->nLine; + while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){ + i--; + } + pCur->nPrefix = pCur->nLine - i; + if( pCur->nPrefix>0 ){ + pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i); + if( pCur->zPrefix==0 ) return SQLITE_NOMEM; + } + } + pCur->iRowid = 0; + pCur->ePhase = COMPLETION_FIRST_PHASE; + return completionNext(pVtabCursor); +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the completion virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +** +** There are two hidden parameters that act as arguments to the table-valued +** function: "prefix" and "wholeline". Bit 0 of idxNum is set if "prefix" +** is available and bit 1 is set if "wholeline" is available. +*/ +static int completionBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; /* Loop over constraints */ + int idxNum = 0; /* The query plan bitmask */ + int prefixIdx = -1; /* Index of the start= constraint, or -1 if none */ + int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */ + int nArg = 0; /* Number of arguments that completeFilter() expects */ + const struct sqlite3_index_constraint *pConstraint; + + (void)(tab); /* Unused parameter */ + pConstraint = pIdxInfo->aConstraint; + for(i=0; inConstraint; i++, pConstraint++){ + if( pConstraint->usable==0 ) continue; + if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + switch( pConstraint->iColumn ){ + case COMPLETION_COLUMN_PREFIX: + prefixIdx = i; + idxNum |= 1; + break; + case COMPLETION_COLUMN_WHOLELINE: + wholelineIdx = i; + idxNum |= 2; + break; + } + } + if( prefixIdx>=0 ){ + pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg; + pIdxInfo->aConstraintUsage[prefixIdx].omit = 1; + } + if( wholelineIdx>=0 ){ + pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg; + pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1; + } + pIdxInfo->idxNum = idxNum; + pIdxInfo->estimatedCost = (double)5000 - 1000*nArg; + pIdxInfo->estimatedRows = 500 - 100*nArg; + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** completion virtual table. +*/ +static sqlite3_module completionModule = { + 0, /* iVersion */ + 0, /* xCreate */ + completionConnect, /* xConnect */ + completionBestIndex, /* xBestIndex */ + completionDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + completionOpen, /* xOpen - open a cursor */ + completionClose, /* xClose - close a cursor */ + completionFilter, /* xFilter - configure scan constraints */ + completionNext, /* xNext - advance a cursor */ + completionEof, /* xEof - check for end of scan */ + completionColumn, /* xColumn - read data */ + completionRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ +}; + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +int sqlite3CompletionVtabInit(sqlite3 *db){ + int rc = SQLITE_OK; +#ifndef SQLITE_OMIT_VIRTUALTABLE + rc = sqlite3_create_module(db, "completion", &completionModule, 0); +#endif + return rc; +} + +#ifdef _WIN32 + +#endif +int sqlite3_completion_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); + (void)(pzErrMsg); /* Unused parameter */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + rc = sqlite3CompletionVtabInit(db); +#endif + return rc; +} + +/************************* End ../ext/misc/completion.c ********************/ +/************************* Begin ../ext/misc/appendvfs.c ******************/ +/* +** 2017-10-20 +** +** 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 implements a VFS shim that allows an SQLite database to be +** appended onto the end of some other file, such as an executable. +** +** A special record must appear at the end of the file that identifies the +** file as an appended database and provides an offset to page 1. For +** best performance page 1 should be located at a disk page boundary, though +** that is not required. +** +** When opening a database using this VFS, the connection might treat +** the file as an ordinary SQLite database, or it might treat is as a +** database appended onto some other file. Here are the rules: +** +** (1) When opening a new empty file, that file is treated as an ordinary +** database. +** +** (2) When opening a file that begins with the standard SQLite prefix +** string "SQLite format 3", that file is treated as an ordinary +** database. +** +** (3) When opening a file that ends with the appendvfs trailer string +** "Start-Of-SQLite3-NNNNNNNN" that file is treated as an appended +** database. +** +** (4) If none of the above apply and the SQLITE_OPEN_CREATE flag is +** set, then a new database is appended to the already existing file. +** +** (5) Otherwise, SQLITE_CANTOPEN is returned. +** +** To avoid unnecessary complications with the PENDING_BYTE, the size of +** the file containing the database is limited to 1GB. This VFS will refuse +** to read or write past the 1GB mark. This restriction might be lifted in +** future versions. For now, if you need a large database, then keep the +** database in a separate file. +** +** If the file being opened is not an appended database, then this shim is +** a pass-through into the default underlying VFS. +**/ +/* #include "sqlite3ext.h" */ +SQLITE_EXTENSION_INIT1 +#include +#include + +/* The append mark at the end of the database is: +** +** Start-Of-SQLite3-NNNNNNNN +** 123456789 123456789 12345 +** +** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is +** the offset to page 1. +*/ +#define APND_MARK_PREFIX "Start-Of-SQLite3-" +#define APND_MARK_PREFIX_SZ 17 +#define APND_MARK_SIZE 25 + +/* +** Maximum size of the combined prefix + database + append-mark. This +** must be less than 0x40000000 to avoid locking issues on Windows. +*/ +#define APND_MAX_SIZE (65536*15259) + +/* +** Forward declaration of objects used by this utility +*/ +typedef struct sqlite3_vfs ApndVfs; +typedef struct ApndFile ApndFile; + +/* Access to a lower-level VFS that (might) implement dynamic loading, +** access to randomness, etc. +*/ +#define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData)) +#define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1)) + +/* An open file */ +struct ApndFile { + sqlite3_file base; /* IO methods */ + sqlite3_int64 iPgOne; /* File offset to page 1 */ + sqlite3_int64 iMark; /* Start of the append-mark */ +}; + +/* +** Methods for ApndFile +*/ +static int apndClose(sqlite3_file*); +static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); +static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst); +static int apndTruncate(sqlite3_file*, sqlite3_int64 size); +static int apndSync(sqlite3_file*, int flags); +static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize); +static int apndLock(sqlite3_file*, int); +static int apndUnlock(sqlite3_file*, int); +static int apndCheckReservedLock(sqlite3_file*, int *pResOut); +static int apndFileControl(sqlite3_file*, int op, void *pArg); +static int apndSectorSize(sqlite3_file*); +static int apndDeviceCharacteristics(sqlite3_file*); +static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**); +static int apndShmLock(sqlite3_file*, int offset, int n, int flags); +static void apndShmBarrier(sqlite3_file*); +static int apndShmUnmap(sqlite3_file*, int deleteFlag); +static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); +static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p); + +/* +** Methods for ApndVfs +*/ +static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *); +static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir); +static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *); +static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut); +static void *apndDlOpen(sqlite3_vfs*, const char *zFilename); +static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg); +static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void); +static void apndDlClose(sqlite3_vfs*, void*); +static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut); +static int apndSleep(sqlite3_vfs*, int microseconds); +static int apndCurrentTime(sqlite3_vfs*, double*); +static int apndGetLastError(sqlite3_vfs*, int, char *); +static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*); +static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr); +static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z); +static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName); + +static sqlite3_vfs apnd_vfs = { + 3, /* iVersion (set when registered) */ + 0, /* szOsFile (set when registered) */ + 1024, /* mxPathname */ + 0, /* pNext */ + "apndvfs", /* zName */ + 0, /* pAppData (set when registered) */ + apndOpen, /* xOpen */ + apndDelete, /* xDelete */ + apndAccess, /* xAccess */ + apndFullPathname, /* xFullPathname */ + apndDlOpen, /* xDlOpen */ + apndDlError, /* xDlError */ + apndDlSym, /* xDlSym */ + apndDlClose, /* xDlClose */ + apndRandomness, /* xRandomness */ + apndSleep, /* xSleep */ + apndCurrentTime, /* xCurrentTime */ + apndGetLastError, /* xGetLastError */ + apndCurrentTimeInt64, /* xCurrentTimeInt64 */ + apndSetSystemCall, /* xSetSystemCall */ + apndGetSystemCall, /* xGetSystemCall */ + apndNextSystemCall /* xNextSystemCall */ +}; + +static const sqlite3_io_methods apnd_io_methods = { + 3, /* iVersion */ + apndClose, /* xClose */ + apndRead, /* xRead */ + apndWrite, /* xWrite */ + apndTruncate, /* xTruncate */ + apndSync, /* xSync */ + apndFileSize, /* xFileSize */ + apndLock, /* xLock */ + apndUnlock, /* xUnlock */ + apndCheckReservedLock, /* xCheckReservedLock */ + apndFileControl, /* xFileControl */ + apndSectorSize, /* xSectorSize */ + apndDeviceCharacteristics, /* xDeviceCharacteristics */ + apndShmMap, /* xShmMap */ + apndShmLock, /* xShmLock */ + apndShmBarrier, /* xShmBarrier */ + apndShmUnmap, /* xShmUnmap */ + apndFetch, /* xFetch */ + apndUnfetch /* xUnfetch */ +}; + + + +/* +** Close an apnd-file. +*/ +static int apndClose(sqlite3_file *pFile){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xClose(pFile); +} + +/* +** Read data from an apnd-file. +*/ +static int apndRead( + sqlite3_file *pFile, + void *zBuf, + int iAmt, + sqlite_int64 iOfst +){ + ApndFile *p = (ApndFile *)pFile; + pFile = ORIGFILE(pFile); + return pFile->pMethods->xRead(pFile, zBuf, iAmt, iOfst+p->iPgOne); +} + +/* +** Add the append-mark onto the end of the file. +*/ +static int apndWriteMark(ApndFile *p, sqlite3_file *pFile){ + int i; + unsigned char a[APND_MARK_SIZE]; + memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ); + for(i=0; i<8; i++){ + a[APND_MARK_PREFIX_SZ+i] = (p->iPgOne >> (56 - i*8)) & 0xff; + } + return pFile->pMethods->xWrite(pFile, a, APND_MARK_SIZE, p->iMark); +} + +/* +** Write data to an apnd-file. +*/ +static int apndWrite( + sqlite3_file *pFile, + const void *zBuf, + int iAmt, + sqlite_int64 iOfst +){ + int rc; + ApndFile *p = (ApndFile *)pFile; + pFile = ORIGFILE(pFile); + if( iOfst+iAmt>=APND_MAX_SIZE ) return SQLITE_FULL; + rc = pFile->pMethods->xWrite(pFile, zBuf, iAmt, iOfst+p->iPgOne); + if( rc==SQLITE_OK && iOfst + iAmt + p->iPgOne > p->iMark ){ + sqlite3_int64 sz = 0; + rc = pFile->pMethods->xFileSize(pFile, &sz); + if( rc==SQLITE_OK ){ + p->iMark = sz - APND_MARK_SIZE; + if( iOfst + iAmt + p->iPgOne > p->iMark ){ + p->iMark = p->iPgOne + iOfst + iAmt; + rc = apndWriteMark(p, pFile); + } + } + } + return rc; +} + +/* +** Truncate an apnd-file. +*/ +static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){ + int rc; + ApndFile *p = (ApndFile *)pFile; + pFile = ORIGFILE(pFile); + rc = pFile->pMethods->xTruncate(pFile, size+p->iPgOne+APND_MARK_SIZE); + if( rc==SQLITE_OK ){ + p->iMark = p->iPgOne+size; + rc = apndWriteMark(p, pFile); + } + return rc; +} + +/* +** Sync an apnd-file. +*/ +static int apndSync(sqlite3_file *pFile, int flags){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xSync(pFile, flags); +} + +/* +** Return the current file-size of an apnd-file. +*/ +static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ + ApndFile *p = (ApndFile *)pFile; + int rc; + pFile = ORIGFILE(p); + rc = pFile->pMethods->xFileSize(pFile, pSize); + if( rc==SQLITE_OK && p->iPgOne ){ + *pSize -= p->iPgOne + APND_MARK_SIZE; + } + return rc; +} + +/* +** Lock an apnd-file. +*/ +static int apndLock(sqlite3_file *pFile, int eLock){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xLock(pFile, eLock); +} + +/* +** Unlock an apnd-file. +*/ +static int apndUnlock(sqlite3_file *pFile, int eLock){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xUnlock(pFile, eLock); +} + +/* +** Check if another file-handle holds a RESERVED lock on an apnd-file. +*/ +static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xCheckReservedLock(pFile, pResOut); +} + +/* +** File control method. For custom operations on an apnd-file. +*/ +static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){ + ApndFile *p = (ApndFile *)pFile; + int rc; + pFile = ORIGFILE(pFile); + rc = pFile->pMethods->xFileControl(pFile, op, pArg); + if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){ + *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", p->iPgOne, *(char**)pArg); + } + return rc; +} + +/* +** Return the sector-size in bytes for an apnd-file. +*/ +static int apndSectorSize(sqlite3_file *pFile){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xSectorSize(pFile); +} + +/* +** Return the device characteristic flags supported by an apnd-file. +*/ +static int apndDeviceCharacteristics(sqlite3_file *pFile){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xDeviceCharacteristics(pFile); +} + +/* Create a shared memory file mapping */ +static int apndShmMap( + sqlite3_file *pFile, + int iPg, + int pgsz, + int bExtend, + void volatile **pp +){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp); +} + +/* Perform locking on a shared-memory segment */ +static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xShmLock(pFile,offset,n,flags); +} + +/* Memory barrier operation on shared memory */ +static void apndShmBarrier(sqlite3_file *pFile){ + pFile = ORIGFILE(pFile); + pFile->pMethods->xShmBarrier(pFile); +} + +/* Unmap a shared memory segment */ +static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){ + pFile = ORIGFILE(pFile); + return pFile->pMethods->xShmUnmap(pFile,deleteFlag); +} + +/* Fetch a page of a memory-mapped file */ +static int apndFetch( + sqlite3_file *pFile, + sqlite3_int64 iOfst, + int iAmt, + void **pp +){ + ApndFile *p = (ApndFile *)pFile; + pFile = ORIGFILE(pFile); + return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp); +} + +/* Release a memory-mapped page */ +static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){ + ApndFile *p = (ApndFile *)pFile; + pFile = ORIGFILE(pFile); + return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage); +} + +/* +** Check to see if the file is an ordinary SQLite database file. +*/ +static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){ + int rc; + char zHdr[16]; + static const char aSqliteHdr[] = "SQLite format 3"; + if( sz<512 ) return 0; + rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0); + if( rc ) return 0; + return memcmp(zHdr, aSqliteHdr, sizeof(zHdr))==0; +} + +/* +** Try to read the append-mark off the end of a file. Return the +** start of the appended database if the append-mark is present. If +** there is no append-mark, return -1; +*/ +static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){ + int rc, i; + sqlite3_int64 iMark; + unsigned char a[APND_MARK_SIZE]; + + if( sz<=APND_MARK_SIZE ) return -1; + rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE); + if( rc ) return -1; + if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1; + iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ]&0x7f))<<56; + for(i=1; i<8; i++){ + iMark += (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<(56-8*i); + } + return iMark; +} + +/* +** Open an apnd file handle. +*/ +static int apndOpen( + sqlite3_vfs *pVfs, + const char *zName, + sqlite3_file *pFile, + int flags, + int *pOutFlags +){ + ApndFile *p; + sqlite3_file *pSubFile; + sqlite3_vfs *pSubVfs; + int rc; + sqlite3_int64 sz; + pSubVfs = ORIGVFS(pVfs); + if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){ + return pSubVfs->xOpen(pSubVfs, zName, pFile, flags, pOutFlags); + } + p = (ApndFile*)pFile; + memset(p, 0, sizeof(*p)); + pSubFile = ORIGFILE(pFile); + p->base.pMethods = &apnd_io_methods; + rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags); + if( rc ) goto apnd_open_done; + rc = pSubFile->pMethods->xFileSize(pSubFile, &sz); + if( rc ){ + pSubFile->pMethods->xClose(pSubFile); + goto apnd_open_done; + } + if( apndIsOrdinaryDatabaseFile(sz, pSubFile) ){ + memmove(pFile, pSubFile, pSubVfs->szOsFile); + return SQLITE_OK; + } + p->iMark = 0; + p->iPgOne = apndReadMark(sz, pFile); + if( p->iPgOne>0 ){ + return SQLITE_OK; + } + if( (flags & SQLITE_OPEN_CREATE)==0 ){ + pSubFile->pMethods->xClose(pSubFile); + rc = SQLITE_CANTOPEN; + } + p->iPgOne = (sz+0xfff) & ~(sqlite3_int64)0xfff; +apnd_open_done: + if( rc ) pFile->pMethods = 0; + return rc; +} + +/* +** All other VFS methods are pass-thrus. +*/ +static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync); +} +static int apndAccess( + sqlite3_vfs *pVfs, + const char *zPath, + int flags, + int *pResOut +){ + return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut); +} +static int apndFullPathname( + sqlite3_vfs *pVfs, + const char *zPath, + int nOut, + char *zOut +){ + return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut); +} +static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath); +} +static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ + ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg); +} +static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){ + return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym); +} +static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){ + ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle); +} +static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut); +} +static int apndSleep(sqlite3_vfs *pVfs, int nMicro){ + return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro); +} +static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ + return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut); +} +static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){ + return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b); +} +static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){ + return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p); +} +static int apndSetSystemCall( + sqlite3_vfs *pVfs, + const char *zName, + sqlite3_syscall_ptr pCall +){ + return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall); +} +static sqlite3_syscall_ptr apndGetSystemCall( + sqlite3_vfs *pVfs, + const char *zName +){ + return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName); +} +static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){ + return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName); +} + + +#ifdef _WIN32 + +#endif +/* +** This routine is called when the extension is loaded. +** Register the new VFS. +*/ +int sqlite3_appendvfs_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + sqlite3_vfs *pOrig; + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; + (void)db; + pOrig = sqlite3_vfs_find(0); + apnd_vfs.iVersion = pOrig->iVersion; + apnd_vfs.pAppData = pOrig; + apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile); + rc = sqlite3_vfs_register(&apnd_vfs, 0); +#ifdef APPENDVFS_TEST + if( rc==SQLITE_OK ){ + rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister); + } +#endif + if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY; + return rc; +} + +/************************* End ../ext/misc/appendvfs.c ********************/ +/************************* Begin ../ext/misc/memtrace.c ******************/ +/* +** 2019-01-21 +** +** 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 implements an extension that uses the SQLITE_CONFIG_MALLOC +** mechanism to add a tracing layer on top of SQLite. If this extension +** is registered prior to sqlite3_initialize(), it will cause all memory +** allocation activities to be logged on standard output, or to some other +** FILE specified by the initializer. +** +** This file needs to be compiled into the application that uses it. +** +** This extension is used to implement the --memtrace option of the +** command-line shell. +*/ +#include +#include +#include + +/* The original memory allocation routines */ +static sqlite3_mem_methods memtraceBase; +static FILE *memtraceOut; + +/* Methods that trace memory allocations */ +static void *memtraceMalloc(int n){ + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", + memtraceBase.xRoundup(n)); + } + return memtraceBase.xMalloc(n); +} +static void memtraceFree(void *p){ + if( p==0 ) return; + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); + } + memtraceBase.xFree(p); +} +static void *memtraceRealloc(void *p, int n){ + if( p==0 ) return memtraceMalloc(n); + if( n==0 ){ + memtraceFree(p); + return 0; + } + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", + memtraceBase.xSize(p), memtraceBase.xRoundup(n)); + } + return memtraceBase.xRealloc(p, n); +} +static int memtraceSize(void *p){ + return memtraceBase.xSize(p); +} +static int memtraceRoundup(int n){ + return memtraceBase.xRoundup(n); +} +static int memtraceInit(void *p){ + return memtraceBase.xInit(p); +} +static void memtraceShutdown(void *p){ + memtraceBase.xShutdown(p); +} + +/* The substitute memory allocator */ +static sqlite3_mem_methods ersaztMethods = { + memtraceMalloc, + memtraceFree, + memtraceRealloc, + memtraceSize, + memtraceRoundup, + memtraceInit, + memtraceShutdown, + 0 +}; + +/* Begin tracing memory allocations to out. */ +int sqlite3MemTraceActivate(FILE *out){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc==0 ){ + rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); + } + } + memtraceOut = out; + return rc; +} + +/* Deactivate memory tracing */ +int sqlite3MemTraceDeactivate(void){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc!=0 ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + memset(&memtraceBase, 0, sizeof(memtraceBase)); + } + } + memtraceOut = 0; + return rc; +} + +/************************* End ../ext/misc/memtrace.c ********************/ +/************************* Begin ../ext/misc/uint.c ******************/ +/* +** 2020-04-14 +** +** 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 SQLite extension implements the UINT collating sequence. +** +** UINT works like BINARY for text, except that embedded strings +** of digits compare in numeric order. +** +** * Leading zeros are handled properly, in the sense that +** they do not mess of the maginitude comparison of embedded +** strings of digits. "x00123y" is equal to "x123y". +** +** * Only unsigned integers are recognized. Plus and minus +** signs are ignored. Decimal points and exponential notation +** are ignored. +** +** * Embedded integers can be of arbitrary length. Comparison +** is *not* limited integers that can be expressed as a +** 64-bit machine integer. +*/ +/* #include "sqlite3ext.h" */ +SQLITE_EXTENSION_INIT1 +#include +#include +#include + +/* +** Compare text in lexicographic order, except strings of digits +** compare in numeric order. +*/ +static int uintCollFunc( + void *notUsed, + int nKey1, const void *pKey1, + int nKey2, const void *pKey2 +){ + const unsigned char *zA = (const unsigned char*)pKey1; + const unsigned char *zB = (const unsigned char*)pKey2; + int i=0, j=0, x; + (void)notUsed; + while( i +#include +#include + +#include + +#ifndef SQLITE_OMIT_VIRTUALTABLE + +#ifndef SQLITE_AMALGAMATION + +/* typedef sqlite3_int64 i64; */ +/* typedef unsigned char u8; */ +typedef unsigned short u16; +typedef unsigned long u32; +#define MIN(a,b) ((a)<(b) ? (a) : (b)) + +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +#else +# define ALWAYS(X) (X) +# define NEVER(X) (X) +#endif + +#endif /* SQLITE_AMALGAMATION */ + +/* +** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK. +** +** In some ways it would be better to obtain these values from system +** header files. But, the dependency is undesirable and (a) these +** have been stable for decades, (b) the values are part of POSIX and +** are also made explicit in [man stat], and (c) are part of the +** file format for zip archives. +*/ +#ifndef S_IFDIR +# define S_IFDIR 0040000 +#endif +#ifndef S_IFREG +# define S_IFREG 0100000 +#endif +#ifndef S_IFLNK +# define S_IFLNK 0120000 +#endif + +static const char ZIPFILE_SCHEMA[] = + "CREATE TABLE y(" + "name PRIMARY KEY," /* 0: Name of file in zip archive */ + "mode," /* 1: POSIX mode for file */ + "mtime," /* 2: Last modification time (secs since 1970)*/ + "sz," /* 3: Size of object */ + "rawdata," /* 4: Raw data */ + "data," /* 5: Uncompressed data */ + "method," /* 6: Compression method (integer) */ + "z HIDDEN" /* 7: Name of zip file */ + ") WITHOUT ROWID;"; + +#define ZIPFILE_F_COLUMN_IDX 7 /* Index of column "file" in the above */ +#define ZIPFILE_BUFFER_SIZE (64*1024) + + +/* +** Magic numbers used to read and write zip files. +** +** ZIPFILE_NEWENTRY_MADEBY: +** Use this value for the "version-made-by" field in new zip file +** entries. The upper byte indicates "unix", and the lower byte +** indicates that the zip file matches pkzip specification 3.0. +** This is what info-zip seems to do. +** +** ZIPFILE_NEWENTRY_REQUIRED: +** Value for "version-required-to-extract" field of new entries. +** Version 2.0 is required to support folders and deflate compression. +** +** ZIPFILE_NEWENTRY_FLAGS: +** Value for "general-purpose-bit-flags" field of new entries. Bit +** 11 means "utf-8 filename and comment". +** +** ZIPFILE_SIGNATURE_CDS: +** First 4 bytes of a valid CDS record. +** +** ZIPFILE_SIGNATURE_LFH: +** First 4 bytes of a valid LFH record. +** +** ZIPFILE_SIGNATURE_EOCD +** First 4 bytes of a valid EOCD record. +*/ +#define ZIPFILE_EXTRA_TIMESTAMP 0x5455 +#define ZIPFILE_NEWENTRY_MADEBY ((3<<8) + 30) +#define ZIPFILE_NEWENTRY_REQUIRED 20 +#define ZIPFILE_NEWENTRY_FLAGS 0x800 +#define ZIPFILE_SIGNATURE_CDS 0x02014b50 +#define ZIPFILE_SIGNATURE_LFH 0x04034b50 +#define ZIPFILE_SIGNATURE_EOCD 0x06054b50 + +/* +** The sizes of the fixed-size part of each of the three main data +** structures in a zip archive. +*/ +#define ZIPFILE_LFH_FIXED_SZ 30 +#define ZIPFILE_EOCD_FIXED_SZ 22 +#define ZIPFILE_CDS_FIXED_SZ 46 + +/* +*** 4.3.16 End of central directory record: +*** +*** end of central dir signature 4 bytes (0x06054b50) +*** number of this disk 2 bytes +*** number of the disk with the +*** start of the central directory 2 bytes +*** total number of entries in the +*** central directory on this disk 2 bytes +*** total number of entries in +*** the central directory 2 bytes +*** size of the central directory 4 bytes +*** offset of start of central +*** directory with respect to +*** the starting disk number 4 bytes +*** .ZIP file comment length 2 bytes +*** .ZIP file comment (variable size) +*/ +typedef struct ZipfileEOCD ZipfileEOCD; +struct ZipfileEOCD { + u16 iDisk; + u16 iFirstDisk; + u16 nEntry; + u16 nEntryTotal; + u32 nSize; + u32 iOffset; +}; + +/* +*** 4.3.12 Central directory structure: +*** +*** ... +*** +*** central file header signature 4 bytes (0x02014b50) +*** version made by 2 bytes +*** version needed to extract 2 bytes +*** general purpose bit flag 2 bytes +*** compression method 2 bytes +*** last mod file time 2 bytes +*** last mod file date 2 bytes +*** crc-32 4 bytes +*** compressed size 4 bytes +*** uncompressed size 4 bytes +*** file name length 2 bytes +*** extra field length 2 bytes +*** file comment length 2 bytes +*** disk number start 2 bytes +*** internal file attributes 2 bytes +*** external file attributes 4 bytes +*** relative offset of local header 4 bytes +*/ +typedef struct ZipfileCDS ZipfileCDS; +struct ZipfileCDS { + u16 iVersionMadeBy; + u16 iVersionExtract; + u16 flags; + u16 iCompression; + u16 mTime; + u16 mDate; + u32 crc32; + u32 szCompressed; + u32 szUncompressed; + u16 nFile; + u16 nExtra; + u16 nComment; + u16 iDiskStart; + u16 iInternalAttr; + u32 iExternalAttr; + u32 iOffset; + char *zFile; /* Filename (sqlite3_malloc()) */ +}; + +/* +*** 4.3.7 Local file header: +*** +*** local file header signature 4 bytes (0x04034b50) +*** version needed to extract 2 bytes +*** general purpose bit flag 2 bytes +*** compression method 2 bytes +*** last mod file time 2 bytes +*** last mod file date 2 bytes +*** crc-32 4 bytes +*** compressed size 4 bytes +*** uncompressed size 4 bytes +*** file name length 2 bytes +*** extra field length 2 bytes +*** +*/ +typedef struct ZipfileLFH ZipfileLFH; +struct ZipfileLFH { + u16 iVersionExtract; + u16 flags; + u16 iCompression; + u16 mTime; + u16 mDate; + u32 crc32; + u32 szCompressed; + u32 szUncompressed; + u16 nFile; + u16 nExtra; +}; + +typedef struct ZipfileEntry ZipfileEntry; +struct ZipfileEntry { + ZipfileCDS cds; /* Parsed CDS record */ + u32 mUnixTime; /* Modification time, in UNIX format */ + u8 *aExtra; /* cds.nExtra+cds.nComment bytes of extra data */ + i64 iDataOff; /* Offset to data in file (if aData==0) */ + u8 *aData; /* cds.szCompressed bytes of compressed data */ + ZipfileEntry *pNext; /* Next element in in-memory CDS */ +}; + +/* +** Cursor type for zipfile tables. +*/ +typedef struct ZipfileCsr ZipfileCsr; +struct ZipfileCsr { + sqlite3_vtab_cursor base; /* Base class - must be first */ + i64 iId; /* Cursor ID */ + u8 bEof; /* True when at EOF */ + u8 bNoop; /* If next xNext() call is no-op */ + + /* Used outside of write transactions */ + FILE *pFile; /* Zip file */ + i64 iNextOff; /* Offset of next record in central directory */ + ZipfileEOCD eocd; /* Parse of central directory record */ + + ZipfileEntry *pFreeEntry; /* Free this list when cursor is closed or reset */ + ZipfileEntry *pCurrent; /* Current entry */ + ZipfileCsr *pCsrNext; /* Next cursor on same virtual table */ +}; + +typedef struct ZipfileTab ZipfileTab; +struct ZipfileTab { + sqlite3_vtab base; /* Base class - must be first */ + char *zFile; /* Zip file this table accesses (may be NULL) */ + sqlite3 *db; /* Host database connection */ + u8 *aBuffer; /* Temporary buffer used for various tasks */ + + ZipfileCsr *pCsrList; /* List of cursors */ + i64 iNextCsrid; + + /* The following are used by write transactions only */ + ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */ + ZipfileEntry *pLastEntry; /* Last element in pFirstEntry list */ + FILE *pWriteFd; /* File handle open on zip archive */ + i64 szCurrent; /* Current size of zip archive */ + i64 szOrig; /* Size of archive at start of transaction */ +}; + +/* +** Set the error message contained in context ctx to the results of +** vprintf(zFmt, ...). +*/ +static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){ + char *zMsg = 0; + va_list ap; + va_start(ap, zFmt); + zMsg = sqlite3_vmprintf(zFmt, ap); + sqlite3_result_error(ctx, zMsg, -1); + sqlite3_free(zMsg); + va_end(ap); +} + +/* +** If string zIn is quoted, dequote it in place. Otherwise, if the string +** is not quoted, do nothing. +*/ +static void zipfileDequote(char *zIn){ + char q = zIn[0]; + if( q=='"' || q=='\'' || q=='`' || q=='[' ){ + int iIn = 1; + int iOut = 0; + if( q=='[' ) q = ']'; + while( ALWAYS(zIn[iIn]) ){ + char c = zIn[iIn++]; + if( c==q && zIn[iIn++]!=q ) break; + zIn[iOut++] = c; + } + zIn[iOut] = '\0'; + } +} + +/* +** Construct a new ZipfileTab virtual table object. +** +** argv[0] -> module name ("zipfile") +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> "column name" and other module argument fields. +*/ +static int zipfileConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE; + int nFile = 0; + const char *zFile = 0; + ZipfileTab *pNew = 0; + int rc; + + /* If the table name is not "zipfile", require that the argument be + ** specified. This stops zipfile tables from being created as: + ** + ** CREATE VIRTUAL TABLE zzz USING zipfile(); + ** + ** It does not prevent: + ** + ** CREATE VIRTUAL TABLE zipfile USING zipfile(); + */ + assert( 0==sqlite3_stricmp(argv[0], "zipfile") ); + if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){ + *pzErr = sqlite3_mprintf("zipfile constructor requires one argument"); + return SQLITE_ERROR; + } + + if( argc>3 ){ + zFile = argv[3]; + nFile = (int)strlen(zFile)+1; + } + + rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA); + if( rc==SQLITE_OK ){ + pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile); + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, nByte+nFile); + pNew->db = db; + pNew->aBuffer = (u8*)&pNew[1]; + if( zFile ){ + pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE]; + memcpy(pNew->zFile, zFile, nFile); + zipfileDequote(pNew->zFile); + } + } + sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); + *ppVtab = (sqlite3_vtab*)pNew; + return rc; +} + +/* +** Free the ZipfileEntry structure indicated by the only argument. +*/ +static void zipfileEntryFree(ZipfileEntry *p){ + if( p ){ + sqlite3_free(p->cds.zFile); + sqlite3_free(p); + } +} + +/* +** Release resources that should be freed at the end of a write +** transaction. +*/ +static void zipfileCleanupTransaction(ZipfileTab *pTab){ + ZipfileEntry *pEntry; + ZipfileEntry *pNext; + + if( pTab->pWriteFd ){ + fclose(pTab->pWriteFd); + pTab->pWriteFd = 0; + } + for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){ + pNext = pEntry->pNext; + zipfileEntryFree(pEntry); + } + pTab->pFirstEntry = 0; + pTab->pLastEntry = 0; + pTab->szCurrent = 0; + pTab->szOrig = 0; +} + +/* +** This method is the destructor for zipfile vtab objects. +*/ +static int zipfileDisconnect(sqlite3_vtab *pVtab){ + zipfileCleanupTransaction((ZipfileTab*)pVtab); + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* +** Constructor for a new ZipfileCsr object. +*/ +static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){ + ZipfileTab *pTab = (ZipfileTab*)p; + ZipfileCsr *pCsr; + pCsr = sqlite3_malloc(sizeof(*pCsr)); + *ppCsr = (sqlite3_vtab_cursor*)pCsr; + if( pCsr==0 ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(*pCsr)); + pCsr->iId = ++pTab->iNextCsrid; + pCsr->pCsrNext = pTab->pCsrList; + pTab->pCsrList = pCsr; + return SQLITE_OK; +} + +/* +** Reset a cursor back to the state it was in when first returned +** by zipfileOpen(). +*/ +static void zipfileResetCursor(ZipfileCsr *pCsr){ + ZipfileEntry *p; + ZipfileEntry *pNext; + + pCsr->bEof = 0; + if( pCsr->pFile ){ + fclose(pCsr->pFile); + pCsr->pFile = 0; + zipfileEntryFree(pCsr->pCurrent); + pCsr->pCurrent = 0; + } + + for(p=pCsr->pFreeEntry; p; p=pNext){ + pNext = p->pNext; + zipfileEntryFree(p); + } +} + +/* +** Destructor for an ZipfileCsr. +*/ +static int zipfileClose(sqlite3_vtab_cursor *cur){ + ZipfileCsr *pCsr = (ZipfileCsr*)cur; + ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab); + ZipfileCsr **pp; + zipfileResetCursor(pCsr); + + /* Remove this cursor from the ZipfileTab.pCsrList list. */ + for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext)); + *pp = pCsr->pCsrNext; + + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Set the error message for the virtual table associated with cursor +** pCsr to the results of vprintf(zFmt, ...). +*/ +static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){ + va_list ap; + va_start(ap, zFmt); + sqlite3_free(pTab->base.zErrMsg); + pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap); + va_end(ap); +} +static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){ + va_list ap; + va_start(ap, zFmt); + sqlite3_free(pCsr->base.pVtab->zErrMsg); + pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap); + va_end(ap); +} + +/* +** Read nRead bytes of data from offset iOff of file pFile into buffer +** aRead[]. Return SQLITE_OK if successful, or an SQLite error code +** otherwise. +** +** If an error does occur, output variable (*pzErrmsg) may be set to point +** to an English language error message. It is the responsibility of the +** caller to eventually free this buffer using +** sqlite3_free(). +*/ +static int zipfileReadData( + FILE *pFile, /* Read from this file */ + u8 *aRead, /* Read into this buffer */ + int nRead, /* Number of bytes to read */ + i64 iOff, /* Offset to read from */ + char **pzErrmsg /* OUT: Error message (from sqlite3_malloc) */ +){ + size_t n; + fseek(pFile, (long)iOff, SEEK_SET); + n = fread(aRead, 1, nRead, pFile); + if( (int)n!=nRead ){ + *pzErrmsg = sqlite3_mprintf("error in fread()"); + return SQLITE_ERROR; + } + return SQLITE_OK; +} + +static int zipfileAppendData( + ZipfileTab *pTab, + const u8 *aWrite, + int nWrite +){ + size_t n; + fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET); + n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd); + if( (int)n!=nWrite ){ + pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()"); + return SQLITE_ERROR; + } + pTab->szCurrent += nWrite; + return SQLITE_OK; +} + +/* +** Read and return a 16-bit little-endian unsigned integer from buffer aBuf. +*/ +static u16 zipfileGetU16(const u8 *aBuf){ + return (aBuf[1] << 8) + aBuf[0]; +} + +/* +** Read and return a 32-bit little-endian unsigned integer from buffer aBuf. +*/ +static u32 zipfileGetU32(const u8 *aBuf){ + return ((u32)(aBuf[3]) << 24) + + ((u32)(aBuf[2]) << 16) + + ((u32)(aBuf[1]) << 8) + + ((u32)(aBuf[0]) << 0); +} + +/* +** Write a 16-bit little endiate integer into buffer aBuf. +*/ +static void zipfilePutU16(u8 *aBuf, u16 val){ + aBuf[0] = val & 0xFF; + aBuf[1] = (val>>8) & 0xFF; +} + +/* +** Write a 32-bit little endiate integer into buffer aBuf. +*/ +static void zipfilePutU32(u8 *aBuf, u32 val){ + aBuf[0] = val & 0xFF; + aBuf[1] = (val>>8) & 0xFF; + aBuf[2] = (val>>16) & 0xFF; + aBuf[3] = (val>>24) & 0xFF; +} + +#define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) ) +#define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) ) + +#define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; } +#define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; } + +/* +** Magic numbers used to read CDS records. +*/ +#define ZIPFILE_CDS_NFILE_OFF 28 +#define ZIPFILE_CDS_SZCOMPRESSED_OFF 20 + +/* +** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR +** if the record is not well-formed, or SQLITE_OK otherwise. +*/ +static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){ + u8 *aRead = aBuf; + u32 sig = zipfileRead32(aRead); + int rc = SQLITE_OK; + if( sig!=ZIPFILE_SIGNATURE_CDS ){ + rc = SQLITE_ERROR; + }else{ + pCDS->iVersionMadeBy = zipfileRead16(aRead); + pCDS->iVersionExtract = zipfileRead16(aRead); + pCDS->flags = zipfileRead16(aRead); + pCDS->iCompression = zipfileRead16(aRead); + pCDS->mTime = zipfileRead16(aRead); + pCDS->mDate = zipfileRead16(aRead); + pCDS->crc32 = zipfileRead32(aRead); + pCDS->szCompressed = zipfileRead32(aRead); + pCDS->szUncompressed = zipfileRead32(aRead); + assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] ); + pCDS->nFile = zipfileRead16(aRead); + pCDS->nExtra = zipfileRead16(aRead); + pCDS->nComment = zipfileRead16(aRead); + pCDS->iDiskStart = zipfileRead16(aRead); + pCDS->iInternalAttr = zipfileRead16(aRead); + pCDS->iExternalAttr = zipfileRead32(aRead); + pCDS->iOffset = zipfileRead32(aRead); + assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] ); + } + + return rc; +} + +/* +** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR +** if the record is not well-formed, or SQLITE_OK otherwise. +*/ +static int zipfileReadLFH( + u8 *aBuffer, + ZipfileLFH *pLFH +){ + u8 *aRead = aBuffer; + int rc = SQLITE_OK; + + u32 sig = zipfileRead32(aRead); + if( sig!=ZIPFILE_SIGNATURE_LFH ){ + rc = SQLITE_ERROR; + }else{ + pLFH->iVersionExtract = zipfileRead16(aRead); + pLFH->flags = zipfileRead16(aRead); + pLFH->iCompression = zipfileRead16(aRead); + pLFH->mTime = zipfileRead16(aRead); + pLFH->mDate = zipfileRead16(aRead); + pLFH->crc32 = zipfileRead32(aRead); + pLFH->szCompressed = zipfileRead32(aRead); + pLFH->szUncompressed = zipfileRead32(aRead); + pLFH->nFile = zipfileRead16(aRead); + pLFH->nExtra = zipfileRead16(aRead); + } + return rc; +} + + +/* +** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields. +** Scan through this buffer to find an "extra-timestamp" field. If one +** exists, extract the 32-bit modification-timestamp from it and store +** the value in output parameter *pmTime. +** +** Zero is returned if no extra-timestamp record could be found (and so +** *pmTime is left unchanged), or non-zero otherwise. +** +** The general format of an extra field is: +** +** Header ID 2 bytes +** Data Size 2 bytes +** Data N bytes +*/ +static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){ + int ret = 0; + u8 *p = aExtra; + u8 *pEnd = &aExtra[nExtra]; + + while( p modtime is present */ + *pmTime = zipfileGetU32(&p[1]); + ret = 1; + } + break; + } + } + + p += nByte; + } + return ret; +} + +/* +** Convert the standard MS-DOS timestamp stored in the mTime and mDate +** fields of the CDS structure passed as the only argument to a 32-bit +** UNIX seconds-since-the-epoch timestamp. Return the result. +** +** "Standard" MS-DOS time format: +** +** File modification time: +** Bits 00-04: seconds divided by 2 +** Bits 05-10: minute +** Bits 11-15: hour +** File modification date: +** Bits 00-04: day +** Bits 05-08: month (1-12) +** Bits 09-15: years from 1980 +** +** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx +*/ +static u32 zipfileMtime(ZipfileCDS *pCDS){ + int Y = (1980 + ((pCDS->mDate >> 9) & 0x7F)); + int M = ((pCDS->mDate >> 5) & 0x0F); + int D = (pCDS->mDate & 0x1F); + int B = -13; + + int sec = (pCDS->mTime & 0x1F)*2; + int min = (pCDS->mTime >> 5) & 0x3F; + int hr = (pCDS->mTime >> 11) & 0x1F; + i64 JD; + + /* JD = INT(365.25 * (Y+4716)) + INT(30.6001 * (M+1)) + D + B - 1524.5 */ + + /* Calculate the JD in seconds for noon on the day in question */ + if( M<3 ){ + Y = Y-1; + M = M+12; + } + JD = (i64)(24*60*60) * ( + (int)(365.25 * (Y + 4716)) + + (int)(30.6001 * (M + 1)) + + D + B - 1524 + ); + + /* Correct the JD for the time within the day */ + JD += (hr-12) * 3600 + min * 60 + sec; + + /* Convert JD to unix timestamp (the JD epoch is 2440587.5) */ + return (u32)(JD - (i64)(24405875) * 24*60*6); +} + +/* +** The opposite of zipfileMtime(). This function populates the mTime and +** mDate fields of the CDS structure passed as the first argument according +** to the UNIX timestamp value passed as the second. +*/ +static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){ + /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */ + i64 JD = (i64)2440588 + mUnixTime / (24*60*60); + + int A, B, C, D, E; + int yr, mon, day; + int hr, min, sec; + + A = (int)((JD - 1867216.25)/36524.25); + A = (int)(JD + 1 + A - (A/4)); + B = A + 1524; + C = (int)((B - 122.1)/365.25); + D = (36525*(C&32767))/100; + E = (int)((B-D)/30.6001); + + day = B - D - (int)(30.6001*E); + mon = (E<14 ? E-1 : E-13); + yr = mon>2 ? C-4716 : C-4715; + + hr = (mUnixTime % (24*60*60)) / (60*60); + min = (mUnixTime % (60*60)) / 60; + sec = (mUnixTime % 60); + + if( yr>=1980 ){ + pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9)); + pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11)); + }else{ + pCds->mDate = pCds->mTime = 0; + } + + assert( mUnixTime<315507600 + || mUnixTime==zipfileMtime(pCds) + || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds)) + /* || (mUnixTime % 2) */ + ); +} + +/* +** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in +** size) containing an entire zip archive image. Or, if aBlob is NULL, +** then pFile is a file-handle open on a zip file. In either case, this +** function creates a ZipfileEntry object based on the zip archive entry +** for which the CDS record is at offset iOff. +** +** If successful, SQLITE_OK is returned and (*ppEntry) set to point to +** the new object. Otherwise, an SQLite error code is returned and the +** final value of (*ppEntry) undefined. +*/ +static int zipfileGetEntry( + ZipfileTab *pTab, /* Store any error message here */ + const u8 *aBlob, /* Pointer to in-memory file image */ + int nBlob, /* Size of aBlob[] in bytes */ + FILE *pFile, /* If aBlob==0, read from this file */ + i64 iOff, /* Offset of CDS record */ + ZipfileEntry **ppEntry /* OUT: Pointer to new object */ +){ + u8 *aRead; + char **pzErr = &pTab->base.zErrMsg; + int rc = SQLITE_OK; + + if( aBlob==0 ){ + aRead = pTab->aBuffer; + rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr); + }else{ + aRead = (u8*)&aBlob[iOff]; + } + + if( rc==SQLITE_OK ){ + sqlite3_int64 nAlloc; + ZipfileEntry *pNew; + + int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]); + int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]); + nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]); + + nAlloc = sizeof(ZipfileEntry) + nExtra; + if( aBlob ){ + nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]); + } + + pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pNew, 0, sizeof(ZipfileEntry)); + rc = zipfileReadCDS(aRead, &pNew->cds); + if( rc!=SQLITE_OK ){ + *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff); + }else if( aBlob==0 ){ + rc = zipfileReadData( + pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr + ); + }else{ + aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ]; + } + } + + if( rc==SQLITE_OK ){ + u32 *pt = &pNew->mUnixTime; + pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead); + pNew->aExtra = (u8*)&pNew[1]; + memcpy(pNew->aExtra, &aRead[nFile], nExtra); + if( pNew->cds.zFile==0 ){ + rc = SQLITE_NOMEM; + }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){ + pNew->mUnixTime = zipfileMtime(&pNew->cds); + } + } + + if( rc==SQLITE_OK ){ + static const int szFix = ZIPFILE_LFH_FIXED_SZ; + ZipfileLFH lfh; + if( pFile ){ + rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr); + }else{ + aRead = (u8*)&aBlob[pNew->cds.iOffset]; + } + + rc = zipfileReadLFH(aRead, &lfh); + if( rc==SQLITE_OK ){ + pNew->iDataOff = pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ; + pNew->iDataOff += lfh.nFile + lfh.nExtra; + if( aBlob && pNew->cds.szCompressed ){ + pNew->aData = &pNew->aExtra[nExtra]; + memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed); + } + }else{ + *pzErr = sqlite3_mprintf("failed to read LFH at offset %d", + (int)pNew->cds.iOffset + ); + } + } + + if( rc!=SQLITE_OK ){ + zipfileEntryFree(pNew); + }else{ + *ppEntry = pNew; + } + } + + return rc; +} + +/* +** Advance an ZipfileCsr to its next row of output. +*/ +static int zipfileNext(sqlite3_vtab_cursor *cur){ + ZipfileCsr *pCsr = (ZipfileCsr*)cur; + int rc = SQLITE_OK; + + if( pCsr->pFile ){ + i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize; + zipfileEntryFree(pCsr->pCurrent); + pCsr->pCurrent = 0; + if( pCsr->iNextOff>=iEof ){ + pCsr->bEof = 1; + }else{ + ZipfileEntry *p = 0; + ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab); + rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p); + if( rc==SQLITE_OK ){ + pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ; + pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment; + } + pCsr->pCurrent = p; + } + }else{ + if( !pCsr->bNoop ){ + pCsr->pCurrent = pCsr->pCurrent->pNext; + } + if( pCsr->pCurrent==0 ){ + pCsr->bEof = 1; + } + } + + pCsr->bNoop = 0; + return rc; +} + +static void zipfileFree(void *p) { + sqlite3_free(p); +} + +/* +** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the +** size is nOut bytes. This function uncompresses the data and sets the +** return value in context pCtx to the result (a blob). +** +** If an error occurs, an error code is left in pCtx instead. +*/ +static void zipfileInflate( + sqlite3_context *pCtx, /* Store result here */ + const u8 *aIn, /* Compressed data */ + int nIn, /* Size of buffer aIn[] in bytes */ + int nOut /* Expected output size */ +){ + u8 *aRes = sqlite3_malloc(nOut); + if( aRes==0 ){ + sqlite3_result_error_nomem(pCtx); + }else{ + int err; + z_stream str; + memset(&str, 0, sizeof(str)); + + str.next_in = (Byte*)aIn; + str.avail_in = nIn; + str.next_out = (Byte*)aRes; + str.avail_out = nOut; + + err = inflateInit2(&str, -15); + if( err!=Z_OK ){ + zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err); + }else{ + err = inflate(&str, Z_NO_FLUSH); + if( err!=Z_STREAM_END ){ + zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err); + }else{ + sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree); + aRes = 0; + } + } + sqlite3_free(aRes); + inflateEnd(&str); + } +} + +/* +** Buffer aIn (size nIn bytes) contains uncompressed data. This function +** compresses it and sets (*ppOut) to point to a buffer containing the +** compressed data. The caller is responsible for eventually calling +** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut) +** is set to the size of buffer (*ppOut) in bytes. +** +** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error +** code is returned and an error message left in virtual-table handle +** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this +** case. +*/ +static int zipfileDeflate( + const u8 *aIn, int nIn, /* Input */ + u8 **ppOut, int *pnOut, /* Output */ + char **pzErr /* OUT: Error message */ +){ + int rc = SQLITE_OK; + sqlite3_int64 nAlloc; + z_stream str; + u8 *aOut; + + memset(&str, 0, sizeof(str)); + str.next_in = (Bytef*)aIn; + str.avail_in = nIn; + deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); + + nAlloc = deflateBound(&str, nIn); + aOut = (u8*)sqlite3_malloc64(nAlloc); + if( aOut==0 ){ + rc = SQLITE_NOMEM; + }else{ + int res; + str.next_out = aOut; + str.avail_out = nAlloc; + res = deflate(&str, Z_FINISH); + if( res==Z_STREAM_END ){ + *ppOut = aOut; + *pnOut = (int)str.total_out; + }else{ + sqlite3_free(aOut); + *pzErr = sqlite3_mprintf("zipfile: deflate() error"); + rc = SQLITE_ERROR; + } + deflateEnd(&str); + } + + return rc; +} + + +/* +** Return values of columns for the row at which the series_cursor +** is currently pointing. +*/ +static int zipfileColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + ZipfileCsr *pCsr = (ZipfileCsr*)cur; + ZipfileCDS *pCDS = &pCsr->pCurrent->cds; + int rc = SQLITE_OK; + switch( i ){ + case 0: /* name */ + sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT); + break; + case 1: /* mode */ + /* TODO: Whether or not the following is correct surely depends on + ** the platform on which the archive was created. */ + sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16); + break; + case 2: { /* mtime */ + sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime); + break; + } + case 3: { /* sz */ + if( sqlite3_vtab_nochange(ctx)==0 ){ + sqlite3_result_int64(ctx, pCDS->szUncompressed); + } + break; + } + case 4: /* rawdata */ + if( sqlite3_vtab_nochange(ctx) ) break; + case 5: { /* data */ + if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){ + int sz = pCDS->szCompressed; + int szFinal = pCDS->szUncompressed; + if( szFinal>0 ){ + u8 *aBuf; + u8 *aFree = 0; + if( pCsr->pCurrent->aData ){ + aBuf = pCsr->pCurrent->aData; + }else{ + aBuf = aFree = sqlite3_malloc64(sz); + if( aBuf==0 ){ + rc = SQLITE_NOMEM; + }else{ + FILE *pFile = pCsr->pFile; + if( pFile==0 ){ + pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd; + } + rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff, + &pCsr->base.pVtab->zErrMsg + ); + } + } + if( rc==SQLITE_OK ){ + if( i==5 && pCDS->iCompression ){ + zipfileInflate(ctx, aBuf, sz, szFinal); + }else{ + sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT); + } + } + sqlite3_free(aFree); + }else{ + /* Figure out if this is a directory or a zero-sized file. Consider + ** it to be a directory either if the mode suggests so, or if + ** the final character in the name is '/'. */ + u32 mode = pCDS->iExternalAttr >> 16; + if( !(mode & S_IFDIR) && pCDS->zFile[pCDS->nFile-1]!='/' ){ + sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC); + } + } + } + break; + } + case 6: /* method */ + sqlite3_result_int(ctx, pCDS->iCompression); + break; + default: /* z */ + assert( i==7 ); + sqlite3_result_int64(ctx, pCsr->iId); + break; + } + + return rc; +} + +/* +** Return TRUE if the cursor is at EOF. +*/ +static int zipfileEof(sqlite3_vtab_cursor *cur){ + ZipfileCsr *pCsr = (ZipfileCsr*)cur; + return pCsr->bEof; +} + +/* +** If aBlob is not NULL, then it points to a buffer nBlob bytes in size +** containing an entire zip archive image. Or, if aBlob is NULL, then pFile +** is guaranteed to be a file-handle open on a zip file. +** +** This function attempts to locate the EOCD record within the zip archive +** and populate *pEOCD with the results of decoding it. SQLITE_OK is +** returned if successful. Otherwise, an SQLite error code is returned and +** an English language error message may be left in virtual-table pTab. +*/ +static int zipfileReadEOCD( + ZipfileTab *pTab, /* Return errors here */ + const u8 *aBlob, /* Pointer to in-memory file image */ + int nBlob, /* Size of aBlob[] in bytes */ + FILE *pFile, /* Read from this file if aBlob==0 */ + ZipfileEOCD *pEOCD /* Object to populate */ +){ + u8 *aRead = pTab->aBuffer; /* Temporary buffer */ + int nRead; /* Bytes to read from file */ + int rc = SQLITE_OK; + + if( aBlob==0 ){ + i64 iOff; /* Offset to read from */ + i64 szFile; /* Total size of file in bytes */ + fseek(pFile, 0, SEEK_END); + szFile = (i64)ftell(pFile); + if( szFile==0 ){ + memset(pEOCD, 0, sizeof(ZipfileEOCD)); + return SQLITE_OK; + } + nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE)); + iOff = szFile - nRead; + rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg); + }else{ + nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE)); + aRead = (u8*)&aBlob[nBlob-nRead]; + } + + if( rc==SQLITE_OK ){ + int i; + + /* Scan backwards looking for the signature bytes */ + for(i=nRead-20; i>=0; i--){ + if( aRead[i]==0x50 && aRead[i+1]==0x4b + && aRead[i+2]==0x05 && aRead[i+3]==0x06 + ){ + break; + } + } + if( i<0 ){ + pTab->base.zErrMsg = sqlite3_mprintf( + "cannot find end of central directory record" + ); + return SQLITE_ERROR; + } + + aRead += i+4; + pEOCD->iDisk = zipfileRead16(aRead); + pEOCD->iFirstDisk = zipfileRead16(aRead); + pEOCD->nEntry = zipfileRead16(aRead); + pEOCD->nEntryTotal = zipfileRead16(aRead); + pEOCD->nSize = zipfileRead32(aRead); + pEOCD->iOffset = zipfileRead32(aRead); + } + + return rc; +} + +/* +** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry +** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added +** to the end of the list. Otherwise, it is added to the list immediately +** before pBefore (which is guaranteed to be a part of said list). +*/ +static void zipfileAddEntry( + ZipfileTab *pTab, + ZipfileEntry *pBefore, + ZipfileEntry *pNew +){ + assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) ); + assert( pNew->pNext==0 ); + if( pBefore==0 ){ + if( pTab->pFirstEntry==0 ){ + pTab->pFirstEntry = pTab->pLastEntry = pNew; + }else{ + assert( pTab->pLastEntry->pNext==0 ); + pTab->pLastEntry->pNext = pNew; + pTab->pLastEntry = pNew; + } + }else{ + ZipfileEntry **pp; + for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext)); + pNew->pNext = pBefore; + *pp = pNew; + } +} + +static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){ + ZipfileEOCD eocd; + int rc; + int i; + i64 iOff; + + rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd); + iOff = eocd.iOffset; + for(i=0; rc==SQLITE_OK && ipWriteFd, iOff, &pNew); + + if( rc==SQLITE_OK ){ + zipfileAddEntry(pTab, 0, pNew); + iOff += ZIPFILE_CDS_FIXED_SZ; + iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment; + } + } + return rc; +} + +/* +** xFilter callback. +*/ +static int zipfileFilter( + sqlite3_vtab_cursor *cur, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + ZipfileTab *pTab = (ZipfileTab*)cur->pVtab; + ZipfileCsr *pCsr = (ZipfileCsr*)cur; + const char *zFile = 0; /* Zip file to scan */ + int rc = SQLITE_OK; /* Return Code */ + int bInMemory = 0; /* True for an in-memory zipfile */ + + zipfileResetCursor(pCsr); + + if( pTab->zFile ){ + zFile = pTab->zFile; + }else if( idxNum==0 ){ + zipfileCursorErr(pCsr, "zipfile() function requires an argument"); + return SQLITE_ERROR; + }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ + const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]); + int nBlob = sqlite3_value_bytes(argv[0]); + assert( pTab->pFirstEntry==0 ); + rc = zipfileLoadDirectory(pTab, aBlob, nBlob); + pCsr->pFreeEntry = pTab->pFirstEntry; + pTab->pFirstEntry = pTab->pLastEntry = 0; + if( rc!=SQLITE_OK ) return rc; + bInMemory = 1; + }else{ + zFile = (const char*)sqlite3_value_text(argv[0]); + } + + if( 0==pTab->pWriteFd && 0==bInMemory ){ + pCsr->pFile = fopen(zFile, "rb"); + if( pCsr->pFile==0 ){ + zipfileCursorErr(pCsr, "cannot open file: %s", zFile); + rc = SQLITE_ERROR; + }else{ + rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd); + if( rc==SQLITE_OK ){ + if( pCsr->eocd.nEntry==0 ){ + pCsr->bEof = 1; + }else{ + pCsr->iNextOff = pCsr->eocd.iOffset; + rc = zipfileNext(cur); + } + } + } + }else{ + pCsr->bNoop = 1; + pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry; + rc = zipfileNext(cur); + } + + return rc; +} + +/* +** xBestIndex callback. +*/ +static int zipfileBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; + int idx = -1; + int unusable = 0; + + for(i=0; inConstraint; i++){ + const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; + if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue; + if( pCons->usable==0 ){ + unusable = 1; + }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + idx = i; + } + } + pIdxInfo->estimatedCost = 1000.0; + if( idx>=0 ){ + pIdxInfo->aConstraintUsage[idx].argvIndex = 1; + pIdxInfo->aConstraintUsage[idx].omit = 1; + pIdxInfo->idxNum = 1; + }else if( unusable ){ + return SQLITE_CONSTRAINT; + } + return SQLITE_OK; +} + +static ZipfileEntry *zipfileNewEntry(const char *zPath){ + ZipfileEntry *pNew; + pNew = sqlite3_malloc(sizeof(ZipfileEntry)); + if( pNew ){ + memset(pNew, 0, sizeof(ZipfileEntry)); + pNew->cds.zFile = sqlite3_mprintf("%s", zPath); + if( pNew->cds.zFile==0 ){ + sqlite3_free(pNew); + pNew = 0; + } + } + return pNew; +} + +static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){ + ZipfileCDS *pCds = &pEntry->cds; + u8 *a = aBuf; + + pCds->nExtra = 9; + + /* Write the LFH itself */ + zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH); + zipfileWrite16(a, pCds->iVersionExtract); + zipfileWrite16(a, pCds->flags); + zipfileWrite16(a, pCds->iCompression); + zipfileWrite16(a, pCds->mTime); + zipfileWrite16(a, pCds->mDate); + zipfileWrite32(a, pCds->crc32); + zipfileWrite32(a, pCds->szCompressed); + zipfileWrite32(a, pCds->szUncompressed); + zipfileWrite16(a, (u16)pCds->nFile); + zipfileWrite16(a, pCds->nExtra); + assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] ); + + /* Add the file name */ + memcpy(a, pCds->zFile, (int)pCds->nFile); + a += (int)pCds->nFile; + + /* The "extra" data */ + zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP); + zipfileWrite16(a, 5); + *a++ = 0x01; + zipfileWrite32(a, pEntry->mUnixTime); + + return a-aBuf; +} + +static int zipfileAppendEntry( + ZipfileTab *pTab, + ZipfileEntry *pEntry, + const u8 *pData, + int nData +){ + u8 *aBuf = pTab->aBuffer; + int nBuf; + int rc; + + nBuf = zipfileSerializeLFH(pEntry, aBuf); + rc = zipfileAppendData(pTab, aBuf, nBuf); + if( rc==SQLITE_OK ){ + pEntry->iDataOff = pTab->szCurrent; + rc = zipfileAppendData(pTab, pData, nData); + } + + return rc; +} + +static int zipfileGetMode( + sqlite3_value *pVal, + int bIsDir, /* If true, default to directory */ + u32 *pMode, /* OUT: Mode value */ + char **pzErr /* OUT: Error message */ +){ + const char *z = (const char*)sqlite3_value_text(pVal); + u32 mode = 0; + if( z==0 ){ + mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644)); + }else if( z[0]>='0' && z[0]<='9' ){ + mode = (unsigned int)sqlite3_value_int(pVal); + }else{ + const char zTemplate[11] = "-rwxrwxrwx"; + int i; + if( strlen(z)!=10 ) goto parse_error; + switch( z[0] ){ + case '-': mode |= S_IFREG; break; + case 'd': mode |= S_IFDIR; break; + case 'l': mode |= S_IFLNK; break; + default: goto parse_error; + } + for(i=1; i<10; i++){ + if( z[i]==zTemplate[i] ) mode |= 1 << (9-i); + else if( z[i]!='-' ) goto parse_error; + } + } + if( ((mode & S_IFDIR)==0)==bIsDir ){ + /* The "mode" attribute is a directory, but data has been specified. + ** Or vice-versa - no data but "mode" is a file or symlink. */ + *pzErr = sqlite3_mprintf("zipfile: mode does not match data"); + return SQLITE_CONSTRAINT; + } + *pMode = mode; + return SQLITE_OK; + + parse_error: + *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z); + return SQLITE_ERROR; +} + +/* +** Both (const char*) arguments point to nul-terminated strings. Argument +** nB is the value of strlen(zB). This function returns 0 if the strings are +** identical, ignoring any trailing '/' character in either path. */ +static int zipfileComparePath(const char *zA, const char *zB, int nB){ + int nA = (int)strlen(zA); + if( nA>0 && zA[nA-1]=='/' ) nA--; + if( nB>0 && zB[nB-1]=='/' ) nB--; + if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0; + return 1; +} + +static int zipfileBegin(sqlite3_vtab *pVtab){ + ZipfileTab *pTab = (ZipfileTab*)pVtab; + int rc = SQLITE_OK; + + assert( pTab->pWriteFd==0 ); + if( pTab->zFile==0 || pTab->zFile[0]==0 ){ + pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename"); + return SQLITE_ERROR; + } + + /* Open a write fd on the file. Also load the entire central directory + ** structure into memory. During the transaction any new file data is + ** appended to the archive file, but the central directory is accumulated + ** in main-memory until the transaction is committed. */ + pTab->pWriteFd = fopen(pTab->zFile, "ab+"); + if( pTab->pWriteFd==0 ){ + pTab->base.zErrMsg = sqlite3_mprintf( + "zipfile: failed to open file %s for writing", pTab->zFile + ); + rc = SQLITE_ERROR; + }else{ + fseek(pTab->pWriteFd, 0, SEEK_END); + pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd); + rc = zipfileLoadDirectory(pTab, 0, 0); + } + + if( rc!=SQLITE_OK ){ + zipfileCleanupTransaction(pTab); + } + + return rc; +} + +/* +** Return the current time as a 32-bit timestamp in UNIX epoch format (like +** time(2)). +*/ +static u32 zipfileTime(void){ + sqlite3_vfs *pVfs = sqlite3_vfs_find(0); + u32 ret; + if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ + i64 ms; + pVfs->xCurrentTimeInt64(pVfs, &ms); + ret = (u32)((ms/1000) - ((i64)24405875 * 8640)); + }else{ + double day; + pVfs->xCurrentTime(pVfs, &day); + ret = (u32)((day - 2440587.5) * 86400); + } + return ret; +} + +/* +** Return a 32-bit timestamp in UNIX epoch format. +** +** If the value passed as the only argument is either NULL or an SQL NULL, +** return the current time. Otherwise, return the value stored in (*pVal) +** cast to a 32-bit unsigned integer. +*/ +static u32 zipfileGetTime(sqlite3_value *pVal){ + if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){ + return zipfileTime(); + } + return (u32)sqlite3_value_int64(pVal); +} + +/* +** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry +** linked list. Remove it from the list and free the object. +*/ +static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){ + if( pOld ){ + ZipfileEntry **pp; + for(pp=&pTab->pFirstEntry; (*pp)!=pOld; pp=&((*pp)->pNext)); + *pp = (*pp)->pNext; + zipfileEntryFree(pOld); + } +} + +/* +** xUpdate method. +*/ +static int zipfileUpdate( + sqlite3_vtab *pVtab, + int nVal, + sqlite3_value **apVal, + sqlite_int64 *pRowid +){ + ZipfileTab *pTab = (ZipfileTab*)pVtab; + int rc = SQLITE_OK; /* Return Code */ + ZipfileEntry *pNew = 0; /* New in-memory CDS entry */ + + u32 mode = 0; /* Mode for new entry */ + u32 mTime = 0; /* Modification time for new entry */ + i64 sz = 0; /* Uncompressed size */ + const char *zPath = 0; /* Path for new entry */ + int nPath = 0; /* strlen(zPath) */ + const u8 *pData = 0; /* Pointer to buffer containing content */ + int nData = 0; /* Size of pData buffer in bytes */ + int iMethod = 0; /* Compression method for new entry */ + u8 *pFree = 0; /* Free this */ + char *zFree = 0; /* Also free this */ + ZipfileEntry *pOld = 0; + ZipfileEntry *pOld2 = 0; + int bUpdate = 0; /* True for an update that modifies "name" */ + int bIsDir = 0; + u32 iCrc32 = 0; + + if( pTab->pWriteFd==0 ){ + rc = zipfileBegin(pVtab); + if( rc!=SQLITE_OK ) return rc; + } + + /* If this is a DELETE or UPDATE, find the archive entry to delete. */ + if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ + const char *zDelete = (const char*)sqlite3_value_text(apVal[0]); + int nDelete = (int)strlen(zDelete); + if( nVal>1 ){ + const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]); + if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){ + bUpdate = 1; + } + } + for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){ + if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){ + break; + } + assert( pOld->pNext ); + } + } + + if( nVal>1 ){ + /* Check that "sz" and "rawdata" are both NULL: */ + if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){ + zipfileTableErr(pTab, "sz must be NULL"); + rc = SQLITE_CONSTRAINT; + } + if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){ + zipfileTableErr(pTab, "rawdata must be NULL"); + rc = SQLITE_CONSTRAINT; + } + + if( rc==SQLITE_OK ){ + if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){ + /* data=NULL. A directory */ + bIsDir = 1; + }else{ + /* Value specified for "data", and possibly "method". This must be + ** a regular file or a symlink. */ + const u8 *aIn = sqlite3_value_blob(apVal[7]); + int nIn = sqlite3_value_bytes(apVal[7]); + int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL; + + iMethod = sqlite3_value_int(apVal[8]); + sz = nIn; + pData = aIn; + nData = nIn; + if( iMethod!=0 && iMethod!=8 ){ + zipfileTableErr(pTab, "unknown compression method: %d", iMethod); + rc = SQLITE_CONSTRAINT; + }else{ + if( bAuto || iMethod ){ + int nCmp; + rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg); + if( rc==SQLITE_OK ){ + if( iMethod || nCmpbase.zErrMsg); + } + + if( rc==SQLITE_OK ){ + zPath = (const char*)sqlite3_value_text(apVal[2]); + if( zPath==0 ) zPath = ""; + nPath = (int)strlen(zPath); + mTime = zipfileGetTime(apVal[4]); + } + + if( rc==SQLITE_OK && bIsDir ){ + /* For a directory, check that the last character in the path is a + ** '/'. This appears to be required for compatibility with info-zip + ** (the unzip command on unix). It does not create directories + ** otherwise. */ + if( nPath<=0 || zPath[nPath-1]!='/' ){ + zFree = sqlite3_mprintf("%s/", zPath); + zPath = (const char*)zFree; + if( zFree==0 ){ + rc = SQLITE_NOMEM; + nPath = 0; + }else{ + nPath = (int)strlen(zPath); + } + } + } + + /* Check that we're not inserting a duplicate entry -OR- updating an + ** entry with a path, thereby making it into a duplicate. */ + if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){ + ZipfileEntry *p; + for(p=pTab->pFirstEntry; p; p=p->pNext){ + if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){ + switch( sqlite3_vtab_on_conflict(pTab->db) ){ + case SQLITE_IGNORE: { + goto zipfile_update_done; + } + case SQLITE_REPLACE: { + pOld2 = p; + break; + } + default: { + zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath); + rc = SQLITE_CONSTRAINT; + break; + } + } + break; + } + } + } + + if( rc==SQLITE_OK ){ + /* Create the new CDS record. */ + pNew = zipfileNewEntry(zPath); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; + pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; + pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS; + pNew->cds.iCompression = (u16)iMethod; + zipfileMtimeToDos(&pNew->cds, mTime); + pNew->cds.crc32 = iCrc32; + pNew->cds.szCompressed = nData; + pNew->cds.szUncompressed = (u32)sz; + pNew->cds.iExternalAttr = (mode<<16); + pNew->cds.iOffset = (u32)pTab->szCurrent; + pNew->cds.nFile = (u16)nPath; + pNew->mUnixTime = (u32)mTime; + rc = zipfileAppendEntry(pTab, pNew, pData, nData); + zipfileAddEntry(pTab, pOld, pNew); + } + } + } + + if( rc==SQLITE_OK && (pOld || pOld2) ){ + ZipfileCsr *pCsr; + for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){ + if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){ + pCsr->pCurrent = pCsr->pCurrent->pNext; + pCsr->bNoop = 1; + } + } + + zipfileRemoveEntryFromList(pTab, pOld); + zipfileRemoveEntryFromList(pTab, pOld2); + } + +zipfile_update_done: + sqlite3_free(pFree); + sqlite3_free(zFree); + return rc; +} + +static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){ + u8 *a = aBuf; + zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD); + zipfileWrite16(a, p->iDisk); + zipfileWrite16(a, p->iFirstDisk); + zipfileWrite16(a, p->nEntry); + zipfileWrite16(a, p->nEntryTotal); + zipfileWrite32(a, p->nSize); + zipfileWrite32(a, p->iOffset); + zipfileWrite16(a, 0); /* Size of trailing comment in bytes*/ + + return a-aBuf; +} + +static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){ + int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer); + assert( nBuf==ZIPFILE_EOCD_FIXED_SZ ); + return zipfileAppendData(pTab, pTab->aBuffer, nBuf); +} + +/* +** Serialize the CDS structure into buffer aBuf[]. Return the number +** of bytes written. +*/ +static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){ + u8 *a = aBuf; + ZipfileCDS *pCDS = &pEntry->cds; + + if( pEntry->aExtra==0 ){ + pCDS->nExtra = 9; + } + + zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS); + zipfileWrite16(a, pCDS->iVersionMadeBy); + zipfileWrite16(a, pCDS->iVersionExtract); + zipfileWrite16(a, pCDS->flags); + zipfileWrite16(a, pCDS->iCompression); + zipfileWrite16(a, pCDS->mTime); + zipfileWrite16(a, pCDS->mDate); + zipfileWrite32(a, pCDS->crc32); + zipfileWrite32(a, pCDS->szCompressed); + zipfileWrite32(a, pCDS->szUncompressed); + assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] ); + zipfileWrite16(a, pCDS->nFile); + zipfileWrite16(a, pCDS->nExtra); + zipfileWrite16(a, pCDS->nComment); + zipfileWrite16(a, pCDS->iDiskStart); + zipfileWrite16(a, pCDS->iInternalAttr); + zipfileWrite32(a, pCDS->iExternalAttr); + zipfileWrite32(a, pCDS->iOffset); + + memcpy(a, pCDS->zFile, pCDS->nFile); + a += pCDS->nFile; + + if( pEntry->aExtra ){ + int n = (int)pCDS->nExtra + (int)pCDS->nComment; + memcpy(a, pEntry->aExtra, n); + a += n; + }else{ + assert( pCDS->nExtra==9 ); + zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP); + zipfileWrite16(a, 5); + *a++ = 0x01; + zipfileWrite32(a, pEntry->mUnixTime); + } + + return a-aBuf; +} + +static int zipfileCommit(sqlite3_vtab *pVtab){ + ZipfileTab *pTab = (ZipfileTab*)pVtab; + int rc = SQLITE_OK; + if( pTab->pWriteFd ){ + i64 iOffset = pTab->szCurrent; + ZipfileEntry *p; + ZipfileEOCD eocd; + int nEntry = 0; + + /* Write out all entries */ + for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){ + int n = zipfileSerializeCDS(p, pTab->aBuffer); + rc = zipfileAppendData(pTab, pTab->aBuffer, n); + nEntry++; + } + + /* Write out the EOCD record */ + eocd.iDisk = 0; + eocd.iFirstDisk = 0; + eocd.nEntry = (u16)nEntry; + eocd.nEntryTotal = (u16)nEntry; + eocd.nSize = (u32)(pTab->szCurrent - iOffset); + eocd.iOffset = (u32)iOffset; + rc = zipfileAppendEOCD(pTab, &eocd); + + zipfileCleanupTransaction(pTab); + } + return rc; +} + +static int zipfileRollback(sqlite3_vtab *pVtab){ + return zipfileCommit(pVtab); +} + +static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){ + ZipfileCsr *pCsr; + for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){ + if( iId==pCsr->iId ) break; + } + return pCsr; +} + +static void zipfileFunctionCds( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + ZipfileCsr *pCsr; + ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context); + assert( argc>0 ); + + pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0])); + if( pCsr ){ + ZipfileCDS *p = &pCsr->pCurrent->cds; + char *zRes = sqlite3_mprintf("{" + "\"version-made-by\" : %u, " + "\"version-to-extract\" : %u, " + "\"flags\" : %u, " + "\"compression\" : %u, " + "\"time\" : %u, " + "\"date\" : %u, " + "\"crc32\" : %u, " + "\"compressed-size\" : %u, " + "\"uncompressed-size\" : %u, " + "\"file-name-length\" : %u, " + "\"extra-field-length\" : %u, " + "\"file-comment-length\" : %u, " + "\"disk-number-start\" : %u, " + "\"internal-attr\" : %u, " + "\"external-attr\" : %u, " + "\"offset\" : %u }", + (u32)p->iVersionMadeBy, (u32)p->iVersionExtract, + (u32)p->flags, (u32)p->iCompression, + (u32)p->mTime, (u32)p->mDate, + (u32)p->crc32, (u32)p->szCompressed, + (u32)p->szUncompressed, (u32)p->nFile, + (u32)p->nExtra, (u32)p->nComment, + (u32)p->iDiskStart, (u32)p->iInternalAttr, + (u32)p->iExternalAttr, (u32)p->iOffset + ); + + if( zRes==0 ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); + sqlite3_free(zRes); + } + } +} + +/* +** xFindFunction method. +*/ +static int zipfileFindFunction( + sqlite3_vtab *pVtab, /* Virtual table handle */ + int nArg, /* Number of SQL function arguments */ + const char *zName, /* Name of SQL function */ + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ + void **ppArg /* OUT: User data for *pxFunc */ +){ + if( sqlite3_stricmp("zipfile_cds", zName)==0 ){ + *pxFunc = zipfileFunctionCds; + *ppArg = (void*)pVtab; + return 1; + } + return 0; +} + +typedef struct ZipfileBuffer ZipfileBuffer; +struct ZipfileBuffer { + u8 *a; /* Pointer to buffer */ + int n; /* Size of buffer in bytes */ + int nAlloc; /* Byte allocated at a[] */ +}; + +typedef struct ZipfileCtx ZipfileCtx; +struct ZipfileCtx { + int nEntry; + ZipfileBuffer body; + ZipfileBuffer cds; +}; + +static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){ + if( pBuf->n+nByte>pBuf->nAlloc ){ + u8 *aNew; + sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512; + int nReq = pBuf->n + nByte; + + while( nNewa, nNew); + if( aNew==0 ) return SQLITE_NOMEM; + pBuf->a = aNew; + pBuf->nAlloc = (int)nNew; + } + return SQLITE_OK; +} + +/* +** xStep() callback for the zipfile() aggregate. This can be called in +** any of the following ways: +** +** SELECT zipfile(name,data) ... +** SELECT zipfile(name,mode,mtime,data) ... +** SELECT zipfile(name,mode,mtime,data,method) ... +*/ +void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){ + ZipfileCtx *p; /* Aggregate function context */ + ZipfileEntry e; /* New entry to add to zip archive */ + + sqlite3_value *pName = 0; + sqlite3_value *pMode = 0; + sqlite3_value *pMtime = 0; + sqlite3_value *pData = 0; + sqlite3_value *pMethod = 0; + + int bIsDir = 0; + u32 mode; + int rc = SQLITE_OK; + char *zErr = 0; + + int iMethod = -1; /* Compression method to use (0 or 8) */ + + const u8 *aData = 0; /* Possibly compressed data for new entry */ + int nData = 0; /* Size of aData[] in bytes */ + int szUncompressed = 0; /* Size of data before compression */ + u8 *aFree = 0; /* Free this before returning */ + u32 iCrc32 = 0; /* crc32 of uncompressed data */ + + char *zName = 0; /* Path (name) of new entry */ + int nName = 0; /* Size of zName in bytes */ + char *zFree = 0; /* Free this before returning */ + int nByte; + + memset(&e, 0, sizeof(e)); + p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); + if( p==0 ) return; + + /* Martial the arguments into stack variables */ + if( nVal!=2 && nVal!=4 && nVal!=5 ){ + zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()"); + rc = SQLITE_ERROR; + goto zipfile_step_out; + } + pName = apVal[0]; + if( nVal==2 ){ + pData = apVal[1]; + }else{ + pMode = apVal[1]; + pMtime = apVal[2]; + pData = apVal[3]; + if( nVal==5 ){ + pMethod = apVal[4]; + } + } + + /* Check that the 'name' parameter looks ok. */ + zName = (char*)sqlite3_value_text(pName); + nName = sqlite3_value_bytes(pName); + if( zName==0 ){ + zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL"); + rc = SQLITE_ERROR; + goto zipfile_step_out; + } + + /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use + ** deflate compression) or NULL (choose automatically). */ + if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){ + iMethod = (int)sqlite3_value_int64(pMethod); + if( iMethod!=0 && iMethod!=8 ){ + zErr = sqlite3_mprintf("illegal method value: %d", iMethod); + rc = SQLITE_ERROR; + goto zipfile_step_out; + } + } + + /* Now inspect the data. If this is NULL, then the new entry must be a + ** directory. Otherwise, figure out whether or not the data should + ** be deflated or simply stored in the zip archive. */ + if( sqlite3_value_type(pData)==SQLITE_NULL ){ + bIsDir = 1; + iMethod = 0; + }else{ + aData = sqlite3_value_blob(pData); + szUncompressed = nData = sqlite3_value_bytes(pData); + iCrc32 = crc32(0, aData, nData); + if( iMethod<0 || iMethod==8 ){ + int nOut = 0; + rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr); + if( rc!=SQLITE_OK ){ + goto zipfile_step_out; + } + if( iMethod==8 || nOut0 && zName[nName-1]=='/' ){ + zErr = sqlite3_mprintf("non-directory name must not end with /"); + rc = SQLITE_ERROR; + goto zipfile_step_out; + } + }else{ + if( nName==0 || zName[nName-1]!='/' ){ + zName = zFree = sqlite3_mprintf("%s/", zName); + if( zName==0 ){ + rc = SQLITE_NOMEM; + goto zipfile_step_out; + } + nName = (int)strlen(zName); + }else{ + while( nName>1 && zName[nName-2]=='/' ) nName--; + } + } + + /* Assemble the ZipfileEntry object for the new zip archive entry */ + e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; + e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; + e.cds.flags = ZIPFILE_NEWENTRY_FLAGS; + e.cds.iCompression = (u16)iMethod; + zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime); + e.cds.crc32 = iCrc32; + e.cds.szCompressed = nData; + e.cds.szUncompressed = szUncompressed; + e.cds.iExternalAttr = (mode<<16); + e.cds.iOffset = p->body.n; + e.cds.nFile = (u16)nName; + e.cds.zFile = zName; + + /* Append the LFH to the body of the new archive */ + nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9; + if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out; + p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]); + + /* Append the data to the body of the new archive */ + if( nData>0 ){ + if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out; + memcpy(&p->body.a[p->body.n], aData, nData); + p->body.n += nData; + } + + /* Append the CDS record to the directory of the new archive */ + nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9; + if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out; + p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]); + + /* Increment the count of entries in the archive */ + p->nEntry++; + + zipfile_step_out: + sqlite3_free(aFree); + sqlite3_free(zFree); + if( rc ){ + if( zErr ){ + sqlite3_result_error(pCtx, zErr, -1); + }else{ + sqlite3_result_error_code(pCtx, rc); + } + } + sqlite3_free(zErr); +} + +/* +** xFinalize() callback for zipfile aggregate function. +*/ +void zipfileFinal(sqlite3_context *pCtx){ + ZipfileCtx *p; + ZipfileEOCD eocd; + sqlite3_int64 nZip; + u8 *aZip; + + p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); + if( p==0 ) return; + if( p->nEntry>0 ){ + memset(&eocd, 0, sizeof(eocd)); + eocd.nEntry = (u16)p->nEntry; + eocd.nEntryTotal = (u16)p->nEntry; + eocd.nSize = p->cds.n; + eocd.iOffset = p->body.n; + + nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ; + aZip = (u8*)sqlite3_malloc64(nZip); + if( aZip==0 ){ + sqlite3_result_error_nomem(pCtx); + }else{ + memcpy(aZip, p->body.a, p->body.n); + memcpy(&aZip[p->body.n], p->cds.a, p->cds.n); + zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]); + sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree); + } + } + + sqlite3_free(p->body.a); + sqlite3_free(p->cds.a); +} + + +/* +** Register the "zipfile" virtual table. +*/ +static int zipfileRegister(sqlite3 *db){ + static sqlite3_module zipfileModule = { + 1, /* iVersion */ + zipfileConnect, /* xCreate */ + zipfileConnect, /* xConnect */ + zipfileBestIndex, /* xBestIndex */ + zipfileDisconnect, /* xDisconnect */ + zipfileDisconnect, /* xDestroy */ + zipfileOpen, /* xOpen - open a cursor */ + zipfileClose, /* xClose - close a cursor */ + zipfileFilter, /* xFilter - configure scan constraints */ + zipfileNext, /* xNext - advance a cursor */ + zipfileEof, /* xEof - check for end of scan */ + zipfileColumn, /* xColumn - read data */ + 0, /* xRowid - read data */ + zipfileUpdate, /* xUpdate */ + zipfileBegin, /* xBegin */ + 0, /* xSync */ + zipfileCommit, /* xCommit */ + zipfileRollback, /* xRollback */ + zipfileFindFunction, /* xFindMethod */ + 0, /* xRename */ + }; + + int rc = sqlite3_create_module(db, "zipfile" , &zipfileModule, 0); + if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0, + zipfileStep, zipfileFinal + ); + } + return rc; +} +#else /* SQLITE_OMIT_VIRTUALTABLE */ +# define zipfileRegister(x) SQLITE_OK +#endif + +#ifdef _WIN32 + +#endif +int sqlite3_zipfile_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + return zipfileRegister(db); +} + +/************************* End ../ext/misc/zipfile.c ********************/ +/************************* Begin ../ext/misc/sqlar.c ******************/ +/* +** 2017-12-17 +** +** 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. +** +****************************************************************************** +** +** Utility functions sqlar_compress() and sqlar_uncompress(). Useful +** for working with sqlar archives and used by the shell tool's built-in +** sqlar support. +*/ +/* #include "sqlite3ext.h" */ +SQLITE_EXTENSION_INIT1 +#include +#include + +/* +** Implementation of the "sqlar_compress(X)" SQL function. +** +** If the type of X is SQLITE_BLOB, and compressing that blob using +** zlib utility function compress() yields a smaller blob, return the +** compressed blob. Otherwise, return a copy of X. +** +** SQLar uses the "zlib format" for compressed content. The zlib format +** contains a two-byte identification header and a four-byte checksum at +** the end. This is different from ZIP which uses the raw deflate format. +** +** Future enhancements to SQLar might add support for new compression formats. +** If so, those new formats will be identified by alternative headers in the +** compressed data. +*/ +static void sqlarCompressFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + assert( argc==1 ); + if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ + const Bytef *pData = sqlite3_value_blob(argv[0]); + uLong nData = sqlite3_value_bytes(argv[0]); + uLongf nOut = compressBound(nData); + Bytef *pOut; + + pOut = (Bytef*)sqlite3_malloc(nOut); + if( pOut==0 ){ + sqlite3_result_error_nomem(context); + return; + }else{ + if( Z_OK!=compress(pOut, &nOut, pData, nData) ){ + sqlite3_result_error(context, "error in compress()", -1); + }else if( nOut +#include +#include + +#ifndef SQLITE_OMIT_VIRTUALTABLE + +/* typedef sqlite3_int64 i64; */ +/* typedef sqlite3_uint64 u64; */ + +typedef struct IdxColumn IdxColumn; +typedef struct IdxConstraint IdxConstraint; +typedef struct IdxScan IdxScan; +typedef struct IdxStatement IdxStatement; +typedef struct IdxTable IdxTable; +typedef struct IdxWrite IdxWrite; + +#define STRLEN (int)strlen + +/* +** A temp table name that we assume no user database will actually use. +** If this assumption proves incorrect triggers on the table with the +** conflicting name will be ignored. +*/ +#define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776" + +/* +** A single constraint. Equivalent to either "col = ?" or "col < ?" (or +** any other type of single-ended range constraint on a column). +** +** pLink: +** Used to temporarily link IdxConstraint objects into lists while +** creating candidate indexes. +*/ +struct IdxConstraint { + char *zColl; /* Collation sequence */ + int bRange; /* True for range, false for eq */ + int iCol; /* Constrained table column */ + int bFlag; /* Used by idxFindCompatible() */ + int bDesc; /* True if ORDER BY DESC */ + IdxConstraint *pNext; /* Next constraint in pEq or pRange list */ + IdxConstraint *pLink; /* See above */ +}; + +/* +** A single scan of a single table. +*/ +struct IdxScan { + IdxTable *pTab; /* Associated table object */ + int iDb; /* Database containing table zTable */ + i64 covering; /* Mask of columns required for cov. index */ + IdxConstraint *pOrder; /* ORDER BY columns */ + IdxConstraint *pEq; /* List of == constraints */ + IdxConstraint *pRange; /* List of < constraints */ + IdxScan *pNextScan; /* Next IdxScan object for same analysis */ +}; + +/* +** Information regarding a single database table. Extracted from +** "PRAGMA table_info" by function idxGetTableInfo(). +*/ +struct IdxColumn { + char *zName; + char *zColl; + int iPk; +}; +struct IdxTable { + int nCol; + char *zName; /* Table name */ + IdxColumn *aCol; + IdxTable *pNext; /* Next table in linked list of all tables */ +}; + +/* +** An object of the following type is created for each unique table/write-op +** seen. The objects are stored in a singly-linked list beginning at +** sqlite3expert.pWrite. +*/ +struct IdxWrite { + IdxTable *pTab; + int eOp; /* SQLITE_UPDATE, DELETE or INSERT */ + IdxWrite *pNext; +}; + +/* +** Each statement being analyzed is represented by an instance of this +** structure. +*/ +struct IdxStatement { + int iId; /* Statement number */ + char *zSql; /* SQL statement */ + char *zIdx; /* Indexes */ + char *zEQP; /* Plan */ + IdxStatement *pNext; +}; + + +/* +** A hash table for storing strings. With space for a payload string +** with each entry. Methods are: +** +** idxHashInit() +** idxHashClear() +** idxHashAdd() +** idxHashSearch() +*/ +#define IDX_HASH_SIZE 1023 +typedef struct IdxHashEntry IdxHashEntry; +typedef struct IdxHash IdxHash; +struct IdxHashEntry { + char *zKey; /* nul-terminated key */ + char *zVal; /* nul-terminated value string */ + char *zVal2; /* nul-terminated value string 2 */ + IdxHashEntry *pHashNext; /* Next entry in same hash bucket */ + IdxHashEntry *pNext; /* Next entry in hash */ +}; +struct IdxHash { + IdxHashEntry *pFirst; + IdxHashEntry *aHash[IDX_HASH_SIZE]; +}; + +/* +** sqlite3expert object. +*/ +struct sqlite3expert { + int iSample; /* Percentage of tables to sample for stat1 */ + sqlite3 *db; /* User database */ + sqlite3 *dbm; /* In-memory db for this analysis */ + sqlite3 *dbv; /* Vtab schema for this analysis */ + IdxTable *pTable; /* List of all IdxTable objects */ + IdxScan *pScan; /* List of scan objects */ + IdxWrite *pWrite; /* List of write objects */ + IdxStatement *pStatement; /* List of IdxStatement objects */ + int bRun; /* True once analysis has run */ + char **pzErrmsg; + int rc; /* Error code from whereinfo hook */ + IdxHash hIdx; /* Hash containing all candidate indexes */ + char *zCandidates; /* For EXPERT_REPORT_CANDIDATES */ +}; + + +/* +** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc(). +** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL. +*/ +static void *idxMalloc(int *pRc, int nByte){ + void *pRet; + assert( *pRc==SQLITE_OK ); + assert( nByte>0 ); + pRet = sqlite3_malloc(nByte); + if( pRet ){ + memset(pRet, 0, nByte); + }else{ + *pRc = SQLITE_NOMEM; + } + return pRet; +} + +/* +** Initialize an IdxHash hash table. +*/ +static void idxHashInit(IdxHash *pHash){ + memset(pHash, 0, sizeof(IdxHash)); +} + +/* +** Reset an IdxHash hash table. +*/ +static void idxHashClear(IdxHash *pHash){ + int i; + for(i=0; iaHash[i]; pEntry; pEntry=pNext){ + pNext = pEntry->pHashNext; + sqlite3_free(pEntry->zVal2); + sqlite3_free(pEntry); + } + } + memset(pHash, 0, sizeof(IdxHash)); +} + +/* +** Return the index of the hash bucket that the string specified by the +** arguments to this function belongs. +*/ +static int idxHashString(const char *z, int n){ + unsigned int ret = 0; + int i; + for(i=0; i=0 ); + for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ + if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ + return 1; + } + } + pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1); + if( pEntry ){ + pEntry->zKey = (char*)&pEntry[1]; + memcpy(pEntry->zKey, zKey, nKey); + if( zVal ){ + pEntry->zVal = &pEntry->zKey[nKey+1]; + memcpy(pEntry->zVal, zVal, nVal); + } + pEntry->pHashNext = pHash->aHash[iHash]; + pHash->aHash[iHash] = pEntry; + + pEntry->pNext = pHash->pFirst; + pHash->pFirst = pEntry; + } + return 0; +} + +/* +** If zKey/nKey is present in the hash table, return a pointer to the +** hash-entry object. +*/ +static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){ + int iHash; + IdxHashEntry *pEntry; + if( nKey<0 ) nKey = STRLEN(zKey); + iHash = idxHashString(zKey, nKey); + assert( iHash>=0 ); + for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ + if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ + return pEntry; + } + } + return 0; +} + +/* +** If the hash table contains an entry with a key equal to the string +** passed as the final two arguments to this function, return a pointer +** to the payload string. Otherwise, if zKey/nKey is not present in the +** hash table, return NULL. +*/ +static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){ + IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey); + if( pEntry ) return pEntry->zVal; + return 0; +} + +/* +** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl +** variable to point to a copy of nul-terminated string zColl. +*/ +static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){ + IdxConstraint *pNew; + int nColl = STRLEN(zColl); + + assert( *pRc==SQLITE_OK ); + pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1); + if( pNew ){ + pNew->zColl = (char*)&pNew[1]; + memcpy(pNew->zColl, zColl, nColl+1); + } + return pNew; +} + +/* +** An error associated with database handle db has just occurred. Pass +** the error message to callback function xOut. +*/ +static void idxDatabaseError( + sqlite3 *db, /* Database handle */ + char **pzErrmsg /* Write error here */ +){ + *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); +} + +/* +** Prepare an SQL statement. +*/ +static int idxPrepareStmt( + sqlite3 *db, /* Database handle to compile against */ + sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ + char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ + const char *zSql /* SQL statement to compile */ +){ + int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); + if( rc!=SQLITE_OK ){ + *ppStmt = 0; + idxDatabaseError(db, pzErrmsg); + } + return rc; +} + +/* +** Prepare an SQL statement using the results of a printf() formatting. +*/ +static int idxPrintfPrepareStmt( + sqlite3 *db, /* Database handle to compile against */ + sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ + char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ + const char *zFmt, /* printf() format of SQL statement */ + ... /* Trailing printf() arguments */ +){ + va_list ap; + int rc; + char *zSql; + va_start(ap, zFmt); + zSql = sqlite3_vmprintf(zFmt, ap); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql); + sqlite3_free(zSql); + } + va_end(ap); + return rc; +} + + +/************************************************************************* +** Beginning of virtual table implementation. +*/ +typedef struct ExpertVtab ExpertVtab; +struct ExpertVtab { + sqlite3_vtab base; + IdxTable *pTab; + sqlite3expert *pExpert; +}; + +typedef struct ExpertCsr ExpertCsr; +struct ExpertCsr { + sqlite3_vtab_cursor base; + sqlite3_stmt *pData; +}; + +static char *expertDequote(const char *zIn){ + int n = STRLEN(zIn); + char *zRet = sqlite3_malloc(n); + + assert( zIn[0]=='\'' ); + assert( zIn[n-1]=='\'' ); + + if( zRet ){ + int iOut = 0; + int iIn = 0; + for(iIn=1; iIn<(n-1); iIn++){ + if( zIn[iIn]=='\'' ){ + assert( zIn[iIn+1]=='\'' ); + iIn++; + } + zRet[iOut++] = zIn[iIn]; + } + zRet[iOut] = '\0'; + } + + return zRet; +} + +/* +** This function is the implementation of both the xConnect and xCreate +** methods of the r-tree virtual table. +** +** argv[0] -> module name +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> column names... +*/ +static int expertConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + sqlite3expert *pExpert = (sqlite3expert*)pAux; + ExpertVtab *p = 0; + int rc; + + if( argc!=4 ){ + *pzErr = sqlite3_mprintf("internal error!"); + rc = SQLITE_ERROR; + }else{ + char *zCreateTable = expertDequote(argv[3]); + if( zCreateTable ){ + rc = sqlite3_declare_vtab(db, zCreateTable); + if( rc==SQLITE_OK ){ + p = idxMalloc(&rc, sizeof(ExpertVtab)); + } + if( rc==SQLITE_OK ){ + p->pExpert = pExpert; + p->pTab = pExpert->pTable; + assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 ); + } + sqlite3_free(zCreateTable); + }else{ + rc = SQLITE_NOMEM; + } + } + + *ppVtab = (sqlite3_vtab*)p; + return rc; +} + +static int expertDisconnect(sqlite3_vtab *pVtab){ + ExpertVtab *p = (ExpertVtab*)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){ + ExpertVtab *p = (ExpertVtab*)pVtab; + int rc = SQLITE_OK; + int n = 0; + IdxScan *pScan; + const int opmask = + SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT | + SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE | + SQLITE_INDEX_CONSTRAINT_LE; + + pScan = idxMalloc(&rc, sizeof(IdxScan)); + if( pScan ){ + int i; + + /* Link the new scan object into the list */ + pScan->pTab = p->pTab; + pScan->pNextScan = p->pExpert->pScan; + p->pExpert->pScan = pScan; + + /* Add the constraints to the IdxScan object */ + for(i=0; inConstraint; i++){ + struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; + if( pCons->usable + && pCons->iColumn>=0 + && p->pTab->aCol[pCons->iColumn].iPk==0 + && (pCons->op & opmask) + ){ + IdxConstraint *pNew; + const char *zColl = sqlite3_vtab_collation(pIdxInfo, i); + pNew = idxNewConstraint(&rc, zColl); + if( pNew ){ + pNew->iCol = pCons->iColumn; + if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + pNew->pNext = pScan->pEq; + pScan->pEq = pNew; + }else{ + pNew->bRange = 1; + pNew->pNext = pScan->pRange; + pScan->pRange = pNew; + } + } + n++; + pIdxInfo->aConstraintUsage[i].argvIndex = n; + } + } + + /* Add the ORDER BY to the IdxScan object */ + for(i=pIdxInfo->nOrderBy-1; i>=0; i--){ + int iCol = pIdxInfo->aOrderBy[i].iColumn; + if( iCol>=0 ){ + IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl); + if( pNew ){ + pNew->iCol = iCol; + pNew->bDesc = pIdxInfo->aOrderBy[i].desc; + pNew->pNext = pScan->pOrder; + pNew->pLink = pScan->pOrder; + pScan->pOrder = pNew; + n++; + } + } + } + } + + pIdxInfo->estimatedCost = 1000000.0 / (n+1); + return rc; +} + +static int expertUpdate( + sqlite3_vtab *pVtab, + int nData, + sqlite3_value **azData, + sqlite_int64 *pRowid +){ + (void)pVtab; + (void)nData; + (void)azData; + (void)pRowid; + return SQLITE_OK; +} + +/* +** Virtual table module xOpen method. +*/ +static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + int rc = SQLITE_OK; + ExpertCsr *pCsr; + (void)pVTab; + pCsr = idxMalloc(&rc, sizeof(ExpertCsr)); + *ppCursor = (sqlite3_vtab_cursor*)pCsr; + return rc; +} + +/* +** Virtual table module xClose method. +*/ +static int expertClose(sqlite3_vtab_cursor *cur){ + ExpertCsr *pCsr = (ExpertCsr*)cur; + sqlite3_finalize(pCsr->pData); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Virtual table module xEof method. +** +** Return non-zero if the cursor does not currently point to a valid +** record (i.e if the scan has finished), or zero otherwise. +*/ +static int expertEof(sqlite3_vtab_cursor *cur){ + ExpertCsr *pCsr = (ExpertCsr*)cur; + return pCsr->pData==0; +} + +/* +** Virtual table module xNext method. +*/ +static int expertNext(sqlite3_vtab_cursor *cur){ + ExpertCsr *pCsr = (ExpertCsr*)cur; + int rc = SQLITE_OK; + + assert( pCsr->pData ); + rc = sqlite3_step(pCsr->pData); + if( rc!=SQLITE_ROW ){ + rc = sqlite3_finalize(pCsr->pData); + pCsr->pData = 0; + }else{ + rc = SQLITE_OK; + } + + return rc; +} + +/* +** Virtual table module xRowid method. +*/ +static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + (void)cur; + *pRowid = 0; + return SQLITE_OK; +} + +/* +** Virtual table module xColumn method. +*/ +static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ + ExpertCsr *pCsr = (ExpertCsr*)cur; + sqlite3_value *pVal; + pVal = sqlite3_column_value(pCsr->pData, i); + if( pVal ){ + sqlite3_result_value(ctx, pVal); + } + return SQLITE_OK; +} + +/* +** Virtual table module xFilter method. +*/ +static int expertFilter( + sqlite3_vtab_cursor *cur, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + ExpertCsr *pCsr = (ExpertCsr*)cur; + ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab); + sqlite3expert *pExpert = pVtab->pExpert; + int rc; + + (void)idxNum; + (void)idxStr; + (void)argc; + (void)argv; + rc = sqlite3_finalize(pCsr->pData); + pCsr->pData = 0; + if( rc==SQLITE_OK ){ + rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg, + "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName + ); + } + + if( rc==SQLITE_OK ){ + rc = expertNext(cur); + } + return rc; +} + +static int idxRegisterVtab(sqlite3expert *p){ + static sqlite3_module expertModule = { + 2, /* iVersion */ + expertConnect, /* xCreate - create a table */ + expertConnect, /* xConnect - connect to an existing table */ + expertBestIndex, /* xBestIndex - Determine search strategy */ + expertDisconnect, /* xDisconnect - Disconnect from a table */ + expertDisconnect, /* xDestroy - Drop a table */ + expertOpen, /* xOpen - open a cursor */ + expertClose, /* xClose - close a cursor */ + expertFilter, /* xFilter - configure scan constraints */ + expertNext, /* xNext - advance a cursor */ + expertEof, /* xEof */ + expertColumn, /* xColumn - read data */ + expertRowid, /* xRowid - read data */ + expertUpdate, /* xUpdate - write data */ + 0, /* xBegin - begin transaction */ + 0, /* xSync - sync transaction */ + 0, /* xCommit - commit transaction */ + 0, /* xRollback - rollback transaction */ + 0, /* xFindFunction - function overloading */ + 0, /* xRename - rename the table */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0, /* xShadowName */ + }; + + return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p); +} +/* +** End of virtual table implementation. +*************************************************************************/ +/* +** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function +** is called, set it to the return value of sqlite3_finalize() before +** returning. Otherwise, discard the sqlite3_finalize() return value. +*/ +static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){ + int rc = sqlite3_finalize(pStmt); + if( *pRc==SQLITE_OK ) *pRc = rc; +} + +/* +** Attempt to allocate an IdxTable structure corresponding to table zTab +** in the main database of connection db. If successful, set (*ppOut) to +** point to the new object and return SQLITE_OK. Otherwise, return an +** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be +** set to point to an error string. +** +** It is the responsibility of the caller to eventually free either the +** IdxTable object or error message using sqlite3_free(). +*/ +static int idxGetTableInfo( + sqlite3 *db, /* Database connection to read details from */ + const char *zTab, /* Table name */ + IdxTable **ppOut, /* OUT: New object (if successful) */ + char **pzErrmsg /* OUT: Error message (if not) */ +){ + sqlite3_stmt *p1 = 0; + int nCol = 0; + int nTab = STRLEN(zTab); + int nByte = sizeof(IdxTable) + nTab + 1; + IdxTable *pNew = 0; + int rc, rc2; + char *pCsr = 0; + + rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_info=%Q", zTab); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ + const char *zCol = (const char*)sqlite3_column_text(p1, 1); + nByte += 1 + STRLEN(zCol); + rc = sqlite3_table_column_metadata( + db, "main", zTab, zCol, 0, &zCol, 0, 0, 0 + ); + nByte += 1 + STRLEN(zCol); + nCol++; + } + rc2 = sqlite3_reset(p1); + if( rc==SQLITE_OK ) rc = rc2; + + nByte += sizeof(IdxColumn) * nCol; + if( rc==SQLITE_OK ){ + pNew = idxMalloc(&rc, nByte); + } + if( rc==SQLITE_OK ){ + pNew->aCol = (IdxColumn*)&pNew[1]; + pNew->nCol = nCol; + pCsr = (char*)&pNew->aCol[nCol]; + } + + nCol = 0; + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ + const char *zCol = (const char*)sqlite3_column_text(p1, 1); + int nCopy = STRLEN(zCol) + 1; + pNew->aCol[nCol].zName = pCsr; + pNew->aCol[nCol].iPk = sqlite3_column_int(p1, 5); + memcpy(pCsr, zCol, nCopy); + pCsr += nCopy; + + rc = sqlite3_table_column_metadata( + db, "main", zTab, zCol, 0, &zCol, 0, 0, 0 + ); + if( rc==SQLITE_OK ){ + nCopy = STRLEN(zCol) + 1; + pNew->aCol[nCol].zColl = pCsr; + memcpy(pCsr, zCol, nCopy); + pCsr += nCopy; + } + + nCol++; + } + idxFinalize(&rc, p1); + + if( rc!=SQLITE_OK ){ + sqlite3_free(pNew); + pNew = 0; + }else{ + pNew->zName = pCsr; + memcpy(pNew->zName, zTab, nTab+1); + } + + *ppOut = pNew; + return rc; +} + +/* +** This function is a no-op if *pRc is set to anything other than +** SQLITE_OK when it is called. +** +** If *pRc is initially set to SQLITE_OK, then the text specified by +** the printf() style arguments is appended to zIn and the result returned +** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on +** zIn before returning. +*/ +static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){ + va_list ap; + char *zAppend = 0; + char *zRet = 0; + int nIn = zIn ? STRLEN(zIn) : 0; + int nAppend = 0; + va_start(ap, zFmt); + if( *pRc==SQLITE_OK ){ + zAppend = sqlite3_vmprintf(zFmt, ap); + if( zAppend ){ + nAppend = STRLEN(zAppend); + zRet = (char*)sqlite3_malloc(nIn + nAppend + 1); + } + if( zAppend && zRet ){ + if( nIn ) memcpy(zRet, zIn, nIn); + memcpy(&zRet[nIn], zAppend, nAppend+1); + }else{ + sqlite3_free(zRet); + zRet = 0; + *pRc = SQLITE_NOMEM; + } + sqlite3_free(zAppend); + sqlite3_free(zIn); + } + va_end(ap); + return zRet; +} + +/* +** Return true if zId must be quoted in order to use it as an SQL +** identifier, or false otherwise. +*/ +static int idxIdentifierRequiresQuotes(const char *zId){ + int i; + for(i=0; zId[i]; i++){ + if( !(zId[i]=='_') + && !(zId[i]>='0' && zId[i]<='9') + && !(zId[i]>='a' && zId[i]<='z') + && !(zId[i]>='A' && zId[i]<='Z') + ){ + return 1; + } + } + return 0; +} + +/* +** This function appends an index column definition suitable for constraint +** pCons to the string passed as zIn and returns the result. +*/ +static char *idxAppendColDefn( + int *pRc, /* IN/OUT: Error code */ + char *zIn, /* Column defn accumulated so far */ + IdxTable *pTab, /* Table index will be created on */ + IdxConstraint *pCons +){ + char *zRet = zIn; + IdxColumn *p = &pTab->aCol[pCons->iCol]; + if( zRet ) zRet = idxAppendText(pRc, zRet, ", "); + + if( idxIdentifierRequiresQuotes(p->zName) ){ + zRet = idxAppendText(pRc, zRet, "%Q", p->zName); + }else{ + zRet = idxAppendText(pRc, zRet, "%s", p->zName); + } + + if( sqlite3_stricmp(p->zColl, pCons->zColl) ){ + if( idxIdentifierRequiresQuotes(pCons->zColl) ){ + zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl); + }else{ + zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl); + } + } + + if( pCons->bDesc ){ + zRet = idxAppendText(pRc, zRet, " DESC"); + } + return zRet; +} + +/* +** Search database dbm for an index compatible with the one idxCreateFromCons() +** would create from arguments pScan, pEq and pTail. If no error occurs and +** such an index is found, return non-zero. Or, if no such index is found, +** return zero. +** +** If an error occurs, set *pRc to an SQLite error code and return zero. +*/ +static int idxFindCompatible( + int *pRc, /* OUT: Error code */ + sqlite3* dbm, /* Database to search */ + IdxScan *pScan, /* Scan for table to search for index on */ + IdxConstraint *pEq, /* List of == constraints */ + IdxConstraint *pTail /* List of range constraints */ +){ + const char *zTbl = pScan->pTab->zName; + sqlite3_stmt *pIdxList = 0; + IdxConstraint *pIter; + int nEq = 0; /* Number of elements in pEq */ + int rc; + + /* Count the elements in list pEq */ + for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++; + + rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl); + while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){ + int bMatch = 1; + IdxConstraint *pT = pTail; + sqlite3_stmt *pInfo = 0; + const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1); + + /* Zero the IdxConstraint.bFlag values in the pEq list */ + for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0; + + rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx); + while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){ + int iIdx = sqlite3_column_int(pInfo, 0); + int iCol = sqlite3_column_int(pInfo, 1); + const char *zColl = (const char*)sqlite3_column_text(pInfo, 4); + + if( iIdxpLink){ + if( pIter->bFlag ) continue; + if( pIter->iCol!=iCol ) continue; + if( sqlite3_stricmp(pIter->zColl, zColl) ) continue; + pIter->bFlag = 1; + break; + } + if( pIter==0 ){ + bMatch = 0; + break; + } + }else{ + if( pT ){ + if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){ + bMatch = 0; + break; + } + pT = pT->pLink; + } + } + } + idxFinalize(&rc, pInfo); + + if( rc==SQLITE_OK && bMatch ){ + sqlite3_finalize(pIdxList); + return 1; + } + } + idxFinalize(&rc, pIdxList); + + *pRc = rc; + return 0; +} + +static int idxCreateFromCons( + sqlite3expert *p, + IdxScan *pScan, + IdxConstraint *pEq, + IdxConstraint *pTail +){ + sqlite3 *dbm = p->dbm; + int rc = SQLITE_OK; + if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){ + IdxTable *pTab = pScan->pTab; + char *zCols = 0; + char *zIdx = 0; + IdxConstraint *pCons; + unsigned int h = 0; + const char *zFmt; + + for(pCons=pEq; pCons; pCons=pCons->pLink){ + zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); + } + for(pCons=pTail; pCons; pCons=pCons->pLink){ + zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); + } + + if( rc==SQLITE_OK ){ + /* Hash the list of columns to come up with a name for the index */ + const char *zTable = pScan->pTab->zName; + char *zName; /* Index name */ + int i; + for(i=0; zCols[i]; i++){ + h += ((h<<3) + zCols[i]); + } + zName = sqlite3_mprintf("%s_idx_%08x", zTable, h); + if( zName==0 ){ + rc = SQLITE_NOMEM; + }else{ + if( idxIdentifierRequiresQuotes(zTable) ){ + zFmt = "CREATE INDEX '%q' ON %Q(%s)"; + }else{ + zFmt = "CREATE INDEX %s ON %s(%s)"; + } + zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols); + if( !zIdx ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg); + idxHashAdd(&rc, &p->hIdx, zName, zIdx); + } + sqlite3_free(zName); + sqlite3_free(zIdx); + } + } + + sqlite3_free(zCols); + } + return rc; +} + +/* +** Return true if list pList (linked by IdxConstraint.pLink) contains +** a constraint compatible with *p. Otherwise return false. +*/ +static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){ + IdxConstraint *pCmp; + for(pCmp=pList; pCmp; pCmp=pCmp->pLink){ + if( p->iCol==pCmp->iCol ) return 1; + } + return 0; +} + +static int idxCreateFromWhere( + sqlite3expert *p, + IdxScan *pScan, /* Create indexes for this scan */ + IdxConstraint *pTail /* range/ORDER BY constraints for inclusion */ +){ + IdxConstraint *p1 = 0; + IdxConstraint *pCon; + int rc; + + /* Gather up all the == constraints. */ + for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){ + if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ + pCon->pLink = p1; + p1 = pCon; + } + } + + /* Create an index using the == constraints collected above. And the + ** range constraint/ORDER BY terms passed in by the caller, if any. */ + rc = idxCreateFromCons(p, pScan, p1, pTail); + + /* If no range/ORDER BY passed by the caller, create a version of the + ** index for each range constraint. */ + if( pTail==0 ){ + for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){ + assert( pCon->pLink==0 ); + if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ + rc = idxCreateFromCons(p, pScan, p1, pCon); + } + } + } + + return rc; +} + +/* +** Create candidate indexes in database [dbm] based on the data in +** linked-list pScan. +*/ +static int idxCreateCandidates(sqlite3expert *p){ + int rc = SQLITE_OK; + IdxScan *pIter; + + for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){ + rc = idxCreateFromWhere(p, pIter, 0); + if( rc==SQLITE_OK && pIter->pOrder ){ + rc = idxCreateFromWhere(p, pIter, pIter->pOrder); + } + } + + return rc; +} + +/* +** Free all elements of the linked list starting at pConstraint. +*/ +static void idxConstraintFree(IdxConstraint *pConstraint){ + IdxConstraint *pNext; + IdxConstraint *p; + + for(p=pConstraint; p; p=pNext){ + pNext = p->pNext; + sqlite3_free(p); + } +} + +/* +** Free all elements of the linked list starting from pScan up until pLast +** (pLast is not freed). +*/ +static void idxScanFree(IdxScan *pScan, IdxScan *pLast){ + IdxScan *p; + IdxScan *pNext; + for(p=pScan; p!=pLast; p=pNext){ + pNext = p->pNextScan; + idxConstraintFree(p->pOrder); + idxConstraintFree(p->pEq); + idxConstraintFree(p->pRange); + sqlite3_free(p); + } +} + +/* +** Free all elements of the linked list starting from pStatement up +** until pLast (pLast is not freed). +*/ +static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){ + IdxStatement *p; + IdxStatement *pNext; + for(p=pStatement; p!=pLast; p=pNext){ + pNext = p->pNext; + sqlite3_free(p->zEQP); + sqlite3_free(p->zIdx); + sqlite3_free(p); + } +} + +/* +** Free the linked list of IdxTable objects starting at pTab. +*/ +static void idxTableFree(IdxTable *pTab){ + IdxTable *pIter; + IdxTable *pNext; + for(pIter=pTab; pIter; pIter=pNext){ + pNext = pIter->pNext; + sqlite3_free(pIter); + } +} + +/* +** Free the linked list of IdxWrite objects starting at pTab. +*/ +static void idxWriteFree(IdxWrite *pTab){ + IdxWrite *pIter; + IdxWrite *pNext; + for(pIter=pTab; pIter; pIter=pNext){ + pNext = pIter->pNext; + sqlite3_free(pIter); + } +} + + + +/* +** This function is called after candidate indexes have been created. It +** runs all the queries to see which indexes they prefer, and populates +** IdxStatement.zIdx and IdxStatement.zEQP with the results. +*/ +int idxFindIndexes( + sqlite3expert *p, + char **pzErr /* OUT: Error message (sqlite3_malloc) */ +){ + IdxStatement *pStmt; + sqlite3 *dbm = p->dbm; + int rc = SQLITE_OK; + + IdxHash hIdx; + idxHashInit(&hIdx); + + for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){ + IdxHashEntry *pEntry; + sqlite3_stmt *pExplain = 0; + idxHashClear(&hIdx); + rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr, + "EXPLAIN QUERY PLAN %s", pStmt->zSql + ); + while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){ + /* int iId = sqlite3_column_int(pExplain, 0); */ + /* int iParent = sqlite3_column_int(pExplain, 1); */ + /* int iNotUsed = sqlite3_column_int(pExplain, 2); */ + const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3); + int nDetail; + int i; + + if( !zDetail ) continue; + nDetail = STRLEN(zDetail); + + for(i=0; ihIdx, zIdx, nIdx); + if( zSql ){ + idxHashAdd(&rc, &hIdx, zSql, 0); + if( rc ) goto find_indexes_out; + } + break; + } + } + + if( zDetail[0]!='-' ){ + pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail); + } + } + + for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ + pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey); + } + + idxFinalize(&rc, pExplain); + } + + find_indexes_out: + idxHashClear(&hIdx); + return rc; +} + +static int idxAuthCallback( + void *pCtx, + int eOp, + const char *z3, + const char *z4, + const char *zDb, + const char *zTrigger +){ + int rc = SQLITE_OK; + (void)z4; + (void)zTrigger; + if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){ + if( sqlite3_stricmp(zDb, "main")==0 ){ + sqlite3expert *p = (sqlite3expert*)pCtx; + IdxTable *pTab; + for(pTab=p->pTable; pTab; pTab=pTab->pNext){ + if( 0==sqlite3_stricmp(z3, pTab->zName) ) break; + } + if( pTab ){ + IdxWrite *pWrite; + for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){ + if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break; + } + if( pWrite==0 ){ + pWrite = idxMalloc(&rc, sizeof(IdxWrite)); + if( rc==SQLITE_OK ){ + pWrite->pTab = pTab; + pWrite->eOp = eOp; + pWrite->pNext = p->pWrite; + p->pWrite = pWrite; + } + } + } + } + } + return rc; +} + +static int idxProcessOneTrigger( + sqlite3expert *p, + IdxWrite *pWrite, + char **pzErr +){ + static const char *zInt = UNIQUE_TABLE_NAME; + static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME; + IdxTable *pTab = pWrite->pTab; + const char *zTab = pTab->zName; + const char *zSql = + "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_master " + "WHERE tbl_name = %Q AND type IN ('table', 'trigger') " + "ORDER BY type;"; + sqlite3_stmt *pSelect = 0; + int rc = SQLITE_OK; + char *zWrite = 0; + + /* Create the table and its triggers in the temp schema */ + rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){ + const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0); + rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr); + } + idxFinalize(&rc, pSelect); + + /* Rename the table in the temp schema to zInt */ + if( rc==SQLITE_OK ){ + char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt); + if( z==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr); + sqlite3_free(z); + } + } + + switch( pWrite->eOp ){ + case SQLITE_INSERT: { + int i; + zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt); + for(i=0; inCol; i++){ + zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", "); + } + zWrite = idxAppendText(&rc, zWrite, ")"); + break; + } + case SQLITE_UPDATE: { + int i; + zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt); + for(i=0; inCol; i++){ + zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ", + pTab->aCol[i].zName + ); + } + break; + } + default: { + assert( pWrite->eOp==SQLITE_DELETE ); + if( rc==SQLITE_OK ){ + zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt); + if( zWrite==0 ) rc = SQLITE_NOMEM; + } + } + } + + if( rc==SQLITE_OK ){ + sqlite3_stmt *pX = 0; + rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0); + idxFinalize(&rc, pX); + if( rc!=SQLITE_OK ){ + idxDatabaseError(p->dbv, pzErr); + } + } + sqlite3_free(zWrite); + + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr); + } + + return rc; +} + +static int idxProcessTriggers(sqlite3expert *p, char **pzErr){ + int rc = SQLITE_OK; + IdxWrite *pEnd = 0; + IdxWrite *pFirst = p->pWrite; + + while( rc==SQLITE_OK && pFirst!=pEnd ){ + IdxWrite *pIter; + for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){ + rc = idxProcessOneTrigger(p, pIter, pzErr); + } + pEnd = pFirst; + pFirst = p->pWrite; + } + + return rc; +} + + +static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){ + int rc = idxRegisterVtab(p); + sqlite3_stmt *pSchema = 0; + + /* For each table in the main db schema: + ** + ** 1) Add an entry to the p->pTable list, and + ** 2) Create the equivalent virtual table in dbv. + */ + rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg, + "SELECT type, name, sql, 1 FROM sqlite_master " + "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' " + " UNION ALL " + "SELECT type, name, sql, 2 FROM sqlite_master " + "WHERE type = 'trigger'" + " AND tbl_name IN(SELECT name FROM sqlite_master WHERE type = 'view') " + "ORDER BY 4, 1" + ); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){ + const char *zType = (const char*)sqlite3_column_text(pSchema, 0); + const char *zName = (const char*)sqlite3_column_text(pSchema, 1); + const char *zSql = (const char*)sqlite3_column_text(pSchema, 2); + + if( zType[0]=='v' || zType[1]=='r' ){ + rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg); + }else{ + IdxTable *pTab; + rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg); + if( rc==SQLITE_OK ){ + int i; + char *zInner = 0; + char *zOuter = 0; + pTab->pNext = p->pTable; + p->pTable = pTab; + + /* The statement the vtab will pass to sqlite3_declare_vtab() */ + zInner = idxAppendText(&rc, 0, "CREATE TABLE x("); + for(i=0; inCol; i++){ + zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s", + (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl + ); + } + zInner = idxAppendText(&rc, zInner, ")"); + + /* The CVT statement to create the vtab */ + zOuter = idxAppendText(&rc, 0, + "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner + ); + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg); + } + sqlite3_free(zInner); + sqlite3_free(zOuter); + } + } + } + idxFinalize(&rc, pSchema); + return rc; +} + +struct IdxSampleCtx { + int iTarget; + double target; /* Target nRet/nRow value */ + double nRow; /* Number of rows seen */ + double nRet; /* Number of rows returned */ +}; + +static void idxSampleFunc( + sqlite3_context *pCtx, + int argc, + sqlite3_value **argv +){ + struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx); + int bRet; + + (void)argv; + assert( argc==0 ); + if( p->nRow==0.0 ){ + bRet = 1; + }else{ + bRet = (p->nRet / p->nRow) <= p->target; + if( bRet==0 ){ + unsigned short rnd; + sqlite3_randomness(2, (void*)&rnd); + bRet = ((int)rnd % 100) <= p->iTarget; + } + } + + sqlite3_result_int(pCtx, bRet); + p->nRow += 1.0; + p->nRet += (double)bRet; +} + +struct IdxRemCtx { + int nSlot; + struct IdxRemSlot { + int eType; /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */ + i64 iVal; /* SQLITE_INTEGER value */ + double rVal; /* SQLITE_FLOAT value */ + int nByte; /* Bytes of space allocated at z */ + int n; /* Size of buffer z */ + char *z; /* SQLITE_TEXT/BLOB value */ + } aSlot[1]; +}; + +/* +** Implementation of scalar function rem(). +*/ +static void idxRemFunc( + sqlite3_context *pCtx, + int argc, + sqlite3_value **argv +){ + struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx); + struct IdxRemSlot *pSlot; + int iSlot; + assert( argc==2 ); + + iSlot = sqlite3_value_int(argv[0]); + assert( iSlot<=p->nSlot ); + pSlot = &p->aSlot[iSlot]; + + switch( pSlot->eType ){ + case SQLITE_NULL: + /* no-op */ + break; + + case SQLITE_INTEGER: + sqlite3_result_int64(pCtx, pSlot->iVal); + break; + + case SQLITE_FLOAT: + sqlite3_result_double(pCtx, pSlot->rVal); + break; + + case SQLITE_BLOB: + sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); + break; + + case SQLITE_TEXT: + sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); + break; + } + + pSlot->eType = sqlite3_value_type(argv[1]); + switch( pSlot->eType ){ + case SQLITE_NULL: + /* no-op */ + break; + + case SQLITE_INTEGER: + pSlot->iVal = sqlite3_value_int64(argv[1]); + break; + + case SQLITE_FLOAT: + pSlot->rVal = sqlite3_value_double(argv[1]); + break; + + case SQLITE_BLOB: + case SQLITE_TEXT: { + int nByte = sqlite3_value_bytes(argv[1]); + if( nByte>pSlot->nByte ){ + char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2); + if( zNew==0 ){ + sqlite3_result_error_nomem(pCtx); + return; + } + pSlot->nByte = nByte*2; + pSlot->z = zNew; + } + pSlot->n = nByte; + if( pSlot->eType==SQLITE_BLOB ){ + memcpy(pSlot->z, sqlite3_value_blob(argv[1]), nByte); + }else{ + memcpy(pSlot->z, sqlite3_value_text(argv[1]), nByte); + } + break; + } + } +} + +static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){ + int rc = SQLITE_OK; + const char *zMax = + "SELECT max(i.seqno) FROM " + " sqlite_master AS s, " + " pragma_index_list(s.name) AS l, " + " pragma_index_info(l.name) AS i " + "WHERE s.type = 'table'"; + sqlite3_stmt *pMax = 0; + + *pnMax = 0; + rc = idxPrepareStmt(db, &pMax, pzErr, zMax); + if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ + *pnMax = sqlite3_column_int(pMax, 0) + 1; + } + idxFinalize(&rc, pMax); + + return rc; +} + +static int idxPopulateOneStat1( + sqlite3expert *p, + sqlite3_stmt *pIndexXInfo, + sqlite3_stmt *pWriteStat, + const char *zTab, + const char *zIdx, + char **pzErr +){ + char *zCols = 0; + char *zOrder = 0; + char *zQuery = 0; + int nCol = 0; + int i; + sqlite3_stmt *pQuery = 0; + int *aStat = 0; + int rc = SQLITE_OK; + + assert( p->iSample>0 ); + + /* Formulate the query text */ + sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC); + while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){ + const char *zComma = zCols==0 ? "" : ", "; + const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0); + const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1); + zCols = idxAppendText(&rc, zCols, + "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl + ); + zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol); + } + sqlite3_reset(pIndexXInfo); + if( rc==SQLITE_OK ){ + if( p->iSample==100 ){ + zQuery = sqlite3_mprintf( + "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder + ); + }else{ + zQuery = sqlite3_mprintf( + "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder + ); + } + } + sqlite3_free(zCols); + sqlite3_free(zOrder); + + /* Formulate the query text */ + if( rc==SQLITE_OK ){ + sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); + rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery); + } + sqlite3_free(zQuery); + + if( rc==SQLITE_OK ){ + aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1)); + } + if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ + IdxHashEntry *pEntry; + char *zStat = 0; + for(i=0; i<=nCol; i++) aStat[i] = 1; + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ + aStat[0]++; + for(i=0; ihIdx, zIdx, STRLEN(zIdx)); + if( pEntry ){ + assert( pEntry->zVal2==0 ); + pEntry->zVal2 = zStat; + }else{ + sqlite3_free(zStat); + } + } + sqlite3_free(aStat); + idxFinalize(&rc, pQuery); + + return rc; +} + +static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){ + int rc; + char *zSql; + + rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); + if( rc!=SQLITE_OK ) return rc; + + zSql = sqlite3_mprintf( + "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab + ); + if( zSql==0 ) return SQLITE_NOMEM; + rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0); + sqlite3_free(zSql); + + return rc; +} + +/* +** This function is called as part of sqlite3_expert_analyze(). Candidate +** indexes have already been created in database sqlite3expert.dbm, this +** function populates sqlite_stat1 table in the same database. +** +** The stat1 data is generated by querying the +*/ +static int idxPopulateStat1(sqlite3expert *p, char **pzErr){ + int rc = SQLITE_OK; + int nMax =0; + struct IdxRemCtx *pCtx = 0; + struct IdxSampleCtx samplectx; + int i; + i64 iPrev = -100000; + sqlite3_stmt *pAllIndex = 0; + sqlite3_stmt *pIndexXInfo = 0; + sqlite3_stmt *pWrite = 0; + + const char *zAllIndex = + "SELECT s.rowid, s.name, l.name FROM " + " sqlite_master AS s, " + " pragma_index_list(s.name) AS l " + "WHERE s.type = 'table'"; + const char *zIndexXInfo = + "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key"; + const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)"; + + /* If iSample==0, no sqlite_stat1 data is required. */ + if( p->iSample==0 ) return SQLITE_OK; + + rc = idxLargestIndex(p->dbm, &nMax, pzErr); + if( nMax<=0 || rc!=SQLITE_OK ) return rc; + + rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0); + + if( rc==SQLITE_OK ){ + int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax); + pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte); + } + + if( rc==SQLITE_OK ){ + sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); + rc = sqlite3_create_function( + dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0 + ); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function( + p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0 + ); + } + + if( rc==SQLITE_OK ){ + pCtx->nSlot = nMax+1; + rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex); + } + if( rc==SQLITE_OK ){ + rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo); + } + if( rc==SQLITE_OK ){ + rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite); + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){ + i64 iRowid = sqlite3_column_int64(pAllIndex, 0); + const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1); + const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2); + if( p->iSample<100 && iPrev!=iRowid ){ + samplectx.target = (double)p->iSample / 100.0; + samplectx.iTarget = p->iSample; + samplectx.nRow = 0.0; + samplectx.nRet = 0.0; + rc = idxBuildSampleTable(p, zTab); + if( rc!=SQLITE_OK ) break; + } + rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr); + iPrev = iRowid; + } + if( rc==SQLITE_OK && p->iSample<100 ){ + rc = sqlite3_exec(p->dbv, + "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0 + ); + } + + idxFinalize(&rc, pAllIndex); + idxFinalize(&rc, pIndexXInfo); + idxFinalize(&rc, pWrite); + + for(i=0; inSlot; i++){ + sqlite3_free(pCtx->aSlot[i].z); + } + sqlite3_free(pCtx); + + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_master", 0, 0, 0); + } + + sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); + return rc; +} + +/* +** Allocate a new sqlite3expert object. +*/ +sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){ + int rc = SQLITE_OK; + sqlite3expert *pNew; + + pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert)); + + /* Open two in-memory databases to work with. The "vtab database" (dbv) + ** will contain a virtual table corresponding to each real table in + ** the user database schema, and a copy of each view. It is used to + ** collect information regarding the WHERE, ORDER BY and other clauses + ** of the user's query. + */ + if( rc==SQLITE_OK ){ + pNew->db = db; + pNew->iSample = 100; + rc = sqlite3_open(":memory:", &pNew->dbv); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_open(":memory:", &pNew->dbm); + if( rc==SQLITE_OK ){ + sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0); + } + } + + + /* Copy the entire schema of database [db] into [dbm]. */ + if( rc==SQLITE_OK ){ + sqlite3_stmt *pSql; + rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg, + "SELECT sql FROM sqlite_master WHERE name NOT LIKE 'sqlite_%%'" + " AND sql NOT LIKE 'CREATE VIRTUAL %%'" + ); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ + const char *zSql = (const char*)sqlite3_column_text(pSql, 0); + rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg); + } + idxFinalize(&rc, pSql); + } + + /* Create the vtab schema */ + if( rc==SQLITE_OK ){ + rc = idxCreateVtabSchema(pNew, pzErrmsg); + } + + /* Register the auth callback with dbv */ + if( rc==SQLITE_OK ){ + sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew); + } + + /* If an error has occurred, free the new object and reutrn NULL. Otherwise, + ** return the new sqlite3expert handle. */ + if( rc!=SQLITE_OK ){ + sqlite3_expert_destroy(pNew); + pNew = 0; + } + return pNew; +} + +/* +** Configure an sqlite3expert object. +*/ +int sqlite3_expert_config(sqlite3expert *p, int op, ...){ + int rc = SQLITE_OK; + va_list ap; + va_start(ap, op); + switch( op ){ + case EXPERT_CONFIG_SAMPLE: { + int iVal = va_arg(ap, int); + if( iVal<0 ) iVal = 0; + if( iVal>100 ) iVal = 100; + p->iSample = iVal; + break; + } + default: + rc = SQLITE_NOTFOUND; + break; + } + + va_end(ap); + return rc; +} + +/* +** Add an SQL statement to the analysis. +*/ +int sqlite3_expert_sql( + sqlite3expert *p, /* From sqlite3_expert_new() */ + const char *zSql, /* SQL statement to add */ + char **pzErr /* OUT: Error message (if any) */ +){ + IdxScan *pScanOrig = p->pScan; + IdxStatement *pStmtOrig = p->pStatement; + int rc = SQLITE_OK; + const char *zStmt = zSql; + + if( p->bRun ) return SQLITE_MISUSE; + + while( rc==SQLITE_OK && zStmt && zStmt[0] ){ + sqlite3_stmt *pStmt = 0; + rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt); + if( rc==SQLITE_OK ){ + if( pStmt ){ + IdxStatement *pNew; + const char *z = sqlite3_sql(pStmt); + int n = STRLEN(z); + pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1); + if( rc==SQLITE_OK ){ + pNew->zSql = (char*)&pNew[1]; + memcpy(pNew->zSql, z, n+1); + pNew->pNext = p->pStatement; + if( p->pStatement ) pNew->iId = p->pStatement->iId+1; + p->pStatement = pNew; + } + sqlite3_finalize(pStmt); + } + }else{ + idxDatabaseError(p->dbv, pzErr); + } + } + + if( rc!=SQLITE_OK ){ + idxScanFree(p->pScan, pScanOrig); + idxStatementFree(p->pStatement, pStmtOrig); + p->pScan = pScanOrig; + p->pStatement = pStmtOrig; + } + + return rc; +} + +int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){ + int rc; + IdxHashEntry *pEntry; + + /* Do trigger processing to collect any extra IdxScan structures */ + rc = idxProcessTriggers(p, pzErr); + + /* Create candidate indexes within the in-memory database file */ + if( rc==SQLITE_OK ){ + rc = idxCreateCandidates(p); + } + + /* Generate the stat1 data */ + if( rc==SQLITE_OK ){ + rc = idxPopulateStat1(p, pzErr); + } + + /* Formulate the EXPERT_REPORT_CANDIDATES text */ + for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ + p->zCandidates = idxAppendText(&rc, p->zCandidates, + "%s;%s%s\n", pEntry->zVal, + pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2 + ); + } + + /* Figure out which of the candidate indexes are preferred by the query + ** planner and report the results to the user. */ + if( rc==SQLITE_OK ){ + rc = idxFindIndexes(p, pzErr); + } + + if( rc==SQLITE_OK ){ + p->bRun = 1; + } + return rc; +} + +/* +** Return the total number of statements that have been added to this +** sqlite3expert using sqlite3_expert_sql(). +*/ +int sqlite3_expert_count(sqlite3expert *p){ + int nRet = 0; + if( p->pStatement ) nRet = p->pStatement->iId+1; + return nRet; +} + +/* +** Return a component of the report. +*/ +const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){ + const char *zRet = 0; + IdxStatement *pStmt; + + if( p->bRun==0 ) return 0; + for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext); + switch( eReport ){ + case EXPERT_REPORT_SQL: + if( pStmt ) zRet = pStmt->zSql; + break; + case EXPERT_REPORT_INDEXES: + if( pStmt ) zRet = pStmt->zIdx; + break; + case EXPERT_REPORT_PLAN: + if( pStmt ) zRet = pStmt->zEQP; + break; + case EXPERT_REPORT_CANDIDATES: + zRet = p->zCandidates; + break; + } + return zRet; +} + +/* +** Free an sqlite3expert object. +*/ +void sqlite3_expert_destroy(sqlite3expert *p){ + if( p ){ + sqlite3_close(p->dbm); + sqlite3_close(p->dbv); + idxScanFree(p->pScan, 0); + idxStatementFree(p->pStatement, 0); + idxTableFree(p->pTable); + idxWriteFree(p->pWrite); + idxHashClear(&p->hIdx); + sqlite3_free(p->zCandidates); + sqlite3_free(p); + } +} + +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + +/************************* End ../ext/expert/sqlite3expert.c ********************/ + +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) +/************************* Begin ../ext/misc/dbdata.c ******************/ +/* +** 2019-04-17 +** +** 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 an implementation of two eponymous virtual tables, +** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the +** "sqlite_dbpage" eponymous virtual table be available. +** +** SQLITE_DBDATA: +** sqlite_dbdata is used to extract data directly from a database b-tree +** page and its associated overflow pages, bypassing the b-tree layer. +** The table schema is equivalent to: +** +** CREATE TABLE sqlite_dbdata( +** pgno INTEGER, +** cell INTEGER, +** field INTEGER, +** value ANY, +** schema TEXT HIDDEN +** ); +** +** IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE +** FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND +** "schema". +** +** Each page of the database is inspected. If it cannot be interpreted as +** a b-tree page, or if it is a b-tree page containing 0 entries, the +** sqlite_dbdata table contains no rows for that page. Otherwise, the +** table contains one row for each field in the record associated with +** each cell on the page. For intkey b-trees, the key value is stored in +** field -1. +** +** For example, for the database: +** +** CREATE TABLE t1(a, b); -- root page is page 2 +** INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five'); +** INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten'); +** +** the sqlite_dbdata table contains, as well as from entries related to +** page 1, content equivalent to: +** +** INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES +** (2, 0, -1, 5 ), +** (2, 0, 0, 'v' ), +** (2, 0, 1, 'five'), +** (2, 1, -1, 10 ), +** (2, 1, 0, 'x' ), +** (2, 1, 1, 'ten' ); +** +** If database corruption is encountered, this module does not report an +** error. Instead, it attempts to extract as much data as possible and +** ignores the corruption. +** +** SQLITE_DBPTR: +** The sqlite_dbptr table has the following schema: +** +** CREATE TABLE sqlite_dbptr( +** pgno INTEGER, +** child INTEGER, +** schema TEXT HIDDEN +** ); +** +** It contains one entry for each b-tree pointer between a parent and +** child page in the database. +*/ +#if !defined(SQLITEINT_H) +/* #include "sqlite3ext.h" */ + +/* typedef unsigned char u8; */ + +#endif +SQLITE_EXTENSION_INIT1 +#include +#include + +#define DBDATA_PADDING_BYTES 100 + +typedef struct DbdataTable DbdataTable; +typedef struct DbdataCursor DbdataCursor; + +/* Cursor object */ +struct DbdataCursor { + sqlite3_vtab_cursor base; /* Base class. Must be first */ + sqlite3_stmt *pStmt; /* For fetching database pages */ + + int iPgno; /* Current page number */ + u8 *aPage; /* Buffer containing page */ + int nPage; /* Size of aPage[] in bytes */ + int nCell; /* Number of cells on aPage[] */ + int iCell; /* Current cell number */ + int bOnePage; /* True to stop after one page */ + int szDb; + sqlite3_int64 iRowid; + + /* Only for the sqlite_dbdata table */ + u8 *pRec; /* Buffer containing current record */ + int nRec; /* Size of pRec[] in bytes */ + int nHdr; /* Size of header in bytes */ + int iField; /* Current field number */ + u8 *pHdrPtr; + u8 *pPtr; + + sqlite3_int64 iIntkey; /* Integer key value */ +}; + +/* Table object */ +struct DbdataTable { + sqlite3_vtab base; /* Base class. Must be first */ + sqlite3 *db; /* The database connection */ + sqlite3_stmt *pStmt; /* For fetching database pages */ + int bPtr; /* True for sqlite3_dbptr table */ +}; + +/* Column and schema definitions for sqlite_dbdata */ +#define DBDATA_COLUMN_PGNO 0 +#define DBDATA_COLUMN_CELL 1 +#define DBDATA_COLUMN_FIELD 2 +#define DBDATA_COLUMN_VALUE 3 +#define DBDATA_COLUMN_SCHEMA 4 +#define DBDATA_SCHEMA \ + "CREATE TABLE x(" \ + " pgno INTEGER," \ + " cell INTEGER," \ + " field INTEGER," \ + " value ANY," \ + " schema TEXT HIDDEN" \ + ")" + +/* Column and schema definitions for sqlite_dbptr */ +#define DBPTR_COLUMN_PGNO 0 +#define DBPTR_COLUMN_CHILD 1 +#define DBPTR_COLUMN_SCHEMA 2 +#define DBPTR_SCHEMA \ + "CREATE TABLE x(" \ + " pgno INTEGER," \ + " child INTEGER," \ + " schema TEXT HIDDEN" \ + ")" + +/* +** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual +** table. +*/ +static int dbdataConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + DbdataTable *pTab = 0; + int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA); + + if( rc==SQLITE_OK ){ + pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable)); + if( pTab==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pTab, 0, sizeof(DbdataTable)); + pTab->db = db; + pTab->bPtr = (pAux!=0); + } + } + + *ppVtab = (sqlite3_vtab*)pTab; + return rc; +} + +/* +** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table. +*/ +static int dbdataDisconnect(sqlite3_vtab *pVtab){ + DbdataTable *pTab = (DbdataTable*)pVtab; + if( pTab ){ + sqlite3_finalize(pTab->pStmt); + sqlite3_free(pVtab); + } + return SQLITE_OK; +} + +/* +** This function interprets two types of constraints: +** +** schema=? +** pgno=? +** +** If neither are present, idxNum is set to 0. If schema=? is present, +** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit +** in idxNum is set. +** +** If both parameters are present, schema is in position 0 and pgno in +** position 1. +*/ +static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){ + DbdataTable *pTab = (DbdataTable*)tab; + int i; + int iSchema = -1; + int iPgno = -1; + int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA); + + for(i=0; inConstraint; i++){ + struct sqlite3_index_constraint *p = &pIdx->aConstraint[i]; + if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + if( p->iColumn==colSchema ){ + if( p->usable==0 ) return SQLITE_CONSTRAINT; + iSchema = i; + } + if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){ + iPgno = i; + } + } + } + + if( iSchema>=0 ){ + pIdx->aConstraintUsage[iSchema].argvIndex = 1; + pIdx->aConstraintUsage[iSchema].omit = 1; + } + if( iPgno>=0 ){ + pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0); + pIdx->aConstraintUsage[iPgno].omit = 1; + pIdx->estimatedCost = 100; + pIdx->estimatedRows = 50; + + if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){ + int iCol = pIdx->aOrderBy[0].iColumn; + if( pIdx->nOrderBy==1 ){ + pIdx->orderByConsumed = (iCol==0 || iCol==1); + }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){ + pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1); + } + } + + }else{ + pIdx->estimatedCost = 100000000; + pIdx->estimatedRows = 1000000000; + } + pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00); + return SQLITE_OK; +} + +/* +** Open a new sqlite_dbdata or sqlite_dbptr cursor. +*/ +static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + DbdataCursor *pCsr; + + pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor)); + if( pCsr==0 ){ + return SQLITE_NOMEM; + }else{ + memset(pCsr, 0, sizeof(DbdataCursor)); + pCsr->base.pVtab = pVTab; + } + + *ppCursor = (sqlite3_vtab_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** Restore a cursor object to the state it was in when first allocated +** by dbdataOpen(). +*/ +static void dbdataResetCursor(DbdataCursor *pCsr){ + DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab); + if( pTab->pStmt==0 ){ + pTab->pStmt = pCsr->pStmt; + }else{ + sqlite3_finalize(pCsr->pStmt); + } + pCsr->pStmt = 0; + pCsr->iPgno = 1; + pCsr->iCell = 0; + pCsr->iField = 0; + pCsr->bOnePage = 0; + sqlite3_free(pCsr->aPage); + sqlite3_free(pCsr->pRec); + pCsr->pRec = 0; + pCsr->aPage = 0; +} + +/* +** Close an sqlite_dbdata or sqlite_dbptr cursor. +*/ +static int dbdataClose(sqlite3_vtab_cursor *pCursor){ + DbdataCursor *pCsr = (DbdataCursor*)pCursor; + dbdataResetCursor(pCsr); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Utility methods to decode 16 and 32-bit big-endian unsigned integers. +*/ +static unsigned int get_uint16(unsigned char *a){ + return (a[0]<<8)|a[1]; +} +static unsigned int get_uint32(unsigned char *a){ + return ((unsigned int)a[0]<<24) + | ((unsigned int)a[1]<<16) + | ((unsigned int)a[2]<<8) + | ((unsigned int)a[3]); +} + +/* +** Load page pgno from the database via the sqlite_dbpage virtual table. +** If successful, set (*ppPage) to point to a buffer containing the page +** data, (*pnPage) to the size of that buffer in bytes and return +** SQLITE_OK. In this case it is the responsibility of the caller to +** eventually free the buffer using sqlite3_free(). +** +** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and +** return an SQLite error code. +*/ +static int dbdataLoadPage( + DbdataCursor *pCsr, /* Cursor object */ + unsigned int pgno, /* Page number of page to load */ + u8 **ppPage, /* OUT: pointer to page buffer */ + int *pnPage /* OUT: Size of (*ppPage) in bytes */ +){ + int rc2; + int rc = SQLITE_OK; + sqlite3_stmt *pStmt = pCsr->pStmt; + + *ppPage = 0; + *pnPage = 0; + sqlite3_bind_int64(pStmt, 2, pgno); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + int nCopy = sqlite3_column_bytes(pStmt, 0); + if( nCopy>0 ){ + u8 *pPage; + pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES); + if( pPage==0 ){ + rc = SQLITE_NOMEM; + }else{ + const u8 *pCopy = sqlite3_column_blob(pStmt, 0); + memcpy(pPage, pCopy, nCopy); + memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES); + } + *ppPage = pPage; + *pnPage = nCopy; + } + } + rc2 = sqlite3_reset(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + + return rc; +} + +/* +** Read a varint. Put the value in *pVal and return the number of bytes. +*/ +static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){ + sqlite3_int64 v = 0; + int i; + for(i=0; i<8; i++){ + v = (v<<7) + (z[i]&0x7f); + if( (z[i]&0x80)==0 ){ *pVal = v; return i+1; } + } + v = (v<<8) + (z[i]&0xff); + *pVal = v; + return 9; +} + +/* +** Return the number of bytes of space used by an SQLite value of type +** eType. +*/ +static int dbdataValueBytes(int eType){ + switch( eType ){ + case 0: case 8: case 9: + case 10: case 11: + return 0; + case 1: + return 1; + case 2: + return 2; + case 3: + return 3; + case 4: + return 4; + case 5: + return 6; + case 6: + case 7: + return 8; + default: + if( eType>0 ){ + return ((eType-12) / 2); + } + return 0; + } +} + +/* +** Load a value of type eType from buffer pData and use it to set the +** result of context object pCtx. +*/ +static void dbdataValue( + sqlite3_context *pCtx, + int eType, + u8 *pData, + int nData +){ + if( eType>=0 && dbdataValueBytes(eType)<=nData ){ + switch( eType ){ + case 0: + case 10: + case 11: + sqlite3_result_null(pCtx); + break; + + case 8: + sqlite3_result_int(pCtx, 0); + break; + case 9: + sqlite3_result_int(pCtx, 1); + break; + + case 1: case 2: case 3: case 4: case 5: case 6: case 7: { + sqlite3_uint64 v = (signed char)pData[0]; + pData++; + switch( eType ){ + case 7: + case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; + case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; + case 4: v = (v<<8) + pData[0]; pData++; + case 3: v = (v<<8) + pData[0]; pData++; + case 2: v = (v<<8) + pData[0]; pData++; + } + + if( eType==7 ){ + double r; + memcpy(&r, &v, sizeof(r)); + sqlite3_result_double(pCtx, r); + }else{ + sqlite3_result_int64(pCtx, (sqlite3_int64)v); + } + break; + } + + default: { + int n = ((eType-12) / 2); + if( eType % 2 ){ + sqlite3_result_text(pCtx, (const char*)pData, n, SQLITE_TRANSIENT); + }else{ + sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT); + } + } + } + } +} + +/* +** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry. +*/ +static int dbdataNext(sqlite3_vtab_cursor *pCursor){ + DbdataCursor *pCsr = (DbdataCursor*)pCursor; + DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; + + pCsr->iRowid++; + while( 1 ){ + int rc; + int iOff = (pCsr->iPgno==1 ? 100 : 0); + int bNextPage = 0; + + if( pCsr->aPage==0 ){ + while( 1 ){ + if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK; + rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage); + if( rc!=SQLITE_OK ) return rc; + if( pCsr->aPage ) break; + pCsr->iPgno++; + } + pCsr->iCell = pTab->bPtr ? -2 : 0; + pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]); + } + + if( pTab->bPtr ){ + if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){ + pCsr->iCell = pCsr->nCell; + } + pCsr->iCell++; + if( pCsr->iCell>=pCsr->nCell ){ + sqlite3_free(pCsr->aPage); + pCsr->aPage = 0; + if( pCsr->bOnePage ) return SQLITE_OK; + pCsr->iPgno++; + }else{ + return SQLITE_OK; + } + }else{ + /* If there is no record loaded, load it now. */ + if( pCsr->pRec==0 ){ + int bHasRowid = 0; + int nPointer = 0; + sqlite3_int64 nPayload = 0; + sqlite3_int64 nHdr = 0; + int iHdr; + int U, X; + int nLocal; + + switch( pCsr->aPage[iOff] ){ + case 0x02: + nPointer = 4; + break; + case 0x0a: + break; + case 0x0d: + bHasRowid = 1; + break; + default: + /* This is not a b-tree page with records on it. Continue. */ + pCsr->iCell = pCsr->nCell; + break; + } + + if( pCsr->iCell>=pCsr->nCell ){ + bNextPage = 1; + }else{ + + iOff += 8 + nPointer + pCsr->iCell*2; + if( iOff>pCsr->nPage ){ + bNextPage = 1; + }else{ + iOff = get_uint16(&pCsr->aPage[iOff]); + } + + /* For an interior node cell, skip past the child-page number */ + iOff += nPointer; + + /* Load the "byte of payload including overflow" field */ + if( bNextPage || iOff>pCsr->nPage ){ + bNextPage = 1; + }else{ + iOff += dbdataGetVarint(&pCsr->aPage[iOff], &nPayload); + } + + /* If this is a leaf intkey cell, load the rowid */ + if( bHasRowid && !bNextPage && iOffnPage ){ + iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey); + } + + /* Figure out how much data to read from the local page */ + U = pCsr->nPage; + if( bHasRowid ){ + X = U-35; + }else{ + X = ((U-12)*64/255)-23; + } + if( nPayload<=X ){ + nLocal = nPayload; + }else{ + int M, K; + M = ((U-12)*32/255)-23; + K = M+((nPayload-M)%(U-4)); + if( K<=X ){ + nLocal = K; + }else{ + nLocal = M; + } + } + + if( bNextPage || nLocal+iOff>pCsr->nPage ){ + bNextPage = 1; + }else{ + + /* Allocate space for payload. And a bit more to catch small buffer + ** overruns caused by attempting to read a varint or similar from + ** near the end of a corrupt record. */ + pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES); + if( pCsr->pRec==0 ) return SQLITE_NOMEM; + memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES); + pCsr->nRec = nPayload; + + /* Load the nLocal bytes of payload */ + memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal); + iOff += nLocal; + + /* Load content from overflow pages */ + if( nPayload>nLocal ){ + sqlite3_int64 nRem = nPayload - nLocal; + unsigned int pgnoOvfl = get_uint32(&pCsr->aPage[iOff]); + while( nRem>0 ){ + u8 *aOvfl = 0; + int nOvfl = 0; + int nCopy; + rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl); + assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage ); + if( rc!=SQLITE_OK ) return rc; + if( aOvfl==0 ) break; + + nCopy = U-4; + if( nCopy>nRem ) nCopy = nRem; + memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy); + nRem -= nCopy; + + pgnoOvfl = get_uint32(aOvfl); + sqlite3_free(aOvfl); + } + } + + iHdr = dbdataGetVarint(pCsr->pRec, &nHdr); + pCsr->nHdr = nHdr; + pCsr->pHdrPtr = &pCsr->pRec[iHdr]; + pCsr->pPtr = &pCsr->pRec[pCsr->nHdr]; + pCsr->iField = (bHasRowid ? -1 : 0); + } + } + }else{ + pCsr->iField++; + if( pCsr->iField>0 ){ + sqlite3_int64 iType; + if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){ + bNextPage = 1; + }else{ + pCsr->pHdrPtr += dbdataGetVarint(pCsr->pHdrPtr, &iType); + pCsr->pPtr += dbdataValueBytes(iType); + } + } + } + + if( bNextPage ){ + sqlite3_free(pCsr->aPage); + sqlite3_free(pCsr->pRec); + pCsr->aPage = 0; + pCsr->pRec = 0; + if( pCsr->bOnePage ) return SQLITE_OK; + pCsr->iPgno++; + }else{ + if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){ + return SQLITE_OK; + } + + /* Advance to the next cell. The next iteration of the loop will load + ** the record and so on. */ + sqlite3_free(pCsr->pRec); + pCsr->pRec = 0; + pCsr->iCell++; + } + } + } + + assert( !"can't get here" ); + return SQLITE_OK; +} + +/* +** Return true if the cursor is at EOF. +*/ +static int dbdataEof(sqlite3_vtab_cursor *pCursor){ + DbdataCursor *pCsr = (DbdataCursor*)pCursor; + return pCsr->aPage==0; +} + +/* +** Determine the size in pages of database zSchema (where zSchema is +** "main", "temp" or the name of an attached database) and set +** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise, +** an SQLite error code. +*/ +static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){ + DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab; + char *zSql = 0; + int rc, rc2; + sqlite3_stmt *pStmt = 0; + + zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema); + if( zSql==0 ) return SQLITE_NOMEM; + rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ + pCsr->szDb = sqlite3_column_int(pStmt, 0); + } + rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + return rc; +} + +/* +** xFilter method for sqlite_dbdata and sqlite_dbptr. +*/ +static int dbdataFilter( + sqlite3_vtab_cursor *pCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + DbdataCursor *pCsr = (DbdataCursor*)pCursor; + DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; + int rc = SQLITE_OK; + const char *zSchema = "main"; + + dbdataResetCursor(pCsr); + assert( pCsr->iPgno==1 ); + if( idxNum & 0x01 ){ + zSchema = (const char*)sqlite3_value_text(argv[0]); + } + if( idxNum & 0x02 ){ + pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]); + pCsr->bOnePage = 1; + }else{ + pCsr->nPage = dbdataDbsize(pCsr, zSchema); + rc = dbdataDbsize(pCsr, zSchema); + } + + if( rc==SQLITE_OK ){ + if( pTab->pStmt ){ + pCsr->pStmt = pTab->pStmt; + pTab->pStmt = 0; + }else{ + rc = sqlite3_prepare_v2(pTab->db, + "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1, + &pCsr->pStmt, 0 + ); + } + } + if( rc==SQLITE_OK ){ + rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT); + }else{ + pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db)); + } + if( rc==SQLITE_OK ){ + rc = dbdataNext(pCursor); + } + return rc; +} + +/* +** Return a column for the sqlite_dbdata or sqlite_dbptr table. +*/ +static int dbdataColumn( + sqlite3_vtab_cursor *pCursor, + sqlite3_context *ctx, + int i +){ + DbdataCursor *pCsr = (DbdataCursor*)pCursor; + DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; + if( pTab->bPtr ){ + switch( i ){ + case DBPTR_COLUMN_PGNO: + sqlite3_result_int64(ctx, pCsr->iPgno); + break; + case DBPTR_COLUMN_CHILD: { + int iOff = pCsr->iPgno==1 ? 100 : 0; + if( pCsr->iCell<0 ){ + iOff += 8; + }else{ + iOff += 12 + pCsr->iCell*2; + if( iOff>pCsr->nPage ) return SQLITE_OK; + iOff = get_uint16(&pCsr->aPage[iOff]); + } + if( iOff<=pCsr->nPage ){ + sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff])); + } + break; + } + } + }else{ + switch( i ){ + case DBDATA_COLUMN_PGNO: + sqlite3_result_int64(ctx, pCsr->iPgno); + break; + case DBDATA_COLUMN_CELL: + sqlite3_result_int(ctx, pCsr->iCell); + break; + case DBDATA_COLUMN_FIELD: + sqlite3_result_int(ctx, pCsr->iField); + break; + case DBDATA_COLUMN_VALUE: { + if( pCsr->iField<0 ){ + sqlite3_result_int64(ctx, pCsr->iIntkey); + }else{ + sqlite3_int64 iType; + dbdataGetVarint(pCsr->pHdrPtr, &iType); + dbdataValue( + ctx, iType, pCsr->pPtr, &pCsr->pRec[pCsr->nRec] - pCsr->pPtr + ); + } + break; + } + } + } + return SQLITE_OK; +} + +/* +** Return the rowid for an sqlite_dbdata or sqlite_dptr table. +*/ +static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + DbdataCursor *pCsr = (DbdataCursor*)pCursor; + *pRowid = pCsr->iRowid; + return SQLITE_OK; +} + + +/* +** Invoke this routine to register the "sqlite_dbdata" virtual table module +*/ +static int sqlite3DbdataRegister(sqlite3 *db){ + static sqlite3_module dbdata_module = { + 0, /* iVersion */ + 0, /* xCreate */ + dbdataConnect, /* xConnect */ + dbdataBestIndex, /* xBestIndex */ + dbdataDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + dbdataOpen, /* xOpen - open a cursor */ + dbdataClose, /* xClose - close a cursor */ + dbdataFilter, /* xFilter - configure scan constraints */ + dbdataNext, /* xNext - advance a cursor */ + dbdataEof, /* xEof - check for end of scan */ + dbdataColumn, /* xColumn - read data */ + dbdataRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ + }; + + int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1); + } + return rc; +} + +#ifdef _WIN32 + +#endif +int sqlite3_dbdata_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi); + return sqlite3DbdataRegister(db); +} + +/************************* End ../ext/misc/dbdata.c ********************/ +#endif + +#if defined(SQLITE_ENABLE_SESSION) +/* +** State information for a single open session +*/ +typedef struct OpenSession OpenSession; +struct OpenSession { + char *zName; /* Symbolic name for this session */ + int nFilter; /* Number of xFilter rejection GLOB patterns */ + char **azFilter; /* Array of xFilter rejection GLOB patterns */ + sqlite3_session *p; /* The open session */ +}; +#endif + +/* +** Shell output mode information from before ".explain on", +** saved so that it can be restored by ".explain off" +*/ +typedef struct SavedModeInfo SavedModeInfo; +struct SavedModeInfo { + int valid; /* Is there legit data in here? */ + int mode; /* Mode prior to ".explain on" */ + int showHeader; /* The ".header" setting prior to ".explain on" */ + int colWidth[100]; /* Column widths prior to ".explain on" */ +}; + +typedef struct ExpertInfo ExpertInfo; +struct ExpertInfo { + sqlite3expert *pExpert; + int bVerbose; +}; + +/* A single line in the EQP output */ +typedef struct EQPGraphRow EQPGraphRow; +struct EQPGraphRow { + int iEqpId; /* ID for this row */ + int iParentId; /* ID of the parent row */ + EQPGraphRow *pNext; /* Next row in sequence */ + char zText[1]; /* Text to display for this row */ +}; + +/* All EQP output is collected into an instance of the following */ +typedef struct EQPGraph EQPGraph; +struct EQPGraph { + EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */ + EQPGraphRow *pLast; /* Last element of the pRow list */ + char zPrefix[100]; /* Graph prefix */ +}; + +/* +** State information about the database connection is contained in an +** instance of the following structure. +*/ +typedef struct ShellState ShellState; +struct ShellState { + sqlite3 *db; /* The database */ + u8 autoExplain; /* Automatically turn on .explain mode */ + u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ + u8 autoEQPtest; /* autoEQP is in test mode */ + u8 autoEQPtrace; /* autoEQP is in trace mode */ + u8 statsOn; /* True to display memory stats before each finalize */ + u8 scanstatsOn; /* True to display scan stats before each finalize */ + u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ + u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ + u8 nEqpLevel; /* Depth of the EQP output graph */ + u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ + unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ + int outCount; /* Revert to stdout when reaching zero */ + int cnt; /* Number of records displayed so far */ + int lineno; /* Line number of last line read from in */ + int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */ + FILE *in; /* Read commands from this stream */ + FILE *out; /* Write results here */ + FILE *traceOut; /* Output for sqlite3_trace() */ + int nErr; /* Number of errors seen */ + int mode; /* An output mode setting */ + int modePrior; /* Saved mode */ + int cMode; /* temporary output mode for the current query */ + int normalMode; /* Output mode before ".explain on" */ + int writableSchema; /* True if PRAGMA writable_schema=ON */ + int showHeader; /* True to show column names in List or Column mode */ + int nCheck; /* Number of ".check" commands run */ + unsigned nProgress; /* Number of progress callbacks encountered */ + unsigned mxProgress; /* Maximum progress callbacks before failing */ + unsigned flgProgress; /* Flags for the progress callback */ + unsigned shellFlgs; /* Various flags */ + unsigned priorShFlgs; /* Saved copy of flags */ + sqlite3_int64 szMax; /* --maxsize argument to .open */ + char *zDestTable; /* Name of destination table when MODE_Insert */ + char *zTempFile; /* Temporary file that might need deleting */ + char zTestcase[30]; /* Name of current test case */ + char colSeparator[20]; /* Column separator character for several modes */ + char rowSeparator[20]; /* Row separator character for MODE_Ascii */ + char colSepPrior[20]; /* Saved column separator */ + char rowSepPrior[20]; /* Saved row separator */ + int colWidth[100]; /* Requested width of each column when in column mode*/ + int actualWidth[100]; /* Actual width of each column */ + char nullValue[20]; /* The text to print when a NULL comes back from + ** the database */ + char outfile[FILENAME_MAX]; /* Filename for *out */ + const char *zDbFilename; /* name of the database file */ + char *zFreeOnClose; /* Filename to free when closing */ + const char *zVfs; /* Name of VFS to use */ + sqlite3_stmt *pStmt; /* Current statement if any. */ + FILE *pLog; /* Write log output here */ + int *aiIndent; /* Array of indents used in MODE_Explain */ + int nIndent; /* Size of array aiIndent[] */ + int iIndent; /* Index of current op in aiIndent[] */ + EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */ +#if defined(SQLITE_ENABLE_SESSION) + int nSession; /* Number of active sessions */ + OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */ +#endif + ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ +}; + + +/* Allowed values for ShellState.autoEQP +*/ +#define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */ +#define AUTOEQP_on 1 /* Automatic EQP is on */ +#define AUTOEQP_trigger 2 /* On and also show plans for triggers */ +#define AUTOEQP_full 3 /* Show full EXPLAIN */ + +/* Allowed values for ShellState.openMode +*/ +#define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ +#define SHELL_OPEN_NORMAL 1 /* Normal database file */ +#define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ +#define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ +#define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ +#define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */ +#define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */ + +/* Allowed values for ShellState.eTraceType +*/ +#define SHELL_TRACE_PLAIN 0 /* Show input SQL text */ +#define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ +#define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ + +/* Bits in the ShellState.flgProgress variable */ +#define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ +#define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres + ** callback limit is reached, and for each + ** top-level SQL statement */ +#define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ + +/* +** These are the allowed shellFlgs values +*/ +#define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */ +#define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */ +#define SHFLG_Backslash 0x00000004 /* The --backslash option is used */ +#define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */ +#define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ +#define SHFLG_CountChanges 0x00000020 /* .changes setting */ +#define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ + +/* +** Macros for testing and setting shellFlgs +*/ +#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0) +#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X)) +#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X))) + +/* +** These are the allowed modes. +*/ +#define MODE_Line 0 /* One column per line. Blank line between records */ +#define MODE_Column 1 /* One record per line in neat columns */ +#define MODE_List 2 /* One record per line with a separator */ +#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ +#define MODE_Html 4 /* Generate an XHTML table */ +#define MODE_Insert 5 /* Generate SQL "insert" statements */ +#define MODE_Quote 6 /* Quote values as for SQL */ +#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ +#define MODE_Csv 8 /* Quote strings, numbers are plain */ +#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ +#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ +#define MODE_Pretty 11 /* Pretty-print schemas */ +#define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ + +static const char *modeDescr[] = { + "line", + "column", + "list", + "semi", + "html", + "insert", + "quote", + "tcl", + "csv", + "explain", + "ascii", + "prettyprint", + "eqp" +}; + +/* +** These are the column/row/line separators used by the various +** import/export modes. +*/ +#define SEP_Column "|" +#define SEP_Row "\n" +#define SEP_Tab "\t" +#define SEP_Space " " +#define SEP_Comma "," +#define SEP_CrLf "\r\n" +#define SEP_Unit "\x1F" +#define SEP_Record "\x1E" + +/* +** A callback for the sqlite3_log() interface. +*/ +static void shellLog(void *pArg, int iErrCode, const char *zMsg){ + ShellState *p = (ShellState*)pArg; + if( p->pLog==0 ) return; + utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg); + fflush(p->pLog); +} + +/* +** SQL function: shell_putsnl(X) +** +** Write the text X to the screen (or whatever output is being directed) +** adding a newline at the end, and then return X. +*/ +static void shellPutsFunc( + sqlite3_context *pCtx, + int nVal, + sqlite3_value **apVal +){ + ShellState *p = (ShellState*)sqlite3_user_data(pCtx); + (void)nVal; + utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0])); + sqlite3_result_value(pCtx, apVal[0]); +} + +/* +** SQL function: edit(VALUE) +** edit(VALUE,EDITOR) +** +** These steps: +** +** (1) Write VALUE into a temporary file. +** (2) Run program EDITOR on that temporary file. +** (3) Read the temporary file back and return its content as the result. +** (4) Delete the temporary file +** +** If the EDITOR argument is omitted, use the value in the VISUAL +** environment variable. If still there is no EDITOR, through an error. +** +** Also throw an error if the EDITOR program returns a non-zero exit code. +*/ +#ifndef SQLITE_NOHAVE_SYSTEM +static void editFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zEditor; + char *zTempFile = 0; + sqlite3 *db; + char *zCmd = 0; + int bBin; + int rc; + int hasCRNL = 0; + FILE *f = 0; + sqlite3_int64 sz; + sqlite3_int64 x; + unsigned char *p = 0; + + if( argc==2 ){ + zEditor = (const char*)sqlite3_value_text(argv[1]); + }else{ + zEditor = getenv("VISUAL"); + } + if( zEditor==0 ){ + sqlite3_result_error(context, "no editor for edit()", -1); + return; + } + if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ + sqlite3_result_error(context, "NULL input to edit()", -1); + return; + } + db = sqlite3_context_db_handle(context); + zTempFile = 0; + sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile); + if( zTempFile==0 ){ + sqlite3_uint64 r = 0; + sqlite3_randomness(sizeof(r), &r); + zTempFile = sqlite3_mprintf("temp%llx", r); + if( zTempFile==0 ){ + sqlite3_result_error_nomem(context); + return; + } + } + bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB; + /* When writing the file to be edited, do \n to \r\n conversions on systems + ** that want \r\n line endings */ + f = fopen(zTempFile, bBin ? "wb" : "w"); + if( f==0 ){ + sqlite3_result_error(context, "edit() cannot open temp file", -1); + goto edit_func_end; + } + sz = sqlite3_value_bytes(argv[0]); + if( bBin ){ + x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f); + }else{ + const char *z = (const char*)sqlite3_value_text(argv[0]); + /* Remember whether or not the value originally contained \r\n */ + if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1; + x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f); + } + fclose(f); + f = 0; + if( x!=sz ){ + sqlite3_result_error(context, "edit() could not write the whole file", -1); + goto edit_func_end; + } + zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile); + if( zCmd==0 ){ + sqlite3_result_error_nomem(context); + goto edit_func_end; + } + rc = system(zCmd); + sqlite3_free(zCmd); + if( rc ){ + sqlite3_result_error(context, "EDITOR returned non-zero", -1); + goto edit_func_end; + } + f = fopen(zTempFile, "rb"); + if( f==0 ){ + sqlite3_result_error(context, + "edit() cannot reopen temp file after edit", -1); + goto edit_func_end; + } + fseek(f, 0, SEEK_END); + sz = ftell(f); + rewind(f); + p = sqlite3_malloc64( sz+1 ); + if( p==0 ){ + sqlite3_result_error_nomem(context); + goto edit_func_end; + } + x = fread(p, 1, (size_t)sz, f); + fclose(f); + f = 0; + if( x!=sz ){ + sqlite3_result_error(context, "could not read back the whole file", -1); + goto edit_func_end; + } + if( bBin ){ + sqlite3_result_blob64(context, p, sz, sqlite3_free); + }else{ + sqlite3_int64 i, j; + if( hasCRNL ){ + /* If the original contains \r\n then do no conversions back to \n */ + j = sz; + }else{ + /* If the file did not originally contain \r\n then convert any new + ** \r\n back into \n */ + for(i=j=0; imodePrior = p->mode; + p->priorShFlgs = p->shellFlgs; + memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator)); + memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator)); +} +static void outputModePop(ShellState *p){ + p->mode = p->modePrior; + p->shellFlgs = p->priorShFlgs; + memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator)); + memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator)); +} + +/* +** Output the given string as a hex-encoded blob (eg. X'1234' ) +*/ +static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ + int i; + char *zBlob = (char *)pBlob; + raw_printf(out,"X'"); + for(i=0; i0 ){ + utf8_printf(out,"%.*s",i,z); + } + if( z[i]=='<' ){ + raw_printf(out,"<"); + }else if( z[i]=='&' ){ + raw_printf(out,"&"); + }else if( z[i]=='>' ){ + raw_printf(out,">"); + }else if( z[i]=='\"' ){ + raw_printf(out,"""); + }else if( z[i]=='\'' ){ + raw_printf(out,"'"); + }else{ + break; + } + z += i + 1; + } +} + +/* +** If a field contains any character identified by a 1 in the following +** array, then the string must be quoted for CSV. +*/ +static const char needCsvQuote[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 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, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; + +/* +** Output a single term of CSV. Actually, p->colSeparator is used for +** the separator, which may or may not be a comma. p->nullValue is +** the null value. Strings are quoted if necessary. The separator +** is only issued if bSep is true. +*/ +static void output_csv(ShellState *p, const char *z, int bSep){ + FILE *out = p->out; + if( z==0 ){ + utf8_printf(out,"%s",p->nullValue); + }else{ + int i; + int nSep = strlen30(p->colSeparator); + for(i=0; z[i]; i++){ + if( needCsvQuote[((unsigned char*)z)[i]] + || (z[i]==p->colSeparator[0] && + (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){ + i = 0; + break; + } + } + if( i==0 ){ + char *zQuoted = sqlite3_mprintf("\"%w\"", z); + utf8_printf(out, "%s", zQuoted); + sqlite3_free(zQuoted); + }else{ + utf8_printf(out, "%s", z); + } + } + if( bSep ){ + utf8_printf(p->out, "%s", p->colSeparator); + } +} + +/* +** This routine runs when the user presses Ctrl-C +*/ +static void interrupt_handler(int NotUsed){ + UNUSED_PARAMETER(NotUsed); + seenInterrupt++; + if( seenInterrupt>2 ) exit(1); + if( globalDb ) sqlite3_interrupt(globalDb); +} + +#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) +/* +** This routine runs for console events (e.g. Ctrl-C) on Win32 +*/ +static BOOL WINAPI ConsoleCtrlHandler( + DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */ +){ + if( dwCtrlType==CTRL_C_EVENT ){ + interrupt_handler(0); + return TRUE; + } + return FALSE; +} +#endif + +#ifndef SQLITE_OMIT_AUTHORIZATION +/* +** When the ".auth ON" is set, the following authorizer callback is +** invoked. It always returns SQLITE_OK. +*/ +static int shellAuth( + void *pClientData, + int op, + const char *zA1, + const char *zA2, + const char *zA3, + const char *zA4 +){ + ShellState *p = (ShellState*)pClientData; + static const char *azAction[] = { 0, + "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX", + "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW", + "CREATE_TRIGGER", "CREATE_VIEW", "DELETE", + "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX", + "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW", + "DROP_TRIGGER", "DROP_VIEW", "INSERT", + "PRAGMA", "READ", "SELECT", + "TRANSACTION", "UPDATE", "ATTACH", + "DETACH", "ALTER_TABLE", "REINDEX", + "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE", + "FUNCTION", "SAVEPOINT", "RECURSIVE" + }; + int i; + const char *az[4]; + az[0] = zA1; + az[1] = zA2; + az[2] = zA3; + az[3] = zA4; + utf8_printf(p->out, "authorizer: %s", azAction[op]); + for(i=0; i<4; i++){ + raw_printf(p->out, " "); + if( az[i] ){ + output_c_string(p->out, az[i]); + }else{ + raw_printf(p->out, "NULL"); + } + } + raw_printf(p->out, "\n"); + return SQLITE_OK; +} +#endif + +/* +** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. +** +** This routine converts some CREATE TABLE statements for shadow tables +** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. +*/ +static void printSchemaLine(FILE *out, const char *z, const char *zTail){ + if( z==0 ) return; + if( zTail==0 ) return; + if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ + utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); + }else{ + utf8_printf(out, "%s%s", z, zTail); + } +} +static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){ + char c = z[n]; + z[n] = 0; + printSchemaLine(out, z, zTail); + z[n] = c; +} + +/* +** Return true if string z[] has nothing but whitespace and comments to the +** end of the first line. +*/ +static int wsToEol(const char *z){ + int i; + for(i=0; z[i]; i++){ + if( z[i]=='\n' ) return 1; + if( IsSpace(z[i]) ) continue; + if( z[i]=='-' && z[i+1]=='-' ) return 1; + return 0; + } + return 1; +} + +/* +** Add a new entry to the EXPLAIN QUERY PLAN data +*/ +static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){ + EQPGraphRow *pNew; + int nText = strlen30(zText); + if( p->autoEQPtest ){ + utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText); + } + pNew = sqlite3_malloc64( sizeof(*pNew) + nText ); + if( pNew==0 ) shell_out_of_memory(); + pNew->iEqpId = iEqpId; + pNew->iParentId = p2; + memcpy(pNew->zText, zText, nText+1); + pNew->pNext = 0; + if( p->sGraph.pLast ){ + p->sGraph.pLast->pNext = pNew; + }else{ + p->sGraph.pRow = pNew; + } + p->sGraph.pLast = pNew; +} + +/* +** Free and reset the EXPLAIN QUERY PLAN data that has been collected +** in p->sGraph. +*/ +static void eqp_reset(ShellState *p){ + EQPGraphRow *pRow, *pNext; + for(pRow = p->sGraph.pRow; pRow; pRow = pNext){ + pNext = pRow->pNext; + sqlite3_free(pRow); + } + memset(&p->sGraph, 0, sizeof(p->sGraph)); +} + +/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after +** pOld, or return the first such line if pOld is NULL +*/ +static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){ + EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow; + while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext; + return pRow; +} + +/* Render a single level of the graph that has iEqpId as its parent. Called +** recursively to render sublevels. +*/ +static void eqp_render_level(ShellState *p, int iEqpId){ + EQPGraphRow *pRow, *pNext; + int n = strlen30(p->sGraph.zPrefix); + char *z; + for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){ + pNext = eqp_next_row(p, iEqpId, pRow); + z = pRow->zText; + utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, + pNext ? "|--" : "`--", z); + if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){ + memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4); + eqp_render_level(p, pRow->iEqpId); + p->sGraph.zPrefix[n] = 0; + } + } +} + +/* +** Display and reset the EXPLAIN QUERY PLAN data +*/ +static void eqp_render(ShellState *p){ + EQPGraphRow *pRow = p->sGraph.pRow; + if( pRow ){ + if( pRow->zText[0]=='-' ){ + if( pRow->pNext==0 ){ + eqp_reset(p); + return; + } + utf8_printf(p->out, "%s\n", pRow->zText+3); + p->sGraph.pRow = pRow->pNext; + sqlite3_free(pRow); + }else{ + utf8_printf(p->out, "QUERY PLAN\n"); + } + p->sGraph.zPrefix[0] = 0; + eqp_render_level(p, 0); + eqp_reset(p); + } +} + +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK +/* +** Progress handler callback. +*/ +static int progress_handler(void *pClientData) { + ShellState *p = (ShellState*)pClientData; + p->nProgress++; + if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ + raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); + if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; + if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; + return 1; + } + if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ + raw_printf(p->out, "Progress %u\n", p->nProgress); + } + return 0; +} +#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ + +/* +** This is the callback routine that the shell +** invokes for each row of a query result. +*/ +static int shell_callback( + void *pArg, + int nArg, /* Number of result columns */ + char **azArg, /* Text of each result column */ + char **azCol, /* Column names */ + int *aiType /* Column types */ +){ + int i; + ShellState *p = (ShellState*)pArg; + + if( azArg==0 ) return 0; + switch( p->cMode ){ + case MODE_Line: { + int w = 5; + if( azArg==0 ) break; + for(i=0; iw ) w = len; + } + if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator); + for(i=0; iout,"%*s = %s%s", w, azCol[i], + azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator); + } + break; + } + case MODE_Explain: + case MODE_Column: { + static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; + const int *colWidth; + int showHdr; + char *rowSep; + int nWidth; + if( p->cMode==MODE_Column ){ + colWidth = p->colWidth; + nWidth = ArraySize(p->colWidth); + showHdr = p->showHeader; + rowSep = p->rowSeparator; + }else{ + colWidth = aExplainWidths; + nWidth = ArraySize(aExplainWidths); + showHdr = 1; + rowSep = SEP_Row; + } + if( p->cnt++==0 ){ + for(i=0; inullValue); + if( wactualWidth) ){ + p->actualWidth[i] = w; + } + if( showHdr ){ + utf8_width_print(p->out, w, azCol[i]); + utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); + } + } + if( showHdr ){ + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + if( w<0 ) w = -w; + }else{ + w = 10; + } + utf8_printf(p->out,"%-*.*s%s",w,w, + "----------------------------------------------------------" + "----------------------------------------------------------", + i==nArg-1 ? rowSep : " "); + } + } + } + if( azArg==0 ) break; + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + }else{ + w = 10; + } + if( p->cMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){ + w = strlenChar(azArg[i]); + } + if( i==1 && p->aiIndent && p->pStmt ){ + if( p->iIndentnIndent ){ + utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); + } + p->iIndent++; + } + utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); + utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); + } + break; + } + case MODE_Semi: { /* .schema and .fullschema output */ + printSchemaLine(p->out, azArg[0], ";\n"); + break; + } + case MODE_Pretty: { /* .schema and .fullschema with --indent */ + char *z; + int j; + int nParen = 0; + char cEnd = 0; + char c; + int nLine = 0; + assert( nArg==1 ); + if( azArg[0]==0 ) break; + if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0 + || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0 + ){ + utf8_printf(p->out, "%s;\n", azArg[0]); + break; + } + z = sqlite3_mprintf("%s", azArg[0]); + j = 0; + for(i=0; IsSpace(z[i]); i++){} + for(; (c = z[i])!=0; i++){ + if( IsSpace(c) ){ + if( z[j-1]=='\r' ) z[j-1] = '\n'; + if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue; + }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){ + j--; + } + z[j++] = c; + } + while( j>0 && IsSpace(z[j-1]) ){ j--; } + z[j] = 0; + if( strlen30(z)>=79 ){ + for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */ + if( c==cEnd ){ + cEnd = 0; + }else if( c=='"' || c=='\'' || c=='`' ){ + cEnd = c; + }else if( c=='[' ){ + cEnd = ']'; + }else if( c=='-' && z[i+1]=='-' ){ + cEnd = '\n'; + }else if( c=='(' ){ + nParen++; + }else if( c==')' ){ + nParen--; + if( nLine>0 && nParen==0 && j>0 ){ + printSchemaLineN(p->out, z, j, "\n"); + j = 0; + } + } + z[j++] = c; + if( nParen==1 && cEnd==0 + && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1))) + ){ + if( c=='\n' ) j--; + printSchemaLineN(p->out, z, j, "\n "); + j = 0; + nLine++; + while( IsSpace(z[i+1]) ){ i++; } + } + } + z[j] = 0; + } + printSchemaLine(p->out, z, ";\n"); + sqlite3_free(z); + break; + } + case MODE_List: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,"%s%s",azCol[i], + i==nArg-1 ? p->rowSeparator : p->colSeparator); + } + } + if( azArg==0 ) break; + for(i=0; inullValue; + utf8_printf(p->out, "%s", z); + if( iout, "%s", p->colSeparator); + }else{ + utf8_printf(p->out, "%s", p->rowSeparator); + } + } + break; + } + case MODE_Html: { + if( p->cnt++==0 && p->showHeader ){ + raw_printf(p->out,""); + for(i=0; iout,""); + output_html_string(p->out, azCol[i]); + raw_printf(p->out,"\n"); + } + raw_printf(p->out,"\n"); + } + if( azArg==0 ) break; + raw_printf(p->out,""); + for(i=0; iout,""); + output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue); + raw_printf(p->out,"\n"); + } + raw_printf(p->out,"\n"); + break; + } + case MODE_Tcl: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,azCol[i] ? azCol[i] : ""); + if(iout, "%s", p->colSeparator); + } + utf8_printf(p->out, "%s", p->rowSeparator); + } + if( azArg==0 ) break; + for(i=0; iout, azArg[i] ? azArg[i] : p->nullValue); + if(iout, "%s", p->colSeparator); + } + utf8_printf(p->out, "%s", p->rowSeparator); + break; + } + case MODE_Csv: { + setBinaryMode(p->out, 1); + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout, "%s", p->rowSeparator); + } + if( nArg>0 ){ + for(i=0; iout, "%s", p->rowSeparator); + } + setTextMode(p->out, 1); + break; + } + case MODE_Insert: { + if( azArg==0 ) break; + utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); + if( p->showHeader ){ + raw_printf(p->out,"("); + for(i=0; i0 ) raw_printf(p->out, ","); + if( quoteChar(azCol[i]) ){ + char *z = sqlite3_mprintf("\"%w\"", azCol[i]); + utf8_printf(p->out, "%s", z); + sqlite3_free(z); + }else{ + raw_printf(p->out, "%s", azCol[i]); + } + } + raw_printf(p->out,")"); + } + p->cnt++; + for(i=0; iout, i>0 ? "," : " VALUES("); + if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ + utf8_printf(p->out,"NULL"); + }else if( aiType && aiType[i]==SQLITE_TEXT ){ + if( ShellHasFlag(p, SHFLG_Newlines) ){ + output_quoted_string(p->out, azArg[i]); + }else{ + output_quoted_escaped_string(p->out, azArg[i]); + } + }else if( aiType && aiType[i]==SQLITE_INTEGER ){ + utf8_printf(p->out,"%s", azArg[i]); + }else if( aiType && aiType[i]==SQLITE_FLOAT ){ + char z[50]; + double r = sqlite3_column_double(p->pStmt, i); + sqlite3_uint64 ur; + memcpy(&ur,&r,sizeof(r)); + if( ur==0x7ff0000000000000LL ){ + raw_printf(p->out, "1e999"); + }else if( ur==0xfff0000000000000LL ){ + raw_printf(p->out, "-1e999"); + }else{ + sqlite3_snprintf(50,z,"%!.20g", r); + raw_printf(p->out, "%s", z); + } + }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ + const void *pBlob = sqlite3_column_blob(p->pStmt, i); + int nBlob = sqlite3_column_bytes(p->pStmt, i); + output_hex_blob(p->out, pBlob, nBlob); + }else if( isNumber(azArg[i], 0) ){ + utf8_printf(p->out,"%s", azArg[i]); + }else if( ShellHasFlag(p, SHFLG_Newlines) ){ + output_quoted_string(p->out, azArg[i]); + }else{ + output_quoted_escaped_string(p->out, azArg[i]); + } + } + raw_printf(p->out,");\n"); + break; + } + case MODE_Quote: { + if( azArg==0 ) break; + if( p->cnt==0 && p->showHeader ){ + for(i=0; i0 ) raw_printf(p->out, ","); + output_quoted_string(p->out, azCol[i]); + } + raw_printf(p->out,"\n"); + } + p->cnt++; + for(i=0; i0 ) raw_printf(p->out, ","); + if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ + utf8_printf(p->out,"NULL"); + }else if( aiType && aiType[i]==SQLITE_TEXT ){ + output_quoted_string(p->out, azArg[i]); + }else if( aiType && aiType[i]==SQLITE_INTEGER ){ + utf8_printf(p->out,"%s", azArg[i]); + }else if( aiType && aiType[i]==SQLITE_FLOAT ){ + char z[50]; + double r = sqlite3_column_double(p->pStmt, i); + sqlite3_snprintf(50,z,"%!.20g", r); + raw_printf(p->out, "%s", z); + }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ + const void *pBlob = sqlite3_column_blob(p->pStmt, i); + int nBlob = sqlite3_column_bytes(p->pStmt, i); + output_hex_blob(p->out, pBlob, nBlob); + }else if( isNumber(azArg[i], 0) ){ + utf8_printf(p->out,"%s", azArg[i]); + }else{ + output_quoted_string(p->out, azArg[i]); + } + } + raw_printf(p->out,"\n"); + break; + } + case MODE_Ascii: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; i0 ) utf8_printf(p->out, "%s", p->colSeparator); + utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : ""); + } + utf8_printf(p->out, "%s", p->rowSeparator); + } + if( azArg==0 ) break; + for(i=0; i0 ) utf8_printf(p->out, "%s", p->colSeparator); + utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue); + } + utf8_printf(p->out, "%s", p->rowSeparator); + break; + } + case MODE_EQP: { + eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]); + break; + } + } + return 0; +} + +/* +** This is the callback routine that the SQLite library +** invokes for each row of a query result. +*/ +static int callback(void *pArg, int nArg, char **azArg, char **azCol){ + /* since we don't have type info, call the shell_callback with a NULL value */ + return shell_callback(pArg, nArg, azArg, azCol, NULL); +} + +/* +** This is the callback routine from sqlite3_exec() that appends all +** output onto the end of a ShellText object. +*/ +static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ + ShellText *p = (ShellText*)pArg; + int i; + UNUSED_PARAMETER(az); + if( azArg==0 ) return 0; + if( p->n ) appendText(p, "|", 0); + for(i=0; idb, + "SAVEPOINT selftest_init;\n" + "CREATE TABLE IF NOT EXISTS selftest(\n" + " tno INTEGER PRIMARY KEY,\n" /* Test number */ + " op TEXT,\n" /* Operator: memo run */ + " cmd TEXT,\n" /* Command text */ + " ans TEXT\n" /* Desired answer */ + ");" + "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n" + "INSERT INTO [_shell$self](rowid,op,cmd)\n" + " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n" + " 'memo','Tests generated by --init');\n" + "INSERT INTO [_shell$self]\n" + " SELECT 'run',\n" + " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql " + "FROM sqlite_master ORDER BY 2'',224))',\n" + " hex(sha3_query('SELECT type,name,tbl_name,sql " + "FROM sqlite_master ORDER BY 2',224));\n" + "INSERT INTO [_shell$self]\n" + " SELECT 'run'," + " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||" + " printf('%w',name) || '\" NOT INDEXED'',224))',\n" + " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n" + " FROM (\n" + " SELECT name FROM sqlite_master\n" + " WHERE type='table'\n" + " AND name<>'selftest'\n" + " AND coalesce(rootpage,0)>0\n" + " )\n" + " ORDER BY name;\n" + "INSERT INTO [_shell$self]\n" + " VALUES('run','PRAGMA integrity_check','ok');\n" + "INSERT INTO selftest(tno,op,cmd,ans)" + " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n" + "DROP TABLE [_shell$self];" + ,0,0,&zErrMsg); + if( zErrMsg ){ + utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + } + sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0); +} + + +/* +** Set the destination table field of the ShellState structure to +** the name of the table given. Escape any quote characters in the +** table name. +*/ +static void set_table_name(ShellState *p, const char *zName){ + int i, n; + char cQuote; + char *z; + + if( p->zDestTable ){ + free(p->zDestTable); + p->zDestTable = 0; + } + if( zName==0 ) return; + cQuote = quoteChar(zName); + n = strlen30(zName); + if( cQuote ) n += n+2; + z = p->zDestTable = malloc( n+1 ); + if( z==0 ) shell_out_of_memory(); + n = 0; + if( cQuote ) z[n++] = cQuote; + for(i=0; zName[i]; i++){ + z[n++] = zName[i]; + if( zName[i]==cQuote ) z[n++] = cQuote; + } + if( cQuote ) z[n++] = cQuote; + z[n] = 0; +} + + +/* +** Execute a query statement that will generate SQL output. Print +** the result columns, comma-separated, on a line and then add a +** semicolon terminator to the end of that line. +** +** If the number of columns is 1 and that column contains text "--" +** then write the semicolon on a separate line. That way, if a +** "--" comment occurs at the end of the statement, the comment +** won't consume the semicolon terminator. +*/ +static int run_table_dump_query( + ShellState *p, /* Query context */ + const char *zSelect /* SELECT statement to extract content */ +){ + sqlite3_stmt *pSelect; + int rc; + int nResult; + int i; + const char *z; + rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0); + if( rc!=SQLITE_OK || !pSelect ){ + utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, + sqlite3_errmsg(p->db)); + if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; + return rc; + } + rc = sqlite3_step(pSelect); + nResult = sqlite3_column_count(pSelect); + while( rc==SQLITE_ROW ){ + z = (const char*)sqlite3_column_text(pSelect, 0); + utf8_printf(p->out, "%s", z); + for(i=1; iout, ",%s", sqlite3_column_text(pSelect, i)); + } + if( z==0 ) z = ""; + while( z[0] && (z[0]!='-' || z[1]!='-') ) z++; + if( z[0] ){ + raw_printf(p->out, "\n;\n"); + }else{ + raw_printf(p->out, ";\n"); + } + rc = sqlite3_step(pSelect); + } + rc = sqlite3_finalize(pSelect); + if( rc!=SQLITE_OK ){ + utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, + sqlite3_errmsg(p->db)); + if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; + } + return rc; +} + +/* +** Allocate space and save off current error string. +*/ +static char *save_err_msg( + sqlite3 *db /* Database to query */ +){ + int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); + char *zErrMsg = sqlite3_malloc64(nErrMsg); + if( zErrMsg ){ + memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); + } + return zErrMsg; +} + +#ifdef __linux__ +/* +** Attempt to display I/O stats on Linux using /proc/PID/io +*/ +static void displayLinuxIoStats(FILE *out){ + FILE *in; + char z[200]; + sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid()); + in = fopen(z, "rb"); + if( in==0 ) return; + while( fgets(z, sizeof(z), in)!=0 ){ + static const struct { + const char *zPattern; + const char *zDesc; + } aTrans[] = { + { "rchar: ", "Bytes received by read():" }, + { "wchar: ", "Bytes sent to write():" }, + { "syscr: ", "Read() system calls:" }, + { "syscw: ", "Write() system calls:" }, + { "read_bytes: ", "Bytes read from storage:" }, + { "write_bytes: ", "Bytes written to storage:" }, + { "cancelled_write_bytes: ", "Cancelled write bytes:" }, + }; + int i; + for(i=0; i1 ){ + sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr); + }else{ + sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr); + } + raw_printf(p->out, "%-36s %s\n", zLabel, zLine); +} + +/* +** Display memory stats. +*/ +static int display_stats( + sqlite3 *db, /* Database to query */ + ShellState *pArg, /* Pointer to ShellState */ + int bReset /* True to reset the stats */ +){ + int iCur; + int iHiwtr; + FILE *out; + if( pArg==0 || pArg->out==0 ) return 0; + out = pArg->out; + + if( pArg->pStmt && (pArg->statsOn & 2) ){ + int nCol, i, x; + sqlite3_stmt *pStmt = pArg->pStmt; + char z[100]; + nCol = sqlite3_column_count(pStmt); + raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol); + for(i=0; ishellFlgs & SHFLG_Pagecache ){ + displayStatLine(pArg, "Number of Pcache Pages Used:", + "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset); + } + displayStatLine(pArg, "Number of Pcache Overflow Bytes:", + "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset); + displayStatLine(pArg, "Largest Allocation:", + "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset); + displayStatLine(pArg, "Largest Pcache Allocation:", + "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset); +#ifdef YYTRACKMAXSTACKDEPTH + displayStatLine(pArg, "Deepest Parser Stack:", + "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset); +#endif + + if( db ){ + if( pArg->shellFlgs & SHFLG_Lookaside ){ + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, + &iCur, &iHiwtr, bReset); + raw_printf(pArg->out, + "Lookaside Slots Used: %d (max %d)\n", + iCur, iHiwtr); + sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, + &iCur, &iHiwtr, bReset); + raw_printf(pArg->out, "Successful lookaside attempts: %d\n", + iHiwtr); + sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, + &iCur, &iHiwtr, bReset); + raw_printf(pArg->out, "Lookaside failures due to size: %d\n", + iHiwtr); + sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, + &iCur, &iHiwtr, bReset); + raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n", + iHiwtr); + } + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); + raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n", + iCur); + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); + raw_printf(pArg->out, "Page cache hits: %d\n", iCur); + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); + raw_printf(pArg->out, "Page cache misses: %d\n", iCur); + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1); + raw_printf(pArg->out, "Page cache writes: %d\n", iCur); + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1); + raw_printf(pArg->out, "Page cache spills: %d\n", iCur); + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); + raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n", + iCur); + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); + raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", + iCur); + } + + if( pArg->pStmt ){ + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, + bReset); + raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur); + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); + raw_printf(pArg->out, "Sort Operations: %d\n", iCur); + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset); + raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur); + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); + raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur); + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset); + raw_printf(pArg->out, "Reprepare operations: %d\n", iCur); + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset); + raw_printf(pArg->out, "Number of times run: %d\n", iCur); + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset); + raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur); + } + +#ifdef __linux__ + displayLinuxIoStats(pArg->out); +#endif + + /* Do not remove this machine readable comment: extra-stats-output-here */ + + return 0; +} + +/* +** Display scan stats. +*/ +static void display_scanstats( + sqlite3 *db, /* Database to query */ + ShellState *pArg /* Pointer to ShellState */ +){ +#ifndef SQLITE_ENABLE_STMT_SCANSTATUS + UNUSED_PARAMETER(db); + UNUSED_PARAMETER(pArg); +#else + int i, k, n, mx; + raw_printf(pArg->out, "-------- scanstats --------\n"); + mx = 0; + for(k=0; k<=mx; k++){ + double rEstLoop = 1.0; + for(i=n=0; 1; i++){ + sqlite3_stmt *p = pArg->pStmt; + sqlite3_int64 nLoop, nVisit; + double rEst; + int iSid; + const char *zExplain; + if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){ + break; + } + sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid); + if( iSid>mx ) mx = iSid; + if( iSid!=k ) continue; + if( n==0 ){ + rEstLoop = (double)nLoop; + if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k); + } + n++; + sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit); + sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst); + sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain); + utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain); + rEstLoop *= rEst; + raw_printf(pArg->out, + " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n", + nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst + ); + } + } + raw_printf(pArg->out, "---------------------------\n"); +#endif +} + +/* +** Parameter azArray points to a zero-terminated array of strings. zStr +** points to a single nul-terminated string. Return non-zero if zStr +** is equal, according to strcmp(), to any of the strings in the array. +** Otherwise, return zero. +*/ +static int str_in_array(const char *zStr, const char **azArray){ + int i; + for(i=0; azArray[i]; i++){ + if( 0==strcmp(zStr, azArray[i]) ) return 1; + } + return 0; +} + +/* +** If compiled statement pSql appears to be an EXPLAIN statement, allocate +** and populate the ShellState.aiIndent[] array with the number of +** spaces each opcode should be indented before it is output. +** +** The indenting rules are: +** +** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent +** all opcodes that occur between the p2 jump destination and the opcode +** itself by 2 spaces. +** +** * For each "Goto", if the jump destination is earlier in the program +** and ends on one of: +** Yield SeekGt SeekLt RowSetRead Rewind +** or if the P1 parameter is one instead of zero, +** then indent all opcodes between the earlier instruction +** and "Goto" by 2 spaces. +*/ +static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){ + const char *zSql; /* The text of the SQL statement */ + const char *z; /* Used to check if this is an EXPLAIN */ + int *abYield = 0; /* True if op is an OP_Yield */ + int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ + int iOp; /* Index of operation in p->aiIndent[] */ + + const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; + const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", + "Rewind", 0 }; + const char *azGoto[] = { "Goto", 0 }; + + /* Try to figure out if this is really an EXPLAIN statement. If this + ** cannot be verified, return early. */ + if( sqlite3_column_count(pSql)!=8 ){ + p->cMode = p->mode; + return; + } + zSql = sqlite3_sql(pSql); + if( zSql==0 ) return; + for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++); + if( sqlite3_strnicmp(z, "explain", 7) ){ + p->cMode = p->mode; + return; + } + + for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){ + int i; + int iAddr = sqlite3_column_int(pSql, 0); + const char *zOp = (const char*)sqlite3_column_text(pSql, 1); + + /* Set p2 to the P2 field of the current opcode. Then, assuming that + ** p2 is an instruction address, set variable p2op to the index of that + ** instruction in the aiIndent[] array. p2 and p2op may be different if + ** the current instruction is part of a sub-program generated by an + ** SQL trigger or foreign key. */ + int p2 = sqlite3_column_int(pSql, 3); + int p2op = (p2 + (iOp-iAddr)); + + /* Grow the p->aiIndent array as required */ + if( iOp>=nAlloc ){ + if( iOp==0 ){ + /* Do further verfication that this is explain output. Abort if + ** it is not */ + static const char *explainCols[] = { + "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" }; + int jj; + for(jj=0; jjcMode = p->mode; + sqlite3_reset(pSql); + return; + } + } + } + nAlloc += 100; + p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); + if( p->aiIndent==0 ) shell_out_of_memory(); + abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); + if( abYield==0 ) shell_out_of_memory(); + } + abYield[iOp] = str_in_array(zOp, azYield); + p->aiIndent[iOp] = 0; + p->nIndent = iOp+1; + + if( str_in_array(zOp, azNext) ){ + for(i=p2op; iaiIndent[i] += 2; + } + if( str_in_array(zOp, azGoto) && p2opnIndent + && (abYield[p2op] || sqlite3_column_int(pSql, 2)) + ){ + for(i=p2op; iaiIndent[i] += 2; + } + } + + p->iIndent = 0; + sqlite3_free(abYield); + sqlite3_reset(pSql); +} + +/* +** Free the array allocated by explain_data_prepare(). +*/ +static void explain_data_delete(ShellState *p){ + sqlite3_free(p->aiIndent); + p->aiIndent = 0; + p->nIndent = 0; + p->iIndent = 0; +} + +/* +** Disable and restore .wheretrace and .selecttrace settings. +*/ +#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) +extern int sqlite3SelectTrace; +static int savedSelectTrace; +#endif +#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) +extern int sqlite3WhereTrace; +static int savedWhereTrace; +#endif +static void disable_debug_trace_modes(void){ +#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) + savedSelectTrace = sqlite3SelectTrace; + sqlite3SelectTrace = 0; +#endif +#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) + savedWhereTrace = sqlite3WhereTrace; + sqlite3WhereTrace = 0; +#endif +} +static void restore_debug_trace_modes(void){ +#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) + sqlite3SelectTrace = savedSelectTrace; +#endif +#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) + sqlite3WhereTrace = savedWhereTrace; +#endif +} + +/* Create the TEMP table used to store parameter bindings */ +static void bind_table_init(ShellState *p){ + int wrSchema = 0; + int defensiveMode = 0; + sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode); + sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0); + sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema); + sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0); + sqlite3_exec(p->db, + "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n" + " key TEXT PRIMARY KEY,\n" + " value ANY\n" + ") WITHOUT ROWID;", + 0, 0, 0); + sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0); + sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0); +} + +/* +** Bind parameters on a prepared statement. +** +** Parameter bindings are taken from a TEMP table of the form: +** +** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value) +** WITHOUT ROWID; +** +** No bindings occur if this table does not exist. The name of the table +** begins with "sqlite_" so that it will not collide with ordinary application +** tables. The table must be in the TEMP schema. +*/ +static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ + int nVar; + int i; + int rc; + sqlite3_stmt *pQ = 0; + + nVar = sqlite3_bind_parameter_count(pStmt); + if( nVar==0 ) return; /* Nothing to do */ + if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters", + "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){ + return; /* Parameter table does not exist */ + } + rc = sqlite3_prepare_v2(pArg->db, + "SELECT value FROM temp.sqlite_parameters" + " WHERE key=?1", -1, &pQ, 0); + if( rc || pQ==0 ) return; + for(i=1; i<=nVar; i++){ + char zNum[30]; + const char *zVar = sqlite3_bind_parameter_name(pStmt, i); + if( zVar==0 ){ + sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i); + zVar = zNum; + } + sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC); + if( sqlite3_step(pQ)==SQLITE_ROW ){ + sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0)); + }else{ + sqlite3_bind_null(pStmt, i); + } + sqlite3_reset(pQ); + } + sqlite3_finalize(pQ); +} + +/* +** Run a prepared statement +*/ +static void exec_prepared_stmt( + ShellState *pArg, /* Pointer to ShellState */ + sqlite3_stmt *pStmt /* Statment to run */ +){ + int rc; + + /* perform the first step. this will tell us if we + ** have a result set or not and how wide it is. + */ + rc = sqlite3_step(pStmt); + /* if we have a result set... */ + if( SQLITE_ROW == rc ){ + /* allocate space for col name ptr, value ptr, and type */ + int nCol = sqlite3_column_count(pStmt); + void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); + if( !pData ){ + rc = SQLITE_NOMEM; + }else{ + char **azCols = (char **)pData; /* Names of result columns */ + char **azVals = &azCols[nCol]; /* Results */ + int *aiTypes = (int *)&azVals[nCol]; /* Result types */ + int i, x; + assert(sizeof(int) <= sizeof(char *)); + /* save off ptrs to column names */ + for(i=0; icMode==MODE_Insert ){ + azVals[i] = ""; + }else{ + azVals[i] = (char*)sqlite3_column_text(pStmt, i); + } + if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ + rc = SQLITE_NOMEM; + break; /* from for */ + } + } /* end for */ + + /* if data and types extracted successfully... */ + if( SQLITE_ROW == rc ){ + /* call the supplied callback with the result row data */ + if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){ + rc = SQLITE_ABORT; + }else{ + rc = sqlite3_step(pStmt); + } + } + } while( SQLITE_ROW == rc ); + sqlite3_free(pData); + } + } +} + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** This function is called to process SQL if the previous shell command +** was ".expert". It passes the SQL in the second argument directly to +** the sqlite3expert object. +** +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error +** code. In this case, (*pzErr) may be set to point to a buffer containing +** an English language error message. It is the responsibility of the +** caller to eventually free this buffer using sqlite3_free(). +*/ +static int expertHandleSQL( + ShellState *pState, + const char *zSql, + char **pzErr +){ + assert( pState->expert.pExpert ); + assert( pzErr==0 || *pzErr==0 ); + return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr); +} + +/* +** This function is called either to silently clean up the object +** created by the ".expert" command (if bCancel==1), or to generate a +** report from it and then clean it up (if bCancel==0). +** +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error +** code. In this case, (*pzErr) may be set to point to a buffer containing +** an English language error message. It is the responsibility of the +** caller to eventually free this buffer using sqlite3_free(). +*/ +static int expertFinish( + ShellState *pState, + int bCancel, + char **pzErr +){ + int rc = SQLITE_OK; + sqlite3expert *p = pState->expert.pExpert; + assert( p ); + assert( bCancel || pzErr==0 || *pzErr==0 ); + if( bCancel==0 ){ + FILE *out = pState->out; + int bVerbose = pState->expert.bVerbose; + + rc = sqlite3_expert_analyze(p, pzErr); + if( rc==SQLITE_OK ){ + int nQuery = sqlite3_expert_count(p); + int i; + + if( bVerbose ){ + const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES); + raw_printf(out, "-- Candidates -----------------------------\n"); + raw_printf(out, "%s\n", zCand); + } + for(i=0; iexpert.pExpert = 0; + return rc; +} + +/* +** Implementation of ".expert" dot command. +*/ +static int expertDotCommand( + ShellState *pState, /* Current shell tool state */ + char **azArg, /* Array of arguments passed to dot command */ + int nArg /* Number of entries in azArg[] */ +){ + int rc = SQLITE_OK; + char *zErr = 0; + int i; + int iSample = 0; + + assert( pState->expert.pExpert==0 ); + memset(&pState->expert, 0, sizeof(ExpertInfo)); + + for(i=1; rc==SQLITE_OK && i=2 && 0==strncmp(z, "-verbose", n) ){ + pState->expert.bVerbose = 1; + } + else if( n>=2 && 0==strncmp(z, "-sample", n) ){ + if( i==(nArg-1) ){ + raw_printf(stderr, "option requires an argument: %s\n", z); + rc = SQLITE_ERROR; + }else{ + iSample = (int)integerValue(azArg[++i]); + if( iSample<0 || iSample>100 ){ + raw_printf(stderr, "value out of range: %s\n", azArg[i]); + rc = SQLITE_ERROR; + } + } + } + else{ + raw_printf(stderr, "unknown option: %s\n", z); + rc = SQLITE_ERROR; + } + } + + if( rc==SQLITE_OK ){ + pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr); + if( pState->expert.pExpert==0 ){ + raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr); + rc = SQLITE_ERROR; + }else{ + sqlite3_expert_config( + pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample + ); + } + } + + return rc; +} +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + +/* +** Execute a statement or set of statements. Print +** any result rows/columns depending on the current mode +** set via the supplied callback. +** +** This is very similar to SQLite's built-in sqlite3_exec() +** function except it takes a slightly different callback +** and callback data argument. +*/ +static int shell_exec( + ShellState *pArg, /* Pointer to ShellState */ + const char *zSql, /* SQL to be evaluated */ + char **pzErrMsg /* Error msg written here */ +){ + sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ + int rc = SQLITE_OK; /* Return Code */ + int rc2; + const char *zLeftover; /* Tail of unprocessed SQL */ + sqlite3 *db = pArg->db; + + if( pzErrMsg ){ + *pzErrMsg = NULL; + } + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pArg->expert.pExpert ){ + rc = expertHandleSQL(pArg, zSql, pzErrMsg); + return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg); + } +#endif + + while( zSql[0] && (SQLITE_OK == rc) ){ + static const char *zStmtSql; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); + if( SQLITE_OK != rc ){ + if( pzErrMsg ){ + *pzErrMsg = save_err_msg(db); + } + }else{ + if( !pStmt ){ + /* this happens for a comment or white-space */ + zSql = zLeftover; + while( IsSpace(zSql[0]) ) zSql++; + continue; + } + zStmtSql = sqlite3_sql(pStmt); + if( zStmtSql==0 ) zStmtSql = ""; + while( IsSpace(zStmtSql[0]) ) zStmtSql++; + + /* save off the prepared statment handle and reset row count */ + if( pArg ){ + pArg->pStmt = pStmt; + pArg->cnt = 0; + } + + /* echo the sql statement if echo on */ + if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){ + utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); + } + + /* Show the EXPLAIN QUERY PLAN if .eqp is on */ + if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){ + sqlite3_stmt *pExplain; + char *zEQP; + int triggerEQP = 0; + disable_debug_trace_modes(); + sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP); + if( pArg->autoEQP>=AUTOEQP_trigger ){ + sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0); + } + zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql); + rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); + if( rc==SQLITE_OK ){ + while( sqlite3_step(pExplain)==SQLITE_ROW ){ + const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3); + int iEqpId = sqlite3_column_int(pExplain, 0); + int iParentId = sqlite3_column_int(pExplain, 1); + if( zEQPLine==0 ) zEQPLine = ""; + if( zEQPLine[0]=='-' ) eqp_render(pArg); + eqp_append(pArg, iEqpId, iParentId, zEQPLine); + } + eqp_render(pArg); + } + sqlite3_finalize(pExplain); + sqlite3_free(zEQP); + if( pArg->autoEQP>=AUTOEQP_full ){ + /* Also do an EXPLAIN for ".eqp full" mode */ + zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql); + rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); + if( rc==SQLITE_OK ){ + pArg->cMode = MODE_Explain; + explain_data_prepare(pArg, pExplain); + exec_prepared_stmt(pArg, pExplain); + explain_data_delete(pArg); + } + sqlite3_finalize(pExplain); + sqlite3_free(zEQP); + } + if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){ + sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0); + /* Reprepare pStmt before reactiving trace modes */ + sqlite3_finalize(pStmt); + sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( pArg ) pArg->pStmt = pStmt; + } + restore_debug_trace_modes(); + } + + if( pArg ){ + pArg->cMode = pArg->mode; + if( pArg->autoExplain ){ + if( sqlite3_stmt_isexplain(pStmt)==1 ){ + pArg->cMode = MODE_Explain; + } + if( sqlite3_stmt_isexplain(pStmt)==2 ){ + pArg->cMode = MODE_EQP; + } + } + + /* If the shell is currently in ".explain" mode, gather the extra + ** data required to add indents to the output.*/ + if( pArg->cMode==MODE_Explain ){ + explain_data_prepare(pArg, pStmt); + } + } + + bind_prepared_stmt(pArg, pStmt); + exec_prepared_stmt(pArg, pStmt); + explain_data_delete(pArg); + eqp_render(pArg); + + /* print usage stats if stats on */ + if( pArg && pArg->statsOn ){ + display_stats(db, pArg, 0); + } + + /* print loop-counters if required */ + if( pArg && pArg->scanstatsOn ){ + display_scanstats(db, pArg); + } + + /* Finalize the statement just executed. If this fails, save a + ** copy of the error message. Otherwise, set zSql to point to the + ** next statement to execute. */ + rc2 = sqlite3_finalize(pStmt); + if( rc!=SQLITE_NOMEM ) rc = rc2; + if( rc==SQLITE_OK ){ + zSql = zLeftover; + while( IsSpace(zSql[0]) ) zSql++; + }else if( pzErrMsg ){ + *pzErrMsg = save_err_msg(db); + } + + /* clear saved stmt handle */ + if( pArg ){ + pArg->pStmt = NULL; + } + } + } /* end while */ + + return rc; +} + +/* +** Release memory previously allocated by tableColumnList(). +*/ +static void freeColumnList(char **azCol){ + int i; + for(i=1; azCol[i]; i++){ + sqlite3_free(azCol[i]); + } + /* azCol[0] is a static string */ + sqlite3_free(azCol); +} + +/* +** Return a list of pointers to strings which are the names of all +** columns in table zTab. The memory to hold the names is dynamically +** allocated and must be released by the caller using a subsequent call +** to freeColumnList(). +** +** The azCol[0] entry is usually NULL. However, if zTab contains a rowid +** value that needs to be preserved, then azCol[0] is filled in with the +** name of the rowid column. +** +** The first regular column in the table is azCol[1]. The list is terminated +** by an entry with azCol[i]==0. +*/ +static char **tableColumnList(ShellState *p, const char *zTab){ + char **azCol = 0; + sqlite3_stmt *pStmt; + char *zSql; + int nCol = 0; + int nAlloc = 0; + int nPK = 0; /* Number of PRIMARY KEY columns seen */ + int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */ + int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid); + int rc; + + zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rc ) return 0; + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + if( nCol>=nAlloc-2 ){ + nAlloc = nAlloc*2 + nCol + 10; + azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); + if( azCol==0 ) shell_out_of_memory(); + } + azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); + if( sqlite3_column_int(pStmt, 5) ){ + nPK++; + if( nPK==1 + && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), + "INTEGER")==0 + ){ + isIPK = 1; + }else{ + isIPK = 0; + } + } + } + sqlite3_finalize(pStmt); + if( azCol==0 ) return 0; + azCol[0] = 0; + azCol[nCol+1] = 0; + + /* The decision of whether or not a rowid really needs to be preserved + ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table + ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve + ** rowids on tables where the rowid is inaccessible because there are other + ** columns in the table named "rowid", "_rowid_", and "oid". + */ + if( preserveRowid && isIPK ){ + /* If a single PRIMARY KEY column with type INTEGER was seen, then it + ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID + ** table or a INTEGER PRIMARY KEY DESC column, neither of which are + ** ROWID aliases. To distinguish these cases, check to see if + ** there is a "pk" entry in "PRAGMA index_list". There will be + ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID. + */ + zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)" + " WHERE origin='pk'", zTab); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rc ){ + freeColumnList(azCol); + return 0; + } + rc = sqlite3_step(pStmt); + sqlite3_finalize(pStmt); + preserveRowid = rc==SQLITE_ROW; + } + if( preserveRowid ){ + /* Only preserve the rowid if we can find a name to use for the + ** rowid */ + static char *azRowid[] = { "rowid", "_rowid_", "oid" }; + int i, j; + for(j=0; j<3; j++){ + for(i=1; i<=nCol; i++){ + if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break; + } + if( i>nCol ){ + /* At this point, we know that azRowid[j] is not the name of any + ** ordinary column in the table. Verify that azRowid[j] is a valid + ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID + ** tables will fail this last check */ + rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0); + if( rc==SQLITE_OK ) azCol[0] = azRowid[j]; + break; + } + } + } + return azCol; +} + +/* +** Toggle the reverse_unordered_selects setting. +*/ +static void toggleSelectOrder(sqlite3 *db){ + sqlite3_stmt *pStmt = 0; + int iSetting = 0; + char zStmt[100]; + sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0); + if( sqlite3_step(pStmt)==SQLITE_ROW ){ + iSetting = sqlite3_column_int(pStmt, 0); + } + sqlite3_finalize(pStmt); + sqlite3_snprintf(sizeof(zStmt), zStmt, + "PRAGMA reverse_unordered_selects(%d)", !iSetting); + sqlite3_exec(db, zStmt, 0, 0, 0); +} + +/* +** This is a different callback routine used for dumping the database. +** Each row received by this callback consists of a table name, +** the table type ("index" or "table") and SQL to create the table. +** This routine should print text sufficient to recreate the table. +*/ +static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ + int rc; + const char *zTable; + const char *zType; + const char *zSql; + ShellState *p = (ShellState *)pArg; + + UNUSED_PARAMETER(azNotUsed); + if( nArg!=3 || azArg==0 ) return 0; + zTable = azArg[0]; + zType = azArg[1]; + zSql = azArg[2]; + + if( strcmp(zTable, "sqlite_sequence")==0 ){ + raw_printf(p->out, "DELETE FROM sqlite_sequence;\n"); + }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){ + raw_printf(p->out, "ANALYZE sqlite_master;\n"); + }else if( strncmp(zTable, "sqlite_", 7)==0 ){ + return 0; + }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ + char *zIns; + if( !p->writableSchema ){ + raw_printf(p->out, "PRAGMA writable_schema=ON;\n"); + p->writableSchema = 1; + } + zIns = sqlite3_mprintf( + "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)" + "VALUES('table','%q','%q',0,'%q');", + zTable, zTable, zSql); + utf8_printf(p->out, "%s\n", zIns); + sqlite3_free(zIns); + return 0; + }else{ + printSchemaLine(p->out, zSql, ";\n"); + } + + if( strcmp(zType, "table")==0 ){ + ShellText sSelect; + ShellText sTable; + char **azCol; + int i; + char *savedDestTable; + int savedMode; + + azCol = tableColumnList(p, zTable); + if( azCol==0 ){ + p->nErr++; + return 0; + } + + /* Always quote the table name, even if it appears to be pure ascii, + ** in case it is a keyword. Ex: INSERT INTO "table" ... */ + initText(&sTable); + appendText(&sTable, zTable, quoteChar(zTable)); + /* If preserving the rowid, add a column list after the table name. + ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" + ** instead of the usual "INSERT INTO tab VALUES(...)". + */ + if( azCol[0] ){ + appendText(&sTable, "(", 0); + appendText(&sTable, azCol[0], 0); + for(i=1; azCol[i]; i++){ + appendText(&sTable, ",", 0); + appendText(&sTable, azCol[i], quoteChar(azCol[i])); + } + appendText(&sTable, ")", 0); + } + + /* Build an appropriate SELECT statement */ + initText(&sSelect); + appendText(&sSelect, "SELECT ", 0); + if( azCol[0] ){ + appendText(&sSelect, azCol[0], 0); + appendText(&sSelect, ",", 0); + } + for(i=1; azCol[i]; i++){ + appendText(&sSelect, azCol[i], quoteChar(azCol[i])); + if( azCol[i+1] ){ + appendText(&sSelect, ",", 0); + } + } + freeColumnList(azCol); + appendText(&sSelect, " FROM ", 0); + appendText(&sSelect, zTable, quoteChar(zTable)); + + savedDestTable = p->zDestTable; + savedMode = p->mode; + p->zDestTable = sTable.z; + p->mode = p->cMode = MODE_Insert; + rc = shell_exec(p, sSelect.z, 0); + if( (rc&0xff)==SQLITE_CORRUPT ){ + raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); + toggleSelectOrder(p->db); + shell_exec(p, sSelect.z, 0); + toggleSelectOrder(p->db); + } + p->zDestTable = savedDestTable; + p->mode = savedMode; + freeText(&sTable); + freeText(&sSelect); + if( rc ) p->nErr++; + } + return 0; +} + +/* +** Run zQuery. Use dump_callback() as the callback routine so that +** the contents of the query are output as SQL statements. +** +** If we get a SQLITE_CORRUPT error, rerun the query after appending +** "ORDER BY rowid DESC" to the end. +*/ +static int run_schema_dump_query( + ShellState *p, + const char *zQuery +){ + int rc; + char *zErr = 0; + rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); + if( rc==SQLITE_CORRUPT ){ + char *zQ2; + int len = strlen30(zQuery); + raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); + if( zErr ){ + utf8_printf(p->out, "/****** %s ******/\n", zErr); + sqlite3_free(zErr); + zErr = 0; + } + zQ2 = malloc( len+100 ); + if( zQ2==0 ) return rc; + sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery); + rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); + if( rc ){ + utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr); + }else{ + rc = SQLITE_CORRUPT; + } + sqlite3_free(zErr); + free(zQ2); + } + return rc; +} + +/* +** Text of help messages. +** +** The help text for each individual command begins with a line that starts +** with ".". Subsequent lines are supplimental information. +** +** There must be two or more spaces between the end of the command and the +** start of the description of what that command does. +*/ +static const char *(azHelp[]) = { +#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) + ".archive ... Manage SQL archives", + " Each command must have exactly one of the following options:", + " -c, --create Create a new archive", + " -u, --update Add or update files with changed mtime", + " -i, --insert Like -u but always add even if unchanged", + " -t, --list List contents of archive", + " -x, --extract Extract files from archive", + " Optional arguments:", + " -v, --verbose Print each filename as it is processed", + " -f FILE, --file FILE Use archive FILE (default is current db)", + " -a FILE, --append FILE Open FILE using the apndvfs VFS", + " -C DIR, --directory DIR Read/extract files from directory DIR", + " -n, --dryrun Show the SQL that would have occurred", + " Examples:", + " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar", + " .ar -tf ARCHIVE # List members of ARCHIVE", + " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE", + " See also:", + " http://sqlite.org/cli.html#sqlar_archive_support", +#endif +#ifndef SQLITE_OMIT_AUTHORIZATION + ".auth ON|OFF Show authorizer callbacks", +#endif + ".backup ?DB? FILE Backup DB (default \"main\") to FILE", + " --append Use the appendvfs", + " --async Write to FILE without journal and fsync()", + ".bail on|off Stop after hitting an error. Default OFF", + ".binary on|off Turn binary output on or off. Default OFF", + ".cd DIRECTORY Change the working directory to DIRECTORY", + ".changes on|off Show number of rows changed by SQL", + ".check GLOB Fail if output since .testcase does not match", + ".clone NEWDB Clone data into NEWDB from the existing database", + ".databases List names and files of attached databases", + ".dbconfig ?op? ?val? List or change sqlite3_db_config() options", + ".dbinfo ?DB? Show status information about the database", + ".dump ?TABLE? Render database content as SQL", + " Options:", + " --preserve-rowids Include ROWID values in the output", + " --newlines Allow unescaped newline characters in output", + " TABLE is a LIKE pattern for the tables to dump", + " Additional LIKE patterns can be given in subsequent arguments", + ".echo on|off Turn command echo on or off", + ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", + " Other Modes:", +#ifdef SQLITE_DEBUG + " test Show raw EXPLAIN QUERY PLAN output", + " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"", +#endif + " trigger Like \"full\" but also show trigger bytecode", + ".excel Display the output of next command in spreadsheet", + " --bom Put a UTF8 byte-order mark on intermediate file", + ".exit ?CODE? Exit this program with return-code CODE", + ".expert EXPERIMENTAL. Suggest indexes for queries", + ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", + ".filectrl CMD ... Run various sqlite3_file_control() operations", + " --schema SCHEMA Use SCHEMA instead of \"main\"", + " --help Show CMD details", + ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", + ".headers on|off Turn display of headers on or off", + ".help ?-all? ?PATTERN? Show help text for PATTERN", + ".import FILE TABLE Import data from FILE into TABLE", + " Options:", + " --ascii Use \\037 and \\036 as column and row separators", + " --csv Use , and \\n as column and row separators", + " --skip N Skip the first N rows of input", + " -v \"Verbose\" - increase auxiliary output", + " Notes:", + " * If TABLE does not exist, it is created. The first row of input", + " determines the column names.", + " * If neither --csv or --ascii are used, the input mode is derived", + " from the \".mode\" output mode", + " * If FILE begins with \"|\" then it is a command that generates the", + " input text.", +#ifndef SQLITE_OMIT_TEST_CONTROL + ".imposter INDEX TABLE Create imposter table TABLE on index INDEX", +#endif + ".indexes ?TABLE? Show names of indexes", + " If TABLE is specified, only show indexes for", + " tables matching TABLE using the LIKE operator.", +#ifdef SQLITE_ENABLE_IOTRACE + ".iotrace FILE Enable I/O diagnostic logging to FILE", +#endif + ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT", + ".lint OPTIONS Report potential schema issues.", + " Options:", + " fkey-indexes Find missing foreign key indexes", +#ifndef SQLITE_OMIT_LOAD_EXTENSION + ".load FILE ?ENTRY? Load an extension library", +#endif + ".log FILE|off Turn logging on or off. FILE can be stderr/stdout", + ".mode MODE ?TABLE? Set output mode", + " MODE is one of:", + " ascii Columns/rows delimited by 0x1F and 0x1E", + " csv Comma-separated values", + " column Left-aligned columns. (See .width)", + " html HTML code", + " insert SQL insert statements for TABLE", + " line One value per line", + " list Values delimited by \"|\"", + " quote Escape answers as for SQL", + " tabs Tab-separated values", + " tcl TCL list elements", + ".nullvalue STRING Use STRING in place of NULL values", + ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", + " If FILE begins with '|' then open as a pipe", + " --bom Put a UTF8 byte-order mark at the beginning", + " -e Send output to the system text editor", + " -x Send output as CSV to a spreadsheet (same as \".excel\")", +#ifdef SQLITE_DEBUG + ".oom [--repeat M] [N] Simulate an OOM error on the N-th allocation", +#endif + ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", + " Options:", + " --append Use appendvfs to append database to the end of FILE", +#ifdef SQLITE_ENABLE_DESERIALIZE + " --deserialize Load into memory useing sqlite3_deserialize()", + " --hexdb Load the output of \"dbtotxt\" as an in-memory db", + " --maxsize N Maximum size for --hexdb or --deserialized database", +#endif + " --new Initialize FILE to an empty database", + " --nofollow Do not follow symbolic links", + " --readonly Open FILE readonly", + " --zip FILE is a ZIP archive", + ".output ?FILE? Send output to FILE or stdout if FILE is omitted", + " If FILE begins with '|' then open it as a pipe.", + " Options:", + " --bom Prefix output with a UTF8 byte-order mark", + " -e Send output to the system text editor", + " -x Send output as CSV to a spreadsheet", + ".parameter CMD ... Manage SQL parameter bindings", + " clear Erase all bindings", + " init Initialize the TEMP table that holds bindings", + " list List the current parameter bindings", + " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", + " PARAMETER should start with one of: $ : @ ?", + " unset PARAMETER Remove PARAMETER from the binding table", + ".print STRING... Print literal STRING", +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + ".progress N Invoke progress handler after every N opcodes", + " --limit N Interrupt after N progress callbacks", + " --once Do no more than one progress interrupt", + " --quiet|-q No output except at interrupts", + " --reset Reset the count for each input and interrupt", +#endif + ".prompt MAIN CONTINUE Replace the standard prompts", + ".quit Exit this program", + ".read FILE Read input from FILE", +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) + ".recover Recover as much data as possible from corrupt db.", + " --freelist-corrupt Assume the freelist is corrupt", + " --recovery-db NAME Store recovery metadata in database file NAME", + " --lost-and-found TABLE Alternative name for the lost-and-found table", + " --no-rowids Do not attempt to recover rowid values", + " that are not also INTEGER PRIMARY KEYs", +#endif + ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", + ".save FILE Write in-memory database into FILE", + ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off", + ".schema ?PATTERN? Show the CREATE statements matching PATTERN", + " Options:", + " --indent Try to pretty-print the schema", + ".selftest ?OPTIONS? Run tests defined in the SELFTEST table", + " Options:", + " --init Create a new SELFTEST table", + " -v Verbose output", + ".separator COL ?ROW? Change the column and row separators", +#if defined(SQLITE_ENABLE_SESSION) + ".session ?NAME? CMD ... Create or control sessions", + " Subcommands:", + " attach TABLE Attach TABLE", + " changeset FILE Write a changeset into FILE", + " close Close one session", + " enable ?BOOLEAN? Set or query the enable bit", + " filter GLOB... Reject tables matching GLOBs", + " indirect ?BOOLEAN? Mark or query the indirect status", + " isempty Query whether the session is empty", + " list List currently open session names", + " open DB NAME Open a new session on DB", + " patchset FILE Write a patchset into FILE", + " If ?NAME? is omitted, the first defined session is used.", +#endif + ".sha3sum ... Compute a SHA3 hash of database content", + " Options:", + " --schema Also hash the sqlite_master table", + " --sha3-224 Use the sha3-224 algorithm", + " --sha3-256 Use the sha3-256 algorithm (default)", + " --sha3-384 Use the sha3-384 algorithm", + " --sha3-512 Use the sha3-512 algorithm", + " Any other argument is a LIKE pattern for tables to hash", +#ifndef SQLITE_NOHAVE_SYSTEM + ".shell CMD ARGS... Run CMD ARGS... in a system shell", +#endif + ".show Show the current values for various settings", + ".stats ?on|off? Show stats or turn stats on or off", +#ifndef SQLITE_NOHAVE_SYSTEM + ".system CMD ARGS... Run CMD ARGS... in a system shell", +#endif + ".tables ?TABLE? List names of tables matching LIKE pattern TABLE", + ".testcase NAME Begin redirecting output to 'testcase-out.txt'", + ".testctrl CMD ... Run various sqlite3_test_control() operations", + " Run \".testctrl\" with no arguments for details", + ".timeout MS Try opening locked tables for MS milliseconds", + ".timer on|off Turn SQL timer on or off", +#ifndef SQLITE_OMIT_TRACE + ".trace ?OPTIONS? Output each SQL statement as it is run", + " FILE Send output to FILE", + " stdout Send output to stdout", + " stderr Send output to stderr", + " off Disable tracing", + " --expanded Expand query parameters", +#ifdef SQLITE_ENABLE_NORMALIZE + " --normalized Normal the SQL statements", +#endif + " --plain Show SQL as it is input", + " --stmt Trace statement execution (SQLITE_TRACE_STMT)", + " --profile Profile statements (SQLITE_TRACE_PROFILE)", + " --row Trace each row (SQLITE_TRACE_ROW)", + " --close Trace connection close (SQLITE_TRACE_CLOSE)", +#endif /* SQLITE_OMIT_TRACE */ +#ifdef SQLITE_DEBUG + ".unmodule NAME ... Unregister virtual table modules", + " --allexcept Unregister everything except those named", +#endif + ".vfsinfo ?AUX? Information about the top-level VFS", + ".vfslist List all available VFSes", + ".vfsname ?AUX? Print the name of the VFS stack", + ".width NUM1 NUM2 ... Set column widths for \"column\" mode", + " Negative values right-justify", +}; + +/* +** Output help text. +** +** zPattern describes the set of commands for which help text is provided. +** If zPattern is NULL, then show all commands, but only give a one-line +** description of each. +** +** Return the number of matches. +*/ +static int showHelp(FILE *out, const char *zPattern){ + int i = 0; + int j = 0; + int n = 0; + char *zPat; + if( zPattern==0 + || zPattern[0]=='0' + || strcmp(zPattern,"-a")==0 + || strcmp(zPattern,"-all")==0 + || strcmp(zPattern,"--all")==0 + ){ + /* Show all commands, but only one line per command */ + if( zPattern==0 ) zPattern = ""; + for(i=0; ip); + sqlite3_free(pSession->zName); + for(i=0; inFilter; i++){ + sqlite3_free(pSession->azFilter[i]); + } + sqlite3_free(pSession->azFilter); + memset(pSession, 0, sizeof(OpenSession)); +} +#endif + +/* +** Close all OpenSession objects and release all associated resources. +*/ +#if defined(SQLITE_ENABLE_SESSION) +static void session_close_all(ShellState *p){ + int i; + for(i=0; inSession; i++){ + session_close(&p->aSession[i]); + } + p->nSession = 0; +} +#else +# define session_close_all(X) +#endif + +/* +** Implementation of the xFilter function for an open session. Omit +** any tables named by ".session filter" but let all other table through. +*/ +#if defined(SQLITE_ENABLE_SESSION) +static int session_filter(void *pCtx, const char *zTab){ + OpenSession *pSession = (OpenSession*)pCtx; + int i; + for(i=0; inFilter; i++){ + if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0; + } + return 1; +} +#endif + +/* +** Try to deduce the type of file for zName based on its content. Return +** one of the SHELL_OPEN_* constants. +** +** If the file does not exist or is empty but its name looks like a ZIP +** archive and the dfltZip flag is true, then assume it is a ZIP archive. +** Otherwise, assume an ordinary database regardless of the filename if +** the type cannot be determined from content. +*/ +int deduceDatabaseType(const char *zName, int dfltZip){ + FILE *f = fopen(zName, "rb"); + size_t n; + int rc = SHELL_OPEN_UNSPEC; + char zBuf[100]; + if( f==0 ){ + if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ + return SHELL_OPEN_ZIPFILE; + }else{ + return SHELL_OPEN_NORMAL; + } + } + n = fread(zBuf, 16, 1, f); + if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){ + fclose(f); + return SHELL_OPEN_NORMAL; + } + fseek(f, -25, SEEK_END); + n = fread(zBuf, 25, 1, f); + if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){ + rc = SHELL_OPEN_APPENDVFS; + }else{ + fseek(f, -22, SEEK_END); + n = fread(zBuf, 22, 1, f); + if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05 + && zBuf[3]==0x06 ){ + rc = SHELL_OPEN_ZIPFILE; + }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ + rc = SHELL_OPEN_ZIPFILE; + } + } + fclose(f); + return rc; +} + +#ifdef SQLITE_ENABLE_DESERIALIZE +/* +** Reconstruct an in-memory database using the output from the "dbtotxt" +** program. Read content from the file in p->zDbFilename. If p->zDbFilename +** is 0, then read from standard input. +*/ +static unsigned char *readHexDb(ShellState *p, int *pnData){ + unsigned char *a = 0; + int nLine; + int n = 0; + int pgsz = 0; + int iOffset = 0; + int j, k; + int rc; + FILE *in; + unsigned int x[16]; + char zLine[1000]; + if( p->zDbFilename ){ + in = fopen(p->zDbFilename, "r"); + if( in==0 ){ + utf8_printf(stderr, "cannot open \"%s\" for reading\n", p->zDbFilename); + return 0; + } + nLine = 0; + }else{ + in = p->in; + nLine = p->lineno; + if( in==0 ) in = stdin; + } + *pnData = 0; + nLine++; + if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error; + rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); + if( rc!=2 ) goto readHexDb_error; + if( n<0 ) goto readHexDb_error; + if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error; + n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */ + a = sqlite3_malloc( n ? n : 1 ); + if( a==0 ){ + utf8_printf(stderr, "Out of memory!\n"); + goto readHexDb_error; + } + memset(a, 0, n); + if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){ + utf8_printf(stderr, "invalid pagesize\n"); + goto readHexDb_error; + } + for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){ + rc = sscanf(zLine, "| page %d offset %d", &j, &k); + if( rc==2 ){ + iOffset = k; + continue; + } + if( strncmp(zLine, "| end ", 6)==0 ){ + break; + } + rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", + &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], + &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); + if( rc==17 ){ + k = iOffset+j; + if( k+16<=n ){ + int ii; + for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff; + } + } + } + *pnData = n; + if( in!=p->in ){ + fclose(in); + }else{ + p->lineno = nLine; + } + return a; + +readHexDb_error: + if( in!=p->in ){ + fclose(in); + }else{ + while( fgets(zLine, sizeof(zLine), p->in)!=0 ){ + nLine++; + if(strncmp(zLine, "| end ", 6)==0 ) break; + } + p->lineno = nLine; + } + sqlite3_free(a); + utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine); + return 0; +} +#endif /* SQLITE_ENABLE_DESERIALIZE */ + +/* +** Scalar function "shell_int32". The first argument to this function +** must be a blob. The second a non-negative integer. This function +** reads and returns a 32-bit big-endian integer from byte +** offset (4*) of the blob. +*/ +static void shellInt32( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *pBlob; + int nBlob; + int iInt; + + UNUSED_PARAMETER(argc); + nBlob = sqlite3_value_bytes(argv[0]); + pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]); + iInt = sqlite3_value_int(argv[1]); + + if( iInt>=0 && (iInt+1)*4<=nBlob ){ + const unsigned char *a = &pBlob[iInt*4]; + sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24) + + ((sqlite3_int64)a[1]<<16) + + ((sqlite3_int64)a[2]<< 8) + + ((sqlite3_int64)a[3]<< 0); + sqlite3_result_int64(context, iVal); + } +} + +/* +** Scalar function "shell_idquote(X)" returns string X quoted as an identifier, +** using "..." with internal double-quote characters doubled. +*/ +static void shellIdQuote( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zName = (const char*)sqlite3_value_text(argv[0]); + UNUSED_PARAMETER(argc); + if( zName ){ + char *z = sqlite3_mprintf("\"%w\"", zName); + sqlite3_result_text(context, z, -1, sqlite3_free); + } +} + +/* +** Scalar function "shell_escape_crnl" used by the .recover command. +** The argument passed to this function is the output of built-in +** function quote(). If the first character of the input is "'", +** indicating that the value passed to quote() was a text value, +** then this function searches the input for "\n" and "\r" characters +** and adds a wrapper similar to the following: +** +** replace(replace(, '\n', char(10), '\r', char(13)); +** +** Or, if the first character of the input is not "'", then a copy +** of the input is returned. +*/ +static void shellEscapeCrnl( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zText = (const char*)sqlite3_value_text(argv[0]); + UNUSED_PARAMETER(argc); + if( zText[0]=='\'' ){ + int nText = sqlite3_value_bytes(argv[0]); + int i; + char zBuf1[20]; + char zBuf2[20]; + const char *zNL = 0; + const char *zCR = 0; + int nCR = 0; + int nNL = 0; + + for(i=0; zText[i]; i++){ + if( zNL==0 && zText[i]=='\n' ){ + zNL = unused_string(zText, "\\n", "\\012", zBuf1); + nNL = (int)strlen(zNL); + } + if( zCR==0 && zText[i]=='\r' ){ + zCR = unused_string(zText, "\\r", "\\015", zBuf2); + nCR = (int)strlen(zCR); + } + } + + if( zNL || zCR ){ + int iOut = 0; + i64 nMax = (nNL > nCR) ? nNL : nCR; + i64 nAlloc = nMax * nText + (nMax+64)*2; + char *zOut = (char*)sqlite3_malloc64(nAlloc); + if( zOut==0 ){ + sqlite3_result_error_nomem(context); + return; + } + + if( zNL && zCR ){ + memcpy(&zOut[iOut], "replace(replace(", 16); + iOut += 16; + }else{ + memcpy(&zOut[iOut], "replace(", 8); + iOut += 8; + } + for(i=0; zText[i]; i++){ + if( zText[i]=='\n' ){ + memcpy(&zOut[iOut], zNL, nNL); + iOut += nNL; + }else if( zText[i]=='\r' ){ + memcpy(&zOut[iOut], zCR, nCR); + iOut += nCR; + }else{ + zOut[iOut] = zText[i]; + iOut++; + } + } + + if( zNL ){ + memcpy(&zOut[iOut], ",'", 2); iOut += 2; + memcpy(&zOut[iOut], zNL, nNL); iOut += nNL; + memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12; + } + if( zCR ){ + memcpy(&zOut[iOut], ",'", 2); iOut += 2; + memcpy(&zOut[iOut], zCR, nCR); iOut += nCR; + memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12; + } + + sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT); + sqlite3_free(zOut); + return; + } + } + + sqlite3_result_value(context, argv[0]); +} + +/* Flags for open_db(). +** +** The default behavior of open_db() is to exit(1) if the database fails to +** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error +** but still returns without calling exit. +** +** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a +** ZIP archive if the file does not exist or is empty and its name matches +** the *.zip pattern. +*/ +#define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */ +#define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */ + +/* +** Make sure the database is open. If it is not, then open it. If +** the database fails to open, print an error message and exit. +*/ +static void open_db(ShellState *p, int openFlags){ + if( p->db==0 ){ + if( p->openMode==SHELL_OPEN_UNSPEC ){ + if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){ + p->openMode = SHELL_OPEN_NORMAL; + }else{ + p->openMode = (u8)deduceDatabaseType(p->zDbFilename, + (openFlags & OPEN_DB_ZIPFILE)!=0); + } + } + switch( p->openMode ){ + case SHELL_OPEN_APPENDVFS: { + sqlite3_open_v2(p->zDbFilename, &p->db, + SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs"); + break; + } + case SHELL_OPEN_HEXDB: + case SHELL_OPEN_DESERIALIZE: { + sqlite3_open(0, &p->db); + break; + } + case SHELL_OPEN_ZIPFILE: { + sqlite3_open(":memory:", &p->db); + break; + } + case SHELL_OPEN_READONLY: { + sqlite3_open_v2(p->zDbFilename, &p->db, + SQLITE_OPEN_READONLY|p->openFlags, 0); + break; + } + case SHELL_OPEN_UNSPEC: + case SHELL_OPEN_NORMAL: { + sqlite3_open_v2(p->zDbFilename, &p->db, + SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0); + break; + } + } + globalDb = p->db; + if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ + utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", + p->zDbFilename, sqlite3_errmsg(p->db)); + if( openFlags & OPEN_DB_KEEPALIVE ){ + sqlite3_open(":memory:", &p->db); + return; + } + exit(1); + } +#ifndef SQLITE_OMIT_LOAD_EXTENSION + sqlite3_enable_load_extension(p->db, 1); +#endif + sqlite3_fileio_init(p->db, 0, 0); + sqlite3_shathree_init(p->db, 0, 0); + sqlite3_completion_init(p->db, 0, 0); + sqlite3_uint_init(p->db, 0, 0); +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) + sqlite3_dbdata_init(p->db, 0, 0); +#endif +#ifdef SQLITE_HAVE_ZLIB + sqlite3_zipfile_init(p->db, 0, 0); + sqlite3_sqlar_init(p->db, 0, 0); +#endif + sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0, + shellAddSchemaName, 0, 0); + sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0, + shellModuleSchema, 0, 0); + sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p, + shellPutsFunc, 0, 0); + sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0, + shellEscapeCrnl, 0, 0); + sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0, + shellInt32, 0, 0); + sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0, + shellIdQuote, 0, 0); +#ifndef SQLITE_NOHAVE_SYSTEM + sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0, + editFunc, 0, 0); + sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, + editFunc, 0, 0); +#endif + if( p->openMode==SHELL_OPEN_ZIPFILE ){ + char *zSql = sqlite3_mprintf( + "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename); + sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + } +#ifdef SQLITE_ENABLE_DESERIALIZE + else + if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){ + int rc; + int nData = 0; + unsigned char *aData; + if( p->openMode==SHELL_OPEN_DESERIALIZE ){ + aData = (unsigned char*)readFile(p->zDbFilename, &nData); + }else{ + aData = readHexDb(p, &nData); + if( aData==0 ){ + return; + } + } + rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, + SQLITE_DESERIALIZE_RESIZEABLE | + SQLITE_DESERIALIZE_FREEONCLOSE); + if( rc ){ + utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc); + } + if( p->szMax>0 ){ + sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); + } + } +#endif + } +} + +/* +** Attempt to close the databaes connection. Report errors. +*/ +void close_db(sqlite3 *db){ + int rc = sqlite3_close(db); + if( rc ){ + utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n", + rc, sqlite3_errmsg(db)); + } +} + +#if HAVE_READLINE || HAVE_EDITLINE +/* +** Readline completion callbacks +*/ +static char *readline_completion_generator(const char *text, int state){ + static sqlite3_stmt *pStmt = 0; + char *zRet; + if( state==0 ){ + char *zSql; + sqlite3_finalize(pStmt); + zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" + " FROM completion(%Q) ORDER BY 1", text); + sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + } + if( sqlite3_step(pStmt)==SQLITE_ROW ){ + zRet = strdup((const char*)sqlite3_column_text(pStmt, 0)); + }else{ + sqlite3_finalize(pStmt); + pStmt = 0; + zRet = 0; + } + return zRet; +} +static char **readline_completion(const char *zText, int iStart, int iEnd){ + rl_attempted_completion_over = 1; + return rl_completion_matches(zText, readline_completion_generator); +} + +#elif HAVE_LINENOISE +/* +** Linenoise completion callback +*/ +static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){ + int nLine = strlen30(zLine); + int i, iStart; + sqlite3_stmt *pStmt = 0; + char *zSql; + char zBuf[1000]; + + if( nLine>sizeof(zBuf)-30 ) return; + if( zLine[0]=='.' || zLine[0]=='#') return; + for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){} + if( i==nLine-1 ) return; + iStart = i+1; + memcpy(zBuf, zLine, iStart); + zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" + " FROM completion(%Q,%Q) ORDER BY 1", + &zLine[iStart], zLine); + sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */ + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0); + int nCompletion = sqlite3_column_bytes(pStmt, 0); + if( iStart+nCompletion < sizeof(zBuf)-1 ){ + memcpy(zBuf+iStart, zCompletion, nCompletion+1); + linenoiseAddCompletion(lc, zBuf); + } + } + sqlite3_finalize(pStmt); +} +#endif + +/* +** Do C-language style dequoting. +** +** \a -> alarm +** \b -> backspace +** \t -> tab +** \n -> newline +** \v -> vertical tab +** \f -> form feed +** \r -> carriage return +** \s -> space +** \" -> " +** \' -> ' +** \\ -> backslash +** \NNN -> ascii character NNN in octal +*/ +static void resolve_backslashes(char *z){ + int i, j; + char c; + while( *z && *z!='\\' ) z++; + for(i=j=0; (c = z[i])!=0; i++, j++){ + if( c=='\\' && z[i+1]!=0 ){ + c = z[++i]; + if( c=='a' ){ + c = '\a'; + }else if( c=='b' ){ + c = '\b'; + }else if( c=='t' ){ + c = '\t'; + }else if( c=='n' ){ + c = '\n'; + }else if( c=='v' ){ + c = '\v'; + }else if( c=='f' ){ + c = '\f'; + }else if( c=='r' ){ + c = '\r'; + }else if( c=='"' ){ + c = '"'; + }else if( c=='\'' ){ + c = '\''; + }else if( c=='\\' ){ + c = '\\'; + }else if( c>='0' && c<='7' ){ + c -= '0'; + if( z[i+1]>='0' && z[i+1]<='7' ){ + i++; + c = (c<<3) + z[i] - '0'; + if( z[i+1]>='0' && z[i+1]<='7' ){ + i++; + c = (c<<3) + z[i] - '0'; + } + } + } + } + z[j] = c; + } + if( j=0; i++){} + }else{ + for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){} + } + if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff); + if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){ + return 1; + } + if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){ + return 0; + } + utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", + zArg); + return 0; +} + +/* +** Set or clear a shell flag according to a boolean value. +*/ +static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){ + if( booleanValue(zArg) ){ + ShellSetFlag(p, mFlag); + }else{ + ShellClearFlag(p, mFlag); + } +} + +/* +** Close an output file, assuming it is not stderr or stdout +*/ +static void output_file_close(FILE *f){ + if( f && f!=stdout && f!=stderr ) fclose(f); +} + +/* +** Try to open an output file. The names "stdout" and "stderr" are +** recognized and do the right thing. NULL is returned if the output +** filename is "off". +*/ +static FILE *output_file_open(const char *zFile, int bTextMode){ + FILE *f; + if( strcmp(zFile,"stdout")==0 ){ + f = stdout; + }else if( strcmp(zFile, "stderr")==0 ){ + f = stderr; + }else if( strcmp(zFile, "off")==0 ){ + f = 0; + }else{ + f = fopen(zFile, bTextMode ? "w" : "wb"); + if( f==0 ){ + utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); + } + } + return f; +} + +#ifndef SQLITE_OMIT_TRACE +/* +** A routine for handling output from sqlite3_trace(). +*/ +static int sql_trace_callback( + unsigned mType, /* The trace type */ + void *pArg, /* The ShellState pointer */ + void *pP, /* Usually a pointer to sqlite_stmt */ + void *pX /* Auxiliary output */ +){ + ShellState *p = (ShellState*)pArg; + sqlite3_stmt *pStmt; + const char *zSql; + int nSql; + if( p->traceOut==0 ) return 0; + if( mType==SQLITE_TRACE_CLOSE ){ + utf8_printf(p->traceOut, "-- closing database connection\n"); + return 0; + } + if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){ + zSql = (const char*)pX; + }else{ + pStmt = (sqlite3_stmt*)pP; + switch( p->eTraceType ){ + case SHELL_TRACE_EXPANDED: { + zSql = sqlite3_expanded_sql(pStmt); + break; + } +#ifdef SQLITE_ENABLE_NORMALIZE + case SHELL_TRACE_NORMALIZED: { + zSql = sqlite3_normalized_sql(pStmt); + break; + } +#endif + default: { + zSql = sqlite3_sql(pStmt); + break; + } + } + } + if( zSql==0 ) return 0; + nSql = strlen30(zSql); + while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; } + switch( mType ){ + case SQLITE_TRACE_ROW: + case SQLITE_TRACE_STMT: { + utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql); + break; + } + case SQLITE_TRACE_PROFILE: { + sqlite3_int64 nNanosec = *(sqlite3_int64*)pX; + utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec); + break; + } + } + return 0; +} +#endif + +/* +** A no-op routine that runs with the ".breakpoint" doc-command. This is +** a useful spot to set a debugger breakpoint. +*/ +static void test_breakpoint(void){ + static int nCall = 0; + nCall++; +} + +/* +** An object used to read a CSV and other files for import. +*/ +typedef struct ImportCtx ImportCtx; +struct ImportCtx { + const char *zFile; /* Name of the input file */ + FILE *in; /* Read the CSV text from this input stream */ + char *z; /* Accumulated text for a field */ + int n; /* Number of bytes in z */ + int nAlloc; /* Space allocated for z[] */ + int nLine; /* Current line number */ + int nRow; /* Number of rows imported */ + int nErr; /* Number of errors encountered */ + int bNotFirst; /* True if one or more bytes already read */ + int cTerm; /* Character that terminated the most recent field */ + int cColSep; /* The column separator character. (Usually ",") */ + int cRowSep; /* The row separator character. (Usually "\n") */ +}; + +/* Append a single byte to z[] */ +static void import_append_char(ImportCtx *p, int c){ + if( p->n+1>=p->nAlloc ){ + p->nAlloc += p->nAlloc + 100; + p->z = sqlite3_realloc64(p->z, p->nAlloc); + if( p->z==0 ) shell_out_of_memory(); + } + p->z[p->n++] = (char)c; +} + +/* Read a single field of CSV text. Compatible with rfc4180 and extended +** with the option of having a separator other than ",". +** +** + Input comes from p->in. +** + Store results in p->z of length p->n. Space to hold p->z comes +** from sqlite3_malloc64(). +** + Use p->cSep as the column separator. The default is ",". +** + Use p->rSep as the row separator. The default is "\n". +** + Keep track of the line number in p->nLine. +** + Store the character that terminates the field in p->cTerm. Store +** EOF on end-of-file. +** + Report syntax errors on stderr +*/ +static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){ + int c; + int cSep = p->cColSep; + int rSep = p->cRowSep; + p->n = 0; + c = fgetc(p->in); + if( c==EOF || seenInterrupt ){ + p->cTerm = EOF; + return 0; + } + if( c=='"' ){ + int pc, ppc; + int startLine = p->nLine; + int cQuote = c; + pc = ppc = 0; + while( 1 ){ + c = fgetc(p->in); + if( c==rSep ) p->nLine++; + if( c==cQuote ){ + if( pc==cQuote ){ + pc = 0; + continue; + } + } + if( (c==cSep && pc==cQuote) + || (c==rSep && pc==cQuote) + || (c==rSep && pc=='\r' && ppc==cQuote) + || (c==EOF && pc==cQuote) + ){ + do{ p->n--; }while( p->z[p->n]!=cQuote ); + p->cTerm = c; + break; + } + if( pc==cQuote && c!='\r' ){ + utf8_printf(stderr, "%s:%d: unescaped %c character\n", + p->zFile, p->nLine, cQuote); + } + if( c==EOF ){ + utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n", + p->zFile, startLine, cQuote); + p->cTerm = c; + break; + } + import_append_char(p, c); + ppc = pc; + pc = c; + } + }else{ + /* If this is the first field being parsed and it begins with the + ** UTF-8 BOM (0xEF BB BF) then skip the BOM */ + if( (c&0xff)==0xef && p->bNotFirst==0 ){ + import_append_char(p, c); + c = fgetc(p->in); + if( (c&0xff)==0xbb ){ + import_append_char(p, c); + c = fgetc(p->in); + if( (c&0xff)==0xbf ){ + p->bNotFirst = 1; + p->n = 0; + return csv_read_one_field(p); + } + } + } + while( c!=EOF && c!=cSep && c!=rSep ){ + import_append_char(p, c); + c = fgetc(p->in); + } + if( c==rSep ){ + p->nLine++; + if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--; + } + p->cTerm = c; + } + if( p->z ) p->z[p->n] = 0; + p->bNotFirst = 1; + return p->z; +} + +/* Read a single field of ASCII delimited text. +** +** + Input comes from p->in. +** + Store results in p->z of length p->n. Space to hold p->z comes +** from sqlite3_malloc64(). +** + Use p->cSep as the column separator. The default is "\x1F". +** + Use p->rSep as the row separator. The default is "\x1E". +** + Keep track of the row number in p->nLine. +** + Store the character that terminates the field in p->cTerm. Store +** EOF on end-of-file. +** + Report syntax errors on stderr +*/ +static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){ + int c; + int cSep = p->cColSep; + int rSep = p->cRowSep; + p->n = 0; + c = fgetc(p->in); + if( c==EOF || seenInterrupt ){ + p->cTerm = EOF; + return 0; + } + while( c!=EOF && c!=cSep && c!=rSep ){ + import_append_char(p, c); + c = fgetc(p->in); + } + if( c==rSep ){ + p->nLine++; + } + p->cTerm = c; + if( p->z ) p->z[p->n] = 0; + return p->z; +} + +/* +** Try to transfer data for table zTable. If an error is seen while +** moving forward, try to go backwards. The backwards movement won't +** work for WITHOUT ROWID tables. +*/ +static void tryToCloneData( + ShellState *p, + sqlite3 *newDb, + const char *zTable +){ + sqlite3_stmt *pQuery = 0; + sqlite3_stmt *pInsert = 0; + char *zQuery = 0; + char *zInsert = 0; + int rc; + int i, j, n; + int nTable = strlen30(zTable); + int k = 0; + int cnt = 0; + const int spinRate = 10000; + + zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); + rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); + if( rc ){ + utf8_printf(stderr, "Error %d: %s on [%s]\n", + sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), + zQuery); + goto end_data_xfer; + } + n = sqlite3_column_count(pQuery); + zInsert = sqlite3_malloc64(200 + nTable + n*3); + if( zInsert==0 ) shell_out_of_memory(); + sqlite3_snprintf(200+nTable,zInsert, + "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable); + i = strlen30(zInsert); + for(j=1; jdb, zQuery, -1, &pQuery, 0); + if( rc ){ + utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable); + break; + } + } /* End for(k=0...) */ + +end_data_xfer: + sqlite3_finalize(pQuery); + sqlite3_finalize(pInsert); + sqlite3_free(zQuery); + sqlite3_free(zInsert); +} + + +/* +** Try to transfer all rows of the schema that match zWhere. For +** each row, invoke xForEach() on the object defined by that row. +** If an error is encountered while moving forward through the +** sqlite_master table, try again moving backwards. +*/ +static void tryToCloneSchema( + ShellState *p, + sqlite3 *newDb, + const char *zWhere, + void (*xForEach)(ShellState*,sqlite3*,const char*) +){ + sqlite3_stmt *pQuery = 0; + char *zQuery = 0; + int rc; + const unsigned char *zName; + const unsigned char *zSql; + char *zErrMsg = 0; + + zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master" + " WHERE %s", zWhere); + rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); + if( rc ){ + utf8_printf(stderr, "Error: (%d) %s on [%s]\n", + sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), + zQuery); + goto end_schema_xfer; + } + while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ + zName = sqlite3_column_text(pQuery, 0); + zSql = sqlite3_column_text(pQuery, 1); + printf("%s... ", zName); fflush(stdout); + sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); + if( zErrMsg ){ + utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); + sqlite3_free(zErrMsg); + zErrMsg = 0; + } + if( xForEach ){ + xForEach(p, newDb, (const char*)zName); + } + printf("done\n"); + } + if( rc!=SQLITE_DONE ){ + sqlite3_finalize(pQuery); + sqlite3_free(zQuery); + zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master" + " WHERE %s ORDER BY rowid DESC", zWhere); + rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); + if( rc ){ + utf8_printf(stderr, "Error: (%d) %s on [%s]\n", + sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), + zQuery); + goto end_schema_xfer; + } + while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ + zName = sqlite3_column_text(pQuery, 0); + zSql = sqlite3_column_text(pQuery, 1); + printf("%s... ", zName); fflush(stdout); + sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); + if( zErrMsg ){ + utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); + sqlite3_free(zErrMsg); + zErrMsg = 0; + } + if( xForEach ){ + xForEach(p, newDb, (const char*)zName); + } + printf("done\n"); + } + } +end_schema_xfer: + sqlite3_finalize(pQuery); + sqlite3_free(zQuery); +} + +/* +** Open a new database file named "zNewDb". Try to recover as much information +** as possible out of the main database (which might be corrupt) and write it +** into zNewDb. +*/ +static void tryToClone(ShellState *p, const char *zNewDb){ + int rc; + sqlite3 *newDb = 0; + if( access(zNewDb,0)==0 ){ + utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb); + return; + } + rc = sqlite3_open(zNewDb, &newDb); + if( rc ){ + utf8_printf(stderr, "Cannot create output database: %s\n", + sqlite3_errmsg(newDb)); + }else{ + sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0); + sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0); + tryToCloneSchema(p, newDb, "type='table'", tryToCloneData); + tryToCloneSchema(p, newDb, "type!='table'", 0); + sqlite3_exec(newDb, "COMMIT;", 0, 0, 0); + sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); + } + close_db(newDb); +} + +/* +** Change the output file back to stdout. +** +** If the p->doXdgOpen flag is set, that means the output was being +** redirected to a temporary file named by p->zTempFile. In that case, +** launch start/open/xdg-open on that temporary file. +*/ +static void output_reset(ShellState *p){ + if( p->outfile[0]=='|' ){ +#ifndef SQLITE_OMIT_POPEN + pclose(p->out); +#endif + }else{ + output_file_close(p->out); +#ifndef SQLITE_NOHAVE_SYSTEM + if( p->doXdgOpen ){ + const char *zXdgOpenCmd = +#if defined(_WIN32) + "start"; +#elif defined(__APPLE__) + "open"; +#else + "xdg-open"; +#endif + char *zCmd; + zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile); + if( system(zCmd) ){ + utf8_printf(stderr, "Failed: [%s]\n", zCmd); + }else{ + /* Give the start/open/xdg-open command some time to get + ** going before we continue, and potential delete the + ** p->zTempFile data file out from under it */ + sqlite3_sleep(2000); + } + sqlite3_free(zCmd); + outputModePop(p); + p->doXdgOpen = 0; + } +#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ + } + p->outfile[0] = 0; + p->out = stdout; +} + +/* +** Run an SQL command and return the single integer result. +*/ +static int db_int(ShellState *p, const char *zSql){ + sqlite3_stmt *pStmt; + int res = 0; + sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ + res = sqlite3_column_int(pStmt,0); + } + sqlite3_finalize(pStmt); + return res; +} + +/* +** Convert a 2-byte or 4-byte big-endian integer into a native integer +*/ +static unsigned int get2byteInt(unsigned char *a){ + return (a[0]<<8) + a[1]; +} +static unsigned int get4byteInt(unsigned char *a){ + return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3]; +} + +/* +** Implementation of the ".dbinfo" command. +** +** Return 1 on error, 2 to exit, and 0 otherwise. +*/ +static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ + static const struct { const char *zName; int ofst; } aField[] = { + { "file change counter:", 24 }, + { "database page count:", 28 }, + { "freelist page count:", 36 }, + { "schema cookie:", 40 }, + { "schema format:", 44 }, + { "default cache size:", 48 }, + { "autovacuum top root:", 52 }, + { "incremental vacuum:", 64 }, + { "text encoding:", 56 }, + { "user version:", 60 }, + { "application id:", 68 }, + { "software version:", 96 }, + }; + static const struct { const char *zName; const char *zSql; } aQuery[] = { + { "number of tables:", + "SELECT count(*) FROM %s WHERE type='table'" }, + { "number of indexes:", + "SELECT count(*) FROM %s WHERE type='index'" }, + { "number of triggers:", + "SELECT count(*) FROM %s WHERE type='trigger'" }, + { "number of views:", + "SELECT count(*) FROM %s WHERE type='view'" }, + { "schema size:", + "SELECT total(length(sql)) FROM %s" }, + }; + int i, rc; + unsigned iDataVersion; + char *zSchemaTab; + char *zDb = nArg>=2 ? azArg[1] : "main"; + sqlite3_stmt *pStmt = 0; + unsigned char aHdr[100]; + open_db(p, 0); + if( p->db==0 ) return 1; + rc = sqlite3_prepare_v2(p->db, + "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1", + -1, &pStmt, 0); + if( rc ){ + utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db)); + sqlite3_finalize(pStmt); + return 1; + } + sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC); + if( sqlite3_step(pStmt)==SQLITE_ROW + && sqlite3_column_bytes(pStmt,0)>100 + ){ + memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100); + sqlite3_finalize(pStmt); + }else{ + raw_printf(stderr, "unable to read database header\n"); + sqlite3_finalize(pStmt); + return 1; + } + i = get2byteInt(aHdr+16); + if( i==1 ) i = 65536; + utf8_printf(p->out, "%-20s %d\n", "database page size:", i); + utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]); + utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]); + utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); + for(i=0; iout, "%-20s %u", aField[i].zName, val); + switch( ofst ){ + case 56: { + if( val==1 ) raw_printf(p->out, " (utf8)"); + if( val==2 ) raw_printf(p->out, " (utf16le)"); + if( val==3 ) raw_printf(p->out, " (utf16be)"); + } + } + raw_printf(p->out, "\n"); + } + if( zDb==0 ){ + zSchemaTab = sqlite3_mprintf("main.sqlite_master"); + }else if( strcmp(zDb,"temp")==0 ){ + zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master"); + }else{ + zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb); + } + for(i=0; iout, "%-20s %d\n", aQuery[i].zName, val); + } + sqlite3_free(zSchemaTab); + sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion); + utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion); + return 0; +} + +/* +** Print the current sqlite3_errmsg() value to stderr and return 1. +*/ +static int shellDatabaseError(sqlite3 *db){ + const char *zErr = sqlite3_errmsg(db); + utf8_printf(stderr, "Error: %s\n", zErr); + return 1; +} + +/* +** Compare the pattern in zGlob[] against the text in z[]. Return TRUE +** if they match and FALSE (0) if they do not match. +** +** Globbing rules: +** +** '*' Matches any sequence of zero or more characters. +** +** '?' Matches exactly one character. +** +** [...] Matches one character from the enclosed list of +** characters. +** +** [^...] Matches one character not in the enclosed list. +** +** '#' Matches any sequence of one or more digits with an +** optional + or - sign in front +** +** ' ' Any span of whitespace matches any other span of +** whitespace. +** +** Extra whitespace at the end of z[] is ignored. +*/ +static int testcase_glob(const char *zGlob, const char *z){ + int c, c2; + int invert; + int seen; + + while( (c = (*(zGlob++)))!=0 ){ + if( IsSpace(c) ){ + if( !IsSpace(*z) ) return 0; + while( IsSpace(*zGlob) ) zGlob++; + while( IsSpace(*z) ) z++; + }else if( c=='*' ){ + while( (c=(*(zGlob++))) == '*' || c=='?' ){ + if( c=='?' && (*(z++))==0 ) return 0; + } + if( c==0 ){ + return 1; + }else if( c=='[' ){ + while( *z && testcase_glob(zGlob-1,z)==0 ){ + z++; + } + return (*z)!=0; + } + while( (c2 = (*(z++)))!=0 ){ + while( c2!=c ){ + c2 = *(z++); + if( c2==0 ) return 0; + } + if( testcase_glob(zGlob,z) ) return 1; + } + return 0; + }else if( c=='?' ){ + if( (*(z++))==0 ) return 0; + }else if( c=='[' ){ + int prior_c = 0; + seen = 0; + invert = 0; + c = *(z++); + if( c==0 ) return 0; + c2 = *(zGlob++); + if( c2=='^' ){ + invert = 1; + c2 = *(zGlob++); + } + if( c2==']' ){ + if( c==']' ) seen = 1; + c2 = *(zGlob++); + } + while( c2 && c2!=']' ){ + if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){ + c2 = *(zGlob++); + if( c>=prior_c && c<=c2 ) seen = 1; + prior_c = 0; + }else{ + if( c==c2 ){ + seen = 1; + } + prior_c = c2; + } + c2 = *(zGlob++); + } + if( c2==0 || (seen ^ invert)==0 ) return 0; + }else if( c=='#' ){ + if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++; + if( !IsDigit(z[0]) ) return 0; + z++; + while( IsDigit(z[0]) ){ z++; } + }else{ + if( c!=(*(z++)) ) return 0; + } + } + while( IsSpace(*z) ){ z++; } + return *z==0; +} + + +/* +** Compare the string as a command-line option with either one or two +** initial "-" characters. +*/ +static int optionMatch(const char *zStr, const char *zOpt){ + if( zStr[0]!='-' ) return 0; + zStr++; + if( zStr[0]=='-' ) zStr++; + return strcmp(zStr, zOpt)==0; +} + +/* +** Delete a file. +*/ +int shellDeleteFile(const char *zFilename){ + int rc; +#ifdef _WIN32 + wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename); + rc = _wunlink(z); + sqlite3_free(z); +#else + rc = unlink(zFilename); +#endif + return rc; +} + +/* +** Try to delete the temporary file (if there is one) and free the +** memory used to hold the name of the temp file. +*/ +static void clearTempFile(ShellState *p){ + if( p->zTempFile==0 ) return; + if( p->doXdgOpen ) return; + if( shellDeleteFile(p->zTempFile) ) return; + sqlite3_free(p->zTempFile); + p->zTempFile = 0; +} + +/* +** Create a new temp file name with the given suffix. +*/ +static void newTempFile(ShellState *p, const char *zSuffix){ + clearTempFile(p); + sqlite3_free(p->zTempFile); + p->zTempFile = 0; + if( p->db ){ + sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile); + } + if( p->zTempFile==0 ){ + /* If p->db is an in-memory database then the TEMPFILENAME file-control + ** will not work and we will need to fallback to guessing */ + char *zTemp; + sqlite3_uint64 r; + sqlite3_randomness(sizeof(r), &r); + zTemp = getenv("TEMP"); + if( zTemp==0 ) zTemp = getenv("TMP"); + if( zTemp==0 ){ +#ifdef _WIN32 + zTemp = "\\tmp"; +#else + zTemp = "/tmp"; +#endif + } + p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix); + }else{ + p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); + } + if( p->zTempFile==0 ){ + raw_printf(stderr, "out of memory\n"); + exit(1); + } +} + + +/* +** The implementation of SQL scalar function fkey_collate_clause(), used +** by the ".lint fkey-indexes" command. This scalar function is always +** called with four arguments - the parent table name, the parent column name, +** the child table name and the child column name. +** +** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') +** +** If either of the named tables or columns do not exist, this function +** returns an empty string. An empty string is also returned if both tables +** and columns exist but have the same default collation sequence. Or, +** if both exist but the default collation sequences are different, this +** function returns the string " COLLATE ", where +** is the default collation sequence of the parent column. +*/ +static void shellFkeyCollateClause( + sqlite3_context *pCtx, + int nVal, + sqlite3_value **apVal +){ + sqlite3 *db = sqlite3_context_db_handle(pCtx); + const char *zParent; + const char *zParentCol; + const char *zParentSeq; + const char *zChild; + const char *zChildCol; + const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ + int rc; + + assert( nVal==4 ); + zParent = (const char*)sqlite3_value_text(apVal[0]); + zParentCol = (const char*)sqlite3_value_text(apVal[1]); + zChild = (const char*)sqlite3_value_text(apVal[2]); + zChildCol = (const char*)sqlite3_value_text(apVal[3]); + + sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); + rc = sqlite3_table_column_metadata( + db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 + ); + if( rc==SQLITE_OK ){ + rc = sqlite3_table_column_metadata( + db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 + ); + } + + if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ + char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); + sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); + sqlite3_free(z); + } +} + + +/* +** The implementation of dot-command ".lint fkey-indexes". +*/ +static int lintFkeyIndexes( + ShellState *pState, /* Current shell tool state */ + char **azArg, /* Array of arguments passed to dot command */ + int nArg /* Number of entries in azArg[] */ +){ + sqlite3 *db = pState->db; /* Database handle to query "main" db of */ + FILE *out = pState->out; /* Stream to write non-error output to */ + int bVerbose = 0; /* If -verbose is present */ + int bGroupByParent = 0; /* If -groupbyparent is present */ + int i; /* To iterate through azArg[] */ + const char *zIndent = ""; /* How much to indent CREATE INDEX by */ + int rc; /* Return code */ + sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ + + /* + ** This SELECT statement returns one row for each foreign key constraint + ** in the schema of the main database. The column values are: + ** + ** 0. The text of an SQL statement similar to: + ** + ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?" + ** + ** This SELECT is similar to the one that the foreign keys implementation + ** needs to run internally on child tables. If there is an index that can + ** be used to optimize this query, then it can also be used by the FK + ** implementation to optimize DELETE or UPDATE statements on the parent + ** table. + ** + ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by + ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema + ** contains an index that can be used to optimize the query. + ** + ** 2. Human readable text that describes the child table and columns. e.g. + ** + ** "child_table(child_key1, child_key2)" + ** + ** 3. Human readable text that describes the parent table and columns. e.g. + ** + ** "parent_table(parent_key1, parent_key2)" + ** + ** 4. A full CREATE INDEX statement for an index that could be used to + ** optimize DELETE or UPDATE statements on the parent table. e.g. + ** + ** "CREATE INDEX child_table_child_key ON child_table(child_key)" + ** + ** 5. The name of the parent table. + ** + ** These six values are used by the C logic below to generate the report. + */ + const char *zSql = + "SELECT " + " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '" + " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " + " || fkey_collate_clause(" + " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')" + ", " + " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('" + " || group_concat('*=?', ' AND ') || ')'" + ", " + " s.name || '(' || group_concat(f.[from], ', ') || ')'" + ", " + " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'" + ", " + " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" + " || ' ON ' || quote(s.name) || '('" + " || group_concat(quote(f.[from]) ||" + " fkey_collate_clause(" + " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')" + " || ');'" + ", " + " f.[table] " + "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f " + "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) " + "GROUP BY s.name, f.id " + "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" + ; + const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)"; + + for(i=2; i1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ + bVerbose = 1; + } + else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ + bGroupByParent = 1; + zIndent = " "; + } + else{ + raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n", + azArg[0], azArg[1] + ); + return SQLITE_ERROR; + } + } + + /* Register the fkey_collate_clause() SQL function */ + rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, + 0, shellFkeyCollateClause, 0, 0 + ); + + + if( rc==SQLITE_OK ){ + rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); + } + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pSql, 1, bGroupByParent); + } + + if( rc==SQLITE_OK ){ + int rc2; + char *zPrev = 0; + while( SQLITE_ROW==sqlite3_step(pSql) ){ + int res = -1; + sqlite3_stmt *pExplain = 0; + const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); + const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); + const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); + const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); + const char *zCI = (const char*)sqlite3_column_text(pSql, 4); + const char *zParent = (const char*)sqlite3_column_text(pSql, 5); + + rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); + if( rc!=SQLITE_OK ) break; + if( SQLITE_ROW==sqlite3_step(pExplain) ){ + const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); + res = ( + 0==sqlite3_strglob(zGlob, zPlan) + || 0==sqlite3_strglob(zGlobIPK, zPlan) + ); + } + rc = sqlite3_finalize(pExplain); + if( rc!=SQLITE_OK ) break; + + if( res<0 ){ + raw_printf(stderr, "Error: internal error"); + break; + }else{ + if( bGroupByParent + && (bVerbose || res==0) + && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) + ){ + raw_printf(out, "-- Parent table %s\n", zParent); + sqlite3_free(zPrev); + zPrev = sqlite3_mprintf("%s", zParent); + } + + if( res==0 ){ + raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget); + }else if( bVerbose ){ + raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n", + zIndent, zFrom, zTarget + ); + } + } + } + sqlite3_free(zPrev); + + if( rc!=SQLITE_OK ){ + raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); + } + + rc2 = sqlite3_finalize(pSql); + if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ + rc = rc2; + raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); + } + }else{ + raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); + } + + return rc; +} + +/* +** Implementation of ".lint" dot command. +*/ +static int lintDotCommand( + ShellState *pState, /* Current shell tool state */ + char **azArg, /* Array of arguments passed to dot command */ + int nArg /* Number of entries in azArg[] */ +){ + int n; + n = (nArg>=2 ? strlen30(azArg[1]) : 0); + if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; + return lintFkeyIndexes(pState, azArg, nArg); + + usage: + raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]); + raw_printf(stderr, "Where sub-commands are:\n"); + raw_printf(stderr, " fkey-indexes\n"); + return SQLITE_ERROR; +} + +#if !defined SQLITE_OMIT_VIRTUALTABLE +static void shellPrepare( + sqlite3 *db, + int *pRc, + const char *zSql, + sqlite3_stmt **ppStmt +){ + *ppStmt = 0; + if( *pRc==SQLITE_OK ){ + int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); + if( rc!=SQLITE_OK ){ + raw_printf(stderr, "sql error: %s (%d)\n", + sqlite3_errmsg(db), sqlite3_errcode(db) + ); + *pRc = rc; + } + } +} + +/* +** Create a prepared statement using printf-style arguments for the SQL. +** +** This routine is could be marked "static". But it is not always used, +** depending on compile-time options. By omitting the "static", we avoid +** nuisance compiler warnings about "defined but not used". +*/ +void shellPreparePrintf( + sqlite3 *db, + int *pRc, + sqlite3_stmt **ppStmt, + const char *zFmt, + ... +){ + *ppStmt = 0; + if( *pRc==SQLITE_OK ){ + va_list ap; + char *z; + va_start(ap, zFmt); + z = sqlite3_vmprintf(zFmt, ap); + va_end(ap); + if( z==0 ){ + *pRc = SQLITE_NOMEM; + }else{ + shellPrepare(db, pRc, z, ppStmt); + sqlite3_free(z); + } + } +} + +/* Finalize the prepared statement created using shellPreparePrintf(). +** +** This routine is could be marked "static". But it is not always used, +** depending on compile-time options. By omitting the "static", we avoid +** nuisance compiler warnings about "defined but not used". +*/ +void shellFinalize( + int *pRc, + sqlite3_stmt *pStmt +){ + if( pStmt ){ + sqlite3 *db = sqlite3_db_handle(pStmt); + int rc = sqlite3_finalize(pStmt); + if( *pRc==SQLITE_OK ){ + if( rc!=SQLITE_OK ){ + raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); + } + *pRc = rc; + } + } +} + +/* Reset the prepared statement created using shellPreparePrintf(). +** +** This routine is could be marked "static". But it is not always used, +** depending on compile-time options. By omitting the "static", we avoid +** nuisance compiler warnings about "defined but not used". +*/ +void shellReset( + int *pRc, + sqlite3_stmt *pStmt +){ + int rc = sqlite3_reset(pStmt); + if( *pRc==SQLITE_OK ){ + if( rc!=SQLITE_OK ){ + sqlite3 *db = sqlite3_db_handle(pStmt); + raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); + } + *pRc = rc; + } +} +#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */ + +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) +/****************************************************************************** +** The ".archive" or ".ar" command. +*/ +/* +** Structure representing a single ".ar" command. +*/ +typedef struct ArCommand ArCommand; +struct ArCommand { + u8 eCmd; /* An AR_CMD_* value */ + u8 bVerbose; /* True if --verbose */ + u8 bZip; /* True if the archive is a ZIP */ + u8 bDryRun; /* True if --dry-run */ + u8 bAppend; /* True if --append */ + u8 fromCmdLine; /* Run from -A instead of .archive */ + int nArg; /* Number of command arguments */ + char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */ + const char *zFile; /* --file argument, or NULL */ + const char *zDir; /* --directory argument, or NULL */ + char **azArg; /* Array of command arguments */ + ShellState *p; /* Shell state */ + sqlite3 *db; /* Database containing the archive */ +}; + +/* +** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. +*/ +static int arUsage(FILE *f){ + showHelp(f,"archive"); + return SQLITE_ERROR; +} + +/* +** Print an error message for the .ar command to stderr and return +** SQLITE_ERROR. +*/ +static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ + va_list ap; + char *z; + va_start(ap, zFmt); + z = sqlite3_vmprintf(zFmt, ap); + va_end(ap); + utf8_printf(stderr, "Error: %s\n", z); + if( pAr->fromCmdLine ){ + utf8_printf(stderr, "Use \"-A\" for more help\n"); + }else{ + utf8_printf(stderr, "Use \".archive --help\" for more help\n"); + } + sqlite3_free(z); + return SQLITE_ERROR; +} + +/* +** Values for ArCommand.eCmd. +*/ +#define AR_CMD_CREATE 1 +#define AR_CMD_UPDATE 2 +#define AR_CMD_INSERT 3 +#define AR_CMD_EXTRACT 4 +#define AR_CMD_LIST 5 +#define AR_CMD_HELP 6 + +/* +** Other (non-command) switches. +*/ +#define AR_SWITCH_VERBOSE 7 +#define AR_SWITCH_FILE 8 +#define AR_SWITCH_DIRECTORY 9 +#define AR_SWITCH_APPEND 10 +#define AR_SWITCH_DRYRUN 11 + +static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ + switch( eSwitch ){ + case AR_CMD_CREATE: + case AR_CMD_EXTRACT: + case AR_CMD_LIST: + case AR_CMD_UPDATE: + case AR_CMD_INSERT: + case AR_CMD_HELP: + if( pAr->eCmd ){ + return arErrorMsg(pAr, "multiple command options"); + } + pAr->eCmd = eSwitch; + break; + + case AR_SWITCH_DRYRUN: + pAr->bDryRun = 1; + break; + case AR_SWITCH_VERBOSE: + pAr->bVerbose = 1; + break; + case AR_SWITCH_APPEND: + pAr->bAppend = 1; + /* Fall thru into --file */ + case AR_SWITCH_FILE: + pAr->zFile = zArg; + break; + case AR_SWITCH_DIRECTORY: + pAr->zDir = zArg; + break; + } + + return SQLITE_OK; +} + +/* +** Parse the command line for an ".ar" command. The results are written into +** structure (*pAr). SQLITE_OK is returned if the command line is parsed +** successfully, otherwise an error message is written to stderr and +** SQLITE_ERROR returned. +*/ +static int arParseCommand( + char **azArg, /* Array of arguments passed to dot command */ + int nArg, /* Number of entries in azArg[] */ + ArCommand *pAr /* Populate this object */ +){ + struct ArSwitch { + const char *zLong; + char cShort; + u8 eSwitch; + u8 bArg; + } aSwitch[] = { + { "create", 'c', AR_CMD_CREATE, 0 }, + { "extract", 'x', AR_CMD_EXTRACT, 0 }, + { "insert", 'i', AR_CMD_INSERT, 0 }, + { "list", 't', AR_CMD_LIST, 0 }, + { "update", 'u', AR_CMD_UPDATE, 0 }, + { "help", 'h', AR_CMD_HELP, 0 }, + { "verbose", 'v', AR_SWITCH_VERBOSE, 0 }, + { "file", 'f', AR_SWITCH_FILE, 1 }, + { "append", 'a', AR_SWITCH_APPEND, 1 }, + { "directory", 'C', AR_SWITCH_DIRECTORY, 1 }, + { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 }, + }; + int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); + struct ArSwitch *pEnd = &aSwitch[nSwitch]; + + if( nArg<=1 ){ + utf8_printf(stderr, "Wrong number of arguments. Usage:\n"); + return arUsage(stderr); + }else{ + char *z = azArg[1]; + if( z[0]!='-' ){ + /* Traditional style [tar] invocation */ + int i; + int iArg = 2; + for(i=0; z[i]; i++){ + const char *zArg = 0; + struct ArSwitch *pOpt; + for(pOpt=&aSwitch[0]; pOptcShort ) break; + } + if( pOpt==pEnd ){ + return arErrorMsg(pAr, "unrecognized option: %c", z[i]); + } + if( pOpt->bArg ){ + if( iArg>=nArg ){ + return arErrorMsg(pAr, "option requires an argument: %c",z[i]); + } + zArg = azArg[iArg++]; + } + if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; + } + pAr->nArg = nArg-iArg; + if( pAr->nArg>0 ){ + pAr->azArg = &azArg[iArg]; + } + }else{ + /* Non-traditional invocation */ + int iArg; + for(iArg=1; iArgazArg = &azArg[iArg]; + pAr->nArg = nArg-iArg; + break; + } + n = strlen30(z); + + if( z[1]!='-' ){ + int i; + /* One or more short options */ + for(i=1; icShort ) break; + } + if( pOpt==pEnd ){ + return arErrorMsg(pAr, "unrecognized option: %c", z[i]); + } + if( pOpt->bArg ){ + if( i<(n-1) ){ + zArg = &z[i+1]; + i = n; + }else{ + if( iArg>=(nArg-1) ){ + return arErrorMsg(pAr, "option requires an argument: %c", + z[i]); + } + zArg = azArg[++iArg]; + } + } + if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; + } + }else if( z[2]=='\0' ){ + /* A -- option, indicating that all remaining command line words + ** are command arguments. */ + pAr->azArg = &azArg[iArg+1]; + pAr->nArg = nArg-iArg-1; + break; + }else{ + /* A long option */ + const char *zArg = 0; /* Argument for option, if any */ + struct ArSwitch *pMatch = 0; /* Matching option */ + struct ArSwitch *pOpt; /* Iterator */ + for(pOpt=&aSwitch[0]; pOptzLong; + if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){ + if( pMatch ){ + return arErrorMsg(pAr, "ambiguous option: %s",z); + }else{ + pMatch = pOpt; + } + } + } + + if( pMatch==0 ){ + return arErrorMsg(pAr, "unrecognized option: %s", z); + } + if( pMatch->bArg ){ + if( iArg>=(nArg-1) ){ + return arErrorMsg(pAr, "option requires an argument: %s", z); + } + zArg = azArg[++iArg]; + } + if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR; + } + } + } + } + + return SQLITE_OK; +} + +/* +** This function assumes that all arguments within the ArCommand.azArg[] +** array refer to archive members, as for the --extract or --list commands. +** It checks that each of them are present. If any specified file is not +** present in the archive, an error is printed to stderr and an error +** code returned. Otherwise, if all specified arguments are present in +** the archive, SQLITE_OK is returned. +** +** This function strips any trailing '/' characters from each argument. +** This is consistent with the way the [tar] command seems to work on +** Linux. +*/ +static int arCheckEntries(ArCommand *pAr){ + int rc = SQLITE_OK; + if( pAr->nArg ){ + int i, j; + sqlite3_stmt *pTest = 0; + + shellPreparePrintf(pAr->db, &rc, &pTest, + "SELECT name FROM %s WHERE name=$name", + pAr->zSrcTable + ); + j = sqlite3_bind_parameter_index(pTest, "$name"); + for(i=0; inArg && rc==SQLITE_OK; i++){ + char *z = pAr->azArg[i]; + int n = strlen30(z); + int bOk = 0; + while( n>0 && z[n-1]=='/' ) n--; + z[n] = '\0'; + sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pTest) ){ + bOk = 1; + } + shellReset(&rc, pTest); + if( rc==SQLITE_OK && bOk==0 ){ + utf8_printf(stderr, "not found in archive: %s\n", z); + rc = SQLITE_ERROR; + } + } + shellFinalize(&rc, pTest); + } + return rc; +} + +/* +** Format a WHERE clause that can be used against the "sqlar" table to +** identify all archive members that match the command arguments held +** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning. +** The caller is responsible for eventually calling sqlite3_free() on +** any non-NULL (*pzWhere) value. +*/ +static void arWhereClause( + int *pRc, + ArCommand *pAr, + char **pzWhere /* OUT: New WHERE clause */ +){ + char *zWhere = 0; + if( *pRc==SQLITE_OK ){ + if( pAr->nArg==0 ){ + zWhere = sqlite3_mprintf("1"); + }else{ + int i; + const char *zSep = ""; + for(i=0; inArg; i++){ + const char *z = pAr->azArg[i]; + zWhere = sqlite3_mprintf( + "%z%s name = '%q' OR substr(name,1,%d) = '%q/'", + zWhere, zSep, z, strlen30(z)+1, z + ); + if( zWhere==0 ){ + *pRc = SQLITE_NOMEM; + break; + } + zSep = " OR "; + } + } + } + *pzWhere = zWhere; +} + +/* +** Implementation of .ar "lisT" command. +*/ +static int arListCommand(ArCommand *pAr){ + const char *zSql = "SELECT %s FROM %s WHERE %s"; + const char *azCols[] = { + "name", + "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name" + }; + + char *zWhere = 0; + sqlite3_stmt *pSql = 0; + int rc; + + rc = arCheckEntries(pAr); + arWhereClause(&rc, pAr, &zWhere); + + shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose], + pAr->zSrcTable, zWhere); + if( pAr->bDryRun ){ + utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); + }else{ + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ + if( pAr->bVerbose ){ + utf8_printf(pAr->p->out, "%s % 10d %s %s\n", + sqlite3_column_text(pSql, 0), + sqlite3_column_int(pSql, 1), + sqlite3_column_text(pSql, 2), + sqlite3_column_text(pSql, 3) + ); + }else{ + utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); + } + } + } + shellFinalize(&rc, pSql); + sqlite3_free(zWhere); + return rc; +} + + +/* +** Implementation of .ar "eXtract" command. +*/ +static int arExtractCommand(ArCommand *pAr){ + const char *zSql1 = + "SELECT " + " ($dir || name)," + " writefile(($dir || name), %s, mode, mtime) " + "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)" + " AND name NOT GLOB '*..[/\\]*'"; + + const char *azExtraArg[] = { + "sqlar_uncompress(data, sz)", + "data" + }; + + sqlite3_stmt *pSql = 0; + int rc = SQLITE_OK; + char *zDir = 0; + char *zWhere = 0; + int i, j; + + /* If arguments are specified, check that they actually exist within + ** the archive before proceeding. And formulate a WHERE clause to + ** match them. */ + rc = arCheckEntries(pAr); + arWhereClause(&rc, pAr, &zWhere); + + if( rc==SQLITE_OK ){ + if( pAr->zDir ){ + zDir = sqlite3_mprintf("%s/", pAr->zDir); + }else{ + zDir = sqlite3_mprintf(""); + } + if( zDir==0 ) rc = SQLITE_NOMEM; + } + + shellPreparePrintf(pAr->db, &rc, &pSql, zSql1, + azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere + ); + + if( rc==SQLITE_OK ){ + j = sqlite3_bind_parameter_index(pSql, "$dir"); + sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC); + + /* Run the SELECT statement twice. The first time, writefile() is called + ** for all archive members that should be extracted. The second time, + ** only for the directories. This is because the timestamps for + ** extracted directories must be reset after they are populated (as + ** populating them changes the timestamp). */ + for(i=0; i<2; i++){ + j = sqlite3_bind_parameter_index(pSql, "$dirOnly"); + sqlite3_bind_int(pSql, j, i); + if( pAr->bDryRun ){ + utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); + }else{ + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ + if( i==0 && pAr->bVerbose ){ + utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); + } + } + } + shellReset(&rc, pSql); + } + shellFinalize(&rc, pSql); + } + + sqlite3_free(zDir); + sqlite3_free(zWhere); + return rc; +} + +/* +** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out. +*/ +static int arExecSql(ArCommand *pAr, const char *zSql){ + int rc; + if( pAr->bDryRun ){ + utf8_printf(pAr->p->out, "%s\n", zSql); + rc = SQLITE_OK; + }else{ + char *zErr = 0; + rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); + if( zErr ){ + utf8_printf(stdout, "ERROR: %s\n", zErr); + sqlite3_free(zErr); + } + } + return rc; +} + + +/* +** Implementation of .ar "create", "insert", and "update" commands. +** +** create -> Create a new SQL archive +** insert -> Insert or reinsert all files listed +** update -> Insert files that have changed or that were not +** previously in the archive +** +** Create the "sqlar" table in the database if it does not already exist. +** Then add each file in the azFile[] array to the archive. Directories +** are added recursively. If argument bVerbose is non-zero, a message is +** printed on stdout for each file archived. +** +** The create command is the same as update, except that it drops +** any existing "sqlar" table before beginning. The "insert" command +** always overwrites every file named on the command-line, where as +** "update" only overwrites if the size or mtime or mode has changed. +*/ +static int arCreateOrUpdateCommand( + ArCommand *pAr, /* Command arguments and options */ + int bUpdate, /* true for a --create. */ + int bOnlyIfChanged /* Only update if file has changed */ +){ + const char *zCreate = + "CREATE TABLE IF NOT EXISTS sqlar(\n" + " name TEXT PRIMARY KEY, -- name of the file\n" + " mode INT, -- access permissions\n" + " mtime INT, -- last modification time\n" + " sz INT, -- original file size\n" + " data BLOB -- compressed content\n" + ")"; + const char *zDrop = "DROP TABLE IF EXISTS sqlar"; + const char *zInsertFmt[2] = { + "REPLACE INTO %s(name,mode,mtime,sz,data)\n" + " SELECT\n" + " %s,\n" + " mode,\n" + " mtime,\n" + " CASE substr(lsmode(mode),1,1)\n" + " WHEN '-' THEN length(data)\n" + " WHEN 'd' THEN 0\n" + " ELSE -1 END,\n" + " sqlar_compress(data)\n" + " FROM fsdir(%Q,%Q) AS disk\n" + " WHERE lsmode(mode) NOT LIKE '?%%'%s;" + , + "REPLACE INTO %s(name,mode,mtime,data)\n" + " SELECT\n" + " %s,\n" + " mode,\n" + " mtime,\n" + " data\n" + " FROM fsdir(%Q,%Q) AS disk\n" + " WHERE lsmode(mode) NOT LIKE '?%%'%s;" + }; + int i; /* For iterating through azFile[] */ + int rc; /* Return code */ + const char *zTab = 0; /* SQL table into which to insert */ + char *zSql; + char zTemp[50]; + char *zExists = 0; + + arExecSql(pAr, "PRAGMA page_size=512"); + rc = arExecSql(pAr, "SAVEPOINT ar;"); + if( rc!=SQLITE_OK ) return rc; + zTemp[0] = 0; + if( pAr->bZip ){ + /* Initialize the zipfile virtual table, if necessary */ + if( pAr->zFile ){ + sqlite3_uint64 r; + sqlite3_randomness(sizeof(r),&r); + sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r); + zTab = zTemp; + zSql = sqlite3_mprintf( + "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)", + zTab, pAr->zFile + ); + rc = arExecSql(pAr, zSql); + sqlite3_free(zSql); + }else{ + zTab = "zip"; + } + }else{ + /* Initialize the table for an SQLAR */ + zTab = "sqlar"; + if( bUpdate==0 ){ + rc = arExecSql(pAr, zDrop); + if( rc!=SQLITE_OK ) goto end_ar_transaction; + } + rc = arExecSql(pAr, zCreate); + } + if( bOnlyIfChanged ){ + zExists = sqlite3_mprintf( + " AND NOT EXISTS(" + "SELECT 1 FROM %s AS mem" + " WHERE mem.name=disk.name" + " AND mem.mtime=disk.mtime" + " AND mem.mode=disk.mode)", zTab); + }else{ + zExists = sqlite3_mprintf(""); + } + if( zExists==0 ) rc = SQLITE_NOMEM; + for(i=0; inArg && rc==SQLITE_OK; i++){ + char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab, + pAr->bVerbose ? "shell_putsnl(name)" : "name", + pAr->azArg[i], pAr->zDir, zExists); + rc = arExecSql(pAr, zSql2); + sqlite3_free(zSql2); + } +end_ar_transaction: + if( rc!=SQLITE_OK ){ + sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); + }else{ + rc = arExecSql(pAr, "RELEASE ar;"); + if( pAr->bZip && pAr->zFile ){ + zSql = sqlite3_mprintf("DROP TABLE %s", zTemp); + arExecSql(pAr, zSql); + sqlite3_free(zSql); + } + } + sqlite3_free(zExists); + return rc; +} + +/* +** Implementation of ".ar" dot command. +*/ +static int arDotCommand( + ShellState *pState, /* Current shell tool state */ + int fromCmdLine, /* True if -A command-line option, not .ar cmd */ + char **azArg, /* Array of arguments passed to dot command */ + int nArg /* Number of entries in azArg[] */ +){ + ArCommand cmd; + int rc; + memset(&cmd, 0, sizeof(cmd)); + cmd.fromCmdLine = fromCmdLine; + rc = arParseCommand(azArg, nArg, &cmd); + if( rc==SQLITE_OK ){ + int eDbType = SHELL_OPEN_UNSPEC; + cmd.p = pState; + cmd.db = pState->db; + if( cmd.zFile ){ + eDbType = deduceDatabaseType(cmd.zFile, 1); + }else{ + eDbType = pState->openMode; + } + if( eDbType==SHELL_OPEN_ZIPFILE ){ + if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){ + if( cmd.zFile==0 ){ + cmd.zSrcTable = sqlite3_mprintf("zip"); + }else{ + cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile); + } + } + cmd.bZip = 1; + }else if( cmd.zFile ){ + int flags; + if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS; + if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT + || cmd.eCmd==AR_CMD_UPDATE ){ + flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; + }else{ + flags = SQLITE_OPEN_READONLY; + } + cmd.db = 0; + if( cmd.bDryRun ){ + utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile, + eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : ""); + } + rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags, + eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0); + if( rc!=SQLITE_OK ){ + utf8_printf(stderr, "cannot open file: %s (%s)\n", + cmd.zFile, sqlite3_errmsg(cmd.db) + ); + goto end_ar_command; + } + sqlite3_fileio_init(cmd.db, 0, 0); + sqlite3_sqlar_init(cmd.db, 0, 0); + sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p, + shellPutsFunc, 0, 0); + + } + if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){ + if( cmd.eCmd!=AR_CMD_CREATE + && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0) + ){ + utf8_printf(stderr, "database does not contain an 'sqlar' table\n"); + rc = SQLITE_ERROR; + goto end_ar_command; + } + cmd.zSrcTable = sqlite3_mprintf("sqlar"); + } + + switch( cmd.eCmd ){ + case AR_CMD_CREATE: + rc = arCreateOrUpdateCommand(&cmd, 0, 0); + break; + + case AR_CMD_EXTRACT: + rc = arExtractCommand(&cmd); + break; + + case AR_CMD_LIST: + rc = arListCommand(&cmd); + break; + + case AR_CMD_HELP: + arUsage(pState->out); + break; + + case AR_CMD_INSERT: + rc = arCreateOrUpdateCommand(&cmd, 1, 0); + break; + + default: + assert( cmd.eCmd==AR_CMD_UPDATE ); + rc = arCreateOrUpdateCommand(&cmd, 1, 1); + break; + } + } +end_ar_command: + if( cmd.db!=pState->db ){ + close_db(cmd.db); + } + sqlite3_free(cmd.zSrcTable); + + return rc; +} +/* End of the ".archive" or ".ar" command logic +*******************************************************************************/ +#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */ + +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) +/* +** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, the SQL statement or statements in zSql are executed using +** database connection db and the error code written to *pRc before +** this function returns. +*/ +static void shellExec(sqlite3 *db, int *pRc, const char *zSql){ + int rc = *pRc; + if( rc==SQLITE_OK ){ + char *zErr = 0; + rc = sqlite3_exec(db, zSql, 0, 0, &zErr); + if( rc!=SQLITE_OK ){ + raw_printf(stderr, "SQL error: %s\n", zErr); + } + *pRc = rc; + } +} + +/* +** Like shellExec(), except that zFmt is a printf() style format string. +*/ +static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){ + char *z = 0; + if( *pRc==SQLITE_OK ){ + va_list ap; + va_start(ap, zFmt); + z = sqlite3_vmprintf(zFmt, ap); + va_end(ap); + if( z==0 ){ + *pRc = SQLITE_NOMEM; + }else{ + shellExec(db, pRc, z); + } + sqlite3_free(z); + } +} + +/* +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, an attempt is made to allocate, zero and return a pointer +** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set +** to SQLITE_NOMEM and NULL returned. +*/ +static void *shellMalloc(int *pRc, sqlite3_int64 nByte){ + void *pRet = 0; + if( *pRc==SQLITE_OK ){ + pRet = sqlite3_malloc64(nByte); + if( pRet==0 ){ + *pRc = SQLITE_NOMEM; + }else{ + memset(pRet, 0, nByte); + } + } + return pRet; +} + +/* +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, zFmt is treated as a printf() style string. The result of +** formatting it along with any trailing arguments is written into a +** buffer obtained from sqlite3_malloc(), and pointer to which is returned. +** It is the responsibility of the caller to eventually free this buffer +** using a call to sqlite3_free(). +** +** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL +** pointer returned. +*/ +static char *shellMPrintf(int *pRc, const char *zFmt, ...){ + char *z = 0; + if( *pRc==SQLITE_OK ){ + va_list ap; + va_start(ap, zFmt); + z = sqlite3_vmprintf(zFmt, ap); + va_end(ap); + if( z==0 ){ + *pRc = SQLITE_NOMEM; + } + } + return z; +} + +/* +** When running the ".recover" command, each output table, and the special +** orphaned row table if it is required, is represented by an instance +** of the following struct. +*/ +typedef struct RecoverTable RecoverTable; +struct RecoverTable { + char *zQuoted; /* Quoted version of table name */ + int nCol; /* Number of columns in table */ + char **azlCol; /* Array of column lists */ + int iPk; /* Index of IPK column */ +}; + +/* +** Free a RecoverTable object allocated by recoverFindTable() or +** recoverOrphanTable(). +*/ +static void recoverFreeTable(RecoverTable *pTab){ + if( pTab ){ + sqlite3_free(pTab->zQuoted); + if( pTab->azlCol ){ + int i; + for(i=0; i<=pTab->nCol; i++){ + sqlite3_free(pTab->azlCol[i]); + } + sqlite3_free(pTab->azlCol); + } + sqlite3_free(pTab); + } +} + +/* +** This function is a no-op if (*pRc) is not SQLITE_OK when it is called. +** Otherwise, it allocates and returns a RecoverTable object based on the +** final four arguments passed to this function. It is the responsibility +** of the caller to eventually free the returned object using +** recoverFreeTable(). +*/ +static RecoverTable *recoverNewTable( + int *pRc, /* IN/OUT: Error code */ + const char *zName, /* Name of table */ + const char *zSql, /* CREATE TABLE statement */ + int bIntkey, + int nCol +){ + sqlite3 *dbtmp = 0; /* sqlite3 handle for testing CREATE TABLE */ + int rc = *pRc; + RecoverTable *pTab = 0; + + pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable)); + if( rc==SQLITE_OK ){ + int nSqlCol = 0; + int bSqlIntkey = 0; + sqlite3_stmt *pStmt = 0; + + rc = sqlite3_open("", &dbtmp); + if( rc==SQLITE_OK ){ + sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0, + shellIdQuote, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0); + if( rc==SQLITE_ERROR ){ + rc = SQLITE_OK; + goto finished; + } + } + shellPreparePrintf(dbtmp, &rc, &pStmt, + "SELECT count(*) FROM pragma_table_info(%Q)", zName + ); + if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + nSqlCol = sqlite3_column_int(pStmt, 0); + } + shellFinalize(&rc, pStmt); + + if( rc!=SQLITE_OK || nSqlColiPk to the index + ** of the column, where columns are 0-numbered from left to right. + ** Or, if this is a WITHOUT ROWID table or if there is no IPK column, + ** leave zPk as "_rowid_" and pTab->iPk at -2. */ + pTab->iPk = -2; + if( bIntkey ){ + shellPreparePrintf(dbtmp, &rc, &pPkFinder, + "SELECT cid, name FROM pragma_table_info(%Q) " + " WHERE pk=1 AND type='integer' COLLATE nocase" + " AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)" + , zName, zName + ); + if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){ + pTab->iPk = sqlite3_column_int(pPkFinder, 0); + zPk = (const char*)sqlite3_column_text(pPkFinder, 1); + } + } + + pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName); + pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1)); + pTab->nCol = nSqlCol; + + if( bIntkey ){ + pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk); + }else{ + pTab->azlCol[0] = shellMPrintf(&rc, ""); + } + i = 1; + shellPreparePrintf(dbtmp, &rc, &pStmt, + "SELECT %Q || group_concat(shell_idquote(name), ', ') " + " FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) " + "FROM pragma_table_info(%Q)", + bIntkey ? ", " : "", pTab->iPk, + bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ", + zName + ); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zText = (const char*)sqlite3_column_text(pStmt, 0); + pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText); + i++; + } + shellFinalize(&rc, pStmt); + + shellFinalize(&rc, pPkFinder); + } + } + + finished: + sqlite3_close(dbtmp); + *pRc = rc; + if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){ + recoverFreeTable(pTab); + pTab = 0; + } + return pTab; +} + +/* +** This function is called to search the schema recovered from the +** sqlite_master table of the (possibly) corrupt database as part +** of a ".recover" command. Specifically, for a table with root page +** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the +** table must be a WITHOUT ROWID table, or if non-zero, not one of +** those. +** +** If a table is found, a (RecoverTable*) object is returned. Or, if +** no such table is found, but bIntkey is false and iRoot is the +** root page of an index in the recovered schema, then (*pbNoop) is +** set to true and NULL returned. Or, if there is no such table or +** index, NULL is returned and (*pbNoop) set to 0, indicating that +** the caller should write data to the orphans table. +*/ +static RecoverTable *recoverFindTable( + ShellState *pState, /* Shell state object */ + int *pRc, /* IN/OUT: Error code */ + int iRoot, /* Root page of table */ + int bIntkey, /* True for an intkey table */ + int nCol, /* Number of columns in table */ + int *pbNoop /* OUT: True if iRoot is root of index */ +){ + sqlite3_stmt *pStmt = 0; + RecoverTable *pRet = 0; + int bNoop = 0; + const char *zSql = 0; + const char *zName = 0; + + /* Search the recovered schema for an object with root page iRoot. */ + shellPreparePrintf(pState->db, pRc, &pStmt, + "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot + ); + while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zType = (const char*)sqlite3_column_text(pStmt, 0); + if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){ + bNoop = 1; + break; + } + if( sqlite3_stricmp(zType, "table")==0 ){ + zName = (const char*)sqlite3_column_text(pStmt, 1); + zSql = (const char*)sqlite3_column_text(pStmt, 2); + pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol); + break; + } + } + + shellFinalize(pRc, pStmt); + *pbNoop = bNoop; + return pRet; +} + +/* +** Return a RecoverTable object representing the orphans table. +*/ +static RecoverTable *recoverOrphanTable( + ShellState *pState, /* Shell state object */ + int *pRc, /* IN/OUT: Error code */ + const char *zLostAndFound, /* Base name for orphans table */ + int nCol /* Number of user data columns */ +){ + RecoverTable *pTab = 0; + if( nCol>=0 && *pRc==SQLITE_OK ){ + int i; + + /* This block determines the name of the orphan table. The prefered + ** name is zLostAndFound. But if that clashes with another name + ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1 + ** and so on until a non-clashing name is found. */ + int iTab = 0; + char *zTab = shellMPrintf(pRc, "%s", zLostAndFound); + sqlite3_stmt *pTest = 0; + shellPrepare(pState->db, pRc, + "SELECT 1 FROM recovery.schema WHERE name=?", &pTest + ); + if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); + while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){ + shellReset(pRc, pTest); + sqlite3_free(zTab); + zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++); + sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); + } + shellFinalize(pRc, pTest); + + pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable)); + if( pTab ){ + pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab); + pTab->nCol = nCol; + pTab->iPk = -2; + if( nCol>0 ){ + pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1)); + if( pTab->azlCol ){ + pTab->azlCol[nCol] = shellMPrintf(pRc, ""); + for(i=nCol-1; i>=0; i--){ + pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]); + } + } + } + + if( *pRc!=SQLITE_OK ){ + recoverFreeTable(pTab); + pTab = 0; + }else{ + raw_printf(pState->out, + "CREATE TABLE %s(rootpgno INTEGER, " + "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted + ); + for(i=0; iout, ", c%d", i); + } + raw_printf(pState->out, ");\n"); + } + } + sqlite3_free(zTab); + } + return pTab; +} + +/* +** This function is called to recover data from the database. A script +** to construct a new database containing all recovered data is output +** on stream pState->out. +*/ +static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ + int rc = SQLITE_OK; + sqlite3_stmt *pLoop = 0; /* Loop through all root pages */ + sqlite3_stmt *pPages = 0; /* Loop through all pages in a group */ + sqlite3_stmt *pCells = 0; /* Loop through all cells in a page */ + const char *zRecoveryDb = ""; /* Name of "recovery" database */ + const char *zLostAndFound = "lost_and_found"; + int i; + int nOrphan = -1; + RecoverTable *pOrphan = 0; + + int bFreelist = 1; /* 0 if --freelist-corrupt is specified */ + int bRowids = 1; /* 0 if --no-rowids */ + for(i=1; iout, azArg[0]); + return 1; + } + } + + shellExecPrintf(pState->db, &rc, + /* Attach an in-memory database named 'recovery'. Create an indexed + ** cache of the sqlite_dbptr virtual table. */ + "PRAGMA writable_schema = on;" + "ATTACH %Q AS recovery;" + "DROP TABLE IF EXISTS recovery.dbptr;" + "DROP TABLE IF EXISTS recovery.freelist;" + "DROP TABLE IF EXISTS recovery.map;" + "DROP TABLE IF EXISTS recovery.schema;" + "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb + ); + + if( bFreelist ){ + shellExec(pState->db, &rc, + "WITH trunk(pgno) AS (" + " SELECT shell_int32(" + " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x " + " WHERE x>0" + " UNION" + " SELECT shell_int32(" + " (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x " + " FROM trunk WHERE x>0" + ")," + "freelist(data, n, freepgno) AS (" + " SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno " + " FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno" + " UNION ALL" + " SELECT data, n-1, shell_int32(data, 2+n) " + " FROM freelist WHERE n>=0" + ")" + "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;" + ); + } + + /* If this is an auto-vacuum database, add all pointer-map pages to + ** the freelist table. Do this regardless of whether or not + ** --freelist-corrupt was specified. */ + shellExec(pState->db, &rc, + "WITH ptrmap(pgno) AS (" + " SELECT 2 WHERE shell_int32(" + " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13" + " )" + " UNION ALL " + " SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp " + " FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)" + ")" + "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap" + ); + + shellExec(pState->db, &rc, + "CREATE TABLE recovery.dbptr(" + " pgno, child, PRIMARY KEY(child, pgno)" + ") WITHOUT ROWID;" + "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) " + " SELECT * FROM sqlite_dbptr" + " WHERE pgno NOT IN freelist AND child NOT IN freelist;" + + /* Delete any pointer to page 1. This ensures that page 1 is considered + ** a root page, regardless of how corrupt the db is. */ + "DELETE FROM recovery.dbptr WHERE child = 1;" + + /* Delete all pointers to any pages that have more than one pointer + ** to them. Such pages will be treated as root pages when recovering + ** data. */ + "DELETE FROM recovery.dbptr WHERE child IN (" + " SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1" + ");" + + /* Create the "map" table that will (eventually) contain instructions + ** for dealing with each page in the db that contains one or more + ** records. */ + "CREATE TABLE recovery.map(" + "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT" + ");" + + /* Populate table [map]. If there are circular loops of pages in the + ** database, the following adds all pages in such a loop to the map + ** as individual root pages. This could be handled better. */ + "WITH pages(i, maxlen) AS (" + " SELECT page_count, (" + " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count" + " ) FROM pragma_page_count WHERE page_count>0" + " UNION ALL" + " SELECT i-1, (" + " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1" + " ) FROM pages WHERE i>=2" + ")" + "INSERT INTO recovery.map(pgno, maxlen, intkey, root) " + " SELECT i, maxlen, NULL, (" + " WITH p(orig, pgno, parent) AS (" + " SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)" + " UNION " + " SELECT i, p.parent, " + " (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p" + " )" + " SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)" + ") " + "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;" + "UPDATE recovery.map AS o SET intkey = (" + " SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno" + ");" + + /* Extract data from page 1 and any linked pages into table + ** recovery.schema. With the same schema as an sqlite_master table. */ + "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);" + "INSERT INTO recovery.schema SELECT " + " max(CASE WHEN field=0 THEN value ELSE NULL END)," + " max(CASE WHEN field=1 THEN value ELSE NULL END)," + " max(CASE WHEN field=2 THEN value ELSE NULL END)," + " max(CASE WHEN field=3 THEN value ELSE NULL END)," + " max(CASE WHEN field=4 THEN value ELSE NULL END)" + "FROM sqlite_dbdata WHERE pgno IN (" + " SELECT pgno FROM recovery.map WHERE root=1" + ")" + "GROUP BY pgno, cell;" + "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);" + ); + + /* Open a transaction, then print out all non-virtual, non-"sqlite_%" + ** CREATE TABLE statements that extracted from the existing schema. */ + if( rc==SQLITE_OK ){ + sqlite3_stmt *pStmt = 0; + /* ".recover" might output content in an order which causes immediate + ** foreign key constraints to be violated. So disable foreign-key + ** constraint enforcement to prevent problems when running the output + ** script. */ + raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n"); + raw_printf(pState->out, "BEGIN;\n"); + raw_printf(pState->out, "PRAGMA writable_schema = on;\n"); + shellPrepare(pState->db, &rc, + "SELECT sql FROM recovery.schema " + "WHERE type='table' AND sql LIKE 'create table%'", &pStmt + ); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0); + raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n", + &zCreateTable[12] + ); + } + shellFinalize(&rc, pStmt); + } + + /* Figure out if an orphan table will be required. And if so, how many + ** user columns it should contain */ + shellPrepare(pState->db, &rc, + "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1" + , &pLoop + ); + if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ + nOrphan = sqlite3_column_int(pLoop, 0); + } + shellFinalize(&rc, pLoop); + pLoop = 0; + + shellPrepare(pState->db, &rc, + "SELECT pgno FROM recovery.map WHERE root=?", &pPages + ); + + shellPrepare(pState->db, &rc, + "SELECT max(field), group_concat(shell_escape_crnl(quote" + "(case when (? AND field<0) then NULL else value end)" + "), ', ')" + ", min(field) " + "FROM sqlite_dbdata WHERE pgno = ? AND field != ?" + "GROUP BY cell", &pCells + ); + + /* Loop through each root page. */ + shellPrepare(pState->db, &rc, + "SELECT root, intkey, max(maxlen) FROM recovery.map" + " WHERE root>1 GROUP BY root, intkey ORDER BY root=(" + " SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'" + ")", &pLoop + ); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ + int iRoot = sqlite3_column_int(pLoop, 0); + int bIntkey = sqlite3_column_int(pLoop, 1); + int nCol = sqlite3_column_int(pLoop, 2); + int bNoop = 0; + RecoverTable *pTab; + + assert( bIntkey==0 || bIntkey==1 ); + pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop); + if( bNoop || rc ) continue; + if( pTab==0 ){ + if( pOrphan==0 ){ + pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); + } + pTab = pOrphan; + if( pTab==0 ) break; + } + + if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){ + raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n"); + } + sqlite3_bind_int(pPages, 1, iRoot); + if( bRowids==0 && pTab->iPk<0 ){ + sqlite3_bind_int(pCells, 1, 1); + }else{ + sqlite3_bind_int(pCells, 1, 0); + } + sqlite3_bind_int(pCells, 3, pTab->iPk); + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){ + int iPgno = sqlite3_column_int(pPages, 0); + sqlite3_bind_int(pCells, 2, iPgno); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){ + int nField = sqlite3_column_int(pCells, 0); + int iMin = sqlite3_column_int(pCells, 2); + const char *zVal = (const char*)sqlite3_column_text(pCells, 1); + + RecoverTable *pTab2 = pTab; + if( pTab!=pOrphan && (iMin<0)!=bIntkey ){ + if( pOrphan==0 ){ + pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); + } + pTab2 = pOrphan; + if( pTab2==0 ) break; + } + + nField = nField+1; + if( pTab2==pOrphan ){ + raw_printf(pState->out, + "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n", + pTab2->zQuoted, iRoot, iPgno, nField, + iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField] + ); + }else{ + raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n", + pTab2->zQuoted, pTab2->azlCol[nField], zVal + ); + } + } + shellReset(&rc, pCells); + } + shellReset(&rc, pPages); + if( pTab!=pOrphan ) recoverFreeTable(pTab); + } + shellFinalize(&rc, pLoop); + shellFinalize(&rc, pPages); + shellFinalize(&rc, pCells); + recoverFreeTable(pOrphan); + + /* The rest of the schema */ + if( rc==SQLITE_OK ){ + sqlite3_stmt *pStmt = 0; + shellPrepare(pState->db, &rc, + "SELECT sql, name FROM recovery.schema " + "WHERE sql NOT LIKE 'create table%'", &pStmt + ); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zSql = (const char*)sqlite3_column_text(pStmt, 0); + if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){ + const char *zName = (const char*)sqlite3_column_text(pStmt, 1); + char *zPrint = shellMPrintf(&rc, + "INSERT INTO sqlite_master VALUES('table', %Q, %Q, 0, %Q)", + zName, zName, zSql + ); + raw_printf(pState->out, "%s;\n", zPrint); + sqlite3_free(zPrint); + }else{ + raw_printf(pState->out, "%s;\n", zSql); + } + } + shellFinalize(&rc, pStmt); + } + + if( rc==SQLITE_OK ){ + raw_printf(pState->out, "PRAGMA writable_schema = off;\n"); + raw_printf(pState->out, "COMMIT;\n"); + } + sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0); + return rc; +} +#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ + + +/* +** If an input line begins with "." then invoke this routine to +** process that line. +** +** Return 1 on error, 2 to exit, and 0 otherwise. +*/ +static int do_meta_command(char *zLine, ShellState *p){ + int h = 1; + int nArg = 0; + int n, c; + int rc = 0; + char *azArg[52]; + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( p->expert.pExpert ){ + expertFinish(p, 1, 0); + } +#endif + + /* Parse the input line into tokens. + */ + while( zLine[h] && nArgdb, shellAuth, p); + }else{ + sqlite3_set_authorizer(p->db, 0, 0); + } + }else +#endif + +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) + if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){ + open_db(p, 0); + rc = arDotCommand(p, 0, azArg, nArg); + }else +#endif + + if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0) + || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0) + ){ + const char *zDestFile = 0; + const char *zDb = 0; + sqlite3 *pDest; + sqlite3_backup *pBackup; + int j; + int bAsync = 0; + const char *zVfs = 0; + for(j=1; jdb, zDb); + if( pBackup==0 ){ + utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); + close_db(pDest); + return 1; + } + while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} + sqlite3_backup_finish(pBackup); + if( rc==SQLITE_DONE ){ + rc = 0; + }else{ + utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); + rc = 1; + } + close_db(pDest); + }else + + if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){ + if( nArg==2 ){ + bail_on_error = booleanValue(azArg[1]); + }else{ + raw_printf(stderr, "Usage: .bail on|off\n"); + rc = 1; + } + }else + + if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){ + if( nArg==2 ){ + if( booleanValue(azArg[1]) ){ + setBinaryMode(p->out, 1); + }else{ + setTextMode(p->out, 1); + } + }else{ + raw_printf(stderr, "Usage: .binary on|off\n"); + rc = 1; + } + }else + + if( c=='c' && strcmp(azArg[0],"cd")==0 ){ + if( nArg==2 ){ +#if defined(_WIN32) || defined(WIN32) + wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]); + rc = !SetCurrentDirectoryW(z); + sqlite3_free(z); +#else + rc = chdir(azArg[1]); +#endif + if( rc ){ + utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]); + rc = 1; + } + }else{ + raw_printf(stderr, "Usage: .cd DIRECTORY\n"); + rc = 1; + } + }else + + /* The undocumented ".breakpoint" command causes a call to the no-op + ** routine named test_breakpoint(). + */ + if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){ + test_breakpoint(); + }else + + if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){ + if( nArg==2 ){ + setOrClearFlag(p, SHFLG_CountChanges, azArg[1]); + }else{ + raw_printf(stderr, "Usage: .changes on|off\n"); + rc = 1; + } + }else + + /* Cancel output redirection, if it is currently set (by .testcase) + ** Then read the content of the testcase-out.txt file and compare against + ** azArg[1]. If there are differences, report an error and exit. + */ + if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){ + char *zRes = 0; + output_reset(p); + if( nArg!=2 ){ + raw_printf(stderr, "Usage: .check GLOB-PATTERN\n"); + rc = 2; + }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){ + raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n"); + rc = 2; + }else if( testcase_glob(azArg[1],zRes)==0 ){ + utf8_printf(stderr, + "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n", + p->zTestcase, azArg[1], zRes); + rc = 1; + }else{ + utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase); + p->nCheck++; + } + sqlite3_free(zRes); + }else + + if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){ + if( nArg==2 ){ + tryToClone(p, azArg[1]); + }else{ + raw_printf(stderr, "Usage: .clone FILENAME\n"); + rc = 1; + } + }else + + if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ + ShellState data; + char *zErrMsg = 0; + open_db(p, 0); + memcpy(&data, p, sizeof(data)); + data.showHeader = 0; + data.cMode = data.mode = MODE_List; + sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": "); + data.cnt = 0; + sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list", + callback, &data, &zErrMsg); + if( zErrMsg ){ + utf8_printf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + rc = 1; + } + }else + + if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){ + static const struct DbConfigChoices { + const char *zName; + int op; + } aDbConfig[] = { + { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, + { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, + { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, + { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, + { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, + { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, + { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, + { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, + { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, + { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT }, + { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, + { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, + { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, + { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, + { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA }, + { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, + }; + int ii, v; + open_db(p, 0); + for(ii=0; ii1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue; + if( nArg>=3 ){ + sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); + } + sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); + utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); + if( nArg>1 ) break; + } + if( nArg>1 && ii==ArraySize(aDbConfig) ){ + utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]); + utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n"); + } + }else + + if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){ + rc = shell_dbinfo_command(p, nArg, azArg); + }else + +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) + if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){ + open_db(p, 0); + rc = recoverDatabaseCmd(p, nArg, azArg); + }else +#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ + + if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ + char *zLike = 0; + char *zSql; + int i; + int savedShowHeader = p->showHeader; + int savedShellFlags = p->shellFlgs; + ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo); + for(i=1; iout, "PRAGMA foreign_keys=OFF;\n"); + raw_printf(p->out, "BEGIN TRANSACTION;\n"); + p->writableSchema = 0; + p->showHeader = 0; + /* Set writable_schema=ON since doing so forces SQLite to initialize + ** as much of the schema as it can even if the sqlite_master table is + ** corrupt. */ + sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); + p->nErr = 0; + if( zLike==0 ) zLike = sqlite3_mprintf("true"); + zSql = sqlite3_mprintf( + "SELECT name, type, sql FROM sqlite_master " + "WHERE (%s) AND type=='table'" + " AND sql NOT NULL" + " ORDER BY tbl_name='sqlite_sequence', rowid", + zLike + ); + run_schema_dump_query(p,zSql); + sqlite3_free(zSql); + zSql = sqlite3_mprintf( + "SELECT sql FROM sqlite_master " + "WHERE (%s) AND sql NOT NULL" + " AND type IN ('index','trigger','view')", + zLike + ); + run_table_dump_query(p, zSql); + sqlite3_free(zSql); + sqlite3_free(zLike); + if( p->writableSchema ){ + raw_printf(p->out, "PRAGMA writable_schema=OFF;\n"); + p->writableSchema = 0; + } + sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); + sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); + raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n"); + p->showHeader = savedShowHeader; + p->shellFlgs = savedShellFlags; + }else + + if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){ + if( nArg==2 ){ + setOrClearFlag(p, SHFLG_Echo, azArg[1]); + }else{ + raw_printf(stderr, "Usage: .echo on|off\n"); + rc = 1; + } + }else + + if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ + if( nArg==2 ){ + p->autoEQPtest = 0; + if( p->autoEQPtrace ){ + if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); + p->autoEQPtrace = 0; + } + if( strcmp(azArg[1],"full")==0 ){ + p->autoEQP = AUTOEQP_full; + }else if( strcmp(azArg[1],"trigger")==0 ){ + p->autoEQP = AUTOEQP_trigger; +#ifdef SQLITE_DEBUG + }else if( strcmp(azArg[1],"test")==0 ){ + p->autoEQP = AUTOEQP_on; + p->autoEQPtest = 1; + }else if( strcmp(azArg[1],"trace")==0 ){ + p->autoEQP = AUTOEQP_full; + p->autoEQPtrace = 1; + open_db(p, 0); + sqlite3_exec(p->db, "SELECT name FROM sqlite_master LIMIT 1", 0, 0, 0); + sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); +#endif + }else{ + p->autoEQP = (u8)booleanValue(azArg[1]); + } + }else{ + raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n"); + rc = 1; + } + }else + + if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ + if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc); + rc = 2; + }else + + /* The ".explain" command is automatic now. It is largely pointless. It + ** retained purely for backwards compatibility */ + if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ + int val = 1; + if( nArg>=2 ){ + if( strcmp(azArg[1],"auto")==0 ){ + val = 99; + }else{ + val = booleanValue(azArg[1]); + } + } + if( val==1 && p->mode!=MODE_Explain ){ + p->normalMode = p->mode; + p->mode = MODE_Explain; + p->autoExplain = 0; + }else if( val==0 ){ + if( p->mode==MODE_Explain ) p->mode = p->normalMode; + p->autoExplain = 0; + }else if( val==99 ){ + if( p->mode==MODE_Explain ) p->mode = p->normalMode; + p->autoExplain = 1; + } + }else + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){ + open_db(p, 0); + expertDotCommand(p, azArg, nArg); + }else +#endif + + if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){ + static const struct { + const char *zCtrlName; /* Name of a test-control option */ + int ctrlCode; /* Integer code for that option */ + const char *zUsage; /* Usage notes */ + } aCtrl[] = { + { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" }, + { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" }, + /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/ + { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" }, + { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" }, + /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/ + { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" }, + { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" }, + { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" }, + { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" }, + }; + int filectrl = -1; + int iCtrl = -1; + sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */ + int isOk = 0; /* 0: usage 1: %lld 2: no-result */ + int n2, i; + const char *zCmd = 0; + const char *zSchema = 0; + + open_db(p, 0); + zCmd = nArg>=2 ? azArg[1] : "help"; + + if( zCmd[0]=='-' + && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0) + && nArg>=4 + ){ + zSchema = azArg[2]; + for(i=3; iout, "Available file-controls:\n"); + for(i=0; iout, " .filectrl %s %s\n", + aCtrl[i].zCtrlName, aCtrl[i].zUsage); + } + rc = 1; + goto meta_command_exit; + } + + /* convert filectrl text option to value. allow any unique prefix + ** of the option name, or a numerical value. */ + n2 = strlen30(zCmd); + for(i=0; idb, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes); + isOk = 1; + break; + } + case SQLITE_FCNTL_LOCK_TIMEOUT: + case SQLITE_FCNTL_CHUNK_SIZE: { + int x; + if( nArg!=3 ) break; + x = (int)integerValue(azArg[2]); + sqlite3_file_control(p->db, zSchema, filectrl, &x); + isOk = 2; + break; + } + case SQLITE_FCNTL_PERSIST_WAL: + case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { + int x; + if( nArg!=2 && nArg!=3 ) break; + x = nArg==3 ? booleanValue(azArg[2]) : -1; + sqlite3_file_control(p->db, zSchema, filectrl, &x); + iRes = x; + isOk = 1; + break; + } + case SQLITE_FCNTL_HAS_MOVED: { + int x; + if( nArg!=2 ) break; + sqlite3_file_control(p->db, zSchema, filectrl, &x); + iRes = x; + isOk = 1; + break; + } + case SQLITE_FCNTL_TEMPFILENAME: { + char *z = 0; + if( nArg!=2 ) break; + sqlite3_file_control(p->db, zSchema, filectrl, &z); + if( z ){ + utf8_printf(p->out, "%s\n", z); + sqlite3_free(z); + } + isOk = 2; + break; + } + case SQLITE_FCNTL_RESERVE_BYTES: { + int x; + if( nArg>=3 ){ + x = atoi(azArg[2]); + sqlite3_file_control(p->db, zSchema, filectrl, &x); + } + x = -1; + sqlite3_file_control(p->db, zSchema, filectrl, &x); + utf8_printf(p->out,"%d\n", x); + isOk = 2; + break; + } + } + } + if( isOk==0 && iCtrl>=0 ){ + utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); + rc = 1; + }else if( isOk==1 ){ + char zBuf[100]; + sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes); + raw_printf(p->out, "%s\n", zBuf); + } + }else + + if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ + ShellState data; + char *zErrMsg = 0; + int doStats = 0; + memcpy(&data, p, sizeof(data)); + data.showHeader = 0; + data.cMode = data.mode = MODE_Semi; + if( nArg==2 && optionMatch(azArg[1], "indent") ){ + data.cMode = data.mode = MODE_Pretty; + nArg = 1; + } + if( nArg!=1 ){ + raw_printf(stderr, "Usage: .fullschema ?--indent?\n"); + rc = 1; + goto meta_command_exit; + } + open_db(p, 0); + rc = sqlite3_exec(p->db, + "SELECT sql FROM" + " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" + " FROM sqlite_master UNION ALL" + " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) " + "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " + "ORDER BY rowid", + callback, &data, &zErrMsg + ); + if( rc==SQLITE_OK ){ + sqlite3_stmt *pStmt; + rc = sqlite3_prepare_v2(p->db, + "SELECT rowid FROM sqlite_master" + " WHERE name GLOB 'sqlite_stat[134]'", + -1, &pStmt, 0); + doStats = sqlite3_step(pStmt)==SQLITE_ROW; + sqlite3_finalize(pStmt); + } + if( doStats==0 ){ + raw_printf(p->out, "/* No STAT tables available */\n"); + }else{ + raw_printf(p->out, "ANALYZE sqlite_master;\n"); + sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'", + callback, &data, &zErrMsg); + data.cMode = data.mode = MODE_Insert; + data.zDestTable = "sqlite_stat1"; + shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg); + data.zDestTable = "sqlite_stat4"; + shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg); + raw_printf(p->out, "ANALYZE sqlite_master;\n"); + } + }else + + if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ + if( nArg==2 ){ + p->showHeader = booleanValue(azArg[1]); + }else{ + raw_printf(stderr, "Usage: .headers on|off\n"); + rc = 1; + } + }else + + if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ + if( nArg>=2 ){ + n = showHelp(p->out, azArg[1]); + if( n==0 ){ + utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]); + } + }else{ + showHelp(p->out, 0); + } + }else + + if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ + char *zTable = 0; /* Insert data into this table */ + char *zFile = 0; /* Name of file to extra content from */ + sqlite3_stmt *pStmt = NULL; /* A statement */ + int nCol; /* Number of columns in the table */ + int nByte; /* Number of bytes in an SQL string */ + int i, j; /* Loop counters */ + int needCommit; /* True to COMMIT or ROLLBACK at end */ + int nSep; /* Number of bytes in p->colSeparator[] */ + char *zSql; /* An SQL statement */ + ImportCtx sCtx; /* Reader context */ + char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ + int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */ + int eVerbose = 0; /* Larger for more console output */ + int nSkip = 0; /* Initial lines to skip */ + int useOutputMode = 1; /* Use output mode to determine separators */ + + memset(&sCtx, 0, sizeof(sCtx)); + if( p->mode==MODE_Ascii ){ + xRead = ascii_read_one_field; + }else{ + xRead = csv_read_one_field; + } + for(i=1; iout, "ERROR: extra argument: \"%s\". Usage:\n", z); + showHelp(p->out, "import"); + rc = 1; + goto meta_command_exit; + } + }else if( strcmp(z,"-v")==0 ){ + eVerbose++; + }else if( strcmp(z,"-skip")==0 && iout, "ERROR: unknown option: \"%s\". Usage:\n", z); + showHelp(p->out, "import"); + rc = 1; + goto meta_command_exit; + } + } + if( zTable==0 ){ + utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n", + zFile==0 ? "FILE" : "TABLE"); + showHelp(p->out, "import"); + rc = 1; + goto meta_command_exit; + } + seenInterrupt = 0; + open_db(p, 0); + if( useOutputMode ){ + /* If neither the --csv or --ascii options are specified, then set + ** the column and row separator characters from the output mode. */ + nSep = strlen30(p->colSeparator); + if( nSep==0 ){ + raw_printf(stderr, + "Error: non-null column separator required for import\n"); + rc = 1; + goto meta_command_exit; + } + if( nSep>1 ){ + raw_printf(stderr, + "Error: multi-character column separators not allowed" + " for import\n"); + rc = 1; + goto meta_command_exit; + } + nSep = strlen30(p->rowSeparator); + if( nSep==0 ){ + raw_printf(stderr, + "Error: non-null row separator required for import\n"); + rc = 1; + goto meta_command_exit; + } + if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){ + /* When importing CSV (only), if the row separator is set to the + ** default output row separator, change it to the default input + ** row separator. This avoids having to maintain different input + ** and output row separators. */ + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); + nSep = strlen30(p->rowSeparator); + } + if( nSep>1 ){ + raw_printf(stderr, "Error: multi-character row separators not allowed" + " for import\n"); + rc = 1; + goto meta_command_exit; + } + sCtx.cColSep = p->colSeparator[0]; + sCtx.cRowSep = p->rowSeparator[0]; + } + sCtx.zFile = zFile; + sCtx.nLine = 1; + if( sCtx.zFile[0]=='|' ){ +#ifdef SQLITE_OMIT_POPEN + raw_printf(stderr, "Error: pipes are not supported in this OS\n"); + rc = 1; + goto meta_command_exit; +#else + sCtx.in = popen(sCtx.zFile+1, "r"); + sCtx.zFile = ""; + xCloser = pclose; +#endif + }else{ + sCtx.in = fopen(sCtx.zFile, "rb"); + xCloser = fclose; + } + if( sCtx.in==0 ){ + utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); + rc = 1; + goto meta_command_exit; + } + if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){ + char zSep[2]; + zSep[1] = 0; + zSep[0] = sCtx.cColSep; + utf8_printf(p->out, "Column separator "); + output_c_string(p->out, zSep); + utf8_printf(p->out, ", row separator "); + zSep[0] = sCtx.cRowSep; + output_c_string(p->out, zSep); + utf8_printf(p->out, "\n"); + } + while( (nSkip--)>0 ){ + while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){} + sCtx.nLine++; + } + zSql = sqlite3_mprintf("SELECT * FROM %s", zTable); + if( zSql==0 ){ + xCloser(sCtx.in); + shell_out_of_memory(); + } + nByte = strlen30(zSql); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ + if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ + char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable); + char cSep = '('; + while( xRead(&sCtx) ){ + zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z); + cSep = ','; + if( sCtx.cTerm!=sCtx.cColSep ) break; + } + if( cSep=='(' ){ + sqlite3_free(zCreate); + sqlite3_free(sCtx.z); + xCloser(sCtx.in); + utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); + rc = 1; + goto meta_command_exit; + } + zCreate = sqlite3_mprintf("%z\n)", zCreate); + if( eVerbose>=1 ){ + utf8_printf(p->out, "%s\n", zCreate); + } + rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); + sqlite3_free(zCreate); + if( rc ){ + utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable, + sqlite3_errmsg(p->db)); + sqlite3_free(sCtx.z); + xCloser(sCtx.in); + rc = 1; + goto meta_command_exit; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + } + sqlite3_free(zSql); + if( rc ){ + if (pStmt) sqlite3_finalize(pStmt); + utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); + xCloser(sCtx.in); + rc = 1; + goto meta_command_exit; + } + nCol = sqlite3_column_count(pStmt); + sqlite3_finalize(pStmt); + pStmt = 0; + if( nCol==0 ) return 0; /* no columns, no error */ + zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); + if( zSql==0 ){ + xCloser(sCtx.in); + shell_out_of_memory(); + } + sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); + j = strlen30(zSql); + for(i=1; i=2 ){ + utf8_printf(p->out, "Insert using: %s\n", zSql); + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rc ){ + utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); + if (pStmt) sqlite3_finalize(pStmt); + xCloser(sCtx.in); + rc = 1; + goto meta_command_exit; + } + needCommit = sqlite3_get_autocommit(p->db); + if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); + do{ + int startLine = sCtx.nLine; + for(i=0; imode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break; + sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT); + if( i=nCol ){ + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ){ + utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, + startLine, sqlite3_errmsg(p->db)); + sCtx.nErr++; + }else{ + sCtx.nRow++; + } + } + }while( sCtx.cTerm!=EOF ); + + xCloser(sCtx.in); + sqlite3_free(sCtx.z); + sqlite3_finalize(pStmt); + if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); + if( eVerbose>0 ){ + utf8_printf(p->out, + "Added %d rows with %d errors using %d lines of input\n", + sCtx.nRow, sCtx.nErr, sCtx.nLine-1); + } + }else + +#ifndef SQLITE_UNTESTABLE + if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){ + char *zSql; + char *zCollist = 0; + sqlite3_stmt *pStmt; + int tnum = 0; + int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */ + int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */ + int i; + if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ + utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n" + " .imposter off\n"); + /* Also allowed, but not documented: + ** + ** .imposter TABLE IMPOSTER + ** + ** where TABLE is a WITHOUT ROWID table. In that case, the + ** imposter is another WITHOUT ROWID table with the columns in + ** storage order. */ + rc = 1; + goto meta_command_exit; + } + open_db(p, 0); + if( nArg==2 ){ + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); + goto meta_command_exit; + } + zSql = sqlite3_mprintf( + "SELECT rootpage, 0 FROM sqlite_master" + " WHERE name='%q' AND type='index'" + "UNION ALL " + "SELECT rootpage, 1 FROM sqlite_master" + " WHERE name='%q' AND type='table'" + " AND sql LIKE '%%without%%rowid%%'", + azArg[1], azArg[1] + ); + sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( sqlite3_step(pStmt)==SQLITE_ROW ){ + tnum = sqlite3_column_int(pStmt, 0); + isWO = sqlite3_column_int(pStmt, 1); + } + sqlite3_finalize(pStmt); + zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + i = 0; + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + char zLabel[20]; + const char *zCol = (const char*)sqlite3_column_text(pStmt,2); + i++; + if( zCol==0 ){ + if( sqlite3_column_int(pStmt,1)==-1 ){ + zCol = "_ROWID_"; + }else{ + sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); + zCol = zLabel; + } + } + if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){ + lenPK = (int)strlen(zCollist); + } + if( zCollist==0 ){ + zCollist = sqlite3_mprintf("\"%w\"", zCol); + }else{ + zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); + } + } + sqlite3_finalize(pStmt); + if( i==0 || tnum==0 ){ + utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); + rc = 1; + sqlite3_free(zCollist); + goto meta_command_exit; + } + if( lenPK==0 ) lenPK = 100000; + zSql = sqlite3_mprintf( + "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID", + azArg[2], zCollist, lenPK, zCollist); + sqlite3_free(zCollist); + rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); + if( rc ){ + utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); + }else{ + utf8_printf(stdout, "%s;\n", zSql); + raw_printf(stdout, + "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n", + azArg[1], isWO ? "table" : "index" + ); + } + }else{ + raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); + rc = 1; + } + sqlite3_free(zSql); + }else +#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ + +#ifdef SQLITE_ENABLE_IOTRACE + if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ + SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...); + if( iotrace && iotrace!=stdout ) fclose(iotrace); + iotrace = 0; + if( nArg<2 ){ + sqlite3IoTrace = 0; + }else if( strcmp(azArg[1], "-")==0 ){ + sqlite3IoTrace = iotracePrintf; + iotrace = stdout; + }else{ + iotrace = fopen(azArg[1], "w"); + if( iotrace==0 ){ + utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); + sqlite3IoTrace = 0; + rc = 1; + }else{ + sqlite3IoTrace = iotracePrintf; + } + } + }else +#endif + + if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ + static const struct { + const char *zLimitName; /* Name of a limit */ + int limitCode; /* Integer code for that limit */ + } aLimit[] = { + { "length", SQLITE_LIMIT_LENGTH }, + { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, + { "column", SQLITE_LIMIT_COLUMN }, + { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, + { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, + { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, + { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, + { "attached", SQLITE_LIMIT_ATTACHED }, + { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, + { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, + { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, + { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, + }; + int i, n2; + open_db(p, 0); + if( nArg==1 ){ + for(i=0; idb, aLimit[i].limitCode, -1)); + } + }else if( nArg>3 ){ + raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n"); + rc = 1; + goto meta_command_exit; + }else{ + int iLimit = -1; + n2 = strlen30(azArg[1]); + for(i=0; idb, aLimit[iLimit].limitCode, + (int)integerValue(azArg[2])); + } + printf("%20s %d\n", aLimit[iLimit].zLimitName, + sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); + } + }else + + if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){ + open_db(p, 0); + lintDotCommand(p, azArg, nArg); + }else + +#ifndef SQLITE_OMIT_LOAD_EXTENSION + if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ + const char *zFile, *zProc; + char *zErrMsg = 0; + if( nArg<2 ){ + raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n"); + rc = 1; + goto meta_command_exit; + } + zFile = azArg[1]; + zProc = nArg>=3 ? azArg[2] : 0; + open_db(p, 0); + rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); + if( rc!=SQLITE_OK ){ + utf8_printf(stderr, "Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + rc = 1; + } + }else +#endif + + if( c=='l' && strncmp(azArg[0], "log", n)==0 ){ + if( nArg!=2 ){ + raw_printf(stderr, "Usage: .log FILENAME\n"); + rc = 1; + }else{ + const char *zFile = azArg[1]; + output_file_close(p->pLog); + p->pLog = output_file_open(zFile, 0); + } + }else + + if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){ + const char *zMode = nArg>=2 ? azArg[1] : ""; + int n2 = strlen30(zMode); + int c2 = zMode[0]; + if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){ + p->mode = MODE_Line; + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); + }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){ + p->mode = MODE_Column; + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); + }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){ + p->mode = MODE_List; + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); + }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){ + p->mode = MODE_Html; + }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){ + p->mode = MODE_Tcl; + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); + }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){ + p->mode = MODE_Csv; + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); + }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){ + p->mode = MODE_List; + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); + }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){ + p->mode = MODE_Insert; + set_table_name(p, nArg>=3 ? azArg[2] : "table"); + }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ + p->mode = MODE_Quote; + }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ + p->mode = MODE_Ascii; + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); + }else if( nArg==1 ){ + raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); + }else{ + raw_printf(stderr, "Error: mode should be one of: " + "ascii column csv html insert line list quote tabs tcl\n"); + rc = 1; + } + p->cMode = p->mode; + }else + + if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ + if( nArg==2 ){ + sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, + "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]); + }else{ + raw_printf(stderr, "Usage: .nullvalue STRING\n"); + rc = 1; + } + }else + +#ifdef SQLITE_DEBUG + if( c=='o' && strcmp(azArg[0],"oom")==0 ){ + int i; + for(i=1; iout, "missing argument on \"%s\"\n", azArg[i]); + rc = 1; + }else{ + oomRepeat = (int)integerValue(azArg[++i]); + } + }else if( IsDigit(z[0]) ){ + oomCounter = (int)integerValue(azArg[i]); + }else{ + raw_printf(p->out, "unknown argument: \"%s\"\n", azArg[i]); + raw_printf(p->out, "Usage: .oom [--repeat N] [M]\n"); + rc = 1; + } + } + if( rc==0 ){ + raw_printf(p->out, "oomCounter = %d\n", oomCounter); + raw_printf(p->out, "oomRepeat = %d\n", oomRepeat); + } + }else +#endif /* SQLITE_DEBUG */ + + if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){ + char *zNewFilename; /* Name of the database file to open */ + int iName = 1; /* Index in azArg[] of the filename */ + int newFlag = 0; /* True to delete file before opening */ + /* Close the existing database */ + session_close_all(p); + close_db(p->db); + p->db = 0; + p->zDbFilename = 0; + sqlite3_free(p->zFreeOnClose); + p->zFreeOnClose = 0; + p->openMode = SHELL_OPEN_UNSPEC; + p->openFlags = 0; + p->szMax = 0; + /* Check for command-line arguments */ + for(iName=1; iNameopenMode = SHELL_OPEN_ZIPFILE; +#endif + }else if( optionMatch(z, "append") ){ + p->openMode = SHELL_OPEN_APPENDVFS; + }else if( optionMatch(z, "readonly") ){ + p->openMode = SHELL_OPEN_READONLY; + }else if( optionMatch(z, "nofollow") ){ + p->openFlags |= SQLITE_OPEN_NOFOLLOW; +#ifdef SQLITE_ENABLE_DESERIALIZE + }else if( optionMatch(z, "deserialize") ){ + p->openMode = SHELL_OPEN_DESERIALIZE; + }else if( optionMatch(z, "hexdb") ){ + p->openMode = SHELL_OPEN_HEXDB; + }else if( optionMatch(z, "maxsize") && iName+1szMax = integerValue(azArg[++iName]); +#endif /* SQLITE_ENABLE_DESERIALIZE */ + }else if( z[0]=='-' ){ + utf8_printf(stderr, "unknown option: %s\n", z); + rc = 1; + goto meta_command_exit; + } + } + /* If a filename is specified, try to open it first */ + zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0; + if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){ + if( newFlag ) shellDeleteFile(zNewFilename); + p->zDbFilename = zNewFilename; + open_db(p, OPEN_DB_KEEPALIVE); + if( p->db==0 ){ + utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename); + sqlite3_free(zNewFilename); + }else{ + p->zFreeOnClose = zNewFilename; + } + } + if( p->db==0 ){ + /* As a fall-back open a TEMP database */ + p->zDbFilename = 0; + open_db(p, 0); + } + }else + + if( (c=='o' + && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0)) + || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0) + ){ + const char *zFile = 0; + int bTxtMode = 0; + int i; + int eMode = 0; + int bBOM = 0; + int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */ + + if( c=='e' ){ + eMode = 'x'; + bOnce = 2; + }else if( strncmp(azArg[0],"once",n)==0 ){ + bOnce = 1; + } + for(i=1; iout, "ERROR: unknown option: \"%s\". Usage:\n", + azArg[i]); + showHelp(p->out, azArg[0]); + rc = 1; + goto meta_command_exit; + } + }else if( zFile==0 ){ + zFile = z; + }else{ + utf8_printf(p->out,"ERROR: extra parameter: \"%s\". Usage:\n", + azArg[i]); + showHelp(p->out, azArg[0]); + rc = 1; + goto meta_command_exit; + } + } + if( zFile==0 ) zFile = "stdout"; + if( bOnce ){ + p->outCount = 2; + }else{ + p->outCount = 0; + } + output_reset(p); +#ifndef SQLITE_NOHAVE_SYSTEM + if( eMode=='e' || eMode=='x' ){ + p->doXdgOpen = 1; + outputModePush(p); + if( eMode=='x' ){ + /* spreadsheet mode. Output as CSV. */ + newTempFile(p, "csv"); + ShellClearFlag(p, SHFLG_Echo); + p->mode = MODE_Csv; + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); + }else{ + /* text editor mode */ + newTempFile(p, "txt"); + bTxtMode = 1; + } + zFile = p->zTempFile; + } +#endif /* SQLITE_NOHAVE_SYSTEM */ + if( zFile[0]=='|' ){ +#ifdef SQLITE_OMIT_POPEN + raw_printf(stderr, "Error: pipes are not supported in this OS\n"); + rc = 1; + p->out = stdout; +#else + p->out = popen(zFile + 1, "w"); + if( p->out==0 ){ + utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1); + p->out = stdout; + rc = 1; + }else{ + if( bBOM ) fprintf(p->out,"\357\273\277"); + sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); + } +#endif + }else{ + p->out = output_file_open(zFile, bTxtMode); + if( p->out==0 ){ + if( strcmp(zFile,"off")!=0 ){ + utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile); + } + p->out = stdout; + rc = 1; + } else { + if( bBOM ) fprintf(p->out,"\357\273\277"); + sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); + } + } + }else + + if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){ + open_db(p,0); + if( nArg<=1 ) goto parameter_syntax_error; + + /* .parameter clear + ** Clear all bind parameters by dropping the TEMP table that holds them. + */ + if( nArg==2 && strcmp(azArg[1],"clear")==0 ){ + sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;", + 0, 0, 0); + }else + + /* .parameter list + ** List all bind parameters. + */ + if( nArg==2 && strcmp(azArg[1],"list")==0 ){ + sqlite3_stmt *pStmt = 0; + int rx; + int len = 0; + rx = sqlite3_prepare_v2(p->db, + "SELECT max(length(key)) " + "FROM temp.sqlite_parameters;", -1, &pStmt, 0); + if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ + len = sqlite3_column_int(pStmt, 0); + if( len>40 ) len = 40; + } + sqlite3_finalize(pStmt); + pStmt = 0; + if( len ){ + rx = sqlite3_prepare_v2(p->db, + "SELECT key, quote(value) " + "FROM temp.sqlite_parameters;", -1, &pStmt, 0); + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0), + sqlite3_column_text(pStmt,1)); + } + sqlite3_finalize(pStmt); + } + }else + + /* .parameter init + ** Make sure the TEMP table used to hold bind parameters exists. + ** Create it if necessary. + */ + if( nArg==2 && strcmp(azArg[1],"init")==0 ){ + bind_table_init(p); + }else + + /* .parameter set NAME VALUE + ** Set or reset a bind parameter. NAME should be the full parameter + ** name exactly as it appears in the query. (ex: $abc, @def). The + ** VALUE can be in either SQL literal notation, or if not it will be + ** understood to be a text string. + */ + if( nArg==4 && strcmp(azArg[1],"set")==0 ){ + int rx; + char *zSql; + sqlite3_stmt *pStmt; + const char *zKey = azArg[2]; + const char *zValue = azArg[3]; + bind_table_init(p); + zSql = sqlite3_mprintf( + "REPLACE INTO temp.sqlite_parameters(key,value)" + "VALUES(%Q,%s);", zKey, zValue); + if( zSql==0 ) shell_out_of_memory(); + pStmt = 0; + rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rx!=SQLITE_OK ){ + sqlite3_finalize(pStmt); + pStmt = 0; + zSql = sqlite3_mprintf( + "REPLACE INTO temp.sqlite_parameters(key,value)" + "VALUES(%Q,%Q);", zKey, zValue); + if( zSql==0 ) shell_out_of_memory(); + rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rx!=SQLITE_OK ){ + utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db)); + sqlite3_finalize(pStmt); + pStmt = 0; + rc = 1; + } + } + sqlite3_step(pStmt); + sqlite3_finalize(pStmt); + }else + + /* .parameter unset NAME + ** Remove the NAME binding from the parameter binding table, if it + ** exists. + */ + if( nArg==3 && strcmp(azArg[1],"unset")==0 ){ + char *zSql = sqlite3_mprintf( + "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]); + if( zSql==0 ) shell_out_of_memory(); + sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + }else + /* If no command name matches, show a syntax error */ + parameter_syntax_error: + showHelp(p->out, "parameter"); + }else + + if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ + int i; + for(i=1; i1 ) raw_printf(p->out, " "); + utf8_printf(p->out, "%s", azArg[i]); + } + raw_printf(p->out, "\n"); + }else + +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ + int i; + int nn = 0; + p->flgProgress = 0; + p->mxProgress = 0; + p->nProgress = 0; + for(i=1; iflgProgress |= SHELL_PROGRESS_QUIET; + continue; + } + if( strcmp(z,"reset")==0 ){ + p->flgProgress |= SHELL_PROGRESS_RESET; + continue; + } + if( strcmp(z,"once")==0 ){ + p->flgProgress |= SHELL_PROGRESS_ONCE; + continue; + } + if( strcmp(z,"limit")==0 ){ + if( i+1>=nArg ){ + utf8_printf(stderr, "Error: missing argument on --limit\n"); + rc = 1; + goto meta_command_exit; + }else{ + p->mxProgress = (int)integerValue(azArg[++i]); + } + continue; + } + utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]); + rc = 1; + goto meta_command_exit; + }else{ + nn = (int)integerValue(z); + } + } + open_db(p, 0); + sqlite3_progress_handler(p->db, nn, progress_handler, p); + }else +#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ + + if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ + if( nArg >= 2) { + strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); + } + if( nArg >= 3) { + strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); + } + }else + + if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ + rc = 2; + }else + + if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ + FILE *inSaved = p->in; + int savedLineno = p->lineno; + if( nArg!=2 ){ + raw_printf(stderr, "Usage: .read FILE\n"); + rc = 1; + goto meta_command_exit; + } + p->in = fopen(azArg[1], "rb"); + if( p->in==0 ){ + utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); + rc = 1; + }else{ + rc = process_input(p); + fclose(p->in); + } + p->in = inSaved; + p->lineno = savedLineno; + }else + + if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ + const char *zSrcFile; + const char *zDb; + sqlite3 *pSrc; + sqlite3_backup *pBackup; + int nTimeout = 0; + + if( nArg==2 ){ + zSrcFile = azArg[1]; + zDb = "main"; + }else if( nArg==3 ){ + zSrcFile = azArg[2]; + zDb = azArg[1]; + }else{ + raw_printf(stderr, "Usage: .restore ?DB? FILE\n"); + rc = 1; + goto meta_command_exit; + } + rc = sqlite3_open(zSrcFile, &pSrc); + if( rc!=SQLITE_OK ){ + utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); + close_db(pSrc); + return 1; + } + open_db(p, 0); + pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); + if( pBackup==0 ){ + utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); + close_db(pSrc); + return 1; + } + while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK + || rc==SQLITE_BUSY ){ + if( rc==SQLITE_BUSY ){ + if( nTimeout++ >= 3 ) break; + sqlite3_sleep(100); + } + } + sqlite3_backup_finish(pBackup); + if( rc==SQLITE_DONE ){ + rc = 0; + }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ + raw_printf(stderr, "Error: source database is busy\n"); + rc = 1; + }else{ + utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); + rc = 1; + } + close_db(pSrc); + }else + + if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){ + if( nArg==2 ){ + p->scanstatsOn = (u8)booleanValue(azArg[1]); +#ifndef SQLITE_ENABLE_STMT_SCANSTATUS + raw_printf(stderr, "Warning: .scanstats not available in this build.\n"); +#endif + }else{ + raw_printf(stderr, "Usage: .scanstats on|off\n"); + rc = 1; + } + }else + + if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ + ShellText sSelect; + ShellState data; + char *zErrMsg = 0; + const char *zDiv = "("; + const char *zName = 0; + int iSchema = 0; + int bDebug = 0; + int ii; + + open_db(p, 0); + memcpy(&data, p, sizeof(data)); + data.showHeader = 0; + data.cMode = data.mode = MODE_Semi; + initText(&sSelect); + for(ii=1; iidb, "SELECT name FROM pragma_database_list", + -1, &pStmt, 0); + if( rc ){ + utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); + sqlite3_finalize(pStmt); + rc = 1; + goto meta_command_exit; + } + appendText(&sSelect, "SELECT sql FROM", 0); + iSchema = 0; + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + const char *zDb = (const char*)sqlite3_column_text(pStmt, 0); + char zScNum[30]; + sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema); + appendText(&sSelect, zDiv, 0); + zDiv = " UNION ALL "; + appendText(&sSelect, "SELECT shell_add_schema(sql,", 0); + if( sqlite3_stricmp(zDb, "main")!=0 ){ + appendText(&sSelect, zDb, '\''); + }else{ + appendText(&sSelect, "NULL", 0); + } + appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0); + appendText(&sSelect, zScNum, 0); + appendText(&sSelect, " AS snum, ", 0); + appendText(&sSelect, zDb, '\''); + appendText(&sSelect, " AS sname FROM ", 0); + appendText(&sSelect, zDb, quoteChar(zDb)); + appendText(&sSelect, ".sqlite_master", 0); + } + sqlite3_finalize(pStmt); +#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS + if( zName ){ + appendText(&sSelect, + " UNION ALL SELECT shell_module_schema(name)," + " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", + 0); + } +#endif + appendText(&sSelect, ") WHERE ", 0); + if( zName ){ + char *zQarg = sqlite3_mprintf("%Q", zName); + int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 || + strchr(zName, '[') != 0; + if( strchr(zName, '.') ){ + appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0); + }else{ + appendText(&sSelect, "lower(tbl_name)", 0); + } + appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0); + appendText(&sSelect, zQarg, 0); + if( !bGlob ){ + appendText(&sSelect, " ESCAPE '\\' ", 0); + } + appendText(&sSelect, " AND ", 0); + sqlite3_free(zQarg); + } + appendText(&sSelect, "type!='meta' AND sql IS NOT NULL" + " ORDER BY snum, rowid", 0); + if( bDebug ){ + utf8_printf(p->out, "SQL: %s;\n", sSelect.z); + }else{ + rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg); + } + freeText(&sSelect); + } + if( zErrMsg ){ + utf8_printf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + rc = 1; + }else if( rc != SQLITE_OK ){ + raw_printf(stderr,"Error: querying schema information\n"); + rc = 1; + }else{ + rc = 0; + } + }else + +#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) + if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){ + sqlite3SelectTrace = (int)integerValue(azArg[1]); + }else +#endif + +#if defined(SQLITE_ENABLE_SESSION) + if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ + OpenSession *pSession = &p->aSession[0]; + char **azCmd = &azArg[1]; + int iSes = 0; + int nCmd = nArg - 1; + int i; + if( nArg<=1 ) goto session_syntax_error; + open_db(p, 0); + if( nArg>=3 ){ + for(iSes=0; iSesnSession; iSes++){ + if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break; + } + if( iSesnSession ){ + pSession = &p->aSession[iSes]; + azCmd++; + nCmd--; + }else{ + pSession = &p->aSession[0]; + iSes = 0; + } + } + + /* .session attach TABLE + ** Invoke the sqlite3session_attach() interface to attach a particular + ** table so that it is never filtered. + */ + if( strcmp(azCmd[0],"attach")==0 ){ + if( nCmd!=2 ) goto session_syntax_error; + if( pSession->p==0 ){ + session_not_open: + raw_printf(stderr, "ERROR: No sessions are open\n"); + }else{ + rc = sqlite3session_attach(pSession->p, azCmd[1]); + if( rc ){ + raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc); + rc = 0; + } + } + }else + + /* .session changeset FILE + ** .session patchset FILE + ** Write a changeset or patchset into a file. The file is overwritten. + */ + if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ + FILE *out = 0; + if( nCmd!=2 ) goto session_syntax_error; + if( pSession->p==0 ) goto session_not_open; + out = fopen(azCmd[1], "wb"); + if( out==0 ){ + utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", + azCmd[1]); + }else{ + int szChng; + void *pChng; + if( azCmd[0][0]=='c' ){ + rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); + }else{ + rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); + } + if( rc ){ + printf("Error: error code %d\n", rc); + rc = 0; + } + if( pChng + && fwrite(pChng, szChng, 1, out)!=1 ){ + raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n", + szChng); + } + sqlite3_free(pChng); + fclose(out); + } + }else + + /* .session close + ** Close the identified session + */ + if( strcmp(azCmd[0], "close")==0 ){ + if( nCmd!=1 ) goto session_syntax_error; + if( p->nSession ){ + session_close(pSession); + p->aSession[iSes] = p->aSession[--p->nSession]; + } + }else + + /* .session enable ?BOOLEAN? + ** Query or set the enable flag + */ + if( strcmp(azCmd[0], "enable")==0 ){ + int ii; + if( nCmd>2 ) goto session_syntax_error; + ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); + if( p->nSession ){ + ii = sqlite3session_enable(pSession->p, ii); + utf8_printf(p->out, "session %s enable flag = %d\n", + pSession->zName, ii); + } + }else + + /* .session filter GLOB .... + ** Set a list of GLOB patterns of table names to be excluded. + */ + if( strcmp(azCmd[0], "filter")==0 ){ + int ii, nByte; + if( nCmd<2 ) goto session_syntax_error; + if( p->nSession ){ + for(ii=0; iinFilter; ii++){ + sqlite3_free(pSession->azFilter[ii]); + } + sqlite3_free(pSession->azFilter); + nByte = sizeof(pSession->azFilter[0])*(nCmd-1); + pSession->azFilter = sqlite3_malloc( nByte ); + if( pSession->azFilter==0 ){ + raw_printf(stderr, "Error: out or memory\n"); + exit(1); + } + for(ii=1; iiazFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); + } + pSession->nFilter = ii-1; + } + }else + + /* .session indirect ?BOOLEAN? + ** Query or set the indirect flag + */ + if( strcmp(azCmd[0], "indirect")==0 ){ + int ii; + if( nCmd>2 ) goto session_syntax_error; + ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); + if( p->nSession ){ + ii = sqlite3session_indirect(pSession->p, ii); + utf8_printf(p->out, "session %s indirect flag = %d\n", + pSession->zName, ii); + } + }else + + /* .session isempty + ** Determine if the session is empty + */ + if( strcmp(azCmd[0], "isempty")==0 ){ + int ii; + if( nCmd!=1 ) goto session_syntax_error; + if( p->nSession ){ + ii = sqlite3session_isempty(pSession->p); + utf8_printf(p->out, "session %s isempty flag = %d\n", + pSession->zName, ii); + } + }else + + /* .session list + ** List all currently open sessions + */ + if( strcmp(azCmd[0],"list")==0 ){ + for(i=0; inSession; i++){ + utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName); + } + }else + + /* .session open DB NAME + ** Open a new session called NAME on the attached database DB. + ** DB is normally "main". + */ + if( strcmp(azCmd[0],"open")==0 ){ + char *zName; + if( nCmd!=3 ) goto session_syntax_error; + zName = azCmd[2]; + if( zName[0]==0 ) goto session_syntax_error; + for(i=0; inSession; i++){ + if( strcmp(p->aSession[i].zName,zName)==0 ){ + utf8_printf(stderr, "Session \"%s\" already exists\n", zName); + goto meta_command_exit; + } + } + if( p->nSession>=ArraySize(p->aSession) ){ + raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession)); + goto meta_command_exit; + } + pSession = &p->aSession[p->nSession]; + rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); + if( rc ){ + raw_printf(stderr, "Cannot open session: error code=%d\n", rc); + rc = 0; + goto meta_command_exit; + } + pSession->nFilter = 0; + sqlite3session_table_filter(pSession->p, session_filter, pSession); + p->nSession++; + pSession->zName = sqlite3_mprintf("%s", zName); + }else + /* If no command name matches, show a syntax error */ + session_syntax_error: + showHelp(p->out, "session"); + }else +#endif + +#ifdef SQLITE_DEBUG + /* Undocumented commands for internal testing. Subject to change + ** without notice. */ + if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){ + if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){ + int i, v; + for(i=1; iout, "%s: %d 0x%x\n", azArg[i], v, v); + } + } + if( strncmp(azArg[0]+9, "integer", n-9)==0 ){ + int i; sqlite3_int64 v; + for(i=1; iout, "%s", zBuf); + } + } + }else +#endif + + if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){ + int bIsInit = 0; /* True to initialize the SELFTEST table */ + int bVerbose = 0; /* Verbose output */ + int bSelftestExists; /* True if SELFTEST already exists */ + int i, k; /* Loop counters */ + int nTest = 0; /* Number of tests runs */ + int nErr = 0; /* Number of errors seen */ + ShellText str; /* Answer for a query */ + sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */ + + open_db(p,0); + for(i=1; idb,"main","selftest",0,0,0,0,0,0) + != SQLITE_OK ){ + bSelftestExists = 0; + }else{ + bSelftestExists = 1; + } + if( bIsInit ){ + createSelftestTable(p); + bSelftestExists = 1; + } + initText(&str); + appendText(&str, "x", 0); + for(k=bSelftestExists; k>=0; k--){ + if( k==1 ){ + rc = sqlite3_prepare_v2(p->db, + "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno", + -1, &pStmt, 0); + }else{ + rc = sqlite3_prepare_v2(p->db, + "VALUES(0,'memo','Missing SELFTEST table - default checks only','')," + " (1,'run','PRAGMA integrity_check','ok')", + -1, &pStmt, 0); + } + if( rc ){ + raw_printf(stderr, "Error querying the selftest table\n"); + rc = 1; + sqlite3_finalize(pStmt); + goto meta_command_exit; + } + for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){ + int tno = sqlite3_column_int(pStmt, 0); + const char *zOp = (const char*)sqlite3_column_text(pStmt, 1); + const char *zSql = (const char*)sqlite3_column_text(pStmt, 2); + const char *zAns = (const char*)sqlite3_column_text(pStmt, 3); + + k = 0; + if( bVerbose>0 ){ + char *zQuote = sqlite3_mprintf("%q", zSql); + printf("%d: %s %s\n", tno, zOp, zSql); + sqlite3_free(zQuote); + } + if( strcmp(zOp,"memo")==0 ){ + utf8_printf(p->out, "%s\n", zSql); + }else + if( strcmp(zOp,"run")==0 ){ + char *zErrMsg = 0; + str.n = 0; + str.z[0] = 0; + rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg); + nTest++; + if( bVerbose ){ + utf8_printf(p->out, "Result: %s\n", str.z); + } + if( rc || zErrMsg ){ + nErr++; + rc = 1; + utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg); + sqlite3_free(zErrMsg); + }else if( strcmp(zAns,str.z)!=0 ){ + nErr++; + rc = 1; + utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns); + utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z); + } + }else + { + utf8_printf(stderr, + "Unknown operation \"%s\" on selftest line %d\n", zOp, tno); + rc = 1; + break; + } + } /* End loop over rows of content from SELFTEST */ + sqlite3_finalize(pStmt); + } /* End loop over k */ + freeText(&str); + utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest); + }else + + if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){ + if( nArg<2 || nArg>3 ){ + raw_printf(stderr, "Usage: .separator COL ?ROW?\n"); + rc = 1; + } + if( nArg>=2 ){ + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, + "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]); + } + if( nArg>=3 ){ + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, + "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); + } + }else + + if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){ + const char *zLike = 0; /* Which table to checksum. 0 means everything */ + int i; /* Loop counter */ + int bSchema = 0; /* Also hash the schema */ + int bSeparate = 0; /* Hash each table separately */ + int iSize = 224; /* Hash algorithm to use */ + int bDebug = 0; /* Only show the query that would have run */ + sqlite3_stmt *pStmt; /* For querying tables names */ + char *zSql; /* SQL to be run */ + char *zSep; /* Separator */ + ShellText sSql; /* Complete SQL for the query to run the hash */ + ShellText sQuery; /* Set of queries used to read all content */ + open_db(p, 0); + for(i=1; iout, azArg[0]); + rc = 1; + goto meta_command_exit; + } + }else if( zLike ){ + raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n"); + rc = 1; + goto meta_command_exit; + }else{ + zLike = z; + bSeparate = 1; + if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1; + } + } + if( bSchema ){ + zSql = "SELECT lower(name) FROM sqlite_master" + " WHERE type='table' AND coalesce(rootpage,0)>1" + " UNION ALL SELECT 'sqlite_master'" + " ORDER BY 1 collate nocase"; + }else{ + zSql = "SELECT lower(name) FROM sqlite_master" + " WHERE type='table' AND coalesce(rootpage,0)>1" + " AND name NOT LIKE 'sqlite_%'" + " ORDER BY 1 collate nocase"; + } + sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + initText(&sQuery); + initText(&sSql); + appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0); + zSep = "VALUES("; + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zTab = (const char*)sqlite3_column_text(pStmt,0); + if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue; + if( strncmp(zTab, "sqlite_",7)!=0 ){ + appendText(&sQuery,"SELECT * FROM ", 0); + appendText(&sQuery,zTab,'"'); + appendText(&sQuery," NOT INDEXED;", 0); + }else if( strcmp(zTab, "sqlite_master")==0 ){ + appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master" + " ORDER BY name;", 0); + }else if( strcmp(zTab, "sqlite_sequence")==0 ){ + appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence" + " ORDER BY name;", 0); + }else if( strcmp(zTab, "sqlite_stat1")==0 ){ + appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" + " ORDER BY tbl,idx;", 0); + }else if( strcmp(zTab, "sqlite_stat4")==0 ){ + appendText(&sQuery, "SELECT * FROM ", 0); + appendText(&sQuery, zTab, 0); + appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); + } + appendText(&sSql, zSep, 0); + appendText(&sSql, sQuery.z, '\''); + sQuery.n = 0; + appendText(&sSql, ",", 0); + appendText(&sSql, zTab, '\''); + zSep = "),("; + } + sqlite3_finalize(pStmt); + if( bSeparate ){ + zSql = sqlite3_mprintf( + "%s))" + " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label" + " FROM [sha3sum$query]", + sSql.z, iSize); + }else{ + zSql = sqlite3_mprintf( + "%s))" + " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash" + " FROM [sha3sum$query]", + sSql.z, iSize); + } + freeText(&sQuery); + freeText(&sSql); + if( bDebug ){ + utf8_printf(p->out, "%s\n", zSql); + }else{ + shell_exec(p, zSql, 0); + } + sqlite3_free(zSql); + }else + +#ifndef SQLITE_NOHAVE_SYSTEM + if( c=='s' + && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0) + ){ + char *zCmd; + int i, x; + if( nArg<2 ){ + raw_printf(stderr, "Usage: .system COMMAND\n"); + rc = 1; + goto meta_command_exit; + } + zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]); + for(i=2; iout, "%12.12s: %s\n","echo", + azBool[ShellHasFlag(p, SHFLG_Echo)]); + utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]); + utf8_printf(p->out, "%12.12s: %s\n","explain", + p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off"); + utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]); + utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]); + utf8_printf(p->out, "%12.12s: ", "nullvalue"); + output_c_string(p->out, p->nullValue); + raw_printf(p->out, "\n"); + utf8_printf(p->out,"%12.12s: %s\n","output", + strlen30(p->outfile) ? p->outfile : "stdout"); + utf8_printf(p->out,"%12.12s: ", "colseparator"); + output_c_string(p->out, p->colSeparator); + raw_printf(p->out, "\n"); + utf8_printf(p->out,"%12.12s: ", "rowseparator"); + output_c_string(p->out, p->rowSeparator); + raw_printf(p->out, "\n"); + utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]); + utf8_printf(p->out, "%12.12s: ", "width"); + for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { + raw_printf(p->out, "%d ", p->colWidth[i]); + } + raw_printf(p->out, "\n"); + utf8_printf(p->out, "%12.12s: %s\n", "filename", + p->zDbFilename ? p->zDbFilename : ""); + }else + + if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){ + if( nArg==2 ){ + p->statsOn = (u8)booleanValue(azArg[1]); + }else if( nArg==1 ){ + display_stats(p->db, p, 0); + }else{ + raw_printf(stderr, "Usage: .stats ?on|off?\n"); + rc = 1; + } + }else + + if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0) + || (c=='i' && (strncmp(azArg[0], "indices", n)==0 + || strncmp(azArg[0], "indexes", n)==0) ) + ){ + sqlite3_stmt *pStmt; + char **azResult; + int nRow, nAlloc; + int ii; + ShellText s; + initText(&s); + open_db(p, 0); + rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); + if( rc ){ + sqlite3_finalize(pStmt); + return shellDatabaseError(p->db); + } + + if( nArg>2 && c=='i' ){ + /* It is an historical accident that the .indexes command shows an error + ** when called with the wrong number of arguments whereas the .tables + ** command does not. */ + raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); + rc = 1; + sqlite3_finalize(pStmt); + goto meta_command_exit; + } + for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){ + const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); + if( zDbName==0 ) continue; + if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0); + if( sqlite3_stricmp(zDbName, "main")==0 ){ + appendText(&s, "SELECT name FROM ", 0); + }else{ + appendText(&s, "SELECT ", 0); + appendText(&s, zDbName, '\''); + appendText(&s, "||'.'||name FROM ", 0); + } + appendText(&s, zDbName, '"'); + appendText(&s, ".sqlite_master ", 0); + if( c=='t' ){ + appendText(&s," WHERE type IN ('table','view')" + " AND name NOT LIKE 'sqlite_%'" + " AND name LIKE ?1", 0); + }else{ + appendText(&s," WHERE type='index'" + " AND tbl_name LIKE ?1", 0); + } + } + rc = sqlite3_finalize(pStmt); + appendText(&s, " ORDER BY 1", 0); + rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); + freeText(&s); + if( rc ) return shellDatabaseError(p->db); + + /* Run the SQL statement prepared by the above block. Store the results + ** as an array of nul-terminated strings in azResult[]. */ + nRow = nAlloc = 0; + azResult = 0; + if( nArg>1 ){ + sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT); + }else{ + sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC); + } + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + if( nRow>=nAlloc ){ + char **azNew; + int n2 = nAlloc*2 + 10; + azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); + if( azNew==0 ) shell_out_of_memory(); + nAlloc = n2; + azResult = azNew; + } + azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); + if( 0==azResult[nRow] ) shell_out_of_memory(); + nRow++; + } + if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ + rc = shellDatabaseError(p->db); + } + + /* Pretty-print the contents of array azResult[] to the output */ + if( rc==0 && nRow>0 ){ + int len, maxlen = 0; + int i, j; + int nPrintCol, nPrintRow; + for(i=0; imaxlen ) maxlen = len; + } + nPrintCol = 80/(maxlen+2); + if( nPrintCol<1 ) nPrintCol = 1; + nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; + for(i=0; iout, "%s%-*s", zSp, maxlen, + azResult[j] ? azResult[j]:""); + } + raw_printf(p->out, "\n"); + } + } + + for(ii=0; iiout = output_file_open("testcase-out.txt", 0); + if( p->out==0 ){ + raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); + } + if( nArg>=2 ){ + sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); + }else{ + sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?"); + } + }else + +#ifndef SQLITE_UNTESTABLE + if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){ + static const struct { + const char *zCtrlName; /* Name of a test-control option */ + int ctrlCode; /* Integer code for that option */ + const char *zUsage; /* Usage notes */ + } aCtrl[] = { + { "always", SQLITE_TESTCTRL_ALWAYS, "BOOLEAN" }, + { "assert", SQLITE_TESTCTRL_ASSERT, "BOOLEAN" }, + /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, "" },*/ + /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, "" },*/ + { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" }, + { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" }, + /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" },*/ + { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, + { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "" }, + { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" }, + { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" }, + { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" }, +#ifdef YYCOVERAGE + { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" }, +#endif + { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " }, + { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" }, + { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" }, + { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED ?db?" }, + }; + int testctrl = -1; + int iCtrl = -1; + int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */ + int isOk = 0; + int i, n2; + const char *zCmd = 0; + + open_db(p, 0); + zCmd = nArg>=2 ? azArg[1] : "help"; + + /* The argument can optionally begin with "-" or "--" */ + if( zCmd[0]=='-' && zCmd[1] ){ + zCmd++; + if( zCmd[0]=='-' && zCmd[1] ) zCmd++; + } + + /* --help lists all test-controls */ + if( strcmp(zCmd,"help")==0 ){ + utf8_printf(p->out, "Available test-controls:\n"); + for(i=0; iout, " .testctrl %s %s\n", + aCtrl[i].zCtrlName, aCtrl[i].zUsage); + } + rc = 1; + goto meta_command_exit; + } + + /* convert testctrl text option to value. allow any unique prefix + ** of the option name, or a numerical value. */ + n2 = strlen30(zCmd); + for(i=0; idb, opt); + isOk = 3; + } + break; + + /* sqlite3_test_control(int) */ + case SQLITE_TESTCTRL_PRNG_SAVE: + case SQLITE_TESTCTRL_PRNG_RESTORE: + case SQLITE_TESTCTRL_PRNG_RESET: + case SQLITE_TESTCTRL_BYTEORDER: + if( nArg==2 ){ + rc2 = sqlite3_test_control(testctrl); + isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3; + } + break; + + /* sqlite3_test_control(int, uint) */ + case SQLITE_TESTCTRL_PENDING_BYTE: + if( nArg==3 ){ + unsigned int opt = (unsigned int)integerValue(azArg[2]); + rc2 = sqlite3_test_control(testctrl, opt); + isOk = 3; + } + break; + + /* sqlite3_test_control(int, int, sqlite3*) */ + case SQLITE_TESTCTRL_PRNG_SEED: + if( nArg==3 || nArg==4 ){ + int ii = (int)integerValue(azArg[2]); + sqlite3 *db; + if( ii==0 && strcmp(azArg[2],"random")==0 ){ + sqlite3_randomness(sizeof(ii),&ii); + printf("-- random seed: %d\n", ii); + } + if( nArg==3 ){ + db = 0; + }else{ + db = p->db; + /* Make sure the schema has been loaded */ + sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0); + } + rc2 = sqlite3_test_control(testctrl, ii, db); + isOk = 3; + } + break; + + /* sqlite3_test_control(int, int) */ + case SQLITE_TESTCTRL_ASSERT: + case SQLITE_TESTCTRL_ALWAYS: + if( nArg==3 ){ + int opt = booleanValue(azArg[2]); + rc2 = sqlite3_test_control(testctrl, opt); + isOk = 1; + } + break; + + /* sqlite3_test_control(int, int) */ + case SQLITE_TESTCTRL_LOCALTIME_FAULT: + case SQLITE_TESTCTRL_NEVER_CORRUPT: + if( nArg==3 ){ + int opt = booleanValue(azArg[2]); + rc2 = sqlite3_test_control(testctrl, opt); + isOk = 3; + } + break; + + /* sqlite3_test_control(sqlite3*) */ + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: + rc2 = sqlite3_test_control(testctrl, p->db); + isOk = 3; + break; + + case SQLITE_TESTCTRL_IMPOSTER: + if( nArg==5 ){ + rc2 = sqlite3_test_control(testctrl, p->db, + azArg[2], + integerValue(azArg[3]), + integerValue(azArg[4])); + isOk = 3; + } + break; + +#ifdef YYCOVERAGE + case SQLITE_TESTCTRL_PARSER_COVERAGE: + if( nArg==2 ){ + sqlite3_test_control(testctrl, p->out); + isOk = 3; + } +#endif + } + } + if( isOk==0 && iCtrl>=0 ){ + utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); + rc = 1; + }else if( isOk==1 ){ + raw_printf(p->out, "%d\n", rc2); + }else if( isOk==2 ){ + raw_printf(p->out, "0x%08x\n", rc2); + } + }else +#endif /* !defined(SQLITE_UNTESTABLE) */ + + if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){ + open_db(p, 0); + sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0); + }else + + if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){ + if( nArg==2 ){ + enableTimer = booleanValue(azArg[1]); + if( enableTimer && !HAS_TIMER ){ + raw_printf(stderr, "Error: timer not available on this system.\n"); + enableTimer = 0; + } + }else{ + raw_printf(stderr, "Usage: .timer on|off\n"); + rc = 1; + } + }else + +#ifndef SQLITE_OMIT_TRACE + if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ + int mType = 0; + int jj; + open_db(p, 0); + for(jj=1; jjeTraceType = SHELL_TRACE_EXPANDED; + } +#ifdef SQLITE_ENABLE_NORMALIZE + else if( optionMatch(z, "normalized") ){ + p->eTraceType = SHELL_TRACE_NORMALIZED; + } +#endif + else if( optionMatch(z, "plain") ){ + p->eTraceType = SHELL_TRACE_PLAIN; + } + else if( optionMatch(z, "profile") ){ + mType |= SQLITE_TRACE_PROFILE; + } + else if( optionMatch(z, "row") ){ + mType |= SQLITE_TRACE_ROW; + } + else if( optionMatch(z, "stmt") ){ + mType |= SQLITE_TRACE_STMT; + } + else if( optionMatch(z, "close") ){ + mType |= SQLITE_TRACE_CLOSE; + } + else { + raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z); + rc = 1; + goto meta_command_exit; + } + }else{ + output_file_close(p->traceOut); + p->traceOut = output_file_open(azArg[1], 0); + } + } + if( p->traceOut==0 ){ + sqlite3_trace_v2(p->db, 0, 0, 0); + }else{ + if( mType==0 ) mType = SQLITE_TRACE_STMT; + sqlite3_trace_v2(p->db, mType, sql_trace_callback, p); + } + }else +#endif /* !defined(SQLITE_OMIT_TRACE) */ + +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE) + if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){ + int ii; + int lenOpt; + char *zOpt; + if( nArg<2 ){ + raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n"); + rc = 1; + goto meta_command_exit; + } + open_db(p, 0); + zOpt = azArg[1]; + if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++; + lenOpt = (int)strlen(zOpt); + if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){ + assert( azArg[nArg]==0 ); + sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0); + }else{ + for(ii=1; iidb, azArg[ii], 0, 0); + } + } + }else +#endif + +#if SQLITE_USER_AUTHENTICATION + if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ + if( nArg<2 ){ + raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n"); + rc = 1; + goto meta_command_exit; + } + open_db(p, 0); + if( strcmp(azArg[1],"login")==0 ){ + if( nArg!=4 ){ + raw_printf(stderr, "Usage: .user login USER PASSWORD\n"); + rc = 1; + goto meta_command_exit; + } + rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], + strlen30(azArg[3])); + if( rc ){ + utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]); + rc = 1; + } + }else if( strcmp(azArg[1],"add")==0 ){ + if( nArg!=5 ){ + raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n"); + rc = 1; + goto meta_command_exit; + } + rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]), + booleanValue(azArg[4])); + if( rc ){ + raw_printf(stderr, "User-Add failed: %d\n", rc); + rc = 1; + } + }else if( strcmp(azArg[1],"edit")==0 ){ + if( nArg!=5 ){ + raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n"); + rc = 1; + goto meta_command_exit; + } + rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]), + booleanValue(azArg[4])); + if( rc ){ + raw_printf(stderr, "User-Edit failed: %d\n", rc); + rc = 1; + } + }else if( strcmp(azArg[1],"delete")==0 ){ + if( nArg!=3 ){ + raw_printf(stderr, "Usage: .user delete USER\n"); + rc = 1; + goto meta_command_exit; + } + rc = sqlite3_user_delete(p->db, azArg[2]); + if( rc ){ + raw_printf(stderr, "User-Delete failed: %d\n", rc); + rc = 1; + } + }else{ + raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n"); + rc = 1; + goto meta_command_exit; + } + }else +#endif /* SQLITE_USER_AUTHENTICATION */ + + if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ + utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/, + sqlite3_libversion(), sqlite3_sourceid()); +#if SQLITE_HAVE_ZLIB + utf8_printf(p->out, "zlib version %s\n", zlibVersion()); +#endif +#define CTIMEOPT_VAL_(opt) #opt +#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) +#if defined(__clang__) && defined(__clang_major__) + utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "." + CTIMEOPT_VAL(__clang_minor__) "." + CTIMEOPT_VAL(__clang_patchlevel__) "\n"); +#elif defined(_MSC_VER) + utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n"); +#elif defined(__GNUC__) && defined(__VERSION__) + utf8_printf(p->out, "gcc-" __VERSION__ "\n"); +#endif + }else + + if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){ + const char *zDbName = nArg==2 ? azArg[1] : "main"; + sqlite3_vfs *pVfs = 0; + if( p->db ){ + sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs); + if( pVfs ){ + utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName); + raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); + raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); + raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); + } + } + }else + + if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){ + sqlite3_vfs *pVfs; + sqlite3_vfs *pCurrent = 0; + if( p->db ){ + sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent); + } + for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ + utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName, + pVfs==pCurrent ? " <--- CURRENT" : ""); + raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); + raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); + raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); + if( pVfs->pNext ){ + raw_printf(p->out, "-----------------------------------\n"); + } + } + }else + + if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ + const char *zDbName = nArg==2 ? azArg[1] : "main"; + char *zVfsName = 0; + if( p->db ){ + sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); + if( zVfsName ){ + utf8_printf(p->out, "%s\n", zVfsName); + sqlite3_free(zVfsName); + } + } + }else + +#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) + if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){ + sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff; + }else +#endif + + if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ + int j; + assert( nArg<=ArraySize(azArg) ); + for(j=1; jcolWidth); j++){ + p->colWidth[j-1] = (int)integerValue(azArg[j]); + } + }else + + { + utf8_printf(stderr, "Error: unknown command or invalid arguments: " + " \"%s\". Enter \".help\" for help\n", azArg[0]); + rc = 1; + } + +meta_command_exit: + if( p->outCount ){ + p->outCount--; + if( p->outCount==0 ) output_reset(p); + } + return rc; +} + +/* +** Return TRUE if a semicolon occurs anywhere in the first N characters +** of string z[]. +*/ +static int line_contains_semicolon(const char *z, int N){ + int i; + for(i=0; iflgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; + BEGIN_TIMER; + rc = shell_exec(p, zSql, &zErrMsg); + END_TIMER; + if( rc || zErrMsg ){ + char zPrefix[100]; + if( in!=0 || !stdin_is_interactive ){ + sqlite3_snprintf(sizeof(zPrefix), zPrefix, + "Error: near line %d:", startline); + }else{ + sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); + } + if( zErrMsg!=0 ){ + utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); + sqlite3_free(zErrMsg); + zErrMsg = 0; + }else{ + utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); + } + return 1; + }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ + raw_printf(p->out, "changes: %3d total_changes: %d\n", + sqlite3_changes(p->db), sqlite3_total_changes(p->db)); + } + return 0; +} + + +/* +** Read input from *in and process it. If *in==0 then input +** is interactive - the user is typing it it. Otherwise, input +** is coming from a file or device. A prompt is issued and history +** is saved only if input is interactive. An interrupt signal will +** cause this routine to exit immediately, unless input is interactive. +** +** Return the number of errors. +*/ +static int process_input(ShellState *p){ + char *zLine = 0; /* A single input line */ + char *zSql = 0; /* Accumulated SQL text */ + int nLine; /* Length of current line */ + int nSql = 0; /* Bytes of zSql[] used */ + int nAlloc = 0; /* Allocated zSql[] space */ + int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */ + int rc; /* Error code */ + int errCnt = 0; /* Number of errors seen */ + int startline = 0; /* Line number for start of current input */ + + p->lineno = 0; + while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ + fflush(p->out); + zLine = one_input_line(p->in, zLine, nSql>0); + if( zLine==0 ){ + /* End of input */ + if( p->in==0 && stdin_is_interactive ) printf("\n"); + break; + } + if( seenInterrupt ){ + if( p->in!=0 ) break; + seenInterrupt = 0; + } + p->lineno++; + if( nSql==0 && _all_whitespace(zLine) ){ + if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); + continue; + } + if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ + if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); + if( zLine[0]=='.' ){ + rc = do_meta_command(zLine, p); + if( rc==2 ){ /* exit requested */ + break; + }else if( rc ){ + errCnt++; + } + } + continue; + } + if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){ + memcpy(zLine,";",2); + } + nLine = strlen30(zLine); + if( nSql+nLine+2>=nAlloc ){ + nAlloc = nSql+nLine+100; + zSql = realloc(zSql, nAlloc); + if( zSql==0 ) shell_out_of_memory(); + } + nSqlPrior = nSql; + if( nSql==0 ){ + int i; + for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} + assert( nAlloc>0 && zSql!=0 ); + memcpy(zSql, zLine+i, nLine+1-i); + startline = p->lineno; + nSql = nLine-i; + }else{ + zSql[nSql++] = '\n'; + memcpy(zSql+nSql, zLine, nLine+1); + nSql += nLine; + } + if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) + && sqlite3_complete(zSql) ){ + errCnt += runOneSqlLine(p, zSql, p->in, startline); + nSql = 0; + if( p->outCount ){ + output_reset(p); + p->outCount = 0; + }else{ + clearTempFile(p); + } + }else if( nSql && _all_whitespace(zSql) ){ + if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); + nSql = 0; + } + } + if( nSql && !_all_whitespace(zSql) ){ + errCnt += runOneSqlLine(p, zSql, p->in, startline); + } + free(zSql); + free(zLine); + return errCnt>0; +} + +/* +** Return a pathname which is the user's home directory. A +** 0 return indicates an error of some kind. +*/ +static char *find_home_dir(int clearFlag){ + static char *home_dir = NULL; + if( clearFlag ){ + free(home_dir); + home_dir = 0; + return 0; + } + if( home_dir ) return home_dir; + +#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \ + && !defined(__RTP__) && !defined(_WRS_KERNEL) + { + struct passwd *pwent; + uid_t uid = getuid(); + if( (pwent=getpwuid(uid)) != NULL) { + home_dir = pwent->pw_dir; + } + } +#endif + +#if defined(_WIN32_WCE) + /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() + */ + home_dir = "/"; +#else + +#if defined(_WIN32) || defined(WIN32) + if (!home_dir) { + home_dir = getenv("USERPROFILE"); + } +#endif + + if (!home_dir) { + home_dir = getenv("HOME"); + } + +#if defined(_WIN32) || defined(WIN32) + if (!home_dir) { + char *zDrive, *zPath; + int n; + zDrive = getenv("HOMEDRIVE"); + zPath = getenv("HOMEPATH"); + if( zDrive && zPath ){ + n = strlen30(zDrive) + strlen30(zPath) + 1; + home_dir = malloc( n ); + if( home_dir==0 ) return 0; + sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); + return home_dir; + } + home_dir = "c:\\"; + } +#endif + +#endif /* !_WIN32_WCE */ + + if( home_dir ){ + int n = strlen30(home_dir) + 1; + char *z = malloc( n ); + if( z ) memcpy(z, home_dir, n); + home_dir = z; + } + + return home_dir; +} + +/* +** Read input from the file given by sqliterc_override. Or if that +** parameter is NULL, take input from ~/.sqliterc +** +** Returns the number of errors. +*/ +static void process_sqliterc( + ShellState *p, /* Configuration data */ + const char *sqliterc_override /* Name of config file. NULL to use default */ +){ + char *home_dir = NULL; + const char *sqliterc = sqliterc_override; + char *zBuf = 0; + FILE *inSaved = p->in; + int savedLineno = p->lineno; + + if (sqliterc == NULL) { + home_dir = find_home_dir(0); + if( home_dir==0 ){ + raw_printf(stderr, "-- warning: cannot find home directory;" + " cannot read ~/.sqliterc\n"); + return; + } + zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); + sqliterc = zBuf; + } + p->in = fopen(sqliterc,"rb"); + if( p->in ){ + if( stdin_is_interactive ){ + utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); + } + process_input(p); + fclose(p->in); + } + p->in = inSaved; + p->lineno = savedLineno; + sqlite3_free(zBuf); +} + +/* +** Show available command line options +*/ +static const char zOptions[] = +#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) + " -A ARGS... run \".archive ARGS\" and exit\n" +#endif + " -append append the database to the end of the file\n" + " -ascii set output mode to 'ascii'\n" + " -bail stop after hitting an error\n" + " -batch force batch I/O\n" + " -column set output mode to 'column'\n" + " -cmd COMMAND run \"COMMAND\" before reading stdin\n" + " -csv set output mode to 'csv'\n" +#if defined(SQLITE_ENABLE_DESERIALIZE) + " -deserialize open the database using sqlite3_deserialize()\n" +#endif + " -echo print commands before execution\n" + " -init FILENAME read/process named file\n" + " -[no]header turn headers on or off\n" +#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) + " -heap SIZE Size of heap for memsys3 or memsys5\n" +#endif + " -help show this message\n" + " -html set output mode to HTML\n" + " -interactive force interactive I/O\n" + " -line set output mode to 'line'\n" + " -list set output mode to 'list'\n" + " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" +#if defined(SQLITE_ENABLE_DESERIALIZE) + " -maxsize N maximum size for a --deserialize database\n" +#endif + " -memtrace trace all memory allocations and deallocations\n" + " -mmap N default mmap size set to N\n" +#ifdef SQLITE_ENABLE_MULTIPLEX + " -multiplex enable the multiplexor VFS\n" +#endif + " -newline SEP set output row separator. Default: '\\n'\n" + " -nofollow refuse to open symbolic links to database files\n" + " -nullvalue TEXT set text string for NULL values. Default ''\n" + " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" + " -quote set output mode to 'quote'\n" + " -readonly open the database read-only\n" + " -separator SEP set output column separator. Default: '|'\n" +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + " -sorterref SIZE sorter references threshold size\n" +#endif + " -stats print memory stats before each finalize\n" + " -version show SQLite version\n" + " -vfs NAME use NAME as the default VFS\n" +#ifdef SQLITE_ENABLE_VFSTRACE + " -vfstrace enable tracing of all VFS calls\n" +#endif +#ifdef SQLITE_HAVE_ZLIB + " -zip open the file as a ZIP Archive\n" +#endif +; +static void usage(int showDetail){ + utf8_printf(stderr, + "Usage: %s [OPTIONS] FILENAME [SQL]\n" + "FILENAME is the name of an SQLite database. A new database is created\n" + "if the file does not previously exist.\n", Argv0); + if( showDetail ){ + utf8_printf(stderr, "OPTIONS include:\n%s", zOptions); + }else{ + raw_printf(stderr, "Use the -help option for additional information\n"); + } + exit(1); +} + +/* +** Internal check: Verify that the SQLite is uninitialized. Print a +** error message if it is initialized. +*/ +static void verify_uninitialized(void){ + if( sqlite3_config(-1)==SQLITE_MISUSE ){ + utf8_printf(stdout, "WARNING: attempt to configure SQLite after" + " initialization.\n"); + } +} + +/* +** Initialize the state information in data +*/ +static void main_init(ShellState *data) { + memset(data, 0, sizeof(*data)); + data->normalMode = data->cMode = data->mode = MODE_List; + data->autoExplain = 1; + memcpy(data->colSeparator,SEP_Column, 2); + memcpy(data->rowSeparator,SEP_Row, 2); + data->showHeader = 0; + data->shellFlgs = SHFLG_Lookaside; + verify_uninitialized(); + sqlite3_config(SQLITE_CONFIG_URI, 1); + sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); + sqlite3_config(SQLITE_CONFIG_MULTITHREAD); + sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); + sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); +} + +/* +** Output text to the console in a font that attracts extra attention. +*/ +#ifdef _WIN32 +static void printBold(const char *zText){ +#if !SQLITE_OS_WINRT + HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo; + GetConsoleScreenBufferInfo(out, &defaultScreenInfo); + SetConsoleTextAttribute(out, + FOREGROUND_RED|FOREGROUND_INTENSITY + ); +#endif + printf("%s", zText); +#if !SQLITE_OS_WINRT + SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); +#endif +} +#else +static void printBold(const char *zText){ + printf("\033[1m%s\033[0m", zText); +} +#endif + +/* +** Get the argument to an --option. Throw an error and die if no argument +** is available. +*/ +static char *cmdline_option_value(int argc, char **argv, int i){ + if( i==argc ){ + utf8_printf(stderr, "%s: Error: missing argument to %s\n", + argv[0], argv[argc-1]); + exit(1); + } + return argv[i]; +} + +#ifndef SQLITE_SHELL_IS_UTF8 +# if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER) +# define SQLITE_SHELL_IS_UTF8 (0) +# else +# define SQLITE_SHELL_IS_UTF8 (1) +# endif +#endif + +#if SQLITE_SHELL_IS_UTF8 +int SQLITE_CDECL main(int argc, char **argv){ +#else +int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ + char **argv; +#endif + char *zErrMsg = 0; + ShellState data; + const char *zInitFile = 0; + int i; + int rc = 0; + int warnInmemoryDb = 0; + int readStdin = 1; + int nCmd = 0; + char **azCmd = 0; + const char *zVfs = 0; /* Value of -vfs command-line option */ +#if !SQLITE_SHELL_IS_UTF8 + char **argvToFree = 0; + int argcToFree = 0; +#endif + + setBinaryMode(stdin, 0); + setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */ + stdin_is_interactive = isatty(0); + stdout_is_console = isatty(1); + +#ifdef SQLITE_DEBUG + registerOomSimulator(); +#endif + +#if !defined(_WIN32_WCE) + if( getenv("SQLITE_DEBUG_BREAK") ){ + if( isatty(0) && isatty(2) ){ + fprintf(stderr, + "attach debugger to process %d and press any key to continue.\n", + GETPID()); + fgetc(stdin); + }else{ +#if defined(_WIN32) || defined(WIN32) +#if SQLITE_OS_WINRT + __debugbreak(); +#else + DebugBreak(); +#endif +#elif defined(SIGTRAP) + raise(SIGTRAP); +#endif + } + } +#endif + +#if USE_SYSTEM_SQLITE+0!=1 + if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){ + utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", + sqlite3_sourceid(), SQLITE_SOURCE_ID); + exit(1); + } +#endif + main_init(&data); + + /* On Windows, we must translate command-line arguments into UTF-8. + ** The SQLite memory allocator subsystem has to be enabled in order to + ** do this. But we want to run an sqlite3_shutdown() afterwards so that + ** subsequent sqlite3_config() calls will work. So copy all results into + ** memory that does not come from the SQLite memory allocator. + */ +#if !SQLITE_SHELL_IS_UTF8 + sqlite3_initialize(); + argvToFree = malloc(sizeof(argv[0])*argc*2); + argcToFree = argc; + argv = argvToFree + argc; + if( argv==0 ) shell_out_of_memory(); + for(i=0; i=1 && argv && argv[0] ); + Argv0 = argv[0]; + + /* Make sure we have a valid signal handler early, before anything + ** else is done. + */ +#ifdef SIGINT + signal(SIGINT, interrupt_handler); +#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) + SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE); +#endif + +#ifdef SQLITE_SHELL_DBNAME_PROC + { + /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name + ** of a C-function that will provide the name of the database file. Use + ** this compile-time option to embed this shell program in larger + ** applications. */ + extern void SQLITE_SHELL_DBNAME_PROC(const char**); + SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename); + warnInmemoryDb = 0; + } +#endif + + /* Do an initial pass through the command-line argument to locate + ** the name of the database file, the name of the initialization file, + ** the size of the alternative malloc heap, + ** and the first command to execute. + */ + verify_uninitialized(); + for(i=1; i0x7fff0000 ) szHeap = 0x7fff0000; + sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); +#else + (void)cmdline_option_value(argc, argv, ++i); +#endif + }else if( strcmp(z,"-pagecache")==0 ){ + int n, sz; + sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); + if( sz>70000 ) sz = 70000; + if( sz<0 ) sz = 0; + n = (int)integerValue(cmdline_option_value(argc,argv,++i)); + sqlite3_config(SQLITE_CONFIG_PAGECACHE, + (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n); + data.shellFlgs |= SHFLG_Pagecache; + }else if( strcmp(z,"-lookaside")==0 ){ + int n, sz; + sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); + if( sz<0 ) sz = 0; + n = (int)integerValue(cmdline_option_value(argc,argv,++i)); + if( n<0 ) n = 0; + sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n); + if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside; +#ifdef SQLITE_ENABLE_VFSTRACE + }else if( strcmp(z,"-vfstrace")==0 ){ + extern int vfstrace_register( + const char *zTraceName, + const char *zOldVfsName, + int (*xOut)(const char*,void*), + void *pOutArg, + int makeDefault + ); + vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); +#endif +#ifdef SQLITE_ENABLE_MULTIPLEX + }else if( strcmp(z,"-multiplex")==0 ){ + extern int sqlite3_multiple_initialize(const char*,int); + sqlite3_multiplex_initialize(0, 1); +#endif + }else if( strcmp(z,"-mmap")==0 ){ + sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); + sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz); +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + }else if( strcmp(z,"-sorterref")==0 ){ + sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); + sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz); +#endif + }else if( strcmp(z,"-vfs")==0 ){ + zVfs = cmdline_option_value(argc, argv, ++i); +#ifdef SQLITE_HAVE_ZLIB + }else if( strcmp(z,"-zip")==0 ){ + data.openMode = SHELL_OPEN_ZIPFILE; +#endif + }else if( strcmp(z,"-append")==0 ){ + data.openMode = SHELL_OPEN_APPENDVFS; +#ifdef SQLITE_ENABLE_DESERIALIZE + }else if( strcmp(z,"-deserialize")==0 ){ + data.openMode = SHELL_OPEN_DESERIALIZE; + }else if( strcmp(z,"-maxsize")==0 && i+10 ){ + utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands" + " with \"%s\"\n", z); + return 1; + } + open_db(&data, OPEN_DB_ZIPFILE); + if( z[2] ){ + argv[i] = &z[2]; + arDotCommand(&data, 1, argv+(i-1), argc-(i-1)); + }else{ + arDotCommand(&data, 1, argv+i, argc-i); + } + readStdin = 0; + break; +#endif + }else{ + utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); + raw_printf(stderr,"Use -help for a list of options.\n"); + return 1; + } + data.cMode = data.mode; + } + + if( !readStdin ){ + /* Run all arguments that do not begin with '-' as if they were separate + ** command-line inputs, except for the argToSkip argument which contains + ** the database filename. + */ + for(i=0; i insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +.B sqlite3 +\- A command line interface for SQLite version 3 + +.SH SYNOPSIS +.B sqlite3 +.RI [ options ] +.RI [ databasefile ] +.RI [ SQL ] + +.SH SUMMARY +.PP +.B sqlite3 +is a terminal-based front-end to the SQLite library that can evaluate +queries interactively and display the results in multiple formats. +.B sqlite3 +can also be used within shell scripts and other applications to provide +batch processing features. + +.SH DESCRIPTION +To start a +.B sqlite3 +interactive session, invoke the +.B sqlite3 +command and optionally provide the name of a database file. If the +database file does not exist, it will be created. If the database file +does exist, it will be opened. + +For example, to create a new database file named "mydata.db", create +a table named "memos" and insert a couple of records into that table: +.sp +$ +.B sqlite3 mydata.db +.br +SQLite version 3.8.8 +.br +Enter ".help" for instructions +.br +sqlite> +.B create table memos(text, priority INTEGER); +.br +sqlite> +.B insert into memos values('deliver project description', 10); +.br +sqlite> +.B insert into memos values('lunch with Christine', 100); +.br +sqlite> +.B select * from memos; +.br +deliver project description|10 +.br +lunch with Christine|100 +.br +sqlite> +.sp + +If no database name is supplied, the ATTACH sql command can be used +to attach to existing or create new database files. ATTACH can also +be used to attach to multiple databases within the same interactive +session. This is useful for migrating data between databases, +possibly changing the schema along the way. + +Optionally, a SQL statement or set of SQL statements can be supplied as +a single argument. Multiple statements should be separated by +semi-colons. + +For example: +.sp +$ +.B sqlite3 -line mydata.db 'select * from memos where priority > 20;' +.br + text = lunch with Christine +.br +priority = 100 +.br +.sp + +.SS SQLITE META-COMMANDS +.PP +The interactive interpreter offers a set of meta-commands that can be +used to control the output format, examine the currently attached +database files, or perform administrative operations upon the +attached databases (such as rebuilding indices). Meta-commands are +always prefixed with a dot (.). + +A list of available meta-commands can be viewed at any time by issuing +the '.help' command. For example: +.sp +sqlite> +.B .help +.nf +.tr %. +%backup ?DB? FILE Backup DB (default "main") to FILE +%bail on|off Stop after hitting an error. Default OFF +%clone NEWDB Clone data into NEWDB from the existing database +%databases List names and files of attached databases +%dump ?TABLE? ... Dump the database in an SQL text format + If TABLE specified, only dump tables matching + LIKE pattern TABLE. +%echo on|off Turn command echo on or off +%eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN +%exit Exit this program +%explain ?on|off? Turn output mode suitable for EXPLAIN on or off. + With no args, it turns EXPLAIN on. +%fullschema Show schema and the content of sqlite_stat tables +%headers on|off Turn display of headers on or off +%help Show this message +%import FILE TABLE Import data from FILE into TABLE +%indices ?TABLE? Show names of all indices + If TABLE specified, only show indices for tables + matching LIKE pattern TABLE. +%load FILE ?ENTRY? Load an extension library +%log FILE|off Turn logging on or off. FILE can be stderr/stdout +%mode MODE ?TABLE? Set output mode where MODE is one of: + csv Comma-separated values + column Left-aligned columns. (See .width) + html HTML
code + insert SQL insert statements for TABLE + line One value per line + list Values delimited by .separator string + tabs Tab-separated values + tcl TCL list elements +%nullvalue STRING Use STRING in place of NULL values +%once FILENAME Output for the next SQL command only to FILENAME +%open ?FILENAME? Close existing database and reopen FILENAME +%output ?FILENAME? Send output to FILENAME or stdout +%print STRING... Print literal STRING +%prompt MAIN CONTINUE Replace the standard prompts +%quit Exit this program +%read FILENAME Execute SQL in FILENAME +%restore ?DB? FILE Restore content of DB (default "main") from FILE +%save FILE Write in-memory database into FILE +%schema ?TABLE? Show the CREATE statements + If TABLE specified, only show tables matching + LIKE pattern TABLE. +%separator STRING ?NL? Change separator used by output mode and .import + NL is the end-of-line mark for CSV +%shell CMD ARGS... Run CMD ARGS... in a system shell +%show Show the current values for various settings +%stats on|off Turn stats on or off +%system CMD ARGS... Run CMD ARGS... in a system shell +%tables ?TABLE? List names of tables + If TABLE specified, only list tables matching + LIKE pattern TABLE. +%timeout MS Try opening locked tables for MS milliseconds +%timer on|off Turn SQL timer on or off +%trace FILE|off Output each SQL statement as it is run +%vfsname ?AUX? Print the name of the VFS stack +%width NUM1 NUM2 ... Set column widths for "column" mode + Negative values right-justify +sqlite> +.sp +.fi +.SH OPTIONS +.B sqlite3 +has the following options: +.TP +.B \-bail +Stop after hitting an error. +.TP +.B \-batch +Force batch I/O. +.TP +.B \-column +Query results will be displayed in a table like form, using +whitespace characters to separate the columns and align the +output. +.TP +.BI \-cmd\ command +run +.I command +before reading stdin +.TP +.B \-csv +Set output mode to CSV (comma separated values). +.TP +.B \-echo +Print commands before execution. +.TP +.BI \-init\ file +Read and execute commands from +.I file +, which can contain a mix of SQL statements and meta-commands. +.TP +.B \-[no]header +Turn headers on or off. +.TP +.B \-help +Show help on options and exit. +.TP +.B \-html +Query results will be output as simple HTML tables. +.TP +.B \-interactive +Force interactive I/O. +.TP +.B \-line +Query results will be displayed with one value per line, rows +separated by a blank line. Designed to be easily parsed by +scripts or other programs +.TP +.B \-list +Query results will be displayed with the separator (|, by default) +character between each field value. The default. +.TP +.BI \-mmap\ N +Set default mmap size to +.I N +\. +.TP +.BI \-nullvalue\ string +Set string used to represent NULL values. Default is '' +(empty string). +.TP +.BI \-separator\ separator +Set output field separator. Default is '|'. +.TP +.B \-stats +Print memory stats before each finalize. +.TP +.B \-version +Show SQLite version. +.TP +.BI \-vfs\ name +Use +.I name +as the default VFS. + + +.SH INIT FILE +.B sqlite3 +reads an initialization file to set the configuration of the +interactive environment. Throughout initialization, any previously +specified setting can be overridden. The sequence of initialization is +as follows: + +o The default configuration is established as follows: + +.sp +.nf +.cc | +mode = LIST +separator = "|" +main prompt = "sqlite> " +continue prompt = " ...> " +|cc . +.sp +.fi + +o If the file +.B ~/.sqliterc +exists, it is processed first. +can be found in the user's home directory, it is +read and processed. It should generally only contain meta-commands. + +o If the -init option is present, the specified file is processed. + +o All other command line options are processed. + +.SH SEE ALSO +http://www.sqlite.org/cli.html +.br +The sqlite3-doc package. +.SH AUTHOR +This manual page was originally written by Andreas Rottmann +, for the Debian GNU/Linux system (but may be used +by others). It was subsequently revised by Bill Bumgarner and +further updated by Laszlo Boszormenyi . diff --git a/deps/sqlite-autoconf-3320300/sqlite3.c b/deps/sqlite-autoconf-3320300/sqlite3.c new file mode 100644 index 000000000..473d47b34 --- /dev/null +++ b/deps/sqlite-autoconf-3320300/sqlite3.c @@ -0,0 +1,229787 @@ +/****************************************************************************** +** This file is an amalgamation of many separate C source files from SQLite +** version 3.32.3. By combining all the individual C code files into this +** single large file, the entire code can be compiled as a single translation +** unit. This allows many compilers to do optimizations that would not be +** possible if the files were compiled separately. Performance improvements +** of 5% or more are commonly seen when SQLite is compiled as a single +** translation unit. +** +** This file is all you need to compile SQLite. To use SQLite in other +** programs, you need this file and the "sqlite3.h" header file that defines +** the programming interface to the SQLite library. (If you do not have +** the "sqlite3.h" header file at hand, you will find a copy embedded within +** the text of this file. Search for "Begin file sqlite3.h" to find the start +** of the embedded sqlite3.h header file.) Additional code files may be needed +** 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. +*/ +#define SQLITE_CORE 1 +#define SQLITE_AMALGAMATION 1 +#ifndef SQLITE_PRIVATE +# define SQLITE_PRIVATE static +#endif +/************** Begin file ctime.c *******************************************/ +/* +** 2010 February 23 +** +** 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 implements routines used to report what compile-time options +** SQLite was built with. +*/ + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS /* IMP: R-16824-07538 */ + +/* +** Include the configuration header output by 'configure' if we're using the +** autoconf-based build +*/ +#if defined(_HAVE_SQLITE_CONFIG_H) && !defined(SQLITECONFIG_H) +#include "config.h" +#define SQLITECONFIG_H 1 +#endif + +/* These macros are provided to "stringify" the value of the define +** for those options in which the value is meaningful. */ +#define CTIMEOPT_VAL_(opt) #opt +#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) + +/* Like CTIMEOPT_VAL, but especially for SQLITE_DEFAULT_LOOKASIDE. This +** option requires a separate macro because legal values contain a single +** comma. e.g. (-DSQLITE_DEFAULT_LOOKASIDE="100,100") */ +#define CTIMEOPT_VAL2_(opt1,opt2) #opt1 "," #opt2 +#define CTIMEOPT_VAL2(opt) CTIMEOPT_VAL2_(opt) + +/* +** An array of names of all compile-time options. This array should +** be sorted A-Z. +** +** This array looks large, but in a typical installation actually uses +** only a handful of compile-time options, so most times this array is usually +** rather short and uses little memory space. +*/ +static const char * const sqlite3azCompileOpt[] = { + +/* +** BEGIN CODE GENERATED BY tool/mkctime.tcl +*/ +#if SQLITE_32BIT_ROWID + "32BIT_ROWID", +#endif +#if SQLITE_4_BYTE_ALIGNED_MALLOC + "4_BYTE_ALIGNED_MALLOC", +#endif +#if SQLITE_64BIT_STATS + "64BIT_STATS", +#endif +#if SQLITE_ALLOW_COVERING_INDEX_SCAN + "ALLOW_COVERING_INDEX_SCAN", +#endif +#if SQLITE_ALLOW_URI_AUTHORITY + "ALLOW_URI_AUTHORITY", +#endif +#ifdef SQLITE_BITMASK_TYPE + "BITMASK_TYPE=" CTIMEOPT_VAL(SQLITE_BITMASK_TYPE), +#endif +#if SQLITE_BUG_COMPATIBLE_20160819 + "BUG_COMPATIBLE_20160819", +#endif +#if SQLITE_CASE_SENSITIVE_LIKE + "CASE_SENSITIVE_LIKE", +#endif +#if SQLITE_CHECK_PAGES + "CHECK_PAGES", +#endif +#if defined(__clang__) && defined(__clang_major__) + "COMPILER=clang-" CTIMEOPT_VAL(__clang_major__) "." + CTIMEOPT_VAL(__clang_minor__) "." + CTIMEOPT_VAL(__clang_patchlevel__), +#elif defined(_MSC_VER) + "COMPILER=msvc-" CTIMEOPT_VAL(_MSC_VER), +#elif defined(__GNUC__) && defined(__VERSION__) + "COMPILER=gcc-" __VERSION__, +#endif +#if SQLITE_COVERAGE_TEST + "COVERAGE_TEST", +#endif +#if SQLITE_DEBUG + "DEBUG", +#endif +#if SQLITE_DEFAULT_AUTOMATIC_INDEX + "DEFAULT_AUTOMATIC_INDEX", +#endif +#if SQLITE_DEFAULT_AUTOVACUUM + "DEFAULT_AUTOVACUUM", +#endif +#ifdef SQLITE_DEFAULT_CACHE_SIZE + "DEFAULT_CACHE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_CACHE_SIZE), +#endif +#if SQLITE_DEFAULT_CKPTFULLFSYNC + "DEFAULT_CKPTFULLFSYNC", +#endif +#ifdef SQLITE_DEFAULT_FILE_FORMAT + "DEFAULT_FILE_FORMAT=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_FORMAT), +#endif +#ifdef SQLITE_DEFAULT_FILE_PERMISSIONS + "DEFAULT_FILE_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_PERMISSIONS), +#endif +#if SQLITE_DEFAULT_FOREIGN_KEYS + "DEFAULT_FOREIGN_KEYS", +#endif +#ifdef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT + "DEFAULT_JOURNAL_SIZE_LIMIT=" CTIMEOPT_VAL(SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT), +#endif +#ifdef SQLITE_DEFAULT_LOCKING_MODE + "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE), +#endif +#ifdef SQLITE_DEFAULT_LOOKASIDE + "DEFAULT_LOOKASIDE=" CTIMEOPT_VAL2(SQLITE_DEFAULT_LOOKASIDE), +#endif +#if SQLITE_DEFAULT_MEMSTATUS + "DEFAULT_MEMSTATUS", +#endif +#ifdef SQLITE_DEFAULT_MMAP_SIZE + "DEFAULT_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_MMAP_SIZE), +#endif +#ifdef SQLITE_DEFAULT_PAGE_SIZE + "DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_PAGE_SIZE), +#endif +#ifdef SQLITE_DEFAULT_PCACHE_INITSZ + "DEFAULT_PCACHE_INITSZ=" CTIMEOPT_VAL(SQLITE_DEFAULT_PCACHE_INITSZ), +#endif +#ifdef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS + "DEFAULT_PROXYDIR_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_PROXYDIR_PERMISSIONS), +#endif +#if SQLITE_DEFAULT_RECURSIVE_TRIGGERS + "DEFAULT_RECURSIVE_TRIGGERS", +#endif +#ifdef SQLITE_DEFAULT_ROWEST + "DEFAULT_ROWEST=" CTIMEOPT_VAL(SQLITE_DEFAULT_ROWEST), +#endif +#ifdef SQLITE_DEFAULT_SECTOR_SIZE + "DEFAULT_SECTOR_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_SECTOR_SIZE), +#endif +#ifdef SQLITE_DEFAULT_SYNCHRONOUS + "DEFAULT_SYNCHRONOUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_SYNCHRONOUS), +#endif +#ifdef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT + "DEFAULT_WAL_AUTOCHECKPOINT=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_AUTOCHECKPOINT), +#endif +#ifdef SQLITE_DEFAULT_WAL_SYNCHRONOUS + "DEFAULT_WAL_SYNCHRONOUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_SYNCHRONOUS), +#endif +#ifdef SQLITE_DEFAULT_WORKER_THREADS + "DEFAULT_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WORKER_THREADS), +#endif +#if SQLITE_DIRECT_OVERFLOW_READ + "DIRECT_OVERFLOW_READ", +#endif +#if SQLITE_DISABLE_DIRSYNC + "DISABLE_DIRSYNC", +#endif +#if SQLITE_DISABLE_FTS3_UNICODE + "DISABLE_FTS3_UNICODE", +#endif +#if SQLITE_DISABLE_FTS4_DEFERRED + "DISABLE_FTS4_DEFERRED", +#endif +#if SQLITE_DISABLE_INTRINSIC + "DISABLE_INTRINSIC", +#endif +#if SQLITE_DISABLE_LFS + "DISABLE_LFS", +#endif +#if SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS + "DISABLE_PAGECACHE_OVERFLOW_STATS", +#endif +#if SQLITE_DISABLE_SKIPAHEAD_DISTINCT + "DISABLE_SKIPAHEAD_DISTINCT", +#endif +#ifdef SQLITE_ENABLE_8_3_NAMES + "ENABLE_8_3_NAMES=" CTIMEOPT_VAL(SQLITE_ENABLE_8_3_NAMES), +#endif +#if SQLITE_ENABLE_API_ARMOR + "ENABLE_API_ARMOR", +#endif +#if SQLITE_ENABLE_ATOMIC_WRITE + "ENABLE_ATOMIC_WRITE", +#endif +#if SQLITE_ENABLE_BATCH_ATOMIC_WRITE + "ENABLE_BATCH_ATOMIC_WRITE", +#endif +#if SQLITE_ENABLE_BYTECODE_VTAB + "ENABLE_BYTECODE_VTAB", +#endif +#if SQLITE_ENABLE_CEROD + "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD), +#endif +#if SQLITE_ENABLE_COLUMN_METADATA + "ENABLE_COLUMN_METADATA", +#endif +#if SQLITE_ENABLE_COLUMN_USED_MASK + "ENABLE_COLUMN_USED_MASK", +#endif +#if SQLITE_ENABLE_COSTMULT + "ENABLE_COSTMULT", +#endif +#if SQLITE_ENABLE_CURSOR_HINTS + "ENABLE_CURSOR_HINTS", +#endif +#if SQLITE_ENABLE_DBSTAT_VTAB + "ENABLE_DBSTAT_VTAB", +#endif +#if SQLITE_ENABLE_EXPENSIVE_ASSERT + "ENABLE_EXPENSIVE_ASSERT", +#endif +#if SQLITE_ENABLE_FTS1 + "ENABLE_FTS1", +#endif +#if SQLITE_ENABLE_FTS2 + "ENABLE_FTS2", +#endif +#if SQLITE_ENABLE_FTS3 + "ENABLE_FTS3", +#endif +#if SQLITE_ENABLE_FTS3_PARENTHESIS + "ENABLE_FTS3_PARENTHESIS", +#endif +#if SQLITE_ENABLE_FTS3_TOKENIZER + "ENABLE_FTS3_TOKENIZER", +#endif +#if SQLITE_ENABLE_FTS4 + "ENABLE_FTS4", +#endif +#if SQLITE_ENABLE_FTS5 + "ENABLE_FTS5", +#endif +#if SQLITE_ENABLE_GEOPOLY + "ENABLE_GEOPOLY", +#endif +#if SQLITE_ENABLE_HIDDEN_COLUMNS + "ENABLE_HIDDEN_COLUMNS", +#endif +#if SQLITE_ENABLE_ICU + "ENABLE_ICU", +#endif +#if SQLITE_ENABLE_IOTRACE + "ENABLE_IOTRACE", +#endif +#if SQLITE_ENABLE_JSON1 + "ENABLE_JSON1", +#endif +#if SQLITE_ENABLE_LOAD_EXTENSION + "ENABLE_LOAD_EXTENSION", +#endif +#ifdef SQLITE_ENABLE_LOCKING_STYLE + "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE), +#endif +#if SQLITE_ENABLE_MEMORY_MANAGEMENT + "ENABLE_MEMORY_MANAGEMENT", +#endif +#if SQLITE_ENABLE_MEMSYS3 + "ENABLE_MEMSYS3", +#endif +#if SQLITE_ENABLE_MEMSYS5 + "ENABLE_MEMSYS5", +#endif +#if SQLITE_ENABLE_MULTIPLEX + "ENABLE_MULTIPLEX", +#endif +#if SQLITE_ENABLE_NORMALIZE + "ENABLE_NORMALIZE", +#endif +#if SQLITE_ENABLE_NULL_TRIM + "ENABLE_NULL_TRIM", +#endif +#if SQLITE_ENABLE_OVERSIZE_CELL_CHECK + "ENABLE_OVERSIZE_CELL_CHECK", +#endif +#if SQLITE_ENABLE_PREUPDATE_HOOK + "ENABLE_PREUPDATE_HOOK", +#endif +#if SQLITE_ENABLE_QPSG + "ENABLE_QPSG", +#endif +#if SQLITE_ENABLE_RBU + "ENABLE_RBU", +#endif +#if SQLITE_ENABLE_RTREE + "ENABLE_RTREE", +#endif +#if SQLITE_ENABLE_SELECTTRACE + "ENABLE_SELECTTRACE", +#endif +#if SQLITE_ENABLE_SESSION + "ENABLE_SESSION", +#endif +#if SQLITE_ENABLE_SNAPSHOT + "ENABLE_SNAPSHOT", +#endif +#if SQLITE_ENABLE_SORTER_REFERENCES + "ENABLE_SORTER_REFERENCES", +#endif +#if SQLITE_ENABLE_SQLLOG + "ENABLE_SQLLOG", +#endif +#if defined(SQLITE_ENABLE_STAT4) + "ENABLE_STAT4", +#endif +#if SQLITE_ENABLE_STMTVTAB + "ENABLE_STMTVTAB", +#endif +#if SQLITE_ENABLE_STMT_SCANSTATUS + "ENABLE_STMT_SCANSTATUS", +#endif +#if SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + "ENABLE_UNKNOWN_SQL_FUNCTION", +#endif +#if SQLITE_ENABLE_UNLOCK_NOTIFY + "ENABLE_UNLOCK_NOTIFY", +#endif +#if SQLITE_ENABLE_UPDATE_DELETE_LIMIT + "ENABLE_UPDATE_DELETE_LIMIT", +#endif +#if SQLITE_ENABLE_URI_00_ERROR + "ENABLE_URI_00_ERROR", +#endif +#if SQLITE_ENABLE_VFSTRACE + "ENABLE_VFSTRACE", +#endif +#if SQLITE_ENABLE_WHERETRACE + "ENABLE_WHERETRACE", +#endif +#if SQLITE_ENABLE_ZIPVFS + "ENABLE_ZIPVFS", +#endif +#if SQLITE_EXPLAIN_ESTIMATED_ROWS + "EXPLAIN_ESTIMATED_ROWS", +#endif +#if SQLITE_EXTRA_IFNULLROW + "EXTRA_IFNULLROW", +#endif +#ifdef SQLITE_EXTRA_INIT + "EXTRA_INIT=" CTIMEOPT_VAL(SQLITE_EXTRA_INIT), +#endif +#ifdef SQLITE_EXTRA_SHUTDOWN + "EXTRA_SHUTDOWN=" CTIMEOPT_VAL(SQLITE_EXTRA_SHUTDOWN), +#endif +#ifdef SQLITE_FTS3_MAX_EXPR_DEPTH + "FTS3_MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_FTS3_MAX_EXPR_DEPTH), +#endif +#if SQLITE_FTS5_ENABLE_TEST_MI + "FTS5_ENABLE_TEST_MI", +#endif +#if SQLITE_FTS5_NO_WITHOUT_ROWID + "FTS5_NO_WITHOUT_ROWID", +#endif +#if HAVE_ISNAN || SQLITE_HAVE_ISNAN + "HAVE_ISNAN", +#endif +#if SQLITE_HOMEGROWN_RECURSIVE_MUTEX + "HOMEGROWN_RECURSIVE_MUTEX", +#endif +#if SQLITE_IGNORE_AFP_LOCK_ERRORS + "IGNORE_AFP_LOCK_ERRORS", +#endif +#if SQLITE_IGNORE_FLOCK_LOCK_ERRORS + "IGNORE_FLOCK_LOCK_ERRORS", +#endif +#if SQLITE_INLINE_MEMCPY + "INLINE_MEMCPY", +#endif +#if SQLITE_INT64_TYPE + "INT64_TYPE", +#endif +#ifdef SQLITE_INTEGRITY_CHECK_ERROR_MAX + "INTEGRITY_CHECK_ERROR_MAX=" CTIMEOPT_VAL(SQLITE_INTEGRITY_CHECK_ERROR_MAX), +#endif +#if SQLITE_LIKE_DOESNT_MATCH_BLOBS + "LIKE_DOESNT_MATCH_BLOBS", +#endif +#if SQLITE_LOCK_TRACE + "LOCK_TRACE", +#endif +#if SQLITE_LOG_CACHE_SPILL + "LOG_CACHE_SPILL", +#endif +#ifdef SQLITE_MALLOC_SOFT_LIMIT + "MALLOC_SOFT_LIMIT=" CTIMEOPT_VAL(SQLITE_MALLOC_SOFT_LIMIT), +#endif +#ifdef SQLITE_MAX_ATTACHED + "MAX_ATTACHED=" CTIMEOPT_VAL(SQLITE_MAX_ATTACHED), +#endif +#ifdef SQLITE_MAX_COLUMN + "MAX_COLUMN=" CTIMEOPT_VAL(SQLITE_MAX_COLUMN), +#endif +#ifdef SQLITE_MAX_COMPOUND_SELECT + "MAX_COMPOUND_SELECT=" CTIMEOPT_VAL(SQLITE_MAX_COMPOUND_SELECT), +#endif +#ifdef SQLITE_MAX_DEFAULT_PAGE_SIZE + "MAX_DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_DEFAULT_PAGE_SIZE), +#endif +#ifdef SQLITE_MAX_EXPR_DEPTH + "MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_EXPR_DEPTH), +#endif +#ifdef SQLITE_MAX_FUNCTION_ARG + "MAX_FUNCTION_ARG=" CTIMEOPT_VAL(SQLITE_MAX_FUNCTION_ARG), +#endif +#ifdef SQLITE_MAX_LENGTH + "MAX_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LENGTH), +#endif +#ifdef SQLITE_MAX_LIKE_PATTERN_LENGTH + "MAX_LIKE_PATTERN_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LIKE_PATTERN_LENGTH), +#endif +#ifdef SQLITE_MAX_MEMORY + "MAX_MEMORY=" CTIMEOPT_VAL(SQLITE_MAX_MEMORY), +#endif +#ifdef SQLITE_MAX_MMAP_SIZE + "MAX_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE), +#endif +#ifdef SQLITE_MAX_MMAP_SIZE_ + "MAX_MMAP_SIZE_=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE_), +#endif +#ifdef SQLITE_MAX_PAGE_COUNT + "MAX_PAGE_COUNT=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_COUNT), +#endif +#ifdef SQLITE_MAX_PAGE_SIZE + "MAX_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_SIZE), +#endif +#ifdef SQLITE_MAX_SCHEMA_RETRY + "MAX_SCHEMA_RETRY=" CTIMEOPT_VAL(SQLITE_MAX_SCHEMA_RETRY), +#endif +#ifdef SQLITE_MAX_SQL_LENGTH + "MAX_SQL_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_SQL_LENGTH), +#endif +#ifdef SQLITE_MAX_TRIGGER_DEPTH + "MAX_TRIGGER_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_TRIGGER_DEPTH), +#endif +#ifdef SQLITE_MAX_VARIABLE_NUMBER + "MAX_VARIABLE_NUMBER=" CTIMEOPT_VAL(SQLITE_MAX_VARIABLE_NUMBER), +#endif +#ifdef SQLITE_MAX_VDBE_OP + "MAX_VDBE_OP=" CTIMEOPT_VAL(SQLITE_MAX_VDBE_OP), +#endif +#ifdef SQLITE_MAX_WORKER_THREADS + "MAX_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_MAX_WORKER_THREADS), +#endif +#if SQLITE_MEMDEBUG + "MEMDEBUG", +#endif +#if SQLITE_MIXED_ENDIAN_64BIT_FLOAT + "MIXED_ENDIAN_64BIT_FLOAT", +#endif +#if SQLITE_MMAP_READWRITE + "MMAP_READWRITE", +#endif +#if SQLITE_MUTEX_NOOP + "MUTEX_NOOP", +#endif +#if SQLITE_MUTEX_NREF + "MUTEX_NREF", +#endif +#if SQLITE_MUTEX_OMIT + "MUTEX_OMIT", +#endif +#if SQLITE_MUTEX_PTHREADS + "MUTEX_PTHREADS", +#endif +#if SQLITE_MUTEX_W32 + "MUTEX_W32", +#endif +#if SQLITE_NEED_ERR_NAME + "NEED_ERR_NAME", +#endif +#if SQLITE_NOINLINE + "NOINLINE", +#endif +#if SQLITE_NO_SYNC + "NO_SYNC", +#endif +#if SQLITE_OMIT_ALTERTABLE + "OMIT_ALTERTABLE", +#endif +#if SQLITE_OMIT_ANALYZE + "OMIT_ANALYZE", +#endif +#if SQLITE_OMIT_ATTACH + "OMIT_ATTACH", +#endif +#if SQLITE_OMIT_AUTHORIZATION + "OMIT_AUTHORIZATION", +#endif +#if SQLITE_OMIT_AUTOINCREMENT + "OMIT_AUTOINCREMENT", +#endif +#if SQLITE_OMIT_AUTOINIT + "OMIT_AUTOINIT", +#endif +#if SQLITE_OMIT_AUTOMATIC_INDEX + "OMIT_AUTOMATIC_INDEX", +#endif +#if SQLITE_OMIT_AUTORESET + "OMIT_AUTORESET", +#endif +#if SQLITE_OMIT_AUTOVACUUM + "OMIT_AUTOVACUUM", +#endif +#if SQLITE_OMIT_BETWEEN_OPTIMIZATION + "OMIT_BETWEEN_OPTIMIZATION", +#endif +#if SQLITE_OMIT_BLOB_LITERAL + "OMIT_BLOB_LITERAL", +#endif +#if SQLITE_OMIT_CAST + "OMIT_CAST", +#endif +#if SQLITE_OMIT_CHECK + "OMIT_CHECK", +#endif +#if SQLITE_OMIT_COMPLETE + "OMIT_COMPLETE", +#endif +#if SQLITE_OMIT_COMPOUND_SELECT + "OMIT_COMPOUND_SELECT", +#endif +#if SQLITE_OMIT_CONFLICT_CLAUSE + "OMIT_CONFLICT_CLAUSE", +#endif +#if SQLITE_OMIT_CTE + "OMIT_CTE", +#endif +#if SQLITE_OMIT_DATETIME_FUNCS + "OMIT_DATETIME_FUNCS", +#endif +#if SQLITE_OMIT_DECLTYPE + "OMIT_DECLTYPE", +#endif +#if SQLITE_OMIT_DEPRECATED + "OMIT_DEPRECATED", +#endif +#if SQLITE_OMIT_DISKIO + "OMIT_DISKIO", +#endif +#if SQLITE_OMIT_EXPLAIN + "OMIT_EXPLAIN", +#endif +#if SQLITE_OMIT_FLAG_PRAGMAS + "OMIT_FLAG_PRAGMAS", +#endif +#if SQLITE_OMIT_FLOATING_POINT + "OMIT_FLOATING_POINT", +#endif +#if SQLITE_OMIT_FOREIGN_KEY + "OMIT_FOREIGN_KEY", +#endif +#if SQLITE_OMIT_GET_TABLE + "OMIT_GET_TABLE", +#endif +#if SQLITE_OMIT_HEX_INTEGER + "OMIT_HEX_INTEGER", +#endif +#if SQLITE_OMIT_INCRBLOB + "OMIT_INCRBLOB", +#endif +#if SQLITE_OMIT_INTEGRITY_CHECK + "OMIT_INTEGRITY_CHECK", +#endif +#if SQLITE_OMIT_LIKE_OPTIMIZATION + "OMIT_LIKE_OPTIMIZATION", +#endif +#if SQLITE_OMIT_LOAD_EXTENSION + "OMIT_LOAD_EXTENSION", +#endif +#if SQLITE_OMIT_LOCALTIME + "OMIT_LOCALTIME", +#endif +#if SQLITE_OMIT_LOOKASIDE + "OMIT_LOOKASIDE", +#endif +#if SQLITE_OMIT_MEMORYDB + "OMIT_MEMORYDB", +#endif +#if SQLITE_OMIT_OR_OPTIMIZATION + "OMIT_OR_OPTIMIZATION", +#endif +#if SQLITE_OMIT_PAGER_PRAGMAS + "OMIT_PAGER_PRAGMAS", +#endif +#if SQLITE_OMIT_PARSER_TRACE + "OMIT_PARSER_TRACE", +#endif +#if SQLITE_OMIT_POPEN + "OMIT_POPEN", +#endif +#if SQLITE_OMIT_PRAGMA + "OMIT_PRAGMA", +#endif +#if SQLITE_OMIT_PROGRESS_CALLBACK + "OMIT_PROGRESS_CALLBACK", +#endif +#if SQLITE_OMIT_QUICKBALANCE + "OMIT_QUICKBALANCE", +#endif +#if SQLITE_OMIT_REINDEX + "OMIT_REINDEX", +#endif +#if SQLITE_OMIT_SCHEMA_PRAGMAS + "OMIT_SCHEMA_PRAGMAS", +#endif +#if SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS + "OMIT_SCHEMA_VERSION_PRAGMAS", +#endif +#if SQLITE_OMIT_SHARED_CACHE + "OMIT_SHARED_CACHE", +#endif +#if SQLITE_OMIT_SHUTDOWN_DIRECTORIES + "OMIT_SHUTDOWN_DIRECTORIES", +#endif +#if SQLITE_OMIT_SUBQUERY + "OMIT_SUBQUERY", +#endif +#if SQLITE_OMIT_TCL_VARIABLE + "OMIT_TCL_VARIABLE", +#endif +#if SQLITE_OMIT_TEMPDB + "OMIT_TEMPDB", +#endif +#if SQLITE_OMIT_TEST_CONTROL + "OMIT_TEST_CONTROL", +#endif +#if SQLITE_OMIT_TRACE + "OMIT_TRACE", +#endif +#if SQLITE_OMIT_TRIGGER + "OMIT_TRIGGER", +#endif +#if SQLITE_OMIT_TRUNCATE_OPTIMIZATION + "OMIT_TRUNCATE_OPTIMIZATION", +#endif +#if SQLITE_OMIT_UTF16 + "OMIT_UTF16", +#endif +#if SQLITE_OMIT_VACUUM + "OMIT_VACUUM", +#endif +#if SQLITE_OMIT_VIEW + "OMIT_VIEW", +#endif +#if SQLITE_OMIT_VIRTUALTABLE + "OMIT_VIRTUALTABLE", +#endif +#if SQLITE_OMIT_WAL + "OMIT_WAL", +#endif +#if SQLITE_OMIT_WSD + "OMIT_WSD", +#endif +#if SQLITE_OMIT_XFER_OPT + "OMIT_XFER_OPT", +#endif +#if SQLITE_PCACHE_SEPARATE_HEADER + "PCACHE_SEPARATE_HEADER", +#endif +#if SQLITE_PERFORMANCE_TRACE + "PERFORMANCE_TRACE", +#endif +#if SQLITE_POWERSAFE_OVERWRITE + "POWERSAFE_OVERWRITE", +#endif +#if SQLITE_PREFER_PROXY_LOCKING + "PREFER_PROXY_LOCKING", +#endif +#if SQLITE_PROXY_DEBUG + "PROXY_DEBUG", +#endif +#if SQLITE_REVERSE_UNORDERED_SELECTS + "REVERSE_UNORDERED_SELECTS", +#endif +#if SQLITE_RTREE_INT_ONLY + "RTREE_INT_ONLY", +#endif +#if SQLITE_SECURE_DELETE + "SECURE_DELETE", +#endif +#if SQLITE_SMALL_STACK + "SMALL_STACK", +#endif +#ifdef SQLITE_SORTER_PMASZ + "SORTER_PMASZ=" CTIMEOPT_VAL(SQLITE_SORTER_PMASZ), +#endif +#if SQLITE_SOUNDEX + "SOUNDEX", +#endif +#ifdef SQLITE_STAT4_SAMPLES + "STAT4_SAMPLES=" CTIMEOPT_VAL(SQLITE_STAT4_SAMPLES), +#endif +#ifdef SQLITE_STMTJRNL_SPILL + "STMTJRNL_SPILL=" CTIMEOPT_VAL(SQLITE_STMTJRNL_SPILL), +#endif +#if SQLITE_SUBSTR_COMPATIBILITY + "SUBSTR_COMPATIBILITY", +#endif +#if SQLITE_SYSTEM_MALLOC + "SYSTEM_MALLOC", +#endif +#if SQLITE_TCL + "TCL", +#endif +#ifdef SQLITE_TEMP_STORE + "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE), +#endif +#if SQLITE_TEST + "TEST", +#endif +#if defined(SQLITE_THREADSAFE) + "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE), +#elif defined(THREADSAFE) + "THREADSAFE=" CTIMEOPT_VAL(THREADSAFE), +#else + "THREADSAFE=1", +#endif +#if SQLITE_UNLINK_AFTER_CLOSE + "UNLINK_AFTER_CLOSE", +#endif +#if SQLITE_UNTESTABLE + "UNTESTABLE", +#endif +#if SQLITE_USER_AUTHENTICATION + "USER_AUTHENTICATION", +#endif +#if SQLITE_USE_ALLOCA + "USE_ALLOCA", +#endif +#if SQLITE_USE_FCNTL_TRACE + "USE_FCNTL_TRACE", +#endif +#if SQLITE_USE_URI + "USE_URI", +#endif +#if SQLITE_VDBE_COVERAGE + "VDBE_COVERAGE", +#endif +#if SQLITE_WIN32_MALLOC + "WIN32_MALLOC", +#endif +#if SQLITE_ZERO_MALLOC + "ZERO_MALLOC", +#endif +/* +** END CODE GENERATED BY tool/mkctime.tcl +*/ +}; + +SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){ + *pnOpt = sizeof(sqlite3azCompileOpt) / sizeof(sqlite3azCompileOpt[0]); + return (const char**)sqlite3azCompileOpt; +} + +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +/************** End of ctime.c ***********************************************/ +/************** Begin file sqliteInt.h ***************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Internal interface definitions for SQLite. +** +*/ +#ifndef SQLITEINT_H +#define SQLITEINT_H + +/* Special Comments: +** +** Some comments have special meaning to the tools that measure test +** coverage: +** +** NO_TEST - The branches on this line are not +** measured by branch coverage. This is +** used on lines of code that actually +** implement parts of coverage testing. +** +** OPTIMIZATION-IF-TRUE - This branch is allowed to alway be false +** and the correct answer is still obtained, +** though perhaps more slowly. +** +** OPTIMIZATION-IF-FALSE - This branch is allowed to alway be true +** and the correct answer is still obtained, +** though perhaps more slowly. +** +** PREVENTS-HARMLESS-OVERREAD - This branch prevents a buffer overread +** that would be harmless and undetectable +** if it did occur. +** +** In all cases, the special comment must be enclosed in the usual +** slash-asterisk...asterisk-slash comment marks, with no spaces between the +** asterisks and the comment text. +*/ + +/* +** Make sure the Tcl calling convention macro is defined. This macro is +** only used by test code and Tcl integration code. +*/ +#ifndef SQLITE_TCLAPI +# define SQLITE_TCLAPI +#endif + +/* +** Include the header file used to customize the compiler options for MSVC. +** This should be done first so that it can successfully prevent spurious +** compiler warnings due to subsequent content in this file and other files +** that are included by this file. +*/ +/************** Include msvc.h in the middle of sqliteInt.h ******************/ +/************** Begin file msvc.h ********************************************/ +/* +** 2015 January 12 +** +** 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 code that is specific to MSVC. +*/ +#ifndef SQLITE_MSVC_H +#define SQLITE_MSVC_H + +#if defined(_MSC_VER) +#pragma warning(disable : 4054) +#pragma warning(disable : 4055) +#pragma warning(disable : 4100) +#pragma warning(disable : 4127) +#pragma warning(disable : 4130) +#pragma warning(disable : 4152) +#pragma warning(disable : 4189) +#pragma warning(disable : 4206) +#pragma warning(disable : 4210) +#pragma warning(disable : 4232) +#pragma warning(disable : 4244) +#pragma warning(disable : 4305) +#pragma warning(disable : 4306) +#pragma warning(disable : 4702) +#pragma warning(disable : 4706) +#endif /* defined(_MSC_VER) */ + +#if defined(_MSC_VER) && !defined(_WIN64) +#undef SQLITE_4_BYTE_ALIGNED_MALLOC +#define SQLITE_4_BYTE_ALIGNED_MALLOC +#endif /* defined(_MSC_VER) && !defined(_WIN64) */ + +#endif /* SQLITE_MSVC_H */ + +/************** End of msvc.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* +** Special setup for VxWorks +*/ +/************** Include vxworks.h in the middle of sqliteInt.h ***************/ +/************** Begin file vxworks.h *****************************************/ +/* +** 2015-03-02 +** +** 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 code that is specific to Wind River's VxWorks +*/ +#if defined(__RTP__) || defined(_WRS_KERNEL) +/* This is VxWorks. Set up things specially for that OS +*/ +#include +#include /* amalgamator: dontcache */ +#define OS_VXWORKS 1 +#define SQLITE_OS_OTHER 0 +#define SQLITE_HOMEGROWN_RECURSIVE_MUTEX 1 +#define SQLITE_OMIT_LOAD_EXTENSION 1 +#define SQLITE_ENABLE_LOCKING_STYLE 0 +#define HAVE_UTIME 1 +#else +/* This is not VxWorks. */ +#define OS_VXWORKS 0 +#define HAVE_FCHOWN 1 +#define HAVE_READLINK 1 +#define HAVE_LSTAT 1 +#endif /* defined(_WRS_KERNEL) */ + +/************** End of vxworks.h *********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* +** These #defines should enable >2GB file support on POSIX if the +** underlying operating system supports it. If the OS lacks +** large file support, or if the OS is windows, these should be no-ops. +** +** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any +** system #includes. Hence, this block of code must be the very first +** code in all source files. +** +** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch +** on the compiler command line. This is necessary if you are compiling +** on a recent machine (ex: Red Hat 7.2) but you want your code to work +** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2 +** without this option, LFS is enable. But LFS does not exist in the kernel +** in Red Hat 6.0, so the code won't work. Hence, for maximum binary +** portability you should omit LFS. +** +** The previous paragraph was written in 2005. (This paragraph is written +** on 2008-11-28.) These days, all Linux kernels support large files, so +** you should probably leave LFS enabled. But some embedded platforms might +** lack LFS in which case the SQLITE_DISABLE_LFS macro might still be useful. +** +** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later. +*/ +#ifndef SQLITE_DISABLE_LFS +# define _LARGE_FILE 1 +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +#endif + +/* The GCC_VERSION and MSVC_VERSION macros are used to +** conditionally include optimizations for each of these compilers. A +** value of 0 means that compiler is not being used. The +** SQLITE_DISABLE_INTRINSIC macro means do not use any compiler-specific +** optimizations, and hence set all compiler macros to 0 +** +** There was once also a CLANG_VERSION macro. However, we learn that the +** version numbers in clang are for "marketing" only and are inconsistent +** and unreliable. Fortunately, all versions of clang also recognize the +** gcc version numbers and have reasonable settings for gcc version numbers, +** so the GCC_VERSION macro will be set to a correct non-zero value even +** when compiling with clang. +*/ +#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif +#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) +# define MSVC_VERSION _MSC_VER +#else +# define MSVC_VERSION 0 +#endif + +/* Needed for various definitions... */ +#if defined(__GNUC__) && !defined(_GNU_SOURCE) +# define _GNU_SOURCE +#endif + +#if defined(__OpenBSD__) && !defined(_BSD_SOURCE) +# define _BSD_SOURCE +#endif + +/* +** For MinGW, check to see if we can include the header file containing its +** version information, among other things. Normally, this internal MinGW +** header file would [only] be included automatically by other MinGW header +** files; however, the contained version information is now required by this +** header file to work around binary compatibility issues (see below) and +** this is the only known way to reliably obtain it. This entire #if block +** would be completely unnecessary if there was any other way of detecting +** MinGW via their preprocessor (e.g. if they customized their GCC to define +** some MinGW-specific macros). When compiling for MinGW, either the +** _HAVE_MINGW_H or _HAVE__MINGW_H (note the extra underscore) macro must be +** defined; otherwise, detection of conditions specific to MinGW will be +** disabled. +*/ +#if defined(_HAVE_MINGW_H) +# include "mingw.h" +#elif defined(_HAVE__MINGW_H) +# include "_mingw.h" +#endif + +/* +** For MinGW version 4.x (and higher), check to see if the _USE_32BIT_TIME_T +** define is required to maintain binary compatibility with the MSVC runtime +** library in use (e.g. for Windows XP). +*/ +#if !defined(_USE_32BIT_TIME_T) && !defined(_USE_64BIT_TIME_T) && \ + defined(_WIN32) && !defined(_WIN64) && \ + defined(__MINGW_MAJOR_VERSION) && __MINGW_MAJOR_VERSION >= 4 && \ + defined(__MSVCRT__) +# define _USE_32BIT_TIME_T +#endif + +/* The public SQLite interface. The _FILE_OFFSET_BITS macro must appear +** first in QNX. Also, the _USE_32BIT_TIME_T macro must appear first for +** MinGW. +*/ +/************** Include sqlite3.h in the middle of sqliteInt.h ***************/ +/************** Begin file sqlite3.h *****************************************/ +/* +** 2001-09-15 +** +** 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 header file defines the interface that the SQLite library +** presents to client programs. If a C-function, structure, datatype, +** or constant definition does not appear in this file, then it is +** not a published API of SQLite, is subject to change without +** notice, and should not be referenced by programs that use SQLite. +** +** Some of the definitions that are in this file are marked as +** "experimental". Experimental interfaces are normally new +** features recently added to SQLite. We do not anticipate changes +** to experimental interfaces but reserve the right to make minor changes +** if experience from use "in the wild" suggest such changes are prudent. +** +** The official C-language API documentation for SQLite is derived +** from comments in this file. This file is the authoritative source +** on how SQLite interfaces are supposed to operate. +** +** The name of this file under configuration management is "sqlite.h.in". +** The makefile makes some minor changes to this file (such as inserting +** the version number) and changes its name to "sqlite3.h" as +** part of the build process. +*/ +#ifndef SQLITE3_H +#define SQLITE3_H +#include /* Needed for the definition of va_list */ + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +extern "C" { +#endif + + +/* +** Provide the ability to override linkage features of the interface. +*/ +#ifndef SQLITE_EXTERN +# define SQLITE_EXTERN extern +#endif +#ifndef SQLITE_API +# define SQLITE_API +#endif +#ifndef SQLITE_CDECL +# define SQLITE_CDECL +#endif +#ifndef SQLITE_APICALL +# define SQLITE_APICALL +#endif +#ifndef SQLITE_STDCALL +# define SQLITE_STDCALL SQLITE_APICALL +#endif +#ifndef SQLITE_CALLBACK +# define SQLITE_CALLBACK +#endif +#ifndef SQLITE_SYSAPI +# define SQLITE_SYSAPI +#endif + +/* +** These no-op macros are used in front of interfaces to mark those +** interfaces as either deprecated or experimental. New applications +** should not use deprecated interfaces - they are supported for backwards +** compatibility only. Application writers should be aware that +** experimental interfaces are subject to change in point releases. +** +** These macros used to resolve to various kinds of compiler magic that +** would generate warning messages when they were used. But that +** compiler magic ended up generating such a flurry of bug reports +** that we have taken it all out and gone back to using simple +** noop macros. +*/ +#define SQLITE_DEPRECATED +#define SQLITE_EXPERIMENTAL + +/* +** Ensure these symbols were not defined by some previous header file. +*/ +#ifdef SQLITE_VERSION +# undef SQLITE_VERSION +#endif +#ifdef SQLITE_VERSION_NUMBER +# undef SQLITE_VERSION_NUMBER +#endif + +/* +** CAPI3REF: Compile-Time Library Version Numbers +** +** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header +** evaluates to a string literal that is the SQLite version in the +** format "X.Y.Z" where X is the major version number (always 3 for +** SQLite3) and Y is the minor version number and Z is the release number.)^ +** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer +** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same +** numbers used in [SQLITE_VERSION].)^ +** The SQLITE_VERSION_NUMBER for any given release of SQLite will also +** be larger than the release from which it is derived. Either Y will +** be held constant and Z will be incremented or else Y will be incremented +** and Z will be reset to zero. +** +** Since [version 3.6.18] ([dateof:3.6.18]), +** SQLite source code has been stored in the +** Fossil configuration management +** system. ^The SQLITE_SOURCE_ID macro evaluates to +** a string which identifies a particular check-in of SQLite +** within its configuration management system. ^The SQLITE_SOURCE_ID +** string contains the date and time of the check-in (UTC) and a SHA1 +** or SHA3-256 hash of the entire source tree. If the source code has +** been edited in any way since it was last checked in, then the last +** four hexadecimal digits of the hash may be modified. +** +** See also: [sqlite3_libversion()], +** [sqlite3_libversion_number()], [sqlite3_sourceid()], +** [sqlite_version()] and [sqlite_source_id()]. +*/ +#define SQLITE_VERSION "3.32.3" +#define SQLITE_VERSION_NUMBER 3032003 +#define SQLITE_SOURCE_ID "2020-06-18 14:00:33 7ebdfa80be8e8e73324b8d66b3460222eb74c7e9dfd655b48d6ca7e1933cc8fd" + +/* +** CAPI3REF: Run-Time Library Version Numbers +** KEYWORDS: sqlite3_version sqlite3_sourceid +** +** These interfaces provide the same information as the [SQLITE_VERSION], +** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros +** but are associated with the library instead of the header file. ^(Cautious +** programmers might include assert() statements in their application to +** verify that values returned by these interfaces match the macros in +** the header, and thus ensure that the application is +** compiled with matching library and header files. +** +**
+** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
+** assert( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,80)==0 );
+** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
+** 
)^ +** +** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] +** macro. ^The sqlite3_libversion() function returns a pointer to the +** to the sqlite3_version[] string constant. The sqlite3_libversion() +** function is provided for use in DLLs since DLL users usually do not have +** direct access to string constants within the DLL. ^The +** sqlite3_libversion_number() function returns an integer equal to +** [SQLITE_VERSION_NUMBER]. ^(The sqlite3_sourceid() function returns +** a pointer to a string constant whose value is the same as the +** [SQLITE_SOURCE_ID] C preprocessor macro. Except if SQLite is built +** using an edited copy of [the amalgamation], then the last four characters +** of the hash might be different from [SQLITE_SOURCE_ID].)^ +** +** See also: [sqlite_version()] and [sqlite_source_id()]. +*/ +SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; +SQLITE_API const char *sqlite3_libversion(void); +SQLITE_API const char *sqlite3_sourceid(void); +SQLITE_API int sqlite3_libversion_number(void); + +/* +** CAPI3REF: Run-Time Library Compilation Options Diagnostics +** +** ^The sqlite3_compileoption_used() function returns 0 or 1 +** indicating whether the specified option was defined at +** compile time. ^The SQLITE_ prefix may be omitted from the +** option name passed to sqlite3_compileoption_used(). +** +** ^The sqlite3_compileoption_get() function allows iterating +** over the list of options that were defined at compile time by +** returning the N-th compile time option string. ^If N is out of range, +** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ +** prefix is omitted from any strings returned by +** sqlite3_compileoption_get(). +** +** ^Support for the diagnostic functions sqlite3_compileoption_used() +** and sqlite3_compileoption_get() may be omitted by specifying the +** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. +** +** See also: SQL functions [sqlite_compileoption_used()] and +** [sqlite_compileoption_get()] and the [compile_options pragma]. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_API int sqlite3_compileoption_used(const char *zOptName); +SQLITE_API const char *sqlite3_compileoption_get(int N); +#else +# define sqlite3_compileoption_used(X) 0 +# define sqlite3_compileoption_get(X) ((void*)0) +#endif + +/* +** CAPI3REF: Test To See If The Library Is Threadsafe +** +** ^The sqlite3_threadsafe() function returns zero if and only if +** SQLite was compiled with mutexing code omitted due to the +** [SQLITE_THREADSAFE] compile-time option being set to 0. +** +** SQLite can be compiled with or without mutexes. When +** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes +** are enabled and SQLite is threadsafe. When the +** [SQLITE_THREADSAFE] macro is 0, +** the mutexes are omitted. Without the mutexes, it is not safe +** to use SQLite concurrently from more than one thread. +** +** Enabling mutexes incurs a measurable performance penalty. +** So if speed is of utmost importance, it makes sense to disable +** the mutexes. But for maximum safety, mutexes should be enabled. +** ^The default behavior is for mutexes to be enabled. +** +** This interface can be used by an application to make sure that the +** version of SQLite that it is linking against was compiled with +** the desired setting of the [SQLITE_THREADSAFE] macro. +** +** This interface only reports on the compile-time mutex setting +** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with +** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but +** can be fully or partially disabled using a call to [sqlite3_config()] +** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], +** or [SQLITE_CONFIG_SERIALIZED]. ^(The return value of the +** sqlite3_threadsafe() function shows only the compile-time setting of +** thread safety, not any run-time changes to that setting made by +** sqlite3_config(). In other words, the return value from sqlite3_threadsafe() +** is unchanged by calls to sqlite3_config().)^ +** +** See the [threading mode] documentation for additional information. +*/ +SQLITE_API int sqlite3_threadsafe(void); + +/* +** CAPI3REF: Database Connection Handle +** KEYWORDS: {database connection} {database connections} +** +** Each open SQLite database is represented by a pointer to an instance of +** the opaque structure named "sqlite3". It is useful to think of an sqlite3 +** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and +** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] +** and [sqlite3_close_v2()] are its destructors. There are many other +** interfaces (such as +** [sqlite3_prepare_v2()], [sqlite3_create_function()], and +** [sqlite3_busy_timeout()] to name but three) that are methods on an +** sqlite3 object. +*/ +typedef struct sqlite3 sqlite3; + +/* +** CAPI3REF: 64-Bit Integer Types +** KEYWORDS: sqlite_int64 sqlite_uint64 +** +** Because there is no cross-platform way to specify 64-bit integer types +** SQLite includes typedefs for 64-bit signed and unsigned integers. +** +** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. +** The sqlite_int64 and sqlite_uint64 types are supported for backwards +** compatibility only. +** +** ^The sqlite3_int64 and sqlite_int64 types can store integer values +** between -9223372036854775808 and +9223372036854775807 inclusive. ^The +** sqlite3_uint64 and sqlite_uint64 types can store integer values +** between 0 and +18446744073709551615 inclusive. +*/ +#ifdef SQLITE_INT64_TYPE + typedef SQLITE_INT64_TYPE sqlite_int64; +# ifdef SQLITE_UINT64_TYPE + typedef SQLITE_UINT64_TYPE sqlite_uint64; +# else + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +# endif +#elif defined(_MSC_VER) || defined(__BORLANDC__) + typedef __int64 sqlite_int64; + typedef unsigned __int64 sqlite_uint64; +#else + typedef long long int sqlite_int64; + typedef unsigned long long int sqlite_uint64; +#endif +typedef sqlite_int64 sqlite3_int64; +typedef sqlite_uint64 sqlite3_uint64; + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite3_int64 +#endif + +/* +** CAPI3REF: Closing A Database Connection +** DESTRUCTOR: sqlite3 +** +** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors +** for the [sqlite3] object. +** ^Calls to sqlite3_close() and sqlite3_close_v2() return [SQLITE_OK] if +** the [sqlite3] object is successfully destroyed and all associated +** resources are deallocated. +** +** Ideally, applications should [sqlite3_finalize | finalize] all +** [prepared statements], [sqlite3_blob_close | close] all [BLOB handles], and +** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated +** with the [sqlite3] object prior to attempting to close the object. +** ^If the database connection is associated with unfinalized prepared +** statements, BLOB handlers, and/or unfinished sqlite3_backup objects then +** sqlite3_close() will leave the database connection open and return +** [SQLITE_BUSY]. ^If sqlite3_close_v2() is called with unfinalized prepared +** statements, unclosed BLOB handlers, and/or unfinished sqlite3_backups, +** it returns [SQLITE_OK] regardless, but instead of deallocating the database +** connection immediately, it marks the database connection as an unusable +** "zombie" and makes arrangements to automatically deallocate the database +** connection after all prepared statements are finalized, all BLOB handles +** are closed, and all backups have finished. The sqlite3_close_v2() interface +** is intended for use with host languages that are garbage collected, and +** where the order in which destructors are called is arbitrary. +** +** ^If an [sqlite3] object is destroyed while a transaction is open, +** the transaction is automatically rolled back. +** +** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(C)] +** must be either a NULL +** pointer or an [sqlite3] object pointer obtained +** from [sqlite3_open()], [sqlite3_open16()], or +** [sqlite3_open_v2()], and not previously closed. +** ^Calling sqlite3_close() or sqlite3_close_v2() with a NULL pointer +** argument is a harmless no-op. +*/ +SQLITE_API int sqlite3_close(sqlite3*); +SQLITE_API int sqlite3_close_v2(sqlite3*); + +/* +** The type for a callback function. +** This is legacy and deprecated. It is included for historical +** compatibility and is not documented. +*/ +typedef int (*sqlite3_callback)(void*,int,char**, char**); + +/* +** CAPI3REF: One-Step Query Execution Interface +** METHOD: sqlite3 +** +** The sqlite3_exec() interface is a convenience wrapper around +** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], +** that allows an application to run multiple statements of SQL +** without having to use a lot of C code. +** +** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, +** semicolon-separate SQL statements passed into its 2nd argument, +** in the context of the [database connection] passed in as its 1st +** argument. ^If the callback function of the 3rd argument to +** sqlite3_exec() is not NULL, then it is invoked for each result row +** coming out of the evaluated SQL statements. ^The 4th argument to +** sqlite3_exec() is relayed through to the 1st argument of each +** callback invocation. ^If the callback pointer to sqlite3_exec() +** is NULL, then no callback is ever invoked and result rows are +** ignored. +** +** ^If an error occurs while evaluating the SQL statements passed into +** sqlite3_exec(), then execution of the current statement stops and +** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec() +** is not NULL then any error message is written into memory obtained +** from [sqlite3_malloc()] and passed back through the 5th parameter. +** To avoid memory leaks, the application should invoke [sqlite3_free()] +** on error message strings returned through the 5th parameter of +** sqlite3_exec() after the error message string is no longer needed. +** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors +** occur, then sqlite3_exec() sets the pointer in its 5th parameter to +** NULL before returning. +** +** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() +** routine returns SQLITE_ABORT without invoking the callback again and +** without running any subsequent SQL statements. +** +** ^The 2nd argument to the sqlite3_exec() callback function is the +** number of columns in the result. ^The 3rd argument to the sqlite3_exec() +** callback is an array of pointers to strings obtained as if from +** [sqlite3_column_text()], one for each column. ^If an element of a +** result row is NULL then the corresponding string pointer for the +** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the +** sqlite3_exec() callback is an array of pointers to strings where each +** entry represents the name of corresponding result column as obtained +** from [sqlite3_column_name()]. +** +** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer +** to an empty string, or a pointer that contains only whitespace and/or +** SQL comments, then no SQL statements are evaluated and the database +** is not changed. +** +** Restrictions: +** +**
    +**
  • The application must ensure that the 1st parameter to sqlite3_exec() +** is a valid and open [database connection]. +**
  • The application must not close the [database connection] specified by +** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. +**
  • The application must not modify the SQL statement text passed into +** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. +**
+*/ +SQLITE_API int sqlite3_exec( + sqlite3*, /* An open database */ + const char *sql, /* SQL to be evaluated */ + int (*callback)(void*,int,char**,char**), /* Callback function */ + void *, /* 1st argument to callback */ + char **errmsg /* Error msg written here */ +); + +/* +** CAPI3REF: Result Codes +** KEYWORDS: {result code definitions} +** +** Many SQLite functions return an integer result code from the set shown +** here in order to indicate success or failure. +** +** New error codes may be added in future versions of SQLite. +** +** See also: [extended result code definitions] +*/ +#define SQLITE_OK 0 /* Successful result */ +/* beginning-of-error-codes */ +#define SQLITE_ERROR 1 /* Generic error */ +#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ +#define SQLITE_PERM 3 /* Access permission denied */ +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ +#define SQLITE_BUSY 5 /* The database file is locked */ +#define SQLITE_LOCKED 6 /* A table in the database is locked */ +#define SQLITE_NOMEM 7 /* A malloc() failed */ +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ +#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ +#define SQLITE_FULL 13 /* Insertion failed because database is full */ +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ +#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ +#define SQLITE_EMPTY 16 /* Internal use only */ +#define SQLITE_SCHEMA 17 /* The database schema changed */ +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ +#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ +#define SQLITE_MISMATCH 20 /* Data type mismatch */ +#define SQLITE_MISUSE 21 /* Library used incorrectly */ +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ +#define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Not used */ +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ +#define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */ +#define SQLITE_WARNING 28 /* Warnings from sqlite3_log() */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ +/* end-of-error-codes */ + +/* +** CAPI3REF: Extended Result Codes +** KEYWORDS: {extended result code definitions} +** +** In its default configuration, SQLite API routines return one of 30 integer +** [result codes]. However, experience has shown that many of +** these result codes are too coarse-grained. They do not provide as +** much information about problems as programmers might like. In an effort to +** address this, newer versions of SQLite (version 3.3.8 [dateof:3.3.8] +** and later) include +** support for additional result codes that provide more detailed information +** about errors. These [extended result codes] are enabled or disabled +** on a per database connection basis using the +** [sqlite3_extended_result_codes()] API. Or, the extended code for +** the most recent error can be obtained using +** [sqlite3_extended_errcode()]. +*/ +#define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8)) +#define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8)) +#define SQLITE_ERROR_SNAPSHOT (SQLITE_ERROR | (3<<8)) +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) +#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) +#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) +#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) +#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) +#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) +#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) +#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) +#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) +#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) +#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8)) +#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8)) +#define SQLITE_IOERR_DELETE_NOENT (SQLITE_IOERR | (23<<8)) +#define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) +#define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) +#define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) +#define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) +#define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) +#define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) +#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) +#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) +#define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8)) +#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) +#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) +#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) +#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) +#define SQLITE_BUSY_TIMEOUT (SQLITE_BUSY | (3<<8)) +#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) +#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) +#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) +#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) +#define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ +#define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) +#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) +#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) +#define SQLITE_CORRUPT_INDEX (SQLITE_CORRUPT | (3<<8)) +#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) +#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) +#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) +#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) +#define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8)) +#define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8)) +#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) +#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) +#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) +#define SQLITE_CONSTRAINT_FOREIGNKEY (SQLITE_CONSTRAINT | (3<<8)) +#define SQLITE_CONSTRAINT_FUNCTION (SQLITE_CONSTRAINT | (4<<8)) +#define SQLITE_CONSTRAINT_NOTNULL (SQLITE_CONSTRAINT | (5<<8)) +#define SQLITE_CONSTRAINT_PRIMARYKEY (SQLITE_CONSTRAINT | (6<<8)) +#define SQLITE_CONSTRAINT_TRIGGER (SQLITE_CONSTRAINT | (7<<8)) +#define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) +#define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) +#define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8)) +#define SQLITE_CONSTRAINT_PINNED (SQLITE_CONSTRAINT |(11<<8)) +#define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) +#define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) +#define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) +#define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8)) +#define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8)) +#define SQLITE_OK_SYMLINK (SQLITE_OK | (2<<8)) + +/* +** CAPI3REF: Flags For File Open Operations +** +** These bit values are intended for use in the +** 3rd parameter to the [sqlite3_open_v2()] interface and +** in the 4th parameter to the [sqlite3_vfs.xOpen] method. +*/ +#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ +#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ +#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ +#define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ +#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ +#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ +#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ +#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ +#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ +#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ +#define SQLITE_OPEN_NOFOLLOW 0x01000000 /* Ok for sqlite3_open_v2() */ + +/* Reserved: 0x00F00000 */ + +/* +** CAPI3REF: Device Characteristics +** +** The xDeviceCharacteristics method of the [sqlite3_io_methods] +** object returns an integer which is a vector of these +** bit values expressing I/O characteristics of the mass storage +** device that holds the file that the [sqlite3_io_methods] +** refers to. +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that +** after reboot following a crash or power loss, the only bytes in a +** file that were written at the application level might have changed +** and that adjacent bytes, even bytes within the same sector are +** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN +** flag indicates that a file cannot be deleted when open. The +** SQLITE_IOCAP_IMMUTABLE flag indicates that the file is on +** read-only media and cannot be changed even by processes with +** elevated privileges. +** +** The SQLITE_IOCAP_BATCH_ATOMIC property means that the underlying +** filesystem supports doing multiple write operations atomically when those +** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and +** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. +*/ +#define SQLITE_IOCAP_ATOMIC 0x00000001 +#define SQLITE_IOCAP_ATOMIC512 0x00000002 +#define SQLITE_IOCAP_ATOMIC1K 0x00000004 +#define SQLITE_IOCAP_ATOMIC2K 0x00000008 +#define SQLITE_IOCAP_ATOMIC4K 0x00000010 +#define SQLITE_IOCAP_ATOMIC8K 0x00000020 +#define SQLITE_IOCAP_ATOMIC16K 0x00000040 +#define SQLITE_IOCAP_ATOMIC32K 0x00000080 +#define SQLITE_IOCAP_ATOMIC64K 0x00000100 +#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 +#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 +#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 +#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 +#define SQLITE_IOCAP_IMMUTABLE 0x00002000 +#define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 + +/* +** CAPI3REF: File Locking Levels +** +** SQLite uses one of these integer values as the second +** argument to calls it makes to the xLock() and xUnlock() methods +** of an [sqlite3_io_methods] object. +*/ +#define SQLITE_LOCK_NONE 0 +#define SQLITE_LOCK_SHARED 1 +#define SQLITE_LOCK_RESERVED 2 +#define SQLITE_LOCK_PENDING 3 +#define SQLITE_LOCK_EXCLUSIVE 4 + +/* +** CAPI3REF: Synchronization Type Flags +** +** When SQLite invokes the xSync() method of an +** [sqlite3_io_methods] object it uses a combination of +** these integer values as the second argument. +** +** When the SQLITE_SYNC_DATAONLY flag is used, it means that the +** sync operation only needs to flush data to mass storage. Inode +** information need not be flushed. If the lower four bits of the flag +** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. +** If the lower four bits equal SQLITE_SYNC_FULL, that means +** to use Mac OS X style fullsync instead of fsync(). +** +** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags +** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL +** settings. The [synchronous pragma] determines when calls to the +** xSync VFS method occur and applies uniformly across all platforms. +** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how +** energetic or rigorous or forceful the sync operations are and +** only make a difference on Mac OSX for the default SQLite code. +** (Third-party VFS implementations might also make the distinction +** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the +** operating systems natively supported by SQLite, only Mac OSX +** cares about the difference.) +*/ +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 + +/* +** CAPI3REF: OS Interface Open File Handle +** +** An [sqlite3_file] object represents an open file in the +** [sqlite3_vfs | OS interface layer]. Individual OS interface +** implementations will +** want to subclass this object by appending additional fields +** for their own use. The pMethods entry is a pointer to an +** [sqlite3_io_methods] object that defines methods for performing +** I/O operations on the open file. +*/ +typedef struct sqlite3_file sqlite3_file; +struct sqlite3_file { + const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ +}; + +/* +** CAPI3REF: OS Interface File Virtual Methods Object +** +** Every file opened by the [sqlite3_vfs.xOpen] method populates an +** [sqlite3_file] object (or, more commonly, a subclass of the +** [sqlite3_file] object) with a pointer to an instance of this object. +** This object defines the methods used to perform various operations +** against the open file represented by the [sqlite3_file] object. +** +** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element +** to a non-NULL pointer, then the sqlite3_io_methods.xClose method +** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The +** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] +** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element +** to NULL. +** +** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or +** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). +** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] +** flag may be ORed in to indicate that only the data of the file +** and not its inode needs to be synced. +** +** The integer values to xLock() and xUnlock() are one of +**
    +**
  • [SQLITE_LOCK_NONE], +**
  • [SQLITE_LOCK_SHARED], +**
  • [SQLITE_LOCK_RESERVED], +**
  • [SQLITE_LOCK_PENDING], or +**
  • [SQLITE_LOCK_EXCLUSIVE]. +**
+** xLock() increases the lock. xUnlock() decreases the lock. +** The xCheckReservedLock() method checks whether any database connection, +** either in this process or in some other process, is holding a RESERVED, +** PENDING, or EXCLUSIVE lock on the file. It returns true +** if such a lock exists and false otherwise. +** +** The xFileControl() method is a generic interface that allows custom +** VFS implementations to directly control an open file using the +** [sqlite3_file_control()] interface. The second "op" argument is an +** integer opcode. The third argument is a generic pointer intended to +** point to a structure that may contain arguments or space in which to +** write return values. Potential uses for xFileControl() might be +** functions to enable blocking locks with timeouts, to change the +** locking strategy (for example to use dot-file locks), to inquire +** about the status of a lock, or to break stale locks. The SQLite +** core reserves all opcodes less than 100 for its own use. +** A [file control opcodes | list of opcodes] less than 100 is available. +** Applications that define a custom xFileControl method should use opcodes +** greater than 100 to avoid conflicts. VFS implementations should +** return [SQLITE_NOTFOUND] for file control opcodes that they do not +** recognize. +** +** The xSectorSize() method returns the sector size of the +** device that underlies the file. The sector size is the +** minimum write that can be performed without disturbing +** other bytes in the file. The xDeviceCharacteristics() +** method returns a bit vector describing behaviors of the +** underlying device: +** +**
    +**
  • [SQLITE_IOCAP_ATOMIC] +**
  • [SQLITE_IOCAP_ATOMIC512] +**
  • [SQLITE_IOCAP_ATOMIC1K] +**
  • [SQLITE_IOCAP_ATOMIC2K] +**
  • [SQLITE_IOCAP_ATOMIC4K] +**
  • [SQLITE_IOCAP_ATOMIC8K] +**
  • [SQLITE_IOCAP_ATOMIC16K] +**
  • [SQLITE_IOCAP_ATOMIC32K] +**
  • [SQLITE_IOCAP_ATOMIC64K] +**
  • [SQLITE_IOCAP_SAFE_APPEND] +**
  • [SQLITE_IOCAP_SEQUENTIAL] +**
  • [SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN] +**
  • [SQLITE_IOCAP_POWERSAFE_OVERWRITE] +**
  • [SQLITE_IOCAP_IMMUTABLE] +**
  • [SQLITE_IOCAP_BATCH_ATOMIC] +**
+** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +** +** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill +** in the unread portions of the buffer with zeros. A VFS that +** fails to zero-fill short reads might seem to work. However, +** failure to zero-fill short reads will eventually lead to +** database corruption. +*/ +typedef struct sqlite3_io_methods sqlite3_io_methods; +struct sqlite3_io_methods { + int iVersion; + int (*xClose)(sqlite3_file*); + int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); + int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); + int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); + int (*xSync)(sqlite3_file*, int flags); + int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); + int (*xLock)(sqlite3_file*, int); + int (*xUnlock)(sqlite3_file*, int); + int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); + int (*xFileControl)(sqlite3_file*, int op, void *pArg); + int (*xSectorSize)(sqlite3_file*); + int (*xDeviceCharacteristics)(sqlite3_file*); + /* Methods above are valid for version 1 */ + int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); + int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); + void (*xShmBarrier)(sqlite3_file*); + int (*xShmUnmap)(sqlite3_file*, int deleteFlag); + /* Methods above are valid for version 2 */ + int (*xFetch)(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); + int (*xUnfetch)(sqlite3_file*, sqlite3_int64 iOfst, void *p); + /* Methods above are valid for version 3 */ + /* Additional methods may be added in future releases */ +}; + +/* +** CAPI3REF: Standard File Control Opcodes +** KEYWORDS: {file control opcodes} {file control opcode} +** +** These integer constants are opcodes for the xFileControl method +** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] +** interface. +** +**
    +**
  • [[SQLITE_FCNTL_LOCKSTATE]] +** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This +** opcode causes the xFileControl method to write the current state of +** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], +** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) +** into an integer that the pArg argument points to. This capability +** is used during testing and is only available when the SQLITE_TEST +** compile-time option is used. +** +**
  • [[SQLITE_FCNTL_SIZE_HINT]] +** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS +** layer a hint of how large the database file will grow to be during the +** current transaction. This hint is not guaranteed to be accurate but it +** is often close. The underlying VFS might choose to preallocate database +** file space based on this hint in order to help writes to the database +** file run faster. +** +**
  • [[SQLITE_FCNTL_SIZE_LIMIT]] +** The [SQLITE_FCNTL_SIZE_LIMIT] opcode is used by in-memory VFS that +** implements [sqlite3_deserialize()] to set an upper bound on the size +** of the in-memory database. The argument is a pointer to a [sqlite3_int64]. +** If the integer pointed to is negative, then it is filled in with the +** current limit. Otherwise the limit is set to the larger of the value +** of the integer pointed to and the current database size. The integer +** pointed to is set to the new limit. +** +**
  • [[SQLITE_FCNTL_CHUNK_SIZE]] +** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS +** extends and truncates the database file in chunks of a size specified +** by the user. The fourth argument to [sqlite3_file_control()] should +** point to an integer (type int) containing the new chunk-size to use +** for the nominated database. Allocating database file space in large +** chunks (say 1MB at a time), may reduce file-system fragmentation and +** improve performance on some systems. +** +**
  • [[SQLITE_FCNTL_FILE_POINTER]] +** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with a particular database +** connection. See also [SQLITE_FCNTL_JOURNAL_POINTER]. +** +**
  • [[SQLITE_FCNTL_JOURNAL_POINTER]] +** The [SQLITE_FCNTL_JOURNAL_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with the journal file (either +** the [rollback journal] or the [write-ahead log]) for a particular database +** connection. See also [SQLITE_FCNTL_FILE_POINTER]. +** +**
  • [[SQLITE_FCNTL_SYNC_OMITTED]] +** No longer in use. +** +**
  • [[SQLITE_FCNTL_SYNC]] +** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and +** sent to the VFS immediately before the xSync method is invoked on a +** database file descriptor. Or, if the xSync method is not invoked +** because the user has configured SQLite with +** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place +** of the xSync method. In most cases, the pointer argument passed with +** this file-control is NULL. However, if the database file is being synced +** as part of a multi-database commit, the argument points to a nul-terminated +** string containing the transactions master-journal file name. VFSes that +** do not need this signal should silently ignore this opcode. Applications +** should not call [sqlite3_file_control()] with this opcode as doing so may +** disrupt the operation of the specialized VFSes that do require it. +** +**
  • [[SQLITE_FCNTL_COMMIT_PHASETWO]] +** The [SQLITE_FCNTL_COMMIT_PHASETWO] opcode is generated internally by SQLite +** and sent to the VFS after a transaction has been committed immediately +** but before the database is unlocked. VFSes that do not need this signal +** should silently ignore this opcode. Applications should not call +** [sqlite3_file_control()] with this opcode as doing so may disrupt the +** operation of the specialized VFSes that do require it. +** +**
  • [[SQLITE_FCNTL_WIN32_AV_RETRY]] +** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic +** retry counts and intervals for certain disk I/O operations for the +** windows [VFS] in order to provide robustness in the presence of +** anti-virus programs. By default, the windows VFS will retry file read, +** file write, and file delete operations up to 10 times, with a delay +** of 25 milliseconds before the first retry and with the delay increasing +** by an additional 25 milliseconds with each subsequent retry. This +** opcode allows these two values (10 retries and 25 milliseconds of delay) +** to be adjusted. The values are changed for all database connections +** within the same process. The argument is a pointer to an array of two +** integers where the first integer is the new retry count and the second +** integer is the delay. If either integer is negative, then the setting +** is not changed but instead the prior value of that setting is written +** into the array entry, allowing the current retry settings to be +** interrogated. The zDbName parameter is ignored. +** +**
  • [[SQLITE_FCNTL_PERSIST_WAL]] +** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the +** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary +** write ahead log ([WAL file]) and shared memory +** files used for transaction control +** are automatically deleted when the latest connection to the database +** closes. Setting persistent WAL mode causes those files to persist after +** close. Persisting the files is useful when other processes that do not +** have write permission on the directory containing the database file want +** to read the database file, as the WAL and shared memory files must exist +** in order for the database to be readable. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable persistent WAL mode or 1 to enable persistent +** WAL mode. If the integer is -1, then it is overwritten with the current +** WAL persistence setting. +** +**
  • [[SQLITE_FCNTL_POWERSAFE_OVERWRITE]] +** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the +** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting +** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the +** xDeviceCharacteristics methods. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage +** mode. If the integer is -1, then it is overwritten with the current +** zero-damage mode setting. +** +**
  • [[SQLITE_FCNTL_OVERWRITE]] +** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening +** a write transaction to indicate that, unless it is rolled back for some +** reason, the entire database file will be overwritten by the current +** transaction. This is used by VACUUM operations. +** +**
  • [[SQLITE_FCNTL_VFSNAME]] +** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of +** all [VFSes] in the VFS stack. The names are of all VFS shims and the +** final bottom-level VFS are written into memory obtained from +** [sqlite3_malloc()] and the result is stored in the char* variable +** that the fourth parameter of [sqlite3_file_control()] points to. +** The caller is responsible for freeing the memory when done. As with +** all file-control actions, there is no guarantee that this will actually +** do anything. Callers should initialize the char* variable to a NULL +** pointer in case this file-control is not implemented. This file-control +** is intended for diagnostic use only. +** +**
  • [[SQLITE_FCNTL_VFS_POINTER]] +** ^The [SQLITE_FCNTL_VFS_POINTER] opcode finds a pointer to the top-level +** [VFSes] currently in use. ^(The argument X in +** sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) must be +** of type "[sqlite3_vfs] **". This opcodes will set *X +** to a pointer to the top-level VFS.)^ +** ^When there are multiple VFS shims in the stack, this opcode finds the +** upper-most shim only. +** +**
  • [[SQLITE_FCNTL_PRAGMA]] +** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] +** file control is sent to the open [sqlite3_file] object corresponding +** to the database file to which the pragma statement refers. ^The argument +** to the [SQLITE_FCNTL_PRAGMA] file control is an array of +** pointers to strings (char**) in which the second element of the array +** is the name of the pragma and the third element is the argument to the +** pragma or NULL if the pragma has no argument. ^The handler for an +** [SQLITE_FCNTL_PRAGMA] file control can optionally make the first element +** of the char** argument point to a string obtained from [sqlite3_mprintf()] +** or the equivalent and that string will become the result of the pragma or +** the error message if the pragma fails. ^If the +** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal +** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] +** file control returns [SQLITE_OK], then the parser assumes that the +** VFS has handled the PRAGMA itself and the parser generates a no-op +** prepared statement if result string is NULL, or that returns a copy +** of the result string if the string is non-NULL. +** ^If the [SQLITE_FCNTL_PRAGMA] file control returns +** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means +** that the VFS encountered an error while handling the [PRAGMA] and the +** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] +** file control occurs at the beginning of pragma statement analysis and so +** it is able to override built-in [PRAGMA] statements. +** +**
  • [[SQLITE_FCNTL_BUSYHANDLER]] +** ^The [SQLITE_FCNTL_BUSYHANDLER] +** file-control may be invoked by SQLite on the database file handle +** shortly after it is opened in order to provide a custom VFS with access +** to the connection's busy-handler callback. The argument is of type (void**) +** - an array of two (void *) values. The first (void *) actually points +** to a function of type (int (*)(void *)). In order to invoke the connection's +** busy-handler, this function should be invoked with the second (void *) in +** the array as the only argument. If it returns non-zero, then the operation +** should be retried. If it returns zero, the custom VFS should abandon the +** current operation. +** +**
  • [[SQLITE_FCNTL_TEMPFILENAME]] +** ^Applications can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control +** to have SQLite generate a +** temporary filename using the same algorithm that is followed to generate +** temporary filenames for TEMP tables and other internal uses. The +** argument should be a char** which will be filled with the filename +** written into memory obtained from [sqlite3_malloc()]. The caller should +** invoke [sqlite3_free()] on the result to avoid a memory leak. +** +**
  • [[SQLITE_FCNTL_MMAP_SIZE]] +** The [SQLITE_FCNTL_MMAP_SIZE] file control is used to query or set the +** maximum number of bytes that will be used for memory-mapped I/O. +** The argument is a pointer to a value of type sqlite3_int64 that +** is an advisory maximum number of bytes in the file to memory map. The +** pointer is overwritten with the old value. The limit is not changed if +** the value originally pointed to is negative, and so the current limit +** can be queried by passing in a pointer to a negative number. This +** file-control is used internally to implement [PRAGMA mmap_size]. +** +**
  • [[SQLITE_FCNTL_TRACE]] +** The [SQLITE_FCNTL_TRACE] file control provides advisory information +** to the VFS about what the higher layers of the SQLite stack are doing. +** This file control is used by some VFS activity tracing [shims]. +** The argument is a zero-terminated string. Higher layers in the +** SQLite stack may generate instances of this file control if +** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled. +** +**
  • [[SQLITE_FCNTL_HAS_MOVED]] +** The [SQLITE_FCNTL_HAS_MOVED] file control interprets its argument as a +** pointer to an integer and it writes a boolean into that integer depending +** on whether or not the file has been renamed, moved, or deleted since it +** was first opened. +** +**
  • [[SQLITE_FCNTL_WIN32_GET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_GET_HANDLE] opcode can be used to obtain the +** underlying native file handle associated with a file handle. This file +** control interprets its argument as a pointer to a native file handle and +** writes the resulting value there. +** +**
  • [[SQLITE_FCNTL_WIN32_SET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_SET_HANDLE] opcode is used for debugging. This +** opcode causes the xFileControl method to swap the file handle with the one +** pointed to by the pArg argument. This capability is used during testing +** and only needs to be supported when SQLITE_TEST is defined. +** +**
  • [[SQLITE_FCNTL_WAL_BLOCK]] +** The [SQLITE_FCNTL_WAL_BLOCK] is a signal to the VFS layer that it might +** be advantageous to block on the next WAL lock if the lock is not immediately +** available. The WAL subsystem issues this signal during rare +** circumstances in order to fix a problem with priority inversion. +** Applications should not use this file-control. +** +**
  • [[SQLITE_FCNTL_ZIPVFS]] +** The [SQLITE_FCNTL_ZIPVFS] opcode is implemented by zipvfs only. All other +** VFS should return SQLITE_NOTFOUND for this opcode. +** +**
  • [[SQLITE_FCNTL_RBU]] +** The [SQLITE_FCNTL_RBU] opcode is implemented by the special VFS used by +** the RBU extension only. All other VFS should return SQLITE_NOTFOUND for +** this opcode. +** +**
  • [[SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]] +** If the [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] opcode returns SQLITE_OK, then +** the file descriptor is placed in "batch write mode", which +** means all subsequent write operations will be deferred and done +** atomically at the next [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. Systems +** that do not support batch atomic writes will return SQLITE_NOTFOUND. +** ^Following a successful SQLITE_FCNTL_BEGIN_ATOMIC_WRITE and prior to +** the closing [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] or +** [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE], SQLite will make +** no VFS interface calls on the same [sqlite3_file] file descriptor +** except for calls to the xWrite method and the xFileControl method +** with [SQLITE_FCNTL_SIZE_HINT]. +** +**
  • [[SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be performed atomically. +** This file control returns [SQLITE_OK] if and only if the writes were +** all performed successfully and have been committed to persistent storage. +** ^Regardless of whether or not it is successful, this file control takes +** the file descriptor out of batch write mode so that all subsequent +** write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_COMMIT_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +** +**
  • [[SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. +** ^This file control takes the file descriptor out of batch write mode +** so that all subsequent write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +** +**
  • [[SQLITE_FCNTL_LOCK_TIMEOUT]] +** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode is used to configure a VFS +** to block for up to M milliseconds before failing when attempting to +** obtain a file lock using the xLock or xShmLock methods of the VFS. +** The parameter is a pointer to a 32-bit signed integer that contains +** the value that M is to be set to. Before returning, the 32-bit signed +** integer is overwritten with the previous value of M. +** +**
  • [[SQLITE_FCNTL_DATA_VERSION]] +** The [SQLITE_FCNTL_DATA_VERSION] opcode is used to detect changes to +** a database file. The argument is a pointer to a 32-bit unsigned integer. +** The "data version" for the pager is written into the pointer. The +** "data version" changes whenever any change occurs to the corresponding +** database file, either through SQL statements on the same database +** connection or through transactions committed by separate database +** connections possibly in other processes. The [sqlite3_total_changes()] +** interface can be used to find if any database on the connection has changed, +** but that interface responds to changes on TEMP as well as MAIN and does +** not provide a mechanism to detect changes to MAIN only. Also, the +** [sqlite3_total_changes()] interface responds to internal changes only and +** omits changes made by other database connections. The +** [PRAGMA data_version] command provides a mechanism to detect changes to +** a single attached database that occur due to other database connections, +** but omits changes implemented by the database connection on which it is +** called. This file control is the only mechanism to detect changes that +** happen either internally or externally and that are associated with +** a particular attached database. +** +**
  • [[SQLITE_FCNTL_CKPT_START]] +** The [SQLITE_FCNTL_CKPT_START] opcode is invoked from within a checkpoint +** in wal mode before the client starts to copy pages from the wal +** file to the database file. +** +**
  • [[SQLITE_FCNTL_CKPT_DONE]] +** The [SQLITE_FCNTL_CKPT_DONE] opcode is invoked from within a checkpoint +** in wal mode after the client has finished copying pages from the wal +** file to the database file, but before the *-shm file is updated to +** record the fact that the pages have been checkpointed. +**
+*/ +#define SQLITE_FCNTL_LOCKSTATE 1 +#define SQLITE_FCNTL_GET_LOCKPROXYFILE 2 +#define SQLITE_FCNTL_SET_LOCKPROXYFILE 3 +#define SQLITE_FCNTL_LAST_ERRNO 4 +#define SQLITE_FCNTL_SIZE_HINT 5 +#define SQLITE_FCNTL_CHUNK_SIZE 6 +#define SQLITE_FCNTL_FILE_POINTER 7 +#define SQLITE_FCNTL_SYNC_OMITTED 8 +#define SQLITE_FCNTL_WIN32_AV_RETRY 9 +#define SQLITE_FCNTL_PERSIST_WAL 10 +#define SQLITE_FCNTL_OVERWRITE 11 +#define SQLITE_FCNTL_VFSNAME 12 +#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 +#define SQLITE_FCNTL_PRAGMA 14 +#define SQLITE_FCNTL_BUSYHANDLER 15 +#define SQLITE_FCNTL_TEMPFILENAME 16 +#define SQLITE_FCNTL_MMAP_SIZE 18 +#define SQLITE_FCNTL_TRACE 19 +#define SQLITE_FCNTL_HAS_MOVED 20 +#define SQLITE_FCNTL_SYNC 21 +#define SQLITE_FCNTL_COMMIT_PHASETWO 22 +#define SQLITE_FCNTL_WIN32_SET_HANDLE 23 +#define SQLITE_FCNTL_WAL_BLOCK 24 +#define SQLITE_FCNTL_ZIPVFS 25 +#define SQLITE_FCNTL_RBU 26 +#define SQLITE_FCNTL_VFS_POINTER 27 +#define SQLITE_FCNTL_JOURNAL_POINTER 28 +#define SQLITE_FCNTL_WIN32_GET_HANDLE 29 +#define SQLITE_FCNTL_PDB 30 +#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 +#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 +#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 +#define SQLITE_FCNTL_LOCK_TIMEOUT 34 +#define SQLITE_FCNTL_DATA_VERSION 35 +#define SQLITE_FCNTL_SIZE_LIMIT 36 +#define SQLITE_FCNTL_CKPT_DONE 37 +#define SQLITE_FCNTL_RESERVE_BYTES 38 +#define SQLITE_FCNTL_CKPT_START 39 + +/* deprecated names */ +#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE +#define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE +#define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO + + +/* +** CAPI3REF: Mutex Handle +** +** The mutex module within SQLite defines [sqlite3_mutex] to be an +** abstract type for a mutex object. The SQLite core never looks +** at the internal representation of an [sqlite3_mutex]. It only +** deals with pointers to the [sqlite3_mutex] object. +** +** Mutexes are created using [sqlite3_mutex_alloc()]. +*/ +typedef struct sqlite3_mutex sqlite3_mutex; + +/* +** CAPI3REF: Loadable Extension Thunk +** +** A pointer to the opaque sqlite3_api_routines structure is passed as +** the third parameter to entry points of [loadable extensions]. This +** structure must be typedefed in order to work around compiler warnings +** on some platforms. +*/ +typedef struct sqlite3_api_routines sqlite3_api_routines; + +/* +** CAPI3REF: OS Interface Object +** +** An instance of the sqlite3_vfs object defines the interface between +** the SQLite core and the underlying operating system. The "vfs" +** in the name of the object stands for "virtual file system". See +** the [VFS | VFS documentation] for further information. +** +** The VFS interface is sometimes extended by adding new methods onto +** the end. Each time such an extension occurs, the iVersion field +** is incremented. The iVersion value started out as 1 in +** SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2 +** with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased +** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields +** may be appended to the sqlite3_vfs object and the iVersion value +** may increase again in future versions of SQLite. +** Note that due to an oversight, the structure +** of the sqlite3_vfs object changed in the transition from +** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0] +** and yet the iVersion field was not increased. +** +** The szOsFile field is the size of the subclassed [sqlite3_file] +** structure used by this VFS. mxPathname is the maximum length of +** a pathname in this VFS. +** +** Registered sqlite3_vfs objects are kept on a linked list formed by +** the pNext pointer. The [sqlite3_vfs_register()] +** and [sqlite3_vfs_unregister()] interfaces manage this list +** in a thread-safe way. The [sqlite3_vfs_find()] interface +** searches the list. Neither the application code nor the VFS +** implementation should use the pNext pointer. +** +** The pNext field is the only field in the sqlite3_vfs +** structure that SQLite will ever modify. SQLite will only access +** or modify this field while holding a particular static mutex. +** The application should never modify anything within the sqlite3_vfs +** object once the object has been registered. +** +** The zName field holds the name of the VFS module. The name must +** be unique across all VFS modules. +** +** [[sqlite3_vfs.xOpen]] +** ^SQLite guarantees that the zFilename parameter to xOpen +** is either a NULL pointer or string obtained +** from xFullPathname() with an optional suffix added. +** ^If a suffix is added to the zFilename parameter, it will +** consist of a single "-" character followed by no more than +** 11 alphanumeric and/or "-" characters. +** ^SQLite further guarantees that +** the string will be valid and unchanged until xClose() is +** called. Because of the previous sentence, +** the [sqlite3_file] can safely store a pointer to the +** filename if it needs to remember the filename for some reason. +** If the zFilename parameter to xOpen is a NULL pointer then xOpen +** must invent its own temporary name for the file. ^Whenever the +** xFilename parameter is NULL it will also be the case that the +** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. +** +** The flags argument to xOpen() includes all bits set in +** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] +** or [sqlite3_open16()] is used, then flags includes at least +** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. +** If xOpen() opens a file read-only then it sets *pOutFlags to +** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. +** +** ^(SQLite will also add one of the following flags to the xOpen() +** call, depending on the object being opened: +** +**
    +**
  • [SQLITE_OPEN_MAIN_DB] +**
  • [SQLITE_OPEN_MAIN_JOURNAL] +**
  • [SQLITE_OPEN_TEMP_DB] +**
  • [SQLITE_OPEN_TEMP_JOURNAL] +**
  • [SQLITE_OPEN_TRANSIENT_DB] +**
  • [SQLITE_OPEN_SUBJOURNAL] +**
  • [SQLITE_OPEN_MASTER_JOURNAL] +**
  • [SQLITE_OPEN_WAL] +**
)^ +** +** The file I/O implementation can use the object type flags to +** change the way it deals with files. For example, an application +** that does not care about crash recovery or rollback might make +** the open of a journal file a no-op. Writes to this journal would +** also be no-ops, and any attempt to read the journal would return +** SQLITE_IOERR. Or the implementation might recognize that a database +** file will be doing page-aligned sector reads and writes in a random +** order and set up its I/O subsystem accordingly. +** +** SQLite might also add one of the following flags to the xOpen method: +** +**
    +**
  • [SQLITE_OPEN_DELETEONCLOSE] +**
  • [SQLITE_OPEN_EXCLUSIVE] +**
+** +** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be +** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] +** will be set for TEMP databases and their journals, transient +** databases, and subjournals. +** +** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction +** with the [SQLITE_OPEN_CREATE] flag, which are both directly +** analogous to the O_EXCL and O_CREAT flags of the POSIX open() +** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the +** SQLITE_OPEN_CREATE, is used to indicate that file should always +** be created, and that it is an error if it already exists. +** It is not used to indicate the file should be opened +** for exclusive access. +** +** ^At least szOsFile bytes of memory are allocated by SQLite +** to hold the [sqlite3_file] structure passed as the third +** argument to xOpen. The xOpen method does not have to +** allocate the structure; it should just fill it in. Note that +** the xOpen method must set the sqlite3_file.pMethods to either +** a valid [sqlite3_io_methods] object or to NULL. xOpen must do +** this even if the open fails. SQLite expects that the sqlite3_file.pMethods +** element will be valid after xOpen returns regardless of the success +** or failure of the xOpen call. +** +** [[sqlite3_vfs.xAccess]] +** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] +** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to +** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] +** to test whether a file is at least readable. The SQLITE_ACCESS_READ +** flag is never actually used and is not implemented in the built-in +** VFSes of SQLite. The file is named by the second argument and can be a +** directory. The xAccess method returns [SQLITE_OK] on success or some +** non-zero error code if there is an I/O error or if the name of +** the file given in the second argument is illegal. If SQLITE_OK +** is returned, then non-zero or zero is written into *pResOut to indicate +** whether or not the file is accessible. +** +** ^SQLite will always allocate at least mxPathname+1 bytes for the +** output buffer xFullPathname. The exact size of the output buffer +** is also passed as a parameter to both methods. If the output buffer +** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is +** handled as a fatal error by SQLite, vfs implementations should endeavor +** to prevent this by setting mxPathname to a sufficiently large value. +** +** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() +** interfaces are not strictly a part of the filesystem, but they are +** included in the VFS structure for completeness. +** The xRandomness() function attempts to return nBytes bytes +** of good-quality randomness into zOut. The return value is +** the actual number of bytes of randomness obtained. +** The xSleep() method causes the calling thread to sleep for at +** least the number of microseconds given. ^The xCurrentTime() +** method returns a Julian Day Number for the current date and time as +** a floating point value. +** ^The xCurrentTimeInt64() method returns, as an integer, the Julian +** Day Number multiplied by 86400000 (the number of milliseconds in +** a 24-hour day). +** ^SQLite will use the xCurrentTimeInt64() method to get the current +** date and time if that method is available (if iVersion is 2 or +** greater and the function pointer is not NULL) and will fall back +** to xCurrentTime() if xCurrentTimeInt64() is unavailable. +** +** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces +** are not used by the SQLite core. These optional interfaces are provided +** by some VFSes to facilitate testing of the VFS code. By overriding +** system calls with functions under its control, a test program can +** simulate faults and error conditions that would otherwise be difficult +** or impossible to induce. The set of system calls that can be overridden +** varies from one VFS to another, and from one version of the same VFS to the +** next. Applications that use these interfaces must be prepared for any +** or all of these interfaces to be NULL or for their behavior to change +** from one release to the next. Applications must not attempt to access +** any of these methods if the iVersion of the VFS is less than 3. +*/ +typedef struct sqlite3_vfs sqlite3_vfs; +typedef void (*sqlite3_syscall_ptr)(void); +struct sqlite3_vfs { + int iVersion; /* Structure version number (currently 3) */ + int szOsFile; /* Size of subclassed sqlite3_file */ + int mxPathname; /* Maximum file pathname length */ + sqlite3_vfs *pNext; /* Next registered VFS */ + const char *zName; /* Name of this virtual file system */ + void *pAppData; /* Pointer to application-specific data */ + int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, + int flags, int *pOutFlags); + int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); + int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); + int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); + void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); + void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); + void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); + void (*xDlClose)(sqlite3_vfs*, void*); + int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); + int (*xSleep)(sqlite3_vfs*, int microseconds); + int (*xCurrentTime)(sqlite3_vfs*, double*); + int (*xGetLastError)(sqlite3_vfs*, int, char *); + /* + ** The methods above are in version 1 of the sqlite_vfs object + ** definition. Those that follow are added in version 2 or later + */ + int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); + /* + ** The methods above are in versions 1 and 2 of the sqlite_vfs object. + ** Those below are for version 3 and greater. + */ + int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr); + sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName); + const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); + /* + ** The methods above are in versions 1 through 3 of the sqlite_vfs object. + ** New fields may be appended in future versions. The iVersion + ** value will increment whenever this happens. + */ +}; + +/* +** CAPI3REF: Flags for the xAccess VFS method +** +** These integer constants can be used as the third parameter to +** the xAccess method of an [sqlite3_vfs] object. They determine +** what kind of permissions the xAccess method is looking for. +** With SQLITE_ACCESS_EXISTS, the xAccess method +** simply checks whether the file exists. +** With SQLITE_ACCESS_READWRITE, the xAccess method +** checks whether the named directory is both readable and writable +** (in other words, if files can be added, removed, and renamed within +** the directory). +** The SQLITE_ACCESS_READWRITE constant is currently used only by the +** [temp_store_directory pragma], though this could change in a future +** release of SQLite. +** With SQLITE_ACCESS_READ, the xAccess method +** checks whether the file is readable. The SQLITE_ACCESS_READ constant is +** currently unused, though it might be used in a future release of +** SQLite. +*/ +#define SQLITE_ACCESS_EXISTS 0 +#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ +#define SQLITE_ACCESS_READ 2 /* Unused */ + +/* +** CAPI3REF: Flags for the xShmLock VFS method +** +** These integer constants define the various locking operations +** allowed by the xShmLock method of [sqlite3_io_methods]. The +** following are the only legal combinations of flags to the +** xShmLock method: +** +**
    +**
  • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED +**
  • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE +**
  • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED +**
  • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE +**
+** +** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as +** was given on the corresponding lock. +** +** The xShmLock method can transition between unlocked and SHARED or +** between unlocked and EXCLUSIVE. It cannot transition between SHARED +** and EXCLUSIVE. +*/ +#define SQLITE_SHM_UNLOCK 1 +#define SQLITE_SHM_LOCK 2 +#define SQLITE_SHM_SHARED 4 +#define SQLITE_SHM_EXCLUSIVE 8 + +/* +** CAPI3REF: Maximum xShmLock index +** +** The xShmLock method on [sqlite3_io_methods] may use values +** between 0 and this upper bound as its "offset" argument. +** The SQLite core will never attempt to acquire or release a +** lock outside of this range +*/ +#define SQLITE_SHM_NLOCK 8 + + +/* +** CAPI3REF: Initialize The SQLite Library +** +** ^The sqlite3_initialize() routine initializes the +** SQLite library. ^The sqlite3_shutdown() routine +** deallocates any resources that were allocated by sqlite3_initialize(). +** These routines are designed to aid in process initialization and +** shutdown on embedded systems. Workstation applications using +** SQLite normally do not need to invoke either of these routines. +** +** A call to sqlite3_initialize() is an "effective" call if it is +** the first time sqlite3_initialize() is invoked during the lifetime of +** the process, or if it is the first time sqlite3_initialize() is invoked +** following a call to sqlite3_shutdown(). ^(Only an effective call +** of sqlite3_initialize() does any initialization. All other calls +** are harmless no-ops.)^ +** +** A call to sqlite3_shutdown() is an "effective" call if it is the first +** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only +** an effective call to sqlite3_shutdown() does any deinitialization. +** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^ +** +** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown() +** is not. The sqlite3_shutdown() interface must only be called from a +** single thread. All open [database connections] must be closed and all +** other SQLite resources must be deallocated prior to invoking +** sqlite3_shutdown(). +** +** Among other things, ^sqlite3_initialize() will invoke +** sqlite3_os_init(). Similarly, ^sqlite3_shutdown() +** will invoke sqlite3_os_end(). +** +** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success. +** ^If for some reason, sqlite3_initialize() is unable to initialize +** the library (perhaps it is unable to allocate a needed resource such +** as a mutex) it returns an [error code] other than [SQLITE_OK]. +** +** ^The sqlite3_initialize() routine is called internally by many other +** SQLite interfaces so that an application usually does not need to +** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] +** calls sqlite3_initialize() so the SQLite library will be automatically +** initialized when [sqlite3_open()] is called if it has not be initialized +** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] +** compile-time option, then the automatic calls to sqlite3_initialize() +** are omitted and the application must call sqlite3_initialize() directly +** prior to using any other SQLite interface. For maximum portability, +** it is recommended that applications always invoke sqlite3_initialize() +** directly prior to using any other SQLite interface. Future releases +** of SQLite may require this. In other words, the behavior exhibited +** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the +** default behavior in some future release of SQLite. +** +** The sqlite3_os_init() routine does operating-system specific +** initialization of the SQLite library. The sqlite3_os_end() +** routine undoes the effect of sqlite3_os_init(). Typical tasks +** performed by these routines include allocation or deallocation +** of static resources, initialization of global variables, +** setting up a default [sqlite3_vfs] module, or setting up +** a default configuration using [sqlite3_config()]. +** +** The application should never invoke either sqlite3_os_init() +** or sqlite3_os_end() directly. The application should only invoke +** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() +** interface is called automatically by sqlite3_initialize() and +** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate +** implementations for sqlite3_os_init() and sqlite3_os_end() +** are built into SQLite when it is compiled for Unix, Windows, or OS/2. +** When [custom builds | built for other platforms] +** (using the [SQLITE_OS_OTHER=1] compile-time +** option) the application must supply a suitable implementation for +** sqlite3_os_init() and sqlite3_os_end(). An application-supplied +** implementation of sqlite3_os_init() or sqlite3_os_end() +** must return [SQLITE_OK] on success and some other [error code] upon +** failure. +*/ +SQLITE_API int sqlite3_initialize(void); +SQLITE_API int sqlite3_shutdown(void); +SQLITE_API int sqlite3_os_init(void); +SQLITE_API int sqlite3_os_end(void); + +/* +** CAPI3REF: Configuring The SQLite Library +** +** The sqlite3_config() interface is used to make global configuration +** changes to SQLite in order to tune SQLite to the specific needs of +** the application. The default configuration is recommended for most +** applications and so this routine is usually not necessary. It is +** provided to support rare applications with unusual needs. +** +** The sqlite3_config() interface is not threadsafe. The application +** must ensure that no other SQLite interfaces are invoked by other +** threads while sqlite3_config() is running. +** +** The sqlite3_config() interface +** may only be invoked prior to library initialization using +** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. +** ^If sqlite3_config() is called after [sqlite3_initialize()] and before +** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. +** Note, however, that ^sqlite3_config() can be called as part of the +** implementation of an application-defined [sqlite3_os_init()]. +** +** The first argument to sqlite3_config() is an integer +** [configuration option] that determines +** what property of SQLite is to be configured. Subsequent arguments +** vary depending on the [configuration option] +** in the first argument. +** +** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. +** ^If the option is unknown or SQLite is unable to set the option +** then this routine returns a non-zero [error code]. +*/ +SQLITE_API int sqlite3_config(int, ...); + +/* +** CAPI3REF: Configure database connections +** METHOD: sqlite3 +** +** The sqlite3_db_config() interface is used to make configuration +** changes to a [database connection]. The interface is similar to +** [sqlite3_config()] except that the changes apply to a single +** [database connection] (specified in the first argument). +** +** The second argument to sqlite3_db_config(D,V,...) is the +** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code +** that indicates what aspect of the [database connection] is being configured. +** Subsequent arguments vary depending on the configuration verb. +** +** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if +** the call is considered successful. +*/ +SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Memory Allocation Routines +** +** An instance of this object defines the interface between SQLite +** and low-level memory allocation routines. +** +** This object is used in only one place in the SQLite interface. +** A pointer to an instance of this object is the argument to +** [sqlite3_config()] when the configuration option is +** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. +** By creating an instance of this object +** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) +** during configuration, an application can specify an alternative +** memory allocation subsystem for SQLite to use for all of its +** dynamic memory needs. +** +** Note that SQLite comes with several [built-in memory allocators] +** that are perfectly adequate for the overwhelming majority of applications +** and that this object is only useful to a tiny minority of applications +** with specialized memory allocation requirements. This object is +** also used during testing of SQLite in order to specify an alternative +** memory allocator that simulates memory out-of-memory conditions in +** order to verify that SQLite recovers gracefully from such +** conditions. +** +** The xMalloc, xRealloc, and xFree methods must work like the +** malloc(), realloc() and free() functions from the standard C library. +** ^SQLite guarantees that the second argument to +** xRealloc is always a value returned by a prior call to xRoundup. +** +** xSize should return the allocated size of a memory allocation +** previously obtained from xMalloc or xRealloc. The allocated size +** is always at least as big as the requested size but may be larger. +** +** The xRoundup method returns what would be the allocated size of +** a memory allocation given a particular requested size. Most memory +** allocators round up memory allocations at least to the next multiple +** of 8. Some allocators round up to a larger multiple or to a power of 2. +** Every memory allocation request coming in through [sqlite3_malloc()] +** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, +** that causes the corresponding memory allocation to fail. +** +** The xInit method initializes the memory allocator. For example, +** it might allocate any required mutexes or initialize internal data +** structures. The xShutdown method is invoked (indirectly) by +** [sqlite3_shutdown()] and should deallocate any resources acquired +** by xInit. The pAppData pointer is used as the only parameter to +** xInit and xShutdown. +** +** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes +** the xInit method, so the xInit method need not be threadsafe. The +** xShutdown method is only called from [sqlite3_shutdown()] so it does +** not need to be threadsafe either. For all other methods, SQLite +** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the +** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which +** it is by default) and so the methods are automatically serialized. +** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other +** methods must be threadsafe or else make their own arrangements for +** serialization. +** +** SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +*/ +typedef struct sqlite3_mem_methods sqlite3_mem_methods; +struct sqlite3_mem_methods { + void *(*xMalloc)(int); /* Memory allocation function */ + void (*xFree)(void*); /* Free a prior allocation */ + void *(*xRealloc)(void*,int); /* Resize an allocation */ + int (*xSize)(void*); /* Return the size of an allocation */ + int (*xRoundup)(int); /* Round up request size to allocation size */ + int (*xInit)(void*); /* Initialize the memory allocator */ + void (*xShutdown)(void*); /* Deinitialize the memory allocator */ + void *pAppData; /* Argument to xInit() and xShutdown() */ +}; + +/* +** CAPI3REF: Configuration Options +** KEYWORDS: {configuration option} +** +** These constants are the available integer configuration options that +** can be passed as the first argument to the [sqlite3_config()] interface. +** +** New configuration options may be added in future releases of SQLite. +** Existing configuration options might be discontinued. Applications +** should check the return code from [sqlite3_config()] to make sure that +** the call worked. The [sqlite3_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
+** [[SQLITE_CONFIG_SINGLETHREAD]]
SQLITE_CONFIG_SINGLETHREAD
+**
There are no arguments to this option. ^This option sets the +** [threading mode] to Single-thread. In other words, it disables +** all mutexing and puts SQLite into a mode where it can only be used +** by a single thread. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to change the [threading mode] from its default +** value of Single-thread and so [sqlite3_config()] will return +** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD +** configuration option.
+** +** [[SQLITE_CONFIG_MULTITHREAD]]
SQLITE_CONFIG_MULTITHREAD
+**
There are no arguments to this option. ^This option sets the +** [threading mode] to Multi-thread. In other words, it disables +** mutexing on [database connection] and [prepared statement] objects. +** The application is responsible for serializing access to +** [database connections] and [prepared statements]. But other mutexes +** are enabled so that SQLite will be safe to use in a multi-threaded +** environment as long as no two threads attempt to use the same +** [database connection] at the same time. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Multi-thread [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_MULTITHREAD configuration option.
+** +** [[SQLITE_CONFIG_SERIALIZED]]
SQLITE_CONFIG_SERIALIZED
+**
There are no arguments to this option. ^This option sets the +** [threading mode] to Serialized. In other words, this option enables +** all mutexes including the recursive +** mutexes on [database connection] and [prepared statement] objects. +** In this mode (which is the default when SQLite is compiled with +** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access +** to [database connections] and [prepared statements] so that the +** application is free to use the same [database connection] or the +** same [prepared statement] in different threads at the same time. +** ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Serialized [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_SERIALIZED configuration option.
+** +** [[SQLITE_CONFIG_MALLOC]]
SQLITE_CONFIG_MALLOC
+**
^(The SQLITE_CONFIG_MALLOC option takes a single argument which is +** a pointer to an instance of the [sqlite3_mem_methods] structure. +** The argument specifies +** alternative low-level memory allocation routines to be used in place of +** the memory allocation routines built into SQLite.)^ ^SQLite makes +** its own private copy of the content of the [sqlite3_mem_methods] structure +** before the [sqlite3_config()] call returns.
+** +** [[SQLITE_CONFIG_GETMALLOC]]
SQLITE_CONFIG_GETMALLOC
+**
^(The SQLITE_CONFIG_GETMALLOC option takes a single argument which +** is a pointer to an instance of the [sqlite3_mem_methods] structure. +** The [sqlite3_mem_methods] +** structure is filled with the currently defined memory allocation routines.)^ +** This option can be used to overload the default memory allocation +** routines with a wrapper that simulations memory allocation failure or +** tracks memory usage, for example.
+** +** [[SQLITE_CONFIG_SMALL_MALLOC]]
SQLITE_CONFIG_SMALL_MALLOC
+**
^The SQLITE_CONFIG_SMALL_MALLOC option takes single argument of +** type int, interpreted as a boolean, which if true provides a hint to +** SQLite that it should avoid large memory allocations if possible. +** SQLite will run faster if it is free to make large memory allocations, +** but some application might prefer to run slower in exchange for +** guarantees about memory fragmentation that are possible if large +** allocations are avoided. This hint is normally off. +**
+** +** [[SQLITE_CONFIG_MEMSTATUS]]
SQLITE_CONFIG_MEMSTATUS
+**
^The SQLITE_CONFIG_MEMSTATUS option takes single argument of type int, +** interpreted as a boolean, which enables or disables the collection of +** memory allocation statistics. ^(When memory allocation statistics are +** disabled, the following SQLite interfaces become non-operational: +**
    +**
  • [sqlite3_hard_heap_limit64()] +**
  • [sqlite3_memory_used()] +**
  • [sqlite3_memory_highwater()] +**
  • [sqlite3_soft_heap_limit64()] +**
  • [sqlite3_status64()] +**
)^ +** ^Memory allocation statistics are enabled by default unless SQLite is +** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory +** allocation statistics are disabled by default. +**
+** +** [[SQLITE_CONFIG_SCRATCH]]
SQLITE_CONFIG_SCRATCH
+**
The SQLITE_CONFIG_SCRATCH option is no longer used. +**
+** +** [[SQLITE_CONFIG_PAGECACHE]]
SQLITE_CONFIG_PAGECACHE
+**
^The SQLITE_CONFIG_PAGECACHE option specifies a memory pool +** that SQLite can use for the database page cache with the default page +** cache implementation. +** This configuration option is a no-op if an application-defined page +** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2]. +** ^There are three arguments to SQLITE_CONFIG_PAGECACHE: A pointer to +** 8-byte aligned memory (pMem), the size of each page cache line (sz), +** and the number of cache lines (N). +** The sz argument should be the size of the largest database page +** (a power of two between 512 and 65536) plus some extra bytes for each +** page header. ^The number of extra bytes needed by the page header +** can be determined using [SQLITE_CONFIG_PCACHE_HDRSZ]. +** ^It is harmless, apart from the wasted memory, +** for the sz parameter to be larger than necessary. The pMem +** argument must be either a NULL pointer or a pointer to an 8-byte +** aligned block of memory of at least sz*N bytes, otherwise +** subsequent behavior is undefined. +** ^When pMem is not NULL, SQLite will strive to use the memory provided +** to satisfy page cache needs, falling back to [sqlite3_malloc()] if +** a page cache line is larger than sz bytes or if all of the pMem buffer +** is exhausted. +** ^If pMem is NULL and N is non-zero, then each database connection +** does an initial bulk allocation for page cache memory +** from [sqlite3_malloc()] sufficient for N cache lines if N is positive or +** of -1024*N bytes if N is negative, . ^If additional +** page cache memory is needed beyond what is provided by the initial +** allocation, then SQLite goes to [sqlite3_malloc()] separately for each +** additional cache line.
+** +** [[SQLITE_CONFIG_HEAP]]
SQLITE_CONFIG_HEAP
+**
^The SQLITE_CONFIG_HEAP option specifies a static memory buffer +** that SQLite will use for all of its dynamic memory allocation needs +** beyond those provided for by [SQLITE_CONFIG_PAGECACHE]. +** ^The SQLITE_CONFIG_HEAP option is only available if SQLite is compiled +** with either [SQLITE_ENABLE_MEMSYS3] or [SQLITE_ENABLE_MEMSYS5] and returns +** [SQLITE_ERROR] if invoked otherwise. +** ^There are three arguments to SQLITE_CONFIG_HEAP: +** An 8-byte aligned pointer to the memory, +** the number of bytes in the memory buffer, and the minimum allocation size. +** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts +** to using its default memory allocator (the system malloc() implementation), +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the +** memory pointer is not NULL then the alternative memory +** allocator is engaged to handle all of SQLites memory allocation needs. +** The first pointer (the memory pointer) must be aligned to an 8-byte +** boundary or subsequent behavior of SQLite will be undefined. +** The minimum allocation size is capped at 2**12. Reasonable values +** for the minimum allocation size are 2**5 through 2**8.
+** +** [[SQLITE_CONFIG_MUTEX]]
SQLITE_CONFIG_MUTEX
+**
^(The SQLITE_CONFIG_MUTEX option takes a single argument which is a +** pointer to an instance of the [sqlite3_mutex_methods] structure. +** The argument specifies alternative low-level mutex routines to be used +** in place the mutex routines built into SQLite.)^ ^SQLite makes a copy of +** the content of the [sqlite3_mutex_methods] structure before the call to +** [sqlite3_config()] returns. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will +** return [SQLITE_ERROR].
+** +** [[SQLITE_CONFIG_GETMUTEX]]
SQLITE_CONFIG_GETMUTEX
+**
^(The SQLITE_CONFIG_GETMUTEX option takes a single argument which +** is a pointer to an instance of the [sqlite3_mutex_methods] structure. The +** [sqlite3_mutex_methods] +** structure is filled with the currently defined mutex routines.)^ +** This option can be used to overload the default mutex allocation +** routines with a wrapper used to track mutex usage for performance +** profiling or testing, for example. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will +** return [SQLITE_ERROR].
+** +** [[SQLITE_CONFIG_LOOKASIDE]]
SQLITE_CONFIG_LOOKASIDE
+**
^(The SQLITE_CONFIG_LOOKASIDE option takes two arguments that determine +** the default size of lookaside memory on each [database connection]. +** The first argument is the +** size of each lookaside buffer slot and the second is the number of +** slots allocated to each database connection.)^ ^(SQLITE_CONFIG_LOOKASIDE +** sets the default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] +** option to [sqlite3_db_config()] can be used to change the lookaside +** configuration on individual connections.)^
+** +** [[SQLITE_CONFIG_PCACHE2]]
SQLITE_CONFIG_PCACHE2
+**
^(The SQLITE_CONFIG_PCACHE2 option takes a single argument which is +** a pointer to an [sqlite3_pcache_methods2] object. This object specifies +** the interface to a custom page cache implementation.)^ +** ^SQLite makes a copy of the [sqlite3_pcache_methods2] object.
+** +** [[SQLITE_CONFIG_GETPCACHE2]]
SQLITE_CONFIG_GETPCACHE2
+**
^(The SQLITE_CONFIG_GETPCACHE2 option takes a single argument which +** is a pointer to an [sqlite3_pcache_methods2] object. SQLite copies of +** the current page cache implementation into that object.)^
+** +** [[SQLITE_CONFIG_LOG]]
SQLITE_CONFIG_LOG
+**
The SQLITE_CONFIG_LOG option is used to configure the SQLite +** global [error log]. +** (^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a +** function with a call signature of void(*)(void*,int,const char*), +** and a pointer to void. ^If the function pointer is not NULL, it is +** invoked by [sqlite3_log()] to process each logging event. ^If the +** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. +** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is +** passed through as the first parameter to the application-defined logger +** function whenever that function is invoked. ^The second parameter to +** the logger function is a copy of the first parameter to the corresponding +** [sqlite3_log()] call and is intended to be a [result code] or an +** [extended result code]. ^The third parameter passed to the logger is +** log message after formatting via [sqlite3_snprintf()]. +** The SQLite logging interface is not reentrant; the logger function +** supplied by the application must not invoke any SQLite interface. +** In a multi-threaded application, the application-defined logger +** function must be threadsafe.
+** +** [[SQLITE_CONFIG_URI]]
SQLITE_CONFIG_URI +**
^(The SQLITE_CONFIG_URI option takes a single argument of type int. +** If non-zero, then URI handling is globally enabled. If the parameter is zero, +** then URI handling is globally disabled.)^ ^If URI handling is globally +** enabled, all filenames passed to [sqlite3_open()], [sqlite3_open_v2()], +** [sqlite3_open16()] or +** specified as part of [ATTACH] commands are interpreted as URIs, regardless +** of whether or not the [SQLITE_OPEN_URI] flag is set when the database +** connection is opened. ^If it is globally disabled, filenames are +** only interpreted as URIs if the SQLITE_OPEN_URI flag is set when the +** database connection is opened. ^(By default, URI handling is globally +** disabled. The default value may be changed by compiling with the +** [SQLITE_USE_URI] symbol defined.)^ +** +** [[SQLITE_CONFIG_COVERING_INDEX_SCAN]]
SQLITE_CONFIG_COVERING_INDEX_SCAN +**
^The SQLITE_CONFIG_COVERING_INDEX_SCAN option takes a single integer +** argument which is interpreted as a boolean in order to enable or disable +** the use of covering indices for full table scans in the query optimizer. +** ^The default setting is determined +** by the [SQLITE_ALLOW_COVERING_INDEX_SCAN] compile-time option, or is "on" +** if that compile-time option is omitted. +** The ability to disable the use of covering indices for full table scans +** is because some incorrectly coded legacy applications might malfunction +** when the optimization is enabled. Providing the ability to +** disable the optimization allows the older, buggy application code to work +** without change even with newer versions of SQLite. +** +** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] +**
SQLITE_CONFIG_PCACHE and SQLITE_CONFIG_GETPCACHE +**
These options are obsolete and should not be used by new code. +** They are retained for backwards compatibility but are now no-ops. +**
+** +** [[SQLITE_CONFIG_SQLLOG]] +**
SQLITE_CONFIG_SQLLOG +**
This option is only available if sqlite is compiled with the +** [SQLITE_ENABLE_SQLLOG] pre-processor macro defined. The first argument should +** be a pointer to a function of type void(*)(void*,sqlite3*,const char*, int). +** The second should be of type (void*). The callback is invoked by the library +** in three separate circumstances, identified by the value passed as the +** fourth parameter. If the fourth parameter is 0, then the database connection +** passed as the second argument has just been opened. The third argument +** points to a buffer containing the name of the main database file. If the +** fourth parameter is 1, then the SQL statement that the third parameter +** points to has just been executed. Or, if the fourth parameter is 2, then +** the connection being passed as the second parameter is being closed. The +** third parameter is passed NULL In this case. An example of using this +** configuration option can be seen in the "test_sqllog.c" source file in +** the canonical SQLite source tree.
+** +** [[SQLITE_CONFIG_MMAP_SIZE]] +**
SQLITE_CONFIG_MMAP_SIZE +**
^SQLITE_CONFIG_MMAP_SIZE takes two 64-bit integer (sqlite3_int64) values +** that are the default mmap size limit (the default setting for +** [PRAGMA mmap_size]) and the maximum allowed mmap size limit. +** ^The default setting can be overridden by each database connection using +** either the [PRAGMA mmap_size] command, or by using the +** [SQLITE_FCNTL_MMAP_SIZE] file control. ^(The maximum allowed mmap size +** will be silently truncated if necessary so that it does not exceed the +** compile-time maximum mmap size set by the +** [SQLITE_MAX_MMAP_SIZE] compile-time option.)^ +** ^If either argument to this option is negative, then that argument is +** changed to its compile-time default. +** +** [[SQLITE_CONFIG_WIN32_HEAPSIZE]] +**
SQLITE_CONFIG_WIN32_HEAPSIZE +**
^The SQLITE_CONFIG_WIN32_HEAPSIZE option is only available if SQLite is +** compiled for Windows with the [SQLITE_WIN32_MALLOC] pre-processor macro +** defined. ^SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit unsigned integer value +** that specifies the maximum size of the created heap. +** +** [[SQLITE_CONFIG_PCACHE_HDRSZ]] +**
SQLITE_CONFIG_PCACHE_HDRSZ +**
^The SQLITE_CONFIG_PCACHE_HDRSZ option takes a single parameter which +** is a pointer to an integer and writes into that integer the number of extra +** bytes per page required for each page in [SQLITE_CONFIG_PAGECACHE]. +** The amount of extra space required can change depending on the compiler, +** target platform, and SQLite version. +** +** [[SQLITE_CONFIG_PMASZ]] +**
SQLITE_CONFIG_PMASZ +**
^The SQLITE_CONFIG_PMASZ option takes a single parameter which +** is an unsigned integer and sets the "Minimum PMA Size" for the multithreaded +** sorter to that integer. The default minimum PMA Size is set by the +** [SQLITE_SORTER_PMASZ] compile-time option. New threads are launched +** to help with sort operations when multithreaded sorting +** is enabled (using the [PRAGMA threads] command) and the amount of content +** to be sorted exceeds the page size times the minimum of the +** [PRAGMA cache_size] setting and this value. +** +** [[SQLITE_CONFIG_STMTJRNL_SPILL]] +**
SQLITE_CONFIG_STMTJRNL_SPILL +**
^The SQLITE_CONFIG_STMTJRNL_SPILL option takes a single parameter which +** becomes the [statement journal] spill-to-disk threshold. +** [Statement journals] are held in memory until their size (in bytes) +** exceeds this threshold, at which point they are written to disk. +** Or if the threshold is -1, statement journals are always held +** exclusively in memory. +** Since many statement journals never become large, setting the spill +** threshold to a value such as 64KiB can greatly reduce the amount of +** I/O required to support statement rollback. +** The default value for this setting is controlled by the +** [SQLITE_STMTJRNL_SPILL] compile-time option. +** +** [[SQLITE_CONFIG_SORTERREF_SIZE]] +**
SQLITE_CONFIG_SORTERREF_SIZE +**
The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter +** of type (int) - the new value of the sorter-reference size threshold. +** Usually, when SQLite uses an external sort to order records according +** to an ORDER BY clause, all fields required by the caller are present in the +** sorted records. However, if SQLite determines based on the declared type +** of a table column that its values are likely to be very large - larger +** than the configured sorter-reference size threshold - then a reference +** is stored in each sorted record and the required column values loaded +** from the database as records are returned in sorted order. The default +** value for this option is to never use this optimization. Specifying a +** negative value for this option restores the default behaviour. +** This option is only available if SQLite is compiled with the +** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. +** +** [[SQLITE_CONFIG_MEMDB_MAXSIZE]] +**
SQLITE_CONFIG_MEMDB_MAXSIZE +**
The SQLITE_CONFIG_MEMDB_MAXSIZE option accepts a single parameter +** [sqlite3_int64] parameter which is the default maximum size for an in-memory +** database created using [sqlite3_deserialize()]. This default maximum +** size can be adjusted up or down for individual databases using the +** [SQLITE_FCNTL_SIZE_LIMIT] [sqlite3_file_control|file-control]. If this +** configuration setting is never used, then the default maximum is determined +** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that +** compile-time option is not set, then the default maximum is 1073741824. +**
+*/ +#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ +#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ +#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ +#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */ +#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ +#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ +#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ +#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ +#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ +#define SQLITE_CONFIG_PCACHE 14 /* no-op */ +#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ +#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ +#define SQLITE_CONFIG_URI 17 /* int */ +#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */ +#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ +#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ +#define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */ +#define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */ +#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */ +#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ +#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ +#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ +#define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */ + +/* +** CAPI3REF: Database Connection Configuration Options +** +** These constants are the available integer configuration options that +** can be passed as the second argument to the [sqlite3_db_config()] interface. +** +** New configuration options may be added in future releases of SQLite. +** Existing configuration options might be discontinued. Applications +** should check the return code from [sqlite3_db_config()] to make sure that +** the call worked. ^The [sqlite3_db_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
+** [[SQLITE_DBCONFIG_LOOKASIDE]] +**
SQLITE_DBCONFIG_LOOKASIDE
+**
^This option takes three additional arguments that determine the +** [lookaside memory allocator] configuration for the [database connection]. +** ^The first argument (the third parameter to [sqlite3_db_config()] is a +** pointer to a memory buffer to use for lookaside memory. +** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb +** may be NULL in which case SQLite will allocate the +** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the +** size of each lookaside buffer slot. ^The third argument is the number of +** slots. The size of the buffer in the first argument must be greater than +** or equal to the product of the second and third arguments. The buffer +** must be aligned to an 8-byte boundary. ^If the second argument to +** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally +** rounded down to the next smaller multiple of 8. ^(The lookaside memory +** configuration for a database connection can only be changed when that +** connection is not currently using lookaside memory, or in other words +** when the "current value" returned by +** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. +** Any attempt to change the lookaside memory configuration when lookaside +** memory is in use leaves the configuration unchanged and returns +** [SQLITE_BUSY].)^
+** +** [[SQLITE_DBCONFIG_ENABLE_FKEY]] +**
SQLITE_DBCONFIG_ENABLE_FKEY
+**
^This option is used to enable or disable the enforcement of +** [foreign key constraints]. There should be two additional arguments. +** The first argument is an integer which is 0 to disable FK enforcement, +** positive to enable FK enforcement or negative to leave FK enforcement +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether FK enforcement is off or on +** following this call. The second parameter may be a NULL pointer, in +** which case the FK enforcement setting is not reported back.
+** +** [[SQLITE_DBCONFIG_ENABLE_TRIGGER]] +**
SQLITE_DBCONFIG_ENABLE_TRIGGER
+**
^This option is used to enable or disable [CREATE TRIGGER | triggers]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable triggers, +** positive to enable triggers or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether triggers are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the trigger setting is not reported back.
+** +** [[SQLITE_DBCONFIG_ENABLE_VIEW]] +**
SQLITE_DBCONFIG_ENABLE_VIEW
+**
^This option is used to enable or disable [CREATE VIEW | views]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable views, +** positive to enable views or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether views are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the view setting is not reported back.
+** +** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] +**
SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
+**
^This option is used to enable or disable the +** [fts3_tokenizer()] function which is part of the +** [FTS3] full-text search engine extension. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable fts3_tokenizer() or +** positive to enable fts3_tokenizer() or negative to leave the setting +** unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the new setting is not reported back.
+** +** [[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION]] +**
SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
+**
^This option is used to enable or disable the [sqlite3_load_extension()] +** interface independently of the [load_extension()] SQL function. +** The [sqlite3_enable_load_extension()] API enables or disables both the +** C-API [sqlite3_load_extension()] and the SQL function [load_extension()]. +** There should be two additional arguments. +** When the first argument to this interface is 1, then only the C-API is +** enabled and the SQL function remains disabled. If the first argument to +** this interface is 0, then both the C-API and the SQL function are disabled. +** If the first argument is -1, then no changes are made to state of either the +** C-API or the SQL function. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface +** is disabled or enabled following this call. The second parameter may +** be a NULL pointer, in which case the new setting is not reported back. +**
+** +** [[SQLITE_DBCONFIG_MAINDBNAME]]
SQLITE_DBCONFIG_MAINDBNAME
+**
^This option is used to change the name of the "main" database +** schema. ^The sole argument is a pointer to a constant UTF8 string +** which will become the new schema name in place of "main". ^SQLite +** does not make a copy of the new main schema name string, so the application +** must ensure that the argument passed into this DBCONFIG option is unchanged +** until after the database connection closes. +**
+** +** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]] +**
SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
+**
Usually, when a database in wal mode is closed or detached from a +** database handle, SQLite checks if this will mean that there are now no +** connections at all to the database. If so, it performs a checkpoint +** operation before closing the connection. This option may be used to +** override this behaviour. The first parameter passed to this operation +** is an integer - positive to disable checkpoints-on-close, or zero (the +** default) to enable them, and negative to leave the setting unchanged. +** The second parameter is a pointer to an integer +** into which is written 0 or 1 to indicate whether checkpoints-on-close +** have been disabled - 0 if they are not disabled, 1 if they are. +**
+** +** [[SQLITE_DBCONFIG_ENABLE_QPSG]]
SQLITE_DBCONFIG_ENABLE_QPSG
+**
^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates +** the [query planner stability guarantee] (QPSG). When the QPSG is active, +** a single SQL query statement will always use the same algorithm regardless +** of values of [bound parameters].)^ The QPSG disables some query optimizations +** that look at the values of bound parameters, which can make some queries +** slower. But the QPSG has the advantage of more predictable behavior. With +** the QPSG active, SQLite will always use the same query plan in the field as +** was used during testing in the lab. +** The first argument to this setting is an integer which is 0 to disable +** the QPSG, positive to enable QPSG, or negative to leave the setting +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether the QPSG is disabled or enabled +** following this call. +**
+** +** [[SQLITE_DBCONFIG_TRIGGER_EQP]]
SQLITE_DBCONFIG_TRIGGER_EQP
+**
By default, the output of EXPLAIN QUERY PLAN commands does not +** include output for any operations performed by trigger programs. This +** option is used to set or clear (the default) a flag that governs this +** behavior. The first parameter passed to this operation is an integer - +** positive to enable output for trigger programs, or zero to disable it, +** or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which is written +** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if +** it is not disabled, 1 if it is. +**
+** +** [[SQLITE_DBCONFIG_RESET_DATABASE]]
SQLITE_DBCONFIG_RESET_DATABASE
+**
Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run +** [VACUUM] in order to reset a database back to an empty database +** with no schema and no content. The following process works even for +** a badly corrupted database file: +**
    +**
  1. If the database connection is newly opened, make sure it has read the +** database schema by preparing then discarding some query against the +** database, or calling sqlite3_table_column_metadata(), ignoring any +** errors. This step is only necessary if the application desires to keep +** the database in WAL mode after the reset if it was in WAL mode before +** the reset. +**
  2. sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0); +**
  3. [sqlite3_exec](db, "[VACUUM]", 0, 0, 0); +**
  4. sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0); +**
+** Because resetting a database is destructive and irreversible, the +** process requires the use of this obscure API and multiple steps to help +** ensure that it does not happen by accident. +** +** [[SQLITE_DBCONFIG_DEFENSIVE]]
SQLITE_DBCONFIG_DEFENSIVE
+**
The SQLITE_DBCONFIG_DEFENSIVE option activates or deactivates the +** "defensive" flag for a database connection. When the defensive +** flag is enabled, language features that allow ordinary SQL to +** deliberately corrupt the database file are disabled. The disabled +** features include but are not limited to the following: +**
    +**
  • The [PRAGMA writable_schema=ON] statement. +**
  • The [PRAGMA journal_mode=OFF] statement. +**
  • Writes to the [sqlite_dbpage] virtual table. +**
  • Direct writes to [shadow tables]. +**
+**
+** +** [[SQLITE_DBCONFIG_WRITABLE_SCHEMA]]
SQLITE_DBCONFIG_WRITABLE_SCHEMA
+**
The SQLITE_DBCONFIG_WRITABLE_SCHEMA option activates or deactivates the +** "writable_schema" flag. This has the same effect and is logically equivalent +** to setting [PRAGMA writable_schema=ON] or [PRAGMA writable_schema=OFF]. +** The first argument to this setting is an integer which is 0 to disable +** the writable_schema, positive to enable writable_schema, or negative to +** leave the setting unchanged. The second parameter is a pointer to an +** integer into which is written 0 or 1 to indicate whether the writable_schema +** is enabled or disabled following this call. +**
+** +** [[SQLITE_DBCONFIG_LEGACY_ALTER_TABLE]] +**
SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
+**
The SQLITE_DBCONFIG_LEGACY_ALTER_TABLE option activates or deactivates +** the legacy behavior of the [ALTER TABLE RENAME] command such it +** behaves as it did prior to [version 3.24.0] (2018-06-04). See the +** "Compatibility Notice" on the [ALTER TABLE RENAME documentation] for +** additional information. This feature can also be turned on and off +** using the [PRAGMA legacy_alter_table] statement. +**
+** +** [[SQLITE_DBCONFIG_DQS_DML]] +**
SQLITE_DBCONFIG_DQS_DML +**
The SQLITE_DBCONFIG_DQS_DML option activates or deactivates +** the legacy [double-quoted string literal] misfeature for DML statements +** only, that is DELETE, INSERT, SELECT, and UPDATE statements. The +** default value of this setting is determined by the [-DSQLITE_DQS] +** compile-time option. +**
+** +** [[SQLITE_DBCONFIG_DQS_DDL]] +**
SQLITE_DBCONFIG_DQS_DDL +**
The SQLITE_DBCONFIG_DQS option activates or deactivates +** the legacy [double-quoted string literal] misfeature for DDL statements, +** such as CREATE TABLE and CREATE INDEX. The +** default value of this setting is determined by the [-DSQLITE_DQS] +** compile-time option. +**
+** +** [[SQLITE_DBCONFIG_TRUSTED_SCHEMA]] +**
SQLITE_DBCONFIG_TRUSTED_SCHEMA +**
The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells SQLite to +** assume that database schemas (the contents of the [sqlite_master] tables) +** are untainted by malicious content. +** When the SQLITE_DBCONFIG_TRUSTED_SCHEMA option is disabled, SQLite +** takes additional defensive steps to protect the application from harm +** including: +**
    +**
  • Prohibit the use of SQL functions inside triggers, views, +** CHECK constraints, DEFAULT clauses, expression indexes, +** partial indexes, or generated columns +** unless those functions are tagged with [SQLITE_INNOCUOUS]. +**
  • Prohibit the use of virtual tables inside of triggers or views +** unless those virtual tables are tagged with [SQLITE_VTAB_INNOCUOUS]. +**
+** This setting defaults to "on" for legacy compatibility, however +** all applications are advised to turn it off if possible. This setting +** can also be controlled using the [PRAGMA trusted_schema] statement. +**
+** +** [[SQLITE_DBCONFIG_LEGACY_FILE_FORMAT]] +**
SQLITE_DBCONFIG_LEGACY_FILE_FORMAT +**
The SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option activates or deactivates +** the legacy file format flag. When activated, this flag causes all newly +** created database file to have a schema format version number (the 4-byte +** integer found at offset 44 into the database header) of 1. This in turn +** means that the resulting database file will be readable and writable by +** any SQLite version back to 3.0.0 ([dateof:3.0.0]). Without this setting, +** newly created databases are generally not understandable by SQLite versions +** prior to 3.3.0 ([dateof:3.3.0]). As these words are written, there +** is now scarcely any need to generated database files that are compatible +** all the way back to version 3.0.0, and so this setting is of little +** practical use, but is provided so that SQLite can continue to claim the +** ability to generate new database files that are compatible with version +** 3.0.0. +**

Note that when the SQLITE_DBCONFIG_LEGACY_FILE_FORMAT setting is on, +** the [VACUUM] command will fail with an obscure error when attempting to +** process a table with generated columns and a descending index. This is +** not considered a bug since SQLite versions 3.3.0 and earlier do not support +** either generated columns or decending indexes. +**

+**
+*/ +#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ +#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ +#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */ +#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */ +#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */ +#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */ +#define SQLITE_DBCONFIG_DEFENSIVE 1010 /* int int* */ +#define SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011 /* int int* */ +#define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 1012 /* int int* */ +#define SQLITE_DBCONFIG_DQS_DML 1013 /* int int* */ +#define SQLITE_DBCONFIG_DQS_DDL 1014 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_VIEW 1015 /* int int* */ +#define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 1016 /* int int* */ +#define SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1017 /* Largest DBCONFIG */ + +/* +** CAPI3REF: Enable Or Disable Extended Result Codes +** METHOD: sqlite3 +** +** ^The sqlite3_extended_result_codes() routine enables or disables the +** [extended result codes] feature of SQLite. ^The extended result +** codes are disabled by default for historical compatibility. +*/ +SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); + +/* +** CAPI3REF: Last Insert Rowid +** METHOD: sqlite3 +** +** ^Each entry in most SQLite tables (except for [WITHOUT ROWID] tables) +** has a unique 64-bit signed +** integer key called the [ROWID | "rowid"]. ^The rowid is always available +** as an undeclared column named ROWID, OID, or _ROWID_ as long as those +** names are not also used by explicitly declared columns. ^If +** the table has a column of type [INTEGER PRIMARY KEY] then that column +** is another alias for the rowid. +** +** ^The sqlite3_last_insert_rowid(D) interface usually returns the [rowid] of +** the most recent successful [INSERT] into a rowid table or [virtual table] +** on database connection D. ^Inserts into [WITHOUT ROWID] tables are not +** recorded. ^If no successful [INSERT]s into rowid tables have ever occurred +** on the database connection D, then sqlite3_last_insert_rowid(D) returns +** zero. +** +** As well as being set automatically as rows are inserted into database +** tables, the value returned by this function may be set explicitly by +** [sqlite3_set_last_insert_rowid()] +** +** Some virtual table implementations may INSERT rows into rowid tables as +** part of committing a transaction (e.g. to flush data accumulated in memory +** to disk). In this case subsequent calls to this function return the rowid +** associated with these internal INSERT operations, which leads to +** unintuitive results. Virtual table implementations that do write to rowid +** tables in this way can avoid this problem by restoring the original +** rowid value using [sqlite3_set_last_insert_rowid()] before returning +** control to the user. +** +** ^(If an [INSERT] occurs within a trigger then this routine will +** return the [rowid] of the inserted row as long as the trigger is +** running. Once the trigger program ends, the value returned +** by this routine reverts to what it was before the trigger was fired.)^ +** +** ^An [INSERT] that fails due to a constraint violation is not a +** successful [INSERT] and does not change the value returned by this +** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, +** and INSERT OR ABORT make no changes to the return value of this +** routine when their insertion fails. ^(When INSERT OR REPLACE +** encounters a constraint violation, it does not fail. The +** INSERT continues to completion after deleting rows that caused +** the constraint problem so INSERT OR REPLACE will always change +** the return value of this interface.)^ +** +** ^For the purposes of this routine, an [INSERT] is considered to +** be successful even if it is subsequently rolled back. +** +** This function is accessible to SQL statements via the +** [last_insert_rowid() SQL function]. +** +** If a separate thread performs a new [INSERT] on the same +** database connection while the [sqlite3_last_insert_rowid()] +** function is running and thus changes the last insert [rowid], +** then the value returned by [sqlite3_last_insert_rowid()] is +** unpredictable and might not equal either the old or the new +** last insert [rowid]. +*/ +SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); + +/* +** CAPI3REF: Set the Last Insert Rowid value. +** METHOD: sqlite3 +** +** The sqlite3_set_last_insert_rowid(D, R) method allows the application to +** set the value returned by calling sqlite3_last_insert_rowid(D) to R +** without inserting a row into the database. +*/ +SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64); + +/* +** CAPI3REF: Count The Number Of Rows Modified +** METHOD: sqlite3 +** +** ^This function returns the number of rows modified, inserted or +** deleted by the most recently completed INSERT, UPDATE or DELETE +** statement on the database connection specified by the only parameter. +** ^Executing any other type of SQL statement does not modify the value +** returned by this function. +** +** ^Only changes made directly by the INSERT, UPDATE or DELETE statement are +** considered - auxiliary changes caused by [CREATE TRIGGER | triggers], +** [foreign key actions] or [REPLACE] constraint resolution are not counted. +** +** Changes to a view that are intercepted by +** [INSTEAD OF trigger | INSTEAD OF triggers] are not counted. ^The value +** returned by sqlite3_changes() immediately after an INSERT, UPDATE or +** DELETE statement run on a view is always zero. Only changes made to real +** tables are counted. +** +** Things are more complicated if the sqlite3_changes() function is +** executed while a trigger program is running. This may happen if the +** program uses the [changes() SQL function], or if some other callback +** function invokes sqlite3_changes() directly. Essentially: +** +**
    +**
  • ^(Before entering a trigger program the value returned by +** sqlite3_changes() function is saved. After the trigger program +** has finished, the original value is restored.)^ +** +**
  • ^(Within a trigger program each INSERT, UPDATE and DELETE +** statement sets the value returned by sqlite3_changes() +** upon completion as normal. Of course, this value will not include +** any changes performed by sub-triggers, as the sqlite3_changes() +** value will be saved and restored after each sub-trigger has run.)^ +**
+** +** ^This means that if the changes() SQL function (or similar) is used +** by the first INSERT, UPDATE or DELETE statement within a trigger, it +** returns the value as set when the calling statement began executing. +** ^If it is used by the second or subsequent such statement within a trigger +** program, the value returned reflects the number of rows modified by the +** previous INSERT, UPDATE or DELETE statement within the same trigger. +** +** If a separate thread makes changes on the same database connection +** while [sqlite3_changes()] is running then the value returned +** is unpredictable and not meaningful. +** +** See also: +**
    +**
  • the [sqlite3_total_changes()] interface +**
  • the [count_changes pragma] +**
  • the [changes() SQL function] +**
  • the [data_version pragma] +**
+*/ +SQLITE_API int sqlite3_changes(sqlite3*); + +/* +** CAPI3REF: Total Number Of Rows Modified +** METHOD: sqlite3 +** +** ^This function returns the total number of rows inserted, modified or +** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed +** since the database connection was opened, including those executed as +** part of trigger programs. ^Executing any other type of SQL statement +** does not affect the value returned by sqlite3_total_changes(). +** +** ^Changes made as part of [foreign key actions] are included in the +** count, but those made as part of REPLACE constraint resolution are +** not. ^Changes to a view that are intercepted by INSTEAD OF triggers +** are not counted. +** +** The [sqlite3_total_changes(D)] interface only reports the number +** of rows that changed due to SQL statement run against database +** connection D. Any changes by other database connections are ignored. +** To detect changes against a database file from other database +** connections use the [PRAGMA data_version] command or the +** [SQLITE_FCNTL_DATA_VERSION] [file control]. +** +** If a separate thread makes changes on the same database connection +** while [sqlite3_total_changes()] is running then the value +** returned is unpredictable and not meaningful. +** +** See also: +**
    +**
  • the [sqlite3_changes()] interface +**
  • the [count_changes pragma] +**
  • the [changes() SQL function] +**
  • the [data_version pragma] +**
  • the [SQLITE_FCNTL_DATA_VERSION] [file control] +**
+*/ +SQLITE_API int sqlite3_total_changes(sqlite3*); + +/* +** CAPI3REF: Interrupt A Long-Running Query +** METHOD: sqlite3 +** +** ^This function causes any pending database operation to abort and +** return at its earliest opportunity. This routine is typically +** called in response to a user action such as pressing "Cancel" +** or Ctrl-C where the user wants a long query operation to halt +** immediately. +** +** ^It is safe to call this routine from a thread different from the +** thread that is currently running the database operation. But it +** is not safe to call this routine with a [database connection] that +** is closed or might close before sqlite3_interrupt() returns. +** +** ^If an SQL operation is very nearly finished at the time when +** sqlite3_interrupt() is called, then it might not have an opportunity +** to be interrupted and might continue to completion. +** +** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. +** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE +** that is inside an explicit transaction, then the entire transaction +** will be rolled back automatically. +** +** ^The sqlite3_interrupt(D) call is in effect until all currently running +** SQL statements on [database connection] D complete. ^Any new SQL statements +** that are started after the sqlite3_interrupt() call and before the +** running statement count reaches zero are interrupted as if they had been +** running prior to the sqlite3_interrupt() call. ^New SQL statements +** that are started after the running statement count reaches zero are +** not effected by the sqlite3_interrupt(). +** ^A call to sqlite3_interrupt(D) that occurs when there are no running +** SQL statements is a no-op and has no effect on SQL statements +** that are started after the sqlite3_interrupt() call returns. +*/ +SQLITE_API void sqlite3_interrupt(sqlite3*); + +/* +** CAPI3REF: Determine If An SQL Statement Is Complete +** +** These routines are useful during command-line input to determine if the +** currently entered text seems to form a complete SQL statement or +** if additional input is needed before sending the text into +** SQLite for parsing. ^These routines return 1 if the input string +** appears to be a complete SQL statement. ^A statement is judged to be +** complete if it ends with a semicolon token and is not a prefix of a +** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within +** string literals or quoted identifier names or comments are not +** independent tokens (they are part of the token in which they are +** embedded) and thus do not count as a statement terminator. ^Whitespace +** and comments that follow the final semicolon are ignored. +** +** ^These routines return 0 if the statement is incomplete. ^If a +** memory allocation fails, then SQLITE_NOMEM is returned. +** +** ^These routines do not parse the SQL statements thus +** will not detect syntactically incorrect SQL. +** +** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior +** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked +** automatically by sqlite3_complete16(). If that initialization fails, +** then the return value from sqlite3_complete16() will be non-zero +** regardless of whether or not the input SQL is complete.)^ +** +** The input to [sqlite3_complete()] must be a zero-terminated +** UTF-8 string. +** +** The input to [sqlite3_complete16()] must be a zero-terminated +** UTF-16 string in native byte order. +*/ +SQLITE_API int sqlite3_complete(const char *sql); +SQLITE_API int sqlite3_complete16(const void *sql); + +/* +** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors +** KEYWORDS: {busy-handler callback} {busy handler} +** METHOD: sqlite3 +** +** ^The sqlite3_busy_handler(D,X,P) routine sets a callback function X +** that might be invoked with argument P whenever +** an attempt is made to access a database table associated with +** [database connection] D when another thread +** or process has the table locked. +** The sqlite3_busy_handler() interface is used to implement +** [sqlite3_busy_timeout()] and [PRAGMA busy_timeout]. +** +** ^If the busy callback is NULL, then [SQLITE_BUSY] +** is returned immediately upon encountering the lock. ^If the busy callback +** is not NULL, then the callback might be invoked with two arguments. +** +** ^The first argument to the busy handler is a copy of the void* pointer which +** is the third argument to sqlite3_busy_handler(). ^The second argument to +** the busy handler callback is the number of times that the busy handler has +** been invoked previously for the same locking event. ^If the +** busy callback returns 0, then no additional attempts are made to +** access the database and [SQLITE_BUSY] is returned +** to the application. +** ^If the callback returns non-zero, then another attempt +** is made to access the database and the cycle repeats. +** +** The presence of a busy handler does not guarantee that it will be invoked +** when there is lock contention. ^If SQLite determines that invoking the busy +** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] +** to the application instead of invoking the +** busy handler. +** Consider a scenario where one process is holding a read lock that +** it is trying to promote to a reserved lock and +** a second process is holding a reserved lock that it is trying +** to promote to an exclusive lock. The first process cannot proceed +** because it is blocked by the second and the second process cannot +** proceed because it is blocked by the first. If both processes +** invoke the busy handlers, neither will make any progress. Therefore, +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this +** will induce the first process to release its read lock and allow +** the second process to proceed. +** +** ^The default busy callback is NULL. +** +** ^(There can only be a single busy handler defined for each +** [database connection]. Setting a new busy handler clears any +** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()] +** or evaluating [PRAGMA busy_timeout=N] will change the +** busy handler and thus clear any previously set busy handler. +** +** The busy callback should not take any actions which modify the +** database connection that invoked the busy handler. In other words, +** the busy handler is not reentrant. Any such actions +** result in undefined behavior. +** +** A busy handler must not close the database connection +** or [prepared statement] that invoked the busy handler. +*/ +SQLITE_API int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*); + +/* +** CAPI3REF: Set A Busy Timeout +** METHOD: sqlite3 +** +** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps +** for a specified amount of time when a table is locked. ^The handler +** will sleep multiple times until at least "ms" milliseconds of sleeping +** have accumulated. ^After at least "ms" milliseconds of sleeping, +** the handler returns 0 which causes [sqlite3_step()] to return +** [SQLITE_BUSY]. +** +** ^Calling this routine with an argument less than or equal to zero +** turns off all busy handlers. +** +** ^(There can only be a single busy handler for a particular +** [database connection] at any given moment. If another busy handler +** was defined (using [sqlite3_busy_handler()]) prior to calling +** this routine, that other busy handler is cleared.)^ +** +** See also: [PRAGMA busy_timeout] +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); + +/* +** CAPI3REF: Convenience Routines For Running Queries +** METHOD: sqlite3 +** +** This is a legacy interface that is preserved for backwards compatibility. +** Use of this interface is not recommended. +** +** Definition: A result table is memory data structure created by the +** [sqlite3_get_table()] interface. A result table records the +** complete query results from one or more queries. +** +** The table conceptually has a number of rows and columns. But +** these numbers are not part of the result table itself. These +** numbers are obtained separately. Let N be the number of rows +** and M be the number of columns. +** +** A result table is an array of pointers to zero-terminated UTF-8 strings. +** There are (N+1)*M elements in the array. The first M pointers point +** to zero-terminated strings that contain the names of the columns. +** The remaining entries all point to query results. NULL values result +** in NULL pointers. All other values are in their UTF-8 zero-terminated +** string representation as returned by [sqlite3_column_text()]. +** +** A result table might consist of one or more memory allocations. +** It is not safe to pass a result table directly to [sqlite3_free()]. +** A result table should be deallocated using [sqlite3_free_table()]. +** +** ^(As an example of the result table format, suppose a query result +** is as follows: +** +**
+**        Name        | Age
+**        -----------------------
+**        Alice       | 43
+**        Bob         | 28
+**        Cindy       | 21
+** 
+** +** There are two columns (M==2) and three rows (N==3). Thus the +** result table has 8 entries. Suppose the result table is stored +** in an array named azResult. Then azResult holds this content: +** +**
+**        azResult[0] = "Name";
+**        azResult[1] = "Age";
+**        azResult[2] = "Alice";
+**        azResult[3] = "43";
+**        azResult[4] = "Bob";
+**        azResult[5] = "28";
+**        azResult[6] = "Cindy";
+**        azResult[7] = "21";
+** 
)^ +** +** ^The sqlite3_get_table() function evaluates one or more +** semicolon-separated SQL statements in the zero-terminated UTF-8 +** string of its 2nd parameter and returns a result table to the +** pointer given in its 3rd parameter. +** +** After the application has finished with the result from sqlite3_get_table(), +** it must pass the result table pointer to sqlite3_free_table() in order to +** release the memory that was malloced. Because of the way the +** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling +** function must not try to call [sqlite3_free()] directly. Only +** [sqlite3_free_table()] is able to release the memory properly and safely. +** +** The sqlite3_get_table() interface is implemented as a wrapper around +** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access +** to any internal data structures of SQLite. It uses only the public +** interface defined here. As a consequence, errors that occur in the +** wrapper layer outside of the internal [sqlite3_exec()] call are not +** reflected in subsequent calls to [sqlite3_errcode()] or +** [sqlite3_errmsg()]. +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* An open database */ + const char *zSql, /* SQL to be evaluated */ + char ***pazResult, /* Results of the query */ + int *pnRow, /* Number of result rows written here */ + int *pnColumn, /* Number of result columns written here */ + char **pzErrmsg /* Error msg written here */ +); +SQLITE_API void sqlite3_free_table(char **result); + +/* +** CAPI3REF: Formatted String Printing Functions +** +** These routines are work-alikes of the "printf()" family of functions +** from the standard C library. +** These routines understand most of the common formatting options from +** the standard library printf() +** plus some additional non-standard formats ([%q], [%Q], [%w], and [%z]). +** See the [built-in printf()] documentation for details. +** +** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their +** results into memory obtained from [sqlite3_malloc64()]. +** The strings returned by these two routines should be +** released by [sqlite3_free()]. ^Both routines return a +** NULL pointer if [sqlite3_malloc64()] is unable to allocate enough +** memory to hold the resulting string. +** +** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from +** the standard C library. The result is written into the +** buffer supplied as the second parameter whose size is given by +** the first parameter. Note that the order of the +** first two parameters is reversed from snprintf().)^ This is an +** historical accident that cannot be fixed without breaking +** backwards compatibility. ^(Note also that sqlite3_snprintf() +** returns a pointer to its buffer instead of the number of +** characters actually written into the buffer.)^ We admit that +** the number of characters written would be a more useful return +** value but we cannot change the implementation of sqlite3_snprintf() +** now without breaking compatibility. +** +** ^As long as the buffer size is greater than zero, sqlite3_snprintf() +** guarantees that the buffer is always zero-terminated. ^The first +** parameter "n" is the total size of the buffer, including space for +** the zero terminator. So the longest string that can be completely +** written will be n-1 characters. +** +** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). +** +** See also: [built-in printf()], [printf() SQL function] +*/ +SQLITE_API char *sqlite3_mprintf(const char*,...); +SQLITE_API char *sqlite3_vmprintf(const char*, va_list); +SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...); +SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); + +/* +** CAPI3REF: Memory Allocation Subsystem +** +** The SQLite core uses these three routines for all of its own +** internal memory allocation needs. "Core" in the previous sentence +** does not include operating-system specific [VFS] implementation. The +** Windows VFS uses native malloc() and free() for some operations. +** +** ^The sqlite3_malloc() routine returns a pointer to a block +** of memory at least N bytes in length, where N is the parameter. +** ^If sqlite3_malloc() is unable to obtain sufficient free +** memory, it returns a NULL pointer. ^If the parameter N to +** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns +** a NULL pointer. +** +** ^The sqlite3_malloc64(N) routine works just like +** sqlite3_malloc(N) except that N is an unsigned 64-bit integer instead +** of a signed 32-bit integer. +** +** ^Calling sqlite3_free() with a pointer previously returned +** by sqlite3_malloc() or sqlite3_realloc() releases that memory so +** that it might be reused. ^The sqlite3_free() routine is +** a no-op if is called with a NULL pointer. Passing a NULL pointer +** to sqlite3_free() is harmless. After being freed, memory +** should neither be read nor written. Even reading previously freed +** memory might result in a segmentation fault or other severe error. +** Memory corruption, a segmentation fault, or other severe error +** might result if sqlite3_free() is called with a non-NULL pointer that +** was not obtained from sqlite3_malloc() or sqlite3_realloc(). +** +** ^The sqlite3_realloc(X,N) interface attempts to resize a +** prior memory allocation X to be at least N bytes. +** ^If the X parameter to sqlite3_realloc(X,N) +** is a NULL pointer then its behavior is identical to calling +** sqlite3_malloc(N). +** ^If the N parameter to sqlite3_realloc(X,N) is zero or +** negative then the behavior is exactly the same as calling +** sqlite3_free(X). +** ^sqlite3_realloc(X,N) returns a pointer to a memory allocation +** of at least N bytes in size or NULL if insufficient memory is available. +** ^If M is the size of the prior allocation, then min(N,M) bytes +** of the prior allocation are copied into the beginning of buffer returned +** by sqlite3_realloc(X,N) and the prior allocation is freed. +** ^If sqlite3_realloc(X,N) returns NULL and N is positive, then the +** prior allocation is not freed. +** +** ^The sqlite3_realloc64(X,N) interfaces works the same as +** sqlite3_realloc(X,N) except that N is a 64-bit unsigned integer instead +** of a 32-bit signed integer. +** +** ^If X is a memory allocation previously obtained from sqlite3_malloc(), +** sqlite3_malloc64(), sqlite3_realloc(), or sqlite3_realloc64(), then +** sqlite3_msize(X) returns the size of that memory allocation in bytes. +** ^The value returned by sqlite3_msize(X) might be larger than the number +** of bytes requested when X was allocated. ^If X is a NULL pointer then +** sqlite3_msize(X) returns zero. If X points to something that is not +** the beginning of memory allocation, or if it points to a formerly +** valid memory allocation that has now been freed, then the behavior +** of sqlite3_msize(X) is undefined and possibly harmful. +** +** ^The memory returned by sqlite3_malloc(), sqlite3_realloc(), +** sqlite3_malloc64(), and sqlite3_realloc64() +** is always aligned to at least an 8 byte boundary, or to a +** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time +** option is used. +** +** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()] +** must be either NULL or else pointers obtained from a prior +** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have +** not yet been released. +** +** The application must not read or write any part of +** a block of memory after it has been released using +** [sqlite3_free()] or [sqlite3_realloc()]. +*/ +SQLITE_API void *sqlite3_malloc(int); +SQLITE_API void *sqlite3_malloc64(sqlite3_uint64); +SQLITE_API void *sqlite3_realloc(void*, int); +SQLITE_API void *sqlite3_realloc64(void*, sqlite3_uint64); +SQLITE_API void sqlite3_free(void*); +SQLITE_API sqlite3_uint64 sqlite3_msize(void*); + +/* +** CAPI3REF: Memory Allocator Statistics +** +** SQLite provides these two interfaces for reporting on the status +** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()] +** routines, which form the built-in memory allocation subsystem. +** +** ^The [sqlite3_memory_used()] routine returns the number of bytes +** of memory currently outstanding (malloced but not freed). +** ^The [sqlite3_memory_highwater()] routine returns the maximum +** value of [sqlite3_memory_used()] since the high-water mark +** was last reset. ^The values returned by [sqlite3_memory_used()] and +** [sqlite3_memory_highwater()] include any overhead +** added by SQLite in its implementation of [sqlite3_malloc()], +** but not overhead added by the any underlying system library +** routines that [sqlite3_malloc()] may call. +** +** ^The memory high-water mark is reset to the current value of +** [sqlite3_memory_used()] if and only if the parameter to +** [sqlite3_memory_highwater()] is true. ^The value returned +** by [sqlite3_memory_highwater(1)] is the high-water mark +** prior to the reset. +*/ +SQLITE_API sqlite3_int64 sqlite3_memory_used(void); +SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag); + +/* +** CAPI3REF: Pseudo-Random Number Generator +** +** SQLite contains a high-quality pseudo-random number generator (PRNG) used to +** select random [ROWID | ROWIDs] when inserting new records into a table that +** already uses the largest possible [ROWID]. The PRNG is also used for +** the built-in random() and randomblob() SQL functions. This interface allows +** applications to access the same PRNG for other purposes. +** +** ^A call to this routine stores N bytes of randomness into buffer P. +** ^The P parameter can be a NULL pointer. +** +** ^If this routine has not been previously called or if the previous +** call had N less than one or a NULL pointer for P, then the PRNG is +** seeded using randomness obtained from the xRandomness method of +** the default [sqlite3_vfs] object. +** ^If the previous call to this routine had an N of 1 or more and a +** non-NULL P then the pseudo-randomness is generated +** internally and without recourse to the [sqlite3_vfs] xRandomness +** method. +*/ +SQLITE_API void sqlite3_randomness(int N, void *P); + +/* +** CAPI3REF: Compile-Time Authorization Callbacks +** METHOD: sqlite3 +** KEYWORDS: {authorizer callback} +** +** ^This routine registers an authorizer callback with a particular +** [database connection], supplied in the first argument. +** ^The authorizer callback is invoked as SQL statements are being compiled +** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], +** [sqlite3_prepare_v3()], [sqlite3_prepare16()], [sqlite3_prepare16_v2()], +** and [sqlite3_prepare16_v3()]. ^At various +** points during the compilation process, as logic is being created +** to perform various actions, the authorizer callback is invoked to +** see if those actions are allowed. ^The authorizer callback should +** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the +** specific action but allow the SQL statement to continue to be +** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be +** rejected with an error. ^If the authorizer callback returns +** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] +** then the [sqlite3_prepare_v2()] or equivalent call that triggered +** the authorizer will fail with an error message. +** +** When the callback returns [SQLITE_OK], that means the operation +** requested is ok. ^When the callback returns [SQLITE_DENY], the +** [sqlite3_prepare_v2()] or equivalent call that triggered the +** authorizer will fail with an error message explaining that +** access is denied. +** +** ^The first parameter to the authorizer callback is a copy of the third +** parameter to the sqlite3_set_authorizer() interface. ^The second parameter +** to the callback is an integer [SQLITE_COPY | action code] that specifies +** the particular action to be authorized. ^The third through sixth parameters +** to the callback are either NULL pointers or zero-terminated strings +** that contain additional details about the action to be authorized. +** Applications must always be prepared to encounter a NULL pointer in any +** of the third through the sixth parameters of the authorization callback. +** +** ^If the action code is [SQLITE_READ] +** and the callback returns [SQLITE_IGNORE] then the +** [prepared statement] statement is constructed to substitute +** a NULL value in place of the table column that would have +** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] +** return can be used to deny an untrusted user access to individual +** columns of a table. +** ^When a table is referenced by a [SELECT] but no column values are +** extracted from that table (for example in a query like +** "SELECT count(*) FROM tab") then the [SQLITE_READ] authorizer callback +** is invoked once for that table with a column name that is an empty string. +** ^If the action code is [SQLITE_DELETE] and the callback returns +** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the +** [truncate optimization] is disabled and all rows are deleted individually. +** +** An authorizer is used when [sqlite3_prepare | preparing] +** SQL statements from an untrusted source, to ensure that the SQL statements +** do not try to access data they are not allowed to see, or that they do not +** try to execute malicious statements that damage the database. For +** example, an application may allow a user to enter arbitrary +** SQL queries for evaluation by a database. But the application does +** not want the user to be able to make arbitrary changes to the +** database. An authorizer could then be put in place while the +** user-entered SQL is being [sqlite3_prepare | prepared] that +** disallows everything except [SELECT] statements. +** +** Applications that need to process SQL from untrusted sources +** might also consider lowering resource limits using [sqlite3_limit()] +** and limiting database size using the [max_page_count] [PRAGMA] +** in addition to using an authorizer. +** +** ^(Only a single authorizer can be in place on a database connection +** at a time. Each call to sqlite3_set_authorizer overrides the +** previous call.)^ ^Disable the authorizer by installing a NULL callback. +** The authorizer is disabled by default. +** +** The authorizer callback must not do anything that will modify +** the database connection that invoked the authorizer callback. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the +** statement might be re-prepared during [sqlite3_step()] due to a +** schema change. Hence, the application should ensure that the +** correct authorizer callback remains in place during the [sqlite3_step()]. +** +** ^Note that the authorizer callback is invoked only during +** [sqlite3_prepare()] or its variants. Authorization is not +** performed during statement evaluation in [sqlite3_step()], unless +** as stated in the previous paragraph, sqlite3_step() invokes +** sqlite3_prepare_v2() to reprepare a statement after a schema change. +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3*, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pUserData +); + +/* +** CAPI3REF: Authorizer Return Codes +** +** The [sqlite3_set_authorizer | authorizer callback function] must +** return either [SQLITE_OK] or one of these two constants in order +** to signal SQLite whether or not the action is permitted. See the +** [sqlite3_set_authorizer | authorizer documentation] for additional +** information. +** +** Note that SQLITE_IGNORE is also used as a [conflict resolution mode] +** returned from the [sqlite3_vtab_on_conflict()] interface. +*/ +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ + +/* +** CAPI3REF: Authorizer Action Codes +** +** The [sqlite3_set_authorizer()] interface registers a callback function +** that is invoked to authorize certain SQL statement actions. The +** second parameter to the callback is an integer code that specifies +** what action is being authorized. These are the integer action codes that +** the authorizer callback may be passed. +** +** These action code values signify what kind of operation is to be +** authorized. The 3rd and 4th parameters to the authorization +** callback function will be parameters or NULL depending on which of these +** codes is used as the second parameter. ^(The 5th parameter to the +** authorizer callback is the name of the database ("main", "temp", +** etc.) if applicable.)^ ^The 6th parameter to the authorizer callback +** is the name of the inner-most trigger or view that is responsible for +** the access attempt or NULL if this access attempt is directly from +** top-level SQL code. +*/ +/******************************************* 3rd ************ 4th ***********/ +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ +#define SQLITE_DELETE 9 /* Table Name NULL */ +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ +#define SQLITE_INSERT 18 /* Table Name NULL */ +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ +#define SQLITE_READ 20 /* Table Name Column Name */ +#define SQLITE_SELECT 21 /* NULL NULL */ +#define SQLITE_TRANSACTION 22 /* Operation NULL */ +#define SQLITE_UPDATE 23 /* Table Name Column Name */ +#define SQLITE_ATTACH 24 /* Filename NULL */ +#define SQLITE_DETACH 25 /* Database Name NULL */ +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ +#define SQLITE_REINDEX 27 /* Index Name NULL */ +#define SQLITE_ANALYZE 28 /* Table Name NULL */ +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ +#define SQLITE_FUNCTION 31 /* NULL Function Name */ +#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ +#define SQLITE_COPY 0 /* No longer used */ +#define SQLITE_RECURSIVE 33 /* NULL NULL */ + +/* +** CAPI3REF: Tracing And Profiling Functions +** METHOD: sqlite3 +** +** These routines are deprecated. Use the [sqlite3_trace_v2()] interface +** instead of the routines described here. +** +** These routines register callback functions that can be used for +** tracing and profiling the execution of SQL statements. +** +** ^The callback function registered by sqlite3_trace() is invoked at +** various times when an SQL statement is being run by [sqlite3_step()]. +** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the +** SQL statement text as the statement first begins executing. +** ^(Additional sqlite3_trace() callbacks might occur +** as each triggered subprogram is entered. The callbacks for triggers +** contain a UTF-8 SQL comment that identifies the trigger.)^ +** +** The [SQLITE_TRACE_SIZE_LIMIT] compile-time option can be used to limit +** the length of [bound parameter] expansion in the output of sqlite3_trace(). +** +** ^The callback function registered by sqlite3_profile() is invoked +** as each SQL statement finishes. ^The profile callback contains +** the original statement text and an estimate of wall-clock time +** of how long that statement took to run. ^The profile callback +** time is in units of nanoseconds, however the current implementation +** is only capable of millisecond resolution so the six least significant +** digits in the time are meaningless. Future versions of SQLite +** might provide greater resolution on the profiler callback. Invoking +** either [sqlite3_trace()] or [sqlite3_trace_v2()] will cancel the +** profile callback. +*/ +SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, + void(*xTrace)(void*,const char*), void*); +SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, + void(*xProfile)(void*,const char*,sqlite3_uint64), void*); + +/* +** CAPI3REF: SQL Trace Event Codes +** KEYWORDS: SQLITE_TRACE +** +** These constants identify classes of events that can be monitored +** using the [sqlite3_trace_v2()] tracing logic. The M argument +** to [sqlite3_trace_v2(D,M,X,P)] is an OR-ed combination of one or more of +** the following constants. ^The first argument to the trace callback +** is one of the following constants. +** +** New tracing constants may be added in future releases. +** +** ^A trace callback has four arguments: xCallback(T,C,P,X). +** ^The T argument is one of the integer type codes above. +** ^The C argument is a copy of the context pointer passed in as the +** fourth argument to [sqlite3_trace_v2()]. +** The P and X arguments are pointers whose meanings depend on T. +** +**
+** [[SQLITE_TRACE_STMT]]
SQLITE_TRACE_STMT
+**
^An SQLITE_TRACE_STMT callback is invoked when a prepared statement +** first begins running and possibly at other times during the +** execution of the prepared statement, such as at the start of each +** trigger subprogram. ^The P argument is a pointer to the +** [prepared statement]. ^The X argument is a pointer to a string which +** is the unexpanded SQL text of the prepared statement or an SQL comment +** that indicates the invocation of a trigger. ^The callback can compute +** the same text that would have been returned by the legacy [sqlite3_trace()] +** interface by using the X argument when X begins with "--" and invoking +** [sqlite3_expanded_sql(P)] otherwise. +** +** [[SQLITE_TRACE_PROFILE]]
SQLITE_TRACE_PROFILE
+**
^An SQLITE_TRACE_PROFILE callback provides approximately the same +** information as is provided by the [sqlite3_profile()] callback. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument points to a 64-bit integer which is the estimated of +** the number of nanosecond that the prepared statement took to run. +** ^The SQLITE_TRACE_PROFILE callback is invoked when the statement finishes. +** +** [[SQLITE_TRACE_ROW]]
SQLITE_TRACE_ROW
+**
^An SQLITE_TRACE_ROW callback is invoked whenever a prepared +** statement generates a single row of result. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument is unused. +** +** [[SQLITE_TRACE_CLOSE]]
SQLITE_TRACE_CLOSE
+**
^An SQLITE_TRACE_CLOSE callback is invoked when a database +** connection closes. +** ^The P argument is a pointer to the [database connection] object +** and the X argument is unused. +**
+*/ +#define SQLITE_TRACE_STMT 0x01 +#define SQLITE_TRACE_PROFILE 0x02 +#define SQLITE_TRACE_ROW 0x04 +#define SQLITE_TRACE_CLOSE 0x08 + +/* +** CAPI3REF: SQL Trace Hook +** METHOD: sqlite3 +** +** ^The sqlite3_trace_v2(D,M,X,P) interface registers a trace callback +** function X against [database connection] D, using property mask M +** and context pointer P. ^If the X callback is +** NULL or if the M mask is zero, then tracing is disabled. The +** M argument should be the bitwise OR-ed combination of +** zero or more [SQLITE_TRACE] constants. +** +** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides +** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). +** +** ^The X callback is invoked whenever any of the events identified by +** mask M occur. ^The integer return value from the callback is currently +** ignored, though this may change in future releases. Callback +** implementations should return zero to ensure future compatibility. +** +** ^A trace callback is invoked with four arguments: callback(T,C,P,X). +** ^The T argument is one of the [SQLITE_TRACE] +** constants to indicate why the callback was invoked. +** ^The C argument is a copy of the context pointer. +** The P and X arguments are pointers whose meanings depend on T. +** +** The sqlite3_trace_v2() interface is intended to replace the legacy +** interfaces [sqlite3_trace()] and [sqlite3_profile()], both of which +** are deprecated. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3*, + unsigned uMask, + int(*xCallback)(unsigned,void*,void*,void*), + void *pCtx +); + +/* +** CAPI3REF: Query Progress Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback +** function X to be invoked periodically during long running calls to +** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for +** database connection D. An example use for this +** interface is to keep a GUI updated during a large query. +** +** ^The parameter P is passed through as the only parameter to the +** callback function X. ^The parameter N is the approximate number of +** [virtual machine instructions] that are evaluated between successive +** invocations of the callback X. ^If N is less than one then the progress +** handler is disabled. +** +** ^Only a single progress handler may be defined at one time per +** [database connection]; setting a new progress handler cancels the +** old one. ^Setting parameter X to NULL disables the progress handler. +** ^The progress handler is also disabled by setting N to a value less +** than 1. +** +** ^If the progress callback returns non-zero, the operation is +** interrupted. This feature can be used to implement a +** "Cancel" button on a GUI progress dialog box. +** +** The progress handler callback must not do anything that will modify +** the database connection that invoked the progress handler. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +*/ +SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); + +/* +** CAPI3REF: Opening A New Database Connection +** CONSTRUCTOR: sqlite3 +** +** ^These routines open an SQLite database file as specified by the +** filename argument. ^The filename argument is interpreted as UTF-8 for +** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte +** order for sqlite3_open16(). ^(A [database connection] handle is usually +** returned in *ppDb, even if an error occurs. The only exception is that +** if SQLite is unable to allocate memory to hold the [sqlite3] object, +** a NULL will be written into *ppDb instead of a pointer to the [sqlite3] +** object.)^ ^(If the database is opened (and/or created) successfully, then +** [SQLITE_OK] is returned. Otherwise an [error code] is returned.)^ ^The +** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain +** an English language description of the error following a failure of any +** of the sqlite3_open() routines. +** +** ^The default encoding will be UTF-8 for databases created using +** sqlite3_open() or sqlite3_open_v2(). ^The default encoding for databases +** created using sqlite3_open16() will be UTF-16 in the native byte order. +** +** Whether or not an error occurs when it is opened, resources +** associated with the [database connection] handle should be released by +** passing it to [sqlite3_close()] when it is no longer required. +** +** The sqlite3_open_v2() interface works like sqlite3_open() +** except that it accepts two additional parameters for additional control +** over the new database connection. ^(The flags parameter to +** sqlite3_open_v2() must include, at a minimum, one of the following +** three flag combinations:)^ +** +**
+** ^(
[SQLITE_OPEN_READONLY]
+**
The database is opened in read-only mode. If the database does not +** already exist, an error is returned.
)^ +** +** ^(
[SQLITE_OPEN_READWRITE]
+**
The database is opened for reading and writing if possible, or reading +** only if the file is write protected by the operating system. In either +** case the database must already exist, otherwise an error is returned.
)^ +** +** ^(
[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
+**
The database is opened for reading and writing, and is created if +** it does not already exist. This is the behavior that is always used for +** sqlite3_open() and sqlite3_open16().
)^ +**
+** +** In addition to the required flags, the following optional flags are +** also supported: +** +**
+** ^(
[SQLITE_OPEN_URI]
+**
The filename can be interpreted as a URI if this flag is set.
)^ +** +** ^(
[SQLITE_OPEN_MEMORY]
+**
The database will be opened as an in-memory database. The database +** is named by the "filename" argument for the purposes of cache-sharing, +** if shared cache mode is enabled, but the "filename" is otherwise ignored. +**
)^ +** +** ^(
[SQLITE_OPEN_NOMUTEX]
+**
The new database connection will use the "multi-thread" +** [threading mode].)^ This means that separate threads are allowed +** to use SQLite at the same time, as long as each thread is using +** a different [database connection]. +** +** ^(
[SQLITE_OPEN_FULLMUTEX]
+**
The new database connection will use the "serialized" +** [threading mode].)^ This means the multiple threads can safely +** attempt to use the same database connection at the same time. +** (Mutexes will block any actual concurrency, but in this mode +** there is no harm in trying.) +** +** ^(
[SQLITE_OPEN_SHAREDCACHE]
+**
The database is opened [shared cache] enabled, overriding +** the default shared cache setting provided by +** [sqlite3_enable_shared_cache()].)^ +** +** ^(
[SQLITE_OPEN_PRIVATECACHE]
+**
The database is opened [shared cache] disabled, overriding +** the default shared cache setting provided by +** [sqlite3_enable_shared_cache()].)^ +** +** [[OPEN_NOFOLLOW]] ^(
[SQLITE_OPEN_NOFOLLOW]
+**
The database filename is not allowed to be a symbolic link
+**
)^ +** +** If the 3rd parameter to sqlite3_open_v2() is not one of the +** required combinations shown above optionally combined with other +** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] +** then the behavior is undefined. +** +** ^The fourth parameter to sqlite3_open_v2() is the name of the +** [sqlite3_vfs] object that defines the operating system interface that +** the new database connection should use. ^If the fourth parameter is +** a NULL pointer then the default [sqlite3_vfs] object is used. +** +** ^If the filename is ":memory:", then a private, temporary in-memory database +** is created for the connection. ^This in-memory database will vanish when +** the database connection is closed. Future versions of SQLite might +** make use of additional special filenames that begin with the ":" character. +** It is recommended that when a database filename actually does begin with +** a ":" character you should prefix the filename with a pathname such as +** "./" to avoid ambiguity. +** +** ^If the filename is an empty string, then a private, temporary +** on-disk database will be created. ^This private database will be +** automatically deleted as soon as the database connection is closed. +** +** [[URI filenames in sqlite3_open()]]

URI Filenames

+** +** ^If [URI filename] interpretation is enabled, and the filename argument +** begins with "file:", then the filename is interpreted as a URI. ^URI +** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is +** set in the third argument to sqlite3_open_v2(), or if it has +** been enabled globally using the [SQLITE_CONFIG_URI] option with the +** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. +** URI filename interpretation is turned off +** by default, but future releases of SQLite might enable URI filename +** interpretation by default. See "[URI filenames]" for additional +** information. +** +** URI filenames are parsed according to RFC 3986. ^If the URI contains an +** authority, then it must be either an empty string or the string +** "localhost". ^If the authority is not an empty string or "localhost", an +** error is returned to the caller. ^The fragment component of a URI, if +** present, is ignored. +** +** ^SQLite uses the path component of the URI as the name of the disk file +** which contains the database. ^If the path begins with a '/' character, +** then it is interpreted as an absolute path. ^If the path does not begin +** with a '/' (meaning that the authority section is omitted from the URI) +** then the path is interpreted as a relative path. +** ^(On windows, the first component of an absolute path +** is a drive specification (e.g. "C:").)^ +** +** [[core URI query parameters]] +** The query component of a URI may contain parameters that are interpreted +** either by SQLite itself, or by a [VFS | custom VFS implementation]. +** SQLite and its built-in [VFSes] interpret the +** following query parameters: +** +**
    +**
  • vfs: ^The "vfs" parameter may be used to specify the name of +** a VFS object that provides the operating system interface that should +** be used to access the database file on disk. ^If this option is set to +** an empty string the default VFS object is used. ^Specifying an unknown +** VFS is an error. ^If sqlite3_open_v2() is used and the vfs option is +** present, then the VFS specified by the option takes precedence over +** the value passed as the fourth parameter to sqlite3_open_v2(). +** +**
  • mode: ^(The mode parameter may be set to either "ro", "rw", +** "rwc", or "memory". Attempting to set it to any other value is +** an error)^. +** ^If "ro" is specified, then the database is opened for read-only +** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the +** third argument to sqlite3_open_v2(). ^If the mode option is set to +** "rw", then the database is opened for read-write (but not create) +** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had +** been set. ^Value "rwc" is equivalent to setting both +** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If the mode option is +** set to "memory" then a pure [in-memory database] that never reads +** or writes from disk is used. ^It is an error to specify a value for +** the mode parameter that is less restrictive than that specified by +** the flags passed in the third parameter to sqlite3_open_v2(). +** +**
  • cache: ^The cache parameter may be set to either "shared" or +** "private". ^Setting it to "shared" is equivalent to setting the +** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to +** sqlite3_open_v2(). ^Setting the cache parameter to "private" is +** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit. +** ^If sqlite3_open_v2() is used and the "cache" parameter is present in +** a URI filename, its value overrides any behavior requested by setting +** SQLITE_OPEN_PRIVATECACHE or SQLITE_OPEN_SHAREDCACHE flag. +** +**
  • psow: ^The psow parameter indicates whether or not the +** [powersafe overwrite] property does or does not apply to the +** storage media on which the database file resides. +** +**
  • nolock: ^The nolock parameter is a boolean query parameter +** which if set disables file locking in rollback journal modes. This +** is useful for accessing a database on a filesystem that does not +** support locking. Caution: Database corruption might result if two +** or more processes write to the same database and any one of those +** processes uses nolock=1. +** +**
  • immutable: ^The immutable parameter is a boolean query +** parameter that indicates that the database file is stored on +** read-only media. ^When immutable is set, SQLite assumes that the +** database file cannot be changed, even by a process with higher +** privilege, and so the database is opened read-only and all locking +** and change detection is disabled. Caution: Setting the immutable +** property on a database file that does in fact change can result +** in incorrect query results and/or [SQLITE_CORRUPT] errors. +** See also: [SQLITE_IOCAP_IMMUTABLE]. +** +**
+** +** ^Specifying an unknown parameter in the query component of a URI is not an +** error. Future versions of SQLite might understand additional query +** parameters. See "[query parameters with special meaning to SQLite]" for +** additional information. +** +** [[URI filename examples]]

URI filename examples

+** +**
+**
URI filenames Results +**
file:data.db +** Open the file "data.db" in the current directory. +**
file:/home/fred/data.db
+** file:///home/fred/data.db
+** file://localhost/home/fred/data.db
+** Open the database file "/home/fred/data.db". +**
file://darkstar/home/fred/data.db +** An error. "darkstar" is not a recognized authority. +**
+** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db +** Windows only: Open the file "data.db" on fred's desktop on drive +** C:. Note that the %20 escaping in this example is not strictly +** necessary - space characters can be used literally +** in URI filenames. +**
file:data.db?mode=ro&cache=private +** Open file "data.db" in the current directory for read-only access. +** Regardless of whether or not shared-cache mode is enabled by +** default, use a private cache. +**
file:/home/fred/data.db?vfs=unix-dotfile +** Open file "/home/fred/data.db". Use the special VFS "unix-dotfile" +** that uses dot-files in place of posix advisory locking. +**
file:data.db?mode=readonly +** An error. "readonly" is not a valid option for the "mode" parameter. +**
+** +** ^URI hexadecimal escape sequences (%HH) are supported within the path and +** query components of a URI. A hexadecimal escape sequence consists of a +** percent sign - "%" - followed by exactly two hexadecimal digits +** specifying an octet value. ^Before the path or query components of a +** URI filename are interpreted, they are encoded using UTF-8 and all +** hexadecimal escape sequences replaced by a single byte containing the +** corresponding octet. If this process generates an invalid UTF-8 encoding, +** the results are undefined. +** +** Note to Windows users: The encoding used for the filename argument +** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever +** codepage is currently defined. Filenames containing international +** characters must be converted to UTF-8 prior to passing them into +** sqlite3_open() or sqlite3_open_v2(). +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling sqlite3_open() or sqlite3_open_v2(). Otherwise, various +** features that require the use of temporary files may fail. +** +** See also: [sqlite3_temp_directory] +*/ +SQLITE_API int sqlite3_open( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open16( + const void *filename, /* Database filename (UTF-16) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +); + +/* +** CAPI3REF: Obtain Values For URI Parameters +** +** These are utility routines, useful to [VFS|custom VFS implementations], +** that check if a database file was a URI that contained a specific query +** parameter, and if so obtains the value of that query parameter. +** +** The first parameter to these interfaces (hereafter referred to +** as F) must be one of: +**
    +**
  • A database filename pointer created by the SQLite core and +** passed into the xOpen() method of a VFS implemention, or +**
  • A filename obtained from [sqlite3_db_filename()], or +**
  • A new filename constructed using [sqlite3_create_filename()]. +**
+** If the F parameter is not one of the above, then the behavior is +** undefined and probably undesirable. Older versions of SQLite were +** more tolerant of invalid F parameters than newer versions. +** +** If F is a suitable filename (as described in the previous paragraph) +** and if P is the name of the query parameter, then +** sqlite3_uri_parameter(F,P) returns the value of the P +** parameter if it exists or a NULL pointer if P does not appear as a +** query parameter on F. If P is a query parameter of F and it +** has no explicit value, then sqlite3_uri_parameter(F,P) returns +** a pointer to an empty string. +** +** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean +** parameter and returns true (1) or false (0) according to the value +** of P. The sqlite3_uri_boolean(F,P,B) routine returns true (1) if the +** value of query parameter P is one of "yes", "true", or "on" in any +** case or if the value begins with a non-zero number. The +** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of +** query parameter P is one of "no", "false", or "off" in any case or +** if the value begins with a numeric zero. If P is not a query +** parameter on F or if the value of P does not match any of the +** above, then sqlite3_uri_boolean(F,P,B) returns (B!=0). +** +** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a +** 64-bit signed integer and returns that integer, or D if P does not +** exist. If the value of P is something other than an integer, then +** zero is returned. +** +** The sqlite3_uri_key(F,N) returns a pointer to the name (not +** the value) of the N-th query parameter for filename F, or a NULL +** pointer if N is less than zero or greater than the number of query +** parameters minus 1. The N value is zero-based so N should be 0 to obtain +** the name of the first query parameter, 1 for the second parameter, and +** so forth. +** +** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and +** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and +** is not a database file pathname pointer that the SQLite core passed +** into the xOpen VFS method, then the behavior of this routine is undefined +** and probably undesirable. +** +** Beginning with SQLite [version 3.31.0] ([dateof:3.31.0]) the input F +** parameter can also be the name of a rollback journal file or WAL file +** in addition to the main database file. Prior to version 3.31.0, these +** routines would only work if F was the name of the main database file. +** When the F parameter is the name of the rollback journal or WAL file, +** it has access to all the same query parameters as were found on the +** main database file. +** +** See the [URI filename] documentation for additional information. +*/ +SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); +SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); +SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); +SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N); + +/* +** CAPI3REF: Translate filenames +** +** These routines are available to [VFS|custom VFS implementations] for +** translating filenames between the main database file, the journal file, +** and the WAL file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** passed by the SQLite core into the VFS, then sqlite3_filename_database(F) +** returns the name of the corresponding database file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** passed by the SQLite core into the VFS, or if F is a database filename +** obtained from [sqlite3_db_filename()], then sqlite3_filename_journal(F) +** returns the name of the corresponding rollback journal file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** that was passed by the SQLite core into the VFS, or if F is a database +** filename obtained from [sqlite3_db_filename()], then +** sqlite3_filename_wal(F) returns the name of the corresponding +** WAL file. +** +** In all of the above, if F is not the name of a database, journal or WAL +** filename passed into the VFS from the SQLite core and F is not the +** return value from [sqlite3_db_filename()], then the result is +** undefined and is likely a memory access violation. +*/ +SQLITE_API const char *sqlite3_filename_database(const char*); +SQLITE_API const char *sqlite3_filename_journal(const char*); +SQLITE_API const char *sqlite3_filename_wal(const char*); + +/* +** CAPI3REF: Database File Corresponding To A Journal +** +** ^If X is the name of a rollback or WAL-mode journal file that is +** passed into the xOpen method of [sqlite3_vfs], then +** sqlite3_database_file_object(X) returns a pointer to the [sqlite3_file] +** object that represents the main database file. +** +** This routine is intended for use in custom [VFS] implementations +** only. It is not a general-purpose interface. +** The argument sqlite3_file_object(X) must be a filename pointer that +** has been passed into [sqlite3_vfs].xOpen method where the +** flags parameter to xOpen contains one of the bits +** [SQLITE_OPEN_MAIN_JOURNAL] or [SQLITE_OPEN_WAL]. Any other use +** of this routine results in undefined and probably undesirable +** behavior. +*/ +SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*); + +/* +** CAPI3REF: Create and Destroy VFS Filenames +** +** These interfces are provided for use by [VFS shim] implementations and +** are not useful outside of that context. +** +** The sqlite3_create_filename(D,J,W,N,P) allocates memory to hold a version of +** database filename D with corresponding journal file J and WAL file W and +** with N URI parameters key/values pairs in the array P. The result from +** sqlite3_create_filename(D,J,W,N,P) is a pointer to a database filename that +** is safe to pass to routines like: +**
    +**
  • [sqlite3_uri_parameter()], +**
  • [sqlite3_uri_boolean()], +**
  • [sqlite3_uri_int64()], +**
  • [sqlite3_uri_key()], +**
  • [sqlite3_filename_database()], +**
  • [sqlite3_filename_journal()], or +**
  • [sqlite3_filename_wal()]. +**
+** If a memory allocation error occurs, sqlite3_create_filename() might +** return a NULL pointer. The memory obtained from sqlite3_create_filename(X) +** must be released by a corresponding call to sqlite3_free_filename(Y). +** +** The P parameter in sqlite3_create_filename(D,J,W,N,P) should be an array +** of 2*N pointers to strings. Each pair of pointers in this array corresponds +** to a key and value for a query parameter. The P parameter may be a NULL +** pointer if N is zero. None of the 2*N pointers in the P array may be +** NULL pointers and key pointers should not be empty strings. +** None of the D, J, or W parameters to sqlite3_create_filename(D,J,W,N,P) may +** be NULL pointers, though they can be empty strings. +** +** The sqlite3_free_filename(Y) routine releases a memory allocation +** previously obtained from sqlite3_create_filename(). Invoking +** sqlite3_free_filename(Y) where Y is a NULL pointer is a harmless no-op. +** +** If the Y parameter to sqlite3_free_filename(Y) is anything other +** than a NULL pointer or a pointer previously acquired from +** sqlite3_create_filename(), then bad things such as heap +** corruption or segfaults may occur. The value Y should be +** used again after sqlite3_free_filename(Y) has been called. This means +** that if the [sqlite3_vfs.xOpen()] method of a VFS has been called using Y, +** then the corresponding [sqlite3_module.xClose() method should also be +** invoked prior to calling sqlite3_free_filename(Y). +*/ +SQLITE_API char *sqlite3_create_filename( + const char *zDatabase, + const char *zJournal, + const char *zWal, + int nParam, + const char **azParam +); +SQLITE_API void sqlite3_free_filename(char*); + +/* +** CAPI3REF: Error Codes And Messages +** METHOD: sqlite3 +** +** ^If the most recent sqlite3_* API call associated with +** [database connection] D failed, then the sqlite3_errcode(D) interface +** returns the numeric [result code] or [extended result code] for that +** API call. +** ^The sqlite3_extended_errcode() +** interface is the same except that it always returns the +** [extended result code] even when extended result codes are +** disabled. +** +** The values returned by sqlite3_errcode() and/or +** sqlite3_extended_errcode() might change with each API call. +** Except, there are some interfaces that are guaranteed to never +** change the value of the error code. The error-code preserving +** interfaces are: +** +**
    +**
  • sqlite3_errcode() +**
  • sqlite3_extended_errcode() +**
  • sqlite3_errmsg() +**
  • sqlite3_errmsg16() +**
+** +** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language +** text that describes the error, as either UTF-8 or UTF-16 respectively. +** ^(Memory to hold the error message string is managed internally. +** The application does not need to worry about freeing the result. +** However, the error string might be overwritten or deallocated by +** subsequent calls to other SQLite interface functions.)^ +** +** ^The sqlite3_errstr() interface returns the English-language text +** that describes the [result code], as UTF-8. +** ^(Memory to hold the error message string is managed internally +** and must not be freed by the application)^. +** +** When the serialized [threading mode] is in use, it might be the +** case that a second error occurs on a separate thread in between +** the time of the first error and the call to these interfaces. +** When that happens, the second error will be reported since these +** interfaces always report the most recent result. To avoid +** this, each thread can obtain exclusive use of the [database connection] D +** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning +** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after +** all calls to the interfaces listed here are completed. +** +** If an interface fails with SQLITE_MISUSE, that means the interface +** was invoked incorrectly by the application. In that case, the +** error code and message may or may not be set. +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db); +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); +SQLITE_API const char *sqlite3_errmsg(sqlite3*); +SQLITE_API const void *sqlite3_errmsg16(sqlite3*); +SQLITE_API const char *sqlite3_errstr(int); + +/* +** CAPI3REF: Prepared Statement Object +** KEYWORDS: {prepared statement} {prepared statements} +** +** An instance of this object represents a single SQL statement that +** has been compiled into binary form and is ready to be evaluated. +** +** Think of each SQL statement as a separate computer program. The +** original SQL text is source code. A prepared statement object +** is the compiled object code. All SQL must be converted into a +** prepared statement before it can be run. +** +** The life-cycle of a prepared statement object usually goes like this: +** +**
    +**
  1. Create the prepared statement object using [sqlite3_prepare_v2()]. +**
  2. Bind values to [parameters] using the sqlite3_bind_*() +** interfaces. +**
  3. Run the SQL by calling [sqlite3_step()] one or more times. +**
  4. Reset the prepared statement using [sqlite3_reset()] then go back +** to step 2. Do this zero or more times. +**
  5. Destroy the object using [sqlite3_finalize()]. +**
+*/ +typedef struct sqlite3_stmt sqlite3_stmt; + +/* +** CAPI3REF: Run-time Limits +** METHOD: sqlite3 +** +** ^(This interface allows the size of various constructs to be limited +** on a connection by connection basis. The first parameter is the +** [database connection] whose limit is to be set or queried. The +** second parameter is one of the [limit categories] that define a +** class of constructs to be size limited. The third parameter is the +** new limit for that construct.)^ +** +** ^If the new limit is a negative number, the limit is unchanged. +** ^(For each limit category SQLITE_LIMIT_NAME there is a +** [limits | hard upper bound] +** set at compile-time by a C preprocessor macro called +** [limits | SQLITE_MAX_NAME]. +** (The "_LIMIT_" in the name is changed to "_MAX_".))^ +** ^Attempts to increase a limit above its hard upper bound are +** silently truncated to the hard upper bound. +** +** ^Regardless of whether or not the limit was changed, the +** [sqlite3_limit()] interface returns the prior value of the limit. +** ^Hence, to find the current value of a limit without changing it, +** simply invoke this interface with the third parameter set to -1. +** +** Run-time limits are intended for use in applications that manage +** both their own internal database and also databases that are controlled +** by untrusted external sources. An example application might be a +** web browser that has its own databases for storing history and +** separate databases controlled by JavaScript applications downloaded +** off the Internet. The internal databases can be given the +** large, default limits. Databases managed by external sources can +** be given much smaller limits designed to prevent a denial of service +** attack. Developers might also want to use the [sqlite3_set_authorizer()] +** interface to further control untrusted SQL. The size of the database +** created by an untrusted script can be contained using the +** [max_page_count] [PRAGMA]. +** +** New run-time limit categories may be added in future releases. +*/ +SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); + +/* +** CAPI3REF: Run-Time Limit Categories +** KEYWORDS: {limit category} {*limit categories} +** +** These constants define various performance limits +** that can be lowered at run-time using [sqlite3_limit()]. +** The synopsis of the meanings of the various limits is shown below. +** Additional information is available at [limits | Limits in SQLite]. +** +**
+** [[SQLITE_LIMIT_LENGTH]] ^(
SQLITE_LIMIT_LENGTH
+**
The maximum size of any string or BLOB or table row, in bytes.
)^ +** +** [[SQLITE_LIMIT_SQL_LENGTH]] ^(
SQLITE_LIMIT_SQL_LENGTH
+**
The maximum length of an SQL statement, in bytes.
)^ +** +** [[SQLITE_LIMIT_COLUMN]] ^(
SQLITE_LIMIT_COLUMN
+**
The maximum number of columns in a table definition or in the +** result set of a [SELECT] or the maximum number of columns in an index +** or in an ORDER BY or GROUP BY clause.
)^ +** +** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(
SQLITE_LIMIT_EXPR_DEPTH
+**
The maximum depth of the parse tree on any expression.
)^ +** +** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(
SQLITE_LIMIT_COMPOUND_SELECT
+**
The maximum number of terms in a compound SELECT statement.
)^ +** +** [[SQLITE_LIMIT_VDBE_OP]] ^(
SQLITE_LIMIT_VDBE_OP
+**
The maximum number of instructions in a virtual machine program +** used to implement an SQL statement. If [sqlite3_prepare_v2()] or +** the equivalent tries to allocate space for more than this many opcodes +** in a single prepared statement, an SQLITE_NOMEM error is returned.
)^ +** +** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(
SQLITE_LIMIT_FUNCTION_ARG
+**
The maximum number of arguments on a function.
)^ +** +** [[SQLITE_LIMIT_ATTACHED]] ^(
SQLITE_LIMIT_ATTACHED
+**
The maximum number of [ATTACH | attached databases].)^
+** +** [[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]] +** ^(
SQLITE_LIMIT_LIKE_PATTERN_LENGTH
+**
The maximum length of the pattern argument to the [LIKE] or +** [GLOB] operators.
)^ +** +** [[SQLITE_LIMIT_VARIABLE_NUMBER]] +** ^(
SQLITE_LIMIT_VARIABLE_NUMBER
+**
The maximum index number of any [parameter] in an SQL statement.)^ +** +** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(
SQLITE_LIMIT_TRIGGER_DEPTH
+**
The maximum depth of recursion for triggers.
)^ +** +** [[SQLITE_LIMIT_WORKER_THREADS]] ^(
SQLITE_LIMIT_WORKER_THREADS
+**
The maximum number of auxiliary worker threads that a single +** [prepared statement] may start.
)^ +**
+*/ +#define SQLITE_LIMIT_LENGTH 0 +#define SQLITE_LIMIT_SQL_LENGTH 1 +#define SQLITE_LIMIT_COLUMN 2 +#define SQLITE_LIMIT_EXPR_DEPTH 3 +#define SQLITE_LIMIT_COMPOUND_SELECT 4 +#define SQLITE_LIMIT_VDBE_OP 5 +#define SQLITE_LIMIT_FUNCTION_ARG 6 +#define SQLITE_LIMIT_ATTACHED 7 +#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 +#define SQLITE_LIMIT_VARIABLE_NUMBER 9 +#define SQLITE_LIMIT_TRIGGER_DEPTH 10 +#define SQLITE_LIMIT_WORKER_THREADS 11 + +/* +** CAPI3REF: Prepare Flags +** +** These constants define various flags that can be passed into +** "prepFlags" parameter of the [sqlite3_prepare_v3()] and +** [sqlite3_prepare16_v3()] interfaces. +** +** New flags may be added in future releases of SQLite. +** +**
+** [[SQLITE_PREPARE_PERSISTENT]] ^(
SQLITE_PREPARE_PERSISTENT
+**
The SQLITE_PREPARE_PERSISTENT flag is a hint to the query planner +** that the prepared statement will be retained for a long time and +** probably reused many times.)^ ^Without this flag, [sqlite3_prepare_v3()] +** and [sqlite3_prepare16_v3()] assume that the prepared statement will +** be used just once or at most a few times and then destroyed using +** [sqlite3_finalize()] relatively soon. The current implementation acts +** on this hint by avoiding the use of [lookaside memory] so as not to +** deplete the limited store of lookaside memory. Future versions of +** SQLite may act on this hint differently. +** +** [[SQLITE_PREPARE_NORMALIZE]]
SQLITE_PREPARE_NORMALIZE
+**
The SQLITE_PREPARE_NORMALIZE flag is a no-op. This flag used +** to be required for any prepared statement that wanted to use the +** [sqlite3_normalized_sql()] interface. However, the +** [sqlite3_normalized_sql()] interface is now available to all +** prepared statements, regardless of whether or not they use this +** flag. +** +** [[SQLITE_PREPARE_NO_VTAB]]
SQLITE_PREPARE_NO_VTAB
+**
The SQLITE_PREPARE_NO_VTAB flag causes the SQL compiler +** to return an error (error code SQLITE_ERROR) if the statement uses +** any virtual tables. +**
+*/ +#define SQLITE_PREPARE_PERSISTENT 0x01 +#define SQLITE_PREPARE_NORMALIZE 0x02 +#define SQLITE_PREPARE_NO_VTAB 0x04 + +/* +** CAPI3REF: Compiling An SQL Statement +** KEYWORDS: {SQL statement compiler} +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_stmt +** +** To execute an SQL statement, it must first be compiled into a byte-code +** program using one of these routines. Or, in other words, these routines +** are constructors for the [prepared statement] object. +** +** The preferred routine to use is [sqlite3_prepare_v2()]. The +** [sqlite3_prepare()] interface is legacy and should be avoided. +** [sqlite3_prepare_v3()] has an extra "prepFlags" option that is used +** for special purposes. +** +** The use of the UTF-8 interfaces is preferred, as SQLite currently +** does all parsing using UTF-8. The UTF-16 interfaces are provided +** as a convenience. The UTF-16 interfaces work by converting the +** input text into UTF-8, then invoking the corresponding UTF-8 interface. +** +** The first argument, "db", is a [database connection] obtained from a +** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or +** [sqlite3_open16()]. The database connection must not have been closed. +** +** The second argument, "zSql", is the statement to be compiled, encoded +** as either UTF-8 or UTF-16. The sqlite3_prepare(), sqlite3_prepare_v2(), +** and sqlite3_prepare_v3() +** interfaces use UTF-8, and sqlite3_prepare16(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() use UTF-16. +** +** ^If the nByte argument is negative, then zSql is read up to the +** first zero terminator. ^If nByte is positive, then it is the +** number of bytes read from zSql. ^If nByte is zero, then no prepared +** statement is generated. +** If the caller knows that the supplied string is nul-terminated, then +** there is a small performance advantage to passing an nByte parameter that +** is the number of bytes in the input string including +** the nul-terminator. +** +** ^If pzTail is not NULL then *pzTail is made to point to the first byte +** past the end of the first SQL statement in zSql. These routines only +** compile the first statement in zSql, so *pzTail is left pointing to +** what remains uncompiled. +** +** ^*ppStmt is left pointing to a compiled [prepared statement] that can be +** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set +** to NULL. ^If the input text contains no SQL (if the input is an empty +** string or a comment) then *ppStmt is set to NULL. +** The calling procedure is responsible for deleting the compiled +** SQL statement using [sqlite3_finalize()] after it has finished with it. +** ppStmt may not be NULL. +** +** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; +** otherwise an [error code] is returned. +** +** The sqlite3_prepare_v2(), sqlite3_prepare_v3(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() interfaces are recommended for all new programs. +** The older interfaces (sqlite3_prepare() and sqlite3_prepare16()) +** are retained for backwards compatibility, but their use is discouraged. +** ^In the "vX" interfaces, the prepared statement +** that is returned (the [sqlite3_stmt] object) contains a copy of the +** original SQL text. This causes the [sqlite3_step()] interface to +** behave differently in three ways: +** +**
    +**
  1. +** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it +** always used to do, [sqlite3_step()] will automatically recompile the SQL +** statement and try to run it again. As many as [SQLITE_MAX_SCHEMA_RETRY] +** retries will occur before sqlite3_step() gives up and returns an error. +**
  2. +** +**
  3. +** ^When an error occurs, [sqlite3_step()] will return one of the detailed +** [error codes] or [extended error codes]. ^The legacy behavior was that +** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code +** and the application would have to make a second call to [sqlite3_reset()] +** in order to find the underlying cause of the problem. With the "v2" prepare +** interfaces, the underlying reason for the error is returned immediately. +**
  4. +** +**
  5. +** ^If the specific value bound to a [parameter | host parameter] in the +** WHERE clause might influence the choice of query plan for a statement, +** then the statement will be automatically recompiled, as if there had been +** a schema change, on the first [sqlite3_step()] call following any change +** to the [sqlite3_bind_text | bindings] of that [parameter]. +** ^The specific value of a WHERE-clause [parameter] might influence the +** choice of query plan if the parameter is the left-hand side of a [LIKE] +** or [GLOB] operator or if the parameter is compared to an indexed column +** and the [SQLITE_ENABLE_STAT4] compile-time option is enabled. +**
  6. +**
+** +**

^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having +** the extra prepFlags parameter, which is a bit array consisting of zero or +** more of the [SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_*] flags. ^The +** sqlite3_prepare_v2() interface works exactly the same as +** sqlite3_prepare_v3() with a zero prepFlags parameter. +*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v3( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v3( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); + +/* +** CAPI3REF: Retrieving Statement SQL +** METHOD: sqlite3_stmt +** +** ^The sqlite3_sql(P) interface returns a pointer to a copy of the UTF-8 +** SQL text used to create [prepared statement] P if P was +** created by [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. +** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 +** string containing the SQL text of prepared statement P with +** [bound parameters] expanded. +** ^The sqlite3_normalized_sql(P) interface returns a pointer to a UTF-8 +** string containing the normalized SQL text of prepared statement P. The +** semantics used to normalize a SQL statement are unspecified and subject +** to change. At a minimum, literal values will be replaced with suitable +** placeholders. +** +** ^(For example, if a prepared statement is created using the SQL +** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345 +** and parameter :xyz is unbound, then sqlite3_sql() will return +** the original string, "SELECT $abc,:xyz" but sqlite3_expanded_sql() +** will return "SELECT 2345,NULL".)^ +** +** ^The sqlite3_expanded_sql() interface returns NULL if insufficient memory +** is available to hold the result, or if the result would exceed the +** the maximum string length determined by the [SQLITE_LIMIT_LENGTH]. +** +** ^The [SQLITE_TRACE_SIZE_LIMIT] compile-time option limits the size of +** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time +** option causes sqlite3_expanded_sql() to always return NULL. +** +** ^The strings returned by sqlite3_sql(P) and sqlite3_normalized_sql(P) +** are managed by SQLite and are automatically freed when the prepared +** statement is finalized. +** ^The string returned by sqlite3_expanded_sql(P), on the other hand, +** is obtained from [sqlite3_malloc()] and must be free by the application +** by passing it to [sqlite3_free()]. +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); +SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If An SQL Statement Writes The Database +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if +** and only if the [prepared statement] X makes no direct changes to +** the content of the database file. +** +** Note that [application-defined SQL functions] or +** [virtual tables] might change the database indirectly as a side effect. +** ^(For example, if an application defines a function "eval()" that +** calls [sqlite3_exec()], then the following SQL statement would +** change the database file through side-effects: +** +**

+**    SELECT eval('DELETE FROM t1') FROM t2;
+** 
+** +** But because the [SELECT] statement does not change the database file +** directly, sqlite3_stmt_readonly() would still return true.)^ +** +** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], +** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, +** since the statements themselves do not actually modify the database but +** rather they control the timing of when other statements modify the +** database. ^The [ATTACH] and [DETACH] statements also cause +** sqlite3_stmt_readonly() to return true since, while those statements +** change the configuration of a database connection, they do not make +** changes to the content of the database files on disk. +** ^The sqlite3_stmt_readonly() interface returns true for [BEGIN] since +** [BEGIN] merely sets internal flags, but the [BEGIN|BEGIN IMMEDIATE] and +** [BEGIN|BEGIN EXCLUSIVE] commands do touch the database and so +** sqlite3_stmt_readonly() returns false for those commands. +*/ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Query The EXPLAIN Setting For A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_isexplain(S) interface returns 1 if the +** prepared statement S is an EXPLAIN statement, or 2 if the +** statement S is an EXPLAIN QUERY PLAN. +** ^The sqlite3_stmt_isexplain(S) interface returns 0 if S is +** an ordinary statement or a NULL pointer. +*/ +SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If A Prepared Statement Has Been Reset +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the +** [prepared statement] S has been stepped at least once using +** [sqlite3_step(S)] but has neither run to completion (returned +** [SQLITE_DONE] from [sqlite3_step(S)]) nor +** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) +** interface returns false if S is a NULL pointer. If S is not a +** NULL pointer and is not a pointer to a valid [prepared statement] +** object, then the behavior is undefined and probably undesirable. +** +** This interface can be used in combination [sqlite3_next_stmt()] +** to locate all prepared statements associated with a database +** connection that are in need of being reset. This can be used, +** for example, in diagnostic routines to search for prepared +** statements that are holding a transaction open. +*/ +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); + +/* +** CAPI3REF: Dynamically Typed Value Object +** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} +** +** SQLite uses the sqlite3_value object to represent all values +** that can be stored in a database table. SQLite uses dynamic typing +** for the values it stores. ^Values stored in sqlite3_value objects +** can be integers, floating point values, strings, BLOBs, or NULL. +** +** An sqlite3_value object may be either "protected" or "unprotected". +** Some interfaces require a protected sqlite3_value. Other interfaces +** will accept either a protected or an unprotected sqlite3_value. +** Every interface that accepts sqlite3_value arguments specifies +** whether or not it requires a protected sqlite3_value. The +** [sqlite3_value_dup()] interface can be used to construct a new +** protected sqlite3_value from an unprotected sqlite3_value. +** +** The terms "protected" and "unprotected" refer to whether or not +** a mutex is held. An internal mutex is held for a protected +** sqlite3_value object but no mutex is held for an unprotected +** sqlite3_value object. If SQLite is compiled to be single-threaded +** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) +** or if SQLite is run in one of reduced mutex modes +** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] +** then there is no distinction between protected and unprotected +** sqlite3_value objects and they can be used interchangeably. However, +** for maximum code portability it is recommended that applications +** still make the distinction between protected and unprotected +** sqlite3_value objects even when not strictly required. +** +** ^The sqlite3_value objects that are passed as parameters into the +** implementation of [application-defined SQL functions] are protected. +** ^The sqlite3_value object returned by +** [sqlite3_column_value()] is unprotected. +** Unprotected sqlite3_value objects may only be used as arguments +** to [sqlite3_result_value()], [sqlite3_bind_value()], and +** [sqlite3_value_dup()]. +** The [sqlite3_value_blob | sqlite3_value_type()] family of +** interfaces require protected sqlite3_value objects. +*/ +typedef struct sqlite3_value sqlite3_value; + +/* +** CAPI3REF: SQL Function Context Object +** +** The context in which an SQL function executes is stored in an +** sqlite3_context object. ^A pointer to an sqlite3_context object +** is always first parameter to [application-defined SQL functions]. +** The application-defined SQL function implementation will pass this +** pointer through into calls to [sqlite3_result_int | sqlite3_result()], +** [sqlite3_aggregate_context()], [sqlite3_user_data()], +** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], +** and/or [sqlite3_set_auxdata()]. +*/ +typedef struct sqlite3_context sqlite3_context; + +/* +** CAPI3REF: Binding Values To Prepared Statements +** KEYWORDS: {host parameter} {host parameters} {host parameter name} +** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} +** METHOD: sqlite3_stmt +** +** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, +** literals may be replaced by a [parameter] that matches one of following +** templates: +** +**
    +**
  • ? +**
  • ?NNN +**
  • :VVV +**
  • @VVV +**
  • $VVV +**
+** +** In the templates above, NNN represents an integer literal, +** and VVV represents an alphanumeric identifier.)^ ^The values of these +** parameters (also called "host parameter names" or "SQL parameters") +** can be set using the sqlite3_bind_*() routines defined here. +** +** ^The first argument to the sqlite3_bind_*() routines is always +** a pointer to the [sqlite3_stmt] object returned from +** [sqlite3_prepare_v2()] or its variants. +** +** ^The second argument is the index of the SQL parameter to be set. +** ^The leftmost SQL parameter has an index of 1. ^When the same named +** SQL parameter is used more than once, second and subsequent +** occurrences have the same index as the first occurrence. +** ^The index for named parameters can be looked up using the +** [sqlite3_bind_parameter_index()] API if desired. ^The index +** for "?NNN" parameters is the value of NNN. +** ^The NNN value must be between 1 and the [sqlite3_limit()] +** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 32766). +** +** ^The third argument is the value to bind to the parameter. +** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() +** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter +** is ignored and the end result is the same as sqlite3_bind_null(). +** ^If the third parameter to sqlite3_bind_text() is not NULL, then +** it should be a pointer to well-formed UTF8 text. +** ^If the third parameter to sqlite3_bind_text16() is not NULL, then +** it should be a pointer to well-formed UTF16 text. +** ^If the third parameter to sqlite3_bind_text64() is not NULL, then +** it should be a pointer to a well-formed unicode string that is +** either UTF8 if the sixth parameter is SQLITE_UTF8, or UTF16 +** otherwise. +** +** [[byte-order determination rules]] ^The byte-order of +** UTF16 input text is determined by the byte-order mark (BOM, U+FEFF) +** found in first character, which is removed, or in the absence of a BOM +** the byte order is the native byte order of the host +** machine for sqlite3_bind_text16() or the byte order specified in +** the 6th parameter for sqlite3_bind_text64().)^ +** ^If UTF16 input text contains invalid unicode +** characters, then SQLite might change those invalid characters +** into the unicode replacement character: U+FFFD. +** +** ^(In those routines that have a fourth argument, its value is the +** number of bytes in the parameter. To be clear: the value is the +** number of bytes in the value, not the number of characters.)^ +** ^If the fourth parameter to sqlite3_bind_text() or sqlite3_bind_text16() +** is negative, then the length of the string is +** the number of bytes up to the first zero terminator. +** If the fourth parameter to sqlite3_bind_blob() is negative, then +** the behavior is undefined. +** If a non-negative fourth parameter is provided to sqlite3_bind_text() +** or sqlite3_bind_text16() or sqlite3_bind_text64() then +** that parameter must be the byte offset +** where the NUL terminator would occur assuming the string were NUL +** terminated. If any NUL characters occurs at byte offsets less than +** the value of the fourth parameter then the resulting string value will +** contain embedded NULs. The result of expressions involving strings +** with embedded NULs is undefined. +** +** ^The fifth argument to the BLOB and string binding interfaces +** is a destructor used to dispose of the BLOB or +** string after SQLite has finished with it. ^The destructor is called +** to dispose of the BLOB or string even if the call to the bind API fails, +** except the destructor is not called if the third parameter is a NULL +** pointer or the fourth parameter is negative. +** ^If the fifth argument is +** the special value [SQLITE_STATIC], then SQLite assumes that the +** information is in static, unmanaged space and does not need to be freed. +** ^If the fifth argument has the value [SQLITE_TRANSIENT], then +** SQLite makes its own private copy of the data immediately, before +** the sqlite3_bind_*() routine returns. +** +** ^The sixth argument to sqlite3_bind_text64() must be one of +** [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE] +** to specify the encoding of the text in the third parameter. If +** the sixth argument to sqlite3_bind_text64() is not one of the +** allowed values shown above, or if the text encoding is different +** from the encoding specified by the sixth parameter, then the behavior +** is undefined. +** +** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that +** is filled with zeroes. ^A zeroblob uses a fixed amount of memory +** (just an integer to hold its size) while it is being processed. +** Zeroblobs are intended to serve as placeholders for BLOBs whose +** content is later written using +** [sqlite3_blob_open | incremental BLOB I/O] routines. +** ^A negative value for the zeroblob results in a zero-length BLOB. +** +** ^The sqlite3_bind_pointer(S,I,P,T,D) routine causes the I-th parameter in +** [prepared statement] S to have an SQL value of NULL, but to also be +** associated with the pointer P of type T. ^D is either a NULL pointer or +** a pointer to a destructor function for P. ^SQLite will invoke the +** destructor D with a single argument of P when it is finished using +** P. The T parameter should be a static string, preferably a string +** literal. The sqlite3_bind_pointer() routine is part of the +** [pointer passing interface] added for SQLite 3.20.0. +** +** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer +** for the [prepared statement] or with a prepared statement for which +** [sqlite3_step()] has been called more recently than [sqlite3_reset()], +** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_() +** routine is passed a [prepared statement] that has been finalized, the +** result is undefined and probably harmful. +** +** ^Bindings are not cleared by the [sqlite3_reset()] routine. +** ^Unbound parameters are interpreted as NULL. +** +** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an +** [error code] if anything goes wrong. +** ^[SQLITE_TOOBIG] might be returned if the size of a string or BLOB +** exceeds limits imposed by [sqlite3_limit]([SQLITE_LIMIT_LENGTH]) or +** [SQLITE_MAX_LENGTH]. +** ^[SQLITE_RANGE] is returned if the parameter +** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails. +** +** See also: [sqlite3_bind_parameter_count()], +** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); +SQLITE_API int sqlite3_bind_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64, + void(*)(void*)); +SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); +SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); +SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); +SQLITE_API int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*)); +SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); +SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +SQLITE_API int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, const char*,void(*)(void*)); +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64); + +/* +** CAPI3REF: Number Of SQL Parameters +** METHOD: sqlite3_stmt +** +** ^This routine can be used to find the number of [SQL parameters] +** in a [prepared statement]. SQL parameters are tokens of the +** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as +** placeholders for values that are [sqlite3_bind_blob | bound] +** to the parameters at a later time. +** +** ^(This routine actually returns the index of the largest (rightmost) +** parameter. For all forms except ?NNN, this will correspond to the +** number of unique parameters. If parameters of the ?NNN form are used, +** there may be gaps in the list.)^ +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_name()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); + +/* +** CAPI3REF: Name Of A Host Parameter +** METHOD: sqlite3_stmt +** +** ^The sqlite3_bind_parameter_name(P,N) interface returns +** the name of the N-th [SQL parameter] in the [prepared statement] P. +** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" +** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" +** respectively. +** In other words, the initial ":" or "$" or "@" or "?" +** is included as part of the name.)^ +** ^Parameters of the form "?" without a following integer have no name +** and are referred to as "nameless" or "anonymous parameters". +** +** ^The first host parameter has an index of 1, not 0. +** +** ^If the value N is out of range or if the N-th parameter is +** nameless, then NULL is returned. ^The returned string is +** always in UTF-8 encoding even if the named parameter was +** originally specified as UTF-16 in [sqlite3_prepare16()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); + +/* +** CAPI3REF: Index Of A Parameter With A Given Name +** METHOD: sqlite3_stmt +** +** ^Return the index of an SQL parameter given its name. ^The +** index value returned is suitable for use as the second +** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero +** is returned if no matching parameter is found. ^The parameter +** name must be given in UTF-8 even if the original statement +** was prepared from UTF-16 text using [sqlite3_prepare16_v2()] or +** [sqlite3_prepare16_v3()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_name()]. +*/ +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); + +/* +** CAPI3REF: Reset All Bindings On A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset +** the [sqlite3_bind_blob | bindings] on a [prepared statement]. +** ^Use this routine to reset all host parameters to NULL. +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); + +/* +** CAPI3REF: Number Of Columns In A Result Set +** METHOD: sqlite3_stmt +** +** ^Return the number of columns in the result set returned by the +** [prepared statement]. ^If this routine returns 0, that means the +** [prepared statement] returns no data (for example an [UPDATE]). +** ^However, just because this routine returns a positive number does not +** mean that one or more rows of data will be returned. ^A SELECT statement +** will always have a positive sqlite3_column_count() but depending on the +** WHERE clause constraints and the table content, it might return no rows. +** +** See also: [sqlite3_data_count()] +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Column Names In A Result Set +** METHOD: sqlite3_stmt +** +** ^These routines return the name assigned to a particular column +** in the result set of a [SELECT] statement. ^The sqlite3_column_name() +** interface returns a pointer to a zero-terminated UTF-8 string +** and sqlite3_column_name16() returns a pointer to a zero-terminated +** UTF-16 string. ^The first parameter is the [prepared statement] +** that implements the [SELECT] statement. ^The second parameter is the +** column number. ^The leftmost column is number 0. +** +** ^The returned string pointer is valid until either the [prepared statement] +** is destroyed by [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the next call to +** sqlite3_column_name() or sqlite3_column_name16() on the same column. +** +** ^If sqlite3_malloc() fails during the processing of either routine +** (for example during a conversion from UTF-8 to UTF-16) then a +** NULL pointer is returned. +** +** ^The name of a result column is the value of the "AS" clause for +** that column, if there is an AS clause. If there is no AS clause +** then the name of the column is unspecified and may change from +** one release of SQLite to the next. +*/ +SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); +SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); + +/* +** CAPI3REF: Source Of Data In A Query Result +** METHOD: sqlite3_stmt +** +** ^These routines provide a means to determine the database, table, and +** table column that is the origin of a particular result column in +** [SELECT] statement. +** ^The name of the database or table or column can be returned as +** either a UTF-8 or UTF-16 string. ^The _database_ routines return +** the database name, the _table_ routines return the table name, and +** the origin_ routines return the column name. +** ^The returned string is valid until the [prepared statement] is destroyed +** using [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the same information is requested +** again in a different encoding. +** +** ^The names returned are the original un-aliased names of the +** database, table, and column. +** +** ^The first argument to these interfaces is a [prepared statement]. +** ^These functions return information about the Nth result column returned by +** the statement, where N is the second function argument. +** ^The left-most column is column 0 for these routines. +** +** ^If the Nth column returned by the statement is an expression or +** subquery and is not a column value, then all of these functions return +** NULL. ^These routines might also return NULL if a memory allocation error +** occurs. ^Otherwise, they return the name of the attached database, table, +** or column that query result column was extracted from. +** +** ^As with all other SQLite APIs, those whose names end with "16" return +** UTF-16 encoded strings and the other functions return UTF-8. +** +** ^These APIs are only available if the library was compiled with the +** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. +** +** If two or more threads call one or more +** [sqlite3_column_database_name | column metadata interfaces] +** for the same [prepared statement] and result column +** at the same time then the results are undefined. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Declared Datatype Of A Query Result +** METHOD: sqlite3_stmt +** +** ^(The first parameter is a [prepared statement]. +** If this statement is a [SELECT] statement and the Nth column of the +** returned result set of that [SELECT] is a table column (not an +** expression or subquery) then the declared type of the table +** column is returned.)^ ^If the Nth column of the result set is an +** expression or subquery, then a NULL pointer is returned. +** ^The returned string is always UTF-8 encoded. +** +** ^(For example, given the database schema: +** +** CREATE TABLE t1(c1 VARIANT); +** +** and the following statement to be compiled: +** +** SELECT c1 + 1, c1 FROM t1; +** +** this routine would return the string "VARIANT" for the second result +** column (i==1), and a NULL pointer for the first result column (i==0).)^ +** +** ^SQLite uses dynamic run-time typing. ^So just because a column +** is declared to contain a particular type does not mean that the +** data stored in that column is of the declared type. SQLite is +** strongly typed, but the typing is dynamic not static. ^Type +** is associated with individual values, not with the containers +** used to hold those values. +*/ +SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Evaluate An SQL Statement +** METHOD: sqlite3_stmt +** +** After a [prepared statement] has been prepared using any of +** [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], [sqlite3_prepare16_v2()], +** or [sqlite3_prepare16_v3()] or one of the legacy +** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function +** must be called one or more times to evaluate the statement. +** +** The details of the behavior of the sqlite3_step() interface depend +** on whether the statement was prepared using the newer "vX" interfaces +** [sqlite3_prepare_v3()], [sqlite3_prepare_v2()], [sqlite3_prepare16_v3()], +** [sqlite3_prepare16_v2()] or the older legacy +** interfaces [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "vX" interface is recommended for new applications but the legacy +** interface will continue to be supported. +** +** ^In the legacy interface, the return value will be either [SQLITE_BUSY], +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. +** ^With the "v2" interface, any of the other [result codes] or +** [extended result codes] might be returned as well. +** +** ^[SQLITE_BUSY] means that the database engine was unable to acquire the +** database locks it needs to do its job. ^If the statement is a [COMMIT] +** or occurs outside of an explicit transaction, then you can retry the +** statement. If the statement is not a [COMMIT] and occurs within an +** explicit transaction then you should rollback the transaction before +** continuing. +** +** ^[SQLITE_DONE] means that the statement has finished executing +** successfully. sqlite3_step() should not be called again on this virtual +** machine without first calling [sqlite3_reset()] to reset the virtual +** machine back to its initial state. +** +** ^If the SQL statement being executed returns any data, then [SQLITE_ROW] +** is returned each time a new row of data is ready for processing by the +** caller. The values may be accessed using the [column access functions]. +** sqlite3_step() is called again to retrieve the next row of data. +** +** ^[SQLITE_ERROR] means that a run-time error (such as a constraint +** violation) has occurred. sqlite3_step() should not be called again on +** the VM. More information may be found by calling [sqlite3_errmsg()]. +** ^With the legacy interface, a more specific error code (for example, +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) +** can be obtained by calling [sqlite3_reset()] on the +** [prepared statement]. ^In the "v2" interface, +** the more specific error code is returned directly by sqlite3_step(). +** +** [SQLITE_MISUSE] means that the this routine was called inappropriately. +** Perhaps it was called on a [prepared statement] that has +** already been [sqlite3_finalize | finalized] or on one that had +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could +** be the case that the same database connection is being used by two or +** more threads at the same moment in time. +** +** For all versions of SQLite up to and including 3.6.23.1, a call to +** [sqlite3_reset()] was required after sqlite3_step() returned anything +** other than [SQLITE_ROW] before any subsequent invocation of +** sqlite3_step(). Failure to reset the prepared statement using +** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from +** sqlite3_step(). But after [version 3.6.23.1] ([dateof:3.6.23.1], +** sqlite3_step() began +** calling [sqlite3_reset()] automatically in this circumstance rather +** than returning [SQLITE_MISUSE]. This is not considered a compatibility +** break because any application that ever receives an SQLITE_MISUSE error +** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option +** can be used to restore the legacy behavior. +** +** Goofy Interface Alert: In the legacy interface, the sqlite3_step() +** API always returns a generic error code, [SQLITE_ERROR], following any +** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call +** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the +** specific [error codes] that better describes the error. +** We admit that this is a goofy design. The problem has been fixed +** with the "v2" interface. If you prepare all of your SQL statements +** using [sqlite3_prepare_v3()] or [sqlite3_prepare_v2()] +** or [sqlite3_prepare16_v2()] or [sqlite3_prepare16_v3()] instead +** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, +** then the more specific [error codes] are returned directly +** by sqlite3_step(). The use of the "vX" interfaces is recommended. +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt*); + +/* +** CAPI3REF: Number of columns in a result set +** METHOD: sqlite3_stmt +** +** ^The sqlite3_data_count(P) interface returns the number of columns in the +** current row of the result set of [prepared statement] P. +** ^If prepared statement P does not have results ready to return +** (via calls to the [sqlite3_column_int | sqlite3_column()] family of +** interfaces) then sqlite3_data_count(P) returns 0. +** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. +** ^The sqlite3_data_count(P) routine returns 0 if the previous call to +** [sqlite3_step](P) returned [SQLITE_DONE]. ^The sqlite3_data_count(P) +** will return non-zero if previous call to [sqlite3_step](P) returned +** [SQLITE_ROW], except in the case of the [PRAGMA incremental_vacuum] +** where it always returns zero since each step of that multi-step +** pragma returns 0 columns of data. +** +** See also: [sqlite3_column_count()] +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Fundamental Datatypes +** KEYWORDS: SQLITE_TEXT +** +** ^(Every value in SQLite has one of five fundamental datatypes: +** +**
    +**
  • 64-bit signed integer +**
  • 64-bit IEEE floating point number +**
  • string +**
  • BLOB +**
  • NULL +**
)^ +** +** These constants are codes for each of those types. +** +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 +** for a completely different meaning. Software that links against both +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not +** SQLITE_TEXT. +*/ +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 +#ifdef SQLITE_TEXT +# undef SQLITE_TEXT +#else +# define SQLITE_TEXT 3 +#endif +#define SQLITE3_TEXT 3 + +/* +** CAPI3REF: Result Values From A Query +** KEYWORDS: {column access functions} +** METHOD: sqlite3_stmt +** +** Summary: +**
+**
sqlite3_column_blobBLOB result +**
sqlite3_column_doubleREAL result +**
sqlite3_column_int32-bit INTEGER result +**
sqlite3_column_int6464-bit INTEGER result +**
sqlite3_column_textUTF-8 TEXT result +**
sqlite3_column_text16UTF-16 TEXT result +**
sqlite3_column_valueThe result as an +** [sqlite3_value|unprotected sqlite3_value] object. +**
    +**
sqlite3_column_bytesSize of a BLOB +** or a UTF-8 TEXT result in bytes +**
sqlite3_column_bytes16   +** →  Size of UTF-16 +** TEXT in bytes +**
sqlite3_column_typeDefault +** datatype of the result +**
+** +** Details: +** +** ^These routines return information about a single column of the current +** result row of a query. ^In every case the first argument is a pointer +** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] +** that was returned from [sqlite3_prepare_v2()] or one of its variants) +** and the second argument is the index of the column for which information +** should be returned. ^The leftmost column of the result set has the index 0. +** ^The number of columns in the result can be determined using +** [sqlite3_column_count()]. +** +** If the SQL statement does not currently point to a valid row, or if the +** column index is out of range, the result is undefined. +** These routines may only be called when the most recent call to +** [sqlite3_step()] has returned [SQLITE_ROW] and neither +** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. +** If any of these routines are called after [sqlite3_reset()] or +** [sqlite3_finalize()] or after [sqlite3_step()] has returned +** something other than [SQLITE_ROW], the results are undefined. +** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] +** are called from a different thread while any of these routines +** are pending, then the results are undefined. +** +** The first six interfaces (_blob, _double, _int, _int64, _text, and _text16) +** each return the value of a result column in a specific data format. If +** the result column is not initially in the requested format (for example, +** if the query returns an integer but the sqlite3_column_text() interface +** is used to extract the value) then an automatic type conversion is performed. +** +** ^The sqlite3_column_type() routine returns the +** [SQLITE_INTEGER | datatype code] for the initial data type +** of the result column. ^The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. +** The return value of sqlite3_column_type() can be used to decide which +** of the first six interface should be used to extract the column value. +** The value returned by sqlite3_column_type() is only meaningful if no +** automatic type conversions have occurred for the value in question. +** After a type conversion, the result of calling sqlite3_column_type() +** is undefined, though harmless. Future +** versions of SQLite may change the behavior of sqlite3_column_type() +** following a type conversion. +** +** If the result is a BLOB or a TEXT string, then the sqlite3_column_bytes() +** or sqlite3_column_bytes16() interfaces can be used to determine the size +** of that BLOB or string. +** +** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts +** the string to UTF-8 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes() uses +** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes() returns zero. +** +** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts +** the string to UTF-16 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes16() uses +** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. +** +** ^The values returned by [sqlite3_column_bytes()] and +** [sqlite3_column_bytes16()] do not include the zero terminators at the end +** of the string. ^For clarity: the values returned by +** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are the number of +** bytes in the string, not the number of characters. +** +** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), +** even empty strings, are always zero-terminated. ^The return +** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. +** +** Warning: ^The object returned by [sqlite3_column_value()] is an +** [unprotected sqlite3_value] object. In a multithreaded environment, +** an unprotected sqlite3_value object may only be used safely with +** [sqlite3_bind_value()] and [sqlite3_result_value()]. +** If the [unprotected sqlite3_value] object returned by +** [sqlite3_column_value()] is used in any other way, including calls +** to routines like [sqlite3_value_int()], [sqlite3_value_text()], +** or [sqlite3_value_bytes()], the behavior is not threadsafe. +** Hence, the sqlite3_column_value() interface +** is normally only useful within the implementation of +** [application-defined SQL functions] or [virtual tables], not within +** top-level application code. +** +** The these routines may attempt to convert the datatype of the result. +** ^For example, if the internal representation is FLOAT and a text result +** is requested, [sqlite3_snprintf()] is used internally to perform the +** conversion automatically. ^(The following table details the conversions +** that are applied: +** +**
+** +**
Internal
Type
Requested
Type
Conversion +** +**
NULL INTEGER Result is 0 +**
NULL FLOAT Result is 0.0 +**
NULL TEXT Result is a NULL pointer +**
NULL BLOB Result is a NULL pointer +**
INTEGER FLOAT Convert from integer to float +**
INTEGER TEXT ASCII rendering of the integer +**
INTEGER BLOB Same as INTEGER->TEXT +**
FLOAT INTEGER [CAST] to INTEGER +**
FLOAT TEXT ASCII rendering of the float +**
FLOAT BLOB [CAST] to BLOB +**
TEXT INTEGER [CAST] to INTEGER +**
TEXT FLOAT [CAST] to REAL +**
TEXT BLOB No change +**
BLOB INTEGER [CAST] to INTEGER +**
BLOB FLOAT [CAST] to REAL +**
BLOB TEXT Add a zero terminator if needed +**
+**
)^ +** +** Note that when type conversions occur, pointers returned by prior +** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or +** sqlite3_column_text16() may be invalidated. +** Type conversions and pointer invalidations might occur +** in the following cases: +** +**
    +**
  • The initial content is a BLOB and sqlite3_column_text() or +** sqlite3_column_text16() is called. A zero-terminator might +** need to be added to the string.
  • +**
  • The initial content is UTF-8 text and sqlite3_column_bytes16() or +** sqlite3_column_text16() is called. The content must be converted +** to UTF-16.
  • +**
  • The initial content is UTF-16 text and sqlite3_column_bytes() or +** sqlite3_column_text() is called. The content must be converted +** to UTF-8.
  • +**
+** +** ^Conversions between UTF-16be and UTF-16le are always done in place and do +** not invalidate a prior pointer, though of course the content of the buffer +** that the prior pointer references will have been modified. Other kinds +** of conversion are done in place when it is possible, but sometimes they +** are not possible and in those cases prior pointers are invalidated. +** +** The safest policy is to invoke these routines +** in one of the following ways: +** +**
    +**
  • sqlite3_column_text() followed by sqlite3_column_bytes()
  • +**
  • sqlite3_column_blob() followed by sqlite3_column_bytes()
  • +**
  • sqlite3_column_text16() followed by sqlite3_column_bytes16()
  • +**
+** +** In other words, you should call sqlite3_column_text(), +** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result +** into the desired format, then invoke sqlite3_column_bytes() or +** sqlite3_column_bytes16() to find the size of the result. Do not mix calls +** to sqlite3_column_text() or sqlite3_column_blob() with calls to +** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() +** with calls to sqlite3_column_bytes(). +** +** ^The pointers returned are valid until a type conversion occurs as +** described above, or until [sqlite3_step()] or [sqlite3_reset()] or +** [sqlite3_finalize()] is called. ^The memory space used to hold strings +** and BLOBs is freed automatically. Do not pass the pointers returned +** from [sqlite3_column_blob()], [sqlite3_column_text()], etc. into +** [sqlite3_free()]. +** +** As long as the input parameters are correct, these routines will only +** fail if an out-of-memory error occurs during a format conversion. +** Only the following subset of interfaces are subject to out-of-memory +** errors: +** +**
    +**
  • sqlite3_column_blob() +**
  • sqlite3_column_text() +**
  • sqlite3_column_text16() +**
  • sqlite3_column_bytes() +**
  • sqlite3_column_bytes16() +**
+** +** If an out-of-memory error occurs, then the return value from these +** routines is the same as if the column had contained an SQL NULL value. +** Valid SQL NULL returns can be distinguished from out-of-memory errors +** by invoking the [sqlite3_errcode()] immediately after the suspect +** return value is obtained and before any +** other SQLite interface is called on the same [database connection]. +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); +SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); + +/* +** CAPI3REF: Destroy A Prepared Statement Object +** DESTRUCTOR: sqlite3_stmt +** +** ^The sqlite3_finalize() function is called to delete a [prepared statement]. +** ^If the most recent evaluation of the statement encountered no errors +** or if the statement is never been evaluated, then sqlite3_finalize() returns +** SQLITE_OK. ^If the most recent evaluation of statement S failed, then +** sqlite3_finalize(S) returns the appropriate [error code] or +** [extended error code]. +** +** ^The sqlite3_finalize(S) routine can be called at any point during +** the life cycle of [prepared statement] S: +** before statement S is ever evaluated, after +** one or more calls to [sqlite3_reset()], or after any call +** to [sqlite3_step()] regardless of whether or not the statement has +** completed execution. +** +** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. +** +** The application must finalize every [prepared statement] in order to avoid +** resource leaks. It is a grievous error for the application to try to use +** a prepared statement after it has been finalized. Any use of a prepared +** statement after it has been finalized can result in undefined and +** undesirable behavior such as segfaults and heap corruption. +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Reset A Prepared Statement Object +** METHOD: sqlite3_stmt +** +** The sqlite3_reset() function is called to reset a [prepared statement] +** object back to its initial state, ready to be re-executed. +** ^Any SQL statement variables that had values bound to them using +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. +** Use [sqlite3_clear_bindings()] to reset the bindings. +** +** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S +** back to the beginning of its program. +** +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], +** or if [sqlite3_step(S)] has never before been called on S, +** then [sqlite3_reset(S)] returns [SQLITE_OK]. +** +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S indicated an error, then +** [sqlite3_reset(S)] returns an appropriate [error code]. +** +** ^The [sqlite3_reset(S)] interface does not change the values +** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. +*/ +SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Create Or Redefine SQL Functions +** KEYWORDS: {function creation routines} +** METHOD: sqlite3 +** +** ^These functions (collectively known as "function creation routines") +** are used to add SQL functions or aggregates or to redefine the behavior +** of existing SQL functions or aggregates. The only differences between +** the three "sqlite3_create_function*" routines are the text encoding +** expected for the second parameter (the name of the function being +** created) and the presence or absence of a destructor callback for +** the application data pointer. Function sqlite3_create_window_function() +** is similar, but allows the user to supply the extra callback functions +** needed by [aggregate window functions]. +** +** ^The first parameter is the [database connection] to which the SQL +** function is to be added. ^If an application uses more than one database +** connection then application-defined SQL functions must be added +** to each database connection separately. +** +** ^The second parameter is the name of the SQL function to be created or +** redefined. ^The length of the name is limited to 255 bytes in a UTF-8 +** representation, exclusive of the zero-terminator. ^Note that the name +** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. +** ^Any attempt to create a function with a longer name +** will result in [SQLITE_MISUSE] being returned. +** +** ^The third parameter (nArg) +** is the number of arguments that the SQL function or +** aggregate takes. ^If this parameter is -1, then the SQL function or +** aggregate may take any number of arguments between 0 and the limit +** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third +** parameter is less than -1 or greater than 127 then the behavior is +** undefined. +** +** ^The fourth parameter, eTextRep, specifies what +** [SQLITE_UTF8 | text encoding] this SQL function prefers for +** its parameters. The application should set this parameter to +** [SQLITE_UTF16LE] if the function implementation invokes +** [sqlite3_value_text16le()] on an input, or [SQLITE_UTF16BE] if the +** implementation invokes [sqlite3_value_text16be()] on an input, or +** [SQLITE_UTF16] if [sqlite3_value_text16()] is used, or [SQLITE_UTF8] +** otherwise. ^The same SQL function may be registered multiple times using +** different preferred text encodings, with different implementations for +** each encoding. +** ^When multiple implementations of the same function are available, SQLite +** will pick the one that involves the least amount of data conversion. +** +** ^The fourth parameter may optionally be ORed with [SQLITE_DETERMINISTIC] +** to signal that the function will always return the same result given +** the same inputs within a single SQL statement. Most SQL functions are +** deterministic. The built-in [random()] SQL function is an example of a +** function that is not deterministic. The SQLite query planner is able to +** perform additional optimizations on deterministic functions, so use +** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. +** +** ^The fourth parameter may also optionally include the [SQLITE_DIRECTONLY] +** flag, which if present prevents the function from being invoked from +** within VIEWs, TRIGGERs, CHECK constraints, generated column expressions, +** index expressions, or the WHERE clause of partial indexes. +** +** +** For best security, the [SQLITE_DIRECTONLY] flag is recommended for +** all application-defined SQL functions that do not need to be +** used inside of triggers, view, CHECK constraints, or other elements of +** the database schema. This flags is especially recommended for SQL +** functions that have side effects or reveal internal application state. +** Without this flag, an attacker might be able to modify the schema of +** a database file to include invocations of the function with parameters +** chosen by the attacker, which the application will then execute when +** the database file is opened and read. +** +** +** ^(The fifth parameter is an arbitrary pointer. The implementation of the +** function can gain access to this pointer using [sqlite3_user_data()].)^ +** +** ^The sixth, seventh and eighth parameters passed to the three +** "sqlite3_create_function*" functions, xFunc, xStep and xFinal, are +** pointers to C-language functions that implement the SQL function or +** aggregate. ^A scalar SQL function requires an implementation of the xFunc +** callback only; NULL pointers must be passed as the xStep and xFinal +** parameters. ^An aggregate SQL function requires an implementation of xStep +** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing +** SQL function or aggregate, pass NULL pointers for all three function +** callbacks. +** +** ^The sixth, seventh, eighth and ninth parameters (xStep, xFinal, xValue +** and xInverse) passed to sqlite3_create_window_function are pointers to +** C-language callbacks that implement the new function. xStep and xFinal +** must both be non-NULL. xValue and xInverse may either both be NULL, in +** which case a regular aggregate function is created, or must both be +** non-NULL, in which case the new function may be used as either an aggregate +** or aggregate window function. More details regarding the implementation +** of aggregate window functions are +** [user-defined window functions|available here]. +** +** ^(If the final parameter to sqlite3_create_function_v2() or +** sqlite3_create_window_function() is not NULL, then it is destructor for +** the application data pointer. The destructor is invoked when the function +** is deleted, either by being overloaded or when the database connection +** closes.)^ ^The destructor is also invoked if the call to +** sqlite3_create_function_v2() fails. ^When the destructor callback is +** invoked, it is passed a single argument which is a copy of the application +** data pointer which was the fifth parameter to sqlite3_create_function_v2(). +** +** ^It is permitted to register multiple implementations of the same +** functions with the same name but with either differing numbers of +** arguments or differing preferred text encodings. ^SQLite will use +** the implementation that most closely matches the way in which the +** SQL function is used. ^A function implementation with a non-negative +** nArg parameter is a better match than a function implementation with +** a negative nArg. ^A function where the preferred text encoding +** matches the database encoding is a better +** match than a function where the encoding is different. +** ^A function where the encoding difference is between UTF16le and UTF16be +** is a closer match than a function where the encoding difference is +** between UTF8 and UTF16. +** +** ^Built-in functions may be overloaded by new application-defined functions. +** +** ^An application-defined function is permitted to call other +** SQLite interfaces. However, such calls must not +** close the database connection nor finalize or reset the prepared +** statement in which the function is running. +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function_v2( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*) +); +SQLITE_API int sqlite3_create_window_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInverse)(sqlite3_context*,int,sqlite3_value**), + void(*xDestroy)(void*) +); + +/* +** CAPI3REF: Text Encodings +** +** These constant define integer codes that represent the various +** text encodings supported by SQLite. +*/ +#define SQLITE_UTF8 1 /* IMP: R-37514-35566 */ +#define SQLITE_UTF16LE 2 /* IMP: R-03371-37637 */ +#define SQLITE_UTF16BE 3 /* IMP: R-51971-34154 */ +#define SQLITE_UTF16 4 /* Use native byte order */ +#define SQLITE_ANY 5 /* Deprecated */ +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ + +/* +** CAPI3REF: Function Flags +** +** These constants may be ORed together with the +** [SQLITE_UTF8 | preferred text encoding] as the fourth argument +** to [sqlite3_create_function()], [sqlite3_create_function16()], or +** [sqlite3_create_function_v2()]. +** +**
+** [[SQLITE_DETERMINISTIC]]
SQLITE_DETERMINISTIC
+** The SQLITE_DETERMINISTIC flag means that the new function always gives +** the same output when the input parameters are the same. +** The [abs|abs() function] is deterministic, for example, but +** [randomblob|randomblob()] is not. Functions must +** be deterministic in order to be used in certain contexts such as +** with the WHERE clause of [partial indexes] or in [generated columns]. +** SQLite might also optimize deterministic functions by factoring them +** out of inner loops. +**
+** +** [[SQLITE_DIRECTONLY]]
SQLITE_DIRECTONLY
+** The SQLITE_DIRECTONLY flag means that the function may only be invoked +** from top-level SQL, and cannot be used in VIEWs or TRIGGERs nor in +** schema structures such as [CHECK constraints], [DEFAULT clauses], +** [expression indexes], [partial indexes], or [generated columns]. +** The SQLITE_DIRECTONLY flags is a security feature which is recommended +** for all [application-defined SQL functions], and especially for functions +** that have side-effects or that could potentially leak sensitive +** information. +**
+** +** [[SQLITE_INNOCUOUS]]
SQLITE_INNOCUOUS
+** The SQLITE_INNOCUOUS flag means that the function is unlikely +** to cause problems even if misused. An innocuous function should have +** no side effects and should not depend on any values other than its +** input parameters. The [abs|abs() function] is an example of an +** innocuous function. +** The [load_extension() SQL function] is not innocuous because of its +** side effects. +**

SQLITE_INNOCUOUS is similar to SQLITE_DETERMINISTIC, but is not +** exactly the same. The [random|random() function] is an example of a +** function that is innocuous but not deterministic. +**

Some heightened security settings +** ([SQLITE_DBCONFIG_TRUSTED_SCHEMA] and [PRAGMA trusted_schema=OFF]) +** disable the use of SQL functions inside views and triggers and in +** schema structures such as [CHECK constraints], [DEFAULT clauses], +** [expression indexes], [partial indexes], and [generated columns] unless +** the function is tagged with SQLITE_INNOCUOUS. Most built-in functions +** are innocuous. Developers are advised to avoid using the +** SQLITE_INNOCUOUS flag for application-defined functions unless the +** function has been carefully audited and found to be free of potentially +** security-adverse side-effects and information-leaks. +**

+** +** [[SQLITE_SUBTYPE]]
SQLITE_SUBTYPE
+** The SQLITE_SUBTYPE flag indicates to SQLite that a function may call +** [sqlite3_value_subtype()] to inspect the sub-types of its arguments. +** Specifying this flag makes no difference for scalar or aggregate user +** functions. However, if it is not specified for a user-defined window +** function, then any sub-types belonging to arguments passed to the window +** function may be discarded before the window function is called (i.e. +** sqlite3_value_subtype() will always return 0). +**
+**
+*/ +#define SQLITE_DETERMINISTIC 0x000000800 +#define SQLITE_DIRECTONLY 0x000080000 +#define SQLITE_SUBTYPE 0x000100000 +#define SQLITE_INNOCUOUS 0x000200000 + +/* +** CAPI3REF: Deprecated Functions +** DEPRECATED +** +** These functions are [deprecated]. In order to maintain +** backwards compatibility with older code, these functions continue +** to be supported. However, new applications should avoid +** the use of these functions. To encourage programmers to avoid +** these functions, we will not explain what they do. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); +SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); +SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int), + void*,sqlite3_int64); +#endif + +/* +** CAPI3REF: Obtaining SQL Values +** METHOD: sqlite3_value +** +** Summary: +**
+**
sqlite3_value_blobBLOB value +**
sqlite3_value_doubleREAL value +**
sqlite3_value_int32-bit INTEGER value +**
sqlite3_value_int6464-bit INTEGER value +**
sqlite3_value_pointerPointer value +**
sqlite3_value_textUTF-8 TEXT value +**
sqlite3_value_text16UTF-16 TEXT value in +** the native byteorder +**
sqlite3_value_text16beUTF-16be TEXT value +**
sqlite3_value_text16leUTF-16le TEXT value +**
    +**
sqlite3_value_bytesSize of a BLOB +** or a UTF-8 TEXT in bytes +**
sqlite3_value_bytes16   +** →  Size of UTF-16 +** TEXT in bytes +**
sqlite3_value_typeDefault +** datatype of the value +**
sqlite3_value_numeric_type   +** →  Best numeric datatype of the value +**
sqlite3_value_nochange   +** →  True if the column is unchanged in an UPDATE +** against a virtual table. +**
sqlite3_value_frombind   +** →  True if value originated from a [bound parameter] +**
+** +** Details: +** +** These routines extract type, size, and content information from +** [protected sqlite3_value] objects. Protected sqlite3_value objects +** are used to pass parameter information into the functions that +** implement [application-defined SQL functions] and [virtual tables]. +** +** These routines work only with [protected sqlite3_value] objects. +** Any attempt to use these routines on an [unprotected sqlite3_value] +** is not threadsafe. +** +** ^These routines work just like the corresponding [column access functions] +** except that these routines take a single [protected sqlite3_value] object +** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. +** +** ^The sqlite3_value_text16() interface extracts a UTF-16 string +** in the native byte-order of the host machine. ^The +** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces +** extract UTF-16 strings as big-endian and little-endian respectively. +** +** ^If [sqlite3_value] object V was initialized +** using [sqlite3_bind_pointer(S,I,P,X,D)] or [sqlite3_result_pointer(C,P,X,D)] +** and if X and Y are strings that compare equal according to strcmp(X,Y), +** then sqlite3_value_pointer(V,Y) will return the pointer P. ^Otherwise, +** sqlite3_value_pointer(V,Y) returns a NULL. The sqlite3_bind_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** +** ^(The sqlite3_value_type(V) interface returns the +** [SQLITE_INTEGER | datatype code] for the initial datatype of the +** [sqlite3_value] object V. The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL].)^ +** Other interfaces might change the datatype for an sqlite3_value object. +** For example, if the datatype is initially SQLITE_INTEGER and +** sqlite3_value_text(V) is called to extract a text value for that +** integer, then subsequent calls to sqlite3_value_type(V) might return +** SQLITE_TEXT. Whether or not a persistent internal datatype conversion +** occurs is undefined and may change from one release of SQLite to the next. +** +** ^(The sqlite3_value_numeric_type() interface attempts to apply +** numeric affinity to the value. This means that an attempt is +** made to convert the value to an integer or floating point. If +** such a conversion is possible without loss of information (in other +** words, if the value is a string that looks like a number) +** then the conversion is performed. Otherwise no conversion occurs. +** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ +** +** ^Within the [xUpdate] method of a [virtual table], the +** sqlite3_value_nochange(X) interface returns true if and only if +** the column corresponding to X is unchanged by the UPDATE operation +** that the xUpdate method call was invoked to implement and if +** and the prior [xColumn] method call that was invoked to extracted +** the value for that column returned without setting a result (probably +** because it queried [sqlite3_vtab_nochange()] and found that the column +** was unchanging). ^Within an [xUpdate] method, any value for which +** sqlite3_value_nochange(X) is true will in all other respects appear +** to be a NULL value. If sqlite3_value_nochange(X) is invoked anywhere other +** than within an [xUpdate] method call for an UPDATE statement, then +** the return value is arbitrary and meaningless. +** +** ^The sqlite3_value_frombind(X) interface returns non-zero if the +** value X originated from one of the [sqlite3_bind_int|sqlite3_bind()] +** interfaces. ^If X comes from an SQL literal value, or a table column, +** or an expression, then sqlite3_value_frombind(X) returns zero. +** +** Please pay particular attention to the fact that the pointer returned +** from [sqlite3_value_blob()], [sqlite3_value_text()], or +** [sqlite3_value_text16()] can be invalidated by a subsequent call to +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], +** or [sqlite3_value_text16()]. +** +** These routines must be called from the same thread as +** the SQL function that supplied the [sqlite3_value*] parameters. +** +** As long as the input parameter is correct, these routines can only +** fail if an out-of-memory error occurs during a format conversion. +** Only the following subset of interfaces are subject to out-of-memory +** errors: +** +**
    +**
  • sqlite3_value_blob() +**
  • sqlite3_value_text() +**
  • sqlite3_value_text16() +**
  • sqlite3_value_text16le() +**
  • sqlite3_value_text16be() +**
  • sqlite3_value_bytes() +**
  • sqlite3_value_bytes16() +**
+** +** If an out-of-memory error occurs, then the return value from these +** routines is the same as if the column had contained an SQL NULL value. +** Valid SQL NULL returns can be distinguished from out-of-memory errors +** by invoking the [sqlite3_errcode()] immediately after the suspect +** return value is obtained and before any +** other SQLite interface is called on the same [database connection]. +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); +SQLITE_API double sqlite3_value_double(sqlite3_value*); +SQLITE_API int sqlite3_value_int(sqlite3_value*); +SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +SQLITE_API void *sqlite3_value_pointer(sqlite3_value*, const char*); +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); +SQLITE_API int sqlite3_value_type(sqlite3_value*); +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); +SQLITE_API int sqlite3_value_nochange(sqlite3_value*); +SQLITE_API int sqlite3_value_frombind(sqlite3_value*); + +/* +** CAPI3REF: Finding The Subtype Of SQL Values +** METHOD: sqlite3_value +** +** The sqlite3_value_subtype(V) function returns the subtype for +** an [application-defined SQL function] argument V. The subtype +** information can be used to pass a limited amount of context from +** one SQL function to another. Use the [sqlite3_result_subtype()] +** routine to set the subtype for the return value of an SQL function. +*/ +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); + +/* +** CAPI3REF: Copy And Free SQL Values +** METHOD: sqlite3_value +** +** ^The sqlite3_value_dup(V) interface makes a copy of the [sqlite3_value] +** object D and returns a pointer to that copy. ^The [sqlite3_value] returned +** is a [protected sqlite3_value] object even if the input is not. +** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a +** memory allocation fails. +** +** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object +** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer +** then sqlite3_value_free(V) is a harmless no-op. +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value*); +SQLITE_API void sqlite3_value_free(sqlite3_value*); + +/* +** CAPI3REF: Obtain Aggregate Function Context +** METHOD: sqlite3_context +** +** Implementations of aggregate SQL functions use this +** routine to allocate memory for storing their state. +** +** ^The first time the sqlite3_aggregate_context(C,N) routine is called +** for a particular aggregate function, SQLite allocates +** N bytes of memory, zeroes out that memory, and returns a pointer +** to the new memory. ^On second and subsequent calls to +** sqlite3_aggregate_context() for the same aggregate function instance, +** the same buffer is returned. Sqlite3_aggregate_context() is normally +** called once for each invocation of the xStep callback and then one +** last time when the xFinal callback is invoked. ^(When no rows match +** an aggregate query, the xStep() callback of the aggregate function +** implementation is never called and xFinal() is called exactly once. +** In those cases, sqlite3_aggregate_context() might be called for the +** first time from within xFinal().)^ +** +** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer +** when first called if N is less than or equal to zero or if a memory +** allocate error occurs. +** +** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is +** determined by the N parameter on first successful call. Changing the +** value of N in any subsequent call to sqlite3_aggregate_context() within +** the same aggregate function instance will not resize the memory +** allocation.)^ Within the xFinal callback, it is customary to set +** N=0 in calls to sqlite3_aggregate_context(C,N) so that no +** pointless memory allocations occur. +** +** ^SQLite automatically frees the memory allocated by +** sqlite3_aggregate_context() when the aggregate query concludes. +** +** The first parameter must be a copy of the +** [sqlite3_context | SQL function context] that is the first parameter +** to the xStep or xFinal callback routine that implements the aggregate +** function. +** +** This routine must be called from the same thread in which +** the aggregate SQL function is running. +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); + +/* +** CAPI3REF: User Data For Functions +** METHOD: sqlite3_context +** +** ^The sqlite3_user_data() interface returns a copy of +** the pointer that was the pUserData parameter (the 5th parameter) +** of the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. +** +** This routine must be called from the same thread in which +** the application-defined function is running. +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context*); + +/* +** CAPI3REF: Database Connection For Functions +** METHOD: sqlite3_context +** +** ^The sqlite3_context_db_handle() interface returns a copy of +** the pointer to the [database connection] (the 1st parameter) +** of the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); + +/* +** CAPI3REF: Function Auxiliary Data +** METHOD: sqlite3_context +** +** These functions may be used by (non-aggregate) SQL functions to +** associate metadata with argument values. If the same value is passed to +** multiple invocations of the same SQL function during query execution, under +** some circumstances the associated metadata may be preserved. An example +** of where this might be useful is in a regular-expression matching +** function. The compiled version of the regular expression can be stored as +** metadata associated with the pattern string. +** Then as long as the pattern string remains the same, +** the compiled regular expression can be reused on multiple +** invocations of the same function. +** +** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the metadata +** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument +** value to the application-defined function. ^N is zero for the left-most +** function argument. ^If there is no metadata +** associated with the function argument, the sqlite3_get_auxdata(C,N) interface +** returns a NULL pointer. +** +** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th +** argument of the application-defined function. ^Subsequent +** calls to sqlite3_get_auxdata(C,N) return P from the most recent +** sqlite3_set_auxdata(C,N,P,X) call if the metadata is still valid or +** NULL if the metadata has been discarded. +** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, +** SQLite will invoke the destructor function X with parameter P exactly +** once, when the metadata is discarded. +** SQLite is free to discard the metadata at any time, including:
    +**
  • ^(when the corresponding function parameter changes)^, or +**
  • ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the +** SQL statement)^, or +**
  • ^(when sqlite3_set_auxdata() is invoked again on the same +** parameter)^, or +**
  • ^(during the original sqlite3_set_auxdata() call when a memory +** allocation error occurs.)^
+** +** Note the last bullet in particular. The destructor X in +** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the +** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata() +** should be called near the end of the function implementation and the +** function implementation should not make any use of P after +** sqlite3_set_auxdata() has been called. +** +** ^(In practice, metadata is preserved between function calls for +** function parameters that are compile-time constants, including literal +** values and [parameters] and expressions composed from the same.)^ +** +** The value of the N parameter to these interfaces should be non-negative. +** Future enhancements may make use of negative N values to define new +** kinds of function caching behavior. +** +** These routines must be called from the same thread in which +** the SQL function is running. +*/ +SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); +SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); + + +/* +** CAPI3REF: Constants Defining Special Destructor Behavior +** +** These are special values for the destructor that is passed in as the +** final argument to routines like [sqlite3_result_blob()]. ^If the destructor +** argument is SQLITE_STATIC, it means that the content pointer is constant +** and will never change. It does not need to be destroyed. ^The +** SQLITE_TRANSIENT value means that the content will likely change in +** the near future and that SQLite should make its own private copy of +** the content before returning. +** +** The typedef is necessary to work around problems in certain +** C++ compilers. +*/ +typedef void (*sqlite3_destructor_type)(void*); +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) + +/* +** CAPI3REF: Setting The Result Of An SQL Function +** METHOD: sqlite3_context +** +** These routines are used by the xFunc or xFinal callbacks that +** implement SQL functions and aggregates. See +** [sqlite3_create_function()] and [sqlite3_create_function16()] +** for additional information. +** +** These functions work very much like the [parameter binding] family of +** functions used to bind values to host parameters in prepared statements. +** Refer to the [SQL parameter] documentation for additional information. +** +** ^The sqlite3_result_blob() interface sets the result from +** an application-defined function to be the BLOB whose content is pointed +** to by the second parameter and which is N bytes long where N is the +** third parameter. +** +** ^The sqlite3_result_zeroblob(C,N) and sqlite3_result_zeroblob64(C,N) +** interfaces set the result of the application-defined function to be +** a BLOB containing all zero bytes and N bytes in size. +** +** ^The sqlite3_result_double() interface sets the result from +** an application-defined function to be a floating point value specified +** by its 2nd argument. +** +** ^The sqlite3_result_error() and sqlite3_result_error16() functions +** cause the implemented SQL function to throw an exception. +** ^SQLite uses the string pointed to by the +** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() +** as the text of an error message. ^SQLite interprets the error +** message string from sqlite3_result_error() as UTF-8. ^SQLite +** interprets the string from sqlite3_result_error16() as UTF-16 using +** the same [byte-order determination rules] as [sqlite3_bind_text16()]. +** ^If the third parameter to sqlite3_result_error() +** or sqlite3_result_error16() is negative then SQLite takes as the error +** message all text up through the first zero character. +** ^If the third parameter to sqlite3_result_error() or +** sqlite3_result_error16() is non-negative then SQLite takes that many +** bytes (not characters) from the 2nd parameter as the error message. +** ^The sqlite3_result_error() and sqlite3_result_error16() +** routines make a private copy of the error message text before +** they return. Hence, the calling function can deallocate or +** modify the text after they return without harm. +** ^The sqlite3_result_error_code() function changes the error code +** returned by SQLite as a result of an error in a function. ^By default, +** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error() +** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. +** +** ^The sqlite3_result_error_toobig() interface causes SQLite to throw an +** error indicating that a string or BLOB is too long to represent. +** +** ^The sqlite3_result_error_nomem() interface causes SQLite to throw an +** error indicating that a memory allocation failed. +** +** ^The sqlite3_result_int() interface sets the return value +** of the application-defined function to be the 32-bit signed integer +** value given in the 2nd argument. +** ^The sqlite3_result_int64() interface sets the return value +** of the application-defined function to be the 64-bit signed integer +** value given in the 2nd argument. +** +** ^The sqlite3_result_null() interface sets the return value +** of the application-defined function to be NULL. +** +** ^The sqlite3_result_text(), sqlite3_result_text16(), +** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces +** set the return value of the application-defined function to be +** a text string which is represented as UTF-8, UTF-16 native byte order, +** UTF-16 little endian, or UTF-16 big endian, respectively. +** ^The sqlite3_result_text64() interface sets the return value of an +** application-defined function to be a text string in an encoding +** specified by the fifth (and last) parameter, which must be one +** of [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE]. +** ^SQLite takes the text result from the application from +** the 2nd parameter of the sqlite3_result_text* interfaces. +** ^If the 3rd parameter to the sqlite3_result_text* interfaces +** is negative, then SQLite takes result text from the 2nd parameter +** through the first zero character. +** ^If the 3rd parameter to the sqlite3_result_text* interfaces +** is non-negative, then as many bytes (not characters) of the text +** pointed to by the 2nd parameter are taken as the application-defined +** function result. If the 3rd parameter is non-negative, then it +** must be the byte offset into the string where the NUL terminator would +** appear if the string where NUL terminated. If any NUL characters occur +** in the string at a byte offset that is less than the value of the 3rd +** parameter, then the resulting string will contain embedded NULs and the +** result of expressions operating on strings with embedded NULs is undefined. +** ^If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that +** function as the destructor on the text or BLOB result when it has +** finished using that result. +** ^If the 4th parameter to the sqlite3_result_text* interfaces or to +** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite +** assumes that the text or BLOB result is in constant space and does not +** copy the content of the parameter nor call a destructor on the content +** when it has finished using that result. +** ^If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT +** then SQLite makes a copy of the result into space obtained +** from [sqlite3_malloc()] before it returns. +** +** ^For the sqlite3_result_text16(), sqlite3_result_text16le(), and +** sqlite3_result_text16be() routines, and for sqlite3_result_text64() +** when the encoding is not UTF8, if the input UTF16 begins with a +** byte-order mark (BOM, U+FEFF) then the BOM is removed from the +** string and the rest of the string is interpreted according to the +** byte-order specified by the BOM. ^The byte-order specified by +** the BOM at the beginning of the text overrides the byte-order +** specified by the interface procedure. ^So, for example, if +** sqlite3_result_text16le() is invoked with text that begins +** with bytes 0xfe, 0xff (a big-endian byte-order mark) then the +** first two bytes of input are skipped and the remaining input +** is interpreted as UTF16BE text. +** +** ^For UTF16 input text to the sqlite3_result_text16(), +** sqlite3_result_text16be(), sqlite3_result_text16le(), and +** sqlite3_result_text64() routines, if the text contains invalid +** UTF16 characters, the invalid characters might be converted +** into the unicode replacement character, U+FFFD. +** +** ^The sqlite3_result_value() interface sets the result of +** the application-defined function to be a copy of the +** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The +** sqlite3_result_value() interface makes a copy of the [sqlite3_value] +** so that the [sqlite3_value] specified in the parameter may change or +** be deallocated after sqlite3_result_value() returns without harm. +** ^A [protected sqlite3_value] object may always be used where an +** [unprotected sqlite3_value] object is required, so either +** kind of [sqlite3_value] object can be used with this interface. +** +** ^The sqlite3_result_pointer(C,P,T,D) interface sets the result to an +** SQL NULL value, just like [sqlite3_result_null(C)], except that it +** also associates the host-language pointer P or type T with that +** NULL value such that the pointer can be retrieved within an +** [application-defined SQL function] using [sqlite3_value_pointer()]. +** ^If the D parameter is not NULL, then it is a pointer to a destructor +** for the P parameter. ^SQLite invokes D with P as its only argument +** when SQLite is finished with P. The T parameter should be a static +** string and preferably a string literal. The sqlite3_result_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** +** If these routines are called from within the different thread +** than the one containing the application-defined function that received +** the [sqlite3_context] pointer, the results are undefined. +*/ +SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_blob64(sqlite3_context*,const void*, + sqlite3_uint64,void(*)(void*)); +SQLITE_API void sqlite3_result_double(sqlite3_context*, double); +SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); +SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); +SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); +SQLITE_API void sqlite3_result_null(sqlite3_context*); +SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text64(sqlite3_context*, const char*,sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +SQLITE_API void sqlite3_result_pointer(sqlite3_context*, void*,const char*,void(*)(void*)); +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); + + +/* +** CAPI3REF: Setting The Subtype Of An SQL Function +** METHOD: sqlite3_context +** +** The sqlite3_result_subtype(C,T) function causes the subtype of +** the result from the [application-defined SQL function] with +** [sqlite3_context] C to be the value T. Only the lower 8 bits +** of the subtype T are preserved in current versions of SQLite; +** higher order bits are discarded. +** The number of subtype bytes preserved by SQLite might increase +** in future releases of SQLite. +*/ +SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); + +/* +** CAPI3REF: Define New Collating Sequences +** METHOD: sqlite3 +** +** ^These functions add, remove, or modify a [collation] associated +** with the [database connection] specified as the first argument. +** +** ^The name of the collation is a UTF-8 string +** for sqlite3_create_collation() and sqlite3_create_collation_v2() +** and a UTF-16 string in native byte order for sqlite3_create_collation16(). +** ^Collation names that compare equal according to [sqlite3_strnicmp()] are +** considered to be the same name. +** +** ^(The third argument (eTextRep) must be one of the constants: +**
    +**
  • [SQLITE_UTF8], +**
  • [SQLITE_UTF16LE], +**
  • [SQLITE_UTF16BE], +**
  • [SQLITE_UTF16], or +**
  • [SQLITE_UTF16_ALIGNED]. +**
)^ +** ^The eTextRep argument determines the encoding of strings passed +** to the collating function callback, xCompare. +** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep +** force strings to be UTF16 with native byte order. +** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin +** on an even byte address. +** +** ^The fourth argument, pArg, is an application data pointer that is passed +** through as the first argument to the collating function callback. +** +** ^The fifth argument, xCompare, is a pointer to the collating function. +** ^Multiple collating functions can be registered using the same name but +** with different eTextRep parameters and SQLite will use whichever +** function requires the least amount of data transformation. +** ^If the xCompare argument is NULL then the collating function is +** deleted. ^When all collating functions having the same name are deleted, +** that collation is no longer usable. +** +** ^The collating function callback is invoked with a copy of the pArg +** application data pointer and with two strings in the encoding specified +** by the eTextRep argument. The two integer parameters to the collating +** function callback are the length of the two strings, in bytes. The collating +** function must return an integer that is negative, zero, or positive +** if the first string is less than, equal to, or greater than the second, +** respectively. A collating function must always return the same answer +** given the same inputs. If two or more collating functions are registered +** to the same collation name (using different eTextRep values) then all +** must give an equivalent answer when invoked with equivalent strings. +** The collating function must obey the following properties for all +** strings A, B, and C: +** +**
    +**
  1. If A==B then B==A. +**
  2. If A==B and B==C then A==C. +**
  3. If A<B THEN B>A. +**
  4. If A<B and B<C then A<C. +**
+** +** If a collating function fails any of the above constraints and that +** collating function is registered and used, then the behavior of SQLite +** is undefined. +** +** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** with the addition that the xDestroy callback is invoked on pArg when +** the collating function is deleted. +** ^Collating functions are deleted when they are overridden by later +** calls to the collation creation functions or when the +** [database connection] is closed using [sqlite3_close()]. +** +** ^The xDestroy callback is not called if the +** sqlite3_create_collation_v2() function fails. Applications that invoke +** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should +** check the return code and dispose of the application data pointer +** themselves rather than expecting SQLite to deal with it for them. +** This is different from every other SQLite interface. The inconsistency +** is unfortunate but cannot be changed without breaking backwards +** compatibility. +** +** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. +*/ +SQLITE_API int sqlite3_create_collation( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); +SQLITE_API int sqlite3_create_collation_v2( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDestroy)(void*) +); +SQLITE_API int sqlite3_create_collation16( + sqlite3*, + const void *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); + +/* +** CAPI3REF: Collation Needed Callbacks +** METHOD: sqlite3 +** +** ^To avoid having to register all collation sequences before a database +** can be used, a single callback function may be registered with the +** [database connection] to be invoked whenever an undefined collation +** sequence is required. +** +** ^If the function is registered using the sqlite3_collation_needed() API, +** then it is passed the names of undefined collation sequences as strings +** encoded in UTF-8. ^If sqlite3_collation_needed16() is used, +** the names are passed as UTF-16 in machine native byte order. +** ^A call to either function replaces the existing collation-needed callback. +** +** ^(When the callback is invoked, the first argument passed is a copy +** of the second argument to sqlite3_collation_needed() or +** sqlite3_collation_needed16(). The second argument is the database +** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], +** or [SQLITE_UTF16LE], indicating the most desirable form of the collation +** sequence function required. The fourth parameter is the name of the +** required collation sequence.)^ +** +** The callback function should register the desired collation using +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or +** [sqlite3_create_collation_v2()]. +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const char*) +); +SQLITE_API int sqlite3_collation_needed16( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const void*) +); + +#ifdef SQLITE_ENABLE_CEROD +/* +** Specify the activation key for a CEROD database. Unless +** activated, none of the CEROD routines will work. +*/ +SQLITE_API void sqlite3_activate_cerod( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +/* +** CAPI3REF: Suspend Execution For A Short Time +** +** The sqlite3_sleep() function causes the current thread to suspend execution +** for at least a number of milliseconds specified in its parameter. +** +** If the operating system does not support sleep requests with +** millisecond time resolution, then the time will be rounded up to +** the nearest second. The number of milliseconds of sleep actually +** requested from the operating system is returned. +** +** ^SQLite implements this interface by calling the xSleep() +** method of the default [sqlite3_vfs] object. If the xSleep() method +** of the default VFS is not implemented correctly, or not implemented at +** all, then the behavior of sqlite3_sleep() may deviate from the description +** in the previous paragraphs. +*/ +SQLITE_API int sqlite3_sleep(int); + +/* +** CAPI3REF: Name Of The Folder Holding Temporary Files +** +** ^(If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all temporary files +** created by SQLite when using a built-in [sqlite3_vfs | VFS] +** will be placed in that directory.)^ ^If this variable +** is a NULL pointer, then SQLite performs a search for an appropriate +** temporary file directory. +** +** Applications are strongly discouraged from using this global variable. +** It is required to set a temporary folder on Windows Runtime (WinRT). +** But for all other platforms, it is highly recommended that applications +** neither read nor write this variable. This global variable is a relic +** that exists for backwards compatibility of legacy applications and should +** be avoided in new projects. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** ^The [temp_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, +** the [temp_store_directory pragma] always assumes that any string +** that this variable points to is held in memory obtained from +** [sqlite3_malloc] and the pragma may attempt to free that memory +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [temp_store_directory pragma] should be avoided. +** Except when requested by the [temp_store_directory pragma], SQLite +** does not free the memory that sqlite3_temp_directory points to. If +** the application wants that memory to be freed, it must do +** so itself, taking care to only do so after all [database connection] +** objects have been destroyed. +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling [sqlite3_open] or [sqlite3_open_v2]. Otherwise, various +** features that require the use of temporary files may fail. Here is an +** example of how to do this using C++ with the Windows Runtime: +** +**
+** LPCWSTR zPath = Windows::Storage::ApplicationData::Current->
+**       TemporaryFolder->Path->Data();
+** char zPathBuf[MAX_PATH + 1];
+** memset(zPathBuf, 0, sizeof(zPathBuf));
+** WideCharToMultiByte(CP_UTF8, 0, zPath, -1, zPathBuf, sizeof(zPathBuf),
+**       NULL, NULL);
+** sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
+** 
+*/ +SQLITE_API char *sqlite3_temp_directory; + +/* +** CAPI3REF: Name Of The Folder Holding Database Files +** +** ^(If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all database files +** specified with a relative pathname and created or accessed by +** SQLite when using a built-in windows [sqlite3_vfs | VFS] will be assumed +** to be relative to that directory.)^ ^If this variable is a NULL +** pointer, then SQLite assumes that all database files specified +** with a relative pathname are relative to the current directory +** for the process. Only the windows VFS makes use of this global +** variable; it is ignored by the unix VFS. +** +** Changing the value of this variable while a database connection is +** open can result in a corrupt database. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** ^The [data_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, +** the [data_store_directory pragma] always assumes that any string +** that this variable points to is held in memory obtained from +** [sqlite3_malloc] and the pragma may attempt to free that memory +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [data_store_directory pragma] should be avoided. +*/ +SQLITE_API char *sqlite3_data_directory; + +/* +** CAPI3REF: Win32 Specific Interface +** +** These interfaces are available only on Windows. The +** [sqlite3_win32_set_directory] interface is used to set the value associated +** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to +** zValue, depending on the value of the type parameter. The zValue parameter +** should be NULL to cause the previous value to be freed via [sqlite3_free]; +** a non-NULL value will be copied into memory obtained from [sqlite3_malloc] +** prior to being used. The [sqlite3_win32_set_directory] interface returns +** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported, +** or [SQLITE_NOMEM] if memory could not be allocated. The value of the +** [sqlite3_data_directory] variable is intended to act as a replacement for +** the current directory on the sub-platforms of Win32 where that concept is +** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and +** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the +** sqlite3_win32_set_directory interface except the string parameter must be +** UTF-8 or UTF-16, respectively. +*/ +SQLITE_API int sqlite3_win32_set_directory( + unsigned long type, /* Identifier for directory being set or reset */ + void *zValue /* New value for directory being set or reset */ +); +SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue); +SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue); + +/* +** CAPI3REF: Win32 Directory Types +** +** These macros are only available on Windows. They define the allowed values +** for the type argument to the [sqlite3_win32_set_directory] interface. +*/ +#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1 +#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2 + +/* +** CAPI3REF: Test For Auto-Commit Mode +** KEYWORDS: {autocommit mode} +** METHOD: sqlite3 +** +** ^The sqlite3_get_autocommit() interface returns non-zero or +** zero if the given database connection is or is not in autocommit mode, +** respectively. ^Autocommit mode is on by default. +** ^Autocommit mode is disabled by a [BEGIN] statement. +** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. +** +** If certain kinds of errors occur on a statement within a multi-statement +** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], +** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the +** transaction might be rolled back automatically. The only way to +** find out whether SQLite automatically rolled back the transaction after +** an error is to use this function. +** +** If another thread changes the autocommit status of the database +** connection while this routine is running, then the return value +** is undefined. +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3*); + +/* +** CAPI3REF: Find The Database Handle Of A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^The sqlite3_db_handle interface returns the [database connection] handle +** to which a [prepared statement] belongs. ^The [database connection] +** returned by sqlite3_db_handle is the same [database connection] +** that was the first argument +** to the [sqlite3_prepare_v2()] call (or its variants) that was used to +** create the statement in the first place. +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); + +/* +** CAPI3REF: Return The Filename For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_filename(D,N) interface returns a pointer to the filename +** associated with database N of connection D. +** ^If there is no attached database N on the database +** connection D, or if database N is a temporary or in-memory database, then +** this function will return either a NULL pointer or an empty string. +** +** ^The string value returned by this routine is owned and managed by +** the database connection. ^The value will be valid until the database N +** is [DETACH]-ed or until the database connection closes. +** +** ^The filename returned by this function is the output of the +** xFullPathname method of the [VFS]. ^In other words, the filename +** will be an absolute pathname, even if the filename used +** to open the database originally was a URI or relative pathname. +** +** If the filename pointer returned by this routine is not NULL, then it +** can be used as the filename input parameter to these routines: +**
    +**
  • [sqlite3_uri_parameter()] +**
  • [sqlite3_uri_boolean()] +**
  • [sqlite3_uri_int64()] +**
  • [sqlite3_filename_database()] +**
  • [sqlite3_filename_journal()] +**
  • [sqlite3_filename_wal()] +**
+*/ +SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Determine if a database is read-only +** METHOD: sqlite3 +** +** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N +** of connection D is read-only, 0 if it is read/write, or -1 if N is not +** the name of a database on connection D. +*/ +SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Find the next prepared statement +** METHOD: sqlite3 +** +** ^This interface returns a pointer to the next [prepared statement] after +** pStmt associated with the [database connection] pDb. ^If pStmt is NULL +** then this interface returns a pointer to the first prepared statement +** associated with the database connection pDb. ^If no prepared statement +** satisfies the conditions of this routine, it returns NULL. +** +** The [database connection] pointer D in a call to +** [sqlite3_next_stmt(D,S)] must refer to an open database +** connection and in particular must not be a NULL pointer. +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Commit And Rollback Notification Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_commit_hook() interface registers a callback +** function to be invoked whenever a transaction is [COMMIT | committed]. +** ^Any callback set by a previous call to sqlite3_commit_hook() +** for the same database connection is overridden. +** ^The sqlite3_rollback_hook() interface registers a callback +** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. +** ^Any callback set by a previous call to sqlite3_rollback_hook() +** for the same database connection is overridden. +** ^The pArg argument is passed through to the callback. +** ^If the callback on a commit hook function returns non-zero, +** then the commit is converted into a rollback. +** +** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions +** return the P argument from the previous call of the same function +** on the same [database connection] D, or NULL for +** the first call for each function on D. +** +** The commit and rollback hook callbacks are not reentrant. +** The callback implementation must not do anything that will modify +** the database connection that invoked the callback. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the commit +** or rollback hook in the first place. +** Note that running any other SQL statements, including SELECT statements, +** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify +** the database connections for the meaning of "modify" in this paragraph. +** +** ^Registering a NULL function disables the callback. +** +** ^When the commit hook callback routine returns zero, the [COMMIT] +** operation is allowed to continue normally. ^If the commit hook +** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. +** ^The rollback hook is invoked on a rollback that results from a commit +** hook returning non-zero, just as it would be with any other rollback. +** +** ^For the purposes of this API, a transaction is said to have been +** rolled back if an explicit "ROLLBACK" statement is executed, or +** an error or constraint causes an implicit rollback to occur. +** ^The rollback callback is not invoked if a transaction is +** automatically rolled back because the database connection is closed. +** +** See also the [sqlite3_update_hook()] interface. +*/ +SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); +SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); + +/* +** CAPI3REF: Data Change Notification Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_update_hook() interface registers a callback function +** with the [database connection] identified by the first argument +** to be invoked whenever a row is updated, inserted or deleted in +** a [rowid table]. +** ^Any callback set by a previous call to this function +** for the same database connection is overridden. +** +** ^The second argument is a pointer to the function to invoke when a +** row is updated, inserted or deleted in a rowid table. +** ^The first argument to the callback is a copy of the third argument +** to sqlite3_update_hook(). +** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], +** or [SQLITE_UPDATE], depending on the operation that caused the callback +** to be invoked. +** ^The third and fourth arguments to the callback contain pointers to the +** database and table name containing the affected row. +** ^The final callback parameter is the [rowid] of the row. +** ^In the case of an update, this is the [rowid] after the update takes place. +** +** ^(The update hook is not invoked when internal system tables are +** modified (i.e. sqlite_master and sqlite_sequence).)^ +** ^The update hook is not invoked when [WITHOUT ROWID] tables are modified. +** +** ^In the current implementation, the update hook +** is not invoked when conflicting rows are deleted because of an +** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook +** invoked when rows are deleted using the [truncate optimization]. +** The exceptions defined in this paragraph might change in a future +** release of SQLite. +** +** The update hook implementation must not do anything that will modify +** the database connection that invoked the update hook. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the update hook. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^The sqlite3_update_hook(D,C,P) function +** returns the P argument from the previous call +** on the same [database connection] D, or NULL for +** the first call on D. +** +** See also the [sqlite3_commit_hook()], [sqlite3_rollback_hook()], +** and [sqlite3_preupdate_hook()] interfaces. +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3*, + void(*)(void *,int ,char const *,char const *,sqlite3_int64), + void* +); + +/* +** CAPI3REF: Enable Or Disable Shared Pager Cache +** +** ^(This routine enables or disables the sharing of the database cache +** and schema data structures between [database connection | connections] +** to the same database. Sharing is enabled if the argument is true +** and disabled if the argument is false.)^ +** +** ^Cache sharing is enabled and disabled for an entire process. +** This is a change as of SQLite [version 3.5.0] ([dateof:3.5.0]). +** In prior versions of SQLite, +** sharing was enabled or disabled for each thread separately. +** +** ^(The cache sharing mode set by this interface effects all subsequent +** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. +** Existing database connections continue to use the sharing mode +** that was in effect at the time they were opened.)^ +** +** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled +** successfully. An [error code] is returned otherwise.)^ +** +** ^Shared cache is disabled by default. It is recommended that it stay +** that way. In other words, do not use this routine. This interface +** continues to be provided for historical compatibility, but its use is +** discouraged. Any use of shared cache is discouraged. If shared cache +** must be used, it is recommended that shared cache only be enabled for +** individual database connections using the [sqlite3_open_v2()] interface +** with the [SQLITE_OPEN_SHAREDCACHE] flag. +** +** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 +** and will always return SQLITE_MISUSE. On those systems, +** shared cache mode should be enabled per-database connection via +** [sqlite3_open_v2()] with [SQLITE_OPEN_SHAREDCACHE]. +** +** This interface is threadsafe on processors where writing a +** 32-bit integer is atomic. +** +** See Also: [SQLite Shared-Cache Mode] +*/ +SQLITE_API int sqlite3_enable_shared_cache(int); + +/* +** CAPI3REF: Attempt To Free Heap Memory +** +** ^The sqlite3_release_memory() interface attempts to free N bytes +** of heap memory by deallocating non-essential memory allocations +** held by the database library. Memory used to cache database +** pages to improve performance is an example of non-essential memory. +** ^sqlite3_release_memory() returns the number of bytes actually freed, +** which might be more or less than the amount requested. +** ^The sqlite3_release_memory() routine is a no-op returning zero +** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** See also: [sqlite3_db_release_memory()] +*/ +SQLITE_API int sqlite3_release_memory(int); + +/* +** CAPI3REF: Free Memory Used By A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap +** memory as possible from database connection D. Unlike the +** [sqlite3_release_memory()] interface, this interface is in effect even +** when the [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is +** omitted. +** +** See also: [sqlite3_release_memory()] +*/ +SQLITE_API int sqlite3_db_release_memory(sqlite3*); + +/* +** CAPI3REF: Impose A Limit On Heap Size +** +** These interfaces impose limits on the amount of heap memory that will be +** by all database connections within a single process. +** +** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the +** soft limit on the amount of heap memory that may be allocated by SQLite. +** ^SQLite strives to keep heap memory utilization below the soft heap +** limit by reducing the number of pages held in the page cache +** as heap memory usages approaches the limit. +** ^The soft heap limit is "soft" because even though SQLite strives to stay +** below the limit, it will exceed the limit rather than generate +** an [SQLITE_NOMEM] error. In other words, the soft heap limit +** is advisory only. +** +** ^The sqlite3_hard_heap_limit64(N) interface sets a hard upper bound of +** N bytes on the amount of memory that will be allocated. ^The +** sqlite3_hard_heap_limit64(N) interface is similar to +** sqlite3_soft_heap_limit64(N) except that memory allocations will fail +** when the hard heap limit is reached. +** +** ^The return value from both sqlite3_soft_heap_limit64() and +** sqlite3_hard_heap_limit64() is the size of +** the heap limit prior to the call, or negative in the case of an +** error. ^If the argument N is negative +** then no change is made to the heap limit. Hence, the current +** size of heap limits can be determined by invoking +** sqlite3_soft_heap_limit64(-1) or sqlite3_hard_heap_limit(-1). +** +** ^Setting the heap limits to zero disables the heap limiter mechanism. +** +** ^The soft heap limit may not be greater than the hard heap limit. +** ^If the hard heap limit is enabled and if sqlite3_soft_heap_limit(N) +** is invoked with a value of N that is greater than the hard heap limit, +** the the soft heap limit is set to the value of the hard heap limit. +** ^The soft heap limit is automatically enabled whenever the hard heap +** limit is enabled. ^When sqlite3_hard_heap_limit64(N) is invoked and +** the soft heap limit is outside the range of 1..N, then the soft heap +** limit is set to N. ^Invoking sqlite3_soft_heap_limit64(0) when the +** hard heap limit is enabled makes the soft heap limit equal to the +** hard heap limit. +** +** The memory allocation limits can also be adjusted using +** [PRAGMA soft_heap_limit] and [PRAGMA hard_heap_limit]. +** +** ^(The heap limits are not enforced in the current implementation +** if one or more of following conditions are true: +** +**
    +**
  • The limit value is set to zero. +**
  • Memory accounting is disabled using a combination of the +** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and +** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. +**
  • An alternative page cache implementation is specified using +** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). +**
  • The page cache allocates from its own memory pool supplied +** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than +** from the heap. +**
)^ +** +** The circumstances under which SQLite will enforce the heap limits may +** changes in future releases of SQLite. +*/ +SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); +SQLITE_API sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 N); + +/* +** CAPI3REF: Deprecated Soft Heap Limit Interface +** DEPRECATED +** +** This is a deprecated version of the [sqlite3_soft_heap_limit64()] +** interface. This routine is provided for historical compatibility +** only. All new applications should use the +** [sqlite3_soft_heap_limit64()] interface rather than this one. +*/ +SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); + + +/* +** CAPI3REF: Extract Metadata About A Column Of A Table +** METHOD: sqlite3 +** +** ^(The sqlite3_table_column_metadata(X,D,T,C,....) routine returns +** information about column C of table T in database D +** on [database connection] X.)^ ^The sqlite3_table_column_metadata() +** interface returns SQLITE_OK and fills in the non-NULL pointers in +** the final five arguments with appropriate values if the specified +** column exists. ^The sqlite3_table_column_metadata() interface returns +** SQLITE_ERROR if the specified column does not exist. +** ^If the column-name parameter to sqlite3_table_column_metadata() is a +** NULL pointer, then this routine simply checks for the existence of the +** table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it +** does not. If the table name parameter T in a call to +** sqlite3_table_column_metadata(X,D,T,C,...) is NULL then the result is +** undefined behavior. +** +** ^The column is identified by the second, third and fourth parameters to +** this function. ^(The second parameter is either the name of the database +** (i.e. "main", "temp", or an attached database) containing the specified +** table or NULL.)^ ^If it is NULL, then all attached databases are searched +** for the table using the same algorithm used by the database engine to +** resolve unqualified table references. +** +** ^The third and fourth parameters to this function are the table and column +** name of the desired column, respectively. +** +** ^Metadata is returned by writing to the memory locations passed as the 5th +** and subsequent parameters to this function. ^Any of these arguments may be +** NULL, in which case the corresponding element of metadata is omitted. +** +** ^(
+** +**
Parameter Output
Type
Description +** +**
5th const char* Data type +**
6th const char* Name of default collation sequence +**
7th int True if column has a NOT NULL constraint +**
8th int True if column is part of the PRIMARY KEY +**
9th int True if column is [AUTOINCREMENT] +**
+**
)^ +** +** ^The memory pointed to by the character pointers returned for the +** declaration type and collation sequence is valid until the next +** call to any SQLite API function. +** +** ^If the specified table is actually a view, an [error code] is returned. +** +** ^If the specified column is "rowid", "oid" or "_rowid_" and the table +** is not a [WITHOUT ROWID] table and an +** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output +** parameters are set for the explicitly declared column. ^(If there is no +** [INTEGER PRIMARY KEY] column, then the outputs +** for the [rowid] are set as follows: +** +**
+**     data type: "INTEGER"
+**     collation sequence: "BINARY"
+**     not null: 0
+**     primary key: 1
+**     auto increment: 0
+** 
)^ +** +** ^This function causes all database schemas to be read from disk and +** parsed, if that has not already been done, and returns an error if +** any errors are encountered while loading the schema. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +); + +/* +** CAPI3REF: Load An Extension +** METHOD: sqlite3 +** +** ^This interface loads an SQLite extension library from the named file. +** +** ^The sqlite3_load_extension() interface attempts to load an +** [SQLite extension] library contained in the file zFile. If +** the file cannot be loaded directly, attempts are made to load +** with various operating-system specific extensions added. +** So for example, if "samplelib" cannot be loaded, then names like +** "samplelib.so" or "samplelib.dylib" or "samplelib.dll" might +** be tried also. +** +** ^The entry point is zProc. +** ^(zProc may be 0, in which case SQLite will try to come up with an +** entry point name on its own. It first tries "sqlite3_extension_init". +** If that does not work, it constructs a name "sqlite3_X_init" where the +** X is consists of the lower-case equivalent of all ASCII alphabetic +** characters in the filename from the last "/" to the first following +** "." and omitting any initial "lib".)^ +** ^The sqlite3_load_extension() interface returns +** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. +** ^If an error occurs and pzErrMsg is not 0, then the +** [sqlite3_load_extension()] interface shall attempt to +** fill *pzErrMsg with error message text stored in memory +** obtained from [sqlite3_malloc()]. The calling function +** should free this memory by calling [sqlite3_free()]. +** +** ^Extension loading must be enabled using +** [sqlite3_enable_load_extension()] or +** [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],1,NULL) +** prior to calling this API, +** otherwise an error will be returned. +** +** Security warning: It is recommended that the +** [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method be used to enable only this +** interface. The use of the [sqlite3_enable_load_extension()] interface +** should be avoided. This will keep the SQL function [load_extension()] +** disabled and prevent SQL injections from giving attackers +** access to extension loading capabilities. +** +** See also the [load_extension() SQL function]. +*/ +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +); + +/* +** CAPI3REF: Enable Or Disable Extension Loading +** METHOD: sqlite3 +** +** ^So as not to open security holes in older applications that are +** unprepared to deal with [extension loading], and as a means of disabling +** [extension loading] while evaluating user-entered SQL, the following API +** is provided to turn the [sqlite3_load_extension()] mechanism on and off. +** +** ^Extension loading is off by default. +** ^Call the sqlite3_enable_load_extension() routine with onoff==1 +** to turn extension loading on and call it with onoff==0 to turn +** it back off again. +** +** ^This interface enables or disables both the C-API +** [sqlite3_load_extension()] and the SQL function [load_extension()]. +** ^(Use [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],..) +** to enable or disable only the C-API.)^ +** +** Security warning: It is recommended that extension loading +** be enabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method +** rather than this interface, so the [load_extension()] SQL function +** remains disabled. This will prevent SQL injections from giving attackers +** access to extension loading capabilities. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); + +/* +** CAPI3REF: Automatically Load Statically Linked Extensions +** +** ^This interface causes the xEntryPoint() function to be invoked for +** each new [database connection] that is created. The idea here is that +** xEntryPoint() is the entry point for a statically linked [SQLite extension] +** that is to be automatically loaded into all new database connections. +** +** ^(Even though the function prototype shows that xEntryPoint() takes +** no arguments and returns void, SQLite invokes xEntryPoint() with three +** arguments and expects an integer result as if the signature of the +** entry point where as follows: +** +**
+**    int xEntryPoint(
+**      sqlite3 *db,
+**      const char **pzErrMsg,
+**      const struct sqlite3_api_routines *pThunk
+**    );
+** 
)^ +** +** If the xEntryPoint routine encounters an error, it should make *pzErrMsg +** point to an appropriate error message (obtained from [sqlite3_mprintf()]) +** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg +** is NULL before calling the xEntryPoint(). ^SQLite will invoke +** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any +** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], +** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. +** +** ^Calling sqlite3_auto_extension(X) with an entry point X that is already +** on the list of automatic extensions is a harmless no-op. ^No entry point +** will be called more than once for each database connection that is opened. +** +** See also: [sqlite3_reset_auto_extension()] +** and [sqlite3_cancel_auto_extension()] +*/ +SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Cancel Automatic Extension Loading +** +** ^The [sqlite3_cancel_auto_extension(X)] interface unregisters the +** initialization routine X that was registered using a prior call to +** [sqlite3_auto_extension(X)]. ^The [sqlite3_cancel_auto_extension(X)] +** routine returns 1 if initialization routine X was successfully +** unregistered and it returns 0 if X was not on the list of initialization +** routines. +*/ +SQLITE_API int sqlite3_cancel_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Reset Automatic Extension Loading +** +** ^This interface disables all automatic extensions previously +** registered using [sqlite3_auto_extension()]. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void); + +/* +** The interface to the virtual-table mechanism is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** Structures used by the virtual table interface +*/ +typedef struct sqlite3_vtab sqlite3_vtab; +typedef struct sqlite3_index_info sqlite3_index_info; +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; +typedef struct sqlite3_module sqlite3_module; + +/* +** CAPI3REF: Virtual Table Object +** KEYWORDS: sqlite3_module {virtual table module} +** +** This structure, sometimes called a "virtual table module", +** defines the implementation of a [virtual table]. +** This structure consists mostly of methods for the module. +** +** ^A virtual table module is created by filling in a persistent +** instance of this structure and passing a pointer to that instance +** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. +** ^The registration remains valid until it is replaced by a different +** module or until the [database connection] closes. The content +** of this structure must not change while it is registered with +** any database connection. +*/ +struct sqlite3_module { + int iVersion; + int (*xCreate)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xConnect)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + int (*xDisconnect)(sqlite3_vtab *pVTab); + int (*xDestroy)(sqlite3_vtab *pVTab); + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); + int (*xClose)(sqlite3_vtab_cursor*); + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, + int argc, sqlite3_value **argv); + int (*xNext)(sqlite3_vtab_cursor*); + int (*xEof)(sqlite3_vtab_cursor*); + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); + int (*xBegin)(sqlite3_vtab *pVTab); + int (*xSync)(sqlite3_vtab *pVTab); + int (*xCommit)(sqlite3_vtab *pVTab); + int (*xRollback)(sqlite3_vtab *pVTab); + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg); + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); + /* The methods above are in version 1 of the sqlite_module object. Those + ** below are for version 2 and greater. */ + int (*xSavepoint)(sqlite3_vtab *pVTab, int); + int (*xRelease)(sqlite3_vtab *pVTab, int); + int (*xRollbackTo)(sqlite3_vtab *pVTab, int); + /* The methods above are in versions 1 and 2 of the sqlite_module object. + ** Those below are for version 3 and greater. */ + int (*xShadowName)(const char*); +}; + +/* +** CAPI3REF: Virtual Table Indexing Information +** KEYWORDS: sqlite3_index_info +** +** The sqlite3_index_info structure and its substructures is used as part +** of the [virtual table] interface to +** pass information into and receive the reply from the [xBestIndex] +** method of a [virtual table module]. The fields under **Inputs** are the +** inputs to xBestIndex and are read-only. xBestIndex inserts its +** results into the **Outputs** fields. +** +** ^(The aConstraint[] array records WHERE clause constraints of the form: +** +**
column OP expr
+** +** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is +** stored in aConstraint[].op using one of the +** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ +** ^(The index of the column is stored in +** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the +** expr on the right-hand side can be evaluated (and thus the constraint +** is usable) and false if it cannot.)^ +** +** ^The optimizer automatically inverts terms of the form "expr OP column" +** and makes other simplifications to the WHERE clause in an attempt to +** get as many WHERE clause terms into the form shown above as possible. +** ^The aConstraint[] array only reports WHERE clause terms that are +** relevant to the particular virtual table being queried. +** +** ^Information about the ORDER BY clause is stored in aOrderBy[]. +** ^Each term of aOrderBy records a column of the ORDER BY clause. +** +** The colUsed field indicates which columns of the virtual table may be +** required by the current scan. Virtual table columns are numbered from +** zero in the order in which they appear within the CREATE TABLE statement +** passed to sqlite3_declare_vtab(). For the first 63 columns (columns 0-62), +** the corresponding bit is set within the colUsed mask if the column may be +** required by SQLite. If the table has at least 64 columns and any column +** to the right of the first 63 is required, then bit 63 of colUsed is also +** set. In other words, column iCol may be required if the expression +** (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to +** non-zero. +** +** The [xBestIndex] method must fill aConstraintUsage[] with information +** about what parameters to pass to xFilter. ^If argvIndex>0 then +** the right-hand side of the corresponding aConstraint[] is evaluated +** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit +** is true, then the constraint is assumed to be fully handled by the +** virtual table and might not be checked again by the byte code.)^ ^(The +** aConstraintUsage[].omit flag is an optimization hint. When the omit flag +** is left in its default setting of false, the constraint will always be +** checked separately in byte code. If the omit flag is change to true, then +** the constraint may or may not be checked in byte code. In other words, +** when the omit flag is true there is no guarantee that the constraint will +** not be checked again using byte code.)^ +** +** ^The idxNum and idxPtr values are recorded and passed into the +** [xFilter] method. +** ^[sqlite3_free()] is used to free idxPtr if and only if +** needToFreeIdxPtr is true. +** +** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in +** the correct order to satisfy the ORDER BY clause so that no separate +** sorting step is required. +** +** ^The estimatedCost value is an estimate of the cost of a particular +** strategy. A cost of N indicates that the cost of the strategy is similar +** to a linear scan of an SQLite table with N rows. A cost of log(N) +** indicates that the expense of the operation is similar to that of a +** binary search on a unique indexed field of an SQLite table with N rows. +** +** ^The estimatedRows value is an estimate of the number of rows that +** will be returned by the strategy. +** +** The xBestIndex method may optionally populate the idxFlags field with a +** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - +** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite +** assumes that the strategy may visit at most one row. +** +** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then +** SQLite also assumes that if a call to the xUpdate() method is made as +** part of the same statement to delete or update a virtual table row and the +** implementation returns SQLITE_CONSTRAINT, then there is no need to rollback +** any database changes. In other words, if the xUpdate() returns +** SQLITE_CONSTRAINT, the database contents must be exactly as they were +** before xUpdate was called. By contrast, if SQLITE_INDEX_SCAN_UNIQUE is not +** set and xUpdate returns SQLITE_CONSTRAINT, any database changes made by +** the xUpdate method are automatically rolled back by SQLite. +** +** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info +** structure for SQLite [version 3.8.2] ([dateof:3.8.2]). +** If a virtual table extension is +** used with an SQLite version earlier than 3.8.2, the results of attempting +** to read or write the estimatedRows field are undefined (but are likely +** to include crashing the application). The estimatedRows field should +** therefore only be used if [sqlite3_libversion_number()] returns a +** value greater than or equal to 3008002. Similarly, the idxFlags field +** was added for [version 3.9.0] ([dateof:3.9.0]). +** It may therefore only be used if +** sqlite3_libversion_number() returns a value greater than or equal to +** 3009000. +*/ +struct sqlite3_index_info { + /* Inputs */ + int nConstraint; /* Number of entries in aConstraint */ + struct sqlite3_index_constraint { + int iColumn; /* Column constrained. -1 for ROWID */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should ignore */ + } *aConstraint; /* Table of WHERE clause constraints */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *aOrderBy; /* The ORDER BY clause */ + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if >0, constraint is part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this constraint */ + } *aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ + /* Fields below are only available in SQLite 3.8.2 and later */ + sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ + /* Fields below are only available in SQLite 3.9.0 and later */ + int idxFlags; /* Mask of SQLITE_INDEX_SCAN_* flags */ + /* Fields below are only available in SQLite 3.10.0 and later */ + sqlite3_uint64 colUsed; /* Input: Mask of columns used by statement */ +}; + +/* +** CAPI3REF: Virtual Table Scan Flags +** +** Virtual table implementations are allowed to set the +** [sqlite3_index_info].idxFlags field to some combination of +** these bits. +*/ +#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ + +/* +** CAPI3REF: Virtual Table Constraint Operator Codes +** +** These macros define the allowed values for the +** [sqlite3_index_info].aConstraint[].op field. Each value represents +** an operator that is part of a constraint term in the wHERE clause of +** a query that uses a [virtual table]. +*/ +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_LIKE 65 +#define SQLITE_INDEX_CONSTRAINT_GLOB 66 +#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 +#define SQLITE_INDEX_CONSTRAINT_NE 68 +#define SQLITE_INDEX_CONSTRAINT_ISNOT 69 +#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 +#define SQLITE_INDEX_CONSTRAINT_ISNULL 71 +#define SQLITE_INDEX_CONSTRAINT_IS 72 +#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150 + +/* +** CAPI3REF: Register A Virtual Table Implementation +** METHOD: sqlite3 +** +** ^These routines are used to register a new [virtual table module] name. +** ^Module names must be registered before +** creating a new [virtual table] using the module and before using a +** preexisting [virtual table] for the module. +** +** ^The module name is registered on the [database connection] specified +** by the first parameter. ^The name of the module is given by the +** second parameter. ^The third parameter is a pointer to +** the implementation of the [virtual table module]. ^The fourth +** parameter is an arbitrary client data pointer that is passed through +** into the [xCreate] and [xConnect] methods of the virtual table module +** when a new virtual table is be being created or reinitialized. +** +** ^The sqlite3_create_module_v2() interface has a fifth parameter which +** is a pointer to a destructor for the pClientData. ^SQLite will +** invoke the destructor function (if it is not NULL) when SQLite +** no longer needs the pClientData pointer. ^The destructor will also +** be invoked if the call to sqlite3_create_module_v2() fails. +** ^The sqlite3_create_module() +** interface is equivalent to sqlite3_create_module_v2() with a NULL +** destructor. +** +** ^If the third parameter (the pointer to the sqlite3_module object) is +** NULL then no new module is create and any existing modules with the +** same name are dropped. +** +** See also: [sqlite3_drop_modules()] +*/ +SQLITE_API int sqlite3_create_module( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData /* Client data for xCreate/xConnect */ +); +SQLITE_API int sqlite3_create_module_v2( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData, /* Client data for xCreate/xConnect */ + void(*xDestroy)(void*) /* Module destructor function */ +); + +/* +** CAPI3REF: Remove Unnecessary Virtual Table Implementations +** METHOD: sqlite3 +** +** ^The sqlite3_drop_modules(D,L) interface removes all virtual +** table modules from database connection D except those named on list L. +** The L parameter must be either NULL or a pointer to an array of pointers +** to strings where the array is terminated by a single NULL pointer. +** ^If the L parameter is NULL, then all virtual table modules are removed. +** +** See also: [sqlite3_create_module()] +*/ +SQLITE_API int sqlite3_drop_modules( + sqlite3 *db, /* Remove modules from this connection */ + const char **azKeep /* Except, do not remove the ones named here */ +); + +/* +** CAPI3REF: Virtual Table Instance Object +** KEYWORDS: sqlite3_vtab +** +** Every [virtual table module] implementation uses a subclass +** of this object to describe a particular instance +** of the [virtual table]. Each subclass will +** be tailored to the specific needs of the module implementation. +** The purpose of this superclass is to define certain fields that are +** common to all module implementations. +** +** ^Virtual tables methods can set an error message by assigning a +** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should +** take care that any prior string is freed by a call to [sqlite3_free()] +** prior to assigning a new string to zErrMsg. ^After the error message +** is delivered up to the client application, the string will be automatically +** freed by sqlite3_free() and the zErrMsg field will be zeroed. +*/ +struct sqlite3_vtab { + const sqlite3_module *pModule; /* The module for this virtual table */ + int nRef; /* Number of open cursors */ + char *zErrMsg; /* Error message from sqlite3_mprintf() */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Virtual Table Cursor Object +** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} +** +** Every [virtual table module] implementation uses a subclass of the +** following structure to describe cursors that point into the +** [virtual table] and are used +** to loop through the virtual table. Cursors are created using the +** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed +** by the [sqlite3_module.xClose | xClose] method. Cursors are used +** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods +** of the module. Each module implementation will define +** the content of a cursor structure to suit its own needs. +** +** This superclass exists in order to define fields of the cursor that +** are common to all implementations. +*/ +struct sqlite3_vtab_cursor { + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Declare The Schema Of A Virtual Table +** +** ^The [xCreate] and [xConnect] methods of a +** [virtual table module] call this interface +** to declare the format (the names and datatypes of the columns) of +** the virtual tables they implement. +*/ +SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); + +/* +** CAPI3REF: Overload A Function For A Virtual Table +** METHOD: sqlite3 +** +** ^(Virtual tables can provide alternative implementations of functions +** using the [xFindFunction] method of the [virtual table module]. +** But global versions of those functions +** must exist in order to be overloaded.)^ +** +** ^(This API makes sure a global version of a function with a particular +** name and number of parameters exists. If no such function exists +** before this API is called, a new function is created.)^ ^The implementation +** of the new function always causes an exception to be thrown. So +** the new function is not good for anything by itself. Its only +** purpose is to be a placeholder function that can be overloaded +** by a [virtual table]. +*/ +SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); + +/* +** The interface to the virtual-table mechanism defined above (back up +** to a comment remarkably similar to this one) is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** CAPI3REF: A Handle To An Open BLOB +** KEYWORDS: {BLOB handle} {BLOB handles} +** +** An instance of this object represents an open BLOB on which +** [sqlite3_blob_open | incremental BLOB I/O] can be performed. +** ^Objects of this type are created by [sqlite3_blob_open()] +** and destroyed by [sqlite3_blob_close()]. +** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces +** can be used to read or write small subsections of the BLOB. +** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. +*/ +typedef struct sqlite3_blob sqlite3_blob; + +/* +** CAPI3REF: Open A BLOB For Incremental I/O +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_blob +** +** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located +** in row iRow, column zColumn, table zTable in database zDb; +** in other words, the same BLOB that would be selected by: +** +**
+**     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
+** 
)^ +** +** ^(Parameter zDb is not the filename that contains the database, but +** rather the symbolic name of the database. For attached databases, this is +** the name that appears after the AS keyword in the [ATTACH] statement. +** For the main database file, the database name is "main". For TEMP +** tables, the database name is "temp".)^ +** +** ^If the flags parameter is non-zero, then the BLOB is opened for read +** and write access. ^If the flags parameter is zero, the BLOB is opened for +** read-only access. +** +** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is stored +** in *ppBlob. Otherwise an [error code] is returned and, unless the error +** code is SQLITE_MISUSE, *ppBlob is set to NULL.)^ ^This means that, provided +** the API is not misused, it is always safe to call [sqlite3_blob_close()] +** on *ppBlob after this function it returns. +** +** This function fails with SQLITE_ERROR if any of the following are true: +**
    +**
  • ^(Database zDb does not exist)^, +**
  • ^(Table zTable does not exist within database zDb)^, +**
  • ^(Table zTable is a WITHOUT ROWID table)^, +**
  • ^(Column zColumn does not exist)^, +**
  • ^(Row iRow is not present in the table)^, +**
  • ^(The specified column of row iRow contains a value that is not +** a TEXT or BLOB value)^, +**
  • ^(Column zColumn is part of an index, PRIMARY KEY or UNIQUE +** constraint and the blob is being opened for read/write access)^, +**
  • ^([foreign key constraints | Foreign key constraints] are enabled, +** column zColumn is part of a [child key] definition and the blob is +** being opened for read/write access)^. +**
+** +** ^Unless it returns SQLITE_MISUSE, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** A BLOB referenced by sqlite3_blob_open() may be read using the +** [sqlite3_blob_read()] interface and modified by using +** [sqlite3_blob_write()]. The [BLOB handle] can be moved to a +** different row of the same table using the [sqlite3_blob_reopen()] +** interface. However, the column, table, or database of a [BLOB handle] +** cannot be changed after the [BLOB handle] is opened. +** +** ^(If the row that a BLOB handle points to is modified by an +** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects +** then the BLOB handle is marked as "expired". +** This is true if any column of the row is changed, even a column +** other than the one the BLOB handle is open on.)^ +** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for +** an expired BLOB handle fail with a return code of [SQLITE_ABORT]. +** ^(Changes written into a BLOB prior to the BLOB expiring are not +** rolled back by the expiration of the BLOB. Such changes will eventually +** commit if the transaction continues to completion.)^ +** +** ^Use the [sqlite3_blob_bytes()] interface to determine the size of +** the opened blob. ^The size of a blob may not be changed by this +** interface. Use the [UPDATE] SQL command to change the size of a +** blob. +** +** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces +** and the built-in [zeroblob] SQL function may be used to create a +** zero-filled blob to read or write using the incremental-blob interface. +** +** To avoid a resource leak, every open [BLOB handle] should eventually +** be released by a call to [sqlite3_blob_close()]. +** +** See also: [sqlite3_blob_close()], +** [sqlite3_blob_reopen()], [sqlite3_blob_read()], +** [sqlite3_blob_bytes()], [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3*, + const char *zDb, + const char *zTable, + const char *zColumn, + sqlite3_int64 iRow, + int flags, + sqlite3_blob **ppBlob +); + +/* +** CAPI3REF: Move a BLOB Handle to a New Row +** METHOD: sqlite3_blob +** +** ^This function is used to move an existing [BLOB handle] so that it points +** to a different row of the same database table. ^The new row is identified +** by the rowid value passed as the second argument. Only the row can be +** changed. ^The database, table and column on which the blob handle is open +** remain the same. Moving an existing [BLOB handle] to a new row is +** faster than closing the existing handle and opening a new one. +** +** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - +** it must exist and there must be either a blob or text value stored in +** the nominated column.)^ ^If the new row is not present in the table, or if +** it does not contain a blob or text value, or if another error occurs, an +** SQLite error code is returned and the blob handle is considered aborted. +** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or +** [sqlite3_blob_reopen()] on an aborted blob handle immediately return +** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle +** always returns zero. +** +** ^This function sets the database handle error code and message. +*/ +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); + +/* +** CAPI3REF: Close A BLOB Handle +** DESTRUCTOR: sqlite3_blob +** +** ^This function closes an open [BLOB handle]. ^(The BLOB handle is closed +** unconditionally. Even if this routine returns an error code, the +** handle is still closed.)^ +** +** ^If the blob handle being closed was opened for read-write access, and if +** the database is in auto-commit mode and there are no other open read-write +** blob handles or active write statements, the current transaction is +** committed. ^If an error occurs while committing the transaction, an error +** code is returned and the transaction rolled back. +** +** Calling this function with an argument that is not a NULL pointer or an +** open blob handle results in undefined behaviour. ^Calling this routine +** with a null pointer (such as would be returned by a failed call to +** [sqlite3_blob_open()]) is a harmless no-op. ^Otherwise, if this function +** is passed a valid open blob handle, the values returned by the +** sqlite3_errcode() and sqlite3_errmsg() functions are set before returning. +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *); + +/* +** CAPI3REF: Return The Size Of An Open BLOB +** METHOD: sqlite3_blob +** +** ^Returns the size in bytes of the BLOB accessible via the +** successfully opened [BLOB handle] in its only argument. ^The +** incremental blob I/O routines can only read or overwriting existing +** blob content; they cannot change the size of a blob. +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); + +/* +** CAPI3REF: Read Data From A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(This function is used to read data from an open [BLOB handle] into a +** caller-supplied buffer. N bytes of data are copied into buffer Z +** from the open BLOB, starting at offset iOffset.)^ +** +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is +** less than zero, [SQLITE_ERROR] is returned and no data is read. +** ^The size of the blob (and hence the maximum value of N+iOffset) +** can be determined using the [sqlite3_blob_bytes()] interface. +** +** ^An attempt to read from an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. +** +** ^(On success, sqlite3_blob_read() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); + +/* +** CAPI3REF: Write Data Into A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(This function is used to write data into an open [BLOB handle] from a +** caller-supplied buffer. N bytes of data are copied from the buffer Z +** into the open BLOB, starting at offset iOffset.)^ +** +** ^(On success, sqlite3_blob_write() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** ^Unless SQLITE_MISUSE is returned, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** ^If the [BLOB handle] passed as the first argument was not opened for +** writing (the flags parameter to [sqlite3_blob_open()] was zero), +** this function returns [SQLITE_READONLY]. +** +** This function may only modify the contents of the BLOB; it is +** not possible to increase the size of a BLOB using this API. +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is written. The size of the +** BLOB (and hence the maximum value of N+iOffset) can be determined +** using the [sqlite3_blob_bytes()] interface. ^If N or iOffset are less +** than zero [SQLITE_ERROR] is returned and no data is written. +** +** ^An attempt to write to an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred +** before the [BLOB handle] expired are not rolled back by the +** expiration of the handle, though of course those changes might +** have been overwritten by the statement that expired the BLOB handle +** or by other independent statements. +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_read()]. +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); + +/* +** CAPI3REF: Virtual File System Objects +** +** A virtual filesystem (VFS) is an [sqlite3_vfs] object +** that SQLite uses to interact +** with the underlying operating system. Most SQLite builds come with a +** single default VFS that is appropriate for the host computer. +** New VFSes can be registered and existing VFSes can be unregistered. +** The following interfaces are provided. +** +** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. +** ^Names are case sensitive. +** ^Names are zero-terminated UTF-8 strings. +** ^If there is no match, a NULL pointer is returned. +** ^If zVfsName is NULL then the default VFS is returned. +** +** ^New VFSes are registered with sqlite3_vfs_register(). +** ^Each new VFS becomes the default VFS if the makeDflt flag is set. +** ^The same VFS can be registered multiple times without injury. +** ^To make an existing VFS into the default VFS, register it again +** with the makeDflt flag set. If two different VFSes with the +** same name are registered, the behavior is undefined. If a +** VFS is registered with a name that is NULL or an empty string, +** then the behavior is undefined. +** +** ^Unregister a VFS with the sqlite3_vfs_unregister() interface. +** ^(If the default VFS is unregistered, another VFS is chosen as +** the default. The choice for the new VFS is arbitrary.)^ +*/ +SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); +SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); +SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); + +/* +** CAPI3REF: Mutexes +** +** The SQLite core uses these routines for thread +** synchronization. Though they are intended for internal +** use by SQLite, code that links against SQLite is +** permitted to use any of these routines. +** +** The SQLite source code contains multiple implementations +** of these mutex routines. An appropriate implementation +** is selected automatically at compile-time. The following +** implementations are available in the SQLite core: +** +**
    +**
  • SQLITE_MUTEX_PTHREADS +**
  • SQLITE_MUTEX_W32 +**
  • SQLITE_MUTEX_NOOP +**
+** +** The SQLITE_MUTEX_NOOP implementation is a set of routines +** that does no real locking and is appropriate for use in +** a single-threaded application. The SQLITE_MUTEX_PTHREADS and +** SQLITE_MUTEX_W32 implementations are appropriate for use on Unix +** and Windows. +** +** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor +** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex +** implementation is included with the library. In this case the +** application must supply a custom mutex implementation using the +** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function +** before calling sqlite3_initialize() or any other public sqlite3_ +** function that calls sqlite3_initialize(). +** +** ^The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. ^The sqlite3_mutex_alloc() +** routine returns NULL if it is unable to allocate the requested +** mutex. The argument to sqlite3_mutex_alloc() must one of these +** integer constants: +** +**
    +**
  • SQLITE_MUTEX_FAST +**
  • SQLITE_MUTEX_RECURSIVE +**
  • SQLITE_MUTEX_STATIC_MASTER +**
  • SQLITE_MUTEX_STATIC_MEM +**
  • SQLITE_MUTEX_STATIC_OPEN +**
  • SQLITE_MUTEX_STATIC_PRNG +**
  • SQLITE_MUTEX_STATIC_LRU +**
  • SQLITE_MUTEX_STATIC_PMEM +**
  • SQLITE_MUTEX_STATIC_APP1 +**
  • SQLITE_MUTEX_STATIC_APP2 +**
  • SQLITE_MUTEX_STATIC_APP3 +**
  • SQLITE_MUTEX_STATIC_VFS1 +**
  • SQLITE_MUTEX_STATIC_VFS2 +**
  • SQLITE_MUTEX_STATIC_VFS3 +**
+** +** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) +** cause sqlite3_mutex_alloc() to create +** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other +** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return +** a pointer to a static preexisting mutex. ^Nine static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. ^For the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +** +** ^The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. Attempting to deallocate a static +** mutex results in undefined behavior. +** +** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. ^If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK] +** upon successful entry. ^(Mutexes created using +** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. +** In such cases, the +** mutex must be exited an equal number of times before another thread +** can enter.)^ If the same thread tries to enter any mutex other +** than an SQLITE_MUTEX_RECURSIVE more than once, the behavior is undefined. +** +** ^(Some systems (for example, Windows 95) do not support the operation +** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() +** will always return SQLITE_BUSY. The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable +** behavior.)^ +** +** ^The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered by the +** calling thread or is not currently allocated. +** +** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or +** sqlite3_mutex_leave() is a NULL pointer, then all three routines +** behave as no-ops. +** +** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Methods Object +** +** An instance of this structure defines the low-level routines +** used to allocate and use mutexes. +** +** Usually, the default mutex implementations provided by SQLite are +** sufficient, however the application has the option of substituting a custom +** implementation for specialized deployments or systems for which SQLite +** does not provide a suitable implementation. In this case, the application +** creates and populates an instance of this structure to pass +** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. +** Additionally, an instance of this structure can be used as an +** output variable when querying the system for the current mutex +** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. +** +** ^The xMutexInit method defined by this structure is invoked as +** part of system initialization by the sqlite3_initialize() function. +** ^The xMutexInit routine is called by SQLite exactly once for each +** effective call to [sqlite3_initialize()]. +** +** ^The xMutexEnd method defined by this structure is invoked as +** part of system shutdown by the sqlite3_shutdown() function. The +** implementation of this method is expected to release all outstanding +** resources obtained by the mutex methods implementation, especially +** those obtained by the xMutexInit method. ^The xMutexEnd() +** interface is invoked exactly once for each call to [sqlite3_shutdown()]. +** +** ^(The remaining seven methods defined by this structure (xMutexAlloc, +** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and +** xMutexNotheld) implement the following interfaces (respectively): +** +**
    +**
  • [sqlite3_mutex_alloc()]
  • +**
  • [sqlite3_mutex_free()]
  • +**
  • [sqlite3_mutex_enter()]
  • +**
  • [sqlite3_mutex_try()]
  • +**
  • [sqlite3_mutex_leave()]
  • +**
  • [sqlite3_mutex_held()]
  • +**
  • [sqlite3_mutex_notheld()]
  • +**
)^ +** +** The only difference is that the public sqlite3_XXX functions enumerated +** above silently ignore any invocations that pass a NULL pointer instead +** of a valid mutex handle. The implementations of the methods defined +** by this structure are not required to handle this case. The results +** of passing a NULL pointer instead of a valid mutex handle are undefined +** (i.e. it is acceptable to provide an implementation that segfaults if +** it is passed a NULL pointer). +** +** The xMutexInit() method must be threadsafe. It must be harmless to +** invoke xMutexInit() multiple times within the same process and without +** intervening calls to xMutexEnd(). Second and subsequent calls to +** xMutexInit() must be no-ops. +** +** xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] +** and its associates). Similarly, xMutexAlloc() must not use SQLite memory +** allocation for a static mutex. ^However xMutexAlloc() may use SQLite +** memory allocation for a fast or recursive mutex. +** +** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is +** called, but only if the prior call to xMutexInit returned SQLITE_OK. +** If xMutexInit fails in any way, it is expected to clean up after itself +** prior to returning. +*/ +typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; +struct sqlite3_mutex_methods { + int (*xMutexInit)(void); + int (*xMutexEnd)(void); + sqlite3_mutex *(*xMutexAlloc)(int); + void (*xMutexFree)(sqlite3_mutex *); + void (*xMutexEnter)(sqlite3_mutex *); + int (*xMutexTry)(sqlite3_mutex *); + void (*xMutexLeave)(sqlite3_mutex *); + int (*xMutexHeld)(sqlite3_mutex *); + int (*xMutexNotheld)(sqlite3_mutex *); +}; + +/* +** CAPI3REF: Mutex Verification Routines +** +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines +** are intended for use inside assert() statements. The SQLite core +** never uses these routines except inside an assert() and applications +** are advised to follow the lead of the core. The SQLite core only +** provides implementations for these routines when it is compiled +** with the SQLITE_DEBUG flag. External mutex implementations +** are only required to provide these routines if SQLITE_DEBUG is +** defined and if NDEBUG is not defined. +** +** These routines should return true if the mutex in their argument +** is held or not held, respectively, by the calling thread. +** +** The implementation is not required to provide versions of these +** routines that actually work. If the implementation does not provide working +** versions of these routines, it should at least provide stubs that always +** return true so that one does not get spurious assertion failures. +** +** If the argument to sqlite3_mutex_held() is a NULL pointer then +** the routine should return 1. This seems counter-intuitive since +** clearly the mutex cannot be held if it does not exist. But +** the reason the mutex does not exist is because the build is not +** using mutexes. And we do not want the assert() containing the +** call to sqlite3_mutex_held() to fail, so a non-zero return is +** the appropriate thing to do. The sqlite3_mutex_notheld() +** interface should also return 1 when given a NULL pointer. +*/ +#ifndef NDEBUG +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); +#endif + +/* +** CAPI3REF: Mutex Types +** +** The [sqlite3_mutex_alloc()] interface takes a single argument +** which is one of these integer constants. +** +** The set of static mutexes may change from one SQLite release to the +** next. Applications that override the built-in mutex logic must be +** prepared to accommodate additional static mutexes. +*/ +#define SQLITE_MUTEX_FAST 0 +#define SQLITE_MUTEX_RECURSIVE 1 +#define SQLITE_MUTEX_STATIC_MASTER 2 +#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ +#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_randomness() */ +#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ +#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ +#define SQLITE_MUTEX_STATIC_APP1 8 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP2 9 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP3 10 /* For use by application */ +#define SQLITE_MUTEX_STATIC_VFS1 11 /* For use by built-in VFS */ +#define SQLITE_MUTEX_STATIC_VFS2 12 /* For use by extension VFS */ +#define SQLITE_MUTEX_STATIC_VFS3 13 /* For use by application VFS */ + +/* +** CAPI3REF: Retrieve the mutex for a database connection +** METHOD: sqlite3 +** +** ^This interface returns a pointer the [sqlite3_mutex] object that +** serializes access to the [database connection] given in the argument +** when the [threading mode] is Serialized. +** ^If the [threading mode] is Single-thread or Multi-thread then this +** routine returns a NULL pointer. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); + +/* +** CAPI3REF: Low-Level Control Of Database Files +** METHOD: sqlite3 +** KEYWORDS: {file control} +** +** ^The [sqlite3_file_control()] interface makes a direct call to the +** xFileControl method for the [sqlite3_io_methods] object associated +** with a particular database identified by the second argument. ^The +** name of the database is "main" for the main database or "temp" for the +** TEMP database, or the name that appears after the AS keyword for +** databases that are added using the [ATTACH] SQL command. +** ^A NULL pointer can be used in place of "main" to refer to the +** main database file. +** ^The third and fourth parameters to this routine +** are passed directly through to the second and third parameters of +** the xFileControl method. ^The return value of the xFileControl +** method becomes the return value of this routine. +** +** A few opcodes for [sqlite3_file_control()] are handled directly +** by the SQLite core and never invoke the +** sqlite3_io_methods.xFileControl method. +** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes +** a pointer to the underlying [sqlite3_file] object to be written into +** the space pointed to by the 4th parameter. The +** [SQLITE_FCNTL_JOURNAL_POINTER] works similarly except that it returns +** the [sqlite3_file] object associated with the journal file instead of +** the main database. The [SQLITE_FCNTL_VFS_POINTER] opcode returns +** a pointer to the underlying [sqlite3_vfs] object for the file. +** The [SQLITE_FCNTL_DATA_VERSION] returns the data version counter +** from the pager. +** +** ^If the second parameter (zDbName) does not match the name of any +** open database file, then SQLITE_ERROR is returned. ^This error +** code is not remembered and will not be recalled by [sqlite3_errcode()] +** or [sqlite3_errmsg()]. The underlying xFileControl method might +** also return SQLITE_ERROR. There is no way to distinguish between +** an incorrect zDbName and an SQLITE_ERROR return from the underlying +** xFileControl method. +** +** See also: [file control opcodes] +*/ +SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); + +/* +** CAPI3REF: Testing Interface +** +** ^The sqlite3_test_control() interface is used to read out internal +** state of SQLite and to inject faults into SQLite for testing +** purposes. ^The first parameter is an operation code that determines +** the number, meaning, and operation of all subsequent parameters. +** +** This interface is not for use by applications. It exists solely +** for verifying the correct operation of the SQLite library. Depending +** on how the SQLite library is compiled, this interface might not exist. +** +** The details of the operation codes, their meanings, the parameters +** they take, and what they do are all subject to change without notice. +** Unlike most of the SQLite API, this function is not guaranteed to +** operate consistently from one release to the next. +*/ +SQLITE_API int sqlite3_test_control(int op, ...); + +/* +** CAPI3REF: Testing Interface Operation Codes +** +** These constants are the valid operation code parameters used +** as the first argument to [sqlite3_test_control()]. +** +** These parameters and their meanings are subject to change +** without notice. These values are for testing purposes only. +** Applications should not use any of these parameters or the +** [sqlite3_test_control()] interface. +*/ +#define SQLITE_TESTCTRL_FIRST 5 +#define SQLITE_TESTCTRL_PRNG_SAVE 5 +#define SQLITE_TESTCTRL_PRNG_RESTORE 6 +#define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ +#define SQLITE_TESTCTRL_BITVEC_TEST 8 +#define SQLITE_TESTCTRL_FAULT_INSTALL 9 +#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 +#define SQLITE_TESTCTRL_PENDING_BYTE 11 +#define SQLITE_TESTCTRL_ASSERT 12 +#define SQLITE_TESTCTRL_ALWAYS 13 +#define SQLITE_TESTCTRL_RESERVE 14 /* NOT USED */ +#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 +#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ +#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ +#define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17 +#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 +#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ +#define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 +#define SQLITE_TESTCTRL_NEVER_CORRUPT 20 +#define SQLITE_TESTCTRL_VDBE_COVERAGE 21 +#define SQLITE_TESTCTRL_BYTEORDER 22 +#define SQLITE_TESTCTRL_ISINIT 23 +#define SQLITE_TESTCTRL_SORTER_MMAP 24 +#define SQLITE_TESTCTRL_IMPOSTER 25 +#define SQLITE_TESTCTRL_PARSER_COVERAGE 26 +#define SQLITE_TESTCTRL_RESULT_INTREAL 27 +#define SQLITE_TESTCTRL_PRNG_SEED 28 +#define SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS 29 +#define SQLITE_TESTCTRL_LAST 29 /* Largest TESTCTRL */ + +/* +** CAPI3REF: SQL Keyword Checking +** +** These routines provide access to the set of SQL language keywords +** recognized by SQLite. Applications can uses these routines to determine +** whether or not a specific identifier needs to be escaped (for example, +** by enclosing in double-quotes) so as not to confuse the parser. +** +** The sqlite3_keyword_count() interface returns the number of distinct +** keywords understood by SQLite. +** +** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and +** makes *Z point to that keyword expressed as UTF8 and writes the number +** of bytes in the keyword into *L. The string that *Z points to is not +** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns +** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z +** or L are NULL or invalid pointers then calls to +** sqlite3_keyword_name(N,Z,L) result in undefined behavior. +** +** The sqlite3_keyword_check(Z,L) interface checks to see whether or not +** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero +** if it is and zero if not. +** +** The parser used by SQLite is forgiving. It is often possible to use +** a keyword as an identifier as long as such use does not result in a +** parsing ambiguity. For example, the statement +** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and +** creates a new table named "BEGIN" with three columns named +** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid +** using keywords as identifiers. Common techniques used to avoid keyword +** name collisions include: +**
    +**
  • Put all identifier names inside double-quotes. This is the official +** SQL way to escape identifier names. +**
  • Put identifier names inside [...]. This is not standard SQL, +** but it is what SQL Server does and so lots of programmers use this +** technique. +**
  • Begin every identifier with the letter "Z" as no SQL keywords start +** with "Z". +**
  • Include a digit somewhere in every identifier name. +**
+** +** Note that the number of keywords understood by SQLite can depend on +** compile-time options. For example, "VACUUM" is not a keyword if +** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also, +** new keywords may be added to future releases of SQLite. +*/ +SQLITE_API int sqlite3_keyword_count(void); +SQLITE_API int sqlite3_keyword_name(int,const char**,int*); +SQLITE_API int sqlite3_keyword_check(const char*,int); + +/* +** CAPI3REF: Dynamic String Object +** KEYWORDS: {dynamic string} +** +** An instance of the sqlite3_str object contains a dynamically-sized +** string under construction. +** +** The lifecycle of an sqlite3_str object is as follows: +**
    +**
  1. ^The sqlite3_str object is created using [sqlite3_str_new()]. +**
  2. ^Text is appended to the sqlite3_str object using various +** methods, such as [sqlite3_str_appendf()]. +**
  3. ^The sqlite3_str object is destroyed and the string it created +** is returned using the [sqlite3_str_finish()] interface. +**
+*/ +typedef struct sqlite3_str sqlite3_str; + +/* +** CAPI3REF: Create A New Dynamic String Object +** CONSTRUCTOR: sqlite3_str +** +** ^The [sqlite3_str_new(D)] interface allocates and initializes +** a new [sqlite3_str] object. To avoid memory leaks, the object returned by +** [sqlite3_str_new()] must be freed by a subsequent call to +** [sqlite3_str_finish(X)]. +** +** ^The [sqlite3_str_new(D)] interface always returns a pointer to a +** valid [sqlite3_str] object, though in the event of an out-of-memory +** error the returned object might be a special singleton that will +** silently reject new text, always return SQLITE_NOMEM from +** [sqlite3_str_errcode()], always return 0 for +** [sqlite3_str_length()], and always return NULL from +** [sqlite3_str_finish(X)]. It is always safe to use the value +** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter +** to any of the other [sqlite3_str] methods. +** +** The D parameter to [sqlite3_str_new(D)] may be NULL. If the +** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum +** length of the string contained in the [sqlite3_str] object will be +** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead +** of [SQLITE_MAX_LENGTH]. +*/ +SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*); + +/* +** CAPI3REF: Finalize A Dynamic String +** DESTRUCTOR: sqlite3_str +** +** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X +** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()] +** that contains the constructed string. The calling application should +** pass the returned value to [sqlite3_free()] to avoid a memory leak. +** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any +** errors were encountered during construction of the string. ^The +** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the +** string in [sqlite3_str] object X is zero bytes long. +*/ +SQLITE_API char *sqlite3_str_finish(sqlite3_str*); + +/* +** CAPI3REF: Add Content To A Dynamic String +** METHOD: sqlite3_str +** +** These interfaces add content to an sqlite3_str object previously obtained +** from [sqlite3_str_new()]. +** +** ^The [sqlite3_str_appendf(X,F,...)] and +** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf] +** functionality of SQLite to append formatted text onto the end of +** [sqlite3_str] object X. +** +** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S +** onto the end of the [sqlite3_str] object X. N must be non-negative. +** S must contain at least N non-zero bytes of content. To append a +** zero-terminated string in its entirety, use the [sqlite3_str_appendall()] +** method instead. +** +** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of +** zero-terminated string S onto the end of [sqlite3_str] object X. +** +** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the +** single-byte character C onto the end of [sqlite3_str] object X. +** ^This method can be used, for example, to add whitespace indentation. +** +** ^The [sqlite3_str_reset(X)] method resets the string under construction +** inside [sqlite3_str] object X back to zero bytes in length. +** +** These methods do not return a result code. ^If an error occurs, that fact +** is recorded in the [sqlite3_str] object and can be recovered by a +** subsequent call to [sqlite3_str_errcode(X)]. +*/ +SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...); +SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list); +SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N); +SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn); +SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C); +SQLITE_API void sqlite3_str_reset(sqlite3_str*); + +/* +** CAPI3REF: Status Of A Dynamic String +** METHOD: sqlite3_str +** +** These interfaces return the current status of an [sqlite3_str] object. +** +** ^If any prior errors have occurred while constructing the dynamic string +** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return +** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns +** [SQLITE_NOMEM] following any out-of-memory error, or +** [SQLITE_TOOBIG] if the size of the dynamic string exceeds +** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors. +** +** ^The [sqlite3_str_length(X)] method returns the current length, in bytes, +** of the dynamic string under construction in [sqlite3_str] object X. +** ^The length returned by [sqlite3_str_length(X)] does not include the +** zero-termination byte. +** +** ^The [sqlite3_str_value(X)] method returns a pointer to the current +** content of the dynamic string under construction in X. The value +** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X +** and might be freed or altered by any subsequent method on the same +** [sqlite3_str] object. Applications must not used the pointer returned +** [sqlite3_str_value(X)] after any subsequent method call on the same +** object. ^Applications may change the content of the string returned +** by [sqlite3_str_value(X)] as long as they do not write into any bytes +** outside the range of 0 to [sqlite3_str_length(X)] and do not read or +** write any byte after any subsequent sqlite3_str method call. +*/ +SQLITE_API int sqlite3_str_errcode(sqlite3_str*); +SQLITE_API int sqlite3_str_length(sqlite3_str*); +SQLITE_API char *sqlite3_str_value(sqlite3_str*); + +/* +** CAPI3REF: SQLite Runtime Status +** +** ^These interfaces are used to retrieve runtime status information +** about the performance of SQLite, and optionally to reset various +** highwater marks. ^The first argument is an integer code for +** the specific parameter to measure. ^(Recognized integer codes +** are of the form [status parameters | SQLITE_STATUS_...].)^ +** ^The current value of the parameter is returned into *pCurrent. +** ^The highest recorded value is returned in *pHighwater. ^If the +** resetFlag is true, then the highest record value is reset after +** *pHighwater is written. ^(Some parameters do not record the highest +** value. For those parameters +** nothing is written into *pHighwater and the resetFlag is ignored.)^ +** ^(Other parameters record only the highwater mark and not the current +** value. For these latter parameters nothing is written into *pCurrent.)^ +** +** ^The sqlite3_status() and sqlite3_status64() routines return +** SQLITE_OK on success and a non-zero [error code] on failure. +** +** If either the current value or the highwater mark is too large to +** be represented by a 32-bit integer, then the values returned by +** sqlite3_status() are undefined. +** +** See also: [sqlite3_db_status()] +*/ +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +); + + +/* +** CAPI3REF: Status Parameters +** KEYWORDS: {status parameters} +** +** These integer constants designate various run-time status parameters +** that can be returned by [sqlite3_status()]. +** +**
+** [[SQLITE_STATUS_MEMORY_USED]] ^(
SQLITE_STATUS_MEMORY_USED
+**
This parameter is the current amount of memory checked out +** using [sqlite3_malloc()], either directly or indirectly. The +** figure includes calls made to [sqlite3_malloc()] by the application +** and internal memory usage by the SQLite library. Auxiliary page-cache +** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in +** this parameter. The amount returned is the sum of the allocation +** sizes as reported by the xSize method in [sqlite3_mem_methods].
)^ +** +** [[SQLITE_STATUS_MALLOC_SIZE]] ^(
SQLITE_STATUS_MALLOC_SIZE
+**
This parameter records the largest memory allocation request +** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their +** internal equivalents). Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
)^ +** +** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
SQLITE_STATUS_MALLOC_COUNT
+**
This parameter records the number of separate memory allocations +** currently checked out.
)^ +** +** [[SQLITE_STATUS_PAGECACHE_USED]] ^(
SQLITE_STATUS_PAGECACHE_USED
+**
This parameter returns the number of pages used out of the +** [pagecache memory allocator] that was configured using +** [SQLITE_CONFIG_PAGECACHE]. The +** value returned is in pages, not in bytes.
)^ +** +** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] +** ^(
SQLITE_STATUS_PAGECACHE_OVERFLOW
+**
This parameter returns the number of bytes of page cache +** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] +** buffer and where forced to overflow to [sqlite3_malloc()]. The +** returned value includes allocations that overflowed because they +** where too large (they were larger than the "sz" parameter to +** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because +** no space was left in the page cache.
)^ +** +** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(
SQLITE_STATUS_PAGECACHE_SIZE
+**
This parameter records the largest memory allocation request +** handed to the [pagecache memory allocator]. Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
)^ +** +** [[SQLITE_STATUS_SCRATCH_USED]]
SQLITE_STATUS_SCRATCH_USED
+**
No longer used.
+** +** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(
SQLITE_STATUS_SCRATCH_OVERFLOW
+**
No longer used.
+** +** [[SQLITE_STATUS_SCRATCH_SIZE]]
SQLITE_STATUS_SCRATCH_SIZE
+**
No longer used.
+** +** [[SQLITE_STATUS_PARSER_STACK]] ^(
SQLITE_STATUS_PARSER_STACK
+**
The *pHighwater parameter records the deepest parser stack. +** The *pCurrent value is undefined. The *pHighwater value is only +** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
)^ +**
+** +** New status parameters may be added from time to time. +*/ +#define SQLITE_STATUS_MEMORY_USED 0 +#define SQLITE_STATUS_PAGECACHE_USED 1 +#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 +#define SQLITE_STATUS_SCRATCH_USED 3 /* NOT USED */ +#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 /* NOT USED */ +#define SQLITE_STATUS_MALLOC_SIZE 5 +#define SQLITE_STATUS_PARSER_STACK 6 +#define SQLITE_STATUS_PAGECACHE_SIZE 7 +#define SQLITE_STATUS_SCRATCH_SIZE 8 /* NOT USED */ +#define SQLITE_STATUS_MALLOC_COUNT 9 + +/* +** CAPI3REF: Database Connection Status +** METHOD: sqlite3 +** +** ^This interface is used to retrieve runtime status information +** about a single [database connection]. ^The first argument is the +** database connection object to be interrogated. ^The second argument +** is an integer constant, taken from the set of +** [SQLITE_DBSTATUS options], that +** determines the parameter to interrogate. The set of +** [SQLITE_DBSTATUS options] is likely +** to grow in future releases of SQLite. +** +** ^The current value of the requested parameter is written into *pCur +** and the highest instantaneous value is written into *pHiwtr. ^If +** the resetFlg is true, then the highest instantaneous value is +** reset back down to the current value. +** +** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a +** non-zero [error code] on failure. +** +** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. +*/ +SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); + +/* +** CAPI3REF: Status Parameters for database connections +** KEYWORDS: {SQLITE_DBSTATUS options} +** +** These constants are the available integer "verbs" that can be passed as +** the second argument to the [sqlite3_db_status()] interface. +** +** New verbs may be added in future releases of SQLite. Existing verbs +** might be discontinued. Applications should check the return code from +** [sqlite3_db_status()] to make sure that the call worked. +** The [sqlite3_db_status()] interface will return a non-zero error code +** if a discontinued or unsupported verb is invoked. +** +**
+** [[SQLITE_DBSTATUS_LOOKASIDE_USED]] ^(
SQLITE_DBSTATUS_LOOKASIDE_USED
+**
This parameter returns the number of lookaside memory slots currently +** checked out.
)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
SQLITE_DBSTATUS_LOOKASIDE_HIT
+**
This parameter returns the number of malloc attempts that were +** satisfied using lookaside memory. Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] +** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
+**
This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to the amount of +** memory requested being larger than the lookaside slot size. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] +** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
+**
This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to all lookaside +** memory already being in use. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_CACHE_USED]] ^(
SQLITE_DBSTATUS_CACHE_USED
+**
This parameter returns the approximate number of bytes of heap +** memory used by all pager caches associated with the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. +** +** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] +** ^(
SQLITE_DBSTATUS_CACHE_USED_SHARED
+**
This parameter is similar to DBSTATUS_CACHE_USED, except that if a +** pager cache is shared between two or more connections the bytes of heap +** memory used by that pager cache is divided evenly between the attached +** connections.)^ In other words, if none of the pager caches associated +** with the database connection are shared, this request returns the same +** value as DBSTATUS_CACHE_USED. Or, if one or more or the pager caches are +** shared, the value returned by this call will be smaller than that returned +** by DBSTATUS_CACHE_USED. ^The highwater mark associated with +** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0. +** +** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
SQLITE_DBSTATUS_SCHEMA_USED
+**
This parameter returns the approximate number of bytes of heap +** memory used to store the schema for all databases associated +** with the connection - main, temp, and any [ATTACH]-ed databases.)^ +** ^The full amount of memory used by the schemas is reported, even if the +** schema memory is shared with other database connections due to +** [shared cache mode] being enabled. +** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. +** +** [[SQLITE_DBSTATUS_STMT_USED]] ^(
SQLITE_DBSTATUS_STMT_USED
+**
This parameter returns the approximate number of bytes of heap +** and lookaside memory used by all prepared statements associated with +** the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. +**
+** +** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
SQLITE_DBSTATUS_CACHE_HIT
+**
This parameter returns the number of pager cache hits that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT +** is always 0. +**
+** +** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
SQLITE_DBSTATUS_CACHE_MISS
+**
This parameter returns the number of pager cache misses that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS +** is always 0. +**
+** +** [[SQLITE_DBSTATUS_CACHE_WRITE]] ^(
SQLITE_DBSTATUS_CACHE_WRITE
+**
This parameter returns the number of dirty cache entries that have +** been written to disk. Specifically, the number of pages written to the +** wal file in wal mode databases, or the number of pages written to the +** database file in rollback mode databases. Any pages written as part of +** transaction rollback or database recovery operations are not included. +** If an IO or other error occurs while writing a page to disk, the effect +** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The +** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. +**
+** +** [[SQLITE_DBSTATUS_CACHE_SPILL]] ^(
SQLITE_DBSTATUS_CACHE_SPILL
+**
This parameter returns the number of dirty cache entries that have +** been written to disk in the middle of a transaction due to the page +** cache overflowing. Transactions are more efficient if they are written +** to disk all at once. When pages spill mid-transaction, that introduces +** additional overhead. This parameter can be used help identify +** inefficiencies that can be resolved by increasing the cache size. +**
+** +** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(
SQLITE_DBSTATUS_DEFERRED_FKS
+**
This parameter returns zero for the current value if and only if +** all foreign key constraints (deferred or immediate) have been +** resolved.)^ ^The highwater mark is always 0. +**
+**
+*/ +#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 +#define SQLITE_DBSTATUS_CACHE_USED 1 +#define SQLITE_DBSTATUS_SCHEMA_USED 2 +#define SQLITE_DBSTATUS_STMT_USED 3 +#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 +#define SQLITE_DBSTATUS_CACHE_HIT 7 +#define SQLITE_DBSTATUS_CACHE_MISS 8 +#define SQLITE_DBSTATUS_CACHE_WRITE 9 +#define SQLITE_DBSTATUS_DEFERRED_FKS 10 +#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11 +#define SQLITE_DBSTATUS_CACHE_SPILL 12 +#define SQLITE_DBSTATUS_MAX 12 /* Largest defined DBSTATUS */ + + +/* +** CAPI3REF: Prepared Statement Status +** METHOD: sqlite3_stmt +** +** ^(Each prepared statement maintains various +** [SQLITE_STMTSTATUS counters] that measure the number +** of times it has performed specific operations.)^ These counters can +** be used to monitor the performance characteristics of the prepared +** statements. For example, if the number of table steps greatly exceeds +** the number of table searches or result rows, that would tend to indicate +** that the prepared statement is using a full table scan rather than +** an index. +** +** ^(This interface is used to retrieve and reset counter values from +** a [prepared statement]. The first argument is the prepared statement +** object to be interrogated. The second argument +** is an integer code for a specific [SQLITE_STMTSTATUS counter] +** to be interrogated.)^ +** ^The current value of the requested counter is returned. +** ^If the resetFlg is true, then the counter is reset to zero after this +** interface call returns. +** +** See also: [sqlite3_status()] and [sqlite3_db_status()]. +*/ +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); + +/* +** CAPI3REF: Status Parameters for prepared statements +** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters} +** +** These preprocessor macros define integer codes that name counter +** values associated with the [sqlite3_stmt_status()] interface. +** The meanings of the various counters are as follows: +** +**
+** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
SQLITE_STMTSTATUS_FULLSCAN_STEP
+**
^This is the number of times that SQLite has stepped forward in +** a table as part of a full table scan. Large numbers for this counter +** may indicate opportunities for performance improvement through +** careful use of indices.
+** +** [[SQLITE_STMTSTATUS_SORT]]
SQLITE_STMTSTATUS_SORT
+**
^This is the number of sort operations that have occurred. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance through careful use of indices.
+** +** [[SQLITE_STMTSTATUS_AUTOINDEX]]
SQLITE_STMTSTATUS_AUTOINDEX
+**
^This is the number of rows inserted into transient indices that +** were created automatically in order to help joins run faster. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance by adding permanent indices that do not +** need to be reinitialized each time the statement is run.
+** +** [[SQLITE_STMTSTATUS_VM_STEP]]
SQLITE_STMTSTATUS_VM_STEP
+**
^This is the number of virtual machine operations executed +** by the prepared statement if that number is less than or equal +** to 2147483647. The number of virtual machine operations can be +** used as a proxy for the total work done by the prepared statement. +** If the number of virtual machine operations exceeds 2147483647 +** then the value returned by this statement status code is undefined. +** +** [[SQLITE_STMTSTATUS_REPREPARE]]
SQLITE_STMTSTATUS_REPREPARE
+**
^This is the number of times that the prepare statement has been +** automatically regenerated due to schema changes or changes to +** [bound parameters] that might affect the query plan. +** +** [[SQLITE_STMTSTATUS_RUN]]
SQLITE_STMTSTATUS_RUN
+**
^This is the number of times that the prepared statement has +** been run. A single "run" for the purposes of this counter is one +** or more calls to [sqlite3_step()] followed by a call to [sqlite3_reset()]. +** The counter is incremented on the first [sqlite3_step()] call of each +** cycle. +** +** [[SQLITE_STMTSTATUS_MEMUSED]]
SQLITE_STMTSTATUS_MEMUSED
+**
^This is the approximate number of bytes of heap memory +** used to store the prepared statement. ^This value is not actually +** a counter, and so the resetFlg parameter to sqlite3_stmt_status() +** is ignored when the opcode is SQLITE_STMTSTATUS_MEMUSED. +**
+**
+*/ +#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 +#define SQLITE_STMTSTATUS_SORT 2 +#define SQLITE_STMTSTATUS_AUTOINDEX 3 +#define SQLITE_STMTSTATUS_VM_STEP 4 +#define SQLITE_STMTSTATUS_REPREPARE 5 +#define SQLITE_STMTSTATUS_RUN 6 +#define SQLITE_STMTSTATUS_MEMUSED 99 + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache type is opaque. It is implemented by +** the pluggable module. The SQLite core has no knowledge of +** its size or internal structure and never deals with the +** sqlite3_pcache object except by holding and passing pointers +** to the object. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache sqlite3_pcache; + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache_page object represents a single page in the +** page cache. The page cache will allocate instances of this +** object. Various methods of the page cache use pointers to instances +** of this object as parameters or as their return value. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache_page sqlite3_pcache_page; +struct sqlite3_pcache_page { + void *pBuf; /* The content of the page */ + void *pExtra; /* Extra information associated with the page */ +}; + +/* +** CAPI3REF: Application Defined Page Cache. +** KEYWORDS: {page cache} +** +** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can +** register an alternative page cache implementation by passing in an +** instance of the sqlite3_pcache_methods2 structure.)^ +** In many applications, most of the heap memory allocated by +** SQLite is used for the page cache. +** By implementing a +** custom page cache using this API, an application can better control +** the amount of memory consumed by SQLite, the way in which +** that memory is allocated and released, and the policies used to +** determine exactly which parts of a database file are cached and for +** how long. +** +** The alternative page cache mechanism is an +** extreme measure that is only needed by the most demanding applications. +** The built-in page cache is recommended for most uses. +** +** ^(The contents of the sqlite3_pcache_methods2 structure are copied to an +** internal buffer by SQLite within the call to [sqlite3_config]. Hence +** the application may discard the parameter after the call to +** [sqlite3_config()] returns.)^ +** +** [[the xInit() page cache method]] +** ^(The xInit() method is called once for each effective +** call to [sqlite3_initialize()])^ +** (usually only once during the lifetime of the process). ^(The xInit() +** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ +** The intent of the xInit() method is to set up global data structures +** required by the custom page cache implementation. +** ^(If the xInit() method is NULL, then the +** built-in default page cache is used instead of the application defined +** page cache.)^ +** +** [[the xShutdown() page cache method]] +** ^The xShutdown() method is called by [sqlite3_shutdown()]. +** It can be used to clean up +** any outstanding resources before process shutdown, if required. +** ^The xShutdown() method may be NULL. +** +** ^SQLite automatically serializes calls to the xInit method, +** so the xInit method need not be threadsafe. ^The +** xShutdown method is only called from [sqlite3_shutdown()] so it does +** not need to be threadsafe either. All other methods must be threadsafe +** in multithreaded applications. +** +** ^SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +** +** [[the xCreate() page cache methods]] +** ^SQLite invokes the xCreate() method to construct a new cache instance. +** SQLite will typically create one cache instance for each open database file, +** though this is not guaranteed. ^The +** first parameter, szPage, is the size in bytes of the pages that must +** be allocated by the cache. ^szPage will always a power of two. ^The +** second parameter szExtra is a number of bytes of extra storage +** associated with each page cache entry. ^The szExtra parameter will +** a number less than 250. SQLite will use the +** extra szExtra bytes on each page to store metadata about the underlying +** database page on disk. The value passed into szExtra depends +** on the SQLite version, the target platform, and how SQLite was compiled. +** ^The third argument to xCreate(), bPurgeable, is true if the cache being +** created will be used to cache database pages of a file stored on disk, or +** false if it is used for an in-memory database. The cache implementation +** does not have to do anything special based with the value of bPurgeable; +** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will +** never invoke xUnpin() except to deliberately delete a page. +** ^In other words, calls to xUnpin() on a cache with bPurgeable set to +** false will always have the "discard" flag set to true. +** ^Hence, a cache created with bPurgeable false will +** never contain any unpinned pages. +** +** [[the xCachesize() page cache method]] +** ^(The xCachesize() method may be called at any time by SQLite to set the +** suggested maximum cache-size (number of pages stored by) the cache +** instance passed as the first argument. This is the value configured using +** the SQLite "[PRAGMA cache_size]" command.)^ As with the bPurgeable +** parameter, the implementation is not required to do anything with this +** value; it is advisory only. +** +** [[the xPagecount() page cache methods]] +** The xPagecount() method must return the number of pages currently +** stored in the cache, both pinned and unpinned. +** +** [[the xFetch() page cache methods]] +** The xFetch() method locates a page in the cache and returns a pointer to +** an sqlite3_pcache_page object associated with that page, or a NULL pointer. +** The pBuf element of the returned sqlite3_pcache_page object will be a +** pointer to a buffer of szPage bytes used to store the content of a +** single database page. The pExtra element of sqlite3_pcache_page will be +** a pointer to the szExtra bytes of extra storage that SQLite has requested +** for each entry in the page cache. +** +** The page to be fetched is determined by the key. ^The minimum key value +** is 1. After it has been retrieved using xFetch, the page is considered +** to be "pinned". +** +** If the requested page is already in the page cache, then the page cache +** implementation must return a pointer to the page buffer with its content +** intact. If the requested page is not already in the cache, then the +** cache implementation should use the value of the createFlag +** parameter to help it determined what action to take: +** +** +**
createFlag Behavior when page is not already in cache +**
0 Do not allocate a new page. Return NULL. +**
1 Allocate a new page if it easy and convenient to do so. +** Otherwise return NULL. +**
2 Make every effort to allocate a new page. Only return +** NULL if allocating a new page is effectively impossible. +**
+** +** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite +** will only use a createFlag of 2 after a prior call with a createFlag of 1 +** failed.)^ In between the xFetch() calls, SQLite may +** attempt to unpin one or more cache pages by spilling the content of +** pinned pages to disk and synching the operating system disk cache. +** +** [[the xUnpin() page cache method]] +** ^xUnpin() is called by SQLite with a pointer to a currently pinned page +** as its second argument. If the third parameter, discard, is non-zero, +** then the page must be evicted from the cache. +** ^If the discard parameter is +** zero, then the page may be discarded or retained at the discretion of +** page cache implementation. ^The page cache implementation +** may choose to evict unpinned pages at any time. +** +** The cache must not perform any reference counting. A single +** call to xUnpin() unpins the page regardless of the number of prior calls +** to xFetch(). +** +** [[the xRekey() page cache methods]] +** The xRekey() method is used to change the key value associated with the +** page passed as the second argument. If the cache +** previously contains an entry associated with newKey, it must be +** discarded. ^Any prior cache entry associated with newKey is guaranteed not +** to be pinned. +** +** When SQLite calls the xTruncate() method, the cache must discard all +** existing cache entries with page numbers (keys) greater than or equal +** to the value of the iLimit parameter passed to xTruncate(). If any +** of these pages are pinned, they are implicitly unpinned, meaning that +** they can be safely discarded. +** +** [[the xDestroy() page cache method]] +** ^The xDestroy() method is used to delete a cache allocated by xCreate(). +** All resources associated with the specified cache should be freed. ^After +** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] +** handle invalid, and will not use it with any other sqlite3_pcache_methods2 +** functions. +** +** [[the xShrink() page cache method]] +** ^SQLite invokes the xShrink() method when it wants the page cache to +** free up as much of heap memory as possible. The page cache implementation +** is not obligated to free any memory, but well-behaved implementations should +** do their best. +*/ +typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; +struct sqlite3_pcache_methods2 { + int iVersion; + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); + void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, + unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); + void (*xShrink)(sqlite3_pcache*); +}; + +/* +** This is the obsolete pcache_methods object that has now been replaced +** by sqlite3_pcache_methods2. This object is not used by SQLite. It is +** retained in the header file for backwards compatibility only. +*/ +typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; +struct sqlite3_pcache_methods { + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, void*, int discard); + void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); +}; + + +/* +** CAPI3REF: Online Backup Object +** +** The sqlite3_backup object records state information about an ongoing +** online backup operation. ^The sqlite3_backup object is created by +** a call to [sqlite3_backup_init()] and is destroyed by a call to +** [sqlite3_backup_finish()]. +** +** See Also: [Using the SQLite Online Backup API] +*/ +typedef struct sqlite3_backup sqlite3_backup; + +/* +** CAPI3REF: Online Backup API. +** +** The backup API copies the content of one database into another. +** It is useful either for creating backups of databases or +** for copying in-memory databases to or from persistent files. +** +** See Also: [Using the SQLite Online Backup API] +** +** ^SQLite holds a write transaction open on the destination database file +** for the duration of the backup operation. +** ^The source database is read-locked only while it is being read; +** it is not locked continuously for the entire backup operation. +** ^Thus, the backup may be performed on a live source database without +** preventing other database connections from +** reading or writing to the source database while the backup is underway. +** +** ^(To perform a backup operation: +**
    +**
  1. sqlite3_backup_init() is called once to initialize the +** backup, +**
  2. sqlite3_backup_step() is called one or more times to transfer +** the data between the two databases, and finally +**
  3. sqlite3_backup_finish() is called to release all resources +** associated with the backup operation. +**
)^ +** There should be exactly one call to sqlite3_backup_finish() for each +** successful call to sqlite3_backup_init(). +** +** [[sqlite3_backup_init()]] sqlite3_backup_init() +** +** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the +** [database connection] associated with the destination database +** and the database name, respectively. +** ^The database name is "main" for the main database, "temp" for the +** temporary database, or the name specified after the AS keyword in +** an [ATTACH] statement for an attached database. +** ^The S and M arguments passed to +** sqlite3_backup_init(D,N,S,M) identify the [database connection] +** and database name of the source database, respectively. +** ^The source and destination [database connections] (parameters S and D) +** must be different or else sqlite3_backup_init(D,N,S,M) will fail with +** an error. +** +** ^A call to sqlite3_backup_init() will fail, returning NULL, if +** there is already a read or read-write transaction open on the +** destination database. +** +** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is +** returned and an error code and error message are stored in the +** destination [database connection] D. +** ^The error code and message for the failed call to sqlite3_backup_init() +** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or +** [sqlite3_errmsg16()] functions. +** ^A successful call to sqlite3_backup_init() returns a pointer to an +** [sqlite3_backup] object. +** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and +** sqlite3_backup_finish() functions to perform the specified backup +** operation. +** +** [[sqlite3_backup_step()]] sqlite3_backup_step() +** +** ^Function sqlite3_backup_step(B,N) will copy up to N pages between +** the source and destination databases specified by [sqlite3_backup] object B. +** ^If N is negative, all remaining source pages are copied. +** ^If sqlite3_backup_step(B,N) successfully copies N pages and there +** are still more pages to be copied, then the function returns [SQLITE_OK]. +** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages +** from source to destination, then it returns [SQLITE_DONE]. +** ^If an error occurs while running sqlite3_backup_step(B,N), +** then an [error code] is returned. ^As well as [SQLITE_OK] and +** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], +** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. +** +** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if +**
    +**
  1. the destination database was opened read-only, or +**
  2. the destination database is using write-ahead-log journaling +** and the destination and source page sizes differ, or +**
  3. the destination database is an in-memory database and the +** destination and source page sizes differ. +**
)^ +** +** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then +** the [sqlite3_busy_handler | busy-handler function] +** is invoked (if one is specified). ^If the +** busy-handler returns non-zero before the lock is available, then +** [SQLITE_BUSY] is returned to the caller. ^In this case the call to +** sqlite3_backup_step() can be retried later. ^If the source +** [database connection] +** is being used to write to the source database when sqlite3_backup_step() +** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this +** case the call to sqlite3_backup_step() can be retried later on. ^(If +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or +** [SQLITE_READONLY] is returned, then +** there is no point in retrying the call to sqlite3_backup_step(). These +** errors are considered fatal.)^ The application must accept +** that the backup operation has failed and pass the backup operation handle +** to the sqlite3_backup_finish() to release associated resources. +** +** ^The first call to sqlite3_backup_step() obtains an exclusive lock +** on the destination file. ^The exclusive lock is not released until either +** sqlite3_backup_finish() is called or the backup operation is complete +** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to +** sqlite3_backup_step() obtains a [shared lock] on the source database that +** lasts for the duration of the sqlite3_backup_step() call. +** ^Because the source database is not locked between calls to +** sqlite3_backup_step(), the source database may be modified mid-way +** through the backup process. ^If the source database is modified by an +** external process or via a database connection other than the one being +** used by the backup operation, then the backup will be automatically +** restarted by the next call to sqlite3_backup_step(). ^If the source +** database is modified by the using the same database connection as is used +** by the backup operation, then the backup database is automatically +** updated at the same time. +** +** [[sqlite3_backup_finish()]] sqlite3_backup_finish() +** +** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the +** application wishes to abandon the backup operation, the application +** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). +** ^The sqlite3_backup_finish() interfaces releases all +** resources associated with the [sqlite3_backup] object. +** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any +** active write-transaction on the destination database is rolled back. +** The [sqlite3_backup] object is invalid +** and may not be used following a call to sqlite3_backup_finish(). +** +** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no +** sqlite3_backup_step() errors occurred, regardless or whether or not +** sqlite3_backup_step() completed. +** ^If an out-of-memory condition or IO error occurred during any prior +** sqlite3_backup_step() call on the same [sqlite3_backup] object, then +** sqlite3_backup_finish() returns the corresponding [error code]. +** +** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() +** is not a permanent error and does not affect the return value of +** sqlite3_backup_finish(). +** +** [[sqlite3_backup_remaining()]] [[sqlite3_backup_pagecount()]] +** sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** +** ^The sqlite3_backup_remaining() routine returns the number of pages still +** to be backed up at the conclusion of the most recent sqlite3_backup_step(). +** ^The sqlite3_backup_pagecount() routine returns the total number of pages +** in the source database at the conclusion of the most recent +** sqlite3_backup_step(). +** ^(The values returned by these functions are only updated by +** sqlite3_backup_step(). If the source database is modified in a way that +** changes the size of the source database or the number of pages remaining, +** those changes are not reflected in the output of sqlite3_backup_pagecount() +** and sqlite3_backup_remaining() until after the next +** sqlite3_backup_step().)^ +** +** Concurrent Usage of Database Handles +** +** ^The source [database connection] may be used by the application for other +** purposes while a backup operation is underway or being initialized. +** ^If SQLite is compiled and configured to support threadsafe database +** connections, then the source database connection may be used concurrently +** from within other threads. +** +** However, the application must guarantee that the destination +** [database connection] is not passed to any other API (by any thread) after +** sqlite3_backup_init() is called and before the corresponding call to +** sqlite3_backup_finish(). SQLite does not currently check to see +** if the application incorrectly accesses the destination [database connection] +** and so no error code is reported, but the operations may malfunction +** nevertheless. Use of the destination database connection while a +** backup is in progress might also also cause a mutex deadlock. +** +** If running in [shared cache mode], the application must +** guarantee that the shared cache used by the destination database +** is not accessed while the backup is running. In practice this means +** that the application must guarantee that the disk file being +** backed up to is not accessed by any connection within the process, +** not just the specific connection that was passed to sqlite3_backup_init(). +** +** The [sqlite3_backup] object itself is partially threadsafe. Multiple +** threads may safely make multiple concurrent calls to sqlite3_backup_step(). +** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** APIs are not strictly speaking threadsafe. If they are invoked at the +** same time as another thread is invoking sqlite3_backup_step() it is +** possible that they return invalid values. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3 *pDest, /* Destination database handle */ + const char *zDestName, /* Destination database name */ + sqlite3 *pSource, /* Source database handle */ + const char *zSourceName /* Source database name */ +); +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); + +/* +** CAPI3REF: Unlock Notification +** METHOD: sqlite3 +** +** ^When running in shared-cache mode, a database operation may fail with +** an [SQLITE_LOCKED] error if the required locks on the shared-cache or +** individual tables within the shared-cache cannot be obtained. See +** [SQLite Shared-Cache Mode] for a description of shared-cache locking. +** ^This API may be used to register a callback that SQLite will invoke +** when the connection currently holding the required lock relinquishes it. +** ^This API is only available if the library was compiled with the +** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. +** +** See Also: [Using the SQLite Unlock Notification Feature]. +** +** ^Shared-cache locks are released when a database connection concludes +** its current transaction, either by committing it or rolling it back. +** +** ^When a connection (known as the blocked connection) fails to obtain a +** shared-cache lock and SQLITE_LOCKED is returned to the caller, the +** identity of the database connection (the blocking connection) that +** has locked the required resource is stored internally. ^After an +** application receives an SQLITE_LOCKED error, it may call the +** sqlite3_unlock_notify() method with the blocked connection handle as +** the first argument to register for a callback that will be invoked +** when the blocking connections current transaction is concluded. ^The +** callback is invoked from within the [sqlite3_step] or [sqlite3_close] +** call that concludes the blocking connection's transaction. +** +** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, +** there is a chance that the blocking connection will have already +** concluded its transaction by the time sqlite3_unlock_notify() is invoked. +** If this happens, then the specified callback is invoked immediately, +** from within the call to sqlite3_unlock_notify().)^ +** +** ^If the blocked connection is attempting to obtain a write-lock on a +** shared-cache table, and more than one other connection currently holds +** a read-lock on the same table, then SQLite arbitrarily selects one of +** the other connections to use as the blocking connection. +** +** ^(There may be at most one unlock-notify callback registered by a +** blocked connection. If sqlite3_unlock_notify() is called when the +** blocked connection already has a registered unlock-notify callback, +** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is +** called with a NULL pointer as its second argument, then any existing +** unlock-notify callback is canceled. ^The blocked connections +** unlock-notify callback may also be canceled by closing the blocked +** connection using [sqlite3_close()]. +** +** The unlock-notify callback is not reentrant. If an application invokes +** any sqlite3_xxx API functions from within an unlock-notify callback, a +** crash or deadlock may be the result. +** +** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always +** returns SQLITE_OK. +** +** Callback Invocation Details +** +** When an unlock-notify callback is registered, the application provides a +** single void* pointer that is passed to the callback when it is invoked. +** However, the signature of the callback function allows SQLite to pass +** it an array of void* context pointers. The first argument passed to +** an unlock-notify callback is a pointer to an array of void* pointers, +** and the second is the number of entries in the array. +** +** When a blocking connection's transaction is concluded, there may be +** more than one blocked connection that has registered for an unlock-notify +** callback. ^If two or more such blocked connections have specified the +** same callback function, then instead of invoking the callback function +** multiple times, it is invoked once with the set of void* context pointers +** specified by the blocked connections bundled together into an array. +** This gives the application an opportunity to prioritize any actions +** related to the set of unblocked database connections. +** +** Deadlock Detection +** +** Assuming that after registering for an unlock-notify callback a +** database waits for the callback to be issued before taking any further +** action (a reasonable assumption), then using this API may cause the +** application to deadlock. For example, if connection X is waiting for +** connection Y's transaction to be concluded, and similarly connection +** Y is waiting on connection X's transaction, then neither connection +** will proceed and the system may remain deadlocked indefinitely. +** +** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock +** detection. ^If a given call to sqlite3_unlock_notify() would put the +** system in a deadlocked state, then SQLITE_LOCKED is returned and no +** unlock-notify callback is registered. The system is said to be in +** a deadlocked state if connection A has registered for an unlock-notify +** callback on the conclusion of connection B's transaction, and connection +** B has itself registered for an unlock-notify callback when connection +** A's transaction is concluded. ^Indirect deadlock is also detected, so +** the system is also considered to be deadlocked if connection B has +** registered for an unlock-notify callback on the conclusion of connection +** C's transaction, where connection C is waiting on connection A. ^Any +** number of levels of indirection are allowed. +** +** The "DROP TABLE" Exception +** +** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost +** always appropriate to call sqlite3_unlock_notify(). There is however, +** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, +** SQLite checks if there are any currently executing SELECT statements +** that belong to the same connection. If there are, SQLITE_LOCKED is +** returned. In this case there is no "blocking connection", so invoking +** sqlite3_unlock_notify() results in the unlock-notify callback being +** invoked immediately. If the application then re-attempts the "DROP TABLE" +** or "DROP INDEX" query, an infinite loop might be the result. +** +** One way around this problem is to check the extended error code returned +** by an sqlite3_step() call. ^(If there is a blocking connection, then the +** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in +** the special "DROP TABLE/INDEX" case, the extended error code is just +** SQLITE_LOCKED.)^ +*/ +SQLITE_API int sqlite3_unlock_notify( + sqlite3 *pBlocked, /* Waiting connection */ + void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ + void *pNotifyArg /* Argument to pass to xNotify */ +); + + +/* +** CAPI3REF: String Comparison +** +** ^The [sqlite3_stricmp()] and [sqlite3_strnicmp()] APIs allow applications +** and extensions to compare the contents of two buffers containing UTF-8 +** strings in a case-independent fashion, using the same definition of "case +** independence" that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_stricmp(const char *, const char *); +SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); + +/* +** CAPI3REF: String Globbing +* +** ^The [sqlite3_strglob(P,X)] interface returns zero if and only if +** string X matches the [GLOB] pattern P. +** ^The definition of [GLOB] pattern matching used in +** [sqlite3_strglob(P,X)] is the same as for the "X GLOB P" operator in the +** SQL dialect understood by SQLite. ^The [sqlite3_strglob(P,X)] function +** is case sensitive. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strlike()]. +*/ +SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); + +/* +** CAPI3REF: String LIKE Matching +* +** ^The [sqlite3_strlike(P,X,E)] interface returns zero if and only if +** string X matches the [LIKE] pattern P with escape character E. +** ^The definition of [LIKE] pattern matching used in +** [sqlite3_strlike(P,X,E)] is the same as for the "X LIKE P ESCAPE E" +** operator in the SQL dialect understood by SQLite. ^For "X LIKE P" without +** the ESCAPE clause, set the E parameter of [sqlite3_strlike(P,X,E)] to 0. +** ^As with the LIKE operator, the [sqlite3_strlike(P,X,E)] function is case +** insensitive - equivalent upper and lower case ASCII characters match +** one another. +** +** ^The [sqlite3_strlike(P,X,E)] function matches Unicode characters, though +** only ASCII characters are case folded. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strglob()]. +*/ +SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int cEsc); + +/* +** CAPI3REF: Error Logging Interface +** +** ^The [sqlite3_log()] interface writes a message into the [error log] +** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. +** ^If logging is enabled, the zFormat string and subsequent arguments are +** used with [sqlite3_snprintf()] to generate the final output string. +** +** The sqlite3_log() interface is intended for use by extensions such as +** virtual tables, collating functions, and SQL functions. While there is +** nothing to prevent an application from calling sqlite3_log(), doing so +** is considered bad form. +** +** The zFormat string must not be NULL. +** +** To avoid deadlocks and other threading problems, the sqlite3_log() routine +** will not use dynamically allocated memory. The log message is stored in +** a fixed-length buffer on the stack. If the log message is longer than +** a few hundred characters, it will be truncated to the length of the +** buffer. +*/ +SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); + +/* +** CAPI3REF: Write-Ahead Log Commit Hook +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_hook()] function is used to register a callback that +** is invoked each time data is committed to a database in wal mode. +** +** ^(The callback is invoked by SQLite after the commit has taken place and +** the associated write-lock on the database released)^, so the implementation +** may read, write or [checkpoint] the database as required. +** +** ^The first parameter passed to the callback function when it is invoked +** is a copy of the third parameter passed to sqlite3_wal_hook() when +** registering the callback. ^The second is a copy of the database handle. +** ^The third parameter is the name of the database that was written to - +** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter +** is the number of pages currently in the write-ahead log file, +** including those that were just committed. +** +** The callback function should normally return [SQLITE_OK]. ^If an error +** code is returned, that error will propagate back up through the +** SQLite code base to cause the statement that provoked the callback +** to report an error, though the commit will have still occurred. If the +** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value +** that does not correspond to any valid SQLite error code, the results +** are undefined. +** +** A single database handle may have at most a single write-ahead log callback +** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any +** previously registered write-ahead log callback. ^Note that the +** [sqlite3_wal_autocheckpoint()] interface and the +** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will +** overwrite any prior [sqlite3_wal_hook()] settings. +*/ +SQLITE_API void *sqlite3_wal_hook( + sqlite3*, + int(*)(void *,sqlite3*,const char*,int), + void* +); + +/* +** CAPI3REF: Configure an auto-checkpoint +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around +** [sqlite3_wal_hook()] that causes any database on [database connection] D +** to automatically [checkpoint] +** after committing a transaction if there are N or +** more frames in the [write-ahead log] file. ^Passing zero or +** a negative value as the nFrame parameter disables automatic +** checkpoints entirely. +** +** ^The callback registered by this function replaces any existing callback +** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback +** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism +** configured by this function. +** +** ^The [wal_autocheckpoint pragma] can be used to invoke this interface +** from SQL. +** +** ^Checkpoints initiated by this mechanism are +** [sqlite3_wal_checkpoint_v2|PASSIVE]. +** +** ^Every new [database connection] defaults to having the auto-checkpoint +** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] +** pages. The use of this interface +** is only necessary if the default setting is found to be suboptimal +** for a particular application. +*/ +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint(D,X) is equivalent to +** [sqlite3_wal_checkpoint_v2](D,X,[SQLITE_CHECKPOINT_PASSIVE],0,0).)^ +** +** In brief, sqlite3_wal_checkpoint(D,X) causes the content in the +** [write-ahead log] for database X on [database connection] D to be +** transferred into the database file and for the write-ahead log to +** be reset. See the [checkpointing] documentation for addition +** information. +** +** This interface used to be the only way to cause a checkpoint to +** occur. But then the newer and more powerful [sqlite3_wal_checkpoint_v2()] +** interface was added. This interface is retained for backwards +** compatibility and as a convenience for applications that need to manually +** start a callback but which do not need the full power (and corresponding +** complication) of [sqlite3_wal_checkpoint_v2()]. +*/ +SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint_v2(D,X,M,L,C) interface runs a checkpoint +** operation on database X of [database connection] D in mode M. Status +** information is written back into integers pointed to by L and C.)^ +** ^(The M parameter must be a valid [checkpoint mode]:)^ +** +**
+**
SQLITE_CHECKPOINT_PASSIVE
+** ^Checkpoint as many frames as possible without waiting for any database +** readers or writers to finish, then sync the database file if all frames +** in the log were checkpointed. ^The [busy-handler callback] +** is never invoked in the SQLITE_CHECKPOINT_PASSIVE mode. +** ^On the other hand, passive mode might leave the checkpoint unfinished +** if there are concurrent readers or writers. +** +**
SQLITE_CHECKPOINT_FULL
+** ^This mode blocks (it invokes the +** [sqlite3_busy_handler|busy-handler callback]) until there is no +** database writer and all readers are reading from the most recent database +** snapshot. ^It then checkpoints all frames in the log file and syncs the +** database file. ^This mode blocks new database writers while it is pending, +** but new database readers are allowed to continue unimpeded. +** +**
SQLITE_CHECKPOINT_RESTART
+** ^This mode works the same way as SQLITE_CHECKPOINT_FULL with the addition +** that after checkpointing the log file it blocks (calls the +** [busy-handler callback]) +** until all readers are reading from the database file only. ^This ensures +** that the next writer will restart the log file from the beginning. +** ^Like SQLITE_CHECKPOINT_FULL, this mode blocks new +** database writer attempts while it is pending, but does not impede readers. +** +**
SQLITE_CHECKPOINT_TRUNCATE
+** ^This mode works the same way as SQLITE_CHECKPOINT_RESTART with the +** addition that it also truncates the log file to zero bytes just prior +** to a successful return. +**
+** +** ^If pnLog is not NULL, then *pnLog is set to the total number of frames in +** the log file or to -1 if the checkpoint could not run because +** of an error or because the database is not in [WAL mode]. ^If pnCkpt is not +** NULL,then *pnCkpt is set to the total number of checkpointed frames in the +** log file (including any that were already checkpointed before the function +** was called) or to -1 if the checkpoint could not run due to an error or +** because the database is not in WAL mode. ^Note that upon successful +** completion of an SQLITE_CHECKPOINT_TRUNCATE, the log file will have been +** truncated to zero bytes and so both *pnLog and *pnCkpt will be set to zero. +** +** ^All calls obtain an exclusive "checkpoint" lock on the database file. ^If +** any other process is running a checkpoint operation at the same time, the +** lock cannot be obtained and SQLITE_BUSY is returned. ^Even if there is a +** busy-handler configured, it will not be invoked in this case. +** +** ^The SQLITE_CHECKPOINT_FULL, RESTART and TRUNCATE modes also obtain the +** exclusive "writer" lock on the database file. ^If the writer lock cannot be +** obtained immediately, and a busy-handler is configured, it is invoked and +** the writer lock retried until either the busy-handler returns 0 or the lock +** is successfully obtained. ^The busy-handler is also invoked while waiting for +** database readers as described above. ^If the busy-handler returns 0 before +** the writer lock is obtained or while waiting for database readers, the +** checkpoint operation proceeds from that point in the same way as +** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible +** without blocking any further. ^SQLITE_BUSY is returned in this case. +** +** ^If parameter zDb is NULL or points to a zero length string, then the +** specified operation is attempted on all WAL databases [attached] to +** [database connection] db. In this case the +** values written to output parameters *pnLog and *pnCkpt are undefined. ^If +** an SQLITE_BUSY error is encountered when processing one or more of the +** attached WAL databases, the operation is still attempted on any remaining +** attached databases and SQLITE_BUSY is returned at the end. ^If any other +** error occurs while processing an attached database, processing is abandoned +** and the error code is returned to the caller immediately. ^If no error +** (SQLITE_BUSY or otherwise) is encountered while processing the attached +** databases, SQLITE_OK is returned. +** +** ^If database zDb is the name of an attached database that is not in WAL +** mode, SQLITE_OK is returned and both *pnLog and *pnCkpt set to -1. ^If +** zDb is not NULL (or a zero length string) and is not the name of any +** attached database, SQLITE_ERROR is returned to the caller. +** +** ^Unless it returns SQLITE_MISUSE, +** the sqlite3_wal_checkpoint_v2() interface +** sets the error information that is queried by +** [sqlite3_errcode()] and [sqlite3_errmsg()]. +** +** ^The [PRAGMA wal_checkpoint] command can be used to invoke this interface +** from SQL. +*/ +SQLITE_API int sqlite3_wal_checkpoint_v2( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of attached database (or NULL) */ + int eMode, /* SQLITE_CHECKPOINT_* value */ + int *pnLog, /* OUT: Size of WAL log in frames */ + int *pnCkpt /* OUT: Total number of frames checkpointed */ +); + +/* +** CAPI3REF: Checkpoint Mode Values +** KEYWORDS: {checkpoint mode} +** +** These constants define all valid values for the "checkpoint mode" passed +** as the third parameter to the [sqlite3_wal_checkpoint_v2()] interface. +** See the [sqlite3_wal_checkpoint_v2()] documentation for details on the +** meaning of each of these checkpoint modes. +*/ +#define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */ +#define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */ +#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for for readers */ +#define SQLITE_CHECKPOINT_TRUNCATE 3 /* Like RESTART but also truncate WAL */ + +/* +** CAPI3REF: Virtual Table Interface Configuration +** +** This function may be called by either the [xConnect] or [xCreate] method +** of a [virtual table] implementation to configure +** various facets of the virtual table interface. +** +** If this interface is invoked outside the context of an xConnect or +** xCreate virtual table method then the behavior is undefined. +** +** In the call sqlite3_vtab_config(D,C,...) the D parameter is the +** [database connection] in which the virtual table is being created and +** which is passed in as the first argument to the [xConnect] or [xCreate] +** method that is invoking sqlite3_vtab_config(). The C parameter is one +** of the [virtual table configuration options]. The presence and meaning +** of parameters after C depend on which [virtual table configuration option] +** is used. +*/ +SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Virtual Table Configuration Options +** KEYWORDS: {virtual table configuration options} +** KEYWORDS: {virtual table configuration option} +** +** These macros define the various options to the +** [sqlite3_vtab_config()] interface that [virtual table] implementations +** can use to customize and optimize their behavior. +** +**
+** [[SQLITE_VTAB_CONSTRAINT_SUPPORT]] +**
SQLITE_VTAB_CONSTRAINT_SUPPORT
+**
Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, +** where X is an integer. If X is zero, then the [virtual table] whose +** [xCreate] or [xConnect] method invoked [sqlite3_vtab_config()] does not +** support constraints. In this configuration (which is the default) if +** a call to the [xUpdate] method returns [SQLITE_CONSTRAINT], then the entire +** statement is rolled back as if [ON CONFLICT | OR ABORT] had been +** specified as part of the users SQL statement, regardless of the actual +** ON CONFLICT mode specified. +** +** If X is non-zero, then the virtual table implementation guarantees +** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before +** any modifications to internal or persistent data structures have been made. +** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite +** is able to roll back a statement or database transaction, and abandon +** or continue processing the current SQL statement as appropriate. +** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns +** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode +** had been ABORT. +** +** Virtual table implementations that are required to handle OR REPLACE +** must do so within the [xUpdate] method. If a call to the +** [sqlite3_vtab_on_conflict()] function indicates that the current ON +** CONFLICT policy is REPLACE, the virtual table implementation should +** silently replace the appropriate rows within the xUpdate callback and +** return SQLITE_OK. Or, if this is not possible, it may return +** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT +** constraint handling. +**
+** +** [[SQLITE_VTAB_DIRECTONLY]]
SQLITE_VTAB_DIRECTONLY
+**
Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_DIRECTONLY) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** prohibits that virtual table from being used from within triggers and +** views. +**
+** +** [[SQLITE_VTAB_INNOCUOUS]]
SQLITE_VTAB_INNOCUOUS
+**
Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_INNOCUOUS) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** identify that virtual table as being safe to use from within triggers +** and views. Conceptually, the SQLITE_VTAB_INNOCUOUS tag means that the +** virtual table can do no serious harm even if it is controlled by a +** malicious hacker. Developers should avoid setting the SQLITE_VTAB_INNOCUOUS +** flag unless absolutely necessary. +**
+**
+*/ +#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 +#define SQLITE_VTAB_INNOCUOUS 2 +#define SQLITE_VTAB_DIRECTONLY 3 + +/* +** CAPI3REF: Determine The Virtual Table Conflict Policy +** +** This function may only be called from within a call to the [xUpdate] method +** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The +** value returned is one of [SQLITE_ROLLBACK], [SQLITE_IGNORE], [SQLITE_FAIL], +** [SQLITE_ABORT], or [SQLITE_REPLACE], according to the [ON CONFLICT] mode +** of the SQL statement that triggered the call to the [xUpdate] method of the +** [virtual table]. +*/ +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); + +/* +** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE +** +** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn] +** method of a [virtual table], then it returns true if and only if the +** column is being fetched as part of an UPDATE operation during which the +** column value will not change. Applications might use this to substitute +** a return value that is less expensive to compute and that the corresponding +** [xUpdate] method understands as a "no-change" value. +** +** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that +** the column is not changed by the UPDATE statement, then the xColumn +** method can optionally return without setting a result, without calling +** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces]. +** In that case, [sqlite3_value_nochange(X)] will return true for the +** same column in the [xUpdate] method. +*/ +SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); + +/* +** CAPI3REF: Determine The Collation For a Virtual Table Constraint +** +** This function may only be called from within a call to the [xBestIndex] +** method of a [virtual table]. +** +** The first argument must be the sqlite3_index_info object that is the +** first parameter to the xBestIndex() method. The second argument must be +** an index into the aConstraint[] array belonging to the sqlite3_index_info +** structure passed to xBestIndex. This function returns a pointer to a buffer +** containing the name of the collation sequence for the corresponding +** constraint. +*/ +SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); + +/* +** CAPI3REF: Conflict resolution modes +** KEYWORDS: {conflict resolution mode} +** +** These constants are returned by [sqlite3_vtab_on_conflict()] to +** inform a [virtual table] implementation what the [ON CONFLICT] mode +** is for the SQL statement being evaluated. +** +** Note that the [SQLITE_IGNORE] constant is also used as a potential +** return value from the [sqlite3_set_authorizer()] callback and that +** [SQLITE_ABORT] is also a [result code]. +*/ +#define SQLITE_ROLLBACK 1 +/* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */ +#define SQLITE_FAIL 3 +/* #define SQLITE_ABORT 4 // Also an error code */ +#define SQLITE_REPLACE 5 + +/* +** CAPI3REF: Prepared Statement Scan Status Opcodes +** KEYWORDS: {scanstatus options} +** +** The following constants can be used for the T parameter to the +** [sqlite3_stmt_scanstatus(S,X,T,V)] interface. Each constant designates a +** different metric for sqlite3_stmt_scanstatus() to return. +** +** When the value returned to V is a string, space to hold that string is +** managed by the prepared statement S and will be automatically freed when +** S is finalized. +** +**
+** [[SQLITE_SCANSTAT_NLOOP]]
SQLITE_SCANSTAT_NLOOP
+**
^The [sqlite3_int64] variable pointed to by the V parameter will be +** set to the total number of times that the X-th loop has run.
+** +** [[SQLITE_SCANSTAT_NVISIT]]
SQLITE_SCANSTAT_NVISIT
+**
^The [sqlite3_int64] variable pointed to by the V parameter will be set +** to the total number of rows examined by all iterations of the X-th loop.
+** +** [[SQLITE_SCANSTAT_EST]]
SQLITE_SCANSTAT_EST
+**
^The "double" variable pointed to by the V parameter will be set to the +** query planner's estimate for the average number of rows output from each +** iteration of the X-th loop. If the query planner's estimates was accurate, +** then this value will approximate the quotient NVISIT/NLOOP and the +** product of this value for all prior loops with the same SELECTID will +** be the NLOOP value for the current loop. +** +** [[SQLITE_SCANSTAT_NAME]]
SQLITE_SCANSTAT_NAME
+**
^The "const char *" variable pointed to by the V parameter will be set +** to a zero-terminated UTF-8 string containing the name of the index or table +** used for the X-th loop. +** +** [[SQLITE_SCANSTAT_EXPLAIN]]
SQLITE_SCANSTAT_EXPLAIN
+**
^The "const char *" variable pointed to by the V parameter will be set +** to a zero-terminated UTF-8 string containing the [EXPLAIN QUERY PLAN] +** description for the X-th loop. +** +** [[SQLITE_SCANSTAT_SELECTID]]
SQLITE_SCANSTAT_SELECT
+**
^The "int" variable pointed to by the V parameter will be set to the +** "select-id" for the X-th loop. The select-id identifies which query or +** subquery the loop is part of. The main query has a select-id of zero. +** The select-id is the same value as is output in the first column +** of an [EXPLAIN QUERY PLAN] query. +**
+*/ +#define SQLITE_SCANSTAT_NLOOP 0 +#define SQLITE_SCANSTAT_NVISIT 1 +#define SQLITE_SCANSTAT_EST 2 +#define SQLITE_SCANSTAT_NAME 3 +#define SQLITE_SCANSTAT_EXPLAIN 4 +#define SQLITE_SCANSTAT_SELECTID 5 + +/* +** CAPI3REF: Prepared Statement Scan Status +** METHOD: sqlite3_stmt +** +** This interface returns information about the predicted and measured +** performance for pStmt. Advanced applications can use this +** interface to compare the predicted and the measured performance and +** issue warnings and/or rerun [ANALYZE] if discrepancies are found. +** +** Since this interface is expected to be rarely used, it is only +** available if SQLite is compiled using the [SQLITE_ENABLE_STMT_SCANSTATUS] +** compile-time option. +** +** The "iScanStatusOp" parameter determines which status information to return. +** The "iScanStatusOp" must be one of the [scanstatus options] or the behavior +** of this interface is undefined. +** ^The requested measurement is written into a variable pointed to by +** the "pOut" parameter. +** Parameter "idx" identifies the specific loop to retrieve statistics for. +** Loops are numbered starting from zero. ^If idx is out of range - less than +** zero or greater than or equal to the total number of loops used to implement +** the statement - a non-zero value is returned and the variable that pOut +** points to is unchanged. +** +** ^Statistics might not be available for all loops in all statements. ^In cases +** where there exist loops with no available statistics, this function behaves +** as if the loop did not exist - it returns non-zero and leave the variable +** that pOut points to unchanged. +** +** See also: [sqlite3_stmt_scanstatus_reset()] +*/ +SQLITE_API int sqlite3_stmt_scanstatus( + sqlite3_stmt *pStmt, /* Prepared statement for which info desired */ + int idx, /* Index of loop to report on */ + int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */ + void *pOut /* Result written here */ +); + +/* +** CAPI3REF: Zero Scan-Status Counters +** METHOD: sqlite3_stmt +** +** ^Zero all [sqlite3_stmt_scanstatus()] related event counters. +** +** This API is only available if the library is built with pre-processor +** symbol [SQLITE_ENABLE_STMT_SCANSTATUS] defined. +*/ +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); + +/* +** CAPI3REF: Flush caches to disk mid-transaction +** +** ^If a write-transaction is open on [database connection] D when the +** [sqlite3_db_cacheflush(D)] interface invoked, any dirty +** pages in the pager-cache that are not currently in use are written out +** to disk. A dirty page may be in use if a database cursor created by an +** active SQL statement is reading from it, or if it is page 1 of a database +** file (page 1 is always "in use"). ^The [sqlite3_db_cacheflush(D)] +** interface flushes caches for all schemas - "main", "temp", and +** any [attached] databases. +** +** ^If this function needs to obtain extra database locks before dirty pages +** can be flushed to disk, it does so. ^If those locks cannot be obtained +** immediately and there is a busy-handler callback configured, it is invoked +** in the usual manner. ^If the required lock still cannot be obtained, then +** the database is skipped and an attempt made to flush any dirty pages +** belonging to the next (if any) database. ^If any databases are skipped +** because locks cannot be obtained, but no other error occurs, this +** function returns SQLITE_BUSY. +** +** ^If any other error occurs while flushing dirty pages to disk (for +** example an IO error or out-of-memory condition), then processing is +** abandoned and an SQLite [error code] is returned to the caller immediately. +** +** ^Otherwise, if no error occurs, [sqlite3_db_cacheflush()] returns SQLITE_OK. +** +** ^This function does not set the database handle error code or message +** returned by the [sqlite3_errcode()] and [sqlite3_errmsg()] functions. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3*); + +/* +** CAPI3REF: The pre-update hook. +** +** ^These interfaces are only available if SQLite is compiled using the +** [SQLITE_ENABLE_PREUPDATE_HOOK] compile-time option. +** +** ^The [sqlite3_preupdate_hook()] interface registers a callback function +** that is invoked prior to each [INSERT], [UPDATE], and [DELETE] operation +** on a database table. +** ^At most one preupdate hook may be registered at a time on a single +** [database connection]; each call to [sqlite3_preupdate_hook()] overrides +** the previous setting. +** ^The preupdate hook is disabled by invoking [sqlite3_preupdate_hook()] +** with a NULL pointer as the second parameter. +** ^The third parameter to [sqlite3_preupdate_hook()] is passed through as +** the first parameter to callbacks. +** +** ^The preupdate hook only fires for changes to real database tables; the +** preupdate hook is not invoked for changes to [virtual tables] or to +** system tables like sqlite_master or sqlite_stat1. +** +** ^The second parameter to the preupdate callback is a pointer to +** the [database connection] that registered the preupdate hook. +** ^The third parameter to the preupdate callback is one of the constants +** [SQLITE_INSERT], [SQLITE_DELETE], or [SQLITE_UPDATE] to identify the +** kind of update operation that is about to occur. +** ^(The fourth parameter to the preupdate callback is the name of the +** database within the database connection that is being modified. This +** will be "main" for the main database or "temp" for TEMP tables or +** the name given after the AS keyword in the [ATTACH] statement for attached +** databases.)^ +** ^The fifth parameter to the preupdate callback is the name of the +** table that is being modified. +** +** For an UPDATE or DELETE operation on a [rowid table], the sixth +** parameter passed to the preupdate callback is the initial [rowid] of the +** row being modified or deleted. For an INSERT operation on a rowid table, +** or any operation on a WITHOUT ROWID table, the value of the sixth +** parameter is undefined. For an INSERT or UPDATE on a rowid table the +** seventh parameter is the final rowid value of the row being inserted +** or updated. The value of the seventh parameter passed to the callback +** function is not defined for operations on WITHOUT ROWID tables, or for +** INSERT operations on rowid tables. +** +** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()], +** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces +** provide additional information about a preupdate event. These routines +** may only be called from within a preupdate callback. Invoking any of +** these routines from outside of a preupdate callback or with a +** [database connection] pointer that is different from the one supplied +** to the preupdate callback results in undefined and probably undesirable +** behavior. +** +** ^The [sqlite3_preupdate_count(D)] interface returns the number of columns +** in the row that is being inserted, updated, or deleted. +** +** ^The [sqlite3_preupdate_old(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row before it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_UPDATE and SQLITE_DELETE +** preupdate callbacks; if it is used by an SQLITE_INSERT callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_new(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row after it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_INSERT and SQLITE_UPDATE +** preupdate callbacks; if it is used by an SQLITE_DELETE callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_depth(D)] interface returns 0 if the preupdate +** callback was invoked as a result of a direct insert, update, or delete +** operation; or 1 for inserts, updates, or deletes invoked by top-level +** triggers; or 2 for changes resulting from triggers called by top-level +** triggers; and so forth. +** +** See also: [sqlite3_update_hook()] +*/ +#if defined(SQLITE_ENABLE_PREUPDATE_HOOK) +SQLITE_API void *sqlite3_preupdate_hook( + sqlite3 *db, + void(*xPreUpdate)( + void *pCtx, /* Copy of third arg to preupdate_hook() */ + sqlite3 *db, /* Database handle */ + int op, /* SQLITE_UPDATE, DELETE or INSERT */ + char const *zDb, /* Database name */ + char const *zName, /* Table name */ + sqlite3_int64 iKey1, /* Rowid of row about to be deleted/updated */ + sqlite3_int64 iKey2 /* New rowid value (for a rowid UPDATE) */ + ), + void* +); +SQLITE_API int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **); +SQLITE_API int sqlite3_preupdate_count(sqlite3 *); +SQLITE_API int sqlite3_preupdate_depth(sqlite3 *); +SQLITE_API int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); +#endif + +/* +** CAPI3REF: Low-level system error code +** +** ^Attempt to return the underlying operating system error code or error +** number that caused the most recent I/O error or failure to open a file. +** The return value is OS-dependent. For example, on unix systems, after +** [sqlite3_open_v2()] returns [SQLITE_CANTOPEN], this interface could be +** called to get back the underlying "errno" that caused the problem, such +** as ENOSPC, EAUTH, EISDIR, and so forth. +*/ +SQLITE_API int sqlite3_system_errno(sqlite3*); + +/* +** CAPI3REF: Database Snapshot +** KEYWORDS: {snapshot} {sqlite3_snapshot} +** +** An instance of the snapshot object records the state of a [WAL mode] +** database for some specific point in history. +** +** In [WAL mode], multiple [database connections] that are open on the +** same database file can each be reading a different historical version +** of the database file. When a [database connection] begins a read +** transaction, that connection sees an unchanging copy of the database +** as it existed for the point in time when the transaction first started. +** Subsequent changes to the database from other connections are not seen +** by the reader until a new read transaction is started. +** +** The sqlite3_snapshot object records state information about an historical +** version of the database file so that it is possible to later open a new read +** transaction that sees that historical version of the database rather than +** the most recent version. +*/ +typedef struct sqlite3_snapshot { + unsigned char hidden[48]; +} sqlite3_snapshot; + +/* +** CAPI3REF: Record A Database Snapshot +** CONSTRUCTOR: sqlite3_snapshot +** +** ^The [sqlite3_snapshot_get(D,S,P)] interface attempts to make a +** new [sqlite3_snapshot] object that records the current state of +** schema S in database connection D. ^On success, the +** [sqlite3_snapshot_get(D,S,P)] interface writes a pointer to the newly +** created [sqlite3_snapshot] object into *P and returns SQLITE_OK. +** If there is not already a read-transaction open on schema S when +** this function is called, one is opened automatically. +** +** The following must be true for this function to succeed. If any of +** the following statements are false when sqlite3_snapshot_get() is +** called, SQLITE_ERROR is returned. The final value of *P is undefined +** in this case. +** +**
    +**
  • The database handle must not be in [autocommit mode]. +** +**
  • Schema S of [database connection] D must be a [WAL mode] database. +** +**
  • There must not be a write transaction open on schema S of database +** connection D. +** +**
  • One or more transactions must have been written to the current wal +** file since it was created on disk (by any connection). This means +** that a snapshot cannot be taken on a wal mode database with no wal +** file immediately after it is first opened. At least one transaction +** must be written to it first. +**
+** +** This function may also return SQLITE_NOMEM. If it is called with the +** database handle in autocommit mode but fails for some other reason, +** whether or not a read transaction is opened on schema S is undefined. +** +** The [sqlite3_snapshot] object returned from a successful call to +** [sqlite3_snapshot_get()] must be freed using [sqlite3_snapshot_free()] +** to avoid a memory leak. +** +** The [sqlite3_snapshot_get()] interface is only available when the +** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot **ppSnapshot +); + +/* +** CAPI3REF: Start a read transaction on an historical snapshot +** METHOD: sqlite3_snapshot +** +** ^The [sqlite3_snapshot_open(D,S,P)] interface either starts a new read +** transaction or upgrades an existing one for schema S of +** [database connection] D such that the read transaction refers to +** historical [snapshot] P, rather than the most recent change to the +** database. ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK +** on success or an appropriate [error code] if it fails. +** +** ^In order to succeed, the database connection must not be in +** [autocommit mode] when [sqlite3_snapshot_open(D,S,P)] is called. If there +** is already a read transaction open on schema S, then the database handle +** must have no active statements (SELECT statements that have been passed +** to sqlite3_step() but not sqlite3_reset() or sqlite3_finalize()). +** SQLITE_ERROR is returned if either of these conditions is violated, or +** if schema S does not exist, or if the snapshot object is invalid. +** +** ^A call to sqlite3_snapshot_open() will fail to open if the specified +** snapshot has been overwritten by a [checkpoint]. In this case +** SQLITE_ERROR_SNAPSHOT is returned. +** +** If there is already a read transaction open when this function is +** invoked, then the same read transaction remains open (on the same +** database snapshot) if SQLITE_ERROR, SQLITE_BUSY or SQLITE_ERROR_SNAPSHOT +** is returned. If another error code - for example SQLITE_PROTOCOL or an +** SQLITE_IOERR error code - is returned, then the final state of the +** read transaction is undefined. If SQLITE_OK is returned, then the +** read transaction is now open on database snapshot P. +** +** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the +** database connection D does not know that the database file for +** schema S is in [WAL mode]. A database connection might not know +** that the database file is in [WAL mode] if there has been no prior +** I/O on that database connection, or if the database entered [WAL mode] +** after the most recent I/O on the database connection.)^ +** (Hint: Run "[PRAGMA application_id]" against a newly opened +** database connection in order to make it ready to use snapshots.) +** +** The [sqlite3_snapshot_open()] interface is only available when the +** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot *pSnapshot +); + +/* +** CAPI3REF: Destroy a snapshot +** DESTRUCTOR: sqlite3_snapshot +** +** ^The [sqlite3_snapshot_free(P)] interface destroys [sqlite3_snapshot] P. +** The application must eventually free every [sqlite3_snapshot] object +** using this routine to avoid a memory leak. +** +** The [sqlite3_snapshot_free()] interface is only available when the +** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); + +/* +** CAPI3REF: Compare the ages of two snapshot handles. +** METHOD: sqlite3_snapshot +** +** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages +** of two valid snapshot handles. +** +** If the two snapshot handles are not associated with the same database +** file, the result of the comparison is undefined. +** +** Additionally, the result of the comparison is only valid if both of the +** snapshot handles were obtained by calling sqlite3_snapshot_get() since the +** last time the wal file was deleted. The wal file is deleted when the +** database is changed back to rollback mode or when the number of database +** clients drops to zero. If either snapshot handle was obtained before the +** wal file was last deleted, the value returned by this function +** is undefined. +** +** Otherwise, this API returns a negative value if P1 refers to an older +** snapshot than P2, zero if the two handles refer to the same database +** snapshot, and a positive value if P1 is a newer snapshot than P2. +** +** This interface is only available if SQLite is compiled with the +** [SQLITE_ENABLE_SNAPSHOT] option. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( + sqlite3_snapshot *p1, + sqlite3_snapshot *p2 +); + +/* +** CAPI3REF: Recover snapshots from a wal file +** METHOD: sqlite3_snapshot +** +** If a [WAL file] remains on disk after all database connections close +** (either through the use of the [SQLITE_FCNTL_PERSIST_WAL] [file control] +** or because the last process to have the database opened exited without +** calling [sqlite3_close()]) and a new connection is subsequently opened +** on that database and [WAL file], the [sqlite3_snapshot_open()] interface +** will only be able to open the last transaction added to the WAL file +** even though the WAL file contains other valid transactions. +** +** This function attempts to scan the WAL file associated with database zDb +** of database handle db and make all valid snapshots available to +** sqlite3_snapshot_open(). It is an error if there is already a read +** transaction open on the database, or if the database is not a WAL mode +** database. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +** +** This interface is only available if SQLite is compiled with the +** [SQLITE_ENABLE_SNAPSHOT] option. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Serialize a database +** +** The sqlite3_serialize(D,S,P,F) interface returns a pointer to memory +** that is a serialization of the S database on [database connection] D. +** If P is not a NULL pointer, then the size of the database in bytes +** is written into *P. +** +** For an ordinary on-disk database file, the serialization is just a +** copy of the disk file. For an in-memory database or a "TEMP" database, +** the serialization is the same sequence of bytes which would be written +** to disk if that database where backed up to disk. +** +** The usual case is that sqlite3_serialize() copies the serialization of +** the database into memory obtained from [sqlite3_malloc64()] and returns +** a pointer to that memory. The caller is responsible for freeing the +** returned value to avoid a memory leak. However, if the F argument +** contains the SQLITE_SERIALIZE_NOCOPY bit, then no memory allocations +** are made, and the sqlite3_serialize() function will return a pointer +** to the contiguous memory representation of the database that SQLite +** is currently using for that database, or NULL if the no such contiguous +** memory representation of the database exists. A contiguous memory +** representation of the database will usually only exist if there has +** been a prior call to [sqlite3_deserialize(D,S,...)] with the same +** values of D and S. +** The size of the database is written into *P even if the +** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy +** of the database exists. +** +** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the +** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory +** allocation error occurs. +** +** This interface is only available if SQLite is compiled with the +** [SQLITE_ENABLE_DESERIALIZE] option. +*/ +SQLITE_API unsigned char *sqlite3_serialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to serialize. ex: "main", "temp", ... */ + sqlite3_int64 *piSize, /* Write size of the DB here, if not NULL */ + unsigned int mFlags /* Zero or more SQLITE_SERIALIZE_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3_serialize +** +** Zero or more of the following constants can be OR-ed together for +** the F argument to [sqlite3_serialize(D,S,P,F)]. +** +** SQLITE_SERIALIZE_NOCOPY means that [sqlite3_serialize()] will return +** a pointer to contiguous in-memory database that it is currently using, +** without making a copy of the database. If SQLite is not currently using +** a contiguous in-memory database, then this option causes +** [sqlite3_serialize()] to return a NULL pointer. SQLite will only be +** using a contiguous in-memory database if it has been initialized by a +** prior call to [sqlite3_deserialize()]. +*/ +#define SQLITE_SERIALIZE_NOCOPY 0x001 /* Do no memory allocations */ + +/* +** CAPI3REF: Deserialize a database +** +** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the +** [database connection] D to disconnect from database S and then +** reopen S as an in-memory database based on the serialization contained +** in P. The serialized database P is N bytes in size. M is the size of +** the buffer P, which might be larger than N. If M is larger than N, and +** the SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is +** permitted to add content to the in-memory database as long as the total +** size does not exceed M bytes. +** +** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will +** invoke sqlite3_free() on the serialization buffer when the database +** connection closes. If the SQLITE_DESERIALIZE_RESIZEABLE bit is set, then +** SQLite will try to increase the buffer size using sqlite3_realloc64() +** if writes on the database cause it to grow larger than M bytes. +** +** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the +** database is currently in a read transaction or is involved in a backup +** operation. +** +** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the +** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then +** [sqlite3_free()] is invoked on argument P prior to returning. +** +** This interface is only available if SQLite is compiled with the +** [SQLITE_ENABLE_DESERIALIZE] option. +*/ +SQLITE_API int sqlite3_deserialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to reopen with the deserialization */ + unsigned char *pData, /* The serialized database content */ + sqlite3_int64 szDb, /* Number bytes in the deserialization */ + sqlite3_int64 szBuf, /* Total size of buffer pData[] */ + unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3_deserialize() +** +** The following are allowed values for 6th argument (the F argument) to +** the [sqlite3_deserialize(D,S,P,N,M,F)] interface. +** +** The SQLITE_DESERIALIZE_FREEONCLOSE means that the database serialization +** in the P argument is held in memory obtained from [sqlite3_malloc64()] +** and that SQLite should take ownership of this memory and automatically +** free it when it has finished using it. Without this flag, the caller +** is responsible for freeing any dynamically allocated memory. +** +** The SQLITE_DESERIALIZE_RESIZEABLE flag means that SQLite is allowed to +** grow the size of the database using calls to [sqlite3_realloc64()]. This +** flag should only be used if SQLITE_DESERIALIZE_FREEONCLOSE is also used. +** Without this flag, the deserialized database cannot increase in size beyond +** the number of bytes specified by the M parameter. +** +** The SQLITE_DESERIALIZE_READONLY flag means that the deserialized database +** should be treated as read-only. +*/ +#define SQLITE_DESERIALIZE_FREEONCLOSE 1 /* Call sqlite3_free() on close */ +#define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */ +#define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */ + +/* +** Undo the hack that converts floating point types to integer for +** builds on processors without floating point support. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# undef double +#endif + +#if 0 +} /* End of the 'extern "C"' block */ +#endif +#endif /* SQLITE3_H */ + +/******** Begin file sqlite3rtree.h *********/ +/* +** 2010 August 30 +** +** 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. +** +************************************************************************* +*/ + +#ifndef _SQLITE3RTREE_H_ +#define _SQLITE3RTREE_H_ + + +#if 0 +extern "C" { +#endif + +typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; +typedef struct sqlite3_rtree_query_info sqlite3_rtree_query_info; + +/* The double-precision datatype used by RTree depends on the +** SQLITE_RTREE_INT_ONLY compile-time option. +*/ +#ifdef SQLITE_RTREE_INT_ONLY + typedef sqlite3_int64 sqlite3_rtree_dbl; +#else + typedef double sqlite3_rtree_dbl; +#endif + +/* +** Register a geometry callback named zGeom that can be used as part of an +** R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zGeom(... params ...) +*/ +SQLITE_API int sqlite3_rtree_geometry_callback( + sqlite3 *db, + const char *zGeom, + int (*xGeom)(sqlite3_rtree_geometry*, int, sqlite3_rtree_dbl*,int*), + void *pContext +); + + +/* +** A pointer to a structure of the following type is passed as the first +** argument to callbacks registered using rtree_geometry_callback(). +*/ +struct sqlite3_rtree_geometry { + void *pContext; /* Copy of pContext passed to s_r_g_c() */ + int nParam; /* Size of array aParam[] */ + sqlite3_rtree_dbl *aParam; /* Parameters passed to SQL geom function */ + void *pUser; /* Callback implementation user data */ + void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ +}; + +/* +** Register a 2nd-generation geometry callback named zScore that can be +** used as part of an R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zQueryFunc(... params ...) +*/ +SQLITE_API int sqlite3_rtree_query_callback( + sqlite3 *db, + const char *zQueryFunc, + int (*xQueryFunc)(sqlite3_rtree_query_info*), + void *pContext, + void (*xDestructor)(void*) +); + + +/* +** A pointer to a structure of the following type is passed as the +** argument to scored geometry callback registered using +** sqlite3_rtree_query_callback(). +** +** Note that the first 5 fields of this structure are identical to +** sqlite3_rtree_geometry. This structure is a subclass of +** sqlite3_rtree_geometry. +*/ +struct sqlite3_rtree_query_info { + void *pContext; /* pContext from when function registered */ + int nParam; /* Number of function parameters */ + sqlite3_rtree_dbl *aParam; /* value of function parameters */ + void *pUser; /* callback can use this, if desired */ + void (*xDelUser)(void*); /* function to free pUser */ + sqlite3_rtree_dbl *aCoord; /* Coordinates of node or entry to check */ + unsigned int *anQueue; /* Number of pending entries in the queue */ + int nCoord; /* Number of coordinates */ + int iLevel; /* Level of current node or entry */ + int mxLevel; /* The largest iLevel value in the tree */ + sqlite3_int64 iRowid; /* Rowid for current entry */ + sqlite3_rtree_dbl rParentScore; /* Score of parent node */ + int eParentWithin; /* Visibility of parent node */ + int eWithin; /* OUT: Visibility */ + sqlite3_rtree_dbl rScore; /* OUT: Write the score here */ + /* The following fields are only available in 3.8.11 and later */ + sqlite3_value **apSqlParam; /* Original SQL values of parameters */ +}; + +/* +** Allowed values for sqlite3_rtree_query.eWithin and .eParentWithin. +*/ +#define NOT_WITHIN 0 /* Object completely outside of query region */ +#define PARTLY_WITHIN 1 /* Object partially overlaps query region */ +#define FULLY_WITHIN 2 /* Object fully contained within query region */ + + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* ifndef _SQLITE3RTREE_H_ */ + +/******** End of sqlite3rtree.h *********/ +/******** Begin file sqlite3session.h *********/ + +#if !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) +#define __SQLITESESSION_H_ 1 + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +extern "C" { +#endif + + +/* +** CAPI3REF: Session Object Handle +** +** An instance of this object is a [session] that can be used to +** record changes to a database. +*/ +typedef struct sqlite3_session sqlite3_session; + +/* +** CAPI3REF: Changeset Iterator Handle +** +** An instance of this object acts as a cursor for iterating +** over the elements of a [changeset] or [patchset]. +*/ +typedef struct sqlite3_changeset_iter sqlite3_changeset_iter; + +/* +** CAPI3REF: Create A New Session Object +** CONSTRUCTOR: sqlite3_session +** +** Create a new session object attached to database handle db. If successful, +** a pointer to the new object is written to *ppSession and SQLITE_OK is +** returned. If an error occurs, *ppSession is set to NULL and an SQLite +** error code (e.g. SQLITE_NOMEM) is returned. +** +** It is possible to create multiple session objects attached to a single +** database handle. +** +** Session objects created using this function should be deleted using the +** [sqlite3session_delete()] function before the database handle that they +** are attached to is itself closed. If the database handle is closed before +** the session object is deleted, then the results of calling any session +** module function, including [sqlite3session_delete()] on the session object +** are undefined. +** +** Because the session module uses the [sqlite3_preupdate_hook()] API, it +** is not possible for an application to register a pre-update hook on a +** database handle that has one or more session objects attached. Nor is +** it possible to create a session object attached to a database handle for +** which a pre-update hook is already defined. The results of attempting +** either of these things are undefined. +** +** The session object will be used to create changesets for tables in +** database zDb, where zDb is either "main", or "temp", or the name of an +** attached database. It is not an error if database zDb is not attached +** to the database when the session object is created. +*/ +SQLITE_API int sqlite3session_create( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (e.g. "main") */ + sqlite3_session **ppSession /* OUT: New session object */ +); + +/* +** CAPI3REF: Delete A Session Object +** DESTRUCTOR: sqlite3_session +** +** Delete a session object previously allocated using +** [sqlite3session_create()]. Once a session object has been deleted, the +** results of attempting to use pSession with any other session module +** function are undefined. +** +** Session objects must be deleted before the database handle to which they +** are attached is closed. Refer to the documentation for +** [sqlite3session_create()] for details. +*/ +SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); + + +/* +** CAPI3REF: Enable Or Disable A Session Object +** METHOD: sqlite3_session +** +** Enable or disable the recording of changes by a session object. When +** enabled, a session object records changes made to the database. When +** disabled - it does not. A newly created session object is enabled. +** Refer to the documentation for [sqlite3session_changeset()] for further +** details regarding how enabling and disabling a session object affects +** the eventual changesets. +** +** Passing zero to this function disables the session. Passing a value +** greater than zero enables it. Passing a value less than zero is a +** no-op, and may be used to query the current state of the session. +** +** The return value indicates the final state of the session object: 0 if +** the session is disabled, or 1 if it is enabled. +*/ +SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable); + +/* +** CAPI3REF: Set Or Clear the Indirect Change Flag +** METHOD: sqlite3_session +** +** Each change recorded by a session object is marked as either direct or +** indirect. A change is marked as indirect if either: +** +**
    +**
  • The session object "indirect" flag is set when the change is +** made, or +**
  • The change is made by an SQL trigger or foreign key action +** instead of directly as a result of a users SQL statement. +**
+** +** If a single row is affected by more than one operation within a session, +** then the change is considered indirect if all operations meet the criteria +** for an indirect change above, or direct otherwise. +** +** This function is used to set, clear or query the session object indirect +** flag. If the second argument passed to this function is zero, then the +** indirect flag is cleared. If it is greater than zero, the indirect flag +** is set. Passing a value less than zero does not modify the current value +** of the indirect flag, and may be used to query the current state of the +** indirect flag for the specified session object. +** +** The return value indicates the final state of the indirect flag: 0 if +** it is clear, or 1 if it is set. +*/ +SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect); + +/* +** CAPI3REF: Attach A Table To A Session Object +** METHOD: sqlite3_session +** +** If argument zTab is not NULL, then it is the name of a table to attach +** to the session object passed as the first argument. All subsequent changes +** made to the table while the session object is enabled will be recorded. See +** documentation for [sqlite3session_changeset()] for further details. +** +** Or, if argument zTab is NULL, then changes are recorded for all tables +** in the database. If additional tables are added to the database (by +** executing "CREATE TABLE" statements) after this call is made, changes for +** the new tables are also recorded. +** +** Changes can only be recorded for tables that have a PRIMARY KEY explicitly +** defined as part of their CREATE TABLE statement. It does not matter if the +** PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) or not. The PRIMARY +** KEY may consist of a single column, or may be a composite key. +** +** It is not an error if the named table does not exist in the database. Nor +** is it an error if the named table does not have a PRIMARY KEY. However, +** no changes will be recorded in either of these scenarios. +** +** Changes are not recorded for individual rows that have NULL values stored +** in one or more of their PRIMARY KEY columns. +** +** SQLITE_OK is returned if the call completes without error. Or, if an error +** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned. +** +**

Special sqlite_stat1 Handling

+** +** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to +** some of the rules above. In SQLite, the schema of sqlite_stat1 is: +**
+**        CREATE TABLE sqlite_stat1(tbl,idx,stat)
+**  
+** +** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are +** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes +** are recorded for rows for which (idx IS NULL) is true. However, for such +** rows a zero-length blob (SQL value X'') is stored in the changeset or +** patchset instead of a NULL value. This allows such changesets to be +** manipulated by legacy implementations of sqlite3changeset_invert(), +** concat() and similar. +** +** The sqlite3changeset_apply() function automatically converts the +** zero-length blob back to a NULL value when updating the sqlite_stat1 +** table. However, if the application calls sqlite3changeset_new(), +** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset +** iterator directly (including on a changeset iterator passed to a +** conflict-handler callback) then the X'' value is returned. The application +** must translate X'' to NULL itself if required. +** +** Legacy (older than 3.22.0) versions of the sessions module cannot capture +** changes made to the sqlite_stat1 table. Legacy versions of the +** sqlite3changeset_apply() function silently ignore any modifications to the +** sqlite_stat1 table that are part of a changeset or patchset. +*/ +SQLITE_API int sqlite3session_attach( + sqlite3_session *pSession, /* Session object */ + const char *zTab /* Table name */ +); + +/* +** CAPI3REF: Set a table filter on a Session Object. +** METHOD: sqlite3_session +** +** The second argument (xFilter) is the "filter callback". For changes to rows +** in tables that are not attached to the Session object, the filter is called +** to determine whether changes to the table's rows should be tracked or not. +** If xFilter returns 0, changes are not tracked. Note that once a table is +** attached, xFilter will not be called again. +*/ +SQLITE_API void sqlite3session_table_filter( + sqlite3_session *pSession, /* Session object */ + int(*xFilter)( + void *pCtx, /* Copy of third arg to _filter_table() */ + const char *zTab /* Table name */ + ), + void *pCtx /* First argument passed to xFilter */ +); + +/* +** CAPI3REF: Generate A Changeset From A Session Object +** METHOD: sqlite3_session +** +** Obtain a changeset containing changes to the tables attached to the +** session object passed as the first argument. If successful, +** set *ppChangeset to point to a buffer containing the changeset +** and *pnChangeset to the size of the changeset in bytes before returning +** SQLITE_OK. If an error occurs, set both *ppChangeset and *pnChangeset to +** zero and return an SQLite error code. +** +** A changeset consists of zero or more INSERT, UPDATE and/or DELETE changes, +** each representing a change to a single row of an attached table. An INSERT +** change contains the values of each field of a new database row. A DELETE +** contains the original values of each field of a deleted database row. An +** UPDATE change contains the original values of each field of an updated +** database row along with the updated values for each updated non-primary-key +** column. It is not possible for an UPDATE change to represent a change that +** modifies the values of primary key columns. If such a change is made, it +** is represented in a changeset as a DELETE followed by an INSERT. +** +** Changes are not recorded for rows that have NULL values stored in one or +** more of their PRIMARY KEY columns. If such a row is inserted or deleted, +** no corresponding change is present in the changesets returned by this +** function. If an existing row with one or more NULL values stored in +** PRIMARY KEY columns is updated so that all PRIMARY KEY columns are non-NULL, +** only an INSERT is appears in the changeset. Similarly, if an existing row +** with non-NULL PRIMARY KEY values is updated so that one or more of its +** PRIMARY KEY columns are set to NULL, the resulting changeset contains a +** DELETE change only. +** +** The contents of a changeset may be traversed using an iterator created +** using the [sqlite3changeset_start()] API. A changeset may be applied to +** a database with a compatible schema using the [sqlite3changeset_apply()] +** API. +** +** Within a changeset generated by this function, all changes related to a +** single table are grouped together. In other words, when iterating through +** a changeset or when applying a changeset to a database, all changes related +** to a single table are processed before moving on to the next table. Tables +** are sorted in the same order in which they were attached (or auto-attached) +** to the sqlite3_session object. The order in which the changes related to +** a single table are stored is undefined. +** +** Following a successful call to this function, it is the responsibility of +** the caller to eventually free the buffer that *ppChangeset points to using +** [sqlite3_free()]. +** +**

Changeset Generation

+** +** Once a table has been attached to a session object, the session object +** records the primary key values of all new rows inserted into the table. +** It also records the original primary key and other column values of any +** deleted or updated rows. For each unique primary key value, data is only +** recorded once - the first time a row with said primary key is inserted, +** updated or deleted in the lifetime of the session. +** +** There is one exception to the previous paragraph: when a row is inserted, +** updated or deleted, if one or more of its primary key columns contain a +** NULL value, no record of the change is made. +** +** The session object therefore accumulates two types of records - those +** that consist of primary key values only (created when the user inserts +** a new record) and those that consist of the primary key values and the +** original values of other table columns (created when the users deletes +** or updates a record). +** +** When this function is called, the requested changeset is created using +** both the accumulated records and the current contents of the database +** file. Specifically: +** +**
    +**
  • For each record generated by an insert, the database is queried +** for a row with a matching primary key. If one is found, an INSERT +** change is added to the changeset. If no such row is found, no change +** is added to the changeset. +** +**
  • For each record generated by an update or delete, the database is +** queried for a row with a matching primary key. If such a row is +** found and one or more of the non-primary key fields have been +** modified from their original values, an UPDATE change is added to +** the changeset. Or, if no such row is found in the table, a DELETE +** change is added to the changeset. If there is a row with a matching +** primary key in the database, but all fields contain their original +** values, no change is added to the changeset. +**
+** +** This means, amongst other things, that if a row is inserted and then later +** deleted while a session object is active, neither the insert nor the delete +** will be present in the changeset. Or if a row is deleted and then later a +** row with the same primary key values inserted while a session object is +** active, the resulting changeset will contain an UPDATE change instead of +** a DELETE and an INSERT. +** +** When a session object is disabled (see the [sqlite3session_enable()] API), +** it does not accumulate records when rows are inserted, updated or deleted. +** This may appear to have some counter-intuitive effects if a single row +** is written to more than once during a session. For example, if a row +** is inserted while a session object is enabled, then later deleted while +** the same session object is disabled, no INSERT record will appear in the +** changeset, even though the delete took place while the session was disabled. +** Or, if one field of a row is updated while a session is disabled, and +** another field of the same row is updated while the session is enabled, the +** resulting changeset will contain an UPDATE change that updates both fields. +*/ +SQLITE_API int sqlite3session_changeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +); + +/* +** CAPI3REF: Load The Difference Between Tables Into A Session +** METHOD: sqlite3_session +** +** If it is not already attached to the session object passed as the first +** argument, this function attaches table zTbl in the same manner as the +** [sqlite3session_attach()] function. If zTbl does not exist, or if it +** does not have a primary key, this function is a no-op (but does not return +** an error). +** +** Argument zFromDb must be the name of a database ("main", "temp" etc.) +** attached to the same database handle as the session object that contains +** a table compatible with the table attached to the session by this function. +** A table is considered compatible if it: +** +**
    +**
  • Has the same name, +**
  • Has the same set of columns declared in the same order, and +**
  • Has the same PRIMARY KEY definition. +**
+** +** If the tables are not compatible, SQLITE_SCHEMA is returned. If the tables +** are compatible but do not have any PRIMARY KEY columns, it is not an error +** but no changes are added to the session object. As with other session +** APIs, tables without PRIMARY KEYs are simply ignored. +** +** This function adds a set of changes to the session object that could be +** used to update the table in database zFrom (call this the "from-table") +** so that its content is the same as the table attached to the session +** object (call this the "to-table"). Specifically: +** +**
    +**
  • For each row (primary key) that exists in the to-table but not in +** the from-table, an INSERT record is added to the session object. +** +**
  • For each row (primary key) that exists in the to-table but not in +** the from-table, a DELETE record is added to the session object. +** +**
  • For each row (primary key) that exists in both tables, but features +** different non-PK values in each, an UPDATE record is added to the +** session. +**
+** +** To clarify, if this function is called and then a changeset constructed +** using [sqlite3session_changeset()], then after applying that changeset to +** database zFrom the contents of the two compatible tables would be +** identical. +** +** It an error if database zFrom does not exist or does not contain the +** required compatible table. +** +** If the operation is successful, SQLITE_OK is returned. Otherwise, an SQLite +** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to free this buffer using +** sqlite3_free(). +*/ +SQLITE_API int sqlite3session_diff( + sqlite3_session *pSession, + const char *zFromDb, + const char *zTbl, + char **pzErrMsg +); + + +/* +** CAPI3REF: Generate A Patchset From A Session Object +** METHOD: sqlite3_session +** +** The differences between a patchset and a changeset are that: +** +**
    +**
  • DELETE records consist of the primary key fields only. The +** original values of other fields are omitted. +**
  • The original values of any modified fields are omitted from +** UPDATE records. +**
+** +** A patchset blob may be used with up to date versions of all +** sqlite3changeset_xxx API functions except for sqlite3changeset_invert(), +** which returns SQLITE_CORRUPT if it is passed a patchset. Similarly, +** attempting to use a patchset blob with old versions of the +** sqlite3changeset_xxx APIs also provokes an SQLITE_CORRUPT error. +** +** Because the non-primary key "old.*" fields are omitted, no +** SQLITE_CHANGESET_DATA conflicts can be detected or reported if a patchset +** is passed to the sqlite3changeset_apply() API. Other conflict types work +** in the same way as for changesets. +** +** Changes within a patchset are ordered in the same way as for changesets +** generated by the sqlite3session_changeset() function (i.e. all changes for +** a single table are grouped together, tables appear in the order in which +** they were attached to the session object). +*/ +SQLITE_API int sqlite3session_patchset( + sqlite3_session *pSession, /* Session object */ + int *pnPatchset, /* OUT: Size of buffer at *ppPatchset */ + void **ppPatchset /* OUT: Buffer containing patchset */ +); + +/* +** CAPI3REF: Test if a changeset has recorded any changes. +** +** Return non-zero if no changes to attached tables have been recorded by +** the session object passed as the first argument. Otherwise, if one or +** more changes have been recorded, return zero. +** +** Even if this function returns zero, it is possible that calling +** [sqlite3session_changeset()] on the session handle may still return a +** changeset that contains no changes. This can happen when a row in +** an attached table is modified and then later on the original values +** are restored. However, if this function returns non-zero, then it is +** guaranteed that a call to sqlite3session_changeset() will return a +** changeset containing zero changes. +*/ +SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); + +/* +** CAPI3REF: Create An Iterator To Traverse A Changeset +** CONSTRUCTOR: sqlite3_changeset_iter +** +** Create an iterator used to iterate through the contents of a changeset. +** If successful, *pp is set to point to the iterator handle and SQLITE_OK +** is returned. Otherwise, if an error occurs, *pp is set to zero and an +** SQLite error code is returned. +** +** The following functions can be used to advance and query a changeset +** iterator created by this function: +** +**
    +**
  • [sqlite3changeset_next()] +**
  • [sqlite3changeset_op()] +**
  • [sqlite3changeset_new()] +**
  • [sqlite3changeset_old()] +**
+** +** It is the responsibility of the caller to eventually destroy the iterator +** by passing it to [sqlite3changeset_finalize()]. The buffer containing the +** changeset (pChangeset) must remain valid until after the iterator is +** destroyed. +** +** Assuming the changeset blob was created by one of the +** [sqlite3session_changeset()], [sqlite3changeset_concat()] or +** [sqlite3changeset_invert()] functions, all changes within the changeset +** that apply to a single table are grouped together. This means that when +** an application iterates through a changeset using an iterator created by +** this function, all changes that relate to a single table are visited +** consecutively. There is no chance that the iterator will visit a change +** the applies to table X, then one for table Y, and then later on visit +** another change for table X. +** +** The behavior of sqlite3changeset_start_v2() and its streaming equivalent +** may be modified by passing a combination of +** [SQLITE_CHANGESETSTART_INVERT | supported flags] as the 4th parameter. +** +** Note that the sqlite3changeset_start_v2() API is still experimental +** and therefore subject to change. +*/ +SQLITE_API int sqlite3changeset_start( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset /* Pointer to blob containing changeset */ +); +SQLITE_API int sqlite3changeset_start_v2( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset, /* Pointer to blob containing changeset */ + int flags /* SESSION_CHANGESETSTART_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3changeset_start_v2 +** +** The following flags may passed via the 4th parameter to +** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]: +** +**
SQLITE_CHANGESETAPPLY_INVERT
+** Invert the changeset while iterating through it. This is equivalent to +** inverting a changeset using sqlite3changeset_invert() before applying it. +** It is an error to specify this flag with a patchset. +*/ +#define SQLITE_CHANGESETSTART_INVERT 0x0002 + + +/* +** CAPI3REF: Advance A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function may only be used with iterators created by the function +** [sqlite3changeset_start()]. If it is called on an iterator passed to +** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE +** is returned and the call has no effect. +** +** Immediately after an iterator is created by sqlite3changeset_start(), it +** does not point to any change in the changeset. Assuming the changeset +** is not empty, the first call to this function advances the iterator to +** point to the first change in the changeset. Each subsequent call advances +** the iterator to point to the next change in the changeset (if any). If +** no error occurs and the iterator points to a valid change after a call +** to sqlite3changeset_next() has advanced it, SQLITE_ROW is returned. +** Otherwise, if all changes in the changeset have already been visited, +** SQLITE_DONE is returned. +** +** If an error occurs, an SQLite error code is returned. Possible error +** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or +** SQLITE_NOMEM. +*/ +SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Obtain The Current Operation From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned [SQLITE_ROW]. If this +** is not the case, this function returns [SQLITE_MISUSE]. +** +** If argument pzTab is not NULL, then *pzTab is set to point to a +** nul-terminated utf-8 encoded string containing the name of the table +** affected by the current change. The buffer remains valid until either +** sqlite3changeset_next() is called on the iterator or until the +** conflict-handler function returns. If pnCol is not NULL, then *pnCol is +** set to the number of columns in the table affected by the change. If +** pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change +** is an indirect change, or false (0) otherwise. See the documentation for +** [sqlite3session_indirect()] for a description of direct and indirect +** changes. Finally, if pOp is not NULL, then *pOp is set to one of +** [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], depending on the +** type of change that the iterator currently points to. +** +** If no error occurs, SQLITE_OK is returned. If an error does occur, an +** SQLite error code is returned. The values of the output variables may not +** be trusted in this case. +*/ +SQLITE_API int sqlite3changeset_op( + sqlite3_changeset_iter *pIter, /* Iterator object */ + const char **pzTab, /* OUT: Pointer to table name */ + int *pnCol, /* OUT: Number of columns in table */ + int *pOp, /* OUT: SQLITE_INSERT, DELETE or UPDATE */ + int *pbIndirect /* OUT: True for an 'indirect' change */ +); + +/* +** CAPI3REF: Obtain The Primary Key Definition Of A Table +** METHOD: sqlite3_changeset_iter +** +** For each modified table, a changeset includes the following: +** +**
    +**
  • The number of columns in the table, and +**
  • Which of those columns make up the tables PRIMARY KEY. +**
+** +** This function is used to find which columns comprise the PRIMARY KEY of +** the table modified by the change that iterator pIter currently points to. +** If successful, *pabPK is set to point to an array of nCol entries, where +** nCol is the number of columns in the table. Elements of *pabPK are set to +** 0x01 if the corresponding column is part of the tables primary key, or +** 0x00 if it is not. +** +** If argument pnCol is not NULL, then *pnCol is set to the number of columns +** in the table. +** +** If this function is called when the iterator does not point to a valid +** entry, SQLITE_MISUSE is returned and the output variables zeroed. Otherwise, +** SQLITE_OK is returned and the output variables populated as described +** above. +*/ +SQLITE_API int sqlite3changeset_pk( + sqlite3_changeset_iter *pIter, /* Iterator object */ + unsigned char **pabPK, /* OUT: Array of boolean - true for PK cols */ + int *pnCol /* OUT: Number of entries in output array */ +); + +/* +** CAPI3REF: Obtain old.* Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_DELETE] or [SQLITE_UPDATE]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** original row values stored as part of the UPDATE or DELETE change and +** returns SQLITE_OK. The name of the function comes from the fact that this +** is similar to the "old.*" columns available to update or delete triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_old( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Old value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain new.* Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_UPDATE] or [SQLITE_INSERT]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** new row values stored as part of the UPDATE or INSERT change and +** returns SQLITE_OK. If the change is an UPDATE and does not include +** a new value for the requested column, *ppValue is set to NULL and +** SQLITE_OK returned. The name of the function comes from the fact that +** this is similar to the "new.*" columns available to update or delete +** triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_new( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: New value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function should only be used with iterator objects passed to a +** conflict-handler callback by [sqlite3changeset_apply()] with either +** [SQLITE_CHANGESET_DATA] or [SQLITE_CHANGESET_CONFLICT]. If this function +** is called on any other iterator, [SQLITE_MISUSE] is returned and *ppValue +** is set to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the +** "conflicting row" associated with the current conflict-handler callback +** and returns SQLITE_OK. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_conflict( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Value from conflicting row */ +); + +/* +** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations +** METHOD: sqlite3_changeset_iter +** +** This function may only be called with an iterator passed to an +** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case +** it sets the output variable to the total number of known foreign key +** violations in the destination database and returns SQLITE_OK. +** +** In all other cases this function returns SQLITE_MISUSE. +*/ +SQLITE_API int sqlite3changeset_fk_conflicts( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int *pnOut /* OUT: Number of FK violations */ +); + + +/* +** CAPI3REF: Finalize A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function is used to finalize an iterator allocated with +** [sqlite3changeset_start()]. +** +** This function should only be called on iterators created using the +** [sqlite3changeset_start()] function. If an application calls this +** function with an iterator passed to a conflict-handler by +** [sqlite3changeset_apply()], [SQLITE_MISUSE] is immediately returned and the +** call has no effect. +** +** If an error was encountered within a call to an sqlite3changeset_xxx() +** function (for example an [SQLITE_CORRUPT] in [sqlite3changeset_next()] or an +** [SQLITE_NOMEM] in [sqlite3changeset_new()]) then an error code corresponding +** to that error is returned by this function. Otherwise, SQLITE_OK is +** returned. This is to allow the following pattern (pseudo-code): +** +**
+**   sqlite3changeset_start();
+**   while( SQLITE_ROW==sqlite3changeset_next() ){
+**     // Do something with change.
+**   }
+**   rc = sqlite3changeset_finalize();
+**   if( rc!=SQLITE_OK ){
+**     // An error has occurred
+**   }
+** 
+*/ +SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Invert A Changeset +** +** This function is used to "invert" a changeset object. Applying an inverted +** changeset to a database reverses the effects of applying the uninverted +** changeset. Specifically: +** +**
    +**
  • Each DELETE change is changed to an INSERT, and +**
  • Each INSERT change is changed to a DELETE, and +**
  • For each UPDATE change, the old.* and new.* values are exchanged. +**
+** +** This function does not change the order in which changes appear within +** the changeset. It merely reverses the sense of each individual change. +** +** If successful, a pointer to a buffer containing the inverted changeset +** is stored in *ppOut, the size of the same buffer is stored in *pnOut, and +** SQLITE_OK is returned. If an error occurs, both *pnOut and *ppOut are +** zeroed and an SQLite error code returned. +** +** It is the responsibility of the caller to eventually call sqlite3_free() +** on the *ppOut pointer to free the buffer allocation following a successful +** call to this function. +** +** WARNING/TODO: This function currently assumes that the input is a valid +** changeset. If it is not, the results are undefined. +*/ +SQLITE_API int sqlite3changeset_invert( + int nIn, const void *pIn, /* Input changeset */ + int *pnOut, void **ppOut /* OUT: Inverse of input */ +); + +/* +** CAPI3REF: Concatenate Two Changeset Objects +** +** This function is used to concatenate two changesets, A and B, into a +** single changeset. The result is a changeset equivalent to applying +** changeset A followed by changeset B. +** +** This function combines the two input changesets using an +** sqlite3_changegroup object. Calling it produces similar results as the +** following code fragment: +** +**
+**   sqlite3_changegroup *pGrp;
+**   rc = sqlite3_changegroup_new(&pGrp);
+**   if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA);
+**   if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nB, pB);
+**   if( rc==SQLITE_OK ){
+**     rc = sqlite3changegroup_output(pGrp, pnOut, ppOut);
+**   }else{
+**     *ppOut = 0;
+**     *pnOut = 0;
+**   }
+** 
+** +** Refer to the sqlite3_changegroup documentation below for details. +*/ +SQLITE_API int sqlite3changeset_concat( + int nA, /* Number of bytes in buffer pA */ + void *pA, /* Pointer to buffer containing changeset A */ + int nB, /* Number of bytes in buffer pB */ + void *pB, /* Pointer to buffer containing changeset B */ + int *pnOut, /* OUT: Number of bytes in output changeset */ + void **ppOut /* OUT: Buffer containing output changeset */ +); + + +/* +** CAPI3REF: Changegroup Handle +** +** A changegroup is an object used to combine two or more +** [changesets] or [patchsets] +*/ +typedef struct sqlite3_changegroup sqlite3_changegroup; + +/* +** CAPI3REF: Create A New Changegroup Object +** CONSTRUCTOR: sqlite3_changegroup +** +** An sqlite3_changegroup object is used to combine two or more changesets +** (or patchsets) into a single changeset (or patchset). A single changegroup +** object may combine changesets or patchsets, but not both. The output is +** always in the same format as the input. +** +** If successful, this function returns SQLITE_OK and populates (*pp) with +** a pointer to a new sqlite3_changegroup object before returning. The caller +** should eventually free the returned object using a call to +** sqlite3changegroup_delete(). If an error occurs, an SQLite error code +** (i.e. SQLITE_NOMEM) is returned and *pp is set to NULL. +** +** The usual usage pattern for an sqlite3_changegroup object is as follows: +** +**
    +**
  • It is created using a call to sqlite3changegroup_new(). +** +**
  • Zero or more changesets (or patchsets) are added to the object +** by calling sqlite3changegroup_add(). +** +**
  • The result of combining all input changesets together is obtained +** by the application via a call to sqlite3changegroup_output(). +** +**
  • The object is deleted using a call to sqlite3changegroup_delete(). +**
+** +** Any number of calls to add() and output() may be made between the calls to +** new() and delete(), and in any order. +** +** As well as the regular sqlite3changegroup_add() and +** sqlite3changegroup_output() functions, also available are the streaming +** versions sqlite3changegroup_add_strm() and sqlite3changegroup_output_strm(). +*/ +SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); + +/* +** CAPI3REF: Add A Changeset To A Changegroup +** METHOD: sqlite3_changegroup +** +** Add all changes within the changeset (or patchset) in buffer pData (size +** nData bytes) to the changegroup. +** +** If the buffer contains a patchset, then all prior calls to this function +** on the same changegroup object must also have specified patchsets. Or, if +** the buffer contains a changeset, so must have the earlier calls to this +** function. Otherwise, SQLITE_ERROR is returned and no changes are added +** to the changegroup. +** +** Rows within the changeset and changegroup are identified by the values in +** their PRIMARY KEY columns. A change in the changeset is considered to +** apply to the same row as a change already present in the changegroup if +** the two rows have the same primary key. +** +** Changes to rows that do not already appear in the changegroup are +** simply copied into it. Or, if both the new changeset and the changegroup +** contain changes that apply to a single row, the final contents of the +** changegroup depends on the type of each change, as follows: +** +** +** +** +**
Existing Change New Change Output Change +**
INSERT INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
INSERT UPDATE +** The INSERT change remains in the changegroup. The values in the +** INSERT change are modified as if the row was inserted by the +** existing change and then updated according to the new change. +**
INSERT DELETE +** The existing INSERT is removed from the changegroup. The DELETE is +** not added. +**
UPDATE INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
UPDATE UPDATE +** The existing UPDATE remains within the changegroup. It is amended +** so that the accompanying values are as if the row was updated once +** by the existing change and then again by the new change. +**
UPDATE DELETE +** The existing UPDATE is replaced by the new DELETE within the +** changegroup. +**
DELETE INSERT +** If one or more of the column values in the row inserted by the +** new change differ from those in the row deleted by the existing +** change, the existing DELETE is replaced by an UPDATE within the +** changegroup. Otherwise, if the inserted row is exactly the same +** as the deleted row, the existing DELETE is simply discarded. +**
DELETE UPDATE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
DELETE DELETE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
+** +** If the new changeset contains changes to a table that is already present +** in the changegroup, then the number of columns and the position of the +** primary key columns for the table must be consistent. If this is not the +** case, this function fails with SQLITE_SCHEMA. If the input changeset +** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is +** returned. Or, if an out-of-memory condition occurs during processing, this +** function returns SQLITE_NOMEM. In all cases, if an error occurs the state +** of the final contents of the changegroup is undefined. +** +** If no error occurs, SQLITE_OK is returned. +*/ +SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); + +/* +** CAPI3REF: Obtain A Composite Changeset From A Changegroup +** METHOD: sqlite3_changegroup +** +** Obtain a buffer containing a changeset (or patchset) representing the +** current contents of the changegroup. If the inputs to the changegroup +** were themselves changesets, the output is a changeset. Or, if the +** inputs were patchsets, the output is also a patchset. +** +** As with the output of the sqlite3session_changeset() and +** sqlite3session_patchset() functions, all changes related to a single +** table are grouped together in the output of this function. Tables appear +** in the same order as for the very first changeset added to the changegroup. +** If the second or subsequent changesets added to the changegroup contain +** changes for tables that do not appear in the first changeset, they are +** appended onto the end of the output changeset, again in the order in +** which they are first encountered. +** +** If an error occurs, an SQLite error code is returned and the output +** variables (*pnData) and (*ppData) are set to 0. Otherwise, SQLITE_OK +** is returned and the output variables are set to the size of and a +** pointer to the output buffer, respectively. In this case it is the +** responsibility of the caller to eventually free the buffer using a +** call to sqlite3_free(). +*/ +SQLITE_API int sqlite3changegroup_output( + sqlite3_changegroup*, + int *pnData, /* OUT: Size of output buffer in bytes */ + void **ppData /* OUT: Pointer to output buffer */ +); + +/* +** CAPI3REF: Delete A Changegroup Object +** DESTRUCTOR: sqlite3_changegroup +*/ +SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); + +/* +** CAPI3REF: Apply A Changeset To A Database +** +** Apply a changeset or patchset to a database. These functions attempt to +** update the "main" database attached to handle db with the changes found in +** the changeset passed via the second and third arguments. +** +** The fourth argument (xFilter) passed to these functions is the "filter +** callback". If it is not NULL, then for each table affected by at least one +** change in the changeset, the filter callback is invoked with +** the table name as the second argument, and a copy of the context pointer +** passed as the sixth argument as the first. If the "filter callback" +** returns zero, then no attempt is made to apply any changes to the table. +** Otherwise, if the return value is non-zero or the xFilter argument to +** is NULL, all changes related to the table are attempted. +** +** For each table that is not excluded by the filter callback, this function +** tests that the target database contains a compatible table. A table is +** considered compatible if all of the following are true: +** +**
    +**
  • The table has the same name as the name recorded in the +** changeset, and +**
  • The table has at least as many columns as recorded in the +** changeset, and +**
  • The table has primary key columns in the same position as +** recorded in the changeset. +**
+** +** If there is no compatible table, it is not an error, but none of the +** changes associated with the table are applied. A warning message is issued +** via the sqlite3_log() mechanism with the error code SQLITE_SCHEMA. At most +** one such warning is issued for each table in the changeset. +** +** For each change for which there is a compatible table, an attempt is made +** to modify the table contents according to the UPDATE, INSERT or DELETE +** change. If a change cannot be applied cleanly, the conflict handler +** function passed as the fifth argument to sqlite3changeset_apply() may be +** invoked. A description of exactly when the conflict handler is invoked for +** each type of change is below. +** +** Unlike the xFilter argument, xConflict may not be passed NULL. The results +** of passing anything other than a valid function pointer as the xConflict +** argument are undefined. +** +** Each time the conflict handler function is invoked, it must return one +** of [SQLITE_CHANGESET_OMIT], [SQLITE_CHANGESET_ABORT] or +** [SQLITE_CHANGESET_REPLACE]. SQLITE_CHANGESET_REPLACE may only be returned +** if the second argument passed to the conflict handler is either +** SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If the conflict-handler +** returns an illegal value, any changes already made are rolled back and +** the call to sqlite3changeset_apply() returns SQLITE_MISUSE. Different +** actions are taken by sqlite3changeset_apply() depending on the value +** returned by each invocation of the conflict-handler function. Refer to +** the documentation for the three +** [SQLITE_CHANGESET_OMIT|available return values] for details. +** +**
+**
DELETE Changes
+** For each DELETE change, the function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in +** the changeset the row is deleted from the target database. +** +** If a row with matching primary key values is found, but one or more of +** the non-primary key fields contains a value different from the original +** row value stored in the changeset, the conflict-handler function is +** invoked with [SQLITE_CHANGESET_DATA] as the second argument. If the +** database table has more columns than are recorded in the changeset, +** only the values of those non-primary key fields are compared against +** the current database contents - any trailing database table columns +** are ignored. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the DELETE operation is attempted, but SQLite returns SQLITE_CONSTRAINT +** (which can only happen if a foreign key constraint is violated), the +** conflict-handler function is invoked with [SQLITE_CHANGESET_CONSTRAINT] +** passed as the second argument. This includes the case where the DELETE +** operation is attempted because an earlier call to the conflict handler +** function returned [SQLITE_CHANGESET_REPLACE]. +** +**
INSERT Changes
+** For each INSERT change, an attempt is made to insert the new row into +** the database. If the changeset row contains fewer fields than the +** database table, the trailing fields are populated with their default +** values. +** +** If the attempt to insert the row fails because the database already +** contains a row with the same primary key values, the conflict handler +** function is invoked with the second argument set to +** [SQLITE_CHANGESET_CONFLICT]. +** +** If the attempt to insert the row fails because of some other constraint +** violation (e.g. NOT NULL or UNIQUE), the conflict handler function is +** invoked with the second argument set to [SQLITE_CHANGESET_CONSTRAINT]. +** This includes the case where the INSERT operation is re-attempted because +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +** +**
UPDATE Changes
+** For each UPDATE change, the function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all modified non-primary key columns also match the values +** stored in the changeset the row is updated within the target database. +** +** If a row with matching primary key values is found, but one or more of +** the modified non-primary key fields contains a value different from an +** original row value stored in the changeset, the conflict-handler function +** is invoked with [SQLITE_CHANGESET_DATA] as the second argument. Since +** UPDATE changes only contain values for non-primary key fields that are +** to be modified, only those fields need to match the original values to +** avoid the SQLITE_CHANGESET_DATA conflict-handler callback. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the UPDATE operation is attempted, but SQLite returns +** SQLITE_CONSTRAINT, the conflict-handler function is invoked with +** [SQLITE_CHANGESET_CONSTRAINT] passed as the second argument. +** This includes the case where the UPDATE operation is attempted after +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +**
+** +** It is safe to execute SQL statements, including those that write to the +** table that the callback related to, from within the xConflict callback. +** This can be used to further customize the application's conflict +** resolution strategy. +** +** All changes made by these functions are enclosed in a savepoint transaction. +** If any other error (aside from a constraint failure when attempting to +** write to the target database) occurs, then the savepoint transaction is +** rolled back, restoring the target database to its original state, and an +** SQLite error code returned. +** +** If the output parameters (ppRebase) and (pnRebase) are non-NULL and +** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2() +** may set (*ppRebase) to point to a "rebase" that may be used with the +** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase) +** is set to the size of the buffer in bytes. It is the responsibility of the +** caller to eventually free any such buffer using sqlite3_free(). The buffer +** is only allocated and populated if one or more conflicts were encountered +** while applying the patchset. See comments surrounding the sqlite3_rebaser +** APIs for further details. +** +** The behavior of sqlite3changeset_apply_v2() and its streaming equivalent +** may be modified by passing a combination of +** [SQLITE_CHANGESETAPPLY_NOSAVEPOINT | supported flags] as the 9th parameter. +** +** Note that the sqlite3changeset_apply_v2() API is still experimental +** and therefore subject to change. +*/ +SQLITE_API int sqlite3changeset_apply( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +SQLITE_API int sqlite3changeset_apply_v2( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, /* OUT: Rebase data */ + int flags /* SESSION_CHANGESETAPPLY_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3changeset_apply_v2 +** +** The following flags may passed via the 9th parameter to +** [sqlite3changeset_apply_v2] and [sqlite3changeset_apply_v2_strm]: +** +**
+**
SQLITE_CHANGESETAPPLY_NOSAVEPOINT
+** Usually, the sessions module encloses all operations performed by +** a single call to apply_v2() or apply_v2_strm() in a [SAVEPOINT]. The +** SAVEPOINT is committed if the changeset or patchset is successfully +** applied, or rolled back if an error occurs. Specifying this flag +** causes the sessions module to omit this savepoint. In this case, if the +** caller has an open transaction or savepoint when apply_v2() is called, +** it may revert the partially applied changeset by rolling it back. +** +**
SQLITE_CHANGESETAPPLY_INVERT
+** Invert the changeset before applying it. This is equivalent to inverting +** a changeset using sqlite3changeset_invert() before applying it. It is +** an error to specify this flag with a patchset. +*/ +#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 +#define SQLITE_CHANGESETAPPLY_INVERT 0x0002 + +/* +** CAPI3REF: Constants Passed To The Conflict Handler +** +** Values that may be passed as the second argument to a conflict-handler. +** +**
+**
SQLITE_CHANGESET_DATA
+** The conflict handler is invoked with CHANGESET_DATA as the second argument +** when processing a DELETE or UPDATE change if a row with the required +** PRIMARY KEY fields is present in the database, but one or more other +** (non primary-key) fields modified by the update do not contain the +** expected "before" values. +** +** The conflicting row, in this case, is the database row with the matching +** primary key. +** +**
SQLITE_CHANGESET_NOTFOUND
+** The conflict handler is invoked with CHANGESET_NOTFOUND as the second +** argument when processing a DELETE or UPDATE change if a row with the +** required PRIMARY KEY fields is not present in the database. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
SQLITE_CHANGESET_CONFLICT
+** CHANGESET_CONFLICT is passed as the second argument to the conflict +** handler while processing an INSERT change if the operation would result +** in duplicate primary key values. +** +** The conflicting row in this case is the database row with the matching +** primary key. +** +**
SQLITE_CHANGESET_FOREIGN_KEY
+** If foreign key handling is enabled, and applying a changeset leaves the +** database in a state containing foreign key violations, the conflict +** handler is invoked with CHANGESET_FOREIGN_KEY as the second argument +** exactly once before the changeset is committed. If the conflict handler +** returns CHANGESET_OMIT, the changes, including those that caused the +** foreign key constraint violation, are committed. Or, if it returns +** CHANGESET_ABORT, the changeset is rolled back. +** +** No current or conflicting row information is provided. The only function +** it is possible to call on the supplied sqlite3_changeset_iter handle +** is sqlite3changeset_fk_conflicts(). +** +**
SQLITE_CHANGESET_CONSTRAINT
+** If any other constraint violation occurs while applying a change (i.e. +** a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is +** invoked with CHANGESET_CONSTRAINT as the second argument. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
+*/ +#define SQLITE_CHANGESET_DATA 1 +#define SQLITE_CHANGESET_NOTFOUND 2 +#define SQLITE_CHANGESET_CONFLICT 3 +#define SQLITE_CHANGESET_CONSTRAINT 4 +#define SQLITE_CHANGESET_FOREIGN_KEY 5 + +/* +** CAPI3REF: Constants Returned By The Conflict Handler +** +** A conflict handler callback must return one of the following three values. +** +**
+**
SQLITE_CHANGESET_OMIT
+** If a conflict handler returns this value no special action is taken. The +** change that caused the conflict is not applied. The session module +** continues to the next change in the changeset. +** +**
SQLITE_CHANGESET_REPLACE
+** This value may only be returned if the second argument to the conflict +** handler was SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If this +** is not the case, any changes applied so far are rolled back and the +** call to sqlite3changeset_apply() returns SQLITE_MISUSE. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_DATA conflict +** handler, then the conflicting row is either updated or deleted, depending +** on the type of change. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_CONFLICT conflict +** handler, then the conflicting row is removed from the database and a +** second attempt to apply the change is made. If this second attempt fails, +** the original row is restored to the database before continuing. +** +**
SQLITE_CHANGESET_ABORT
+** If this value is returned, any changes applied so far are rolled back +** and the call to sqlite3changeset_apply() returns SQLITE_ABORT. +**
+*/ +#define SQLITE_CHANGESET_OMIT 0 +#define SQLITE_CHANGESET_REPLACE 1 +#define SQLITE_CHANGESET_ABORT 2 + +/* +** CAPI3REF: Rebasing changesets +** EXPERIMENTAL +** +** Suppose there is a site hosting a database in state S0. And that +** modifications are made that move that database to state S1 and a +** changeset recorded (the "local" changeset). Then, a changeset based +** on S0 is received from another site (the "remote" changeset) and +** applied to the database. The database is then in state +** (S1+"remote"), where the exact state depends on any conflict +** resolution decisions (OMIT or REPLACE) made while applying "remote". +** Rebasing a changeset is to update it to take those conflict +** resolution decisions into account, so that the same conflicts +** do not have to be resolved elsewhere in the network. +** +** For example, if both the local and remote changesets contain an +** INSERT of the same key on "CREATE TABLE t1(a PRIMARY KEY, b)": +** +** local: INSERT INTO t1 VALUES(1, 'v1'); +** remote: INSERT INTO t1 VALUES(1, 'v2'); +** +** and the conflict resolution is REPLACE, then the INSERT change is +** removed from the local changeset (it was overridden). Or, if the +** conflict resolution was "OMIT", then the local changeset is modified +** to instead contain: +** +** UPDATE t1 SET b = 'v2' WHERE a=1; +** +** Changes within the local changeset are rebased as follows: +** +**
+**
Local INSERT
+** This may only conflict with a remote INSERT. If the conflict +** resolution was OMIT, then add an UPDATE change to the rebased +** changeset. Or, if the conflict resolution was REPLACE, add +** nothing to the rebased changeset. +** +**
Local DELETE
+** This may conflict with a remote UPDATE or DELETE. In both cases the +** only possible resolution is OMIT. If the remote operation was a +** DELETE, then add no change to the rebased changeset. If the remote +** operation was an UPDATE, then the old.* fields of change are updated +** to reflect the new.* values in the UPDATE. +** +**
Local UPDATE
+** This may conflict with a remote UPDATE or DELETE. If it conflicts +** with a DELETE, and the conflict resolution was OMIT, then the update +** is changed into an INSERT. Any undefined values in the new.* record +** from the update change are filled in using the old.* values from +** the conflicting DELETE. Or, if the conflict resolution was REPLACE, +** the UPDATE change is simply omitted from the rebased changeset. +** +** If conflict is with a remote UPDATE and the resolution is OMIT, then +** the old.* values are rebased using the new.* values in the remote +** change. Or, if the resolution is REPLACE, then the change is copied +** into the rebased changeset with updates to columns also updated by +** the conflicting remote UPDATE removed. If this means no columns would +** be updated, the change is omitted. +**
+** +** A local change may be rebased against multiple remote changes +** simultaneously. If a single key is modified by multiple remote +** changesets, they are combined as follows before the local changeset +** is rebased: +** +**
    +**
  • If there has been one or more REPLACE resolutions on a +** key, it is rebased according to a REPLACE. +** +**
  • If there have been no REPLACE resolutions on a key, then +** the local changeset is rebased according to the most recent +** of the OMIT resolutions. +**
+** +** Note that conflict resolutions from multiple remote changesets are +** combined on a per-field basis, not per-row. This means that in the +** case of multiple remote UPDATE operations, some fields of a single +** local change may be rebased for REPLACE while others are rebased for +** OMIT. +** +** In order to rebase a local changeset, the remote changeset must first +** be applied to the local database using sqlite3changeset_apply_v2() and +** the buffer of rebase information captured. Then: +** +**
    +**
  1. An sqlite3_rebaser object is created by calling +** sqlite3rebaser_create(). +**
  2. The new object is configured with the rebase buffer obtained from +** sqlite3changeset_apply_v2() by calling sqlite3rebaser_configure(). +** If the local changeset is to be rebased against multiple remote +** changesets, then sqlite3rebaser_configure() should be called +** multiple times, in the same order that the multiple +** sqlite3changeset_apply_v2() calls were made. +**
  3. Each local changeset is rebased by calling sqlite3rebaser_rebase(). +**
  4. The sqlite3_rebaser object is deleted by calling +** sqlite3rebaser_delete(). +**
+*/ +typedef struct sqlite3_rebaser sqlite3_rebaser; + +/* +** CAPI3REF: Create a changeset rebaser object. +** EXPERIMENTAL +** +** Allocate a new changeset rebaser object. If successful, set (*ppNew) to +** point to the new object and return SQLITE_OK. Otherwise, if an error +** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew) +** to NULL. +*/ +SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew); + +/* +** CAPI3REF: Configure a changeset rebaser object. +** EXPERIMENTAL +** +** Configure the changeset rebaser object to rebase changesets according +** to the conflict resolutions described by buffer pRebase (size nRebase +** bytes), which must have been obtained from a previous call to +** sqlite3changeset_apply_v2(). +*/ +SQLITE_API int sqlite3rebaser_configure( + sqlite3_rebaser*, + int nRebase, const void *pRebase +); + +/* +** CAPI3REF: Rebase a changeset +** EXPERIMENTAL +** +** Argument pIn must point to a buffer containing a changeset nIn bytes +** in size. This function allocates and populates a buffer with a copy +** of the changeset rebased according to the configuration of the +** rebaser object passed as the first argument. If successful, (*ppOut) +** is set to point to the new buffer containing the rebased changeset and +** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the +** responsibility of the caller to eventually free the new buffer using +** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut) +** are set to zero and an SQLite error code returned. +*/ +SQLITE_API int sqlite3rebaser_rebase( + sqlite3_rebaser*, + int nIn, const void *pIn, + int *pnOut, void **ppOut +); + +/* +** CAPI3REF: Delete a changeset rebaser object. +** EXPERIMENTAL +** +** Delete the changeset rebaser object and all associated resources. There +** should be one call to this function for each successful invocation +** of sqlite3rebaser_create(). +*/ +SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); + +/* +** CAPI3REF: Streaming Versions of API functions. +** +** The six streaming API xxx_strm() functions serve similar purposes to the +** corresponding non-streaming API functions: +** +** +** +**
Streaming functionNon-streaming equivalent
sqlite3changeset_apply_strm[sqlite3changeset_apply] +**
sqlite3changeset_apply_strm_v2[sqlite3changeset_apply_v2] +**
sqlite3changeset_concat_strm[sqlite3changeset_concat] +**
sqlite3changeset_invert_strm[sqlite3changeset_invert] +**
sqlite3changeset_start_strm[sqlite3changeset_start] +**
sqlite3session_changeset_strm[sqlite3session_changeset] +**
sqlite3session_patchset_strm[sqlite3session_patchset] +**
+** +** Non-streaming functions that accept changesets (or patchsets) as input +** require that the entire changeset be stored in a single buffer in memory. +** Similarly, those that return a changeset or patchset do so by returning +** a pointer to a single large buffer allocated using sqlite3_malloc(). +** Normally this is convenient. However, if an application running in a +** low-memory environment is required to handle very large changesets, the +** large contiguous memory allocations required can become onerous. +** +** In order to avoid this problem, instead of a single large buffer, input +** is passed to a streaming API functions by way of a callback function that +** the sessions module invokes to incrementally request input data as it is +** required. In all cases, a pair of API function parameters such as +** +**
+**        int nChangeset,
+**        void *pChangeset,
+**  
+** +** Is replaced by: +** +**
+**        int (*xInput)(void *pIn, void *pData, int *pnData),
+**        void *pIn,
+**  
+** +** Each time the xInput callback is invoked by the sessions module, the first +** argument passed is a copy of the supplied pIn context pointer. The second +** argument, pData, points to a buffer (*pnData) bytes in size. Assuming no +** error occurs the xInput method should copy up to (*pnData) bytes of data +** into the buffer and set (*pnData) to the actual number of bytes copied +** before returning SQLITE_OK. If the input is completely exhausted, (*pnData) +** should be set to zero to indicate this. Or, if an error occurs, an SQLite +** error code should be returned. In all cases, if an xInput callback returns +** an error, all processing is abandoned and the streaming API function +** returns a copy of the error code to the caller. +** +** In the case of sqlite3changeset_start_strm(), the xInput callback may be +** invoked by the sessions module at any point during the lifetime of the +** iterator. If such an xInput callback returns an error, the iterator enters +** an error state, whereby all subsequent calls to iterator functions +** immediately fail with the same error code as returned by xInput. +** +** Similarly, streaming API functions that return changesets (or patchsets) +** return them in chunks by way of a callback function instead of via a +** pointer to a single large buffer. In this case, a pair of parameters such +** as: +** +**
+**        int *pnChangeset,
+**        void **ppChangeset,
+**  
+** +** Is replaced by: +** +**
+**        int (*xOutput)(void *pOut, const void *pData, int nData),
+**        void *pOut
+**  
+** +** The xOutput callback is invoked zero or more times to return data to +** the application. The first parameter passed to each call is a copy of the +** pOut pointer supplied by the application. The second parameter, pData, +** points to a buffer nData bytes in size containing the chunk of output +** data being returned. If the xOutput callback successfully processes the +** supplied data, it should return SQLITE_OK to indicate success. Otherwise, +** it should return some other SQLite error code. In this case processing +** is immediately abandoned and the streaming API function returns a copy +** of the xOutput error code to the application. +** +** The sessions module never invokes an xOutput callback with the third +** parameter set to a value less than or equal to zero. Other than this, +** no guarantees are made as to the size of the chunks of data returned. +*/ +SQLITE_API int sqlite3changeset_apply_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +SQLITE_API int sqlite3changeset_apply_v2_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +); +SQLITE_API int sqlite3changeset_concat_strm( + int (*xInputA)(void *pIn, void *pData, int *pnData), + void *pInA, + int (*xInputB)(void *pIn, void *pData, int *pnData), + void *pInB, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_invert_strm( + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_start_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3changeset_start_v2_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int flags +); +SQLITE_API int sqlite3session_changeset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3session_patchset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changegroup_add_strm(sqlite3_changegroup*, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3rebaser_rebase_strm( + sqlite3_rebaser *pRebaser, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); + +/* +** CAPI3REF: Configure global parameters +** +** The sqlite3session_config() interface is used to make global configuration +** changes to the sessions module in order to tune it to the specific needs +** of the application. +** +** The sqlite3session_config() interface is not threadsafe. If it is invoked +** while any other thread is inside any other sessions method then the +** results are undefined. Furthermore, if it is invoked after any sessions +** related objects have been created, the results are also undefined. +** +** The first argument to the sqlite3session_config() function must be one +** of the SQLITE_SESSION_CONFIG_XXX constants defined below. The +** interpretation of the (void*) value passed as the second parameter and +** the effect of calling this function depends on the value of the first +** parameter. +** +**
+**
SQLITE_SESSION_CONFIG_STRMSIZE
+** By default, the sessions module streaming interfaces attempt to input +** and output data in approximately 1 KiB chunks. This operand may be used +** to set and query the value of this configuration setting. The pointer +** passed as the second argument must point to a value of type (int). +** If this value is greater than 0, it is used as the new streaming data +** chunk size for both input and output. Before returning, the (int) value +** pointed to by pArg is set to the final value of the streaming interface +** chunk size. +**
+** +** This function returns SQLITE_OK if successful, or an SQLite error code +** otherwise. +*/ +SQLITE_API int sqlite3session_config(int op, void *pArg); + +/* +** CAPI3REF: Values for sqlite3session_config(). +*/ +#define SQLITE_SESSION_CONFIG_STRMSIZE 1 + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +} +#endif + +#endif /* !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) */ + +/******** End of sqlite3session.h *********/ +/******** Begin file fts5.h *********/ +/* +** 2014 May 31 +** +** 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. +** +****************************************************************************** +** +** Interfaces to extend FTS5. Using the interfaces defined in this file, +** FTS5 may be extended with: +** +** * custom tokenizers, and +** * custom auxiliary functions. +*/ + + +#ifndef _FTS5_H +#define _FTS5_H + + +#if 0 +extern "C" { +#endif + +/************************************************************************* +** CUSTOM AUXILIARY FUNCTIONS +** +** Virtual table implementations may overload SQL functions by implementing +** the sqlite3_module.xFindFunction() method. +*/ + +typedef struct Fts5ExtensionApi Fts5ExtensionApi; +typedef struct Fts5Context Fts5Context; +typedef struct Fts5PhraseIter Fts5PhraseIter; + +typedef void (*fts5_extension_function)( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +); + +struct Fts5PhraseIter { + const unsigned char *a; + const unsigned char *b; +}; + +/* +** EXTENSION API FUNCTIONS +** +** xUserData(pFts): +** Return a copy of the context pointer the extension function was +** registered with. +** +** xColumnTotalSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the FTS5 table. Or, if iCol is +** non-negative but less than the number of columns in the table, return +** the total number of tokens in column iCol, considering all rows in +** the FTS5 table. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** xColumnCount(pFts): +** Return the number of columns in the table. +** +** xColumnSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the current row. Or, if iCol is +** non-negative but less than the number of columns in the table, set +** *pnToken to the number of tokens in column iCol of the current row. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** This function may be quite inefficient if used with an FTS5 table +** created with the "columnsize=0" option. +** +** xColumnText: +** This function attempts to retrieve the text of column iCol of the +** current document. If successful, (*pz) is set to point to a buffer +** containing the text in utf-8 encoding, (*pn) is set to the size in bytes +** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, +** if an error occurs, an SQLite error code is returned and the final values +** of (*pz) and (*pn) are undefined. +** +** xPhraseCount: +** Returns the number of phrases in the current query expression. +** +** xPhraseSize: +** Returns the number of tokens in phrase iPhrase of the query. Phrases +** are numbered starting from zero. +** +** xInstCount: +** Set *pnInst to the total number of occurrences of all phrases within +** the query within the current row. Return SQLITE_OK if successful, or +** an error code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always returns 0. +** +** xInst: +** Query for the details of phrase match iIdx within the current row. +** Phrase matches are numbered starting from zero, so the iIdx argument +** should be greater than or equal to zero and smaller than the value +** output by xInstCount(). +** +** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** to the column in which it occurs and *piOff the token offset of the +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xRowid: +** Returns the rowid of the current row. +** +** xTokenize: +** Tokenize text using the tokenizer belonging to the FTS5 table. +** +** xQueryPhrase(pFts5, iPhrase, pUserData, xCallback): +** This API function is used to query the FTS table for phrase iPhrase +** of the current query. Specifically, a query equivalent to: +** +** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid +** +** with $p set to a phrase equivalent to the phrase iPhrase of the +** current query is executed. Any column filter that applies to +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback +** function may be used to access the properties of each matched row. +** Invoking Api.xUserData() returns a copy of the pointer passed as +** the third argument to pUserData. +** +** If the callback function returns any value other than SQLITE_OK, the +** query is abandoned and the xQueryPhrase function returns immediately. +** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. +** Otherwise, the error code is propagated upwards. +** +** If the query runs to completion without incident, SQLITE_OK is returned. +** Or, if some error occurs before the query completes or is aborted by +** the callback, an SQLite error code is returned. +** +** +** xSetAuxdata(pFts5, pAux, xDelete) +** +** Save the pointer passed as the second argument as the extension function's +** "auxiliary data". The pointer may then be retrieved by the current or any +** future invocation of the same fts5 extension function made as part of +** the same MATCH query using the xGetAuxdata() API. +** +** Each extension function is allocated a single auxiliary data slot for +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a +** single auxiliary data context. +** +** If there is already an auxiliary data pointer when this function is +** invoked, then it is replaced by the new pointer. If an xDelete callback +** was specified along with the original pointer, it is invoked at this +** point. +** +** The xDelete callback, if one is specified, is also invoked on the +** auxiliary data pointer after the FTS5 query has finished. +** +** If an error (e.g. an OOM condition) occurs within this function, +** the auxiliary data is set to NULL and an error code returned. If the +** xDelete parameter was not NULL, it is invoked on the auxiliary data +** pointer before returning. +** +** +** xGetAuxdata(pFts5, bClear) +** +** Returns the current auxiliary data pointer for the fts5 extension +** function. See the xSetAuxdata() method for details. +** +** If the bClear argument is non-zero, then the auxiliary data is cleared +** (set to NULL) before this function returns. In this case the xDelete, +** if any, is not invoked. +** +** +** xRowCount(pFts5, pnRow) +** +** This function is used to retrieve the total number of rows in the table. +** In other words, the same value that would be returned by: +** +** SELECT count(*) FROM ftstable; +** +** xPhraseFirst() +** This function is used, along with type Fts5PhraseIter and the xPhraseNext +** method, to iterate through all instances of a single query phrase within +** the current row. This is the same information as is accessible via the +** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient +** to use, this API may be faster under some circumstances. To iterate +** through instances of phrase iPhrase, use the following code: +** +** Fts5PhraseIter iter; +** int iCol, iOff; +** for(pApi->xPhraseFirst(pFts, iPhrase, &iter, &iCol, &iOff); +** iCol>=0; +** pApi->xPhraseNext(pFts, &iter, &iCol, &iOff) +** ){ +** // An instance of phrase iPhrase at offset iOff of column iCol +** } +** +** The Fts5PhraseIter structure is defined above. Applications should not +** modify this structure directly - it should only be used as shown above +** with the xPhraseFirst() and xPhraseNext() API methods (and by +** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always iterates +** through an empty set (all calls to xPhraseFirst() set iCol to -1). +** +** xPhraseNext() +** See xPhraseFirst above. +** +** xPhraseFirstColumn() +** This function and xPhraseNextColumn() are similar to the xPhraseFirst() +** and xPhraseNext() APIs described above. The difference is that instead +** of iterating through all instances of a phrase in the current row, these +** APIs are used to iterate through the set of columns in the current row +** that contain one or more instances of a specified phrase. For example: +** +** Fts5PhraseIter iter; +** int iCol; +** for(pApi->xPhraseFirstColumn(pFts, iPhrase, &iter, &iCol); +** iCol>=0; +** pApi->xPhraseNextColumn(pFts, &iter, &iCol) +** ){ +** // Column iCol contains at least one instance of phrase iPhrase +** } +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to +** xPhraseFirstColumn() set iCol to -1). +** +** The information accessed using this API and its companion +** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext +** (or xInst/xInstCount). The chief advantage of this API is that it is +** significantly more efficient than those alternatives when used with +** "detail=column" tables. +** +** xPhraseNextColumn() +** See xPhraseFirstColumn above. +*/ +struct Fts5ExtensionApi { + int iVersion; /* Currently always set to 3 */ + + void *(*xUserData)(Fts5Context*); + + int (*xColumnCount)(Fts5Context*); + int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); + int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); + + int (*xTokenize)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); + + int (*xPhraseCount)(Fts5Context*); + int (*xPhraseSize)(Fts5Context*, int iPhrase); + + int (*xInstCount)(Fts5Context*, int *pnInst); + int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff); + + sqlite3_int64 (*xRowid)(Fts5Context*); + int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xColumnSize)(Fts5Context*, int iCol, int *pnToken); + + int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData, + int(*)(const Fts5ExtensionApi*,Fts5Context*,void*) + ); + int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*)); + void *(*xGetAuxdata)(Fts5Context*, int bClear); + + int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*); + void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff); + + int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); + void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); +}; + +/* +** CUSTOM AUXILIARY FUNCTIONS +*************************************************************************/ + +/************************************************************************* +** CUSTOM TOKENIZERS +** +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the +** following structure. All structure methods must be defined, setting +** any member of the fts5_tokenizer struct to NULL leads to undefined +** behaviour. The structure methods are expected to function as follows: +** +** xCreate: +** This function is used to allocate and initialize a tokenizer instance. +** A tokenizer instance is required to actually tokenize text. +** +** The first argument passed to this function is a copy of the (void*) +** pointer provided by the application when the fts5_tokenizer object +** was registered with FTS5 (the third argument to xCreateTokenizer()). +** The second and third arguments are an array of nul-terminated strings +** containing the tokenizer arguments, if any, specified following the +** tokenizer name as part of the CREATE VIRTUAL TABLE statement used +** to create the FTS5 table. +** +** The final argument is an output variable. If successful, (*ppOut) +** should be set to point to the new tokenizer handle and SQLITE_OK +** returned. If an error occurs, some value other than SQLITE_OK should +** be returned. In this case, fts5 assumes that the final value of *ppOut +** is undefined. +** +** xDelete: +** This function is invoked to delete a tokenizer handle previously +** allocated using xCreate(). Fts5 guarantees that this function will +** be invoked exactly once for each successful call to xCreate(). +** +** xTokenize: +** This function is expected to tokenize the nText byte string indicated +** by argument pText. pText may or may not be nul-terminated. The first +** argument passed to this function is a pointer to an Fts5Tokenizer object +** returned by an earlier call to xCreate(). +** +** The second argument indicates the reason that FTS5 is requesting +** tokenization of the supplied text. This is always one of the following +** four values: +** +**
  • FTS5_TOKENIZE_DOCUMENT - A document is being inserted into +** or removed from the FTS table. The tokenizer is being invoked to +** determine the set of tokens to add to (or delete from) the +** FTS index. +** +**
  • FTS5_TOKENIZE_QUERY - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize +** a bareword or quoted string specified as part of the query. +** +**
  • (FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX) - Same as +** FTS5_TOKENIZE_QUERY, except that the bareword or quoted string is +** followed by a "*" character, indicating that the last token +** returned by the tokenizer will be treated as a token prefix. +** +**
  • FTS5_TOKENIZE_AUX - The tokenizer is being invoked to +** satisfy an fts5_api.xTokenize() request made by an auxiliary +** function. Or an fts5_api.xColumnSize() request made by the same +** on a columnsize=0 database. +**
+** +** For each token in the input string, the supplied callback xToken() must +** be invoked. The first argument to it should be a copy of the pointer +** passed as the second argument to xTokenize(). The third and fourth +** arguments are a pointer to a buffer containing the token text, and the +** size of the token in bytes. The 4th and 5th arguments are the byte offsets +** of the first byte of and first byte immediately following the text from +** which the token is derived within the input. +** +** The second argument passed to the xToken() callback ("tflags") should +** normally be set to 0. The exception is if the tokenizer supports +** synonyms. In this case see the discussion below for details. +** +** FTS5 assumes the xToken() callback is invoked for each token in the +** order that they occur within the input text. +** +** If an xToken() callback returns any value other than SQLITE_OK, then +** the tokenization should be abandoned and the xTokenize() method should +** immediately return a copy of the xToken() return value. Or, if the +** input buffer is exhausted, xTokenize() should return SQLITE_OK. Finally, +** if an error occurs with the xTokenize() implementation itself, it +** may abandon the tokenization and return any error code other than +** SQLITE_OK or SQLITE_DONE. +** +** SYNONYM SUPPORT +** +** Custom tokenizers may also support synonyms. Consider a case in which a +** user wishes to query for a phrase such as "first place". Using the +** built-in tokenizers, the FTS5 query 'first + place' will match instances +** of "first place" within the document set, but not alternative forms +** such as "1st place". In some applications, it would be better to match +** all instances of "first place" or "1st place" regardless of which form +** the user specified in the MATCH query text. +** +** There are several ways to approach this in FTS5: +** +**
  1. By mapping all synonyms to a single token. In this case, using +** the above example, this means that the tokenizer returns the +** same token for inputs "first" and "1st". Say that token is in +** fact "first", so that when the user inserts the document "I won +** 1st place" entries are added to the index for tokens "i", "won", +** "first" and "place". If the user then queries for '1st + place', +** the tokenizer substitutes "first" for "1st" and the query works +** as expected. +** +**
  2. By querying the index for all synonyms of each query term +** separately. In this case, when tokenizing query text, the +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each +** synonym individually. For example, faced with the query: +** +** +** ... MATCH 'first place' +** +** the tokenizer offers both "1st" and "first" as synonyms for the +** first token in the MATCH query and FTS5 effectively runs a query +** similar to: +** +** +** ... MATCH '(first OR 1st) place' +** +** except that, for the purposes of auxiliary functions, the query +** still appears to contain just two phrases - "(first OR 1st)" +** being treated as a single phrase. +** +**
  3. By adding multiple synonyms for a single term to the FTS index. +** Using this method, when tokenizing document text, the tokenizer +** provides multiple synonyms for each token. So that when a +** document such as "I won first place" is tokenized, entries are +** added to the FTS index for "i", "won", "first", "1st" and +** "place". +** +** This way, even if the tokenizer does not provide synonyms +** when tokenizing query text (it should not - to do so would be +** inefficient), it doesn't matter if the user queries for +** 'first + place' or '1st + place', as there are entries in the +** FTS index corresponding to both forms of the first token. +**
+** +** Whether it is parsing document or query text, any call to xToken that +** specifies a tflags argument with the FTS5_TOKEN_COLOCATED bit +** is considered to supply a synonym for the previous token. For example, +** when parsing the document "I won first place", a tokenizer that supports +** synonyms would call xToken() 5 times, as follows: +** +** +** xToken(pCtx, 0, "i", 1, 0, 1); +** xToken(pCtx, 0, "won", 3, 2, 5); +** xToken(pCtx, 0, "first", 5, 6, 11); +** xToken(pCtx, FTS5_TOKEN_COLOCATED, "1st", 3, 6, 11); +** xToken(pCtx, 0, "place", 5, 12, 17); +** +** +** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time +** xToken() is called. Multiple synonyms may be specified for a single token +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** There is no limit to the number of synonyms that may be provided for a +** single token. +** +** In many cases, method (1) above is the best approach. It does not add +** extra data to the FTS index or require FTS5 to query for multiple terms, +** so it is efficient in terms of disk space and query speed. However, it +** does not support prefix queries very well. If, as suggested above, the +** token "first" is substituted for "1st" by the tokenizer, then the query: +** +** +** ... MATCH '1s*' +** +** will not match documents that contain the token "1st" (as the tokenizer +** will probably not map "1s" to any prefix of "first"). +** +** For full prefix support, method (3) may be preferred. In this case, +** because the index contains entries for both "first" and "1st", prefix +** queries such as 'fi*' or '1s*' will match correctly. However, because +** extra entries are added to the FTS index, this method uses more space +** within the database. +** +** Method (2) offers a midpoint between (1) and (3). Using this method, +** a query such as '1s*' will match documents that contain the literal +** token "1st", but not "first" (assuming the tokenizer is not able to +** provide synonyms for prefixes). However, a non-prefix query like '1st' +** will match against "1st" and "first". This method does not require +** extra disk space, as no extra entries are added to the FTS index. +** On the other hand, it may require more CPU cycles to run MATCH queries, +** as separate queries of the FTS index are required for each synonym. +** +** When using methods (2) or (3), it is important that the tokenizer only +** provide synonyms when tokenizing document text (method (2)) or query +** text (method (3)), not both. Doing so will not cause any errors, but is +** inefficient. +*/ +typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer fts5_tokenizer; +struct fts5_tokenizer { + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* Flags that may be passed as the third argument to xTokenize() */ +#define FTS5_TOKENIZE_QUERY 0x0001 +#define FTS5_TOKENIZE_PREFIX 0x0002 +#define FTS5_TOKENIZE_DOCUMENT 0x0004 +#define FTS5_TOKENIZE_AUX 0x0008 + +/* Flags that may be passed by the tokenizer implementation back to FTS5 +** as the third argument to the supplied xToken callback. */ +#define FTS5_TOKEN_COLOCATED 0x0001 /* Same position as prev. token */ + +/* +** END OF CUSTOM TOKENIZERS +*************************************************************************/ + +/************************************************************************* +** FTS5 EXTENSION REGISTRATION API +*/ +typedef struct fts5_api fts5_api; +struct fts5_api { + int iVersion; /* Currently always set to 2 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_tokenizer *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer)( + fts5_api *pApi, + const char *zName, + void **ppContext, + fts5_tokenizer *pTokenizer + ); + + /* Create a new auxiliary function */ + int (*xCreateFunction)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_extension_function xFunction, + void (*xDestroy)(void*) + ); +}; + +/* +** END OF REGISTRATION API +*************************************************************************/ + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _FTS5_H */ + +/******** End of fts5.h *********/ + +/************** End of sqlite3.h *********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* +** Include the configuration header output by 'configure' if we're using the +** autoconf-based build +*/ +#if defined(_HAVE_SQLITE_CONFIG_H) && !defined(SQLITECONFIG_H) +/* #include "config.h" */ +#define SQLITECONFIG_H 1 +#endif + +/************** Include sqliteLimit.h in the middle of sqliteInt.h ***********/ +/************** Begin file sqliteLimit.h *************************************/ +/* +** 2007 May 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 defines various limits of what SQLite can process. +*/ + +/* +** The maximum length of a TEXT or BLOB in bytes. This also +** limits the size of a row in a table or index. +** +** The hard limit is the ability of a 32-bit signed integer +** to count the size: 2^31-1 or 2147483647. +*/ +#ifndef SQLITE_MAX_LENGTH +# define SQLITE_MAX_LENGTH 1000000000 +#endif + +/* +** This is the maximum number of +** +** * Columns in a table +** * Columns in an index +** * Columns in a view +** * Terms in the SET clause of an UPDATE statement +** * Terms in the result set of a SELECT statement +** * Terms in the GROUP BY or ORDER BY clauses of a SELECT statement. +** * Terms in the VALUES clause of an INSERT statement +** +** The hard upper limit here is 32676. Most database people will +** tell you that in a well-normalized database, you usually should +** not have more than a dozen or so columns in any table. And if +** that is the case, there is no point in having more than a few +** dozen values in any of the other situations described above. +*/ +#ifndef SQLITE_MAX_COLUMN +# define SQLITE_MAX_COLUMN 2000 +#endif + +/* +** The maximum length of a single SQL statement in bytes. +** +** It used to be the case that setting this value to zero would +** turn the limit off. That is no longer true. It is not possible +** to turn this limit off. +*/ +#ifndef SQLITE_MAX_SQL_LENGTH +# define SQLITE_MAX_SQL_LENGTH 1000000000 +#endif + +/* +** The maximum depth of an expression tree. This is limited to +** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might +** want to place more severe limits on the complexity of an +** expression. +** +** A value of 0 used to mean that the limit was not enforced. +** But that is no longer true. The limit is now strictly enforced +** at all times. +*/ +#ifndef SQLITE_MAX_EXPR_DEPTH +# define SQLITE_MAX_EXPR_DEPTH 9999999999 +#endif + +/* +** The maximum number of terms in a compound SELECT statement. +** The code generator for compound SELECT statements does one +** level of recursion for each term. A stack overflow can result +** if the number of terms is too large. In practice, most SQL +** never has more than 3 or 4 terms. Use a value of 0 to disable +** any limit on the number of terms in a compount SELECT. +*/ +#ifndef SQLITE_MAX_COMPOUND_SELECT +# define SQLITE_MAX_COMPOUND_SELECT 500 +#endif + +/* +** The maximum number of opcodes in a VDBE program. +** Not currently enforced. +*/ +#ifndef SQLITE_MAX_VDBE_OP +# define SQLITE_MAX_VDBE_OP 250000000 +#endif + +/* +** The maximum number of arguments to an SQL function. +*/ +#ifndef SQLITE_MAX_FUNCTION_ARG +# define SQLITE_MAX_FUNCTION_ARG 127 +#endif + +/* +** The suggested maximum number of in-memory pages to use for +** the main database table and for temporary tables. +** +** IMPLEMENTATION-OF: R-30185-15359 The default suggested cache size is -2000, +** which means the cache size is limited to 2048000 bytes of memory. +** IMPLEMENTATION-OF: R-48205-43578 The default suggested cache size can be +** altered using the SQLITE_DEFAULT_CACHE_SIZE compile-time options. +*/ +#ifndef SQLITE_DEFAULT_CACHE_SIZE +# define SQLITE_DEFAULT_CACHE_SIZE -2000 +#endif + +/* +** The default number of frames to accumulate in the log file before +** checkpointing the database in WAL mode. +*/ +#ifndef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT +# define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000 +#endif + +/* +** The maximum number of attached databases. This must be between 0 +** and 125. The upper bound of 125 is because the attached databases are +** counted using a signed 8-bit integer which has a maximum value of 127 +** and we have to allow 2 extra counts for the "main" and "temp" databases. +*/ +#ifndef SQLITE_MAX_ATTACHED +# define SQLITE_MAX_ATTACHED 10 +#endif + + +/* +** The maximum value of a ?nnn wildcard that the parser will accept. +** If the value exceeds 32767 then extra space is required for the Expr +** structure. But otherwise, we believe that the number can be as large +** as a signed 32-bit integer can hold. +*/ +#ifndef SQLITE_MAX_VARIABLE_NUMBER +# define SQLITE_MAX_VARIABLE_NUMBER 9999999999 +#endif + +/* Maximum page size. The upper bound on this value is 65536. This a limit +** imposed by the use of 16-bit offsets within each page. +** +** Earlier versions of SQLite allowed the user to change this value at +** compile time. This is no longer permitted, on the grounds that it creates +** a library that is technically incompatible with an SQLite library +** compiled with a different limit. If a process operating on a database +** with a page-size of 65536 bytes crashes, then an instance of SQLite +** compiled with the default page-size limit will not be able to rollback +** the aborted transaction. This could lead to database corruption. +*/ +#ifdef SQLITE_MAX_PAGE_SIZE +# undef SQLITE_MAX_PAGE_SIZE +#endif +#define SQLITE_MAX_PAGE_SIZE 65536 + + +/* +** The default size of a database page. +*/ +#ifndef SQLITE_DEFAULT_PAGE_SIZE +# define SQLITE_DEFAULT_PAGE_SIZE 4096 +#endif +#if SQLITE_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE +# undef SQLITE_DEFAULT_PAGE_SIZE +# define SQLITE_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE +#endif + +/* +** Ordinarily, if no value is explicitly provided, SQLite creates databases +** with page size SQLITE_DEFAULT_PAGE_SIZE. However, based on certain +** device characteristics (sector-size and atomic write() support), +** SQLite may choose a larger value. This constant is the maximum value +** SQLite will choose on its own. +*/ +#ifndef SQLITE_MAX_DEFAULT_PAGE_SIZE +# define SQLITE_MAX_DEFAULT_PAGE_SIZE 8192 +#endif +#if SQLITE_MAX_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE +# undef SQLITE_MAX_DEFAULT_PAGE_SIZE +# define SQLITE_MAX_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE +#endif + + +/* +** Maximum number of pages in one database file. +** +** This is really just the default value for the max_page_count pragma. +** This value can be lowered (or raised) at run-time using that the +** max_page_count macro. +*/ +#ifndef SQLITE_MAX_PAGE_COUNT +# define SQLITE_MAX_PAGE_COUNT 1073741823 +#endif + +/* +** Maximum length (in bytes) of the pattern in a LIKE or GLOB +** operator. +*/ +#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH +# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#endif + +/* +** Maximum depth of recursion for triggers. +** +** A value of 1 means that a trigger program will not be able to itself +** fire any triggers. A value of 0 means that no trigger programs at all +** may be executed. +*/ +#ifndef SQLITE_MAX_TRIGGER_DEPTH +# define SQLITE_MAX_TRIGGER_DEPTH 1000 +#endif + +/************** End of sqliteLimit.h *****************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* Disable nuisance warnings on Borland compilers */ +#if defined(__BORLANDC__) +#pragma warn -rch /* unreachable code */ +#pragma warn -ccc /* Condition is always true or false */ +#pragma warn -aus /* Assigned value is never used */ +#pragma warn -csu /* Comparing signed and unsigned */ +#pragma warn -spa /* Suspicious pointer arithmetic */ +#endif + +/* +** WAL mode depends on atomic aligned 32-bit loads and stores in a few +** places. The following macros try to make this explicit. +*/ +#ifndef __has_feature +# define __has_feature(x) 0 /* compatibility with non-clang compilers */ +#endif +#if GCC_VERSION>=4007000 || __has_feature(c_atomic) +# define AtomicLoad(PTR) __atomic_load_n((PTR),__ATOMIC_RELAXED) +# define AtomicStore(PTR,VAL) __atomic_store_n((PTR),(VAL),__ATOMIC_RELAXED) +#else +# define AtomicLoad(PTR) (*(PTR)) +# define AtomicStore(PTR,VAL) (*(PTR) = (VAL)) +#endif + +/* +** Include standard header files as necessary +*/ +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif + +/* +** The following macros are used to cast pointers to integers and +** integers to pointers. The way you do this varies from one compiler +** to the next, so we have developed the following set of #if statements +** to generate appropriate macros for a wide range of compilers. +** +** The correct "ANSI" way to do this is to use the intptr_t type. +** Unfortunately, that typedef is not available on all compilers, or +** if it is available, it requires an #include of specific headers +** that vary from one machine to the next. +** +** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on +** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)). +** So we have to define the macros in different ways depending on the +** compiler. +*/ +#if defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ +# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) +#elif defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ +# define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X)) +#elif !defined(__GNUC__) /* Works for compilers other than LLVM */ +# define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) +# define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) +#else /* Generates a warning - but it always works */ +# define SQLITE_INT_TO_PTR(X) ((void*)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(X)) +#endif + +/* +** A macro to hint to the compiler that a function should not be +** inlined. +*/ +#if defined(__GNUC__) +# define SQLITE_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) && _MSC_VER>=1310 +# define SQLITE_NOINLINE __declspec(noinline) +#else +# define SQLITE_NOINLINE +#endif + +/* +** Make sure that the compiler intrinsics we desire are enabled when +** compiling with an appropriate version of MSVC unless prevented by +** the SQLITE_DISABLE_INTRINSIC define. +*/ +#if !defined(SQLITE_DISABLE_INTRINSIC) +# if defined(_MSC_VER) && _MSC_VER>=1400 +# if !defined(_WIN32_WCE) +# include +# pragma intrinsic(_byteswap_ushort) +# pragma intrinsic(_byteswap_ulong) +# pragma intrinsic(_byteswap_uint64) +# pragma intrinsic(_ReadWriteBarrier) +# else +# include +# endif +# endif +#endif + +/* +** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2. +** 0 means mutexes are permanently disable and the library is never +** threadsafe. 1 means the library is serialized which is the highest +** level of threadsafety. 2 means the library is multithreaded - multiple +** threads can use SQLite as long as no two threads try to use the same +** database connection at the same time. +** +** Older versions of SQLite used an optional THREADSAFE macro. +** We support that for legacy. +** +** To ensure that the correct value of "THREADSAFE" is reported when querying +** for compile-time options at runtime (e.g. "PRAGMA compile_options"), this +** logic is partially replicated in ctime.c. If it is updated here, it should +** also be updated there. +*/ +#if !defined(SQLITE_THREADSAFE) +# if defined(THREADSAFE) +# define SQLITE_THREADSAFE THREADSAFE +# else +# define SQLITE_THREADSAFE 1 /* IMP: R-07272-22309 */ +# endif +#endif + +/* +** Powersafe overwrite is on by default. But can be turned off using +** the -DSQLITE_POWERSAFE_OVERWRITE=0 command-line option. +*/ +#ifndef SQLITE_POWERSAFE_OVERWRITE +# define SQLITE_POWERSAFE_OVERWRITE 1 +#endif + +/* +** EVIDENCE-OF: R-25715-37072 Memory allocation statistics are enabled by +** default unless SQLite is compiled with SQLITE_DEFAULT_MEMSTATUS=0 in +** which case memory allocation statistics are disabled by default. +*/ +#if !defined(SQLITE_DEFAULT_MEMSTATUS) +# define SQLITE_DEFAULT_MEMSTATUS 1 +#endif + +/* +** Exactly one of the following macros must be defined in order to +** specify which memory allocation subsystem to use. +** +** SQLITE_SYSTEM_MALLOC // Use normal system malloc() +** SQLITE_WIN32_MALLOC // Use Win32 native heap API +** SQLITE_ZERO_MALLOC // Use a stub allocator that always fails +** SQLITE_MEMDEBUG // Debugging version of system malloc() +** +** On Windows, if the SQLITE_WIN32_MALLOC_VALIDATE macro is defined and the +** assert() macro is enabled, each call into the Win32 native heap subsystem +** will cause HeapValidate to be called. If heap validation should fail, an +** assertion will be triggered. +** +** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as +** the default. +*/ +#if defined(SQLITE_SYSTEM_MALLOC) \ + + defined(SQLITE_WIN32_MALLOC) \ + + defined(SQLITE_ZERO_MALLOC) \ + + defined(SQLITE_MEMDEBUG)>1 +# error "Two or more of the following compile-time configuration options\ + are defined but at most one is allowed:\ + SQLITE_SYSTEM_MALLOC, SQLITE_WIN32_MALLOC, SQLITE_MEMDEBUG,\ + SQLITE_ZERO_MALLOC" +#endif +#if defined(SQLITE_SYSTEM_MALLOC) \ + + defined(SQLITE_WIN32_MALLOC) \ + + defined(SQLITE_ZERO_MALLOC) \ + + defined(SQLITE_MEMDEBUG)==0 +# define SQLITE_SYSTEM_MALLOC 1 +#endif + +/* +** If SQLITE_MALLOC_SOFT_LIMIT is not zero, then try to keep the +** sizes of memory allocations below this value where possible. +*/ +#if !defined(SQLITE_MALLOC_SOFT_LIMIT) +# define SQLITE_MALLOC_SOFT_LIMIT 1024 +#endif + +/* +** We need to define _XOPEN_SOURCE as follows in order to enable +** recursive mutexes on most Unix systems and fchmod() on OpenBSD. +** But _XOPEN_SOURCE define causes problems for Mac OS X, so omit +** it. +*/ +#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__) +# define _XOPEN_SOURCE 600 +#endif + +/* +** NDEBUG and SQLITE_DEBUG are opposites. It should always be true that +** defined(NDEBUG)==!defined(SQLITE_DEBUG). If this is not currently true, +** make it true by defining or undefining NDEBUG. +** +** Setting NDEBUG makes the code smaller and faster by disabling the +** assert() statements in the code. So we want the default action +** to be for NDEBUG to be set and NDEBUG to be undefined only if SQLITE_DEBUG +** is set. Thus NDEBUG becomes an opt-in rather than an opt-out +** feature. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif +#if defined(NDEBUG) && defined(SQLITE_DEBUG) +# undef NDEBUG +#endif + +/* +** Enable SQLITE_ENABLE_EXPLAIN_COMMENTS if SQLITE_DEBUG is turned on. +*/ +#if !defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) && defined(SQLITE_DEBUG) +# define SQLITE_ENABLE_EXPLAIN_COMMENTS 1 +#endif + +/* +** The testcase() macro is used to aid in coverage testing. When +** doing coverage testing, the condition inside the argument to +** testcase() must be evaluated both true and false in order to +** get full branch coverage. The testcase() macro is inserted +** to help ensure adequate test coverage in places where simple +** condition/decision coverage is inadequate. For example, testcase() +** can be used to make sure boundary values are tested. For +** bitmask tests, testcase() can be used to make sure each bit +** is significant and used at least once. On switch statements +** where multiple cases go to the same block of code, testcase() +** can insure that all cases are evaluated. +** +*/ +#ifdef SQLITE_COVERAGE_TEST +SQLITE_PRIVATE void sqlite3Coverage(int); +# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); } +#else +# define testcase(X) +#endif + +/* +** The TESTONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within testcase() and assert() macros. +*/ +#if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST) +# define TESTONLY(X) X +#else +# define TESTONLY(X) +#endif + +/* +** Sometimes we need a small amount of code such as a variable initialization +** to setup for a later assert() statement. We do not want this code to +** appear when assert() is disabled. The following macro is therefore +** used to contain that setup code. The "VVA" acronym stands for +** "Verification, Validation, and Accreditation". In other words, the +** code within VVA_ONLY() will only run during verification processes. +*/ +#ifndef NDEBUG +# define VVA_ONLY(X) X +#else +# define VVA_ONLY(X) +#endif + +/* +** The ALWAYS and NEVER macros surround boolean expressions which +** are intended to always be true or false, respectively. Such +** expressions could be omitted from the code completely. But they +** are included in a few cases in order to enhance the resilience +** of SQLite to unexpected behavior - to make the code "self-healing" +** or "ductile" rather than being "brittle" and crashing at the first +** hint of unplanned behavior. +** +** In other words, ALWAYS and NEVER are added for defensive code. +** +** When doing coverage testing ALWAYS and NEVER are hard-coded to +** be true and false so that the unreachable code they specify will +** not be counted as untested code. +*/ +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +#else +# define ALWAYS(X) (X) +# define NEVER(X) (X) +#endif + +/* +** The harmless(X) macro indicates that expression X is usually false +** but can be true without causing any problems, but we don't know of +** any way to cause X to be true. +** +** In debugging and testing builds, this macro will abort if X is ever +** true. In this way, developers are alerted to a possible test case +** that causes X to be true. If a harmless macro ever fails, that is +** an opportunity to change the macro into a testcase() and add a new +** test case to the test suite. +** +** For normal production builds, harmless(X) is a no-op, since it does +** not matter whether expression X is true or false. +*/ +#ifdef SQLITE_DEBUG +# define harmless(X) assert(!(X)); +#else +# define harmless(X) +#endif + +/* +** Some conditionals are optimizations only. In other words, if the +** conditionals are replaced with a constant 1 (true) or 0 (false) then +** the correct answer is still obtained, though perhaps not as quickly. +** +** The following macros mark these optimizations conditionals. +*/ +#if defined(SQLITE_MUTATION_TEST) +# define OK_IF_ALWAYS_TRUE(X) (1) +# define OK_IF_ALWAYS_FALSE(X) (0) +#else +# define OK_IF_ALWAYS_TRUE(X) (X) +# define OK_IF_ALWAYS_FALSE(X) (X) +#endif + +/* +** Some malloc failures are only possible if SQLITE_TEST_REALLOC_STRESS is +** defined. We need to defend against those failures when testing with +** SQLITE_TEST_REALLOC_STRESS, but we don't want the unreachable branches +** during a normal build. The following macro can be used to disable tests +** that are always false except when SQLITE_TEST_REALLOC_STRESS is set. +*/ +#if defined(SQLITE_TEST_REALLOC_STRESS) +# define ONLY_IF_REALLOC_STRESS(X) (X) +#elif !defined(NDEBUG) +# define ONLY_IF_REALLOC_STRESS(X) ((X)?(assert(0),1):0) +#else +# define ONLY_IF_REALLOC_STRESS(X) (0) +#endif + +/* +** Declarations used for tracing the operating system interfaces. +*/ +#if defined(SQLITE_FORCE_OS_TRACE) || defined(SQLITE_TEST) || \ + (defined(SQLITE_DEBUG) && SQLITE_OS_WIN) + extern int sqlite3OSTrace; +# define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X +# define SQLITE_HAVE_OS_TRACE +#else +# define OSTRACE(X) +# undef SQLITE_HAVE_OS_TRACE +#endif + +/* +** Is the sqlite3ErrName() function needed in the build? Currently, +** it is needed by "mutex_w32.c" (when debugging), "os_win.c" (when +** OSTRACE is enabled), and by several "test*.c" files (which are +** compiled using SQLITE_TEST). +*/ +#if defined(SQLITE_HAVE_OS_TRACE) || defined(SQLITE_TEST) || \ + (defined(SQLITE_DEBUG) && SQLITE_OS_WIN) +# define SQLITE_NEED_ERR_NAME +#else +# undef SQLITE_NEED_ERR_NAME +#endif + +/* +** SQLITE_ENABLE_EXPLAIN_COMMENTS is incompatible with SQLITE_OMIT_EXPLAIN +*/ +#ifdef SQLITE_OMIT_EXPLAIN +# undef SQLITE_ENABLE_EXPLAIN_COMMENTS +#endif + +/* +** Return true (non-zero) if the input is an integer that is too large +** to fit in 32-bits. This macro is used inside of various testcase() +** macros to verify that we have tested SQLite for large-file support. +*/ +#define IS_BIG_INT(X) (((X)&~(i64)0xffffffff)!=0) + +/* +** The macro unlikely() is a hint that surrounds a boolean +** expression that is usually false. Macro likely() surrounds +** a boolean expression that is usually true. These hints could, +** in theory, be used by the compiler to generate better code, but +** currently they are just comments for human readers. +*/ +#define likely(X) (X) +#define unlikely(X) (X) + +/************** Include hash.h in the middle of sqliteInt.h ******************/ +/************** Begin file hash.h ********************************************/ +/* +** 2001 September 22 +** +** 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 is the header file for the generic hash-table implementation +** used in SQLite. +*/ +#ifndef SQLITE_HASH_H +#define SQLITE_HASH_H + +/* Forward declarations of structures. */ +typedef struct Hash Hash; +typedef struct HashElem HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, some of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +** +** All elements of the hash table are on a single doubly-linked list. +** Hash.first points to the head of this list. +** +** There are Hash.htsize buckets. Each bucket points to a spot in +** the global doubly-linked list. The contents of the bucket are the +** element pointed to plus the next _ht.count-1 elements in the list. +** +** Hash.htsize and Hash.ht may be zero. In that case lookup is done +** by a linear search of the global list. For small tables, the +** Hash.ht table is never allocated because if there are few elements +** in the table, it is faster to do a linear search than to manage +** the hash table. +*/ +struct Hash { + unsigned int htsize; /* Number of buckets in the hash table */ + unsigned int count; /* Number of entries in this table */ + HashElem *first; /* The first element of the array */ + struct _ht { /* the hash table */ + unsigned int count; /* Number of entries with this hash */ + HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct HashElem { + HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + const char *pKey; /* Key associated with this element */ +}; + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +SQLITE_PRIVATE void sqlite3HashInit(Hash*); +SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const char *pKey, void *pData); +SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const char *pKey); +SQLITE_PRIVATE void sqlite3HashClear(Hash*); + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** Hash h; +** HashElem *p; +** ... +** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){ +** SomeStructure *pData = sqliteHashData(p); +** // do something with pData +** } +*/ +#define sqliteHashFirst(H) ((H)->first) +#define sqliteHashNext(E) ((E)->next) +#define sqliteHashData(E) ((E)->data) +/* #define sqliteHashKey(E) ((E)->pKey) // NOT USED */ +/* #define sqliteHashKeysize(E) ((E)->nKey) // NOT USED */ + +/* +** Number of entries in a hash table +*/ +/* #define sqliteHashCount(H) ((H)->count) // NOT USED */ + +#endif /* SQLITE_HASH_H */ + +/************** End of hash.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include parse.h in the middle of sqliteInt.h *****************/ +/************** Begin file parse.h *******************************************/ +#define TK_SEMI 1 +#define TK_EXPLAIN 2 +#define TK_QUERY 3 +#define TK_PLAN 4 +#define TK_BEGIN 5 +#define TK_TRANSACTION 6 +#define TK_DEFERRED 7 +#define TK_IMMEDIATE 8 +#define TK_EXCLUSIVE 9 +#define TK_COMMIT 10 +#define TK_END 11 +#define TK_ROLLBACK 12 +#define TK_SAVEPOINT 13 +#define TK_RELEASE 14 +#define TK_TO 15 +#define TK_TABLE 16 +#define TK_CREATE 17 +#define TK_IF 18 +#define TK_NOT 19 +#define TK_EXISTS 20 +#define TK_TEMP 21 +#define TK_LP 22 +#define TK_RP 23 +#define TK_AS 24 +#define TK_WITHOUT 25 +#define TK_COMMA 26 +#define TK_ABORT 27 +#define TK_ACTION 28 +#define TK_AFTER 29 +#define TK_ANALYZE 30 +#define TK_ASC 31 +#define TK_ATTACH 32 +#define TK_BEFORE 33 +#define TK_BY 34 +#define TK_CASCADE 35 +#define TK_CAST 36 +#define TK_CONFLICT 37 +#define TK_DATABASE 38 +#define TK_DESC 39 +#define TK_DETACH 40 +#define TK_EACH 41 +#define TK_FAIL 42 +#define TK_OR 43 +#define TK_AND 44 +#define TK_IS 45 +#define TK_MATCH 46 +#define TK_LIKE_KW 47 +#define TK_BETWEEN 48 +#define TK_IN 49 +#define TK_ISNULL 50 +#define TK_NOTNULL 51 +#define TK_NE 52 +#define TK_EQ 53 +#define TK_GT 54 +#define TK_LE 55 +#define TK_LT 56 +#define TK_GE 57 +#define TK_ESCAPE 58 +#define TK_ID 59 +#define TK_COLUMNKW 60 +#define TK_DO 61 +#define TK_FOR 62 +#define TK_IGNORE 63 +#define TK_INITIALLY 64 +#define TK_INSTEAD 65 +#define TK_NO 66 +#define TK_KEY 67 +#define TK_OF 68 +#define TK_OFFSET 69 +#define TK_PRAGMA 70 +#define TK_RAISE 71 +#define TK_RECURSIVE 72 +#define TK_REPLACE 73 +#define TK_RESTRICT 74 +#define TK_ROW 75 +#define TK_ROWS 76 +#define TK_TRIGGER 77 +#define TK_VACUUM 78 +#define TK_VIEW 79 +#define TK_VIRTUAL 80 +#define TK_WITH 81 +#define TK_NULLS 82 +#define TK_FIRST 83 +#define TK_LAST 84 +#define TK_CURRENT 85 +#define TK_FOLLOWING 86 +#define TK_PARTITION 87 +#define TK_PRECEDING 88 +#define TK_RANGE 89 +#define TK_UNBOUNDED 90 +#define TK_EXCLUDE 91 +#define TK_GROUPS 92 +#define TK_OTHERS 93 +#define TK_TIES 94 +#define TK_GENERATED 95 +#define TK_ALWAYS 96 +#define TK_REINDEX 97 +#define TK_RENAME 98 +#define TK_CTIME_KW 99 +#define TK_ANY 100 +#define TK_BITAND 101 +#define TK_BITOR 102 +#define TK_LSHIFT 103 +#define TK_RSHIFT 104 +#define TK_PLUS 105 +#define TK_MINUS 106 +#define TK_STAR 107 +#define TK_SLASH 108 +#define TK_REM 109 +#define TK_CONCAT 110 +#define TK_COLLATE 111 +#define TK_BITNOT 112 +#define TK_ON 113 +#define TK_INDEXED 114 +#define TK_STRING 115 +#define TK_JOIN_KW 116 +#define TK_CONSTRAINT 117 +#define TK_DEFAULT 118 +#define TK_NULL 119 +#define TK_PRIMARY 120 +#define TK_UNIQUE 121 +#define TK_CHECK 122 +#define TK_REFERENCES 123 +#define TK_AUTOINCR 124 +#define TK_INSERT 125 +#define TK_DELETE 126 +#define TK_UPDATE 127 +#define TK_SET 128 +#define TK_DEFERRABLE 129 +#define TK_FOREIGN 130 +#define TK_DROP 131 +#define TK_UNION 132 +#define TK_ALL 133 +#define TK_EXCEPT 134 +#define TK_INTERSECT 135 +#define TK_SELECT 136 +#define TK_VALUES 137 +#define TK_DISTINCT 138 +#define TK_DOT 139 +#define TK_FROM 140 +#define TK_JOIN 141 +#define TK_USING 142 +#define TK_ORDER 143 +#define TK_GROUP 144 +#define TK_HAVING 145 +#define TK_LIMIT 146 +#define TK_WHERE 147 +#define TK_INTO 148 +#define TK_NOTHING 149 +#define TK_FLOAT 150 +#define TK_BLOB 151 +#define TK_INTEGER 152 +#define TK_VARIABLE 153 +#define TK_CASE 154 +#define TK_WHEN 155 +#define TK_THEN 156 +#define TK_ELSE 157 +#define TK_INDEX 158 +#define TK_ALTER 159 +#define TK_ADD 160 +#define TK_WINDOW 161 +#define TK_OVER 162 +#define TK_FILTER 163 +#define TK_COLUMN 164 +#define TK_AGG_FUNCTION 165 +#define TK_AGG_COLUMN 166 +#define TK_TRUEFALSE 167 +#define TK_ISNOT 168 +#define TK_FUNCTION 169 +#define TK_UMINUS 170 +#define TK_UPLUS 171 +#define TK_TRUTH 172 +#define TK_REGISTER 173 +#define TK_VECTOR 174 +#define TK_SELECT_COLUMN 175 +#define TK_IF_NULL_ROW 176 +#define TK_ASTERISK 177 +#define TK_SPAN 178 +#define TK_SPACE 179 +#define TK_ILLEGAL 180 + +/************** End of parse.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +#include +#include +#include +#include +#include + +/* +** Use a macro to replace memcpy() if compiled with SQLITE_INLINE_MEMCPY. +** This allows better measurements of where memcpy() is used when running +** cachegrind. But this macro version of memcpy() is very slow so it +** should not be used in production. This is a performance measurement +** hack only. +*/ +#ifdef SQLITE_INLINE_MEMCPY +# define memcpy(D,S,N) {char*xxd=(char*)(D);const char*xxs=(const char*)(S);\ + int xxn=(N);while(xxn-->0)*(xxd++)=*(xxs++);} +#endif + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite_int64 +# define float sqlite_int64 +# define LONGDOUBLE_TYPE sqlite_int64 +# ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50) +# endif +# define SQLITE_OMIT_DATETIME_FUNCS 1 +# define SQLITE_OMIT_TRACE 1 +# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +# undef SQLITE_HAVE_ISNAN +#endif +#ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (1e99) +#endif + +/* +** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 +** afterward. Having this macro allows us to cause the C compiler +** to omit code used by TEMP tables without messy #ifndef statements. +*/ +#ifdef SQLITE_OMIT_TEMPDB +#define OMIT_TEMPDB 1 +#else +#define OMIT_TEMPDB 0 +#endif + +/* +** The "file format" number is an integer that is incremented whenever +** the VDBE-level file format changes. The following macros define the +** the default file format for new databases and the maximum file format +** that the library can read. +*/ +#define SQLITE_MAX_FILE_FORMAT 4 +#ifndef SQLITE_DEFAULT_FILE_FORMAT +# define SQLITE_DEFAULT_FILE_FORMAT 4 +#endif + +/* +** Determine whether triggers are recursive by default. This can be +** changed at run-time using a pragma. +*/ +#ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS +# define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0 +#endif + +/* +** Provide a default value for SQLITE_TEMP_STORE in case it is not specified +** on the command-line +*/ +#ifndef SQLITE_TEMP_STORE +# define SQLITE_TEMP_STORE 1 +#endif + +/* +** If no value has been provided for SQLITE_MAX_WORKER_THREADS, or if +** SQLITE_TEMP_STORE is set to 3 (never use temporary files), set it +** to zero. +*/ +#if SQLITE_TEMP_STORE==3 || SQLITE_THREADSAFE==0 +# undef SQLITE_MAX_WORKER_THREADS +# define SQLITE_MAX_WORKER_THREADS 0 +#endif +#ifndef SQLITE_MAX_WORKER_THREADS +# define SQLITE_MAX_WORKER_THREADS 8 +#endif +#ifndef SQLITE_DEFAULT_WORKER_THREADS +# define SQLITE_DEFAULT_WORKER_THREADS 0 +#endif +#if SQLITE_DEFAULT_WORKER_THREADS>SQLITE_MAX_WORKER_THREADS +# undef SQLITE_MAX_WORKER_THREADS +# define SQLITE_MAX_WORKER_THREADS SQLITE_DEFAULT_WORKER_THREADS +#endif + +/* +** The default initial allocation for the pagecache when using separate +** pagecaches for each database connection. A positive number is the +** number of pages. A negative number N translations means that a buffer +** of -1024*N bytes is allocated and used for as many pages as it will hold. +** +** The default value of "20" was choosen to minimize the run-time of the +** speedtest1 test program with options: --shrink-memory --reprepare +*/ +#ifndef SQLITE_DEFAULT_PCACHE_INITSZ +# define SQLITE_DEFAULT_PCACHE_INITSZ 20 +#endif + +/* +** Default value for the SQLITE_CONFIG_SORTERREF_SIZE option. +*/ +#ifndef SQLITE_DEFAULT_SORTERREF_SIZE +# define SQLITE_DEFAULT_SORTERREF_SIZE 0x7fffffff +#endif + +/* +** The compile-time options SQLITE_MMAP_READWRITE and +** SQLITE_ENABLE_BATCH_ATOMIC_WRITE are not compatible with one another. +** You must choose one or the other (or neither) but not both. +*/ +#if defined(SQLITE_MMAP_READWRITE) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) +#error Cannot use both SQLITE_MMAP_READWRITE and SQLITE_ENABLE_BATCH_ATOMIC_WRITE +#endif + +/* +** GCC does not define the offsetof() macro so we'll have to do it +** ourselves. +*/ +#ifndef offsetof +#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) +#endif + +/* +** Macros to compute minimum and maximum of two numbers. +*/ +#ifndef MIN +# define MIN(A,B) ((A)<(B)?(A):(B)) +#endif +#ifndef MAX +# define MAX(A,B) ((A)>(B)?(A):(B)) +#endif + +/* +** Swap two objects of type TYPE. +*/ +#define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;} + +/* +** Check to see if this machine uses EBCDIC. (Yes, believe it or +** not, there are still machines out there that use EBCDIC.) +*/ +#if 'A' == '\301' +# define SQLITE_EBCDIC 1 +#else +# define SQLITE_ASCII 1 +#endif + +/* +** Integers of known sizes. These typedefs might change for architectures +** where the sizes very. Preprocessor macros are available so that the +** types can be conveniently redefined at compile-type. Like this: +** +** cc '-DUINTPTR_TYPE=long long int' ... +*/ +#ifndef UINT32_TYPE +# ifdef HAVE_UINT32_T +# define UINT32_TYPE uint32_t +# else +# define UINT32_TYPE unsigned int +# endif +#endif +#ifndef UINT16_TYPE +# ifdef HAVE_UINT16_T +# define UINT16_TYPE uint16_t +# else +# define UINT16_TYPE unsigned short int +# endif +#endif +#ifndef INT16_TYPE +# ifdef HAVE_INT16_T +# define INT16_TYPE int16_t +# else +# define INT16_TYPE short int +# endif +#endif +#ifndef UINT8_TYPE +# ifdef HAVE_UINT8_T +# define UINT8_TYPE uint8_t +# else +# define UINT8_TYPE unsigned char +# endif +#endif +#ifndef INT8_TYPE +# ifdef HAVE_INT8_T +# define INT8_TYPE int8_t +# else +# define INT8_TYPE signed char +# endif +#endif +#ifndef LONGDOUBLE_TYPE +# define LONGDOUBLE_TYPE long double +#endif +typedef sqlite_int64 i64; /* 8-byte signed integer */ +typedef sqlite_uint64 u64; /* 8-byte unsigned integer */ +typedef UINT32_TYPE u32; /* 4-byte unsigned integer */ +typedef UINT16_TYPE u16; /* 2-byte unsigned integer */ +typedef INT16_TYPE i16; /* 2-byte signed integer */ +typedef UINT8_TYPE u8; /* 1-byte unsigned integer */ +typedef INT8_TYPE i8; /* 1-byte signed integer */ + +/* +** SQLITE_MAX_U32 is a u64 constant that is the maximum u64 value +** that can be stored in a u32 without loss of data. The value +** is 0x00000000ffffffff. But because of quirks of some compilers, we +** have to specify the value in the less intuitive manner shown: +*/ +#define SQLITE_MAX_U32 ((((u64)1)<<32)-1) + +/* +** The datatype used to store estimates of the number of rows in a +** table or index. This is an unsigned integer type. For 99.9% of +** the world, a 32-bit integer is sufficient. But a 64-bit integer +** can be used at compile-time if desired. +*/ +#ifdef SQLITE_64BIT_STATS + typedef u64 tRowcnt; /* 64-bit only if requested at compile-time */ +#else + typedef u32 tRowcnt; /* 32-bit is the default */ +#endif + +/* +** Estimated quantities used for query planning are stored as 16-bit +** logarithms. For quantity X, the value stored is 10*log2(X). This +** gives a possible range of values of approximately 1.0e986 to 1e-986. +** But the allowed values are "grainy". Not every value is representable. +** For example, quantities 16 and 17 are both represented by a LogEst +** of 40. However, since LogEst quantities are suppose to be estimates, +** not exact values, this imprecision is not a problem. +** +** "LogEst" is short for "Logarithmic Estimate". +** +** Examples: +** 1 -> 0 20 -> 43 10000 -> 132 +** 2 -> 10 25 -> 46 25000 -> 146 +** 3 -> 16 100 -> 66 1000000 -> 199 +** 4 -> 20 1000 -> 99 1048576 -> 200 +** 10 -> 33 1024 -> 100 4294967296 -> 320 +** +** The LogEst can be negative to indicate fractional values. +** Examples: +** +** 0.5 -> -10 0.1 -> -33 0.0625 -> -40 +*/ +typedef INT16_TYPE LogEst; + +/* +** Set the SQLITE_PTRSIZE macro to the number of bytes in a pointer +*/ +#ifndef SQLITE_PTRSIZE +# if defined(__SIZEOF_POINTER__) +# define SQLITE_PTRSIZE __SIZEOF_POINTER__ +# elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(_M_ARM) || defined(__arm__) || defined(__x86) || \ + (defined(__TOS_AIX__) && !defined(__64BIT__)) +# define SQLITE_PTRSIZE 4 +# else +# define SQLITE_PTRSIZE 8 +# endif +#endif + +/* The uptr type is an unsigned integer large enough to hold a pointer +*/ +#if defined(HAVE_STDINT_H) + typedef uintptr_t uptr; +#elif SQLITE_PTRSIZE==4 + typedef u32 uptr; +#else + typedef u64 uptr; +#endif + +/* +** The SQLITE_WITHIN(P,S,E) macro checks to see if pointer P points to +** something between S (inclusive) and E (exclusive). +** +** In other words, S is a buffer and E is a pointer to the first byte after +** the end of buffer S. This macro returns true if P points to something +** contained within the buffer S. +*/ +#define SQLITE_WITHIN(P,S,E) (((uptr)(P)>=(uptr)(S))&&((uptr)(P)<(uptr)(E))) + + +/* +** Macros to determine whether the machine is big or little endian, +** and whether or not that determination is run-time or compile-time. +** +** For best performance, an attempt is made to guess at the byte-order +** using C-preprocessor macros. If that is unsuccessful, or if +** -DSQLITE_BYTEORDER=0 is set, then byte-order is determined +** at run-time. +*/ +#ifndef SQLITE_BYTEORDER +# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) +# define SQLITE_BYTEORDER 1234 +# elif defined(sparc) || defined(__ppc__) || \ + defined(__ARMEB__) || defined(__AARCH64EB__) +# define SQLITE_BYTEORDER 4321 +# else +# define SQLITE_BYTEORDER 0 +# endif +#endif +#if SQLITE_BYTEORDER==4321 +# define SQLITE_BIGENDIAN 1 +# define SQLITE_LITTLEENDIAN 0 +# define SQLITE_UTF16NATIVE SQLITE_UTF16BE +#elif SQLITE_BYTEORDER==1234 +# define SQLITE_BIGENDIAN 0 +# define SQLITE_LITTLEENDIAN 1 +# define SQLITE_UTF16NATIVE SQLITE_UTF16LE +#else +# ifdef SQLITE_AMALGAMATION + const int sqlite3one = 1; +# else + extern const int sqlite3one; +# endif +# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) +# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) +# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) +#endif + +/* +** Constants for the largest and smallest possible 64-bit signed integers. +** These macros are designed to work correctly on both 32-bit and 64-bit +** compilers. +*/ +#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) +#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) + +/* +** Round up a number to the next larger multiple of 8. This is used +** to force 8-byte alignment on 64-bit architectures. +*/ +#define ROUND8(x) (((x)+7)&~7) + +/* +** Round down to the nearest multiple of 8 +*/ +#define ROUNDDOWN8(x) ((x)&~7) + +/* +** Assert that the pointer X is aligned to an 8-byte boundary. This +** macro is used only within assert() to verify that the code gets +** all alignment restrictions correct. +** +** Except, if SQLITE_4_BYTE_ALIGNED_MALLOC is defined, then the +** underlying malloc() implementation might return us 4-byte aligned +** pointers. In that case, only verify 4-byte alignment. +*/ +#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC +# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&3)==0) +#else +# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) +#endif + +/* +** Disable MMAP on platforms where it is known to not work +*/ +#if defined(__OpenBSD__) || defined(__QNXNTO__) +# undef SQLITE_MAX_MMAP_SIZE +# define SQLITE_MAX_MMAP_SIZE 0 +#endif + +/* +** Default maximum size of memory used by memory-mapped I/O in the VFS +*/ +#ifdef __APPLE__ +# include +#endif +#ifndef SQLITE_MAX_MMAP_SIZE +# if defined(__linux__) \ + || defined(_WIN32) \ + || (defined(__APPLE__) && defined(__MACH__)) \ + || defined(__sun) \ + || defined(__FreeBSD__) \ + || defined(__DragonFly__) +# define SQLITE_MAX_MMAP_SIZE 0x7fff0000 /* 2147418112 */ +# else +# define SQLITE_MAX_MMAP_SIZE 0 +# endif +#endif + +/* +** The default MMAP_SIZE is zero on all platforms. Or, even if a larger +** default MMAP_SIZE is specified at compile-time, make sure that it does +** not exceed the maximum mmap size. +*/ +#ifndef SQLITE_DEFAULT_MMAP_SIZE +# define SQLITE_DEFAULT_MMAP_SIZE 0 +#endif +#if SQLITE_DEFAULT_MMAP_SIZE>SQLITE_MAX_MMAP_SIZE +# undef SQLITE_DEFAULT_MMAP_SIZE +# define SQLITE_DEFAULT_MMAP_SIZE SQLITE_MAX_MMAP_SIZE +#endif + +/* +** SELECTTRACE_ENABLED will be either 1 or 0 depending on whether or not +** the Select query generator tracing logic is turned on. +*/ +#if defined(SQLITE_ENABLE_SELECTTRACE) +# define SELECTTRACE_ENABLED 1 +#else +# define SELECTTRACE_ENABLED 0 +#endif + +/* +** An instance of the following structure is used to store the busy-handler +** callback for a given sqlite handle. +** +** The sqlite.busyHandler member of the sqlite struct contains the busy +** callback for the database handle. Each pager opened via the sqlite +** handle is passed a pointer to sqlite.busyHandler. The busy-handler +** callback is currently invoked only from within pager.c. +*/ +typedef struct BusyHandler BusyHandler; +struct BusyHandler { + int (*xBusyHandler)(void *,int); /* The busy callback */ + void *pBusyArg; /* First arg to busy callback */ + int nBusy; /* Incremented with each busy call */ +}; + +/* +** Name of the master database table. The master database table +** is a special table that holds the names and attributes of all +** user tables and indices. +*/ +#define MASTER_NAME "sqlite_master" +#define TEMP_MASTER_NAME "sqlite_temp_master" + +/* +** The root-page of the master database table. +*/ +#define MASTER_ROOT 1 + +/* +** The name of the schema table. +*/ +#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) + +/* +** A convenience macro that returns the number of elements in +** an array. +*/ +#define ArraySize(X) ((int)(sizeof(X)/sizeof(X[0]))) + +/* +** Determine if the argument is a power of two +*/ +#define IsPowerOfTwo(X) (((X)&((X)-1))==0) + +/* +** The following value as a destructor means to use sqlite3DbFree(). +** The sqlite3DbFree() routine requires two parameters instead of the +** one parameter that destructors normally want. So we have to introduce +** this magic value that the code knows to handle differently. Any +** pointer will work here as long as it is distinct from SQLITE_STATIC +** and SQLITE_TRANSIENT. +*/ +#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3MallocSize) + +/* +** When SQLITE_OMIT_WSD is defined, it means that the target platform does +** not support Writable Static Data (WSD) such as global and static variables. +** All variables must either be on the stack or dynamically allocated from +** the heap. When WSD is unsupported, the variable declarations scattered +** throughout the SQLite code must become constants instead. The SQLITE_WSD +** macro is used for this purpose. And instead of referencing the variable +** directly, we use its constant as a key to lookup the run-time allocated +** buffer that holds real variable. The constant is also the initializer +** for the run-time allocated buffer. +** +** In the usual case where WSD is supported, the SQLITE_WSD and GLOBAL +** macros become no-ops and have zero performance impact. +*/ +#ifdef SQLITE_OMIT_WSD + #define SQLITE_WSD const + #define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v))) + #define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config) +SQLITE_API int sqlite3_wsd_init(int N, int J); +SQLITE_API void *sqlite3_wsd_find(void *K, int L); +#else + #define SQLITE_WSD + #define GLOBAL(t,v) v + #define sqlite3GlobalConfig sqlite3Config +#endif + +/* +** The following macros are used to suppress compiler warnings and to +** make it clear to human readers when a function parameter is deliberately +** left unused within the body of a function. This usually happens when +** a function is called via a function pointer. For example the +** implementation of an SQL aggregate step callback may not use the +** parameter indicating the number of arguments passed to the aggregate, +** if it knows that this is enforced elsewhere. +** +** When a function parameter is not used at all within the body of a function, +** it is generally named "NotUsed" or "NotUsed2" to make things even clearer. +** However, these macros may also be used to suppress warnings related to +** parameters that may or may not be used depending on compilation options. +** For example those parameters only used in assert() statements. In these +** cases the parameters are named as per the usual conventions. +*/ +#define UNUSED_PARAMETER(x) (void)(x) +#define UNUSED_PARAMETER2(x,y) UNUSED_PARAMETER(x),UNUSED_PARAMETER(y) + +/* +** Forward references to structures +*/ +typedef struct AggInfo AggInfo; +typedef struct AuthContext AuthContext; +typedef struct AutoincInfo AutoincInfo; +typedef struct Bitvec Bitvec; +typedef struct CollSeq CollSeq; +typedef struct Column Column; +typedef struct Db Db; +typedef struct Schema Schema; +typedef struct Expr Expr; +typedef struct ExprList ExprList; +typedef struct FKey FKey; +typedef struct FuncDestructor FuncDestructor; +typedef struct FuncDef FuncDef; +typedef struct FuncDefHash FuncDefHash; +typedef struct IdList IdList; +typedef struct Index Index; +typedef struct IndexSample IndexSample; +typedef struct KeyClass KeyClass; +typedef struct KeyInfo KeyInfo; +typedef struct Lookaside Lookaside; +typedef struct LookasideSlot LookasideSlot; +typedef struct Module Module; +typedef struct NameContext NameContext; +typedef struct Parse Parse; +typedef struct PreUpdate PreUpdate; +typedef struct PrintfArguments PrintfArguments; +typedef struct RenameToken RenameToken; +typedef struct RowSet RowSet; +typedef struct Savepoint Savepoint; +typedef struct Select Select; +typedef struct SQLiteThread SQLiteThread; +typedef struct SelectDest SelectDest; +typedef struct SrcList SrcList; +typedef struct sqlite3_str StrAccum; /* Internal alias for sqlite3_str */ +typedef struct Table Table; +typedef struct TableLock TableLock; +typedef struct Token Token; +typedef struct TreeView TreeView; +typedef struct Trigger Trigger; +typedef struct TriggerPrg TriggerPrg; +typedef struct TriggerStep TriggerStep; +typedef struct UnpackedRecord UnpackedRecord; +typedef struct Upsert Upsert; +typedef struct VTable VTable; +typedef struct VtabCtx VtabCtx; +typedef struct Walker Walker; +typedef struct WhereInfo WhereInfo; +typedef struct Window Window; +typedef struct With With; + + +/* +** The bitmask datatype defined below is used for various optimizations. +** +** Changing this from a 64-bit to a 32-bit type limits the number of +** tables in a join to 32 instead of 64. But it also reduces the size +** of the library by 738 bytes on ix86. +*/ +#ifdef SQLITE_BITMASK_TYPE + typedef SQLITE_BITMASK_TYPE Bitmask; +#else + typedef u64 Bitmask; +#endif + +/* +** The number of bits in a Bitmask. "BMS" means "BitMask Size". +*/ +#define BMS ((int)(sizeof(Bitmask)*8)) + +/* +** A bit in a Bitmask +*/ +#define MASKBIT(n) (((Bitmask)1)<<(n)) +#define MASKBIT64(n) (((u64)1)<<(n)) +#define MASKBIT32(n) (((unsigned int)1)<<(n)) +#define ALLBITS ((Bitmask)-1) + +/* A VList object records a mapping between parameters/variables/wildcards +** in the SQL statement (such as $abc, @pqr, or :xyz) and the integer +** variable number associated with that parameter. See the format description +** on the sqlite3VListAdd() routine for more information. A VList is really +** just an array of integers. +*/ +typedef int VList; + +/* +** Defer sourcing vdbe.h and btree.h until after the "u8" and +** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque +** pointer types (i.e. FuncDef) defined above. +*/ +/************** Include btree.h in the middle of sqliteInt.h *****************/ +/************** Begin file btree.h *******************************************/ +/* +** 2001 September 15 +** +** 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 header file defines the interface that the sqlite B-Tree file +** subsystem. See comments in the source code for a detailed description +** of what each interface routine does. +*/ +#ifndef SQLITE_BTREE_H +#define SQLITE_BTREE_H + +/* TODO: This definition is just included so other modules compile. It +** needs to be revisited. +*/ +#define SQLITE_N_BTREE_META 16 + +/* +** If defined as non-zero, auto-vacuum is enabled by default. Otherwise +** it must be turned on for each database using "PRAGMA auto_vacuum = 1". +*/ +#ifndef SQLITE_DEFAULT_AUTOVACUUM + #define SQLITE_DEFAULT_AUTOVACUUM 0 +#endif + +#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */ +#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */ +#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */ + +/* +** Forward declarations of structure +*/ +typedef struct Btree Btree; +typedef struct BtCursor BtCursor; +typedef struct BtShared BtShared; +typedef struct BtreePayload BtreePayload; + + +SQLITE_PRIVATE int sqlite3BtreeOpen( + sqlite3_vfs *pVfs, /* VFS to use with this b-tree */ + const char *zFilename, /* Name of database file to open */ + sqlite3 *db, /* Associated database connection */ + Btree **ppBtree, /* Return open Btree* here */ + int flags, /* Flags */ + int vfsFlags /* Flags passed through to VFS open */ +); + +/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the +** following values. +** +** NOTE: These values must match the corresponding PAGER_ values in +** pager.h. +*/ +#define BTREE_OMIT_JOURNAL 1 /* Do not create or use a rollback journal */ +#define BTREE_MEMORY 2 /* This is an in-memory DB */ +#define BTREE_SINGLE 4 /* The file contains at most 1 b-tree */ +#define BTREE_UNORDERED 8 /* Use of a hash implementation is OK */ + +SQLITE_PRIVATE int sqlite3BtreeClose(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeSetSpillSize(Btree*,int); +#if SQLITE_MAX_MMAP_SIZE>0 +SQLITE_PRIVATE int sqlite3BtreeSetMmapLimit(Btree*,sqlite3_int64); +#endif +SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags(Btree*,unsigned); +SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); +SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); +SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); +SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeGetRequestedReserve(Btree*); +SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p); +SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); +SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); +SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int,int*); +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*, int); +SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*); +SQLITE_PRIVATE int sqlite3BtreeRollback(Btree*,int,int); +SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree*, int*, int flags); +SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree*); +SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree*); +SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*); +SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); +SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree); +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock); +#endif +SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int); + +SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *); +SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *); +SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *, Btree *); + +SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *); + +/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR +** of the flags shown below. +** +** Every SQLite table must have either BTREE_INTKEY or BTREE_BLOBKEY set. +** With BTREE_INTKEY, the table key is a 64-bit integer and arbitrary data +** is stored in the leaves. (BTREE_INTKEY is used for SQL tables.) With +** BTREE_BLOBKEY, the key is an arbitrary BLOB and no content is stored +** anywhere - the key is the content. (BTREE_BLOBKEY is used for SQL +** indices.) +*/ +#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */ +#define BTREE_BLOBKEY 2 /* Table has keys only - no data */ + +SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*); +SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, int*); +SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree*, int, int); + +SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *pBtree, int idx, u32 *pValue); +SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value); + +SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); + +/* +** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta +** should be one of the following values. The integer values are assigned +** to constants so that the offset of the corresponding field in an +** SQLite database header may be found using the following formula: +** +** offset = 36 + (idx * 4) +** +** For example, the free-page-count field is located at byte offset 36 of +** the database file header. The incr-vacuum-flag field is located at +** byte offset 64 (== 36+4*7). +** +** The BTREE_DATA_VERSION value is not really a value stored in the header. +** It is a read-only number computed by the pager. But we merge it with +** the header value access routines since its access pattern is the same. +** Call it a "virtual meta value". +*/ +#define BTREE_FREE_PAGE_COUNT 0 +#define BTREE_SCHEMA_VERSION 1 +#define BTREE_FILE_FORMAT 2 +#define BTREE_DEFAULT_CACHE_SIZE 3 +#define BTREE_LARGEST_ROOT_PAGE 4 +#define BTREE_TEXT_ENCODING 5 +#define BTREE_USER_VERSION 6 +#define BTREE_INCR_VACUUM 7 +#define BTREE_APPLICATION_ID 8 +#define BTREE_DATA_VERSION 15 /* A virtual meta-value */ + +/* +** Kinds of hints that can be passed into the sqlite3BtreeCursorHint() +** interface. +** +** BTREE_HINT_RANGE (arguments: Expr*, Mem*) +** +** The first argument is an Expr* (which is guaranteed to be constant for +** the lifetime of the cursor) that defines constraints on which rows +** might be fetched with this cursor. The Expr* tree may contain +** TK_REGISTER nodes that refer to values stored in the array of registers +** passed as the second parameter. In other words, if Expr.op==TK_REGISTER +** then the value of the node is the value in Mem[pExpr.iTable]. Any +** TK_COLUMN node in the expression tree refers to the Expr.iColumn-th +** column of the b-tree of the cursor. The Expr tree will not contain +** any function calls nor subqueries nor references to b-trees other than +** the cursor being hinted. +** +** The design of the _RANGE hint is aid b-tree implementations that try +** to prefetch content from remote machines - to provide those +** implementations with limits on what needs to be prefetched and thereby +** reduce network bandwidth. +** +** Note that BTREE_HINT_FLAGS with BTREE_BULKLOAD is the only hint used by +** standard SQLite. The other hints are provided for extentions that use +** the SQLite parser and code generator but substitute their own storage +** engine. +*/ +#define BTREE_HINT_RANGE 0 /* Range constraints on queries */ + +/* +** Values that may be OR'd together to form the argument to the +** BTREE_HINT_FLAGS hint for sqlite3BtreeCursorHint(): +** +** The BTREE_BULKLOAD flag is set on index cursors when the index is going +** to be filled with content that is already in sorted order. +** +** The BTREE_SEEK_EQ flag is set on cursors that will get OP_SeekGE or +** OP_SeekLE opcodes for a range search, but where the range of entries +** selected will all have the same key. In other words, the cursor will +** be used only for equality key searches. +** +*/ +#define BTREE_BULKLOAD 0x00000001 /* Used to full index in sorted order */ +#define BTREE_SEEK_EQ 0x00000002 /* EQ seeks only - no range seeks */ + +/* +** Flags passed as the third argument to sqlite3BtreeCursor(). +** +** For read-only cursors the wrFlag argument is always zero. For read-write +** cursors it may be set to either (BTREE_WRCSR|BTREE_FORDELETE) or just +** (BTREE_WRCSR). If the BTREE_FORDELETE bit is set, then the cursor will +** only be used by SQLite for the following: +** +** * to seek to and then delete specific entries, and/or +** +** * to read values that will be used to create keys that other +** BTREE_FORDELETE cursors will seek to and delete. +** +** The BTREE_FORDELETE flag is an optimization hint. It is not used by +** by this, the native b-tree engine of SQLite, but it is available to +** alternative storage engines that might be substituted in place of this +** b-tree system. For alternative storage engines in which a delete of +** the main table row automatically deletes corresponding index rows, +** the FORDELETE flag hint allows those alternative storage engines to +** skip a lot of work. Namely: FORDELETE cursors may treat all SEEK +** and DELETE operations as no-ops, and any READ operation against a +** FORDELETE cursor may return a null row: 0x01 0x00. +*/ +#define BTREE_WRCSR 0x00000004 /* read-write cursor */ +#define BTREE_FORDELETE 0x00000008 /* Cursor is for seek/delete only */ + +SQLITE_PRIVATE int sqlite3BtreeCursor( + Btree*, /* BTree containing table to open */ + int iTable, /* Index of root page */ + int wrFlag, /* 1 for writing. 0 for read-only */ + struct KeyInfo*, /* First argument to compare function */ + BtCursor *pCursor /* Space to write cursor structure */ +); +SQLITE_PRIVATE BtCursor *sqlite3BtreeFakeValidCursor(void); +SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); +SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor*, unsigned); +#ifdef SQLITE_ENABLE_CURSOR_HINTS +SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor*, int, ...); +#endif + +SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( + BtCursor*, + UnpackedRecord *pUnKey, + i64 intKey, + int bias, + int *pRes +); +SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor*, int*); +SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags); + +/* Allowed flags for sqlite3BtreeDelete() and sqlite3BtreeInsert() */ +#define BTREE_SAVEPOSITION 0x02 /* Leave cursor pointing at NEXT or PREV */ +#define BTREE_AUXDELETE 0x04 /* not the primary delete operation */ +#define BTREE_APPEND 0x08 /* Insert is likely an append */ + +/* An instance of the BtreePayload object describes the content of a single +** entry in either an index or table btree. +** +** Index btrees (used for indexes and also WITHOUT ROWID tables) contain +** an arbitrary key and no data. These btrees have pKey,nKey set to the +** key and the pData,nData,nZero fields are uninitialized. The aMem,nMem +** fields give an array of Mem objects that are a decomposition of the key. +** The nMem field might be zero, indicating that no decomposition is available. +** +** Table btrees (used for rowid tables) contain an integer rowid used as +** the key and passed in the nKey field. The pKey field is zero. +** pData,nData hold the content of the new entry. nZero extra zero bytes +** are appended to the end of the content when constructing the entry. +** The aMem,nMem fields are uninitialized for table btrees. +** +** Field usage summary: +** +** Table BTrees Index Btrees +** +** pKey always NULL encoded key +** nKey the ROWID length of pKey +** pData data not used +** aMem not used decomposed key value +** nMem not used entries in aMem +** nData length of pData not used +** nZero extra zeros after pData not used +** +** This object is used to pass information into sqlite3BtreeInsert(). The +** same information used to be passed as five separate parameters. But placing +** the information into this object helps to keep the interface more +** organized and understandable, and it also helps the resulting code to +** run a little faster by using fewer registers for parameter passing. +*/ +struct BtreePayload { + const void *pKey; /* Key content for indexes. NULL for tables */ + sqlite3_int64 nKey; /* Size of pKey for indexes. PRIMARY KEY for tabs */ + const void *pData; /* Data for tables. */ + sqlite3_value *aMem; /* First of nMem value in the unpacked pKey */ + u16 nMem; /* Number of aMem[] value. Might be zero */ + int nData; /* Size of pData. 0 if none. */ + int nZero; /* Extra zero data appended after pData,nData */ +}; + +SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const BtreePayload *pPayload, + int flags, int seekResult); +SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int flags); +SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int flags); +SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeCursorPin(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor*); +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC +SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor*); +#endif +SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); +SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*); +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor*); + +SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(sqlite3*,Btree*,int*aRoot,int nRoot,int,int*); +SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); +SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor*); + +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE int sqlite3BtreePayloadChecked(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *); +#endif +SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *); +SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); +SQLITE_PRIVATE int sqlite3BtreeCursorHasHint(BtCursor*, unsigned int mask); +SQLITE_PRIVATE int sqlite3BtreeIsReadonly(Btree *pBt); +SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void); + +#ifndef NDEBUG +SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); +#endif +SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor*); + +SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3*, BtCursor*, i64*); + +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int); +SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*); +#endif + +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *); +#endif + +/* +** If we are not using shared cache, then there is no need to +** use mutexes to access the BtShared structures. So make the +** Enter and Leave procedures no-ops. +*/ +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); +SQLITE_PRIVATE int sqlite3BtreeSharable(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree*); +#else +# define sqlite3BtreeEnter(X) +# define sqlite3BtreeEnterAll(X) +# define sqlite3BtreeSharable(X) 0 +# define sqlite3BtreeEnterCursor(X) +# define sqlite3BtreeConnectionCount(X) 1 +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE +SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); +SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); +#ifndef NDEBUG + /* These routines are used inside assert() statements only. */ +SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*); +SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); +SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*); +#endif +#else + +# define sqlite3BtreeLeave(X) +# define sqlite3BtreeLeaveCursor(X) +# define sqlite3BtreeLeaveAll(X) + +# define sqlite3BtreeHoldsMutex(X) 1 +# define sqlite3BtreeHoldsAllMutexes(X) 1 +# define sqlite3SchemaMutexHeld(X,Y,Z) 1 +#endif + + +#endif /* SQLITE_BTREE_H */ + +/************** End of btree.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include vdbe.h in the middle of sqliteInt.h ******************/ +/************** Begin file vdbe.h ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Header file for the Virtual DataBase Engine (VDBE) +** +** This header defines the interface to the virtual database engine +** or VDBE. The VDBE implements an abstract machine that runs a +** simple program to access and modify the underlying database. +*/ +#ifndef SQLITE_VDBE_H +#define SQLITE_VDBE_H +/* #include */ + +/* +** A single VDBE is an opaque structure named "Vdbe". Only routines +** in the source file sqliteVdbe.c are allowed to see the insides +** of this structure. +*/ +typedef struct Vdbe Vdbe; + +/* +** The names of the following types declared in vdbeInt.h are required +** for the VdbeOp definition. +*/ +typedef struct sqlite3_value Mem; +typedef struct SubProgram SubProgram; + +/* +** A single instruction of the virtual machine has an opcode +** and as many as three operands. The instruction is recorded +** as an instance of the following structure: +*/ +struct VdbeOp { + u8 opcode; /* What operation to perform */ + signed char p4type; /* One of the P4_xxx constants for p4 */ + u16 p5; /* Fifth parameter is an unsigned 16-bit integer */ + int p1; /* First operand */ + int p2; /* Second parameter (often the jump destination) */ + int p3; /* The third parameter */ + union p4union { /* fourth parameter */ + int i; /* Integer value if p4type==P4_INT32 */ + void *p; /* Generic pointer */ + char *z; /* Pointer to data for string (char array) types */ + i64 *pI64; /* Used when p4type is P4_INT64 */ + double *pReal; /* Used when p4type is P4_REAL */ + FuncDef *pFunc; /* Used when p4type is P4_FUNCDEF */ + sqlite3_context *pCtx; /* Used when p4type is P4_FUNCCTX */ + CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */ + Mem *pMem; /* Used when p4type is P4_MEM */ + VTable *pVtab; /* Used when p4type is P4_VTAB */ + KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */ + int *ai; /* Used when p4type is P4_INTARRAY */ + SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */ + Table *pTab; /* Used when p4type is P4_TABLE */ +#ifdef SQLITE_ENABLE_CURSOR_HINTS + Expr *pExpr; /* Used when p4type is P4_EXPR */ +#endif + int (*xAdvance)(BtCursor *, int); + } p4; +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + char *zComment; /* Comment to improve readability */ +#endif +#ifdef VDBE_PROFILE + u32 cnt; /* Number of times this instruction was executed */ + u64 cycles; /* Total time spent executing this instruction */ +#endif +#ifdef SQLITE_VDBE_COVERAGE + u32 iSrcLine; /* Source-code line that generated this opcode + ** with flags in the upper 8 bits */ +#endif +}; +typedef struct VdbeOp VdbeOp; + + +/* +** A sub-routine used to implement a trigger program. +*/ +struct SubProgram { + VdbeOp *aOp; /* Array of opcodes for sub-program */ + int nOp; /* Elements in aOp[] */ + int nMem; /* Number of memory cells required */ + int nCsr; /* Number of cursors required */ + u8 *aOnce; /* Array of OP_Once flags */ + void *token; /* id that may be used to recursive triggers */ + SubProgram *pNext; /* Next sub-program already visited */ +}; + +/* +** A smaller version of VdbeOp used for the VdbeAddOpList() function because +** it takes up less space. +*/ +struct VdbeOpList { + u8 opcode; /* What operation to perform */ + signed char p1; /* First operand */ + signed char p2; /* Second parameter (often the jump destination) */ + signed char p3; /* Third parameter */ +}; +typedef struct VdbeOpList VdbeOpList; + +/* +** Allowed values of VdbeOp.p4type +*/ +#define P4_NOTUSED 0 /* The P4 parameter is not used */ +#define P4_TRANSIENT 0 /* P4 is a pointer to a transient string */ +#define P4_STATIC (-1) /* Pointer to a static string */ +#define P4_COLLSEQ (-2) /* P4 is a pointer to a CollSeq structure */ +#define P4_INT32 (-3) /* P4 is a 32-bit signed integer */ +#define P4_SUBPROGRAM (-4) /* P4 is a pointer to a SubProgram structure */ +#define P4_ADVANCE (-5) /* P4 is a pointer to BtreeNext() or BtreePrev() */ +#define P4_TABLE (-6) /* P4 is a pointer to a Table structure */ +/* Above do not own any resources. Must free those below */ +#define P4_FREE_IF_LE (-7) +#define P4_DYNAMIC (-7) /* Pointer to memory from sqliteMalloc() */ +#define P4_FUNCDEF (-8) /* P4 is a pointer to a FuncDef structure */ +#define P4_KEYINFO (-9) /* P4 is a pointer to a KeyInfo structure */ +#define P4_EXPR (-10) /* P4 is a pointer to an Expr tree */ +#define P4_MEM (-11) /* P4 is a pointer to a Mem* structure */ +#define P4_VTAB (-12) /* P4 is a pointer to an sqlite3_vtab structure */ +#define P4_REAL (-13) /* P4 is a 64-bit floating point value */ +#define P4_INT64 (-14) /* P4 is a 64-bit signed integer */ +#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ +#define P4_FUNCCTX (-16) /* P4 is a pointer to an sqlite3_context object */ +#define P4_DYNBLOB (-17) /* Pointer to memory from sqliteMalloc() */ + +/* Error message codes for OP_Halt */ +#define P5_ConstraintNotNull 1 +#define P5_ConstraintUnique 2 +#define P5_ConstraintCheck 3 +#define P5_ConstraintFK 4 + +/* +** The Vdbe.aColName array contains 5n Mem structures, where n is the +** number of columns of data returned by the statement. +*/ +#define COLNAME_NAME 0 +#define COLNAME_DECLTYPE 1 +#define COLNAME_DATABASE 2 +#define COLNAME_TABLE 3 +#define COLNAME_COLUMN 4 +#ifdef SQLITE_ENABLE_COLUMN_METADATA +# define COLNAME_N 5 /* Number of COLNAME_xxx symbols */ +#else +# ifdef SQLITE_OMIT_DECLTYPE +# define COLNAME_N 1 /* Store only the name */ +# else +# define COLNAME_N 2 /* Store the name and decltype */ +# endif +#endif + +/* +** The following macro converts a label returned by sqlite3VdbeMakeLabel() +** into an index into the Parse.aLabel[] array that contains the resolved +** address of that label. +*/ +#define ADDR(X) (~(X)) + +/* +** The makefile scans the vdbe.c source file and creates the "opcodes.h" +** header file that defines a number for each opcode used by the VDBE. +*/ +/************** Include opcodes.h in the middle of vdbe.h ********************/ +/************** Begin file opcodes.h *****************************************/ +/* Automatically generated. Do not edit */ +/* See the tool/mkopcodeh.tcl script for details */ +#define OP_Savepoint 0 +#define OP_AutoCommit 1 +#define OP_Transaction 2 +#define OP_SorterNext 3 /* jump */ +#define OP_Prev 4 /* jump */ +#define OP_Next 5 /* jump */ +#define OP_Checkpoint 6 +#define OP_JournalMode 7 +#define OP_Vacuum 8 +#define OP_VFilter 9 /* jump, synopsis: iplan=r[P3] zplan='P4' */ +#define OP_VUpdate 10 /* synopsis: data=r[P3@P2] */ +#define OP_Goto 11 /* jump */ +#define OP_Gosub 12 /* jump */ +#define OP_InitCoroutine 13 /* jump */ +#define OP_Yield 14 /* jump */ +#define OP_MustBeInt 15 /* jump */ +#define OP_Jump 16 /* jump */ +#define OP_Once 17 /* jump */ +#define OP_If 18 /* jump */ +#define OP_Not 19 /* same as TK_NOT, synopsis: r[P2]= !r[P1] */ +#define OP_IfNot 20 /* jump */ +#define OP_IfNullRow 21 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */ +#define OP_SeekLT 22 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekLE 23 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekGE 24 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekGT 25 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IfNotOpen 26 /* jump, synopsis: if( !csr[P1] ) goto P2 */ +#define OP_IfNoHope 27 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NoConflict 28 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NotFound 29 /* jump, synopsis: key=r[P3@P4] */ +#define OP_Found 30 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekRowid 31 /* jump, synopsis: intkey=r[P3] */ +#define OP_NotExists 32 /* jump, synopsis: intkey=r[P3] */ +#define OP_Last 33 /* jump */ +#define OP_IfSmaller 34 /* jump */ +#define OP_SorterSort 35 /* jump */ +#define OP_Sort 36 /* jump */ +#define OP_Rewind 37 /* jump */ +#define OP_IdxLE 38 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxGT 39 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxLT 40 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxGE 41 /* jump, synopsis: key=r[P3@P4] */ +#define OP_RowSetRead 42 /* jump, synopsis: r[P3]=rowset(P1) */ +#define OP_Or 43 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */ +#define OP_And 44 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */ +#define OP_RowSetTest 45 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */ +#define OP_Program 46 /* jump */ +#define OP_FkIfZero 47 /* jump, synopsis: if fkctr[P1]==0 goto P2 */ +#define OP_IfPos 48 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ +#define OP_IfNotZero 49 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */ +#define OP_IsNull 50 /* jump, same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ +#define OP_NotNull 51 /* jump, same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ +#define OP_Ne 52 /* jump, same as TK_NE, synopsis: IF r[P3]!=r[P1] */ +#define OP_Eq 53 /* jump, same as TK_EQ, synopsis: IF r[P3]==r[P1] */ +#define OP_Gt 54 /* jump, same as TK_GT, synopsis: IF r[P3]>r[P1] */ +#define OP_Le 55 /* jump, same as TK_LE, synopsis: IF r[P3]<=r[P1] */ +#define OP_Lt 56 /* jump, same as TK_LT, synopsis: IF r[P3]=r[P1] */ +#define OP_ElseNotEq 58 /* jump, same as TK_ESCAPE */ +#define OP_DecrJumpZero 59 /* jump, synopsis: if (--r[P1])==0 goto P2 */ +#define OP_IncrVacuum 60 /* jump */ +#define OP_VNext 61 /* jump */ +#define OP_Init 62 /* jump, synopsis: Start at P2 */ +#define OP_PureFunc 63 /* synopsis: r[P3]=func(r[P2@NP]) */ +#define OP_Function 64 /* synopsis: r[P3]=func(r[P2@NP]) */ +#define OP_Return 65 +#define OP_EndCoroutine 66 +#define OP_HaltIfNull 67 /* synopsis: if r[P3]=null halt */ +#define OP_Halt 68 +#define OP_Integer 69 /* synopsis: r[P2]=P1 */ +#define OP_Int64 70 /* synopsis: r[P2]=P4 */ +#define OP_String 71 /* synopsis: r[P2]='P4' (len=P1) */ +#define OP_Null 72 /* synopsis: r[P2..P3]=NULL */ +#define OP_SoftNull 73 /* synopsis: r[P1]=NULL */ +#define OP_Blob 74 /* synopsis: r[P2]=P4 (len=P1) */ +#define OP_Variable 75 /* synopsis: r[P2]=parameter(P1,P4) */ +#define OP_Move 76 /* synopsis: r[P2@P3]=r[P1@P3] */ +#define OP_Copy 77 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ +#define OP_SCopy 78 /* synopsis: r[P2]=r[P1] */ +#define OP_IntCopy 79 /* synopsis: r[P2]=r[P1] */ +#define OP_ResultRow 80 /* synopsis: output=r[P1@P2] */ +#define OP_CollSeq 81 +#define OP_AddImm 82 /* synopsis: r[P1]=r[P1]+P2 */ +#define OP_RealAffinity 83 +#define OP_Cast 84 /* synopsis: affinity(r[P1]) */ +#define OP_Permutation 85 +#define OP_Compare 86 /* synopsis: r[P1@P3] <-> r[P2@P3] */ +#define OP_IsTrue 87 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ +#define OP_Offset 88 /* synopsis: r[P3] = sqlite_offset(P1) */ +#define OP_Column 89 /* synopsis: r[P3]=PX */ +#define OP_Affinity 90 /* synopsis: affinity(r[P1@P2]) */ +#define OP_MakeRecord 91 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 92 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 93 +#define OP_SetCookie 94 +#define OP_ReopenIdx 95 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenRead 96 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenWrite 97 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenDup 98 +#define OP_OpenAutoindex 99 /* synopsis: nColumn=P2 */ +#define OP_OpenEphemeral 100 /* synopsis: nColumn=P2 */ +#define OP_BitAnd 101 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ +#define OP_BitOr 102 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ +#define OP_ShiftLeft 103 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ +#define OP_Add 105 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ +#define OP_Subtract 106 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ +#define OP_Multiply 107 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ +#define OP_Divide 108 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ +#define OP_Remainder 109 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ +#define OP_Concat 110 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ +#define OP_SorterOpen 111 +#define OP_BitNot 112 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ +#define OP_SequenceTest 113 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ +#define OP_OpenPseudo 114 /* synopsis: P3 columns in r[P2] */ +#define OP_String8 115 /* same as TK_STRING, synopsis: r[P2]='P4' */ +#define OP_Close 116 +#define OP_ColumnsUsed 117 +#define OP_SeekHit 118 /* synopsis: seekHit=P2 */ +#define OP_Sequence 119 /* synopsis: r[P2]=cursor[P1].ctr++ */ +#define OP_NewRowid 120 /* synopsis: r[P2]=rowid */ +#define OP_Insert 121 /* synopsis: intkey=r[P3] data=r[P2] */ +#define OP_Delete 122 +#define OP_ResetCount 123 +#define OP_SorterCompare 124 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ +#define OP_SorterData 125 /* synopsis: r[P2]=data */ +#define OP_RowData 126 /* synopsis: r[P2]=data */ +#define OP_Rowid 127 /* synopsis: r[P2]=rowid */ +#define OP_NullRow 128 +#define OP_SeekEnd 129 +#define OP_IdxInsert 130 /* synopsis: key=r[P2] */ +#define OP_SorterInsert 131 /* synopsis: key=r[P2] */ +#define OP_IdxDelete 132 /* synopsis: key=r[P2@P3] */ +#define OP_DeferredSeek 133 /* synopsis: Move P3 to P1.rowid if needed */ +#define OP_IdxRowid 134 /* synopsis: r[P2]=rowid */ +#define OP_FinishSeek 135 +#define OP_Destroy 136 +#define OP_Clear 137 +#define OP_ResetSorter 138 +#define OP_CreateBtree 139 /* synopsis: r[P2]=root iDb=P1 flags=P3 */ +#define OP_SqlExec 140 +#define OP_ParseSchema 141 +#define OP_LoadAnalysis 142 +#define OP_DropTable 143 +#define OP_DropIndex 144 +#define OP_DropTrigger 145 +#define OP_IntegrityCk 146 +#define OP_RowSetAdd 147 /* synopsis: rowset(P1)=r[P2] */ +#define OP_Param 148 +#define OP_FkCounter 149 /* synopsis: fkctr[P1]+=P2 */ +#define OP_Real 150 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ +#define OP_MemMax 151 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_OffsetLimit 152 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ +#define OP_AggInverse 153 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ +#define OP_AggStep 154 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggStep1 155 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggValue 156 /* synopsis: r[P3]=value N=P2 */ +#define OP_AggFinal 157 /* synopsis: accum=r[P1] N=P2 */ +#define OP_Expire 158 +#define OP_CursorLock 159 +#define OP_CursorUnlock 160 +#define OP_TableLock 161 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 162 +#define OP_VCreate 163 +#define OP_VDestroy 164 +#define OP_VOpen 165 +#define OP_VColumn 166 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 167 +#define OP_Pagecount 168 +#define OP_MaxPgcnt 169 +#define OP_Trace 170 +#define OP_CursorHint 171 +#define OP_ReleaseReg 172 /* synopsis: release r[P1@P2] mask P3 */ +#define OP_Noop 173 +#define OP_Explain 174 +#define OP_Abortable 175 + +/* Properties such as "out2" or "jump" that are specified in +** comments following the "case" for each opcode in the vdbe.c +** are encoded into bitvectors as follows: +*/ +#define OPFLG_JUMP 0x01 /* jump: P2 holds jmp target */ +#define OPFLG_IN1 0x02 /* in1: P1 is an input */ +#define OPFLG_IN2 0x04 /* in2: P2 is an input */ +#define OPFLG_IN3 0x08 /* in3: P3 is an input */ +#define OPFLG_OUT2 0x10 /* out2: P2 is an output */ +#define OPFLG_OUT3 0x20 /* out3: P3 is an output */ +#define OPFLG_INITIALIZER {\ +/* 0 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x10,\ +/* 8 */ 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03,\ +/* 16 */ 0x01, 0x01, 0x03, 0x12, 0x03, 0x01, 0x09, 0x09,\ +/* 24 */ 0x09, 0x09, 0x01, 0x09, 0x09, 0x09, 0x09, 0x09,\ +/* 32 */ 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\ +/* 40 */ 0x01, 0x01, 0x23, 0x26, 0x26, 0x0b, 0x01, 0x01,\ +/* 48 */ 0x03, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\ +/* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x01, 0x01, 0x01, 0x00,\ +/* 64 */ 0x00, 0x02, 0x02, 0x08, 0x00, 0x10, 0x10, 0x10,\ +/* 72 */ 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10,\ +/* 80 */ 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x12,\ +/* 88 */ 0x20, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\ +/* 96 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x26, 0x26,\ +/* 104 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x00,\ +/* 112 */ 0x12, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,\ +/* 120 */ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\ +/* 128 */ 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x10, 0x00,\ +/* 136 */ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\ +/* 144 */ 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x10, 0x04,\ +/* 152 */ 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 168 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +} + +/* The sqlite3P2Values() routine is able to run faster if it knows +** the value of the largest JUMP opcode. The smaller the maximum +** JUMP opcode the better, so the mkopcodeh.tcl script that +** generated this include file strives to group all JUMP opcodes +** together near the beginning of the list. +*/ +#define SQLITE_MX_JUMP_OPCODE 62 /* Maximum JUMP opcode */ + +/************** End of opcodes.h *********************************************/ +/************** Continuing where we left off in vdbe.h ***********************/ + +/* +** Additional non-public SQLITE_PREPARE_* flags +*/ +#define SQLITE_PREPARE_SAVESQL 0x80 /* Preserve SQL text */ +#define SQLITE_PREPARE_MASK 0x0f /* Mask of public flags */ + +/* +** Prototypes for the VDBE interface. See comments on the implementation +** for a description of what each of these routines does. +*/ +SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse*); +SQLITE_PRIVATE Parse *sqlite3VdbeParser(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeGoto(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeLoadString(Vdbe*,int,const char*); +SQLITE_PRIVATE void sqlite3VdbeMultiLoad(Vdbe*,int,const char*,...); +SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8(Vdbe*,int,int,int,int,const u8*,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall(Parse*,int,int,int,int,const FuncDef*,int); +SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe*,int); +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N); +SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p); +#else +# define sqlite3VdbeVerifyNoMallocRequired(A,B) +# define sqlite3VdbeVerifyNoResultRow(A) +#endif +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int); +#else +# define sqlite3VdbeVerifyAbortable(A,B) +#endif +SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno); +#ifndef SQLITE_OMIT_EXPLAIN +SQLITE_PRIVATE void sqlite3VdbeExplain(Parse*,u8,const char*,...); +SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse*); +SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse*); +# define ExplainQueryPlan(P) sqlite3VdbeExplain P +# define ExplainQueryPlanPop(P) sqlite3VdbeExplainPop(P) +# define ExplainQueryPlanParent(P) sqlite3VdbeExplainParent(P) +#else +# define ExplainQueryPlan(P) +# define ExplainQueryPlanPop(P) +# define ExplainQueryPlanParent(P) 0 +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ +#endif +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_EXPLAIN) +SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char*,const char*); +#else +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ +#endif +SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, int addr, u8); +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); +SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u16 P5); +SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); +SQLITE_PRIVATE void sqlite3VdbeJumpHereOrPopInst(Vdbe*, int addr); +SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe*, int addr); +SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask, int); +#else +# define sqlite3VdbeReleaseRegisters(P,A,N,M,F) +#endif +SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); +SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); +SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); +SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); +SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse*); +SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3*,Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*); +SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); +SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int); +#endif +SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*)); +SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); +SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); +SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, u8); +#ifdef SQLITE_ENABLE_NORMALIZE +SQLITE_PRIVATE void sqlite3VdbeAddDblquoteStr(sqlite3*,Vdbe*,const char*); +SQLITE_PRIVATE int sqlite3VdbeUsesDoubleQuotedString(Vdbe*,const char*); +#endif +SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); +SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); +SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe*, int, u8); +SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int); +#ifndef SQLITE_OMIT_TRACE +SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*); +#endif +SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*); +SQLITE_PRIVATE int sqlite3BlobCompare(const Mem*, const Mem*); + +SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*); +SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); +SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(int, const void *, UnpackedRecord *, int); +SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo*); + +typedef int (*RecordCompare)(int,const void*,UnpackedRecord*); +SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); + +SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); +SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe*); + +SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context*); +#ifdef SQLITE_ENABLE_BYTECODE_VTAB +SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3*); +#endif + +/* Use SQLITE_ENABLE_COMMENTS to enable generation of extra comments on +** each VDBE opcode. +** +** Use the SQLITE_ENABLE_MODULE_COMMENTS macro to see some extra no-op +** comments in VDBE programs that show key decision points in the code +** generator. +*/ +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...); +# define VdbeComment(X) sqlite3VdbeComment X +SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); +# define VdbeNoopComment(X) sqlite3VdbeNoopComment X +# ifdef SQLITE_ENABLE_MODULE_COMMENTS +# define VdbeModuleComment(X) sqlite3VdbeNoopComment X +# else +# define VdbeModuleComment(X) +# endif +#else +# define VdbeComment(X) +# define VdbeNoopComment(X) +# define VdbeModuleComment(X) +#endif + +/* +** The VdbeCoverage macros are used to set a coverage testing point +** for VDBE branch instructions. The coverage testing points are line +** numbers in the sqlite3.c source file. VDBE branch coverage testing +** only works with an amalagmation build. That's ok since a VDBE branch +** coverage build designed for testing the test suite only. No application +** should ever ship with VDBE branch coverage measuring turned on. +** +** VdbeCoverage(v) // Mark the previously coded instruction +** // as a branch +** +** VdbeCoverageIf(v, conditional) // Mark previous if conditional true +** +** VdbeCoverageAlwaysTaken(v) // Previous branch is always taken +** +** VdbeCoverageNeverTaken(v) // Previous branch is never taken +** +** VdbeCoverageNeverNull(v) // Previous three-way branch is only +** // taken on the first two ways. The +** // NULL option is not possible +** +** VdbeCoverageEqNe(v) // Previous OP_Jump is only interested +** // in distingishing equal and not-equal. +** +** Every VDBE branch operation must be tagged with one of the macros above. +** If not, then when "make test" is run with -DSQLITE_VDBE_COVERAGE and +** -DSQLITE_DEBUG then an ALWAYS() will fail in the vdbeTakeBranch() +** routine in vdbe.c, alerting the developer to the missed tag. +** +** During testing, the test application will invoke +** sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE,...) to set a callback +** routine that is invoked as each bytecode branch is taken. The callback +** contains the sqlite3.c source line number ov the VdbeCoverage macro and +** flags to indicate whether or not the branch was taken. The test application +** is responsible for keeping track of this and reporting byte-code branches +** that are never taken. +** +** See the VdbeBranchTaken() macro and vdbeTakeBranch() function in the +** vdbe.c source file for additional information. +*/ +#ifdef SQLITE_VDBE_COVERAGE +SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe*,int); +# define VdbeCoverage(v) sqlite3VdbeSetLineNumber(v,__LINE__) +# define VdbeCoverageIf(v,x) if(x)sqlite3VdbeSetLineNumber(v,__LINE__) +# define VdbeCoverageAlwaysTaken(v) \ + sqlite3VdbeSetLineNumber(v,__LINE__|0x5000000); +# define VdbeCoverageNeverTaken(v) \ + sqlite3VdbeSetLineNumber(v,__LINE__|0x6000000); +# define VdbeCoverageNeverNull(v) \ + sqlite3VdbeSetLineNumber(v,__LINE__|0x4000000); +# define VdbeCoverageNeverNullIf(v,x) \ + if(x)sqlite3VdbeSetLineNumber(v,__LINE__|0x4000000); +# define VdbeCoverageEqNe(v) \ + sqlite3VdbeSetLineNumber(v,__LINE__|0x8000000); +# define VDBE_OFFSET_LINENO(x) (__LINE__+x) +#else +# define VdbeCoverage(v) +# define VdbeCoverageIf(v,x) +# define VdbeCoverageAlwaysTaken(v) +# define VdbeCoverageNeverTaken(v) +# define VdbeCoverageNeverNull(v) +# define VdbeCoverageNeverNullIf(v,x) +# define VdbeCoverageEqNe(v) +# define VDBE_OFFSET_LINENO(x) 0 +#endif + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +SQLITE_PRIVATE void sqlite3VdbeScanStatus(Vdbe*, int, int, int, LogEst, const char*); +#else +# define sqlite3VdbeScanStatus(a,b,c,d,e) +#endif + +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) +SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, VdbeOp*); +#endif + +#endif /* SQLITE_VDBE_H */ + +/************** End of vdbe.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include pager.h in the middle of sqliteInt.h *****************/ +/************** Begin file pager.h *******************************************/ +/* +** 2001 September 15 +** +** 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 header file defines the interface that the sqlite page cache +** subsystem. The page cache subsystem reads and writes a file a page +** at a time and provides a journal for rollback. +*/ + +#ifndef SQLITE_PAGER_H +#define SQLITE_PAGER_H + +/* +** Default maximum size for persistent journal files. A negative +** value means no limit. This value may be overridden using the +** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". +*/ +#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT + #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 +#endif + +/* +** The type used to represent a page number. The first page in a file +** is called page 1. 0 is used to represent "not a page". +*/ +typedef u32 Pgno; + +/* +** Each open file is managed by a separate instance of the "Pager" structure. +*/ +typedef struct Pager Pager; + +/* +** Handle type for pages. +*/ +typedef struct PgHdr DbPage; + +/* +** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is +** reserved for working around a windows/posix incompatibility). It is +** used in the journal to signify that the remainder of the journal file +** is devoted to storing a master journal name - there are no more pages to +** roll back. See comments for function writeMasterJournal() in pager.c +** for details. +*/ +#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) + +/* +** Allowed values for the flags parameter to sqlite3PagerOpen(). +** +** NOTE: These values must match the corresponding BTREE_ values in btree.h. +*/ +#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ +#define PAGER_MEMORY 0x0002 /* In-memory database */ + +/* +** Valid values for the second argument to sqlite3PagerLockingMode(). +*/ +#define PAGER_LOCKINGMODE_QUERY -1 +#define PAGER_LOCKINGMODE_NORMAL 0 +#define PAGER_LOCKINGMODE_EXCLUSIVE 1 + +/* +** Numeric constants that encode the journalmode. +** +** The numeric values encoded here (other than PAGER_JOURNALMODE_QUERY) +** are exposed in the API via the "PRAGMA journal_mode" command and +** therefore cannot be changed without a compatibility break. +*/ +#define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */ +#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */ +#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */ +#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */ +#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */ +#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */ +#define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */ + +/* +** Flags that make up the mask passed to sqlite3PagerGet(). +*/ +#define PAGER_GET_NOCONTENT 0x01 /* Do not load data from disk */ +#define PAGER_GET_READONLY 0x02 /* Read-only page is acceptable */ + +/* +** Flags for sqlite3PagerSetFlags() +** +** Value constraints (enforced via assert()): +** PAGER_FULLFSYNC == SQLITE_FullFSync +** PAGER_CKPT_FULLFSYNC == SQLITE_CkptFullFSync +** PAGER_CACHE_SPILL == SQLITE_CacheSpill +*/ +#define PAGER_SYNCHRONOUS_OFF 0x01 /* PRAGMA synchronous=OFF */ +#define PAGER_SYNCHRONOUS_NORMAL 0x02 /* PRAGMA synchronous=NORMAL */ +#define PAGER_SYNCHRONOUS_FULL 0x03 /* PRAGMA synchronous=FULL */ +#define PAGER_SYNCHRONOUS_EXTRA 0x04 /* PRAGMA synchronous=EXTRA */ +#define PAGER_SYNCHRONOUS_MASK 0x07 /* Mask for four values above */ +#define PAGER_FULLFSYNC 0x08 /* PRAGMA fullfsync=ON */ +#define PAGER_CKPT_FULLFSYNC 0x10 /* PRAGMA checkpoint_fullfsync=ON */ +#define PAGER_CACHESPILL 0x20 /* PRAGMA cache_spill=ON */ +#define PAGER_FLAGS_MASK 0x38 /* All above except SYNCHRONOUS */ + +/* +** The remainder of this file contains the declarations of the functions +** that make up the Pager sub-system API. See source code comments for +** a detailed description of each routine. +*/ + +/* Open and close a Pager connection. */ +SQLITE_PRIVATE int sqlite3PagerOpen( + sqlite3_vfs*, + Pager **ppPager, + const char*, + int, + int, + int, + void(*)(DbPage*) +); +SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3*); +SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); + +/* Functions used to configure a Pager object. */ +SQLITE_PRIVATE void sqlite3PagerSetBusyHandler(Pager*, int(*)(void *), void *); +SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int); +SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); +SQLITE_PRIVATE int sqlite3PagerSetSpillsize(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *, sqlite3_int64); +SQLITE_PRIVATE void sqlite3PagerShrink(Pager*); +SQLITE_PRIVATE void sqlite3PagerSetFlags(Pager*,unsigned); +SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int); +SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *, int); +SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager*); +SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager*); +SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64); +SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*); +SQLITE_PRIVATE int sqlite3PagerFlush(Pager*); + +/* Functions used to obtain and release page references. */ +SQLITE_PRIVATE int sqlite3PagerGet(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); +SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); +SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage*); + +/* Operations on page references. */ +SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); +SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*); +SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); +SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*); +SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); +SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); + +/* Functions used to manage pager transactions and savepoints. */ +SQLITE_PRIVATE void sqlite3PagerPagecount(Pager*, int*); +SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int); +SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); +SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*); +SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster); +SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*); +SQLITE_PRIVATE int sqlite3PagerRollback(Pager*); +SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n); +SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); +SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager); + +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, sqlite3*, int, int*, int*); +SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); +SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); +# ifdef SQLITE_ENABLE_SNAPSHOT +SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager*, sqlite3_snapshot **ppSnapshot); +SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager*, sqlite3_snapshot *pSnapshot); +SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot); +SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager); +# endif +#endif + +#if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_ENABLE_SETLK_TIMEOUT) +SQLITE_PRIVATE int sqlite3PagerWalWriteLock(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerWalDb(Pager*, sqlite3*); +#else +# define sqlite3PagerWalWriteLock(y,z) SQLITE_OK +# define sqlite3PagerWalDb(x,y) +#endif + +#ifdef SQLITE_DIRECT_OVERFLOW_READ +SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno); +#endif + +#ifdef SQLITE_ENABLE_ZIPVFS +SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager); +#endif + +/* Functions used to query pager state and configuration. */ +SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager*); +SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); +#endif +SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*); +SQLITE_PRIVATE const char *sqlite3PagerFilename(const Pager*, int); +SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager*); +SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*); +SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager*); +SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); +SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); +SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); +SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *); +SQLITE_PRIVATE void sqlite3PagerClearCache(Pager*); +SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *); + +/* Functions used to truncate the database file. */ +SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); + +SQLITE_PRIVATE void sqlite3PagerRekey(DbPage*, Pgno, u16); + +/* Functions to support testing and debugging. */ +#if !defined(NDEBUG) || defined(SQLITE_TEST) +SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*); +SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*); +#endif +#ifdef SQLITE_TEST +SQLITE_PRIVATE int *sqlite3PagerStats(Pager*); +SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); + void disable_simulated_io_errors(void); + void enable_simulated_io_errors(void); +#else +# define disable_simulated_io_errors() +# define enable_simulated_io_errors() +#endif + +#endif /* SQLITE_PAGER_H */ + +/************** End of pager.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include pcache.h in the middle of sqliteInt.h ****************/ +/************** Begin file pcache.h ******************************************/ +/* +** 2008 August 05 +** +** 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 header file defines the interface that the sqlite page cache +** subsystem. +*/ + +#ifndef _PCACHE_H_ + +typedef struct PgHdr PgHdr; +typedef struct PCache PCache; + +/* +** Every page in the cache is controlled by an instance of the following +** structure. +*/ +struct PgHdr { + sqlite3_pcache_page *pPage; /* Pcache object page handle */ + void *pData; /* Page data */ + void *pExtra; /* Extra content */ + PCache *pCache; /* PRIVATE: Cache that owns this page */ + PgHdr *pDirty; /* Transient list of dirty sorted by pgno */ + Pager *pPager; /* The pager this page is part of */ + Pgno pgno; /* Page number for this page */ +#ifdef SQLITE_CHECK_PAGES + u32 pageHash; /* Hash of page content */ +#endif + u16 flags; /* PGHDR flags defined below */ + + /********************************************************************** + ** Elements above, except pCache, are public. All that follow are + ** private to pcache.c and should not be accessed by other modules. + ** pCache is grouped with the public elements for efficiency. + */ + i16 nRef; /* Number of users of this page */ + PgHdr *pDirtyNext; /* Next element in list of dirty pages */ + PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */ + /* NB: pDirtyNext and pDirtyPrev are undefined if the + ** PgHdr object is not dirty */ +}; + +/* Bit values for PgHdr.flags */ +#define PGHDR_CLEAN 0x001 /* Page not on the PCache.pDirty list */ +#define PGHDR_DIRTY 0x002 /* Page is on the PCache.pDirty list */ +#define PGHDR_WRITEABLE 0x004 /* Journaled and ready to modify */ +#define PGHDR_NEED_SYNC 0x008 /* Fsync the rollback journal before + ** writing this page to the database */ +#define PGHDR_DONT_WRITE 0x010 /* Do not write content to disk */ +#define PGHDR_MMAP 0x020 /* This is an mmap page object */ + +#define PGHDR_WAL_APPEND 0x040 /* Appended to wal file */ + +/* Initialize and shutdown the page cache subsystem */ +SQLITE_PRIVATE int sqlite3PcacheInitialize(void); +SQLITE_PRIVATE void sqlite3PcacheShutdown(void); + +/* Page cache buffer management: +** These routines implement SQLITE_CONFIG_PAGECACHE. +*/ +SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n); + +/* Create a new pager cache. +** Under memory stress, invoke xStress to try to make pages clean. +** Only clean and unpinned pages can be reclaimed. +*/ +SQLITE_PRIVATE int sqlite3PcacheOpen( + int szPage, /* Size of every page */ + int szExtra, /* Extra space associated with each page */ + int bPurgeable, /* True if pages are on backing store */ + int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */ + void *pStress, /* Argument to xStress */ + PCache *pToInit /* Preallocated space for the PCache */ +); + +/* Modify the page-size after the cache has been created. */ +SQLITE_PRIVATE int sqlite3PcacheSetPageSize(PCache *, int); + +/* Return the size in bytes of a PCache object. Used to preallocate +** storage space. +*/ +SQLITE_PRIVATE int sqlite3PcacheSize(void); + +/* One release per successful fetch. Page is pinned until released. +** Reference counted. +*/ +SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch(PCache*, Pgno, int createFlag); +SQLITE_PRIVATE int sqlite3PcacheFetchStress(PCache*, Pgno, sqlite3_pcache_page**); +SQLITE_PRIVATE PgHdr *sqlite3PcacheFetchFinish(PCache*, Pgno, sqlite3_pcache_page *pPage); +SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr*); + +SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */ +SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */ +SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */ +SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */ +SQLITE_PRIVATE void sqlite3PcacheClearWritable(PCache*); + +/* Change a page number. Used by incr-vacuum. */ +SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno); + +/* Remove all pages with pgno>x. Reset the cache if x==0 */ +SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache*, Pgno x); + +/* Get a list of all dirty pages in the cache, sorted by page number */ +SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache*); + +/* Reset and close the cache object */ +SQLITE_PRIVATE void sqlite3PcacheClose(PCache*); + +/* Clear flags from pages of the page cache */ +SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *); + +/* Discard the contents of the cache */ +SQLITE_PRIVATE void sqlite3PcacheClear(PCache*); + +/* Return the total number of outstanding page references */ +SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*); + +/* Increment the reference count of an existing page */ +SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*); + +SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*); + +/* Return the total number of pages stored in the cache */ +SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); + +#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) +/* Iterate through all dirty pages currently stored in the cache. This +** interface is only available if SQLITE_CHECK_PAGES is defined when the +** library is built. +*/ +SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); +#endif + +#if defined(SQLITE_DEBUG) +/* Check invariants on a PgHdr object */ +SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr*); +#endif + +/* Set and get the suggested cache-size for the specified pager-cache. +** +** If no global maximum is configured, then the system attempts to limit +** the total number of pages cached by purgeable pager-caches to the sum +** of the suggested cache-sizes. +*/ +SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int); +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); +#endif + +/* Set or get the suggested spill-size for the specified pager-cache. +** +** The spill-size is the minimum number of pages in cache before the cache +** will attempt to spill dirty pages by calling xStress. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetSpillsize(PCache *, int); + +/* Free up as much memory as possible from the page cache */ +SQLITE_PRIVATE void sqlite3PcacheShrink(PCache*); + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +/* Try to return memory used by the pcache module to the main memory heap */ +SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int); +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*); +#endif + +SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); + +/* Return the header size */ +SQLITE_PRIVATE int sqlite3HeaderSizePcache(void); +SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void); + +/* Number of dirty pages as a percentage of the configured cache size */ +SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache*); + +#ifdef SQLITE_DIRECT_OVERFLOW_READ +SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); +#endif + +#endif /* _PCACHE_H_ */ + +/************** End of pcache.h **********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include os.h in the middle of sqliteInt.h ********************/ +/************** Begin file os.h **********************************************/ +/* +** 2001 September 16 +** +** 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 header file (together with is companion C source-code file +** "os.c") attempt to abstract the underlying operating system so that +** the SQLite library will work on both POSIX and windows systems. +** +** This header file is #include-ed by sqliteInt.h and thus ends up +** being included by every source file. +*/ +#ifndef _SQLITE_OS_H_ +#define _SQLITE_OS_H_ + +/* +** Attempt to automatically detect the operating system and setup the +** necessary pre-processor macros for it. +*/ +/************** Include os_setup.h in the middle of os.h *********************/ +/************** Begin file os_setup.h ****************************************/ +/* +** 2013 November 25 +** +** 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 pre-processor directives related to operating system +** detection and/or setup. +*/ +#ifndef SQLITE_OS_SETUP_H +#define SQLITE_OS_SETUP_H + +/* +** Figure out if we are dealing with Unix, Windows, or some other operating +** system. +** +** After the following block of preprocess macros, all of SQLITE_OS_UNIX, +** SQLITE_OS_WIN, and SQLITE_OS_OTHER will defined to either 1 or 0. One of +** the three will be 1. The other two will be 0. +*/ +#if defined(SQLITE_OS_OTHER) +# if SQLITE_OS_OTHER==1 +# undef SQLITE_OS_UNIX +# define SQLITE_OS_UNIX 0 +# undef SQLITE_OS_WIN +# define SQLITE_OS_WIN 0 +# else +# undef SQLITE_OS_OTHER +# endif +#endif +#if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER) +# define SQLITE_OS_OTHER 0 +# ifndef SQLITE_OS_WIN +# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \ + defined(__MINGW32__) || defined(__BORLANDC__) +# define SQLITE_OS_WIN 1 +# define SQLITE_OS_UNIX 0 +# else +# define SQLITE_OS_WIN 0 +# define SQLITE_OS_UNIX 1 +# endif +# else +# define SQLITE_OS_UNIX 0 +# endif +#else +# ifndef SQLITE_OS_WIN +# define SQLITE_OS_WIN 0 +# endif +#endif + +#endif /* SQLITE_OS_SETUP_H */ + +/************** End of os_setup.h ********************************************/ +/************** Continuing where we left off in os.h *************************/ + +/* If the SET_FULLSYNC macro is not defined above, then make it +** a no-op +*/ +#ifndef SET_FULLSYNC +# define SET_FULLSYNC(x,y) +#endif + +/* +** The default size of a disk sector +*/ +#ifndef SQLITE_DEFAULT_SECTOR_SIZE +# define SQLITE_DEFAULT_SECTOR_SIZE 4096 +#endif + +/* +** Temporary files are named starting with this prefix followed by 16 random +** alphanumeric characters, and no file extension. They are stored in the +** OS's standard temporary file directory, and are deleted prior to exit. +** If sqlite is being embedded in another program, you may wish to change the +** prefix to reflect your program's name, so that if your program exits +** prematurely, old temporary files can be easily identified. This can be done +** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line. +** +** 2006-10-31: The default prefix used to be "sqlite_". But then +** Mcafee started using SQLite in their anti-virus product and it +** started putting files with the "sqlite" name in the c:/temp folder. +** This annoyed many windows users. Those users would then do a +** Google search for "sqlite", find the telephone numbers of the +** developers and call to wake them up at night and complain. +** For this reason, the default name prefix is changed to be "sqlite" +** spelled backwards. So the temp files are still identified, but +** anybody smart enough to figure out the code is also likely smart +** enough to know that calling the developer will not help get rid +** of the file. +*/ +#ifndef SQLITE_TEMP_FILE_PREFIX +# define SQLITE_TEMP_FILE_PREFIX "etilqs_" +#endif + +/* +** The following values may be passed as the second argument to +** sqlite3OsLock(). The various locks exhibit the following semantics: +** +** SHARED: Any number of processes may hold a SHARED lock simultaneously. +** RESERVED: A single process may hold a RESERVED lock on a file at +** any time. Other processes may hold and obtain new SHARED locks. +** PENDING: A single process may hold a PENDING lock on a file at +** any one time. Existing SHARED locks may persist, but no new +** SHARED locks may be obtained by other processes. +** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks. +** +** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a +** process that requests an EXCLUSIVE lock may actually obtain a PENDING +** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to +** sqlite3OsLock(). +*/ +#define NO_LOCK 0 +#define SHARED_LOCK 1 +#define RESERVED_LOCK 2 +#define PENDING_LOCK 3 +#define EXCLUSIVE_LOCK 4 + +/* +** File Locking Notes: (Mostly about windows but also some info for Unix) +** +** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because +** those functions are not available. So we use only LockFile() and +** UnlockFile(). +** +** LockFile() prevents not just writing but also reading by other processes. +** A SHARED_LOCK is obtained by locking a single randomly-chosen +** byte out of a specific range of bytes. The lock byte is obtained at +** random so two separate readers can probably access the file at the +** same time, unless they are unlucky and choose the same lock byte. +** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. +** There can only be one writer. A RESERVED_LOCK is obtained by locking +** a single byte of the file that is designated as the reserved lock byte. +** A PENDING_LOCK is obtained by locking a designated byte different from +** the RESERVED_LOCK byte. +** +** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available, +** which means we can use reader/writer locks. When reader/writer locks +** are used, the lock is placed on the same range of bytes that is used +** for probabilistic locking in Win95/98/ME. Hence, the locking scheme +** will support two or more Win95 readers or two or more WinNT readers. +** But a single Win95 reader will lock out all WinNT readers and a single +** WinNT reader will lock out all other Win95 readers. +** +** The following #defines specify the range of bytes used for locking. +** SHARED_SIZE is the number of bytes available in the pool from which +** a random byte is selected for a shared lock. The pool of bytes for +** shared locks begins at SHARED_FIRST. +** +** The same locking strategy and +** byte ranges are used for Unix. This leaves open the possibility of having +** clients on win95, winNT, and unix all talking to the same shared file +** and all locking correctly. To do so would require that samba (or whatever +** tool is being used for file sharing) implements locks correctly between +** windows and unix. I'm guessing that isn't likely to happen, but by +** using the same locking range we are at least open to the possibility. +** +** Locking in windows is manditory. For this reason, we cannot store +** actual data in the bytes used for locking. The pager never allocates +** the pages involved in locking therefore. SHARED_SIZE is selected so +** that all locks will fit on a single page even at the minimum page size. +** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE +** is set high so that we don't have to allocate an unused page except +** for very large databases. But one should test the page skipping logic +** by setting PENDING_BYTE low and running the entire regression suite. +** +** Changing the value of PENDING_BYTE results in a subtly incompatible +** file format. Depending on how it is changed, you might not notice +** the incompatibility right away, even running a full regression test. +** The default location of PENDING_BYTE is the first byte past the +** 1GB boundary. +** +*/ +#ifdef SQLITE_OMIT_WSD +# define PENDING_BYTE (0x40000000) +#else +# define PENDING_BYTE sqlite3PendingByte +#endif +#define RESERVED_BYTE (PENDING_BYTE+1) +#define SHARED_FIRST (PENDING_BYTE+2) +#define SHARED_SIZE 510 + +/* +** Wrapper around OS specific sqlite3_os_init() function. +*/ +SQLITE_PRIVATE int sqlite3OsInit(void); + +/* +** Functions for accessing sqlite3_file methods +*/ +SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file*); +SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); +SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); +SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size); +SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize); +SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut); +SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*); +SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file*,int,void*); +#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0 +SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id); +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **); +SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int); +SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int); +#endif /* SQLITE_OMIT_WAL */ +SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64, int, void **); +SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *, i64, void *); + + +/* +** Functions for accessing sqlite3_vfs methods +*/ +SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); +SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int); +SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut); +SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *); +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *); +SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *); +SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void); +SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *); +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ +SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *); +SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int); +SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs*); +SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*); + +/* +** Convenience functions for opening and closing files using +** sqlite3_malloc() to obtain space for the file-handle structure. +*/ +SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); +SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *); + +#endif /* _SQLITE_OS_H_ */ + +/************** End of os.h **************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include mutex.h in the middle of sqliteInt.h *****************/ +/************** Begin file mutex.h *******************************************/ +/* +** 2007 August 28 +** +** 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 the common header for all mutex implementations. +** The sqliteInt.h header #includes this file so that it is available +** to all source files. We break it out in an effort to keep the code +** better organized. +** +** NOTE: source files should *not* #include this header file directly. +** Source files should #include the sqliteInt.h file and let that file +** include this one indirectly. +*/ + + +/* +** Figure out what version of the code to use. The choices are +** +** SQLITE_MUTEX_OMIT No mutex logic. Not even stubs. The +** mutexes implementation cannot be overridden +** at start-time. +** +** SQLITE_MUTEX_NOOP For single-threaded applications. No +** mutual exclusion is provided. But this +** implementation can be overridden at +** start-time. +** +** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix. +** +** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. +*/ +#if !SQLITE_THREADSAFE +# define SQLITE_MUTEX_OMIT +#endif +#if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP) +# if SQLITE_OS_UNIX +# define SQLITE_MUTEX_PTHREADS +# elif SQLITE_OS_WIN +# define SQLITE_MUTEX_W32 +# else +# define SQLITE_MUTEX_NOOP +# endif +#endif + +#ifdef SQLITE_MUTEX_OMIT +/* +** If this is a no-op implementation, implement everything as macros. +*/ +#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) +#define sqlite3_mutex_free(X) +#define sqlite3_mutex_enter(X) +#define sqlite3_mutex_try(X) SQLITE_OK +#define sqlite3_mutex_leave(X) +#define sqlite3_mutex_held(X) ((void)(X),1) +#define sqlite3_mutex_notheld(X) ((void)(X),1) +#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8) +#define sqlite3MutexInit() SQLITE_OK +#define sqlite3MutexEnd() +#define MUTEX_LOGIC(X) +#else +#define MUTEX_LOGIC(X) X +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); +#endif /* defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* The SQLITE_EXTRA_DURABLE compile-time option used to set the default +** synchronous setting to EXTRA. It is no longer supported. +*/ +#ifdef SQLITE_EXTRA_DURABLE +# warning Use SQLITE_DEFAULT_SYNCHRONOUS=3 instead of SQLITE_EXTRA_DURABLE +# define SQLITE_DEFAULT_SYNCHRONOUS 3 +#endif + +/* +** Default synchronous levels. +** +** Note that (for historcal reasons) the PAGER_SYNCHRONOUS_* macros differ +** from the SQLITE_DEFAULT_SYNCHRONOUS value by 1. +** +** PAGER_SYNCHRONOUS DEFAULT_SYNCHRONOUS +** OFF 1 0 +** NORMAL 2 1 +** FULL 3 2 +** EXTRA 4 3 +** +** The "PRAGMA synchronous" statement also uses the zero-based numbers. +** In other words, the zero-based numbers are used for all external interfaces +** and the one-based values are used internally. +*/ +#ifndef SQLITE_DEFAULT_SYNCHRONOUS +# define SQLITE_DEFAULT_SYNCHRONOUS 2 +#endif +#ifndef SQLITE_DEFAULT_WAL_SYNCHRONOUS +# define SQLITE_DEFAULT_WAL_SYNCHRONOUS SQLITE_DEFAULT_SYNCHRONOUS +#endif + +/* +** Each database file to be accessed by the system is an instance +** of the following structure. There are normally two of these structures +** in the sqlite.aDb[] array. aDb[0] is the main database file and +** aDb[1] is the database file used to hold temporary tables. Additional +** databases may be attached. +*/ +struct Db { + char *zDbSName; /* Name of this database. (schema name, not filename) */ + Btree *pBt; /* The B*Tree structure for this database file */ + u8 safety_level; /* How aggressive at syncing data to disk */ + u8 bSyncSet; /* True if "PRAGMA synchronous=N" has been run */ + Schema *pSchema; /* Pointer to database schema (possibly shared) */ +}; + +/* +** An instance of the following structure stores a database schema. +** +** Most Schema objects are associated with a Btree. The exception is +** the Schema for the TEMP databaes (sqlite3.aDb[1]) which is free-standing. +** In shared cache mode, a single Schema object can be shared by multiple +** Btrees that refer to the same underlying BtShared object. +** +** Schema objects are automatically deallocated when the last Btree that +** references them is destroyed. The TEMP Schema is manually freed by +** sqlite3_close(). +* +** A thread must be holding a mutex on the corresponding Btree in order +** to access Schema content. This implies that the thread must also be +** holding a mutex on the sqlite3 connection pointer that owns the Btree. +** For a TEMP Schema, only the connection mutex is required. +*/ +struct Schema { + int schema_cookie; /* Database schema version number for this file */ + int iGeneration; /* Generation counter. Incremented with each change */ + Hash tblHash; /* All tables indexed by name */ + Hash idxHash; /* All (named) indices indexed by name */ + Hash trigHash; /* All triggers indexed by name */ + Hash fkeyHash; /* All foreign keys by referenced table name */ + Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */ + u8 file_format; /* Schema format version for this file */ + u8 enc; /* Text encoding used by this database */ + u16 schemaFlags; /* Flags associated with this schema */ + int cache_size; /* Number of pages to use in the cache */ +}; + +/* +** These macros can be used to test, set, or clear bits in the +** Db.pSchema->flags field. +*/ +#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->schemaFlags&(P))==(P)) +#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->schemaFlags&(P))!=0) +#define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->schemaFlags|=(P) +#define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->schemaFlags&=~(P) + +/* +** Allowed values for the DB.pSchema->flags field. +** +** The DB_SchemaLoaded flag is set after the database schema has been +** read into internal hash tables. +** +** DB_UnresetViews means that one or more views have column names that +** have been filled out. If the schema changes, these column names might +** changes and so the view will need to be reset. +*/ +#define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ +#define DB_UnresetViews 0x0002 /* Some views have defined column names */ +#define DB_ResetWanted 0x0008 /* Reset the schema when nSchemaLock==0 */ + +/* +** The number of different kinds of things that can be limited +** using the sqlite3_limit() interface. +*/ +#define SQLITE_N_LIMIT (SQLITE_LIMIT_WORKER_THREADS+1) + +/* +** Lookaside malloc is a set of fixed-size buffers that can be used +** to satisfy small transient memory allocation requests for objects +** associated with a particular database connection. The use of +** lookaside malloc provides a significant performance enhancement +** (approx 10%) by avoiding numerous malloc/free requests while parsing +** SQL statements. +** +** The Lookaside structure holds configuration information about the +** lookaside malloc subsystem. Each available memory allocation in +** the lookaside subsystem is stored on a linked list of LookasideSlot +** objects. +** +** Lookaside allocations are only allowed for objects that are associated +** with a particular database connection. Hence, schema information cannot +** be stored in lookaside because in shared cache mode the schema information +** is shared by multiple database connections. Therefore, while parsing +** schema information, the Lookaside.bEnabled flag is cleared so that +** lookaside allocations are not used to construct the schema objects. +** +** New lookaside allocations are only allowed if bDisable==0. When +** bDisable is greater than zero, sz is set to zero which effectively +** disables lookaside without adding a new test for the bDisable flag +** in a performance-critical path. sz should be set by to szTrue whenever +** bDisable changes back to zero. +** +** Lookaside buffers are initially held on the pInit list. As they are +** used and freed, they are added back to the pFree list. New allocations +** come off of pFree first, then pInit as a fallback. This dual-list +** allows use to compute a high-water mark - the maximum number of allocations +** outstanding at any point in the past - by subtracting the number of +** allocations on the pInit list from the total number of allocations. +** +** Enhancement on 2019-12-12: Two-size-lookaside +** The default lookaside configuration is 100 slots of 1200 bytes each. +** The larger slot sizes are important for performance, but they waste +** a lot of space, as most lookaside allocations are less than 128 bytes. +** The two-size-lookaside enhancement breaks up the lookaside allocation +** into two pools: One of 128-byte slots and the other of the default size +** (1200-byte) slots. Allocations are filled from the small-pool first, +** failing over to the full-size pool if that does not work. Thus more +** lookaside slots are available while also using less memory. +** This enhancement can be omitted by compiling with +** SQLITE_OMIT_TWOSIZE_LOOKASIDE. +*/ +struct Lookaside { + u32 bDisable; /* Only operate the lookaside when zero */ + u16 sz; /* Size of each buffer in bytes */ + u16 szTrue; /* True value of sz, even if disabled */ + u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ + u32 nSlot; /* Number of lookaside slots allocated */ + u32 anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ + LookasideSlot *pInit; /* List of buffers not previously used */ + LookasideSlot *pFree; /* List of available buffers */ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + LookasideSlot *pSmallInit; /* List of small buffers not prediously used */ + LookasideSlot *pSmallFree; /* List of available small buffers */ + void *pMiddle; /* First byte past end of full-size buffers and + ** the first byte of LOOKASIDE_SMALL buffers */ +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + void *pStart; /* First byte of available memory space */ + void *pEnd; /* First byte past end of available space */ +}; +struct LookasideSlot { + LookasideSlot *pNext; /* Next buffer in the list of free buffers */ +}; + +#define DisableLookaside db->lookaside.bDisable++;db->lookaside.sz=0 +#define EnableLookaside db->lookaside.bDisable--;\ + db->lookaside.sz=db->lookaside.bDisable?0:db->lookaside.szTrue + +/* Size of the smaller allocations in two-size lookside */ +#ifdef SQLITE_OMIT_TWOSIZE_LOOKASIDE +# define LOOKASIDE_SMALL 0 +#else +# define LOOKASIDE_SMALL 128 +#endif + +/* +** A hash table for built-in function definitions. (Application-defined +** functions use a regular table table from hash.h.) +** +** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. +** Collisions are on the FuncDef.u.pHash chain. Use the SQLITE_FUNC_HASH() +** macro to compute a hash on the function name. +*/ +#define SQLITE_FUNC_HASH_SZ 23 +struct FuncDefHash { + FuncDef *a[SQLITE_FUNC_HASH_SZ]; /* Hash table for functions */ +}; +#define SQLITE_FUNC_HASH(C,L) (((C)+(L))%SQLITE_FUNC_HASH_SZ) + +#ifdef SQLITE_USER_AUTHENTICATION +/* +** Information held in the "sqlite3" database connection object and used +** to manage user authentication. +*/ +typedef struct sqlite3_userauth sqlite3_userauth; +struct sqlite3_userauth { + u8 authLevel; /* Current authentication level */ + int nAuthPW; /* Size of the zAuthPW in bytes */ + char *zAuthPW; /* Password used to authenticate */ + char *zAuthUser; /* User name used to authenticate */ +}; + +/* Allowed values for sqlite3_userauth.authLevel */ +#define UAUTH_Unknown 0 /* Authentication not yet checked */ +#define UAUTH_Fail 1 /* User authentication failed */ +#define UAUTH_User 2 /* Authenticated as a normal user */ +#define UAUTH_Admin 3 /* Authenticated as an administrator */ + +/* Functions used only by user authorization logic */ +SQLITE_PRIVATE int sqlite3UserAuthTable(const char*); +SQLITE_PRIVATE int sqlite3UserAuthCheckLogin(sqlite3*,const char*,u8*); +SQLITE_PRIVATE void sqlite3UserAuthInit(sqlite3*); +SQLITE_PRIVATE void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); + +#endif /* SQLITE_USER_AUTHENTICATION */ + +/* +** typedef for the authorization callback function. +*/ +#ifdef SQLITE_USER_AUTHENTICATION + typedef int (*sqlite3_xauth)(void*,int,const char*,const char*,const char*, + const char*, const char*); +#else + typedef int (*sqlite3_xauth)(void*,int,const char*,const char*,const char*, + const char*); +#endif + +#ifndef SQLITE_OMIT_DEPRECATED +/* This is an extra SQLITE_TRACE macro that indicates "legacy" tracing +** in the style of sqlite3_trace() +*/ +#define SQLITE_TRACE_LEGACY 0x40 /* Use the legacy xTrace */ +#define SQLITE_TRACE_XPROFILE 0x80 /* Use the legacy xProfile */ +#else +#define SQLITE_TRACE_LEGACY 0 +#define SQLITE_TRACE_XPROFILE 0 +#endif /* SQLITE_OMIT_DEPRECATED */ +#define SQLITE_TRACE_NONLEGACY_MASK 0x0f /* Normal flags */ + + +/* +** Each database connection is an instance of the following structure. +*/ +struct sqlite3 { + sqlite3_vfs *pVfs; /* OS Interface */ + struct Vdbe *pVdbe; /* List of active virtual machines */ + CollSeq *pDfltColl; /* BINARY collseq for the database encoding */ + sqlite3_mutex *mutex; /* Connection mutex */ + Db *aDb; /* All backends */ + int nDb; /* Number of backends currently in use */ + u32 mDbFlags; /* flags recording internal state */ + u64 flags; /* flags settable by pragmas. See below */ + i64 lastRowid; /* ROWID of most recent insert (see above) */ + i64 szMmap; /* Default mmap_size setting */ + u32 nSchemaLock; /* Do not reset the schema when non-zero */ + unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ + int errCode; /* Most recent error code (SQLITE_*) */ + int errMask; /* & result codes with this before returning */ + int iSysErrno; /* Errno value from last system error */ + u16 dbOptFlags; /* Flags to enable/disable optimizations */ + u8 enc; /* Text encoding */ + u8 autoCommit; /* The auto-commit flag. */ + u8 temp_store; /* 1: file 2: memory 0: default */ + u8 mallocFailed; /* True if we have seen a malloc failure */ + u8 bBenignMalloc; /* Do not require OOMs if true */ + u8 dfltLockMode; /* Default locking-mode for attached dbs */ + signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ + u8 suppressErr; /* Do not issue error messages if true */ + u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ + u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ + u8 mTrace; /* zero or more SQLITE_TRACE flags */ + u8 noSharedCache; /* True if no shared-cache backends */ + u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */ + int nextPagesize; /* Pagesize after VACUUM if >0 */ + u32 magic; /* Magic number for detect library misuse */ + int nChange; /* Value returned by sqlite3_changes() */ + int nTotalChange; /* Value returned by sqlite3_total_changes() */ + int aLimit[SQLITE_N_LIMIT]; /* Limits */ + int nMaxSorterMmap; /* Maximum size of regions mapped by sorter */ + struct sqlite3InitInfo { /* Information used during initialization */ + int newTnum; /* Rootpage of table being initialized */ + u8 iDb; /* Which db file is being initialized */ + u8 busy; /* TRUE if currently initializing */ + unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */ + unsigned imposterTable : 1; /* Building an imposter table */ + unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */ + char **azInit; /* "type", "name", and "tbl_name" columns */ + } init; + int nVdbeActive; /* Number of VDBEs currently running */ + int nVdbeRead; /* Number of active VDBEs that read or write */ + int nVdbeWrite; /* Number of active VDBEs that read and write */ + int nVdbeExec; /* Number of nested calls to VdbeExec() */ + int nVDestroy; /* Number of active OP_VDestroy operations */ + int nExtension; /* Number of loaded extensions */ + void **aExtension; /* Array of shared library handles */ + int (*xTrace)(u32,void*,void*,void*); /* Trace function */ + void *pTraceArg; /* Argument to the trace function */ +#ifndef SQLITE_OMIT_DEPRECATED + void (*xProfile)(void*,const char*,u64); /* Profiling function */ + void *pProfileArg; /* Argument to profile function */ +#endif + void *pCommitArg; /* Argument to xCommitCallback() */ + int (*xCommitCallback)(void*); /* Invoked at every commit. */ + void *pRollbackArg; /* Argument to xRollbackCallback() */ + void (*xRollbackCallback)(void*); /* Invoked at every commit. */ + void *pUpdateArg; + void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); + Parse *pParse; /* Current parse */ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + void *pPreUpdateArg; /* First argument to xPreUpdateCallback */ + void (*xPreUpdateCallback)( /* Registered using sqlite3_preupdate_hook() */ + void*,sqlite3*,int,char const*,char const*,sqlite3_int64,sqlite3_int64 + ); + PreUpdate *pPreUpdate; /* Context for active pre-update callback */ +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ +#ifndef SQLITE_OMIT_WAL + int (*xWalCallback)(void *, sqlite3 *, const char *, int); + void *pWalArg; +#endif + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); + void *pCollNeededArg; + sqlite3_value *pErr; /* Most recent error message */ + union { + volatile int isInterrupted; /* True if sqlite3_interrupt has been called */ + double notUsed1; /* Spacer */ + } u1; + Lookaside lookaside; /* Lookaside malloc configuration */ +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth; /* Access authorization function */ + void *pAuthArg; /* 1st argument to the access auth function */ +#endif +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + int (*xProgress)(void *); /* The progress callback */ + void *pProgressArg; /* Argument to the progress callback */ + unsigned nProgressOps; /* Number of opcodes for progress callback */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + int nVTrans; /* Allocated size of aVTrans */ + Hash aModule; /* populated by sqlite3_create_module() */ + VtabCtx *pVtabCtx; /* Context for active vtab connect/create */ + VTable **aVTrans; /* Virtual tables with open transactions */ + VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ +#endif + Hash aFunc; /* Hash table of connection functions */ + Hash aCollSeq; /* All collating sequences */ + BusyHandler busyHandler; /* Busy callback */ + Db aDbStatic[2]; /* Static space for the 2 default backends */ + Savepoint *pSavepoint; /* List of active savepoints */ + int nAnalysisLimit; /* Number of index rows to ANALYZE */ + int busyTimeout; /* Busy handler timeout, in msec */ + int nSavepoint; /* Number of non-transaction savepoints */ + int nStatement; /* Number of nested statement-transactions */ + i64 nDeferredCons; /* Net deferred constraints this transaction. */ + i64 nDeferredImmCons; /* Net deferred immediate constraints */ + int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY + /* The following variables are all protected by the STATIC_MASTER + ** mutex, not by sqlite3.mutex. They are used by code in notify.c. + ** + ** When X.pUnlockConnection==Y, that means that X is waiting for Y to + ** unlock so that it can proceed. + ** + ** When X.pBlockingConnection==Y, that means that something that X tried + ** tried to do recently failed with an SQLITE_LOCKED error due to locks + ** held by Y. + */ + sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */ + sqlite3 *pUnlockConnection; /* Connection to watch for unlock */ + void *pUnlockArg; /* Argument to xUnlockNotify */ + void (*xUnlockNotify)(void **, int); /* Unlock notify callback */ + sqlite3 *pNextBlocked; /* Next in list of all blocked connections */ +#endif +#ifdef SQLITE_USER_AUTHENTICATION + sqlite3_userauth auth; /* User authentication information */ +#endif +}; + +/* +** A macro to discover the encoding of a database. +*/ +#define SCHEMA_ENC(db) ((db)->aDb[0].pSchema->enc) +#define ENC(db) ((db)->enc) + +/* +** A u64 constant where the lower 32 bits are all zeros. Only the +** upper 32 bits are included in the argument. Necessary because some +** C-compilers still do not accept LL integer literals. +*/ +#define HI(X) ((u64)(X)<<32) + +/* +** Possible values for the sqlite3.flags. +** +** Value constraints (enforced via assert()): +** SQLITE_FullFSync == PAGER_FULLFSYNC +** SQLITE_CkptFullFSync == PAGER_CKPT_FULLFSYNC +** SQLITE_CacheSpill == PAGER_CACHE_SPILL +*/ +#define SQLITE_WriteSchema 0x00000001 /* OK to update SQLITE_MASTER */ +#define SQLITE_LegacyFileFmt 0x00000002 /* Create new databases in format 1 */ +#define SQLITE_FullColNames 0x00000004 /* Show full column names on SELECT */ +#define SQLITE_FullFSync 0x00000008 /* Use full fsync on the backend */ +#define SQLITE_CkptFullFSync 0x00000010 /* Use full fsync for checkpoint */ +#define SQLITE_CacheSpill 0x00000020 /* OK to spill pager cache */ +#define SQLITE_ShortColNames 0x00000040 /* Show short columns names */ +#define SQLITE_TrustedSchema 0x00000080 /* Allow unsafe functions and + ** vtabs in the schema definition */ +#define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */ + /* result set is empty */ +#define SQLITE_IgnoreChecks 0x00000200 /* Do not enforce check constraints */ +#define SQLITE_ReadUncommit 0x00000400 /* READ UNCOMMITTED in shared-cache */ +#define SQLITE_NoCkptOnClose 0x00000800 /* No checkpoint on close()/DETACH */ +#define SQLITE_ReverseOrder 0x00001000 /* Reverse unordered SELECTs */ +#define SQLITE_RecTriggers 0x00002000 /* Enable recursive triggers */ +#define SQLITE_ForeignKeys 0x00004000 /* Enforce foreign key constraints */ +#define SQLITE_AutoIndex 0x00008000 /* Enable automatic indexes */ +#define SQLITE_LoadExtension 0x00010000 /* Enable load_extension */ +#define SQLITE_LoadExtFunc 0x00020000 /* Enable load_extension() SQL func */ +#define SQLITE_EnableTrigger 0x00040000 /* True to enable triggers */ +#define SQLITE_DeferFKs 0x00080000 /* Defer all FK constraints */ +#define SQLITE_QueryOnly 0x00100000 /* Disable database changes */ +#define SQLITE_CellSizeCk 0x00200000 /* Check btree cell sizes on load */ +#define SQLITE_Fts3Tokenizer 0x00400000 /* Enable fts3_tokenizer(2) */ +#define SQLITE_EnableQPSG 0x00800000 /* Query Planner Stability Guarantee*/ +#define SQLITE_TriggerEQP 0x01000000 /* Show trigger EXPLAIN QUERY PLAN */ +#define SQLITE_ResetDatabase 0x02000000 /* Reset the database */ +#define SQLITE_LegacyAlter 0x04000000 /* Legacy ALTER TABLE behaviour */ +#define SQLITE_NoSchemaError 0x08000000 /* Do not report schema parse errors*/ +#define SQLITE_Defensive 0x10000000 /* Input SQL is likely hostile */ +#define SQLITE_DqsDDL 0x20000000 /* dbl-quoted strings allowed in DDL*/ +#define SQLITE_DqsDML 0x40000000 /* dbl-quoted strings allowed in DML*/ +#define SQLITE_EnableView 0x80000000 /* Enable the use of views */ +#define SQLITE_CountRows HI(0x00001) /* Count rows changed by INSERT, */ + /* DELETE, or UPDATE and return */ + /* the count using a callback. */ + +/* Flags used only if debugging */ +#ifdef SQLITE_DEBUG +#define SQLITE_SqlTrace HI(0x0100000) /* Debug print SQL as it executes */ +#define SQLITE_VdbeListing HI(0x0200000) /* Debug listings of VDBE progs */ +#define SQLITE_VdbeTrace HI(0x0400000) /* True to trace VDBE execution */ +#define SQLITE_VdbeAddopTrace HI(0x0800000) /* Trace sqlite3VdbeAddOp() calls */ +#define SQLITE_VdbeEQP HI(0x1000000) /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_ParserTrace HI(0x2000000) /* PRAGMA parser_trace=ON */ +#endif + +/* +** Allowed values for sqlite3.mDbFlags +*/ +#define DBFLAG_SchemaChange 0x0001 /* Uncommitted Hash table changes */ +#define DBFLAG_PreferBuiltin 0x0002 /* Preference to built-in funcs */ +#define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */ +#define DBFLAG_VacuumInto 0x0008 /* Currently running VACUUM INTO */ +#define DBFLAG_SchemaKnownOk 0x0010 /* Schema is known to be valid */ +#define DBFLAG_InternalFunc 0x0020 /* Allow use of internal functions */ +#define DBFLAG_EncodingFixed 0x0040 /* No longer possible to change enc. */ + +/* +** Bits of the sqlite3.dbOptFlags field that are used by the +** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface to +** selectively disable various optimizations. +*/ +#define SQLITE_QueryFlattener 0x0001 /* Query flattening */ +#define SQLITE_WindowFunc 0x0002 /* Use xInverse for window functions */ +#define SQLITE_GroupByOrder 0x0004 /* GROUPBY cover of ORDERBY */ +#define SQLITE_FactorOutConst 0x0008 /* Constant factoring */ +#define SQLITE_DistinctOpt 0x0010 /* DISTINCT using indexes */ +#define SQLITE_CoverIdxScan 0x0020 /* Covering index scans */ +#define SQLITE_OrderByIdxJoin 0x0040 /* ORDER BY of joins via index */ +#define SQLITE_Transitive 0x0080 /* Transitive constraints */ +#define SQLITE_OmitNoopJoin 0x0100 /* Omit unused tables in joins */ +#define SQLITE_CountOfView 0x0200 /* The count-of-view optimization */ +#define SQLITE_CursorHints 0x0400 /* Add OP_CursorHint opcodes */ +#define SQLITE_Stat4 0x0800 /* Use STAT4 data */ + /* TH3 expects the Stat4 ^^^^^^ value to be 0x0800. Don't change it */ +#define SQLITE_PushDown 0x1000 /* The push-down optimization */ +#define SQLITE_SimplifyJoin 0x2000 /* Convert LEFT JOIN to JOIN */ +#define SQLITE_SkipScan 0x4000 /* Skip-scans */ +#define SQLITE_PropagateConst 0x8000 /* The constant propagation opt */ +#define SQLITE_AllOpts 0xffff /* All optimizations */ + +/* +** Macros for testing whether or not optimizations are enabled or disabled. +*/ +#define OptimizationDisabled(db, mask) (((db)->dbOptFlags&(mask))!=0) +#define OptimizationEnabled(db, mask) (((db)->dbOptFlags&(mask))==0) + +/* +** Return true if it OK to factor constant expressions into the initialization +** code. The argument is a Parse object for the code generator. +*/ +#define ConstFactorOk(P) ((P)->okConstFactor) + +/* +** Possible values for the sqlite.magic field. +** The numbers are obtained at random and have no special meaning, other +** than being distinct from one another. +*/ +#define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */ +#define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */ +#define SQLITE_MAGIC_SICK 0x4b771290 /* Error and awaiting close */ +#define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */ +#define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */ +#define SQLITE_MAGIC_ZOMBIE 0x64cffc7f /* Close with last statement close */ + +/* +** Each SQL function is defined by an instance of the following +** structure. For global built-in functions (ex: substr(), max(), count()) +** a pointer to this structure is held in the sqlite3BuiltinFunctions object. +** For per-connection application-defined functions, a pointer to this +** structure is held in the db->aHash hash table. +** +** The u.pHash field is used by the global built-ins. The u.pDestructor +** field is used by per-connection app-def functions. +*/ +struct FuncDef { + i8 nArg; /* Number of arguments. -1 means unlimited */ + u32 funcFlags; /* Some combination of SQLITE_FUNC_* */ + void *pUserData; /* User data parameter */ + FuncDef *pNext; /* Next function with same name */ + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**); /* func or agg-step */ + void (*xFinalize)(sqlite3_context*); /* Agg finalizer */ + void (*xValue)(sqlite3_context*); /* Current agg value */ + void (*xInverse)(sqlite3_context*,int,sqlite3_value**); /* inverse agg-step */ + const char *zName; /* SQL name of the function. */ + union { + FuncDef *pHash; /* Next with a different name but the same hash */ + FuncDestructor *pDestructor; /* Reference counted destructor function */ + } u; +}; + +/* +** This structure encapsulates a user-function destructor callback (as +** configured using create_function_v2()) and a reference counter. When +** create_function_v2() is called to create a function with a destructor, +** a single object of this type is allocated. FuncDestructor.nRef is set to +** the number of FuncDef objects created (either 1 or 3, depending on whether +** or not the specified encoding is SQLITE_ANY). The FuncDef.pDestructor +** member of each of the new FuncDef objects is set to point to the allocated +** FuncDestructor. +** +** Thereafter, when one of the FuncDef objects is deleted, the reference +** count on this object is decremented. When it reaches 0, the destructor +** is invoked and the FuncDestructor structure freed. +*/ +struct FuncDestructor { + int nRef; + void (*xDestroy)(void *); + void *pUserData; +}; + +/* +** Possible values for FuncDef.flags. Note that the _LENGTH and _TYPEOF +** values must correspond to OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG. And +** SQLITE_FUNC_CONSTANT must be the same as SQLITE_DETERMINISTIC. There +** are assert() statements in the code to verify this. +** +** Value constraints (enforced via assert()): +** SQLITE_FUNC_MINMAX == NC_MinMaxAgg == SF_MinMaxAgg +** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG +** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG +** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API +** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API +** SQLITE_FUNC_UNSAFE == SQLITE_INNOCUOUS +** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API +*/ +#define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */ +#define SQLITE_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */ +#define SQLITE_FUNC_CASE 0x0008 /* Case-sensitive LIKE-type function */ +#define SQLITE_FUNC_EPHEM 0x0010 /* Ephemeral. Delete with VDBE */ +#define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/ +#define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */ +#define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */ +#define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */ +/* 0x0200 -- available for reuse */ +#define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */ +#define SQLITE_FUNC_CONSTANT 0x0800 /* Constant inputs give a constant output */ +#define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ +#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a + ** single query - might change over time */ +#define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */ +#define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ +#define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ +#define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ +#define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ +#define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */ +#define SQLITE_FUNC_UNSAFE 0x00200000 /* Function has side effects */ +#define SQLITE_FUNC_INLINE 0x00400000 /* Functions implemented in-line */ + +/* Identifier numbers for each in-line function */ +#define INLINEFUNC_coalesce 0 +#define INLINEFUNC_implies_nonnull_row 1 +#define INLINEFUNC_expr_implies_expr 2 +#define INLINEFUNC_expr_compare 3 +#define INLINEFUNC_affinity 4 +#define INLINEFUNC_iif 5 +#define INLINEFUNC_unlikely 99 /* Default case */ + +/* +** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are +** used to create the initializers for the FuncDef structures. +** +** FUNCTION(zName, nArg, iArg, bNC, xFunc) +** Used to create a scalar function definition of a function zName +** implemented by C function xFunc that accepts nArg arguments. The +** value passed as iArg is cast to a (void*) and made available +** as the user-data (sqlite3_user_data()) for the function. If +** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set. +** +** VFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag. +** +** SFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and +** adds the SQLITE_DIRECTONLY flag. +** +** INLINE_FUNC(zName, nArg, iFuncId, mFlags) +** zName is the name of a function that is implemented by in-line +** byte code rather than by the usual callbacks. The iFuncId +** parameter determines the function id. The mFlags parameter is +** optional SQLITE_FUNC_ flags for this function. +** +** TEST_FUNC(zName, nArg, iFuncId, mFlags) +** zName is the name of a test-only function implemented by in-line +** byte code rather than by the usual callbacks. The iFuncId +** parameter determines the function id. The mFlags parameter is +** optional SQLITE_FUNC_ flags for this function. +** +** DFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and +** adds the SQLITE_FUNC_SLOCHNG flag. Used for date & time functions +** and functions like sqlite_version() that can change, but not during +** a single query. The iArg is ignored. The user-data is always set +** to a NULL pointer. The bNC parameter is not used. +** +** PURE_DATE(zName, nArg, iArg, bNC, xFunc) +** Used for "pure" date/time functions, this macro is like DFUNCTION +** except that it does set the SQLITE_FUNC_CONSTANT flags. iArg is +** ignored and the user-data for these functions is set to an +** arbitrary non-NULL pointer. The bNC parameter is not used. +** +** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal) +** Used to create an aggregate function definition implemented by +** the C functions xStep and xFinal. The first four parameters +** are interpreted in the same way as the first 4 parameters to +** FUNCTION(). +** +** WFUNCTION(zName, nArg, iArg, xStep, xFinal, xValue, xInverse) +** Used to create an aggregate function definition implemented by +** the C functions xStep and xFinal. The first four parameters +** are interpreted in the same way as the first 4 parameters to +** FUNCTION(). +** +** LIKEFUNC(zName, nArg, pArg, flags) +** Used to create a scalar function definition of a function zName +** that accepts nArg arguments and is implemented by a call to C +** function likeFunc. Argument pArg is cast to a (void *) and made +** available as the function user-data (sqlite3_user_data()). The +** FuncDef.flags variable is set to the value passed as the flags +** parameter. +*/ +#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define SFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_UTF8|SQLITE_DIRECTONLY|SQLITE_FUNC_UNSAFE, \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define INLINE_FUNC(zName, nArg, iArg, mFlags) \ + {nArg, SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } +#define TEST_FUNC(zName, nArg, iArg, mFlags) \ + {nArg, SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \ + SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } +#define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \ + 0, 0, xFunc, 0, 0, 0, #zName, {0} } +#define PURE_DATE(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ + (void*)&sqlite3Config, 0, xFunc, 0, 0, 0, #zName, {0} } +#define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \ + {nArg,SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + pArg, 0, xFunc, 0, 0, 0, #zName, } +#define LIKEFUNC(zName, nArg, arg, flags) \ + {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \ + (void *)arg, 0, likeFunc, 0, 0, 0, #zName, {0} } +#define WAGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue, xInverse, f) \ + {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \ + SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xValue,xInverse,#zName, {0}} +#define INTERNAL_FUNCTION(zName, nArg, xFunc) \ + {nArg, SQLITE_FUNC_INTERNAL|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ + 0, 0, xFunc, 0, 0, 0, #zName, {0} } + + +/* +** All current savepoints are stored in a linked list starting at +** sqlite3.pSavepoint. The first element in the list is the most recently +** opened savepoint. Savepoints are added to the list by the vdbe +** OP_Savepoint instruction. +*/ +struct Savepoint { + char *zName; /* Savepoint name (nul-terminated) */ + i64 nDeferredCons; /* Number of deferred fk violations */ + i64 nDeferredImmCons; /* Number of deferred imm fk. */ + Savepoint *pNext; /* Parent savepoint (if any) */ +}; + +/* +** The following are used as the second parameter to sqlite3Savepoint(), +** and as the P1 argument to the OP_Savepoint instruction. +*/ +#define SAVEPOINT_BEGIN 0 +#define SAVEPOINT_RELEASE 1 +#define SAVEPOINT_ROLLBACK 2 + + +/* +** Each SQLite module (virtual table definition) is defined by an +** instance of the following structure, stored in the sqlite3.aModule +** hash table. +*/ +struct Module { + const sqlite3_module *pModule; /* Callback pointers */ + const char *zName; /* Name passed to create_module() */ + int nRefModule; /* Number of pointers to this object */ + void *pAux; /* pAux passed to create_module() */ + void (*xDestroy)(void *); /* Module destructor function */ + Table *pEpoTab; /* Eponymous table for this module */ +}; + +/* +** Information about each column of an SQL table is held in an instance +** of the Column structure, in the Table.aCol[] array. +** +** Definitions: +** +** "table column index" This is the index of the column in the +** Table.aCol[] array, and also the index of +** the column in the original CREATE TABLE stmt. +** +** "storage column index" This is the index of the column in the +** record BLOB generated by the OP_MakeRecord +** opcode. The storage column index is less than +** or equal to the table column index. It is +** equal if and only if there are no VIRTUAL +** columns to the left. +*/ +struct Column { + char *zName; /* Name of this column, \000, then the type */ + Expr *pDflt; /* Default value or GENERATED ALWAYS AS value */ + char *zColl; /* Collating sequence. If NULL, use the default */ + u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ + char affinity; /* One of the SQLITE_AFF_... values */ + u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */ + u8 hName; /* Column name hash for faster lookup */ + u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */ +}; + +/* Allowed values for Column.colFlags: +*/ +#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ +#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ +#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */ +#define COLFLAG_UNIQUE 0x0008 /* Column def contains "UNIQUE" or "PK" */ +#define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */ +#define COLFLAG_VIRTUAL 0x0020 /* GENERATED ALWAYS AS ... VIRTUAL */ +#define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */ +#define COLFLAG_NOTAVAIL 0x0080 /* STORED column not yet calculated */ +#define COLFLAG_BUSY 0x0100 /* Blocks recursion on GENERATED columns */ +#define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ +#define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ + +/* +** A "Collating Sequence" is defined by an instance of the following +** structure. Conceptually, a collating sequence consists of a name and +** a comparison routine that defines the order of that sequence. +** +** If CollSeq.xCmp is NULL, it means that the +** collating sequence is undefined. Indices built on an undefined +** collating sequence may not be read or written. +*/ +struct CollSeq { + char *zName; /* Name of the collating sequence, UTF-8 encoded */ + u8 enc; /* Text encoding handled by xCmp() */ + void *pUser; /* First argument to xCmp() */ + int (*xCmp)(void*,int, const void*, int, const void*); + void (*xDel)(void*); /* Destructor for pUser */ +}; + +/* +** A sort order can be either ASC or DESC. +*/ +#define SQLITE_SO_ASC 0 /* Sort in ascending order */ +#define SQLITE_SO_DESC 1 /* Sort in ascending order */ +#define SQLITE_SO_UNDEFINED -1 /* No sort order specified */ + +/* +** Column affinity types. +** +** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and +** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve +** the speed a little by numbering the values consecutively. +** +** But rather than start with 0 or 1, we begin with 'A'. That way, +** when multiple affinity types are concatenated into a string and +** used as the P4 operand, they will be more readable. +** +** Note also that the numeric types are grouped together so that testing +** for a numeric type is a single comparison. And the BLOB type is first. +*/ +#define SQLITE_AFF_NONE 0x40 /* '@' */ +#define SQLITE_AFF_BLOB 0x41 /* 'A' */ +#define SQLITE_AFF_TEXT 0x42 /* 'B' */ +#define SQLITE_AFF_NUMERIC 0x43 /* 'C' */ +#define SQLITE_AFF_INTEGER 0x44 /* 'D' */ +#define SQLITE_AFF_REAL 0x45 /* 'E' */ + +#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) + +/* +** The SQLITE_AFF_MASK values masks off the significant bits of an +** affinity value. +*/ +#define SQLITE_AFF_MASK 0x47 + +/* +** Additional bit values that can be ORed with an affinity without +** changing the affinity. +** +** The SQLITE_NOTNULL flag is a combination of NULLEQ and JUMPIFNULL. +** It causes an assert() to fire if either operand to a comparison +** operator is NULL. It is added to certain comparison operators to +** prove that the operands are always NOT NULL. +*/ +#define SQLITE_KEEPNULL 0x08 /* Used by vector == or <> */ +#define SQLITE_JUMPIFNULL 0x10 /* jumps if either operand is NULL */ +#define SQLITE_STOREP2 0x20 /* Store result in reg[P2] rather than jump */ +#define SQLITE_NULLEQ 0x80 /* NULL=NULL */ +#define SQLITE_NOTNULL 0x90 /* Assert that operands are never NULL */ + +/* +** An object of this type is created for each virtual table present in +** the database schema. +** +** If the database schema is shared, then there is one instance of this +** structure for each database connection (sqlite3*) that uses the shared +** schema. This is because each database connection requires its own unique +** instance of the sqlite3_vtab* handle used to access the virtual table +** implementation. sqlite3_vtab* handles can not be shared between +** database connections, even when the rest of the in-memory database +** schema is shared, as the implementation often stores the database +** connection handle passed to it via the xConnect() or xCreate() method +** during initialization internally. This database connection handle may +** then be used by the virtual table implementation to access real tables +** within the database. So that they appear as part of the callers +** transaction, these accesses need to be made via the same database +** connection as that used to execute SQL operations on the virtual table. +** +** All VTable objects that correspond to a single table in a shared +** database schema are initially stored in a linked-list pointed to by +** the Table.pVTable member variable of the corresponding Table object. +** When an sqlite3_prepare() operation is required to access the virtual +** table, it searches the list for the VTable that corresponds to the +** database connection doing the preparing so as to use the correct +** sqlite3_vtab* handle in the compiled query. +** +** When an in-memory Table object is deleted (for example when the +** schema is being reloaded for some reason), the VTable objects are not +** deleted and the sqlite3_vtab* handles are not xDisconnect()ed +** immediately. Instead, they are moved from the Table.pVTable list to +** another linked list headed by the sqlite3.pDisconnect member of the +** corresponding sqlite3 structure. They are then deleted/xDisconnected +** next time a statement is prepared using said sqlite3*. This is done +** to avoid deadlock issues involving multiple sqlite3.mutex mutexes. +** Refer to comments above function sqlite3VtabUnlockList() for an +** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect +** list without holding the corresponding sqlite3.mutex mutex. +** +** The memory for objects of this type is always allocated by +** sqlite3DbMalloc(), using the connection handle stored in VTable.db as +** the first argument. +*/ +struct VTable { + sqlite3 *db; /* Database connection associated with this table */ + Module *pMod; /* Pointer to module implementation */ + sqlite3_vtab *pVtab; /* Pointer to vtab instance */ + int nRef; /* Number of pointers to this structure */ + u8 bConstraint; /* True if constraints are supported */ + u8 eVtabRisk; /* Riskiness of allowing hacker access */ + int iSavepoint; /* Depth of the SAVEPOINT stack */ + VTable *pNext; /* Next in linked list (see above) */ +}; + +/* Allowed values for VTable.eVtabRisk +*/ +#define SQLITE_VTABRISK_Low 0 +#define SQLITE_VTABRISK_Normal 1 +#define SQLITE_VTABRISK_High 2 + +/* +** The schema for each SQL table and view is represented in memory +** by an instance of the following structure. +*/ +struct Table { + char *zName; /* Name of the table or view */ + Column *aCol; /* Information about each column */ + Index *pIndex; /* List of SQL indexes on this table. */ + Select *pSelect; /* NULL for tables. Points to definition if a view. */ + FKey *pFKey; /* Linked list of all foreign keys in this table */ + char *zColAff; /* String defining the affinity of each column */ + ExprList *pCheck; /* All CHECK constraints */ + /* ... also used as column name list in a VIEW */ + int tnum; /* Root BTree page for this table */ + u32 nTabRef; /* Number of pointers to this Table */ + u32 tabFlags; /* Mask of TF_* values */ + i16 iPKey; /* If not negative, use aCol[iPKey] as the rowid */ + i16 nCol; /* Number of columns in this table */ + i16 nNVCol; /* Number of columns that are not VIRTUAL */ + LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ + LogEst szTabRow; /* Estimated size of each table row in bytes */ +#ifdef SQLITE_ENABLE_COSTMULT + LogEst costMult; /* Cost multiplier for using this table */ +#endif + u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ +#ifndef SQLITE_OMIT_ALTERTABLE + int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + int nModuleArg; /* Number of arguments to the module */ + char **azModuleArg; /* 0: module 1: schema 2: vtab name 3...: args */ + VTable *pVTable; /* List of VTable objects. */ +#endif + Trigger *pTrigger; /* List of triggers stored in pSchema */ + Schema *pSchema; /* Schema that contains this table */ + Table *pNextZombie; /* Next on the Parse.pZombieTab list */ +}; + +/* +** Allowed values for Table.tabFlags. +** +** TF_OOOHidden applies to tables or view that have hidden columns that are +** followed by non-hidden columns. Example: "CREATE VIRTUAL TABLE x USING +** vtab1(a HIDDEN, b);". Since "b" is a non-hidden column but "a" is hidden, +** the TF_OOOHidden attribute would apply in this case. Such tables require +** special handling during INSERT processing. The "OOO" means "Out Of Order". +** +** Constraints: +** +** TF_HasVirtual == COLFLAG_Virtual +** TF_HasStored == COLFLAG_Stored +*/ +#define TF_Readonly 0x0001 /* Read-only system table */ +#define TF_Ephemeral 0x0002 /* An ephemeral table */ +#define TF_HasPrimaryKey 0x0004 /* Table has a primary key */ +#define TF_Autoincrement 0x0008 /* Integer primary key is autoincrement */ +#define TF_HasStat1 0x0010 /* nRowLogEst set from sqlite_stat1 */ +#define TF_HasVirtual 0x0020 /* Has one or more VIRTUAL columns */ +#define TF_HasStored 0x0040 /* Has one or more STORED columns */ +#define TF_HasGenerated 0x0060 /* Combo: HasVirtual + HasStored */ +#define TF_WithoutRowid 0x0080 /* No rowid. PRIMARY KEY is the key */ +#define TF_StatsUsed 0x0100 /* Query planner decisions affected by + ** Index.aiRowLogEst[] values */ +#define TF_NoVisibleRowid 0x0200 /* No user-visible "rowid" column */ +#define TF_OOOHidden 0x0400 /* Out-of-Order hidden columns */ +#define TF_HasNotNull 0x0800 /* Contains NOT NULL constraints */ +#define TF_Shadow 0x1000 /* True for a shadow table */ + +/* +** Test to see whether or not a table is a virtual table. This is +** done as a macro so that it will be optimized out when virtual +** table support is omitted from the build. +*/ +#ifndef SQLITE_OMIT_VIRTUALTABLE +# define IsVirtual(X) ((X)->nModuleArg) +# define ExprIsVtab(X) \ + ((X)->op==TK_COLUMN && (X)->y.pTab!=0 && (X)->y.pTab->nModuleArg) +#else +# define IsVirtual(X) 0 +# define ExprIsVtab(X) 0 +#endif + +/* +** Macros to determine if a column is hidden. IsOrdinaryHiddenColumn() +** only works for non-virtual tables (ordinary tables and views) and is +** always false unless SQLITE_ENABLE_HIDDEN_COLUMNS is defined. The +** IsHiddenColumn() macro is general purpose. +*/ +#if defined(SQLITE_ENABLE_HIDDEN_COLUMNS) +# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +# define IsOrdinaryHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +#elif !defined(SQLITE_OMIT_VIRTUALTABLE) +# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +# define IsOrdinaryHiddenColumn(X) 0 +#else +# define IsHiddenColumn(X) 0 +# define IsOrdinaryHiddenColumn(X) 0 +#endif + + +/* Does the table have a rowid */ +#define HasRowid(X) (((X)->tabFlags & TF_WithoutRowid)==0) +#define VisibleRowid(X) (((X)->tabFlags & TF_NoVisibleRowid)==0) + +/* +** Each foreign key constraint is an instance of the following structure. +** +** A foreign key is associated with two tables. The "from" table is +** the table that contains the REFERENCES clause that creates the foreign +** key. The "to" table is the table that is named in the REFERENCES clause. +** Consider this example: +** +** CREATE TABLE ex1( +** a INTEGER PRIMARY KEY, +** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x) +** ); +** +** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2". +** Equivalent names: +** +** from-table == child-table +** to-table == parent-table +** +** Each REFERENCES clause generates an instance of the following structure +** which is attached to the from-table. The to-table need not exist when +** the from-table is created. The existence of the to-table is not checked. +** +** The list of all parents for child Table X is held at X.pFKey. +** +** A list of all children for a table named Z (which might not even exist) +** is held in Schema.fkeyHash with a hash key of Z. +*/ +struct FKey { + Table *pFrom; /* Table containing the REFERENCES clause (aka: Child) */ + FKey *pNextFrom; /* Next FKey with the same in pFrom. Next parent of pFrom */ + char *zTo; /* Name of table that the key points to (aka: Parent) */ + FKey *pNextTo; /* Next with the same zTo. Next child of zTo. */ + FKey *pPrevTo; /* Previous with the same zTo */ + int nCol; /* Number of columns in this key */ + /* EV: R-30323-21917 */ + u8 isDeferred; /* True if constraint checking is deferred till COMMIT */ + u8 aAction[2]; /* ON DELETE and ON UPDATE actions, respectively */ + Trigger *apTrigger[2];/* Triggers for aAction[] actions */ + struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ + int iFrom; /* Index of column in pFrom */ + char *zCol; /* Name of column in zTo. If NULL use PRIMARY KEY */ + } aCol[1]; /* One entry for each of nCol columns */ +}; + +/* +** SQLite supports many different ways to resolve a constraint +** error. ROLLBACK processing means that a constraint violation +** causes the operation in process to fail and for the current transaction +** to be rolled back. ABORT processing means the operation in process +** fails and any prior changes from that one operation are backed out, +** but the transaction is not rolled back. FAIL processing means that +** the operation in progress stops and returns an error code. But prior +** changes due to the same operation are not backed out and no rollback +** occurs. IGNORE means that the particular row that caused the constraint +** error is not inserted or updated. Processing continues and no error +** is returned. REPLACE means that preexisting database rows that caused +** a UNIQUE constraint violation are removed so that the new insert or +** update can proceed. Processing continues and no error is reported. +** +** RESTRICT, SETNULL, and CASCADE actions apply only to foreign keys. +** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the +** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign +** key is set to NULL. CASCADE means that a DELETE or UPDATE of the +** referenced table row is propagated into the row that holds the +** foreign key. +** +** The following symbolic values are used to record which type +** of action to take. +*/ +#define OE_None 0 /* There is no constraint to check */ +#define OE_Rollback 1 /* Fail the operation and rollback the transaction */ +#define OE_Abort 2 /* Back out changes but do no rollback transaction */ +#define OE_Fail 3 /* Stop the operation but leave all prior changes */ +#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ +#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ +#define OE_Update 6 /* Process as a DO UPDATE in an upsert */ +#define OE_Restrict 7 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ +#define OE_SetNull 8 /* Set the foreign key value to NULL */ +#define OE_SetDflt 9 /* Set the foreign key value to its default */ +#define OE_Cascade 10 /* Cascade the changes */ +#define OE_Default 11 /* Do whatever the default action is */ + + +/* +** An instance of the following structure is passed as the first +** argument to sqlite3VdbeKeyCompare and is used to control the +** comparison of the two index keys. +** +** Note that aSortOrder[] and aColl[] have nField+1 slots. There +** are nField slots for the columns of an index then one extra slot +** for the rowid at the end. +*/ +struct KeyInfo { + u32 nRef; /* Number of references to this KeyInfo object */ + u8 enc; /* Text encoding - one of the SQLITE_UTF* values */ + u16 nKeyField; /* Number of key columns in the index */ + u16 nAllField; /* Total columns, including key plus others */ + sqlite3 *db; /* The database connection */ + u8 *aSortFlags; /* Sort order for each column. */ + CollSeq *aColl[1]; /* Collating sequence for each term of the key */ +}; + +/* +** Allowed bit values for entries in the KeyInfo.aSortFlags[] array. +*/ +#define KEYINFO_ORDER_DESC 0x01 /* DESC sort order */ +#define KEYINFO_ORDER_BIGNULL 0x02 /* NULL is larger than any other value */ + +/* +** This object holds a record which has been parsed out into individual +** fields, for the purposes of doing a comparison. +** +** A record is an object that contains one or more fields of data. +** Records are used to store the content of a table row and to store +** the key of an index. A blob encoding of a record is created by +** the OP_MakeRecord opcode of the VDBE and is disassembled by the +** OP_Column opcode. +** +** An instance of this object serves as a "key" for doing a search on +** an index b+tree. The goal of the search is to find the entry that +** is closed to the key described by this object. This object might hold +** just a prefix of the key. The number of fields is given by +** pKeyInfo->nField. +** +** The r1 and r2 fields are the values to return if this key is less than +** or greater than a key in the btree, respectively. These are normally +** -1 and +1 respectively, but might be inverted to +1 and -1 if the b-tree +** is in DESC order. +** +** The key comparison functions actually return default_rc when they find +** an equals comparison. default_rc can be -1, 0, or +1. If there are +** multiple entries in the b-tree with the same key (when only looking +** at the first pKeyInfo->nFields,) then default_rc can be set to -1 to +** cause the search to find the last match, or +1 to cause the search to +** find the first match. +** +** The key comparison functions will set eqSeen to true if they ever +** get and equal results when comparing this structure to a b-tree record. +** When default_rc!=0, the search might end up on the record immediately +** before the first match or immediately after the last match. The +** eqSeen field will indicate whether or not an exact match exists in the +** b-tree. +*/ +struct UnpackedRecord { + KeyInfo *pKeyInfo; /* Collation and sort-order information */ + Mem *aMem; /* Values */ + u16 nField; /* Number of entries in apMem[] */ + i8 default_rc; /* Comparison result if keys are equal */ + u8 errCode; /* Error detected by xRecordCompare (CORRUPT or NOMEM) */ + i8 r1; /* Value to return if (lhs < rhs) */ + i8 r2; /* Value to return if (lhs > rhs) */ + u8 eqSeen; /* True if an equality comparison has been seen */ +}; + + +/* +** Each SQL index is represented in memory by an +** instance of the following structure. +** +** The columns of the table that are to be indexed are described +** by the aiColumn[] field of this structure. For example, suppose +** we have the following table and index: +** +** CREATE TABLE Ex1(c1 int, c2 int, c3 text); +** CREATE INDEX Ex2 ON Ex1(c3,c1); +** +** In the Table structure describing Ex1, nCol==3 because there are +** three columns in the table. In the Index structure describing +** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. +** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the +** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. +** The second column to be indexed (c1) has an index of 0 in +** Ex1.aCol[], hence Ex2.aiColumn[1]==0. +** +** The Index.onError field determines whether or not the indexed columns +** must be unique and what to do if they are not. When Index.onError=OE_None, +** it means this is not a unique index. Otherwise it is a unique index +** and the value of Index.onError indicate the which conflict resolution +** algorithm to employ whenever an attempt is made to insert a non-unique +** element. +** +** While parsing a CREATE TABLE or CREATE INDEX statement in order to +** generate VDBE code (as opposed to parsing one read from an sqlite_master +** table as part of parsing an existing database schema), transient instances +** of this structure may be created. In this case the Index.tnum variable is +** used to store the address of a VDBE instruction, not a database page +** number (it cannot - the database page is not allocated until the VDBE +** program is executed). See convertToWithoutRowidTable() for details. +*/ +struct Index { + char *zName; /* Name of this index */ + i16 *aiColumn; /* Which columns are used by this index. 1st is 0 */ + LogEst *aiRowLogEst; /* From ANALYZE: Est. rows selected by each column */ + Table *pTable; /* The SQL table being indexed */ + char *zColAff; /* String defining the affinity of each column */ + Index *pNext; /* The next index associated with the same table */ + Schema *pSchema; /* Schema containing this index */ + u8 *aSortOrder; /* for each column: True==DESC, False==ASC */ + const char **azColl; /* Array of collation sequence names for index */ + Expr *pPartIdxWhere; /* WHERE clause for partial indices */ + ExprList *aColExpr; /* Column expressions */ + int tnum; /* DB Page containing root of this index */ + LogEst szIdxRow; /* Estimated average row size in bytes */ + u16 nKeyCol; /* Number of columns forming the key */ + u16 nColumn; /* Number of columns stored in the index */ + u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + unsigned idxType:2; /* 0:Normal 1:UNIQUE, 2:PRIMARY KEY, 3:IPK */ + unsigned bUnordered:1; /* Use this index for == or IN queries only */ + unsigned uniqNotNull:1; /* True if UNIQUE and NOT NULL for all columns */ + unsigned isResized:1; /* True if resizeIndexObject() has been called */ + unsigned isCovering:1; /* True if this is a covering index */ + unsigned noSkipScan:1; /* Do not try to use skip-scan if true */ + unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */ + unsigned bNoQuery:1; /* Do not use this index to optimize queries */ + unsigned bAscKeyBug:1; /* True if the bba7b69f9849b5bf bug applies */ + unsigned bHasVCol:1; /* Index references one or more VIRTUAL columns */ +#ifdef SQLITE_ENABLE_STAT4 + int nSample; /* Number of elements in aSample[] */ + int nSampleCol; /* Size of IndexSample.anEq[] and so on */ + tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */ + IndexSample *aSample; /* Samples of the left-most key */ + tRowcnt *aiRowEst; /* Non-logarithmic stat1 data for this index */ + tRowcnt nRowEst0; /* Non-logarithmic number of rows in the index */ +#endif + Bitmask colNotIdxed; /* 0 for unindexed columns in pTab */ +}; + +/* +** Allowed values for Index.idxType +*/ +#define SQLITE_IDXTYPE_APPDEF 0 /* Created using CREATE INDEX */ +#define SQLITE_IDXTYPE_UNIQUE 1 /* Implements a UNIQUE constraint */ +#define SQLITE_IDXTYPE_PRIMARYKEY 2 /* Is the PRIMARY KEY for the table */ +#define SQLITE_IDXTYPE_IPK 3 /* INTEGER PRIMARY KEY index */ + +/* Return true if index X is a PRIMARY KEY index */ +#define IsPrimaryKeyIndex(X) ((X)->idxType==SQLITE_IDXTYPE_PRIMARYKEY) + +/* Return true if index X is a UNIQUE index */ +#define IsUniqueIndex(X) ((X)->onError!=OE_None) + +/* The Index.aiColumn[] values are normally positive integer. But +** there are some negative values that have special meaning: +*/ +#define XN_ROWID (-1) /* Indexed column is the rowid */ +#define XN_EXPR (-2) /* Indexed column is an expression */ + +/* +** Each sample stored in the sqlite_stat4 table is represented in memory +** using a structure of this type. See documentation at the top of the +** analyze.c source file for additional information. +*/ +struct IndexSample { + void *p; /* Pointer to sampled record */ + int n; /* Size of record in bytes */ + tRowcnt *anEq; /* Est. number of rows where the key equals this sample */ + tRowcnt *anLt; /* Est. number of rows where key is less than this sample */ + tRowcnt *anDLt; /* Est. number of distinct keys less than this sample */ +}; + +/* +** Possible values to use within the flags argument to sqlite3GetToken(). +*/ +#define SQLITE_TOKEN_QUOTED 0x1 /* Token is a quoted identifier. */ +#define SQLITE_TOKEN_KEYWORD 0x2 /* Token is a keyword. */ + +/* +** Each token coming out of the lexer is an instance of +** this structure. Tokens are also used as part of an expression. +** +** The memory that "z" points to is owned by other objects. Take care +** that the owner of the "z" string does not deallocate the string before +** the Token goes out of scope! Very often, the "z" points to some place +** in the middle of the Parse.zSql text. But it might also point to a +** static string. +*/ +struct Token { + const char *z; /* Text of the token. Not NULL-terminated! */ + unsigned int n; /* Number of characters in this token */ +}; + +/* +** An instance of this structure contains information needed to generate +** code for a SELECT that contains aggregate functions. +** +** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a +** pointer to this structure. The Expr.iAgg field is the index in +** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate +** code for that node. +** +** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the +** original Select structure that describes the SELECT statement. These +** fields do not need to be freed when deallocating the AggInfo structure. +*/ +struct AggInfo { + u8 directMode; /* Direct rendering mode means take data directly + ** from source tables rather than from accumulators */ + u8 useSortingIdx; /* In direct mode, reference the sorting index rather + ** than the source table */ + int sortingIdx; /* Cursor number of the sorting index */ + int sortingIdxPTab; /* Cursor number of pseudo-table */ + int nSortingColumn; /* Number of columns in the sorting index */ + int mnReg, mxReg; /* Range of registers allocated for aCol and aFunc */ + ExprList *pGroupBy; /* The group by clause */ + struct AggInfo_col { /* For each column used in source tables */ + Table *pTab; /* Source table */ + Expr *pExpr; /* The original expression */ + int iTable; /* Cursor number of the source table */ + int iMem; /* Memory location that acts as accumulator */ + i16 iColumn; /* Column number within the source table */ + i16 iSorterColumn; /* Column number in the sorting index */ + } *aCol; + int nColumn; /* Number of used entries in aCol[] */ + int nAccumulator; /* Number of columns that show through to the output. + ** Additional columns are used only as parameters to + ** aggregate functions */ + struct AggInfo_func { /* For each aggregate function */ + Expr *pExpr; /* Expression encoding the function */ + FuncDef *pFunc; /* The aggregate function implementation */ + int iMem; /* Memory location that acts as accumulator */ + int iDistinct; /* Ephemeral table used to enforce DISTINCT */ + } *aFunc; + int nFunc; /* Number of entries in aFunc[] */ +#ifdef SQLITE_DEBUG + int iAggMagic; /* Magic number when valid */ +#endif + AggInfo *pNext; /* Next in list of them all */ +}; + +/* +** Value for AggInfo.iAggMagic when the structure is valid +*/ +#define AggInfoMagic 0x2059e99e + +/* +** The datatype ynVar is a signed integer, either 16-bit or 32-bit. +** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater +** than 32767 we have to make it 32-bit. 16-bit is preferred because +** it uses less memory in the Expr object, which is a big memory user +** in systems with lots of prepared statements. And few applications +** need more than about 10 or 20 variables. But some extreme users want +** to have prepared statements with over 32766 variables, and for them +** the option is available (at compile-time). +*/ +#if SQLITE_MAX_VARIABLE_NUMBER<32767 +typedef i16 ynVar; +#else +typedef int ynVar; +#endif + +/* +** Each node of an expression in the parse tree is an instance +** of this structure. +** +** Expr.op is the opcode. The integer parser token codes are reused +** as opcodes here. For example, the parser defines TK_GE to be an integer +** code representing the ">=" operator. This same integer code is reused +** to represent the greater-than-or-equal-to operator in the expression +** tree. +** +** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, +** or TK_STRING), then Expr.token contains the text of the SQL literal. If +** the expression is a variable (TK_VARIABLE), then Expr.token contains the +** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), +** then Expr.token contains the name of the function. +** +** Expr.pRight and Expr.pLeft are the left and right subexpressions of a +** binary operator. Either or both may be NULL. +** +** Expr.x.pList is a list of arguments if the expression is an SQL function, +** a CASE expression or an IN expression of the form " IN (, ...)". +** Expr.x.pSelect is used if the expression is a sub-select or an expression of +** the form " IN (SELECT ...)". If the EP_xIsSelect bit is set in the +** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is +** valid. +** +** An expression of the form ID or ID.ID refers to a column in a table. +** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is +** the integer cursor number of a VDBE cursor pointing to that table and +** Expr.iColumn is the column number for the specific column. If the +** expression is used as a result in an aggregate SELECT, then the +** value is also stored in the Expr.iAgg column in the aggregate so that +** it can be accessed after all aggregates are computed. +** +** If the expression is an unbound variable marker (a question mark +** character '?' in the original SQL) then the Expr.iTable holds the index +** number for that variable. +** +** If the expression is a subquery then Expr.iColumn holds an integer +** register number containing the result of the subquery. If the +** subquery gives a constant result, then iTable is -1. If the subquery +** gives a different answer at different times during statement processing +** then iTable is the address of a subroutine that computes the subquery. +** +** If the Expr is of type OP_Column, and the table it is selecting from +** is a disk table or the "old.*" pseudo-table, then pTab points to the +** corresponding table definition. +** +** ALLOCATION NOTES: +** +** Expr objects can use a lot of memory space in database schema. To +** help reduce memory requirements, sometimes an Expr object will be +** truncated. And to reduce the number of memory allocations, sometimes +** two or more Expr objects will be stored in a single memory allocation, +** together with Expr.zToken strings. +** +** If the EP_Reduced and EP_TokenOnly flags are set when +** an Expr object is truncated. When EP_Reduced is set, then all +** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees +** are contained within the same memory allocation. Note, however, that +** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately +** allocated, regardless of whether or not EP_Reduced is set. +*/ +struct Expr { + u8 op; /* Operation performed by this node */ + char affExpr; /* affinity, or RAISE type */ + u8 op2; /* TK_REGISTER/TK_TRUTH: original value of Expr.op + ** TK_COLUMN: the value of p5 for OP_Column + ** TK_AGG_FUNCTION: nesting depth + ** TK_FUNCTION: NC_SelfRef flag if needs OP_PureFunc */ +#ifdef SQLITE_DEBUG + u8 vvaFlags; /* Verification flags. */ +#endif + u32 flags; /* Various flags. EP_* See below */ + union { + char *zToken; /* Token value. Zero terminated and dequoted */ + int iValue; /* Non-negative integer value if EP_IntValue */ + } u; + + /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no + ** space is allocated for the fields below this point. An attempt to + ** access them will result in a segfault or malfunction. + *********************************************************************/ + + Expr *pLeft; /* Left subnode */ + Expr *pRight; /* Right subnode */ + union { + ExprList *pList; /* op = IN, EXISTS, SELECT, CASE, FUNCTION, BETWEEN */ + Select *pSelect; /* EP_xIsSelect and op = IN, EXISTS, SELECT */ + } x; + + /* If the EP_Reduced flag is set in the Expr.flags mask, then no + ** space is allocated for the fields below this point. An attempt to + ** access them will result in a segfault or malfunction. + *********************************************************************/ + +#if SQLITE_MAX_EXPR_DEPTH>0 + int nHeight; /* Height of the tree headed by this node */ +#endif + int iTable; /* TK_COLUMN: cursor number of table holding column + ** TK_REGISTER: register number + ** TK_TRIGGER: 1 -> new, 0 -> old + ** EP_Unlikely: 134217728 times likelihood + ** TK_IN: ephemerial table holding RHS + ** TK_SELECT_COLUMN: Number of columns on the LHS + ** TK_SELECT: 1st register of result vector */ + ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid. + ** TK_VARIABLE: variable number (always >= 1). + ** TK_SELECT_COLUMN: column of the result vector */ + i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ + i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */ + AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ + union { + Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL + ** for a column of an index on an expression */ + Window *pWin; /* EP_WinFunc: Window/Filter defn for a function */ + struct { /* TK_IN, TK_SELECT, and TK_EXISTS */ + int iAddr; /* Subroutine entry address */ + int regReturn; /* Register used to hold return address */ + } sub; + } y; +}; + +/* +** The following are the meanings of bits in the Expr.flags field. +** Value restrictions: +** +** EP_Agg == NC_HasAgg == SF_HasAgg +** EP_Win == NC_HasWin +*/ +#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ +#define EP_Distinct 0x000002 /* Aggregate function with DISTINCT keyword */ +#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ +#define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */ +#define EP_Agg 0x000010 /* Contains one or more aggregate functions */ +#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ +#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ +#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ +#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ +#define EP_Commuted 0x000200 /* Comparison operator has been commuted */ +#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ +#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ +#define EP_Skip 0x001000 /* Operator does not contribute to affinity */ +#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ +#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ +#define EP_Win 0x008000 /* Contains window functions */ +#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ + /* 0x020000 // available for reuse */ +#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ +#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ +#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ +#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ +#define EP_Alias 0x400000 /* Is an alias for a result set column */ +#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ +#define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ +#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ +#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ +#define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ +#define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ +#define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ +#define EP_FromDDL 0x40000000 /* Originates from sqlite_master */ + /* 0x80000000 // Available */ + +/* +** The EP_Propagate mask is a set of properties that automatically propagate +** upwards into parent nodes. +*/ +#define EP_Propagate (EP_Collate|EP_Subquery|EP_HasFunc) + +/* +** These macros can be used to test, set, or clear bits in the +** Expr.flags field. +*/ +#define ExprHasProperty(E,P) (((E)->flags&(P))!=0) +#define ExprHasAllProperty(E,P) (((E)->flags&(P))==(P)) +#define ExprSetProperty(E,P) (E)->flags|=(P) +#define ExprClearProperty(E,P) (E)->flags&=~(P) +#define ExprAlwaysTrue(E) (((E)->flags&(EP_FromJoin|EP_IsTrue))==EP_IsTrue) +#define ExprAlwaysFalse(E) (((E)->flags&(EP_FromJoin|EP_IsFalse))==EP_IsFalse) + + +/* Flags for use with Expr.vvaFlags +*/ +#define EP_NoReduce 0x01 /* Cannot EXPRDUP_REDUCE this Expr */ +#define EP_Immutable 0x02 /* Do not change this Expr node */ + +/* The ExprSetVVAProperty() macro is used for Verification, Validation, +** and Accreditation only. It works like ExprSetProperty() during VVA +** processes but is a no-op for delivery. +*/ +#ifdef SQLITE_DEBUG +# define ExprSetVVAProperty(E,P) (E)->vvaFlags|=(P) +# define ExprHasVVAProperty(E,P) (((E)->vvaFlags&(P))!=0) +# define ExprClearVVAProperties(E) (E)->vvaFlags = 0 +#else +# define ExprSetVVAProperty(E,P) +# define ExprHasVVAProperty(E,P) 0 +# define ExprClearVVAProperties(E) +#endif + +/* +** Macros to determine the number of bytes required by a normal Expr +** struct, an Expr struct with the EP_Reduced flag set in Expr.flags +** and an Expr struct with the EP_TokenOnly flag set. +*/ +#define EXPR_FULLSIZE sizeof(Expr) /* Full size */ +#define EXPR_REDUCEDSIZE offsetof(Expr,iTable) /* Common features */ +#define EXPR_TOKENONLYSIZE offsetof(Expr,pLeft) /* Fewer features */ + +/* +** Flags passed to the sqlite3ExprDup() function. See the header comment +** above sqlite3ExprDup() for details. +*/ +#define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */ + +/* +** True if the expression passed as an argument was a function with +** an OVER() clause (a window function). +*/ +#ifdef SQLITE_OMIT_WINDOWFUNC +# define IsWindowFunc(p) 0 +#else +# define IsWindowFunc(p) ( \ + ExprHasProperty((p), EP_WinFunc) && p->y.pWin->eFrmType!=TK_FILTER \ + ) +#endif + +/* +** A list of expressions. Each expression may optionally have a +** name. An expr/name combination can be used in several ways, such +** as the list of "expr AS ID" fields following a "SELECT" or in the +** list of "ID = expr" items in an UPDATE. A list of expressions can +** also be used as the argument to a function, in which case the a.zName +** field is not used. +** +** In order to try to keep memory usage down, the Expr.a.zEName field +** is used for multiple purposes: +** +** eEName Usage +** ---------- ------------------------- +** ENAME_NAME (1) the AS of result set column +** (2) COLUMN= of an UPDATE +** +** ENAME_TAB DB.TABLE.NAME used to resolve names +** of subqueries +** +** ENAME_SPAN Text of the original result set +** expression. +*/ +struct ExprList { + int nExpr; /* Number of expressions on the list */ + struct ExprList_item { /* For each expression in the list */ + Expr *pExpr; /* The parse tree for this expression */ + char *zEName; /* Token associated with this expression */ + u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ + unsigned eEName :2; /* Meaning of zEName */ + unsigned done :1; /* A flag to indicate when processing is finished */ + unsigned reusable :1; /* Constant expression is reusable */ + unsigned bSorterRef :1; /* Defer evaluation until after sorting */ + unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */ + union { + struct { + u16 iOrderByCol; /* For ORDER BY, column number in result set */ + u16 iAlias; /* Index into Parse.aAlias[] for zName */ + } x; + int iConstExprReg; /* Register in which Expr value is cached */ + } u; + } a[1]; /* One slot for each expression in the list */ +}; + +/* +** Allowed values for Expr.a.eEName +*/ +#define ENAME_NAME 0 /* The AS clause of a result set */ +#define ENAME_SPAN 1 /* Complete text of the result set expression */ +#define ENAME_TAB 2 /* "DB.TABLE.NAME" for the result set */ + +/* +** An instance of this structure can hold a simple list of identifiers, +** such as the list "a,b,c" in the following statements: +** +** INSERT INTO t(a,b,c) VALUES ...; +** CREATE INDEX idx ON t(a,b,c); +** CREATE TRIGGER trig BEFORE UPDATE ON t(a,b,c) ...; +** +** The IdList.a.idx field is used when the IdList represents the list of +** column names after a table name in an INSERT statement. In the statement +** +** INSERT INTO t(a,b,c) ... +** +** If "a" is the k-th column of table "t", then IdList.a[0].idx==k. +*/ +struct IdList { + struct IdList_item { + char *zName; /* Name of the identifier */ + int idx; /* Index in some Table.aCol[] of a column named zName */ + } *a; + int nId; /* Number of identifiers on the list */ +}; + +/* +** The following structure describes the FROM clause of a SELECT statement. +** Each table or subquery in the FROM clause is a separate element of +** the SrcList.a[] array. +** +** With the addition of multiple database support, the following structure +** can also be used to describe a particular table such as the table that +** is modified by an INSERT, DELETE, or UPDATE statement. In standard SQL, +** such a table must be a simple name: ID. But in SQLite, the table can +** now be identified by a database name, a dot, then the table name: ID.ID. +** +** The jointype starts out showing the join type between the current table +** and the next table on the list. The parser builds the list this way. +** But sqlite3SrcListShiftJoinType() later shifts the jointypes so that each +** jointype expresses the join between the table and the previous table. +** +** In the colUsed field, the high-order bit (bit 63) is set if the table +** contains more than 63 columns and the 64-th or later column is used. +*/ +struct SrcList { + int nSrc; /* Number of tables or subqueries in the FROM clause */ + u32 nAlloc; /* Number of entries allocated in a[] below */ + struct SrcList_item { + Schema *pSchema; /* Schema to which this item is fixed */ + char *zDatabase; /* Name of database holding this table */ + char *zName; /* Name of the table */ + char *zAlias; /* The "B" part of a "A AS B" phrase. zName is the "A" */ + Table *pTab; /* An SQL table corresponding to zName */ + Select *pSelect; /* A SELECT statement used in place of a table name */ + int addrFillSub; /* Address of subroutine to manifest a subquery */ + int regReturn; /* Register holding return address of addrFillSub */ + int regResult; /* Registers holding results of a co-routine */ + struct { + u8 jointype; /* Type of join between this table and the previous */ + unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */ + unsigned isIndexedBy :1; /* True if there is an INDEXED BY clause */ + unsigned isTabFunc :1; /* True if table-valued-function syntax */ + unsigned isCorrelated :1; /* True if sub-query is correlated */ + unsigned viaCoroutine :1; /* Implemented as a co-routine */ + unsigned isRecursive :1; /* True for recursive reference in WITH */ + unsigned fromDDL :1; /* Comes from sqlite_master */ + } fg; + int iCursor; /* The VDBE cursor number used to access this table */ + Expr *pOn; /* The ON clause of a join */ + IdList *pUsing; /* The USING clause of a join */ + Bitmask colUsed; /* Bit N (1<" clause */ + ExprList *pFuncArg; /* Arguments to table-valued-function */ + } u1; + Index *pIBIndex; /* Index structure corresponding to u1.zIndexedBy */ + } a[1]; /* One entry for each identifier on the list */ +}; + +/* +** Permitted values of the SrcList.a.jointype field +*/ +#define JT_INNER 0x0001 /* Any kind of inner or cross join */ +#define JT_CROSS 0x0002 /* Explicit use of the CROSS keyword */ +#define JT_NATURAL 0x0004 /* True for a "natural" join */ +#define JT_LEFT 0x0008 /* Left outer join */ +#define JT_RIGHT 0x0010 /* Right outer join */ +#define JT_OUTER 0x0020 /* The "OUTER" keyword is present */ +#define JT_ERROR 0x0040 /* unknown or unsupported join type */ + + +/* +** Flags appropriate for the wctrlFlags parameter of sqlite3WhereBegin() +** and the WhereInfo.wctrlFlags member. +** +** Value constraints (enforced via assert()): +** WHERE_USE_LIMIT == SF_FixedLimit +*/ +#define WHERE_ORDERBY_NORMAL 0x0000 /* No-op */ +#define WHERE_ORDERBY_MIN 0x0001 /* ORDER BY processing for min() func */ +#define WHERE_ORDERBY_MAX 0x0002 /* ORDER BY processing for max() func */ +#define WHERE_ONEPASS_DESIRED 0x0004 /* Want to do one-pass UPDATE/DELETE */ +#define WHERE_ONEPASS_MULTIROW 0x0008 /* ONEPASS is ok with multiple rows */ +#define WHERE_DUPLICATES_OK 0x0010 /* Ok to return a row more than once */ +#define WHERE_OR_SUBCLAUSE 0x0020 /* Processing a sub-WHERE as part of + ** the OR optimization */ +#define WHERE_GROUPBY 0x0040 /* pOrderBy is really a GROUP BY */ +#define WHERE_DISTINCTBY 0x0080 /* pOrderby is really a DISTINCT clause */ +#define WHERE_WANT_DISTINCT 0x0100 /* All output needs to be distinct */ +#define WHERE_SORTBYGROUP 0x0200 /* Support sqlite3WhereIsSorted() */ +#define WHERE_SEEK_TABLE 0x0400 /* Do not defer seeks on main table */ +#define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */ +#define WHERE_SEEK_UNIQ_TABLE 0x1000 /* Do not defer seeks if unique */ + /* 0x2000 not currently used */ +#define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */ + /* 0x8000 not currently used */ + +/* Allowed return values from sqlite3WhereIsDistinct() +*/ +#define WHERE_DISTINCT_NOOP 0 /* DISTINCT keyword not used */ +#define WHERE_DISTINCT_UNIQUE 1 /* No duplicates */ +#define WHERE_DISTINCT_ORDERED 2 /* All duplicates are adjacent */ +#define WHERE_DISTINCT_UNORDERED 3 /* Duplicates are scattered */ + +/* +** A NameContext defines a context in which to resolve table and column +** names. The context consists of a list of tables (the pSrcList) field and +** a list of named expression (pEList). The named expression list may +** be NULL. The pSrc corresponds to the FROM clause of a SELECT or +** to the table being operated on by INSERT, UPDATE, or DELETE. The +** pEList corresponds to the result set of a SELECT and is NULL for +** other statements. +** +** NameContexts can be nested. When resolving names, the inner-most +** context is searched first. If no match is found, the next outer +** context is checked. If there is still no match, the next context +** is checked. This process continues until either a match is found +** or all contexts are check. When a match is found, the nRef member of +** the context containing the match is incremented. +** +** Each subquery gets a new NameContext. The pNext field points to the +** NameContext in the parent query. Thus the process of scanning the +** NameContext list corresponds to searching through successively outer +** subqueries looking for a match. +*/ +struct NameContext { + Parse *pParse; /* The parser */ + SrcList *pSrcList; /* One or more tables used to resolve names */ + union { + ExprList *pEList; /* Optional list of result-set columns */ + AggInfo *pAggInfo; /* Information about aggregates at this level */ + Upsert *pUpsert; /* ON CONFLICT clause information from an upsert */ + } uNC; + NameContext *pNext; /* Next outer name context. NULL for outermost */ + int nRef; /* Number of names resolved by this context */ + int nErr; /* Number of errors encountered while resolving names */ + int ncFlags; /* Zero or more NC_* flags defined below */ + Select *pWinSelect; /* SELECT statement for any window functions */ +}; + +/* +** Allowed values for the NameContext, ncFlags field. +** +** Value constraints (all checked via assert()): +** NC_HasAgg == SF_HasAgg == EP_Agg +** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX +** NC_HasWin == EP_Win +** +*/ +#define NC_AllowAgg 0x00001 /* Aggregate functions are allowed here */ +#define NC_PartIdx 0x00002 /* True if resolving a partial index WHERE */ +#define NC_IsCheck 0x00004 /* True if resolving a CHECK constraint */ +#define NC_GenCol 0x00008 /* True for a GENERATED ALWAYS AS clause */ +#define NC_HasAgg 0x00010 /* One or more aggregate functions seen */ +#define NC_IdxExpr 0x00020 /* True if resolving columns of CREATE INDEX */ +#define NC_SelfRef 0x0002e /* Combo: PartIdx, isCheck, GenCol, and IdxExpr */ +#define NC_VarSelect 0x00040 /* A correlated subquery has been seen */ +#define NC_UEList 0x00080 /* True if uNC.pEList is used */ +#define NC_UAggInfo 0x00100 /* True if uNC.pAggInfo is used */ +#define NC_UUpsert 0x00200 /* True if uNC.pUpsert is used */ +#define NC_MinMaxAgg 0x01000 /* min/max aggregates seen. See note above */ +#define NC_Complex 0x02000 /* True if a function or subquery seen */ +#define NC_AllowWin 0x04000 /* Window functions are allowed here */ +#define NC_HasWin 0x08000 /* One or more window functions seen */ +#define NC_IsDDL 0x10000 /* Resolving names in a CREATE statement */ +#define NC_InAggFunc 0x20000 /* True if analyzing arguments to an agg func */ +#define NC_FromDDL 0x40000 /* SQL text comes from sqlite_master */ + +/* +** An instance of the following object describes a single ON CONFLICT +** clause in an upsert. +** +** The pUpsertTarget field is only set if the ON CONFLICT clause includes +** conflict-target clause. (In "ON CONFLICT(a,b)" the "(a,b)" is the +** conflict-target clause.) The pUpsertTargetWhere is the optional +** WHERE clause used to identify partial unique indexes. +** +** pUpsertSet is the list of column=expr terms of the UPDATE statement. +** The pUpsertSet field is NULL for a ON CONFLICT DO NOTHING. The +** pUpsertWhere is the WHERE clause for the UPDATE and is NULL if the +** WHERE clause is omitted. +*/ +struct Upsert { + ExprList *pUpsertTarget; /* Optional description of conflicting index */ + Expr *pUpsertTargetWhere; /* WHERE clause for partial index targets */ + ExprList *pUpsertSet; /* The SET clause from an ON CONFLICT UPDATE */ + Expr *pUpsertWhere; /* WHERE clause for the ON CONFLICT UPDATE */ + /* The fields above comprise the parse tree for the upsert clause. + ** The fields below are used to transfer information from the INSERT + ** processing down into the UPDATE processing while generating code. + ** Upsert owns the memory allocated above, but not the memory below. */ + Index *pUpsertIdx; /* Constraint that pUpsertTarget identifies */ + SrcList *pUpsertSrc; /* Table to be updated */ + int regData; /* First register holding array of VALUES */ + int iDataCur; /* Index of the data cursor */ + int iIdxCur; /* Index of the first index cursor */ +}; + +/* +** An instance of the following structure contains all information +** needed to generate code for a single SELECT statement. +** +** See the header comment on the computeLimitRegisters() routine for a +** detailed description of the meaning of the iLimit and iOffset fields. +** +** addrOpenEphm[] entries contain the address of OP_OpenEphemeral opcodes. +** These addresses must be stored so that we can go back and fill in +** the P4_KEYINFO and P2 parameters later. Neither the KeyInfo nor +** the number of columns in P2 can be computed at the same time +** as the OP_OpenEphm instruction is coded because not +** enough information about the compound query is known at that point. +** The KeyInfo for addrOpenTran[0] and [1] contains collating sequences +** for the result set. The KeyInfo for addrOpenEphm[2] contains collating +** sequences for the ORDER BY clause. +*/ +struct Select { + u8 op; /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */ + LogEst nSelectRow; /* Estimated number of result rows */ + u32 selFlags; /* Various SF_* values */ + int iLimit, iOffset; /* Memory registers holding LIMIT & OFFSET counters */ + u32 selId; /* Unique identifier number for this SELECT */ + int addrOpenEphm[2]; /* OP_OpenEphem opcodes related to this select */ + ExprList *pEList; /* The fields of the result */ + SrcList *pSrc; /* The FROM clause */ + Expr *pWhere; /* The WHERE clause */ + ExprList *pGroupBy; /* The GROUP BY clause */ + Expr *pHaving; /* The HAVING clause */ + ExprList *pOrderBy; /* The ORDER BY clause */ + Select *pPrior; /* Prior select in a compound select statement */ + Select *pNext; /* Next select to the left in a compound */ + Expr *pLimit; /* LIMIT expression. NULL means not used. */ + With *pWith; /* WITH clause attached to this select. Or NULL. */ +#ifndef SQLITE_OMIT_WINDOWFUNC + Window *pWin; /* List of window functions */ + Window *pWinDefn; /* List of named window definitions */ +#endif +}; + +/* +** Allowed values for Select.selFlags. The "SF" prefix stands for +** "Select Flag". +** +** Value constraints (all checked via assert()) +** SF_HasAgg == NC_HasAgg +** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX +** SF_FixedLimit == WHERE_USE_LIMIT +*/ +#define SF_Distinct 0x0000001 /* Output should be DISTINCT */ +#define SF_All 0x0000002 /* Includes the ALL keyword */ +#define SF_Resolved 0x0000004 /* Identifiers have been resolved */ +#define SF_Aggregate 0x0000008 /* Contains agg functions or a GROUP BY */ +#define SF_HasAgg 0x0000010 /* Contains aggregate functions */ +#define SF_UsesEphemeral 0x0000020 /* Uses the OpenEphemeral opcode */ +#define SF_Expanded 0x0000040 /* sqlite3SelectExpand() called on this */ +#define SF_HasTypeInfo 0x0000080 /* FROM subqueries have Table metadata */ +#define SF_Compound 0x0000100 /* Part of a compound query */ +#define SF_Values 0x0000200 /* Synthesized from VALUES clause */ +#define SF_MultiValue 0x0000400 /* Single VALUES term with multiple rows */ +#define SF_NestedFrom 0x0000800 /* Part of a parenthesized FROM clause */ +#define SF_MinMaxAgg 0x0001000 /* Aggregate containing min() or max() */ +#define SF_Recursive 0x0002000 /* The recursive part of a recursive CTE */ +#define SF_FixedLimit 0x0004000 /* nSelectRow set by a constant LIMIT */ +#define SF_MaybeConvert 0x0008000 /* Need convertCompoundSelectToSubquery() */ +#define SF_Converted 0x0010000 /* By convertCompoundSelectToSubquery() */ +#define SF_IncludeHidden 0x0020000 /* Include hidden columns in output */ +#define SF_ComplexResult 0x0040000 /* Result contains subquery or function */ +#define SF_WhereBegin 0x0080000 /* Really a WhereBegin() call. Debug Only */ +#define SF_WinRewrite 0x0100000 /* Window function rewrite accomplished */ +#define SF_View 0x0200000 /* SELECT statement is a view */ +#define SF_NoopOrderBy 0x0400000 /* ORDER BY is ignored for this query */ + +/* +** The results of a SELECT can be distributed in several ways, as defined +** by one of the following macros. The "SRT" prefix means "SELECT Result +** Type". +** +** SRT_Union Store results as a key in a temporary index +** identified by pDest->iSDParm. +** +** SRT_Except Remove results from the temporary index pDest->iSDParm. +** +** SRT_Exists Store a 1 in memory cell pDest->iSDParm if the result +** set is not empty. +** +** SRT_Discard Throw the results away. This is used by SELECT +** statements within triggers whose only purpose is +** the side-effects of functions. +** +** All of the above are free to ignore their ORDER BY clause. Those that +** follow must honor the ORDER BY clause. +** +** SRT_Output Generate a row of output (using the OP_ResultRow +** opcode) for each row in the result set. +** +** SRT_Mem Only valid if the result is a single column. +** Store the first column of the first result row +** in register pDest->iSDParm then abandon the rest +** of the query. This destination implies "LIMIT 1". +** +** SRT_Set The result must be a single column. Store each +** row of result as the key in table pDest->iSDParm. +** Apply the affinity pDest->affSdst before storing +** results. Used to implement "IN (SELECT ...)". +** +** SRT_EphemTab Create an temporary table pDest->iSDParm and store +** the result there. The cursor is left open after +** returning. This is like SRT_Table except that +** this destination uses OP_OpenEphemeral to create +** the table first. +** +** SRT_Coroutine Generate a co-routine that returns a new row of +** results each time it is invoked. The entry point +** of the co-routine is stored in register pDest->iSDParm +** and the result row is stored in pDest->nDest registers +** starting with pDest->iSdst. +** +** SRT_Table Store results in temporary table pDest->iSDParm. +** SRT_Fifo This is like SRT_EphemTab except that the table +** is assumed to already be open. SRT_Fifo has +** the additional property of being able to ignore +** the ORDER BY clause. +** +** SRT_DistFifo Store results in a temporary table pDest->iSDParm. +** But also use temporary table pDest->iSDParm+1 as +** a record of all prior results and ignore any duplicate +** rows. Name means: "Distinct Fifo". +** +** SRT_Queue Store results in priority queue pDest->iSDParm (really +** an index). Append a sequence number so that all entries +** are distinct. +** +** SRT_DistQueue Store results in priority queue pDest->iSDParm only if +** the same record has never been stored before. The +** index at pDest->iSDParm+1 hold all prior stores. +*/ +#define SRT_Union 1 /* Store result as keys in an index */ +#define SRT_Except 2 /* Remove result from a UNION index */ +#define SRT_Exists 3 /* Store 1 if the result is not empty */ +#define SRT_Discard 4 /* Do not save the results anywhere */ +#define SRT_Fifo 5 /* Store result as data with an automatic rowid */ +#define SRT_DistFifo 6 /* Like SRT_Fifo, but unique results only */ +#define SRT_Queue 7 /* Store result in an queue */ +#define SRT_DistQueue 8 /* Like SRT_Queue, but unique results only */ + +/* The ORDER BY clause is ignored for all of the above */ +#define IgnorableOrderby(X) ((X->eDest)<=SRT_DistQueue) + +#define SRT_Output 9 /* Output each row of result */ +#define SRT_Mem 10 /* Store result in a memory cell */ +#define SRT_Set 11 /* Store results as keys in an index */ +#define SRT_EphemTab 12 /* Create transient tab and store like SRT_Table */ +#define SRT_Coroutine 13 /* Generate a single row of result */ +#define SRT_Table 14 /* Store result as data with an automatic rowid */ + +/* +** An instance of this object describes where to put of the results of +** a SELECT statement. +*/ +struct SelectDest { + u8 eDest; /* How to dispose of the results. On of SRT_* above. */ + int iSDParm; /* A parameter used by the eDest disposal method */ + int iSdst; /* Base register where results are written */ + int nSdst; /* Number of registers allocated */ + char *zAffSdst; /* Affinity used when eDest==SRT_Set */ + ExprList *pOrderBy; /* Key columns for SRT_Queue and SRT_DistQueue */ +}; + +/* +** During code generation of statements that do inserts into AUTOINCREMENT +** tables, the following information is attached to the Table.u.autoInc.p +** pointer of each autoincrement table to record some side information that +** the code generator needs. We have to keep per-table autoincrement +** information in case inserts are done within triggers. Triggers do not +** normally coordinate their activities, but we do need to coordinate the +** loading and saving of autoincrement information. +*/ +struct AutoincInfo { + AutoincInfo *pNext; /* Next info block in a list of them all */ + Table *pTab; /* Table this info block refers to */ + int iDb; /* Index in sqlite3.aDb[] of database holding pTab */ + int regCtr; /* Memory register holding the rowid counter */ +}; + +/* +** At least one instance of the following structure is created for each +** trigger that may be fired while parsing an INSERT, UPDATE or DELETE +** statement. All such objects are stored in the linked list headed at +** Parse.pTriggerPrg and deleted once statement compilation has been +** completed. +** +** A Vdbe sub-program that implements the body and WHEN clause of trigger +** TriggerPrg.pTrigger, assuming a default ON CONFLICT clause of +** TriggerPrg.orconf, is stored in the TriggerPrg.pProgram variable. +** The Parse.pTriggerPrg list never contains two entries with the same +** values for both pTrigger and orconf. +** +** The TriggerPrg.aColmask[0] variable is set to a mask of old.* columns +** accessed (or set to 0 for triggers fired as a result of INSERT +** statements). Similarly, the TriggerPrg.aColmask[1] variable is set to +** a mask of new.* columns used by the program. +*/ +struct TriggerPrg { + Trigger *pTrigger; /* Trigger this program was coded from */ + TriggerPrg *pNext; /* Next entry in Parse.pTriggerPrg list */ + SubProgram *pProgram; /* Program implementing pTrigger/orconf */ + int orconf; /* Default ON CONFLICT policy */ + u32 aColmask[2]; /* Masks of old.*, new.* columns accessed */ +}; + +/* +** The yDbMask datatype for the bitmask of all attached databases. +*/ +#if SQLITE_MAX_ATTACHED>30 + typedef unsigned char yDbMask[(SQLITE_MAX_ATTACHED+9)/8]; +# define DbMaskTest(M,I) (((M)[(I)/8]&(1<<((I)&7)))!=0) +# define DbMaskZero(M) memset((M),0,sizeof(M)) +# define DbMaskSet(M,I) (M)[(I)/8]|=(1<<((I)&7)) +# define DbMaskAllZero(M) sqlite3DbMaskAllZero(M) +# define DbMaskNonZero(M) (sqlite3DbMaskAllZero(M)==0) +#else + typedef unsigned int yDbMask; +# define DbMaskTest(M,I) (((M)&(((yDbMask)1)<<(I)))!=0) +# define DbMaskZero(M) (M)=0 +# define DbMaskSet(M,I) (M)|=(((yDbMask)1)<<(I)) +# define DbMaskAllZero(M) (M)==0 +# define DbMaskNonZero(M) (M)!=0 +#endif + +/* +** An SQL parser context. A copy of this structure is passed through +** the parser and down into all the parser action routine in order to +** carry around information that is global to the entire parse. +** +** The structure is divided into two parts. When the parser and code +** generate call themselves recursively, the first part of the structure +** is constant but the second part is reset at the beginning and end of +** each recursion. +** +** The nTableLock and aTableLock variables are only used if the shared-cache +** feature is enabled (if sqlite3Tsd()->useSharedData is true). They are +** used to store the set of table-locks required by the statement being +** compiled. Function sqlite3TableLock() is used to add entries to the +** list. +*/ +struct Parse { + sqlite3 *db; /* The main database structure */ + char *zErrMsg; /* An error message */ + Vdbe *pVdbe; /* An engine for executing database bytecode */ + int rc; /* Return code from execution */ + u8 colNamesSet; /* TRUE after OP_ColumnName has been issued to pVdbe */ + u8 checkSchema; /* Causes schema cookie check after an error */ + u8 nested; /* Number of nested calls to the parser/code generator */ + u8 nTempReg; /* Number of temporary registers in aTempReg[] */ + u8 isMultiWrite; /* True if statement may modify/insert multiple rows */ + u8 mayAbort; /* True if statement may throw an ABORT exception */ + u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ + u8 okConstFactor; /* OK to factor out constants */ + u8 disableLookaside; /* Number of times lookaside has been disabled */ + u8 disableVtab; /* Disable all virtual tables for this parse */ + int nRangeReg; /* Size of the temporary register block */ + int iRangeReg; /* First register in temporary register block */ + int nErr; /* Number of errors seen */ + int nTab; /* Number of previously allocated VDBE cursors */ + int nMem; /* Number of memory cells used so far */ + int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */ + int iSelfTab; /* Table associated with an index on expr, or negative + ** of the base register during check-constraint eval */ + int nLabel; /* The *negative* of the number of labels used */ + int nLabelAlloc; /* Number of slots in aLabel */ + int *aLabel; /* Space to hold the labels */ + ExprList *pConstExpr;/* Constant expressions */ + Token constraintName;/* Name of the constraint currently being parsed */ + yDbMask writeMask; /* Start a write transaction on these databases */ + yDbMask cookieMask; /* Bitmask of schema verified databases */ + int regRowid; /* Register holding rowid of CREATE TABLE entry */ + 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_SHARED_CACHE + int nTableLock; /* Number of locks in aTableLock */ + TableLock *aTableLock; /* Required table locks for shared-cache mode */ +#endif + AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ + Parse *pToplevel; /* Parse structure for main program (or NULL) */ + Table *pTriggerTab; /* Table triggers are being coded for */ + Parse *pParentParse; /* Parent parser if this parser is nested */ + AggInfo *pAggList; /* List of all AggInfo objects */ + int addrCrTab; /* Address of OP_CreateBtree opcode on CREATE TABLE */ + u32 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 */ + u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ + u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ + u8 disableTriggers; /* True to disable triggers */ + + /************************************************************************** + ** Fields above must be initialized to zero. The fields that follow, + ** down to the beginning of the recursive section, do not need to be + ** initialized as they will be set before being used. The boundary is + ** determined by offsetof(Parse,aTempReg). + **************************************************************************/ + + int aTempReg[8]; /* Holding area for temporary registers */ + Token sNameToken; /* Token with unqualified schema object name */ + + /************************************************************************ + ** Above is constant between recursions. Below is reset before and after + ** each recursion. The boundary between these two regions is determined + ** using offsetof(Parse,sLastToken) so the sLastToken field must be the + ** first field in the recursive region. + ************************************************************************/ + + Token sLastToken; /* The last token parsed */ + ynVar nVar; /* Number of '?' variables seen in the SQL so far */ + u8 iPkSortOrder; /* ASC or DESC for INTEGER PRIMARY KEY */ + u8 explain; /* True if the EXPLAIN flag is found on the query */ +#if !(defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_OMIT_ALTERTABLE)) + u8 eParseMode; /* PARSE_MODE_XXX constant */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + int nVtabLock; /* Number of virtual tables to lock */ +#endif + int nHeight; /* Expression tree height of current sub-select */ +#ifndef SQLITE_OMIT_EXPLAIN + int addrExplain; /* Address of current OP_Explain opcode */ +#endif + VList *pVList; /* Mapping between variable names and numbers */ + Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ + const char *zTail; /* All SQL text past the last semicolon parsed */ + Table *pNewTable; /* A table being constructed by CREATE TABLE */ + Index *pNewIndex; /* An index being constructed by CREATE INDEX. + ** Also used to hold redundant UNIQUE constraints + ** during a RENAME COLUMN */ + Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ + const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + Token sArg; /* Complete text of a module argument */ + Table **apVtabLock; /* Pointer to virtual tables needing locking */ +#endif + Table *pZombieTab; /* List of Table objects to delete after code gen */ + TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */ + With *pWith; /* Current WITH clause, or NULL */ + With *pWithToFree; /* Free this WITH object at the end of the parse */ +#ifndef SQLITE_OMIT_ALTERTABLE + RenameToken *pRename; /* Tokens subject to renaming by ALTER TABLE */ +#endif +}; + +#define PARSE_MODE_NORMAL 0 +#define PARSE_MODE_DECLARE_VTAB 1 +#define PARSE_MODE_RENAME 2 +#define PARSE_MODE_UNMAP 3 + +/* +** Sizes and pointers of various parts of the Parse object. +*/ +#define PARSE_HDR_SZ offsetof(Parse,aTempReg) /* Recursive part w/o aColCache*/ +#define PARSE_RECURSE_SZ offsetof(Parse,sLastToken) /* Recursive part */ +#define PARSE_TAIL_SZ (sizeof(Parse)-PARSE_RECURSE_SZ) /* Non-recursive part */ +#define PARSE_TAIL(X) (((char*)(X))+PARSE_RECURSE_SZ) /* Pointer to tail */ + +/* +** Return true if currently inside an sqlite3_declare_vtab() call. +*/ +#ifdef SQLITE_OMIT_VIRTUALTABLE + #define IN_DECLARE_VTAB 0 +#else + #define IN_DECLARE_VTAB (pParse->eParseMode==PARSE_MODE_DECLARE_VTAB) +#endif + +#if defined(SQLITE_OMIT_ALTERTABLE) + #define IN_RENAME_OBJECT 0 +#else + #define IN_RENAME_OBJECT (pParse->eParseMode>=PARSE_MODE_RENAME) +#endif + +#if defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_OMIT_ALTERTABLE) + #define IN_SPECIAL_PARSE 0 +#else + #define IN_SPECIAL_PARSE (pParse->eParseMode!=PARSE_MODE_NORMAL) +#endif + +/* +** An instance of the following structure can be declared on a stack and used +** to save the Parse.zAuthContext value so that it can be restored later. +*/ +struct AuthContext { + const char *zAuthContext; /* Put saved Parse.zAuthContext here */ + Parse *pParse; /* The Parse structure */ +}; + +/* +** Bitfield flags for P5 value in various opcodes. +** +** Value constraints (enforced via assert()): +** OPFLAG_LENGTHARG == SQLITE_FUNC_LENGTH +** OPFLAG_TYPEOFARG == SQLITE_FUNC_TYPEOF +** OPFLAG_BULKCSR == BTREE_BULKLOAD +** OPFLAG_SEEKEQ == BTREE_SEEK_EQ +** OPFLAG_FORDELETE == BTREE_FORDELETE +** OPFLAG_SAVEPOSITION == BTREE_SAVEPOSITION +** OPFLAG_AUXDELETE == BTREE_AUXDELETE +*/ +#define OPFLAG_NCHANGE 0x01 /* OP_Insert: Set to update db->nChange */ + /* Also used in P2 (not P5) of OP_Delete */ +#define OPFLAG_NOCHNG 0x01 /* OP_VColumn nochange for UPDATE */ +#define OPFLAG_EPHEM 0x01 /* OP_Column: Ephemeral output is ok */ +#define OPFLAG_LASTROWID 0x20 /* Set to update db->lastRowid */ +#define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */ +#define OPFLAG_APPEND 0x08 /* This is likely to be an append */ +#define OPFLAG_USESEEKRESULT 0x10 /* Try to avoid a seek in BtreeInsert() */ +#define OPFLAG_ISNOOP 0x40 /* OP_Delete does pre-update-hook only */ +#define OPFLAG_LENGTHARG 0x40 /* OP_Column only used for length() */ +#define OPFLAG_TYPEOFARG 0x80 /* OP_Column only used for typeof() */ +#define OPFLAG_BULKCSR 0x01 /* OP_Open** used to open bulk cursor */ +#define OPFLAG_SEEKEQ 0x02 /* OP_Open** cursor uses EQ seek only */ +#define OPFLAG_FORDELETE 0x08 /* OP_Open should use BTREE_FORDELETE */ +#define OPFLAG_P2ISREG 0x10 /* P2 to OP_Open** is a register number */ +#define OPFLAG_PERMUTE 0x01 /* OP_Compare: use the permutation */ +#define OPFLAG_SAVEPOSITION 0x02 /* OP_Delete/Insert: save cursor pos */ +#define OPFLAG_AUXDELETE 0x04 /* OP_Delete: index in a DELETE op */ +#define OPFLAG_NOCHNG_MAGIC 0x6d /* OP_MakeRecord: serialtype 10 is ok */ + +/* + * Each trigger present in the database schema is stored as an instance of + * struct Trigger. + * + * Pointers to instances of struct Trigger are stored in two ways. + * 1. In the "trigHash" hash table (part of the sqlite3* that represents the + * database). This allows Trigger structures to be retrieved by name. + * 2. All triggers associated with a single table form a linked list, using the + * pNext member of struct Trigger. A pointer to the first element of the + * linked list is stored as the "pTrigger" member of the associated + * struct Table. + * + * The "step_list" member points to the first element of a linked list + * containing the SQL statements specified as the trigger program. + */ +struct Trigger { + char *zName; /* The name of the trigger */ + char *table; /* The table or view to which the trigger applies */ + u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT */ + u8 tr_tm; /* One of TRIGGER_BEFORE, TRIGGER_AFTER */ + Expr *pWhen; /* The WHEN clause of the expression (may be NULL) */ + IdList *pColumns; /* If this is an UPDATE OF trigger, + the is stored here */ + Schema *pSchema; /* Schema containing the trigger */ + Schema *pTabSchema; /* Schema containing the table */ + TriggerStep *step_list; /* Link list of trigger program steps */ + Trigger *pNext; /* Next trigger associated with the table */ +}; + +/* +** A trigger is either a BEFORE or an AFTER trigger. The following constants +** determine which. +** +** If there are multiple triggers, you might of some BEFORE and some AFTER. +** In that cases, the constants below can be ORed together. +*/ +#define TRIGGER_BEFORE 1 +#define TRIGGER_AFTER 2 + +/* + * An instance of struct TriggerStep is used to store a single SQL statement + * that is a part of a trigger-program. + * + * Instances of struct TriggerStep are stored in a singly linked list (linked + * using the "pNext" member) referenced by the "step_list" member of the + * associated struct Trigger instance. The first element of the linked list is + * the first step of the trigger-program. + * + * The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or + * "SELECT" statement. The meanings of the other members is determined by the + * value of "op" as follows: + * + * (op == TK_INSERT) + * orconf -> stores the ON CONFLICT algorithm + * pSelect -> If this is an INSERT INTO ... SELECT ... statement, then + * this stores a pointer to the SELECT statement. Otherwise NULL. + * zTarget -> Dequoted name of the table to insert into. + * pExprList -> If this is an INSERT INTO ... VALUES ... statement, then + * this stores values to be inserted. Otherwise NULL. + * pIdList -> If this is an INSERT INTO ... () VALUES ... + * statement, then this stores the column-names to be + * inserted into. + * + * (op == TK_DELETE) + * zTarget -> Dequoted name of the table to delete from. + * pWhere -> The WHERE clause of the DELETE statement if one is specified. + * Otherwise NULL. + * + * (op == TK_UPDATE) + * zTarget -> Dequoted name of the table to update. + * pWhere -> The WHERE clause of the UPDATE statement if one is specified. + * Otherwise NULL. + * pExprList -> A list of the columns to update and the expressions to update + * them to. See sqlite3Update() documentation of "pChanges" + * argument. + * + */ +struct TriggerStep { + u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT */ + u8 orconf; /* OE_Rollback etc. */ + Trigger *pTrig; /* The trigger that this step is a part of */ + Select *pSelect; /* SELECT statement or RHS of INSERT INTO SELECT ... */ + char *zTarget; /* Target table for DELETE, UPDATE, INSERT */ + Expr *pWhere; /* The WHERE clause for DELETE or UPDATE steps */ + ExprList *pExprList; /* SET clause for UPDATE */ + IdList *pIdList; /* Column names for INSERT */ + Upsert *pUpsert; /* Upsert clauses on an INSERT */ + char *zSpan; /* Original SQL text of this command */ + TriggerStep *pNext; /* Next in the link-list */ + TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */ +}; + +/* +** The following structure contains information used by the sqliteFix... +** routines as they walk the parse tree to make database references +** explicit. +*/ +typedef struct DbFixer DbFixer; +struct DbFixer { + Parse *pParse; /* The parsing context. Error messages written here */ + Schema *pSchema; /* Fix items to this schema */ + u8 bTemp; /* True for TEMP schema entries */ + const char *zDb; /* Make sure all objects are contained in this database */ + const char *zType; /* Type of the container - used for error messages */ + const Token *pName; /* Name of the container - used for error messages */ +}; + +/* +** An objected used to accumulate the text of a string where we +** do not necessarily know how big the string will be in the end. +*/ +struct sqlite3_str { + sqlite3 *db; /* Optional database for lookaside. Can be NULL */ + char *zText; /* The string collected so far */ + u32 nAlloc; /* Amount of space allocated in zText */ + u32 mxAlloc; /* Maximum allowed allocation. 0 for no malloc usage */ + u32 nChar; /* Length of the string so far */ + u8 accError; /* SQLITE_NOMEM or SQLITE_TOOBIG */ + u8 printfFlags; /* SQLITE_PRINTF flags below */ +}; +#define SQLITE_PRINTF_INTERNAL 0x01 /* Internal-use-only converters allowed */ +#define SQLITE_PRINTF_SQLFUNC 0x02 /* SQL function arguments to VXPrintf */ +#define SQLITE_PRINTF_MALLOCED 0x04 /* True if xText is allocated space */ + +#define isMalloced(X) (((X)->printfFlags & SQLITE_PRINTF_MALLOCED)!=0) + + +/* +** A pointer to this structure is used to communicate information +** from sqlite3Init and OP_ParseSchema into the sqlite3InitCallback. +*/ +typedef struct { + sqlite3 *db; /* The database being initialized */ + char **pzErrMsg; /* Error message stored here */ + int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */ + int rc; /* Result code stored here */ + u32 mInitFlags; /* Flags controlling error messages */ + u32 nInitRow; /* Number of rows processed */ +} InitData; + +/* +** Allowed values for mInitFlags +*/ +#define INITFLAG_AlterTable 0x0001 /* This is a reparse after ALTER TABLE */ + +/* +** Structure containing global configuration data for the SQLite library. +** +** This structure also contains some state information. +*/ +struct Sqlite3Config { + int bMemstat; /* True to enable memory status */ + u8 bCoreMutex; /* True to enable core mutexing */ + u8 bFullMutex; /* True to enable full mutexing */ + u8 bOpenUri; /* True to interpret filenames as URIs */ + u8 bUseCis; /* Use covering indices for full-scans */ + u8 bSmallMalloc; /* Avoid large memory allocations if true */ + u8 bExtraSchemaChecks; /* Verify type,name,tbl_name in schema */ + int mxStrlen; /* Maximum string length */ + int neverCorrupt; /* Database is always well-formed */ + int szLookaside; /* Default lookaside buffer size */ + int nLookaside; /* Default lookaside buffer count */ + int nStmtSpill; /* Stmt-journal spill-to-disk threshold */ + sqlite3_mem_methods m; /* Low-level memory allocation interface */ + sqlite3_mutex_methods mutex; /* Low-level mutex interface */ + sqlite3_pcache_methods2 pcache2; /* Low-level page-cache interface */ + void *pHeap; /* Heap storage space */ + int nHeap; /* Size of pHeap[] */ + int mnReq, mxReq; /* Min and max heap requests sizes */ + sqlite3_int64 szMmap; /* mmap() space per open file */ + sqlite3_int64 mxMmap; /* Maximum value for szMmap */ + void *pPage; /* Page cache memory */ + int szPage; /* Size of each page in pPage[] */ + int nPage; /* Number of pages in pPage[] */ + int mxParserStack; /* maximum depth of the parser stack */ + int sharedCacheEnabled; /* true if shared-cache mode enabled */ + u32 szPma; /* Maximum Sorter PMA size */ + /* The above might be initialized to non-zero. The following need to always + ** initially be zero, however. */ + int isInit; /* True after initialization has finished */ + int inProgress; /* True while initialization in progress */ + int isMutexInit; /* True after mutexes are initialized */ + int isMallocInit; /* True after malloc is initialized */ + int isPCacheInit; /* True after malloc is initialized */ + int nRefInitMutex; /* Number of users of pInitMutex */ + sqlite3_mutex *pInitMutex; /* Mutex used by sqlite3_initialize() */ + void (*xLog)(void*,int,const char*); /* Function for logging */ + void *pLogArg; /* First argument to xLog() */ +#ifdef SQLITE_ENABLE_SQLLOG + void(*xSqllog)(void*,sqlite3*,const char*, int); + void *pSqllogArg; +#endif +#ifdef SQLITE_VDBE_COVERAGE + /* The following callback (if not NULL) is invoked on every VDBE branch + ** operation. Set the callback using SQLITE_TESTCTRL_VDBE_COVERAGE. + */ + void (*xVdbeBranch)(void*,unsigned iSrcLine,u8 eThis,u8 eMx); /* Callback */ + void *pVdbeBranchArg; /* 1st argument */ +#endif +#ifdef SQLITE_ENABLE_DESERIALIZE + sqlite3_int64 mxMemdbSize; /* Default max memdb size */ +#endif +#ifndef SQLITE_UNTESTABLE + int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ +#endif + int bLocaltimeFault; /* True to fail localtime() calls */ + int iOnceResetThreshold; /* When to reset OP_Once counters */ + u32 szSorterRef; /* Min size in bytes to use sorter-refs */ + unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */ +}; + +/* +** This macro is used inside of assert() statements to indicate that +** the assert is only valid on a well-formed database. Instead of: +** +** assert( X ); +** +** One writes: +** +** assert( X || CORRUPT_DB ); +** +** CORRUPT_DB is true during normal operation. CORRUPT_DB does not indicate +** that the database is definitely corrupt, only that it might be corrupt. +** For most test cases, CORRUPT_DB is set to false using a special +** sqlite3_test_control(). This enables assert() statements to prove +** things that are always true for well-formed databases. +*/ +#define CORRUPT_DB (sqlite3Config.neverCorrupt==0) + +/* +** Context pointer passed down through the tree-walk. +*/ +struct Walker { + Parse *pParse; /* Parser context. */ + int (*xExprCallback)(Walker*, Expr*); /* Callback for expressions */ + int (*xSelectCallback)(Walker*,Select*); /* Callback for SELECTs */ + void (*xSelectCallback2)(Walker*,Select*);/* Second callback for SELECTs */ + int walkerDepth; /* Number of subqueries */ + u16 eCode; /* A small processing code */ + union { /* Extra data for callback */ + NameContext *pNC; /* Naming context */ + int n; /* A counter */ + int iCur; /* A cursor number */ + SrcList *pSrcList; /* FROM clause */ + struct SrcCount *pSrcCount; /* Counting column references */ + struct CCurHint *pCCurHint; /* Used by codeCursorHint() */ + int *aiCol; /* array of column indexes */ + struct IdxCover *pIdxCover; /* Check for index coverage */ + struct IdxExprTrans *pIdxTrans; /* Convert idxed expr to column */ + ExprList *pGroupBy; /* GROUP BY clause */ + Select *pSelect; /* HAVING to WHERE clause ctx */ + struct WindowRewrite *pRewrite; /* Window rewrite context */ + struct WhereConst *pConst; /* WHERE clause constants */ + struct RenameCtx *pRename; /* RENAME COLUMN context */ + struct Table *pTab; /* Table of generated column */ + struct SrcList_item *pSrcItem; /* A single FROM clause item */ + } u; +}; + +/* Forward declarations */ +SQLITE_PRIVATE int sqlite3WalkExpr(Walker*, Expr*); +SQLITE_PRIVATE int sqlite3WalkExprList(Walker*, ExprList*); +SQLITE_PRIVATE int sqlite3WalkSelect(Walker*, Select*); +SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker*, Select*); +SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker*, Select*); +SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker*, Expr*); +SQLITE_PRIVATE int sqlite3SelectWalkNoop(Walker*, Select*); +SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker*, Select*); +SQLITE_PRIVATE int sqlite3WalkerDepthIncrease(Walker*,Select*); +SQLITE_PRIVATE void sqlite3WalkerDepthDecrease(Walker*,Select*); + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3SelectWalkAssert2(Walker*, Select*); +#endif + +/* +** Return code from the parse-tree walking primitives and their +** callbacks. +*/ +#define WRC_Continue 0 /* Continue down into children */ +#define WRC_Prune 1 /* Omit children but continue walking siblings */ +#define WRC_Abort 2 /* Abandon the tree walk */ + +/* +** An instance of this structure represents a set of one or more CTEs +** (common table expressions) created by a single WITH clause. +*/ +struct With { + int nCte; /* Number of CTEs in the WITH clause */ + With *pOuter; /* Containing WITH clause, or NULL */ + struct Cte { /* For each CTE in the WITH clause.... */ + char *zName; /* Name of this CTE */ + ExprList *pCols; /* List of explicit column names, or NULL */ + Select *pSelect; /* The definition of this CTE */ + const char *zCteErr; /* Error message for circular references */ + } a[1]; +}; + +#ifdef SQLITE_DEBUG +/* +** An instance of the TreeView object is used for printing the content of +** data structures on sqlite3DebugPrintf() using a tree-like view. +*/ +struct TreeView { + int iLevel; /* Which level of the tree we are on */ + u8 bLine[100]; /* Draw vertical in column i if bLine[i] is true */ +}; +#endif /* SQLITE_DEBUG */ + +/* +** This object is used in various ways, most (but not all) related to window +** functions. +** +** (1) A single instance of this structure is attached to the +** the Expr.y.pWin field for each window function in an expression tree. +** This object holds the information contained in the OVER clause, +** plus additional fields used during code generation. +** +** (2) All window functions in a single SELECT form a linked-list +** attached to Select.pWin. The Window.pFunc and Window.pExpr +** fields point back to the expression that is the window function. +** +** (3) The terms of the WINDOW clause of a SELECT are instances of this +** object on a linked list attached to Select.pWinDefn. +** +** (4) For an aggregate function with a FILTER clause, an instance +** of this object is stored in Expr.y.pWin with eFrmType set to +** TK_FILTER. In this case the only field used is Window.pFilter. +** +** The uses (1) and (2) are really the same Window object that just happens +** to be accessible in two different ways. Use case (3) are separate objects. +*/ +struct Window { + char *zName; /* Name of window (may be NULL) */ + char *zBase; /* Name of base window for chaining (may be NULL) */ + ExprList *pPartition; /* PARTITION BY clause */ + ExprList *pOrderBy; /* ORDER BY clause */ + u8 eFrmType; /* TK_RANGE, TK_GROUPS, TK_ROWS, or 0 */ + u8 eStart; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */ + u8 eEnd; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */ + u8 bImplicitFrame; /* True if frame was implicitly specified */ + u8 eExclude; /* TK_NO, TK_CURRENT, TK_TIES, TK_GROUP, or 0 */ + Expr *pStart; /* Expression for " PRECEDING" */ + Expr *pEnd; /* Expression for " FOLLOWING" */ + Window **ppThis; /* Pointer to this object in Select.pWin list */ + Window *pNextWin; /* Next window function belonging to this SELECT */ + Expr *pFilter; /* The FILTER expression */ + FuncDef *pFunc; /* The function */ + int iEphCsr; /* Partition buffer or Peer buffer */ + int regAccum; /* Accumulator */ + int regResult; /* Interim result */ + int csrApp; /* Function cursor (used by min/max) */ + int regApp; /* Function register (also used by min/max) */ + int regPart; /* Array of registers for PARTITION BY values */ + Expr *pOwner; /* Expression object this window is attached to */ + int nBufferCol; /* Number of columns in buffer table */ + int iArgCol; /* Offset of first argument for this function */ + int regOne; /* Register containing constant value 1 */ + int regStartRowid; + int regEndRowid; + u8 bExprArgs; /* Defer evaluation of window function arguments + ** due to the SQLITE_SUBTYPE flag */ +}; + +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3*, Window*); +SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window*); +SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p); +SQLITE_PRIVATE Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); +SQLITE_PRIVATE void sqlite3WindowAttach(Parse*, Expr*, Window*); +SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin); +SQLITE_PRIVATE int sqlite3WindowCompare(Parse*, Window*, Window*, int); +SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse*, Select*); +SQLITE_PRIVATE void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int); +SQLITE_PRIVATE int sqlite3WindowRewrite(Parse*, Select*); +SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse*, struct SrcList_item*); +SQLITE_PRIVATE void sqlite3WindowUpdate(Parse*, Window*, Window*, FuncDef*); +SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p); +SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p); +SQLITE_PRIVATE void sqlite3WindowFunctions(void); +SQLITE_PRIVATE void sqlite3WindowChain(Parse*, Window*, Window*); +SQLITE_PRIVATE Window *sqlite3WindowAssemble(Parse*, Window*, ExprList*, ExprList*, Token*); +#else +# define sqlite3WindowDelete(a,b) +# define sqlite3WindowFunctions() +# define sqlite3WindowAttach(a,b,c) +#endif + +/* +** Assuming zIn points to the first byte of a UTF-8 character, +** advance zIn to point to the first byte of the next UTF-8 character. +*/ +#define SQLITE_SKIP_UTF8(zIn) { \ + if( (*(zIn++))>=0xc0 ){ \ + while( (*zIn & 0xc0)==0x80 ){ zIn++; } \ + } \ +} + +/* +** The SQLITE_*_BKPT macros are substitutes for the error codes with +** the same name but without the _BKPT suffix. These macros invoke +** routines that report the line-number on which the error originated +** using sqlite3_log(). The routines also provide a convenient place +** to set a debugger breakpoint. +*/ +SQLITE_PRIVATE int sqlite3ReportError(int iErr, int lineno, const char *zType); +SQLITE_PRIVATE int sqlite3CorruptError(int); +SQLITE_PRIVATE int sqlite3MisuseError(int); +SQLITE_PRIVATE int sqlite3CantopenError(int); +#define SQLITE_CORRUPT_BKPT sqlite3CorruptError(__LINE__) +#define SQLITE_MISUSE_BKPT sqlite3MisuseError(__LINE__) +#define SQLITE_CANTOPEN_BKPT sqlite3CantopenError(__LINE__) +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NomemError(int); +SQLITE_PRIVATE int sqlite3IoerrnomemError(int); +# define SQLITE_NOMEM_BKPT sqlite3NomemError(__LINE__) +# define SQLITE_IOERR_NOMEM_BKPT sqlite3IoerrnomemError(__LINE__) +#else +# define SQLITE_NOMEM_BKPT SQLITE_NOMEM +# define SQLITE_IOERR_NOMEM_BKPT SQLITE_IOERR_NOMEM +#endif +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_CORRUPT_PGNO) +SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno); +# define SQLITE_CORRUPT_PGNO(P) sqlite3CorruptPgnoError(__LINE__,(P)) +#else +# define SQLITE_CORRUPT_PGNO(P) sqlite3CorruptError(__LINE__) +#endif + +/* +** FTS3 and FTS4 both require virtual table support +*/ +#if defined(SQLITE_OMIT_VIRTUALTABLE) +# undef SQLITE_ENABLE_FTS3 +# undef SQLITE_ENABLE_FTS4 +#endif + +/* +** FTS4 is really an extension for FTS3. It is enabled using the +** SQLITE_ENABLE_FTS3 macro. But to avoid confusion we also call +** the SQLITE_ENABLE_FTS4 macro to serve as an alias for SQLITE_ENABLE_FTS3. +*/ +#if defined(SQLITE_ENABLE_FTS4) && !defined(SQLITE_ENABLE_FTS3) +# define SQLITE_ENABLE_FTS3 1 +#endif + +/* +** The ctype.h header is needed for non-ASCII systems. It is also +** needed by FTS3 when FTS3 is included in the amalgamation. +*/ +#if !defined(SQLITE_ASCII) || \ + (defined(SQLITE_ENABLE_FTS3) && defined(SQLITE_AMALGAMATION)) +# include +#endif + +/* +** The following macros mimic the standard library functions toupper(), +** isspace(), isalnum(), isdigit() and isxdigit(), respectively. The +** sqlite versions only work for ASCII characters, regardless of locale. +*/ +#ifdef SQLITE_ASCII +# define sqlite3Toupper(x) ((x)&~(sqlite3CtypeMap[(unsigned char)(x)]&0x20)) +# define sqlite3Isspace(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x01) +# define sqlite3Isalnum(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x06) +# define sqlite3Isalpha(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x02) +# define sqlite3Isdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x04) +# define sqlite3Isxdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x08) +# define sqlite3Tolower(x) (sqlite3UpperToLower[(unsigned char)(x)]) +# define sqlite3Isquote(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x80) +#else +# define sqlite3Toupper(x) toupper((unsigned char)(x)) +# define sqlite3Isspace(x) isspace((unsigned char)(x)) +# define sqlite3Isalnum(x) isalnum((unsigned char)(x)) +# define sqlite3Isalpha(x) isalpha((unsigned char)(x)) +# define sqlite3Isdigit(x) isdigit((unsigned char)(x)) +# define sqlite3Isxdigit(x) isxdigit((unsigned char)(x)) +# define sqlite3Tolower(x) tolower((unsigned char)(x)) +# define sqlite3Isquote(x) ((x)=='"'||(x)=='\''||(x)=='['||(x)=='`') +#endif +SQLITE_PRIVATE int sqlite3IsIdChar(u8); + +/* +** Internal function prototypes +*/ +SQLITE_PRIVATE int sqlite3StrICmp(const char*,const char*); +SQLITE_PRIVATE int sqlite3Strlen30(const char*); +#define sqlite3Strlen30NN(C) (strlen(C)&0x3fffffff) +SQLITE_PRIVATE char *sqlite3ColumnType(Column*,char*); +#define sqlite3StrNICmp sqlite3_strnicmp + +SQLITE_PRIVATE int sqlite3MallocInit(void); +SQLITE_PRIVATE void sqlite3MallocEnd(void); +SQLITE_PRIVATE void *sqlite3Malloc(u64); +SQLITE_PRIVATE void *sqlite3MallocZero(u64); +SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3*, u64); +SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3*, u64); +SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3*, u64); +SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3*,const char*); +SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3*,const char*, u64); +SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3*,const char*,const char*); +SQLITE_PRIVATE void *sqlite3Realloc(void*, u64); +SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64); +SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, u64); +SQLITE_PRIVATE void sqlite3DbFree(sqlite3*, void*); +SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3*, void*); +SQLITE_PRIVATE int sqlite3MallocSize(void*); +SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3*, void*); +SQLITE_PRIVATE void *sqlite3PageMalloc(int); +SQLITE_PRIVATE void sqlite3PageFree(void*); +SQLITE_PRIVATE void sqlite3MemSetDefault(void); +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE void sqlite3BenignMallocHooks(void (*)(void), void (*)(void)); +#endif +SQLITE_PRIVATE int sqlite3HeapNearlyFull(void); + +/* +** On systems with ample stack space and that support alloca(), make +** use of alloca() to obtain space for large automatic objects. By default, +** obtain space from malloc(). +** +** The alloca() routine never returns NULL. This will cause code paths +** that deal with sqlite3StackAlloc() failures to be unreachable. +*/ +#ifdef SQLITE_USE_ALLOCA +# define sqlite3StackAllocRaw(D,N) alloca(N) +# define sqlite3StackAllocZero(D,N) memset(alloca(N), 0, N) +# define sqlite3StackFree(D,P) +#else +# define sqlite3StackAllocRaw(D,N) sqlite3DbMallocRaw(D,N) +# define sqlite3StackAllocZero(D,N) sqlite3DbMallocZero(D,N) +# define sqlite3StackFree(D,P) sqlite3DbFree(D,P) +#endif + +/* Do not allow both MEMSYS5 and MEMSYS3 to be defined together. If they +** are, disable MEMSYS3 +*/ +#ifdef SQLITE_ENABLE_MEMSYS5 +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void); +#undef SQLITE_ENABLE_MEMSYS3 +#endif +#ifdef SQLITE_ENABLE_MEMSYS3 +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void); +#endif + + +#ifndef SQLITE_MUTEX_OMIT +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void); +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void); +SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int); +SQLITE_PRIVATE int sqlite3MutexInit(void); +SQLITE_PRIVATE int sqlite3MutexEnd(void); +#endif +#if !defined(SQLITE_MUTEX_OMIT) && !defined(SQLITE_MUTEX_NOOP) +SQLITE_PRIVATE void sqlite3MemoryBarrier(void); +#else +# define sqlite3MemoryBarrier() +#endif + +SQLITE_PRIVATE sqlite3_int64 sqlite3StatusValue(int); +SQLITE_PRIVATE void sqlite3StatusUp(int, int); +SQLITE_PRIVATE void sqlite3StatusDown(int, int); +SQLITE_PRIVATE void sqlite3StatusHighwater(int, int); +SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3*,int*); + +/* Access to mutexes used by sqlite3_status() */ +SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void); +SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void); + +#if defined(SQLITE_ENABLE_MULTITHREADED_CHECKS) && !defined(SQLITE_MUTEX_OMIT) +SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex*); +#else +# define sqlite3MutexWarnOnContention(x) +#endif + +#ifndef SQLITE_OMIT_FLOATING_POINT +# define EXP754 (((u64)0x7ff)<<52) +# define MAN754 ((((u64)1)<<52)-1) +# define IsNaN(X) (((X)&EXP754)==EXP754 && ((X)&MAN754)!=0) +SQLITE_PRIVATE int sqlite3IsNaN(double); +#else +# define IsNaN(X) 0 +# define sqlite3IsNaN(X) 0 +#endif + +/* +** An instance of the following structure holds information about SQL +** functions arguments that are the parameters to the printf() function. +*/ +struct PrintfArguments { + int nArg; /* Total number of arguments */ + int nUsed; /* Number of arguments used so far */ + sqlite3_value **apArg; /* The argument values */ +}; + +SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...); +SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list); +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) +SQLITE_PRIVATE void sqlite3DebugPrintf(const char*, ...); +#endif +#if defined(SQLITE_TEST) +SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*); +#endif + +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); +SQLITE_PRIVATE void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); +SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); +SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView*, const SrcList*); +SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView*, const Select*, u8); +SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView*, const With*, u8); +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView*, const Window*, u8); +SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView*, const Window*, u8); +#endif +#endif + + +SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*); +SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...); +SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3*,int); +SQLITE_PRIVATE void sqlite3Dequote(char*); +SQLITE_PRIVATE void sqlite3DequoteExpr(Expr*); +SQLITE_PRIVATE void sqlite3TokenInit(Token*,char*); +SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int); +SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*, char **); +SQLITE_PRIVATE void sqlite3FinishCoding(Parse*); +SQLITE_PRIVATE int sqlite3GetTempReg(Parse*); +SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int); +SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int); +SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int); +SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse*,int,int); +#endif +SQLITE_PRIVATE Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); +SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*); +SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); +SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*); +SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse*, Expr*, Select*); +SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse*,Expr*, Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*, int); +SQLITE_PRIVATE void sqlite3ExprFunctionUsable(Parse*,Expr*,FuncDef*); +SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); +SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*); +SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse*, Expr*); +SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); +SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int,int); +SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); +SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); +SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*); +SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList*); +SQLITE_PRIVATE int sqlite3IndexHasDuplicateRootPage(Index*); +SQLITE_PRIVATE int sqlite3Init(sqlite3*, char**); +SQLITE_PRIVATE int sqlite3InitCallback(void*, int, char**, char**); +SQLITE_PRIVATE int sqlite3InitOne(sqlite3*, int, char**, u32); +SQLITE_PRIVATE void sqlite3Pragma(Parse*,Token*,Token*,Token*,int); +#ifndef SQLITE_OMIT_VIRTUALTABLE +SQLITE_PRIVATE Module *sqlite3PragmaVtabRegister(sqlite3*,const char *zName); +#endif +SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3*); +SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3*,int); +SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3*); +SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3*); +SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3*,Table*); +SQLITE_PRIVATE int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); +SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*,char); +SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*,char); +SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *, int); +SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table*); +SQLITE_PRIVATE i16 sqlite3TableColumnToIndex(Index*, i16); +#ifdef SQLITE_OMIT_GENERATED_COLUMNS +# define sqlite3TableColumnToStorage(T,X) (X) /* No-op pass-through */ +# define sqlite3StorageColumnToTable(T,X) (X) /* No-op pass-through */ +#else +SQLITE_PRIVATE i16 sqlite3TableColumnToStorage(Table*, i16); +SQLITE_PRIVATE i16 sqlite3StorageColumnToTable(Table*, i16); +#endif +SQLITE_PRIVATE void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); +#if SQLITE_ENABLE_HIDDEN_COLUMNS +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table*, Column*); +#else +# define sqlite3ColumnPropertiesFromName(T,C) /* no-op */ +#endif +SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token*,Token*); +SQLITE_PRIVATE void sqlite3AddNotNull(Parse*, int); +SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); +SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); +SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*); +SQLITE_PRIVATE void sqlite3AddGenerated(Parse*,Expr*,Token*); +SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); +SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*, + sqlite3_vfs**,char**,char **); +#define sqlite3CodecQueryParameters(A,B,C) 0 +SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3*,const char*); + +#ifdef SQLITE_UNTESTABLE +# define sqlite3FaultSim(X) SQLITE_OK +#else +SQLITE_PRIVATE int sqlite3FaultSim(int); +#endif + +SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32); +SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec*, u32); +SQLITE_PRIVATE int sqlite3BitvecTestNotNull(Bitvec*, u32); +SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec*, u32); +SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec*, u32, void*); +SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec*); +SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec*); +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int,int*); +#endif + +SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3*); +SQLITE_PRIVATE void sqlite3RowSetDelete(void*); +SQLITE_PRIVATE void sqlite3RowSetClear(void*); +SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet*, i64); +SQLITE_PRIVATE int sqlite3RowSetTest(RowSet*, int iBatch, i64); +SQLITE_PRIVATE int sqlite3RowSetNext(RowSet*, i64*); + +SQLITE_PRIVATE void sqlite3CreateView(Parse*,Token*,Token*,Token*,ExprList*,Select*,int,int); + +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) +SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse*,Table*); +#else +# define sqlite3ViewGetColumnNames(A,B) 0 +#endif + +#if SQLITE_MAX_ATTACHED>30 +SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask); +#endif +SQLITE_PRIVATE void sqlite3DropTable(Parse*, SrcList*, int, int); +SQLITE_PRIVATE void sqlite3CodeDropTable(Parse*, Table*, int, int); +SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3*, Table*); +SQLITE_PRIVATE void sqlite3FreeIndex(sqlite3*, Index*); +#ifndef SQLITE_OMIT_AUTOINCREMENT +SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse); +SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse); +#else +# define sqlite3AutoincrementBegin(X) +# define sqlite3AutoincrementEnd(X) +#endif +SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns(Parse*, int, Table*); +#endif +SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); +SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse*, IdList*, Token*); +SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*); +SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); +SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); +SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, + Token*, Select*, Expr*, IdList*); +SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); +SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse*, SrcList*, ExprList*); +SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *, struct SrcList_item *); +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList*); +SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse*, SrcList*); +SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3*, IdList*); +SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3*, SrcList*); +SQLITE_PRIVATE Index *sqlite3AllocateIndexObject(sqlite3*,i16,int,char**); +SQLITE_PRIVATE void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*, + Expr*, int, int, u8); +SQLITE_PRIVATE void sqlite3DropIndex(Parse*, SrcList*, int); +SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*); +SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*, + Expr*,ExprList*,u32,Expr*); +SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*); +SQLITE_PRIVATE void sqlite3SelectReset(Parse*, Select*); +SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*); +SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int); +SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int); +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) +SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,char*); +#endif +SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*, ExprList*, Expr*); +SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*,Expr*,int,ExprList*,Expr*, + Upsert*); +SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*,ExprList*,u16,int); +SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*); +SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo*, int*); +#define ONEPASS_OFF 0 /* Use of ONEPASS not allowed */ +#define ONEPASS_SINGLE 1 /* ONEPASS valid for a single row update */ +#define ONEPASS_MULTI 2 /* ONEPASS is valid for multiple rows */ +SQLITE_PRIVATE int sqlite3WhereUsesDeferredSeek(WhereInfo*); +SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int); +SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8); +SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); +SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int); +SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn(Parse*, Column*, int); +#endif +SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse*, Expr*, int*); +SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int, u8); +#define SQLITE_ECEL_DUP 0x01 /* Deep, not shallow copies */ +#define SQLITE_ECEL_FACTOR 0x02 /* Factor out constant terms */ +#define SQLITE_ECEL_REF 0x04 /* Use ExprList.u.x.iOrderByCol */ +#define SQLITE_ECEL_OMITREF 0x08 /* Omit if ExprList.u.x.iOrderByCol */ +SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse*, Expr*, int, int); +SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse*, Expr*, int, int); +SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int); +SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3*,const char*, const char*); +#define LOCATE_VIEW 0x01 +#define LOCATE_NOERR 0x02 +SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,u32 flags,const char*, const char*); +SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,struct SrcList_item *); +SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*); +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); +SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*,Expr*); +SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*, int, sqlite3_value*); +SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, Token*); +SQLITE_PRIVATE int sqlite3ExprCompare(Parse*,Expr*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList*, ExprList*, int); +SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse*,Expr*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr*,int); +SQLITE_PRIVATE void sqlite3AggInfoPersistWalkerInit(Walker*,Parse*); +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); +SQLITE_PRIVATE int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx); +SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr*, SrcList*); +SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse*); +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE void sqlite3PrngSaveState(void); +SQLITE_PRIVATE void sqlite3PrngRestoreState(void); +#endif +SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3*,int); +SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse*, int); +SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb); +SQLITE_PRIVATE void sqlite3BeginTransaction(Parse*, int); +SQLITE_PRIVATE void sqlite3EndTransaction(Parse*,int); +SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*); +SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *); +SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*); +SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char*); +SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr*); +SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr*); +SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*); +SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*); +SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8); +SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse*, Expr*, ExprList*); +SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*,int); +#ifdef SQLITE_ENABLE_CURSOR_HINTS +SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*); +#endif +SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr*, int*); +SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr*); +SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); +SQLITE_PRIVATE int sqlite3IsRowid(const char*); +SQLITE_PRIVATE void sqlite3GenerateRowDelete( + Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8,int); +SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int); +SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int); +SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse*,int); +SQLITE_PRIVATE int sqlite3ExprReferencesUpdatedColumn(Expr*,int*,int); +SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int, + u8,u8,int,int*,int*,Upsert*); +#ifdef SQLITE_ENABLE_NULL_TRIM +SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe*,Table*); +#else +# define sqlite3SetMakeRecordP5(A,B) +#endif +SQLITE_PRIVATE void sqlite3CompleteInsertion(Parse*,Table*,int,int,int,int*,int,int,int); +SQLITE_PRIVATE int sqlite3OpenTableAndIndices(Parse*, Table*, int, u8, int, u8*, int*, int*); +SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse*, int, int); +SQLITE_PRIVATE void sqlite3MultiWrite(Parse*); +SQLITE_PRIVATE void sqlite3MayAbort(Parse*); +SQLITE_PRIVATE void sqlite3HaltConstraint(Parse*, int, int, char*, i8, u8); +SQLITE_PRIVATE void sqlite3UniqueConstraint(Parse*, int, Index*); +SQLITE_PRIVATE void sqlite3RowidConstraint(Parse*, int, Table*); +SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3*,Expr*,int); +SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3*,ExprList*,int); +SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3*,SrcList*,int); +SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3*,IdList*); +SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,Select*,int); +SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch(int,const char*); +SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(FuncDef*,int); +SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); +SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void); +SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void); +SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3*); +SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3*); +SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*); +SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int); + +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) +SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, ExprList*,Expr*,int); +#endif + +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3BeginTrigger(Parse*, Token*,Token*,int,int,IdList*,SrcList*, + Expr*,int, int); +SQLITE_PRIVATE void sqlite3FinishTrigger(Parse*, TriggerStep*, Token*); +SQLITE_PRIVATE void sqlite3DropTrigger(Parse*, SrcList*, int); +SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse*, Trigger*); +SQLITE_PRIVATE Trigger *sqlite3TriggersExist(Parse *, Table*, int, ExprList*, int *pMask); +SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *, Table *); +SQLITE_PRIVATE void sqlite3CodeRowTrigger(Parse*, Trigger *, int, ExprList*, int, Table *, + int, int, int); +SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(Parse *, Trigger *, Table *, int, int, int); + void sqliteViewTriggers(Parse*, Table*, Expr*, int, ExprList*); +SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3*, TriggerStep*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*, + const char*,const char*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(Parse*,Token*, IdList*, + Select*,u8,Upsert*, + const char*,const char*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(Parse*,Token*,ExprList*, Expr*, u8, + const char*,const char*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(Parse*,Token*, Expr*, + const char*,const char*); +SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3*, Trigger*); +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*); +SQLITE_PRIVATE u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Table*,int); +# define sqlite3ParseToplevel(p) ((p)->pToplevel ? (p)->pToplevel : (p)) +# define sqlite3IsToplevel(p) ((p)->pToplevel==0) +#else +# define sqlite3TriggersExist(B,C,D,E,F) 0 +# define sqlite3DeleteTrigger(A,B) +# define sqlite3DropTriggerPtr(A,B) +# define sqlite3UnlinkAndDeleteTrigger(A,B,C) +# define sqlite3CodeRowTrigger(A,B,C,D,E,F,G,H,I) +# define sqlite3CodeRowTriggerDirect(A,B,C,D,E,F) +# define sqlite3TriggerList(X, Y) 0 +# define sqlite3ParseToplevel(p) p +# define sqlite3IsToplevel(p) 1 +# define sqlite3TriggerColmask(A,B,C,D,E,F,G) 0 +#endif + +SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*); +SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr*,int); +SQLITE_PRIVATE void sqlite3CreateForeignKey(Parse*, ExprList*, Token*, ExprList*, int); +SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse*, int); +#ifndef SQLITE_OMIT_AUTHORIZATION +SQLITE_PRIVATE void sqlite3AuthRead(Parse*,Expr*,Schema*,SrcList*); +SQLITE_PRIVATE int sqlite3AuthCheck(Parse*,int, const char*, const char*, const char*); +SQLITE_PRIVATE void sqlite3AuthContextPush(Parse*, AuthContext*, const char*); +SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext*); +SQLITE_PRIVATE int sqlite3AuthReadCol(Parse*, const char *, const char *, int); +#else +# define sqlite3AuthRead(a,b,c,d) +# define sqlite3AuthCheck(a,b,c,d,e) SQLITE_OK +# define sqlite3AuthContextPush(a,b,c) +# define sqlite3AuthContextPop(a) ((void)(a)) +#endif +SQLITE_PRIVATE int sqlite3DbIsNamed(sqlite3 *db, int iDb, const char *zName); +SQLITE_PRIVATE void sqlite3Attach(Parse*, Expr*, Expr*, Expr*); +SQLITE_PRIVATE void sqlite3Detach(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3FixInit(DbFixer*, Parse*, int, const char*, const Token*); +SQLITE_PRIVATE int sqlite3FixSrcList(DbFixer*, SrcList*); +SQLITE_PRIVATE int sqlite3FixSelect(DbFixer*, Select*); +SQLITE_PRIVATE int sqlite3FixExpr(DbFixer*, Expr*); +SQLITE_PRIVATE int sqlite3FixExprList(DbFixer*, ExprList*); +SQLITE_PRIVATE int sqlite3FixTriggerStep(DbFixer*, TriggerStep*); +SQLITE_PRIVATE int sqlite3RealSameAsInt(double,sqlite3_int64); +SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*, int, u8); +SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*); +SQLITE_PRIVATE int sqlite3Atoi(const char*); +#ifndef SQLITE_OMIT_UTF16 +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nChar); +#endif +SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte); +SQLITE_PRIVATE u32 sqlite3Utf8Read(const u8**); +SQLITE_PRIVATE LogEst sqlite3LogEst(u64); +SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst,LogEst); +#ifndef SQLITE_OMIT_VIRTUALTABLE +SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double); +#endif +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ + defined(SQLITE_ENABLE_STAT4) || \ + defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) +SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst); +#endif +SQLITE_PRIVATE VList *sqlite3VListAdd(sqlite3*,VList*,const char*,int,int); +SQLITE_PRIVATE const char *sqlite3VListNumToName(VList*,int); +SQLITE_PRIVATE int sqlite3VListNameToNum(VList*,const char*,int); + +/* +** Routines to read and write variable-length integers. These used to +** be defined locally, but now we use the varint routines in the util.c +** file. +*/ +SQLITE_PRIVATE int sqlite3PutVarint(unsigned char*, u64); +SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *, u64 *); +SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *, u32 *); +SQLITE_PRIVATE int sqlite3VarintLen(u64 v); + +/* +** The common case is for a varint to be a single byte. They following +** macros handle the common case without a procedure call, but then call +** the procedure for larger varints. +*/ +#define getVarint32(A,B) \ + (u8)((*(A)<(u8)0x80)?((B)=(u32)*(A)),1:sqlite3GetVarint32((A),(u32 *)&(B))) +#define getVarint32NR(A,B) \ + B=(u32)*(A);if(B>=0x80)sqlite3GetVarint32((A),(u32*)&(B)) +#define putVarint32(A,B) \ + (u8)(((u32)(B)<(u32)0x80)?(*(A)=(unsigned char)(B)),1:\ + sqlite3PutVarint((A),(B))) +#define getVarint sqlite3GetVarint +#define putVarint sqlite3PutVarint + + +SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3*, Index*); +SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe*, Table*, int); +SQLITE_PRIVATE char sqlite3CompareAffinity(const Expr *pExpr, char aff2); +SQLITE_PRIVATE int sqlite3IndexAffinityOk(const Expr *pExpr, char idx_affinity); +SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table*,int); +SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr); +SQLITE_PRIVATE int sqlite3Atoi64(const char*, i64*, int, u8); +SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char*, i64*); +SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3*, int, const char*,...); +SQLITE_PRIVATE void sqlite3Error(sqlite3*,int); +SQLITE_PRIVATE void sqlite3SystemError(sqlite3*,int); +SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3*, const char *z, int n); +SQLITE_PRIVATE u8 sqlite3HexToInt(int h); +SQLITE_PRIVATE int sqlite3TwoPartName(Parse *, Token *, Token *, Token **); + +#if defined(SQLITE_NEED_ERR_NAME) +SQLITE_PRIVATE const char *sqlite3ErrName(int); +#endif + +#ifdef SQLITE_ENABLE_DESERIALIZE +SQLITE_PRIVATE int sqlite3MemdbInit(void); +#endif + +SQLITE_PRIVATE const char *sqlite3ErrStr(int); +SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse); +SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int); +SQLITE_PRIVATE int sqlite3IsBinary(const CollSeq*); +SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char*zName); +SQLITE_PRIVATE void sqlite3SetTextEncoding(sqlite3 *db, u8); +SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr); +SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, const Expr *pExpr); +SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse*,const Expr*,const Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*, int); +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*); +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr*); +SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *); +SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3*); +SQLITE_PRIVATE int sqlite3CheckObjectName(Parse*, const char*,const char*,const char*); +SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *, int); +SQLITE_PRIVATE int sqlite3AddInt64(i64*,i64); +SQLITE_PRIVATE int sqlite3SubInt64(i64*,i64); +SQLITE_PRIVATE int sqlite3MulInt64(i64*,i64); +SQLITE_PRIVATE int sqlite3AbsInt32(int); +#ifdef SQLITE_ENABLE_8_3_NAMES +SQLITE_PRIVATE void sqlite3FileSuffix3(const char*, char*); +#else +# define sqlite3FileSuffix3(X,Y) +#endif +SQLITE_PRIVATE u8 sqlite3GetBoolean(const char *z,u8); + +SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value*, u8); +SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value*, u8); +SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, + void(*)(void*)); +SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value*); +SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value*); +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE void sqlite3ResultIntReal(sqlite3_context*); +#endif +SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *); +#ifndef SQLITE_OMIT_UTF16 +SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8); +#endif +SQLITE_PRIVATE int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **); +SQLITE_PRIVATE void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8); +#ifndef SQLITE_AMALGAMATION +SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[]; +SQLITE_PRIVATE const char sqlite3StrBINARY[]; +SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[]; +SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[]; +SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config; +SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions; +#ifndef SQLITE_OMIT_WSD +SQLITE_PRIVATE int sqlite3PendingByte; +#endif +#endif +#ifdef VDBE_PROFILE +SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt; +#endif +SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3*, int, int, int); +SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*); +SQLITE_PRIVATE void sqlite3AlterFunctions(void); +SQLITE_PRIVATE void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); +SQLITE_PRIVATE void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*); +SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *, int *); +SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...); +SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*, int); +SQLITE_PRIVATE void sqlite3CodeRhsOfIN(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3CodeSubselect(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3SelectPrep(Parse*, Select*, NameContext*); +SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); +SQLITE_PRIVATE int sqlite3MatchEName( + const struct ExprList_item*, + const char*, + const char*, + const char* +); +SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr*); +SQLITE_PRIVATE u8 sqlite3StrIHash(const char*); +SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*); +SQLITE_PRIVATE int sqlite3ResolveExprListNames(NameContext*, ExprList*); +SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); +SQLITE_PRIVATE int sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); +SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); +SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int); +SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *); +SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *); +SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse*, void*, Token*); +SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse*, void *pTo, void *pFrom); +SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse*, ExprList*); +SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*); +SQLITE_PRIVATE char sqlite3AffinityType(const char*, Column*); +SQLITE_PRIVATE void sqlite3Analyze(Parse*, Token*, Token*); +SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*); +SQLITE_PRIVATE int sqlite3FindDb(sqlite3*, Token*); +SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *, const char *); +SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3*,int iDB); +SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3*,Index*); +SQLITE_PRIVATE void sqlite3DefaultRowEst(Index*); +SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3*, int); +SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3*,Expr*,int*,char*); +SQLITE_PRIVATE void sqlite3SchemaClear(void *); +SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *, Btree *); +SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3*,int,int); +SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo*); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoRef(KeyInfo*); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse*, Index*); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList(Parse*, ExprList*, int, int); +SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse*, ExprList*); + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo*); +#endif +SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *, + void (*)(sqlite3_context*,int,sqlite3_value **), + void (*)(sqlite3_context*,int,sqlite3_value **), + void (*)(sqlite3_context*), + void (*)(sqlite3_context*), + void (*)(sqlite3_context*,int,sqlite3_value **), + FuncDestructor *pDestructor +); +SQLITE_PRIVATE void sqlite3NoopDestructor(void*); +SQLITE_PRIVATE void sqlite3OomFault(sqlite3*); +SQLITE_PRIVATE void sqlite3OomClear(sqlite3*); +SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int); +SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *); + +SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int); +SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*); +SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int); +SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int); + +SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *); +SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *, Pgno, const u8 *); + +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse*, Expr*); +#else +# define sqlite3ExprCheckIN(x,y) SQLITE_OK +#endif + +#ifdef SQLITE_ENABLE_STAT4 +SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( + Parse*,Index*,UnpackedRecord**,Expr*,int,int,int*); +SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr(Parse*, Expr*, u8, sqlite3_value**); +SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord*); +SQLITE_PRIVATE int sqlite3Stat4Column(sqlite3*, const void*, int, int, sqlite3_value**); +SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3*, Index*, int); +#endif + +/* +** The interface to the LEMON-generated parser +*/ +#ifndef SQLITE_AMALGAMATION +SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(u64), Parse*); +SQLITE_PRIVATE void sqlite3ParserFree(void*, void(*)(void*)); +#endif +SQLITE_PRIVATE void sqlite3Parser(void*, int, Token); +SQLITE_PRIVATE int sqlite3ParserFallback(int); +#ifdef YYTRACKMAXSTACKDEPTH +SQLITE_PRIVATE int sqlite3ParserStackPeak(void*); +#endif + +SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3*); +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3*); +#else +# define sqlite3CloseExtensions(X) +#endif + +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE void sqlite3TableLock(Parse *, int, int, u8, const char *); +#else + #define sqlite3TableLock(v,w,x,y,z) +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char*); +#endif + +#ifdef SQLITE_OMIT_VIRTUALTABLE +# define sqlite3VtabClear(Y) +# define sqlite3VtabSync(X,Y) SQLITE_OK +# define sqlite3VtabRollback(X) +# define sqlite3VtabCommit(X) +# define sqlite3VtabInSync(db) 0 +# define sqlite3VtabLock(X) +# define sqlite3VtabUnlock(X) +# define sqlite3VtabModuleUnref(D,X) +# define sqlite3VtabUnlockList(X) +# define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK +# define sqlite3GetVTable(X,Y) ((VTable*)0) +#else +SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table*); +SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p); +SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, Vdbe*); +SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db); +SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db); +SQLITE_PRIVATE void sqlite3VtabLock(VTable *); +SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *); +SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3*,Module*); +SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*); +SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *, int, int); +SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe*, sqlite3_vtab*); +SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*); +SQLITE_PRIVATE Module *sqlite3VtabCreateModule( + sqlite3*, + const char*, + const sqlite3_module*, + void*, + void(*)(void*) + ); +# define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0) +#endif +SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db); +#ifndef SQLITE_OMIT_VIRTUALTABLE +SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName); +SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3*,Table*,const char*); +#else +# define sqlite3ShadowTableName(A,B) 0 +# define sqlite3IsShadowTableOf(A,B,C) 0 +#endif +SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*); +SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*); +SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*); +SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int); +SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*); +SQLITE_PRIVATE void sqlite3VtabArgInit(Parse*); +SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse*, Token*); +SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3*, int, const char *, char **); +SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*); +SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *); +SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *); +SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*); +SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); +SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); +SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); +SQLITE_PRIVATE void sqlite3ParserReset(Parse*); +#ifdef SQLITE_ENABLE_NORMALIZE +SQLITE_PRIVATE char *sqlite3Normalize(Vdbe*, const char*); +#endif +SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*); +SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); +SQLITE_PRIVATE CollSeq *sqlite3ExprCompareCollSeq(Parse*,const Expr*); +SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, const Expr*, const Expr*); +SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*); +SQLITE_PRIVATE const char *sqlite3JournalModename(int); +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3*, int, int, int*, int*); +SQLITE_PRIVATE int sqlite3WalDefaultHook(void*,sqlite3*,const char*,int); +#endif +#ifndef SQLITE_OMIT_CTE +SQLITE_PRIVATE With *sqlite3WithAdd(Parse*,With*,Token*,ExprList*,Select*); +SQLITE_PRIVATE void sqlite3WithDelete(sqlite3*,With*); +SQLITE_PRIVATE void sqlite3WithPush(Parse*, With*, u8); +#else +#define sqlite3WithPush(x,y,z) +#define sqlite3WithDelete(x,y) +#endif +#ifndef SQLITE_OMIT_UPSERT +SQLITE_PRIVATE Upsert *sqlite3UpsertNew(sqlite3*,ExprList*,Expr*,ExprList*,Expr*); +SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3*,Upsert*); +SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3*,Upsert*); +SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget(Parse*,SrcList*,Upsert*); +SQLITE_PRIVATE void sqlite3UpsertDoUpdate(Parse*,Upsert*,Table*,Index*,int); +#else +#define sqlite3UpsertNew(v,w,x,y,z) ((Upsert*)0) +#define sqlite3UpsertDelete(x,y) +#define sqlite3UpsertDup(x,y) ((Upsert*)0) +#endif + + +/* Declarations for functions in fkey.c. All of these are replaced by +** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign +** key functionality is available. If OMIT_TRIGGER is defined but +** OMIT_FOREIGN_KEY is not, only some of the functions are no-oped. In +** this case foreign keys are parsed, but no other functionality is +** provided (enforcement of FK constraints requires the triggers sub-system). +*/ +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) +SQLITE_PRIVATE void sqlite3FkCheck(Parse*, Table*, int, int, int*, int); +SQLITE_PRIVATE void sqlite3FkDropTable(Parse*, SrcList *, Table*); +SQLITE_PRIVATE void sqlite3FkActions(Parse*, Table*, ExprList*, int, int*, int); +SQLITE_PRIVATE int sqlite3FkRequired(Parse*, Table*, int*, int); +SQLITE_PRIVATE u32 sqlite3FkOldmask(Parse*, Table*); +SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *); +#else + #define sqlite3FkActions(a,b,c,d,e,f) + #define sqlite3FkCheck(a,b,c,d,e,f) + #define sqlite3FkDropTable(a,b,c) + #define sqlite3FkOldmask(a,b) 0 + #define sqlite3FkRequired(a,b,c,d) 0 + #define sqlite3FkReferences(a) 0 +#endif +#ifndef SQLITE_OMIT_FOREIGN_KEY +SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *, Table*); +SQLITE_PRIVATE int sqlite3FkLocateIndex(Parse*,Table*,FKey*,Index**,int**); +#else + #define sqlite3FkDelete(a,b) + #define sqlite3FkLocateIndex(a,b,c,d,e) +#endif + + +/* +** Available fault injectors. Should be numbered beginning with 0. +*/ +#define SQLITE_FAULTINJECTOR_MALLOC 0 +#define SQLITE_FAULTINJECTOR_COUNT 1 + +/* +** The interface to the code in fault.c used for identifying "benign" +** malloc failures. This is only present if SQLITE_UNTESTABLE +** is not defined. +*/ +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void); +SQLITE_PRIVATE void sqlite3EndBenignMalloc(void); +#else + #define sqlite3BeginBenignMalloc() + #define sqlite3EndBenignMalloc() +#endif + +/* +** Allowed return values from sqlite3FindInIndex() +*/ +#define IN_INDEX_ROWID 1 /* Search the rowid of the table */ +#define IN_INDEX_EPH 2 /* Search an ephemeral b-tree */ +#define IN_INDEX_INDEX_ASC 3 /* Existing index ASCENDING */ +#define IN_INDEX_INDEX_DESC 4 /* Existing index DESCENDING */ +#define IN_INDEX_NOOP 5 /* No table available. Use comparisons */ +/* +** Allowed flags for the 3rd parameter to sqlite3FindInIndex(). +*/ +#define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ +#define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ +#define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ +SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*, int*); + +SQLITE_PRIVATE int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); +SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *); +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) +SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *); +#endif + +SQLITE_PRIVATE int sqlite3JournalIsInMemory(sqlite3_file *p); +SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *); + +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p); +#if SQLITE_MAX_EXPR_DEPTH>0 +SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *); +SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse*, int); +#else + #define sqlite3SelectExprHeight(x) 0 + #define sqlite3ExprCheckHeight(x,y) +#endif + +SQLITE_PRIVATE u32 sqlite3Get4byte(const u8*); +SQLITE_PRIVATE void sqlite3Put4byte(u8*, u32); + +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY +SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *, sqlite3 *); +SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db); +SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db); +#else + #define sqlite3ConnectionBlocked(x,y) + #define sqlite3ConnectionUnlocked(x) + #define sqlite3ConnectionClosed(x) +#endif + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3ParserTrace(FILE*, char *); +#endif +#if defined(YYCOVERAGE) +SQLITE_PRIVATE int sqlite3ParserCoverage(FILE*); +#endif + +/* +** If the SQLITE_ENABLE IOTRACE exists then the global variable +** sqlite3IoTrace is a pointer to a printf-like routine used to +** print I/O tracing messages. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +# define IOTRACE(A) if( sqlite3IoTrace ){ sqlite3IoTrace A; } +SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe*); +SQLITE_API SQLITE_EXTERN void (SQLITE_CDECL *sqlite3IoTrace)(const char*,...); +#else +# define IOTRACE(A) +# define sqlite3VdbeIOTraceSql(X) +#endif + +/* +** These routines are available for the mem2.c debugging memory allocator +** only. They are used to verify that different "types" of memory +** allocations are properly tracked by the system. +** +** sqlite3MemdebugSetType() sets the "type" of an allocation to one of +** the MEMTYPE_* macros defined below. The type must be a bitmask with +** a single bit set. +** +** sqlite3MemdebugHasType() returns true if any of the bits in its second +** argument match the type set by the previous sqlite3MemdebugSetType(). +** sqlite3MemdebugHasType() is intended for use inside assert() statements. +** +** sqlite3MemdebugNoType() returns true if none of the bits in its second +** argument match the type set by the previous sqlite3MemdebugSetType(). +** +** Perhaps the most important point is the difference between MEMTYPE_HEAP +** and MEMTYPE_LOOKASIDE. If an allocation is MEMTYPE_LOOKASIDE, that means +** it might have been allocated by lookaside, except the allocation was +** too large or lookaside was already full. It is important to verify +** that allocations that might have been satisfied by lookaside are not +** passed back to non-lookaside free() routines. Asserts such as the +** example above are placed on the non-lookaside free() routines to verify +** this constraint. +** +** All of this is no-op for a production build. It only comes into +** play when the SQLITE_MEMDEBUG compile-time option is used. +*/ +#ifdef SQLITE_MEMDEBUG +SQLITE_PRIVATE void sqlite3MemdebugSetType(void*,u8); +SQLITE_PRIVATE int sqlite3MemdebugHasType(void*,u8); +SQLITE_PRIVATE int sqlite3MemdebugNoType(void*,u8); +#else +# define sqlite3MemdebugSetType(X,Y) /* no-op */ +# define sqlite3MemdebugHasType(X,Y) 1 +# define sqlite3MemdebugNoType(X,Y) 1 +#endif +#define MEMTYPE_HEAP 0x01 /* General heap allocations */ +#define MEMTYPE_LOOKASIDE 0x02 /* Heap that might have been lookaside */ +#define MEMTYPE_PCACHE 0x04 /* Page cache allocations */ + +/* +** Threading interface +*/ +#if SQLITE_MAX_WORKER_THREADS>0 +SQLITE_PRIVATE int sqlite3ThreadCreate(SQLiteThread**,void*(*)(void*),void*); +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread*, void**); +#endif + +#if defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST) +SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3*); +#endif +#if defined(SQLITE_ENABLE_DBSTAT_VTAB) || defined(SQLITE_TEST) +SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3*); +#endif + +SQLITE_PRIVATE int sqlite3ExprVectorSize(Expr *pExpr); +SQLITE_PRIVATE int sqlite3ExprIsVector(Expr *pExpr); +SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr*, int); +SQLITE_PRIVATE Expr *sqlite3ExprForVectorField(Parse*,Expr*,int); +SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse*, Expr*); + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt); +#endif + +#endif /* SQLITEINT_H */ + +/************** End of sqliteInt.h *******************************************/ +/************** Begin file global.c ******************************************/ +/* +** 2008 June 13 +** +** 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 definitions of global variables and constants. +*/ +/* #include "sqliteInt.h" */ + +/* An array to map all upper-case characters into their corresponding +** lower-case character. +** +** SQLite only considers US-ASCII (or EBCDIC) characters. We do not +** handle case conversions for the UTF character set since the tables +** involved are nearly as big or bigger than SQLite itself. +*/ +SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = { +#ifdef SQLITE_ASCII + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121, + 122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107, + 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125, + 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161, + 162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179, + 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197, + 198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233, + 234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251, + 252,253,254,255 +#endif +#ifdef SQLITE_EBCDIC + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 0x */ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 1x */ + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 2x */ + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 3x */ + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 4x */ + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 5x */ + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 6x */ + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 7x */ + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 8x */ + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, /* 9x */ + 160,161,162,163,164,165,166,167,168,169,170,171,140,141,142,175, /* Ax */ + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, /* Bx */ + 192,129,130,131,132,133,134,135,136,137,202,203,204,205,206,207, /* Cx */ + 208,145,146,147,148,149,150,151,152,153,218,219,220,221,222,223, /* Dx */ + 224,225,162,163,164,165,166,167,168,169,234,235,236,237,238,239, /* Ex */ + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, /* Fx */ +#endif +}; + +/* +** The following 256 byte lookup table is used to support SQLites built-in +** equivalents to the following standard library functions: +** +** isspace() 0x01 +** isalpha() 0x02 +** isdigit() 0x04 +** isalnum() 0x06 +** isxdigit() 0x08 +** toupper() 0x20 +** SQLite identifier character 0x40 +** Quote character 0x80 +** +** Bit 0x20 is set if the mapped character requires translation to upper +** case. i.e. if the character is a lower-case ASCII character. +** If x is a lower-case ASCII character, then its upper-case equivalent +** is (x - 0x20). Therefore toupper() can be implemented as: +** +** (x & ~(map[x]&0x20)) +** +** The equivalent of tolower() is implemented using the sqlite3UpperToLower[] +** array. tolower() is used more often than toupper() by SQLite. +** +** Bit 0x40 is set if the character is non-alphanumeric and can be used in an +** SQLite identifier. Identifiers are alphanumerics, "_", "$", and any +** non-ASCII UTF character. Hence the test for whether or not a character is +** part of an identifier is 0x46. +*/ +SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00..07 ........ */ + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* 08..0f ........ */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 10..17 ........ */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 18..1f ........ */ + 0x01, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x80, /* 20..27 !"#$%&' */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 28..2f ()*+,-./ */ + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, /* 30..37 01234567 */ + 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 38..3f 89:;<=>? */ + + 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x02, /* 40..47 @ABCDEFG */ + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 48..4f HIJKLMNO */ + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 50..57 PQRSTUVW */ + 0x02, 0x02, 0x02, 0x80, 0x00, 0x00, 0x00, 0x40, /* 58..5f XYZ[\]^_ */ + 0x80, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x22, /* 60..67 `abcdefg */ + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 68..6f hijklmno */ + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 70..77 pqrstuvw */ + 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, /* 78..7f xyz{|}~. */ + + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 80..87 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 88..8f ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 90..97 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 98..9f ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* a0..a7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* a8..af ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* b0..b7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* b8..bf ........ */ + + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* c0..c7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* c8..cf ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* d0..d7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* d8..df ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* e0..e7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* e8..ef ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* f0..f7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 /* f8..ff ........ */ +}; + +/* EVIDENCE-OF: R-02982-34736 In order to maintain full backwards +** compatibility for legacy applications, the URI filename capability is +** disabled by default. +** +** EVIDENCE-OF: R-38799-08373 URI filenames can be enabled or disabled +** using the SQLITE_USE_URI=1 or SQLITE_USE_URI=0 compile-time options. +** +** EVIDENCE-OF: R-43642-56306 By default, URI handling is globally +** disabled. The default value may be changed by compiling with the +** SQLITE_USE_URI symbol defined. +*/ +#ifndef SQLITE_USE_URI +# define SQLITE_USE_URI 0 +#endif + +/* EVIDENCE-OF: R-38720-18127 The default setting is determined by the +** SQLITE_ALLOW_COVERING_INDEX_SCAN compile-time option, or is "on" if +** that compile-time option is omitted. +*/ +#if !defined(SQLITE_ALLOW_COVERING_INDEX_SCAN) +# define SQLITE_ALLOW_COVERING_INDEX_SCAN 1 +#else +# if !SQLITE_ALLOW_COVERING_INDEX_SCAN +# error "Compile-time disabling of covering index scan using the\ + -DSQLITE_ALLOW_COVERING_INDEX_SCAN=0 option is deprecated.\ + Contact SQLite developers if this is a problem for you, and\ + delete this #error macro to continue with your build." +# endif +#endif + +/* The minimum PMA size is set to this value multiplied by the database +** page size in bytes. +*/ +#ifndef SQLITE_SORTER_PMASZ +# define SQLITE_SORTER_PMASZ 250 +#endif + +/* Statement journals spill to disk when their size exceeds the following +** threshold (in bytes). 0 means that statement journals are created and +** written to disk immediately (the default behavior for SQLite versions +** before 3.12.0). -1 means always keep the entire statement journal in +** memory. (The statement journal is also always held entirely in memory +** if journal_mode=MEMORY or if temp_store=MEMORY, regardless of this +** setting.) +*/ +#ifndef SQLITE_STMTJRNL_SPILL +# define SQLITE_STMTJRNL_SPILL (64*1024) +#endif + +/* +** The default lookaside-configuration, the format "SZ,N". SZ is the +** number of bytes in each lookaside slot (should be a multiple of 8) +** and N is the number of slots. The lookaside-configuration can be +** changed as start-time using sqlite3_config(SQLITE_CONFIG_LOOKASIDE) +** or at run-time for an individual database connection using +** sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE); +** +** With the two-size-lookaside enhancement, less lookaside is required. +** The default configuration of 1200,40 actually provides 30 1200-byte slots +** and 93 128-byte slots, which is more lookaside than is available +** using the older 1200,100 configuration without two-size-lookaside. +*/ +#ifndef SQLITE_DEFAULT_LOOKASIDE +# ifdef SQLITE_OMIT_TWOSIZE_LOOKASIDE +# define SQLITE_DEFAULT_LOOKASIDE 1200,100 /* 120KB of memory */ +# else +# define SQLITE_DEFAULT_LOOKASIDE 1200,40 /* 48KB of memory */ +# endif +#endif + + +/* The default maximum size of an in-memory database created using +** sqlite3_deserialize() +*/ +#ifndef SQLITE_MEMDB_DEFAULT_MAXSIZE +# define SQLITE_MEMDB_DEFAULT_MAXSIZE 1073741824 +#endif + +/* +** The following singleton contains the global configuration for +** the SQLite library. +*/ +SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { + SQLITE_DEFAULT_MEMSTATUS, /* bMemstat */ + 1, /* bCoreMutex */ + SQLITE_THREADSAFE==1, /* bFullMutex */ + SQLITE_USE_URI, /* bOpenUri */ + SQLITE_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */ + 0, /* bSmallMalloc */ + 1, /* bExtraSchemaChecks */ + 0x7ffffffe, /* mxStrlen */ + 0, /* neverCorrupt */ + SQLITE_DEFAULT_LOOKASIDE, /* szLookaside, nLookaside */ + SQLITE_STMTJRNL_SPILL, /* nStmtSpill */ + {0,0,0,0,0,0,0,0}, /* m */ + {0,0,0,0,0,0,0,0,0}, /* mutex */ + {0,0,0,0,0,0,0,0,0,0,0,0,0},/* pcache2 */ + (void*)0, /* pHeap */ + 0, /* nHeap */ + 0, 0, /* mnHeap, mxHeap */ + SQLITE_DEFAULT_MMAP_SIZE, /* szMmap */ + SQLITE_MAX_MMAP_SIZE, /* mxMmap */ + (void*)0, /* pPage */ + 0, /* szPage */ + SQLITE_DEFAULT_PCACHE_INITSZ, /* nPage */ + 0, /* mxParserStack */ + 0, /* sharedCacheEnabled */ + SQLITE_SORTER_PMASZ, /* szPma */ + /* All the rest should always be initialized to zero */ + 0, /* isInit */ + 0, /* inProgress */ + 0, /* isMutexInit */ + 0, /* isMallocInit */ + 0, /* isPCacheInit */ + 0, /* nRefInitMutex */ + 0, /* pInitMutex */ + 0, /* xLog */ + 0, /* pLogArg */ +#ifdef SQLITE_ENABLE_SQLLOG + 0, /* xSqllog */ + 0, /* pSqllogArg */ +#endif +#ifdef SQLITE_VDBE_COVERAGE + 0, /* xVdbeBranch */ + 0, /* pVbeBranchArg */ +#endif +#ifdef SQLITE_ENABLE_DESERIALIZE + SQLITE_MEMDB_DEFAULT_MAXSIZE, /* mxMemdbSize */ +#endif +#ifndef SQLITE_UNTESTABLE + 0, /* xTestCallback */ +#endif + 0, /* bLocaltimeFault */ + 0x7ffffffe, /* iOnceResetThreshold */ + SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ + 0, /* iPrngSeed */ +}; + +/* +** Hash table for global functions - functions common to all +** database connections. After initialization, this table is +** read-only. +*/ +SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions; + +#ifdef VDBE_PROFILE +/* +** The following performance counter can be used in place of +** sqlite3Hwtime() for profiling. This is a no-op on standard builds. +*/ +SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt = 0; +#endif + +/* +** The value of the "pending" byte must be 0x40000000 (1 byte past the +** 1-gibabyte boundary) in a compatible database. SQLite never uses +** the database page that contains the pending byte. It never attempts +** to read or write that page. The pending byte page is set aside +** for use by the VFS layers as space for managing file locks. +** +** During testing, it is often desirable to move the pending byte to +** a different position in the file. This allows code that has to +** deal with the pending byte to run on files that are much smaller +** than 1 GiB. The sqlite3_test_control() interface can be used to +** move the pending byte. +** +** IMPORTANT: Changing the pending byte to any value other than +** 0x40000000 results in an incompatible database file format! +** Changing the pending byte during operation will result in undefined +** and incorrect behavior. +*/ +#ifndef SQLITE_OMIT_WSD +SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000; +#endif + +/* #include "opcodes.h" */ +/* +** Properties of opcodes. The OPFLG_INITIALIZER macro is +** created by mkopcodeh.awk during compilation. Data is obtained +** from the comments following the "case OP_xxxx:" statements in +** the vdbe.c file. +*/ +SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[] = OPFLG_INITIALIZER; + +/* +** Name of the default collating sequence +*/ +SQLITE_PRIVATE const char sqlite3StrBINARY[] = "BINARY"; + +/************** End of global.c **********************************************/ +/************** Begin file status.c ******************************************/ +/* +** 2008 June 18 +** +** 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 module implements the sqlite3_status() interface and related +** functionality. +*/ +/* #include "sqliteInt.h" */ +/************** Include vdbeInt.h in the middle of status.c ******************/ +/************** Begin file vdbeInt.h *****************************************/ +/* +** 2003 September 6 +** +** 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 is the header file for information that is private to the +** VDBE. This information used to all be at the top of the single +** source code file "vdbe.c". When that file became too big (over +** 6000 lines long) it was split up into several smaller files and +** this header information was factored out. +*/ +#ifndef SQLITE_VDBEINT_H +#define SQLITE_VDBEINT_H + +/* +** The maximum number of times that a statement will try to reparse +** itself before giving up and returning SQLITE_SCHEMA. +*/ +#ifndef SQLITE_MAX_SCHEMA_RETRY +# define SQLITE_MAX_SCHEMA_RETRY 50 +#endif + +/* +** VDBE_DISPLAY_P4 is true or false depending on whether or not the +** "explain" P4 display logic is enabled. +*/ +#if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \ + || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) \ + || defined(SQLITE_ENABLE_BYTECODE_VTAB) +# define VDBE_DISPLAY_P4 1 +#else +# define VDBE_DISPLAY_P4 0 +#endif + +/* +** SQL is translated into a sequence of instructions to be +** executed by a virtual machine. Each instruction is an instance +** of the following structure. +*/ +typedef struct VdbeOp Op; + +/* +** Boolean values +*/ +typedef unsigned Bool; + +/* Opaque type used by code in vdbesort.c */ +typedef struct VdbeSorter VdbeSorter; + +/* Elements of the linked list at Vdbe.pAuxData */ +typedef struct AuxData AuxData; + +/* Types of VDBE cursors */ +#define CURTYPE_BTREE 0 +#define CURTYPE_SORTER 1 +#define CURTYPE_VTAB 2 +#define CURTYPE_PSEUDO 3 + +/* +** A VdbeCursor is an superclass (a wrapper) for various cursor objects: +** +** * A b-tree cursor +** - In the main database or in an ephemeral database +** - On either an index or a table +** * A sorter +** * A virtual table +** * A one-row "pseudotable" stored in a single register +*/ +typedef struct VdbeCursor VdbeCursor; +struct VdbeCursor { + u8 eCurType; /* One of the CURTYPE_* values above */ + i8 iDb; /* Index of cursor database in db->aDb[] (or -1) */ + u8 nullRow; /* True if pointing to a row with no data */ + u8 deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */ + u8 isTable; /* True for rowid tables. False for indexes */ +#ifdef SQLITE_DEBUG + u8 seekOp; /* Most recent seek operation on this cursor */ + u8 wrFlag; /* The wrFlag argument to sqlite3BtreeCursor() */ +#endif + Bool isEphemeral:1; /* True for an ephemeral table */ + Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */ + Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ + Bool seekHit:1; /* See the OP_SeekHit and OP_IfNoHope opcodes */ + Btree *pBtx; /* Separate file holding temporary table */ + i64 seqCount; /* Sequence counter */ + int *aAltMap; /* Mapping from table to index column numbers */ + + /* Cached OP_Column parse information is only valid if cacheStatus matches + ** Vdbe.cacheCtr. Vdbe.cacheCtr will never take on the value of + ** CACHE_STALE (0) and so setting cacheStatus=CACHE_STALE guarantees that + ** the cache is out of date. */ + u32 cacheStatus; /* Cache is valid if this matches Vdbe.cacheCtr */ + int seekResult; /* Result of previous sqlite3BtreeMoveto() or 0 + ** if there have been no prior seeks on the cursor. */ + /* seekResult does not distinguish between "no seeks have ever occurred + ** on this cursor" and "the most recent seek was an exact match". + ** For CURTYPE_PSEUDO, seekResult is the register holding the record */ + + /* When a new VdbeCursor is allocated, only the fields above are zeroed. + ** The fields that follow are uninitialized, and must be individually + ** initialized prior to first use. */ + VdbeCursor *pAltCursor; /* Associated index cursor from which to read */ + union { + BtCursor *pCursor; /* CURTYPE_BTREE or _PSEUDO. Btree cursor */ + sqlite3_vtab_cursor *pVCur; /* CURTYPE_VTAB. Vtab cursor */ + VdbeSorter *pSorter; /* CURTYPE_SORTER. Sorter object */ + } uc; + KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ + u32 iHdrOffset; /* Offset to next unparsed byte of the header */ + Pgno pgnoRoot; /* Root page of the open btree cursor */ + i16 nField; /* Number of fields in the header */ + u16 nHdrParsed; /* Number of header fields parsed so far */ + i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */ + u32 *aOffset; /* Pointer to aType[nField] */ + const u8 *aRow; /* Data for the current row, if all on one page */ + u32 payloadSize; /* Total number of bytes in the record */ + u32 szRow; /* Byte available in aRow */ +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + u64 maskUsed; /* Mask of columns used by this cursor */ +#endif + + /* 2*nField extra array elements allocated for aType[], beyond the one + ** static element declared in the structure. nField total array slots for + ** aType[] and nField+1 array slots for aOffset[] */ + u32 aType[1]; /* Type values record decode. MUST BE LAST */ +}; + + +/* +** A value for VdbeCursor.cacheStatus that means the cache is always invalid. +*/ +#define CACHE_STALE 0 + +/* +** When a sub-program is executed (OP_Program), a structure of this type +** is allocated to store the current value of the program counter, as +** well as the current memory cell array and various other frame specific +** values stored in the Vdbe struct. When the sub-program is finished, +** these values are copied back to the Vdbe from the VdbeFrame structure, +** restoring the state of the VM to as it was before the sub-program +** began executing. +** +** The memory for a VdbeFrame object is allocated and managed by a memory +** cell in the parent (calling) frame. When the memory cell is deleted or +** overwritten, the VdbeFrame object is not freed immediately. Instead, it +** is linked into the Vdbe.pDelFrame list. The contents of the Vdbe.pDelFrame +** list is deleted when the VM is reset in VdbeHalt(). The reason for doing +** this instead of deleting the VdbeFrame immediately is to avoid recursive +** calls to sqlite3VdbeMemRelease() when the memory cells belonging to the +** child frame are released. +** +** The currently executing frame is stored in Vdbe.pFrame. Vdbe.pFrame is +** set to NULL if the currently executing frame is the main program. +*/ +typedef struct VdbeFrame VdbeFrame; +struct VdbeFrame { + Vdbe *v; /* VM this frame belongs to */ + VdbeFrame *pParent; /* Parent of this frame, or NULL if parent is main */ + Op *aOp; /* Program instructions for parent frame */ + i64 *anExec; /* Event counters from parent frame */ + Mem *aMem; /* Array of memory cells for parent frame */ + VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */ + u8 *aOnce; /* Bitmask used by OP_Once */ + void *token; /* Copy of SubProgram.token */ + i64 lastRowid; /* Last insert rowid (sqlite3.lastRowid) */ + AuxData *pAuxData; /* Linked list of auxdata allocations */ +#if SQLITE_DEBUG + u32 iFrameMagic; /* magic number for sanity checking */ +#endif + int nCursor; /* Number of entries in apCsr */ + int pc; /* Program Counter in parent (calling) frame */ + int nOp; /* Size of aOp array */ + int nMem; /* Number of entries in aMem */ + int nChildMem; /* Number of memory cells for child frame */ + int nChildCsr; /* Number of cursors for child frame */ + int nChange; /* Statement changes (Vdbe.nChange) */ + int nDbChange; /* Value of db->nChange */ +}; + +/* Magic number for sanity checking on VdbeFrame objects */ +#define SQLITE_FRAME_MAGIC 0x879fb71e + +/* +** Return a pointer to the array of registers allocated for use +** by a VdbeFrame. +*/ +#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))]) + +/* +** Internally, the vdbe manipulates nearly all SQL values as Mem +** structures. Each Mem struct may cache multiple representations (string, +** integer etc.) of the same value. +*/ +struct sqlite3_value { + union MemValue { + double r; /* Real value used when MEM_Real is set in flags */ + i64 i; /* Integer value used when MEM_Int is set in flags */ + int nZero; /* Extra zero bytes when MEM_Zero and MEM_Blob set */ + const char *zPType; /* Pointer type when MEM_Term|MEM_Subtype|MEM_Null */ + FuncDef *pDef; /* Used only when flags==MEM_Agg */ + } u; + u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */ + u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */ + u8 eSubtype; /* Subtype for this value */ + int n; /* Number of characters in string value, excluding '\0' */ + char *z; /* String or BLOB value */ + /* ShallowCopy only needs to copy the information above */ + char *zMalloc; /* Space to hold MEM_Str or MEM_Blob if szMalloc>0 */ + int szMalloc; /* Size of the zMalloc allocation */ + u32 uTemp; /* Transient storage for serial_type in OP_MakeRecord */ + sqlite3 *db; /* The associated database connection */ + void (*xDel)(void*);/* Destructor for Mem.z - only valid if MEM_Dyn */ +#ifdef SQLITE_DEBUG + Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */ + u16 mScopyFlags; /* flags value immediately after the shallow copy */ +#endif +}; + +/* +** Size of struct Mem not including the Mem.zMalloc member or anything that +** follows. +*/ +#define MEMCELLSIZE offsetof(Mem,zMalloc) + +/* One or more of the following flags are set to indicate the validOK +** representations of the value stored in the Mem struct. +** +** If the MEM_Null flag is set, then the value is an SQL NULL value. +** For a pointer type created using sqlite3_bind_pointer() or +** sqlite3_result_pointer() the MEM_Term and MEM_Subtype flags are also set. +** +** If the MEM_Str flag is set then Mem.z points at a string representation. +** Usually this is encoded in the same unicode encoding as the main +** database (see below for exceptions). If the MEM_Term flag is also +** set, then the string is nul terminated. The MEM_Int and MEM_Real +** flags may coexist with the MEM_Str flag. +*/ +#define MEM_Null 0x0001 /* Value is NULL (or a pointer) */ +#define MEM_Str 0x0002 /* Value is a string */ +#define MEM_Int 0x0004 /* Value is an integer */ +#define MEM_Real 0x0008 /* Value is a real number */ +#define MEM_Blob 0x0010 /* Value is a BLOB */ +#define MEM_IntReal 0x0020 /* MEM_Int that stringifies like MEM_Real */ +#define MEM_AffMask 0x003f /* Mask of affinity bits */ +#define MEM_FromBind 0x0040 /* Value originates from sqlite3_bind() */ +#define MEM_Undefined 0x0080 /* Value is undefined */ +#define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */ +#define MEM_TypeMask 0xc1bf /* Mask of type bits */ + + +/* Whenever Mem contains a valid string or blob representation, one of +** the following flags must be set to determine the memory management +** policy for Mem.z. The MEM_Term flag tells us whether or not the +** string is \000 or \u0000 terminated +*/ +#define MEM_Term 0x0200 /* String in Mem.z is zero terminated */ +#define MEM_Dyn 0x0400 /* Need to call Mem.xDel() on Mem.z */ +#define MEM_Static 0x0800 /* Mem.z points to a static string */ +#define MEM_Ephem 0x1000 /* Mem.z points to an ephemeral string */ +#define MEM_Agg 0x2000 /* Mem.z points to an agg function context */ +#define MEM_Zero 0x4000 /* Mem.i contains count of 0s appended to blob */ +#define MEM_Subtype 0x8000 /* Mem.eSubtype is valid */ +#ifdef SQLITE_OMIT_INCRBLOB + #undef MEM_Zero + #define MEM_Zero 0x0000 +#endif + +/* Return TRUE if Mem X contains dynamically allocated content - anything +** that needs to be deallocated to avoid a leak. +*/ +#define VdbeMemDynamic(X) \ + (((X)->flags&(MEM_Agg|MEM_Dyn))!=0) + +/* +** Clear any existing type flags from a Mem and replace them with f +*/ +#define MemSetTypeFlag(p, f) \ + ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f) + +/* +** True if Mem X is a NULL-nochng type. +*/ +#define MemNullNochng(X) \ + (((X)->flags&MEM_TypeMask)==(MEM_Null|MEM_Zero) \ + && (X)->n==0 && (X)->u.nZero==0) + +/* +** Return true if a memory cell is not marked as invalid. This macro +** is for use inside assert() statements only. +*/ +#ifdef SQLITE_DEBUG +#define memIsValid(M) ((M)->flags & MEM_Undefined)==0 +#endif + +/* +** Each auxiliary data pointer stored by a user defined function +** implementation calling sqlite3_set_auxdata() is stored in an instance +** of this structure. All such structures associated with a single VM +** are stored in a linked list headed at Vdbe.pAuxData. All are destroyed +** when the VM is halted (if not before). +*/ +struct AuxData { + int iAuxOp; /* Instruction number of OP_Function opcode */ + int iAuxArg; /* Index of function argument. */ + void *pAux; /* Aux data pointer */ + void (*xDeleteAux)(void*); /* Destructor for the aux data */ + AuxData *pNextAux; /* Next element in list */ +}; + +/* +** The "context" argument for an installable function. A pointer to an +** instance of this structure is the first argument to the routines used +** implement the SQL functions. +** +** There is a typedef for this structure in sqlite.h. So all routines, +** even the public interface to SQLite, can use a pointer to this structure. +** But this file is the only place where the internal details of this +** structure are known. +** +** This structure is defined inside of vdbeInt.h because it uses substructures +** (Mem) which are only defined there. +*/ +struct sqlite3_context { + Mem *pOut; /* The return value is stored here */ + FuncDef *pFunc; /* Pointer to function information */ + Mem *pMem; /* Memory cell used to store aggregate context */ + Vdbe *pVdbe; /* The VM that owns this context */ + int iOp; /* Instruction number of OP_Function */ + int isError; /* Error code returned by the function. */ + u8 skipFlag; /* Skip accumulator loading if true */ + u8 argc; /* Number of arguments */ + sqlite3_value *argv[1]; /* Argument set */ +}; + +/* A bitfield type for use inside of structures. Always follow with :N where +** N is the number of bits. +*/ +typedef unsigned bft; /* Bit Field Type */ + +/* The ScanStatus object holds a single value for the +** sqlite3_stmt_scanstatus() interface. +*/ +typedef struct ScanStatus ScanStatus; +struct ScanStatus { + int addrExplain; /* OP_Explain for loop */ + int addrLoop; /* Address of "loops" counter */ + int addrVisit; /* Address of "rows visited" counter */ + int iSelectID; /* The "Select-ID" for this loop */ + LogEst nEst; /* Estimated output rows per loop */ + char *zName; /* Name of table or index */ +}; + +/* The DblquoteStr object holds the text of a double-quoted +** string for a prepared statement. A linked list of these objects +** is constructed during statement parsing and is held on Vdbe.pDblStr. +** When computing a normalized SQL statement for an SQL statement, that +** list is consulted for each double-quoted identifier to see if the +** identifier should really be a string literal. +*/ +typedef struct DblquoteStr DblquoteStr; +struct DblquoteStr { + DblquoteStr *pNextStr; /* Next string literal in the list */ + char z[8]; /* Dequoted value for the string */ +}; + +/* +** An instance of the virtual machine. This structure contains the complete +** state of the virtual machine. +** +** The "sqlite3_stmt" structure pointer that is returned by sqlite3_prepare() +** is really a pointer to an instance of this structure. +*/ +struct Vdbe { + sqlite3 *db; /* The database connection that owns this statement */ + Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */ + Parse *pParse; /* Parsing context used to create this Vdbe */ + ynVar nVar; /* Number of entries in aVar[] */ + u32 magic; /* Magic number for sanity checking */ + int nMem; /* Number of memory locations currently allocated */ + int nCursor; /* Number of slots in apCsr[] */ + u32 cacheCtr; /* VdbeCursor row cache generation counter */ + int pc; /* The program counter */ + int rc; /* Value to return */ + int nChange; /* Number of db changes made since last reset */ + int iStatement; /* Statement number (or 0 if has no opened stmt) */ + i64 iCurrentTime; /* Value of julianday('now') for this statement */ + i64 nFkConstraint; /* Number of imm. FK constraints this VM */ + i64 nStmtDefCons; /* Number of def. constraints when stmt started */ + i64 nStmtDefImmCons; /* Number of def. imm constraints when stmt started */ + Mem *aMem; /* The memory locations */ + Mem **apArg; /* Arguments to currently executing user function */ + VdbeCursor **apCsr; /* One element of this array for each open cursor */ + Mem *aVar; /* Values for the OP_Variable opcode. */ + + /* When allocating a new Vdbe object, all of the fields below should be + ** initialized to zero or NULL */ + + Op *aOp; /* Space to hold the virtual machine's program */ + int nOp; /* Number of instructions in the program */ + int nOpAlloc; /* Slots allocated for aOp[] */ + Mem *aColName; /* Column names to return */ + Mem *pResultSet; /* Pointer to an array of results */ + char *zErrMsg; /* Error message written here */ + VList *pVList; /* Name of variables */ +#ifndef SQLITE_OMIT_TRACE + i64 startTime; /* Time when query started - used for profiling */ +#endif +#ifdef SQLITE_DEBUG + int rcApp; /* errcode set by sqlite3_result_error_code() */ + u32 nWrite; /* Number of write operations that have occurred */ +#endif + u16 nResColumn; /* Number of columns in one row of the result set */ + u8 errorAction; /* Recovery action to do in case of an error */ + u8 minWriteFileFormat; /* Minimum file format for writable database files */ + u8 prepFlags; /* SQLITE_PREPARE_* flags */ + u8 doingRerun; /* True if rerunning after an auto-reprepare */ + bft expired:2; /* 1: recompile VM immediately 2: when convenient */ + bft explain:2; /* True if EXPLAIN present on SQL command */ + bft changeCntOn:1; /* True to update the change-counter */ + bft runOnlyOnce:1; /* Automatically expire on reset */ + bft usesStmtJournal:1; /* True if uses a statement journal */ + bft readOnly:1; /* True for statements that do not write */ + bft bIsReader:1; /* True for statements that read */ + yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */ + yDbMask lockMask; /* Subset of btreeMask that requires a lock */ + u32 aCounter[7]; /* Counters used by sqlite3_stmt_status() */ + char *zSql; /* Text of the SQL statement that generated this */ +#ifdef SQLITE_ENABLE_NORMALIZE + char *zNormSql; /* Normalization of the associated SQL statement */ + DblquoteStr *pDblStr; /* List of double-quoted string literals */ +#endif + void *pFree; /* Free this when deleting the vdbe */ + VdbeFrame *pFrame; /* Parent frame */ + VdbeFrame *pDelFrame; /* List of frame objects to free on VM reset */ + int nFrame; /* Number of frames in pFrame list */ + u32 expmask; /* Binding to these vars invalidates VM */ + SubProgram *pProgram; /* Linked list of all sub-programs used by VM */ + AuxData *pAuxData; /* Linked list of auxdata allocations */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + i64 *anExec; /* Number of times each op has been executed */ + int nScan; /* Entries in aScan[] */ + ScanStatus *aScan; /* Scan definitions for sqlite3_stmt_scanstatus() */ +#endif +}; + +/* +** The following are allowed values for Vdbe.magic +*/ +#define VDBE_MAGIC_INIT 0x16bceaa5 /* Building a VDBE program */ +#define VDBE_MAGIC_RUN 0x2df20da3 /* VDBE is ready to execute */ +#define VDBE_MAGIC_HALT 0x319c2973 /* VDBE has completed execution */ +#define VDBE_MAGIC_RESET 0x48fa9f76 /* Reset and ready to run again */ +#define VDBE_MAGIC_DEAD 0x5606c3c8 /* The VDBE has been deallocated */ + +/* +** Structure used to store the context required by the +** sqlite3_preupdate_*() API functions. +*/ +struct PreUpdate { + Vdbe *v; + VdbeCursor *pCsr; /* Cursor to read old values from */ + int op; /* One of SQLITE_INSERT, UPDATE, DELETE */ + u8 *aRecord; /* old.* database record */ + KeyInfo keyinfo; + UnpackedRecord *pUnpacked; /* Unpacked version of aRecord[] */ + UnpackedRecord *pNewUnpacked; /* Unpacked version of new.* record */ + int iNewReg; /* Register for new.* values */ + i64 iKey1; /* First key value passed to hook */ + i64 iKey2; /* Second key value passed to hook */ + Mem *aNew; /* Array of new.* values */ + Table *pTab; /* Schema object being upated */ + Index *pPk; /* PK index if pTab is WITHOUT ROWID */ +}; + +/* +** Function prototypes +*/ +SQLITE_PRIVATE void sqlite3VdbeError(Vdbe*, const char *, ...); +SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*); +void sqliteVdbePopStack(Vdbe*,int); +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor*); +SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor**, int*); +SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*); +SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32); +SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8); +SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); +SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); +SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); + +int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); +SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*); +SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor*, i64*); +SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*); +#if !defined(SQLITE_OMIT_EXPLAIN) || defined(SQLITE_ENABLE_BYTECODE_VTAB) +SQLITE_PRIVATE int sqlite3VdbeNextOpcode(Vdbe*,Mem*,int,int*,int*,Op**); +SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3*,Op*); +#endif +#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) +SQLITE_PRIVATE char *sqlite3VdbeDisplayComment(sqlite3*,const Op*,const char*); +#endif +#if !defined(SQLITE_OMIT_EXPLAIN) +SQLITE_PRIVATE int sqlite3VdbeList(Vdbe*); +#endif +SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *, int); +SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem*, const Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem*, const Mem*, int); +SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem*, Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemSetStr(Mem*, const char*, int, u8, void(*)(void*)); +SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem*, i64); +#ifdef SQLITE_OMIT_FLOATING_POINT +# define sqlite3VdbeMemSetDouble sqlite3VdbeMemSetInt64 +#else +SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem*, double); +#endif +SQLITE_PRIVATE void sqlite3VdbeMemSetPointer(Mem*, void*, const char*, void(*)(void*)); +SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem*,sqlite3*,u16); +SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*,int); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem*); +#endif +SQLITE_PRIVATE int sqlite3VdbeMemSetRowSet(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, u8, u8); +SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*); +SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*); +SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem*, int ifNull); +SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem*,u8,u8); +SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemFromBtreeZeroOffset(BtCursor*,u32,Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); +SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*); +#endif +#if !defined(SQLITE_OMIT_EXPLAIN) || defined(SQLITE_ENABLE_BYTECODE_VTAB) +SQLITE_PRIVATE const char *sqlite3OpcodeName(int); +#endif +SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve); +SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int n); +SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3VdbeFrameIsValid(VdbeFrame*); +#endif +SQLITE_PRIVATE void sqlite3VdbeFrameMemDel(void*); /* Destructor on Mem */ +SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*); /* Actually deletes the Frame */ +SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +SQLITE_PRIVATE void sqlite3VdbePreUpdateHook(Vdbe*,VdbeCursor*,int,const char*,Table*,i64,int); +#endif +SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p); + +SQLITE_PRIVATE int sqlite3VdbeSorterInit(sqlite3 *, int, VdbeCursor *); +SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *, VdbeSorter *); +SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *, VdbeCursor *); +SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *, Mem *); +SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *, const VdbeCursor *); +SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *, int *); +SQLITE_PRIVATE int sqlite3VdbeSorterWrite(const VdbeCursor *, Mem *); +SQLITE_PRIVATE int sqlite3VdbeSorterCompare(const VdbeCursor *, Mem *, int, int *); + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe*, VdbeCursor*); +SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe*); +#else +# define sqlite3VdbeIncrWriteCounter(V,C) +# define sqlite3VdbeAssertAbortable(V) +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) +SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe*); +#else +# define sqlite3VdbeEnter(X) +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 +SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe*); +#else +# define sqlite3VdbeLeave(X) +#endif + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe*,Mem*); +SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem*); +#endif + +#ifndef SQLITE_OMIT_FOREIGN_KEY +SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int); +#else +# define sqlite3VdbeCheckFk(p,i) 0 +#endif + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr); +#endif +#ifndef SQLITE_OMIT_UTF16 +SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8); +SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem); +#endif + +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *); + #define ExpandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0) +#else + #define sqlite3VdbeMemExpandBlob(x) SQLITE_OK + #define ExpandBlob(P) SQLITE_OK +#endif + +#endif /* !defined(SQLITE_VDBEINT_H) */ + +/************** End of vdbeInt.h *********************************************/ +/************** Continuing where we left off in status.c *********************/ + +/* +** Variables in which to record status information. +*/ +#if SQLITE_PTRSIZE>4 +typedef sqlite3_int64 sqlite3StatValueType; +#else +typedef u32 sqlite3StatValueType; +#endif +typedef struct sqlite3StatType sqlite3StatType; +static SQLITE_WSD struct sqlite3StatType { + sqlite3StatValueType nowValue[10]; /* Current value */ + sqlite3StatValueType mxValue[10]; /* Maximum value */ +} sqlite3Stat = { {0,}, {0,} }; + +/* +** Elements of sqlite3Stat[] are protected by either the memory allocator +** mutex, or by the pcache1 mutex. The following array determines which. +*/ +static const char statMutex[] = { + 0, /* SQLITE_STATUS_MEMORY_USED */ + 1, /* SQLITE_STATUS_PAGECACHE_USED */ + 1, /* SQLITE_STATUS_PAGECACHE_OVERFLOW */ + 0, /* SQLITE_STATUS_SCRATCH_USED */ + 0, /* SQLITE_STATUS_SCRATCH_OVERFLOW */ + 0, /* SQLITE_STATUS_MALLOC_SIZE */ + 0, /* SQLITE_STATUS_PARSER_STACK */ + 1, /* SQLITE_STATUS_PAGECACHE_SIZE */ + 0, /* SQLITE_STATUS_SCRATCH_SIZE */ + 0, /* SQLITE_STATUS_MALLOC_COUNT */ +}; + + +/* The "wsdStat" macro will resolve to the status information +** state vector. If writable static data is unsupported on the target, +** we have to locate the state vector at run-time. In the more common +** case where writable static data is supported, wsdStat can refer directly +** to the "sqlite3Stat" state vector declared above. +*/ +#ifdef SQLITE_OMIT_WSD +# define wsdStatInit sqlite3StatType *x = &GLOBAL(sqlite3StatType,sqlite3Stat) +# define wsdStat x[0] +#else +# define wsdStatInit +# define wsdStat sqlite3Stat +#endif + +/* +** Return the current value of a status parameter. The caller must +** be holding the appropriate mutex. +*/ +SQLITE_PRIVATE sqlite3_int64 sqlite3StatusValue(int op){ + wsdStatInit; + assert( op>=0 && op=0 && op=0 && op=0 && opwsdStat.mxValue[op] ){ + wsdStat.mxValue[op] = wsdStat.nowValue[op]; + } +} +SQLITE_PRIVATE void sqlite3StatusDown(int op, int N){ + wsdStatInit; + assert( N>=0 ); + assert( op>=0 && op=0 && op=0 ); + newValue = (sqlite3StatValueType)X; + assert( op>=0 && op=0 && opwsdStat.mxValue[op] ){ + wsdStat.mxValue[op] = newValue; + } +} + +/* +** Query status information. +*/ +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +){ + sqlite3_mutex *pMutex; + wsdStatInit; + if( op<0 || op>=ArraySize(wsdStat.nowValue) ){ + return SQLITE_MISUSE_BKPT; + } +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCurrent==0 || pHighwater==0 ) return SQLITE_MISUSE_BKPT; +#endif + pMutex = statMutex[op] ? sqlite3Pcache1Mutex() : sqlite3MallocMutex(); + sqlite3_mutex_enter(pMutex); + *pCurrent = wsdStat.nowValue[op]; + *pHighwater = wsdStat.mxValue[op]; + if( resetFlag ){ + wsdStat.mxValue[op] = wsdStat.nowValue[op]; + } + sqlite3_mutex_leave(pMutex); + (void)pMutex; /* Prevent warning when SQLITE_THREADSAFE=0 */ + return SQLITE_OK; +} +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){ + sqlite3_int64 iCur = 0, iHwtr = 0; + int rc; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCurrent==0 || pHighwater==0 ) return SQLITE_MISUSE_BKPT; +#endif + rc = sqlite3_status64(op, &iCur, &iHwtr, resetFlag); + if( rc==0 ){ + *pCurrent = (int)iCur; + *pHighwater = (int)iHwtr; + } + return rc; +} + +/* +** Return the number of LookasideSlot elements on the linked list +*/ +static u32 countLookasideSlots(LookasideSlot *p){ + u32 cnt = 0; + while( p ){ + p = p->pNext; + cnt++; + } + return cnt; +} + +/* +** Count the number of slots of lookaside memory that are outstanding +*/ +SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3 *db, int *pHighwater){ + u32 nInit = countLookasideSlots(db->lookaside.pInit); + u32 nFree = countLookasideSlots(db->lookaside.pFree); +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + nInit += countLookasideSlots(db->lookaside.pSmallInit); + nFree += countLookasideSlots(db->lookaside.pSmallFree); +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + if( pHighwater ) *pHighwater = db->lookaside.nSlot - nInit; + return db->lookaside.nSlot - (nInit+nFree); +} + +/* +** Query status information for a single database connection +*/ +SQLITE_API int sqlite3_db_status( + sqlite3 *db, /* The database connection whose status is desired */ + int op, /* Status verb */ + int *pCurrent, /* Write current value here */ + int *pHighwater, /* Write high-water mark here */ + int resetFlag /* Reset high-water mark if true */ +){ + int rc = SQLITE_OK; /* Return code */ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || pCurrent==0|| pHighwater==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + switch( op ){ + case SQLITE_DBSTATUS_LOOKASIDE_USED: { + *pCurrent = sqlite3LookasideUsed(db, pHighwater); + if( resetFlag ){ + LookasideSlot *p = db->lookaside.pFree; + if( p ){ + while( p->pNext ) p = p->pNext; + p->pNext = db->lookaside.pInit; + db->lookaside.pInit = db->lookaside.pFree; + db->lookaside.pFree = 0; + } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + p = db->lookaside.pSmallFree; + if( p ){ + while( p->pNext ) p = p->pNext; + p->pNext = db->lookaside.pSmallInit; + db->lookaside.pSmallInit = db->lookaside.pSmallFree; + db->lookaside.pSmallFree = 0; + } +#endif + } + break; + } + + case SQLITE_DBSTATUS_LOOKASIDE_HIT: + case SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE: + case SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL: { + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_HIT ); + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE ); + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL ); + assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)>=0 ); + assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)<3 ); + *pCurrent = 0; + *pHighwater = db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT]; + if( resetFlag ){ + db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT] = 0; + } + break; + } + + /* + ** Return an approximation for the amount of memory currently used + ** by all pagers associated with the given database connection. The + ** highwater mark is meaningless and is returned as zero. + */ + case SQLITE_DBSTATUS_CACHE_USED_SHARED: + case SQLITE_DBSTATUS_CACHE_USED: { + int totalUsed = 0; + int i; + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + Pager *pPager = sqlite3BtreePager(pBt); + int nByte = sqlite3PagerMemUsed(pPager); + if( op==SQLITE_DBSTATUS_CACHE_USED_SHARED ){ + nByte = nByte / sqlite3BtreeConnectionCount(pBt); + } + totalUsed += nByte; + } + } + sqlite3BtreeLeaveAll(db); + *pCurrent = totalUsed; + *pHighwater = 0; + break; + } + + /* + ** *pCurrent gets an accurate estimate of the amount of memory used + ** to store the schema for all databases (main, temp, and any ATTACHed + ** databases. *pHighwater is set to zero. + */ + case SQLITE_DBSTATUS_SCHEMA_USED: { + int i; /* Used to iterate through schemas */ + int nByte = 0; /* Used to accumulate return value */ + + sqlite3BtreeEnterAll(db); + db->pnBytesFreed = &nByte; + for(i=0; inDb; i++){ + Schema *pSchema = db->aDb[i].pSchema; + if( ALWAYS(pSchema!=0) ){ + HashElem *p; + + nByte += sqlite3GlobalConfig.m.xRoundup(sizeof(HashElem)) * ( + pSchema->tblHash.count + + pSchema->trigHash.count + + pSchema->idxHash.count + + pSchema->fkeyHash.count + ); + nByte += sqlite3_msize(pSchema->tblHash.ht); + nByte += sqlite3_msize(pSchema->trigHash.ht); + nByte += sqlite3_msize(pSchema->idxHash.ht); + nByte += sqlite3_msize(pSchema->fkeyHash.ht); + + for(p=sqliteHashFirst(&pSchema->trigHash); p; p=sqliteHashNext(p)){ + sqlite3DeleteTrigger(db, (Trigger*)sqliteHashData(p)); + } + for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){ + sqlite3DeleteTable(db, (Table *)sqliteHashData(p)); + } + } + } + db->pnBytesFreed = 0; + sqlite3BtreeLeaveAll(db); + + *pHighwater = 0; + *pCurrent = nByte; + break; + } + + /* + ** *pCurrent gets an accurate estimate of the amount of memory used + ** to store all prepared statements. + ** *pHighwater is set to zero. + */ + case SQLITE_DBSTATUS_STMT_USED: { + struct Vdbe *pVdbe; /* Used to iterate through VMs */ + int nByte = 0; /* Used to accumulate return value */ + + db->pnBytesFreed = &nByte; + for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){ + sqlite3VdbeClearObject(db, pVdbe); + sqlite3DbFree(db, pVdbe); + } + db->pnBytesFreed = 0; + + *pHighwater = 0; /* IMP: R-64479-57858 */ + *pCurrent = nByte; + + break; + } + + /* + ** Set *pCurrent to the total cache hits or misses encountered by all + ** pagers the database handle is connected to. *pHighwater is always set + ** to zero. + */ + case SQLITE_DBSTATUS_CACHE_SPILL: + op = SQLITE_DBSTATUS_CACHE_WRITE+1; + /* Fall through into the next case */ + case SQLITE_DBSTATUS_CACHE_HIT: + case SQLITE_DBSTATUS_CACHE_MISS: + case SQLITE_DBSTATUS_CACHE_WRITE:{ + int i; + int nRet = 0; + assert( SQLITE_DBSTATUS_CACHE_MISS==SQLITE_DBSTATUS_CACHE_HIT+1 ); + assert( SQLITE_DBSTATUS_CACHE_WRITE==SQLITE_DBSTATUS_CACHE_HIT+2 ); + + for(i=0; inDb; i++){ + if( db->aDb[i].pBt ){ + Pager *pPager = sqlite3BtreePager(db->aDb[i].pBt); + sqlite3PagerCacheStat(pPager, op, resetFlag, &nRet); + } + } + *pHighwater = 0; /* IMP: R-42420-56072 */ + /* IMP: R-54100-20147 */ + /* IMP: R-29431-39229 */ + *pCurrent = nRet; + break; + } + + /* Set *pCurrent to non-zero if there are unresolved deferred foreign + ** key constraints. Set *pCurrent to zero if all foreign key constraints + ** have been satisfied. The *pHighwater is always set to zero. + */ + case SQLITE_DBSTATUS_DEFERRED_FKS: { + *pHighwater = 0; /* IMP: R-11967-56545 */ + *pCurrent = db->nDeferredImmCons>0 || db->nDeferredCons>0; + break; + } + + default: { + rc = SQLITE_ERROR; + } + } + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/************** End of status.c **********************************************/ +/************** Begin file date.c ********************************************/ +/* +** 2003 October 31 +** +** 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 the C functions that implement date and time +** functions for SQLite. +** +** There is only one exported symbol in this file - the function +** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. +** All other code has file scope. +** +** SQLite processes all times and dates as julian day numbers. The +** dates and times are stored as the number of days since noon +** in Greenwich on November 24, 4714 B.C. according to the Gregorian +** calendar system. +** +** 1970-01-01 00:00:00 is JD 2440587.5 +** 2000-01-01 00:00:00 is JD 2451544.5 +** +** This implementation requires years to be expressed as a 4-digit number +** which means that only dates between 0000-01-01 and 9999-12-31 can +** be represented, even though julian day numbers allow a much wider +** range of dates. +** +** The Gregorian calendar system is used for all dates and times, +** even those that predate the Gregorian calendar. Historians usually +** use the julian calendar for dates prior to 1582-10-15 and for some +** dates afterwards, depending on locale. Beware of this difference. +** +** The conversion algorithms are implemented based on descriptions +** in the following text: +** +** Jean Meeus +** Astronomical Algorithms, 2nd Edition, 1998 +** ISBN 0-943396-61-1 +** Willmann-Bell, Inc +** Richmond, Virginia (USA) +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ +#include + +#ifndef SQLITE_OMIT_DATETIME_FUNCS + +/* +** The MSVC CRT on Windows CE may not have a localtime() function. +** So declare a substitute. The substitute function itself is +** defined in "os_win.c". +*/ +#if !defined(SQLITE_OMIT_LOCALTIME) && defined(_WIN32_WCE) && \ + (!defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API) +struct tm *__cdecl localtime(const time_t *); +#endif + +/* +** A structure for holding a single date and time. +*/ +typedef struct DateTime DateTime; +struct DateTime { + sqlite3_int64 iJD; /* The julian day number times 86400000 */ + int Y, M, D; /* Year, month, and day */ + int h, m; /* Hour and minutes */ + int tz; /* Timezone offset in minutes */ + double s; /* Seconds */ + char validJD; /* True (1) if iJD is valid */ + char rawS; /* Raw numeric value stored in s */ + char validYMD; /* True (1) if Y,M,D are valid */ + char validHMS; /* True (1) if h,m,s are valid */ + char validTZ; /* True (1) if tz is valid */ + char tzSet; /* Timezone was set explicitly */ + char isError; /* An overflow has occurred */ +}; + + +/* +** Convert zDate into one or more integers according to the conversion +** specifier zFormat. +** +** zFormat[] contains 4 characters for each integer converted, except for +** the last integer which is specified by three characters. The meaning +** of a four-character format specifiers ABCD is: +** +** A: number of digits to convert. Always "2" or "4". +** B: minimum value. Always "0" or "1". +** C: maximum value, decoded as: +** a: 12 +** b: 14 +** c: 24 +** d: 31 +** e: 59 +** f: 9999 +** D: the separator character, or \000 to indicate this is the +** last number to convert. +** +** Example: To translate an ISO-8601 date YYYY-MM-DD, the format would +** be "40f-21a-20c". The "40f-" indicates the 4-digit year followed by "-". +** The "21a-" indicates the 2-digit month followed by "-". The "20c" indicates +** the 2-digit day which is the last integer in the set. +** +** The function returns the number of successful conversions. +*/ +static int getDigits(const char *zDate, const char *zFormat, ...){ + /* The aMx[] array translates the 3rd character of each format + ** spec into a max size: a b c d e f */ + static const u16 aMx[] = { 12, 14, 24, 31, 59, 9999 }; + va_list ap; + int cnt = 0; + char nextC; + va_start(ap, zFormat); + do{ + char N = zFormat[0] - '0'; + char min = zFormat[1] - '0'; + int val = 0; + u16 max; + + assert( zFormat[2]>='a' && zFormat[2]<='f' ); + max = aMx[zFormat[2] - 'a']; + nextC = zFormat[3]; + val = 0; + while( N-- ){ + if( !sqlite3Isdigit(*zDate) ){ + goto end_getDigits; + } + val = val*10 + *zDate - '0'; + zDate++; + } + if( val<(int)min || val>(int)max || (nextC!=0 && nextC!=*zDate) ){ + goto end_getDigits; + } + *va_arg(ap,int*) = val; + zDate++; + cnt++; + zFormat += 4; + }while( nextC ); +end_getDigits: + va_end(ap); + return cnt; +} + +/* +** Parse a timezone extension on the end of a date-time. +** The extension is of the form: +** +** (+/-)HH:MM +** +** Or the "zulu" notation: +** +** Z +** +** If the parse is successful, write the number of minutes +** of change in p->tz and return 0. If a parser error occurs, +** return non-zero. +** +** A missing specifier is not considered an error. +*/ +static int parseTimezone(const char *zDate, DateTime *p){ + int sgn = 0; + int nHr, nMn; + int c; + while( sqlite3Isspace(*zDate) ){ zDate++; } + p->tz = 0; + c = *zDate; + if( c=='-' ){ + sgn = -1; + }else if( c=='+' ){ + sgn = +1; + }else if( c=='Z' || c=='z' ){ + zDate++; + goto zulu_time; + }else{ + return c!=0; + } + zDate++; + if( getDigits(zDate, "20b:20e", &nHr, &nMn)!=2 ){ + return 1; + } + zDate += 5; + p->tz = sgn*(nMn + nHr*60); +zulu_time: + while( sqlite3Isspace(*zDate) ){ zDate++; } + p->tzSet = 1; + return *zDate!=0; +} + +/* +** Parse times of the form HH:MM or HH:MM:SS or HH:MM:SS.FFFF. +** The HH, MM, and SS must each be exactly 2 digits. The +** fractional seconds FFFF can be one or more digits. +** +** Return 1 if there is a parsing error and 0 on success. +*/ +static int parseHhMmSs(const char *zDate, DateTime *p){ + int h, m, s; + double ms = 0.0; + if( getDigits(zDate, "20c:20e", &h, &m)!=2 ){ + return 1; + } + zDate += 5; + if( *zDate==':' ){ + zDate++; + if( getDigits(zDate, "20e", &s)!=1 ){ + return 1; + } + zDate += 2; + if( *zDate=='.' && sqlite3Isdigit(zDate[1]) ){ + double rScale = 1.0; + zDate++; + while( sqlite3Isdigit(*zDate) ){ + ms = ms*10.0 + *zDate - '0'; + rScale *= 10.0; + zDate++; + } + ms /= rScale; + } + }else{ + s = 0; + } + p->validJD = 0; + p->rawS = 0; + p->validHMS = 1; + p->h = h; + p->m = m; + p->s = s + ms; + if( parseTimezone(zDate, p) ) return 1; + p->validTZ = (p->tz!=0)?1:0; + return 0; +} + +/* +** Put the DateTime object into its error state. +*/ +static void datetimeError(DateTime *p){ + memset(p, 0, sizeof(*p)); + p->isError = 1; +} + +/* +** Convert from YYYY-MM-DD HH:MM:SS to julian day. We always assume +** that the YYYY-MM-DD is according to the Gregorian calendar. +** +** Reference: Meeus page 61 +*/ +static void computeJD(DateTime *p){ + int Y, M, D, A, B, X1, X2; + + if( p->validJD ) return; + if( p->validYMD ){ + Y = p->Y; + M = p->M; + D = p->D; + }else{ + Y = 2000; /* If no YMD specified, assume 2000-Jan-01 */ + M = 1; + D = 1; + } + if( Y<-4713 || Y>9999 || p->rawS ){ + datetimeError(p); + return; + } + if( M<=2 ){ + Y--; + M += 12; + } + A = Y/100; + B = 2 - A + (A/4); + X1 = 36525*(Y+4716)/100; + X2 = 306001*(M+1)/10000; + p->iJD = (sqlite3_int64)((X1 + X2 + D + B - 1524.5 ) * 86400000); + p->validJD = 1; + if( p->validHMS ){ + p->iJD += p->h*3600000 + p->m*60000 + (sqlite3_int64)(p->s*1000); + if( p->validTZ ){ + p->iJD -= p->tz*60000; + p->validYMD = 0; + p->validHMS = 0; + p->validTZ = 0; + } + } +} + +/* +** Parse dates of the form +** +** YYYY-MM-DD HH:MM:SS.FFF +** YYYY-MM-DD HH:MM:SS +** YYYY-MM-DD HH:MM +** YYYY-MM-DD +** +** Write the result into the DateTime structure and return 0 +** on success and 1 if the input string is not a well-formed +** date. +*/ +static int parseYyyyMmDd(const char *zDate, DateTime *p){ + int Y, M, D, neg; + + if( zDate[0]=='-' ){ + zDate++; + neg = 1; + }else{ + neg = 0; + } + if( getDigits(zDate, "40f-21a-21d", &Y, &M, &D)!=3 ){ + return 1; + } + zDate += 10; + while( sqlite3Isspace(*zDate) || 'T'==*(u8*)zDate ){ zDate++; } + if( parseHhMmSs(zDate, p)==0 ){ + /* We got the time */ + }else if( *zDate==0 ){ + p->validHMS = 0; + }else{ + return 1; + } + p->validJD = 0; + p->validYMD = 1; + p->Y = neg ? -Y : Y; + p->M = M; + p->D = D; + if( p->validTZ ){ + computeJD(p); + } + return 0; +} + +/* +** Set the time to the current time reported by the VFS. +** +** Return the number of errors. +*/ +static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ + p->iJD = sqlite3StmtCurrentTime(context); + if( p->iJD>0 ){ + p->validJD = 1; + return 0; + }else{ + return 1; + } +} + +/* +** Input "r" is a numeric quantity which might be a julian day number, +** or the number of seconds since 1970. If the value if r is within +** range of a julian day number, install it as such and set validJD. +** If the value is a valid unix timestamp, put it in p->s and set p->rawS. +*/ +static void setRawDateNumber(DateTime *p, double r){ + p->s = r; + p->rawS = 1; + if( r>=0.0 && r<5373484.5 ){ + p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5); + p->validJD = 1; + } +} + +/* +** Attempt to parse the given string into a julian day number. Return +** the number of errors. +** +** The following are acceptable forms for the input string: +** +** YYYY-MM-DD HH:MM:SS.FFF +/-HH:MM +** DDDD.DD +** now +** +** In the first form, the +/-HH:MM is always optional. The fractional +** seconds extension (the ".FFF") is optional. The seconds portion +** (":SS.FFF") is option. The year and date can be omitted as long +** as there is a time string. The time string can be omitted as long +** as there is a year and date. +*/ +static int parseDateOrTime( + sqlite3_context *context, + const char *zDate, + DateTime *p +){ + double r; + if( parseYyyyMmDd(zDate,p)==0 ){ + return 0; + }else if( parseHhMmSs(zDate, p)==0 ){ + return 0; + }else if( sqlite3StrICmp(zDate,"now")==0 && sqlite3NotPureFunc(context) ){ + return setDateTimeToCurrent(context, p); + }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8)>0 ){ + setRawDateNumber(p, r); + return 0; + } + return 1; +} + +/* The julian day number for 9999-12-31 23:59:59.999 is 5373484.4999999. +** Multiplying this by 86400000 gives 464269060799999 as the maximum value +** for DateTime.iJD. +** +** But some older compilers (ex: gcc 4.2.1 on older Macs) cannot deal with +** such a large integer literal, so we have to encode it. +*/ +#define INT_464269060799999 ((((i64)0x1a640)<<32)|0x1072fdff) + +/* +** Return TRUE if the given julian day number is within range. +** +** The input is the JulianDay times 86400000. +*/ +static int validJulianDay(sqlite3_int64 iJD){ + return iJD>=0 && iJD<=INT_464269060799999; +} + +/* +** Compute the Year, Month, and Day from the julian day number. +*/ +static void computeYMD(DateTime *p){ + int Z, A, B, C, D, E, X1; + if( p->validYMD ) return; + if( !p->validJD ){ + p->Y = 2000; + p->M = 1; + p->D = 1; + }else if( !validJulianDay(p->iJD) ){ + datetimeError(p); + return; + }else{ + Z = (int)((p->iJD + 43200000)/86400000); + A = (int)((Z - 1867216.25)/36524.25); + A = Z + 1 + A - (A/4); + B = A + 1524; + C = (int)((B - 122.1)/365.25); + D = (36525*(C&32767))/100; + E = (int)((B-D)/30.6001); + X1 = (int)(30.6001*E); + p->D = B - D - X1; + p->M = E<14 ? E-1 : E-13; + p->Y = p->M>2 ? C - 4716 : C - 4715; + } + p->validYMD = 1; +} + +/* +** Compute the Hour, Minute, and Seconds from the julian day number. +*/ +static void computeHMS(DateTime *p){ + int s; + if( p->validHMS ) return; + computeJD(p); + s = (int)((p->iJD + 43200000) % 86400000); + p->s = s/1000.0; + s = (int)p->s; + p->s -= s; + p->h = s/3600; + s -= p->h*3600; + p->m = s/60; + p->s += s - p->m*60; + p->rawS = 0; + p->validHMS = 1; +} + +/* +** Compute both YMD and HMS +*/ +static void computeYMD_HMS(DateTime *p){ + computeYMD(p); + computeHMS(p); +} + +/* +** Clear the YMD and HMS and the TZ +*/ +static void clearYMD_HMS_TZ(DateTime *p){ + p->validYMD = 0; + p->validHMS = 0; + p->validTZ = 0; +} + +#ifndef SQLITE_OMIT_LOCALTIME +/* +** On recent Windows platforms, the localtime_s() function is available +** as part of the "Secure CRT". It is essentially equivalent to +** localtime_r() available under most POSIX platforms, except that the +** order of the parameters is reversed. +** +** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx. +** +** If the user has not indicated to use localtime_r() or localtime_s() +** already, check for an MSVC build environment that provides +** localtime_s(). +*/ +#if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S \ + && defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE) +#undef HAVE_LOCALTIME_S +#define HAVE_LOCALTIME_S 1 +#endif + +/* +** The following routine implements the rough equivalent of localtime_r() +** using whatever operating-system specific localtime facility that +** is available. This routine returns 0 on success and +** non-zero on any kind of error. +** +** If the sqlite3GlobalConfig.bLocaltimeFault variable is true then this +** routine will always fail. +** +** EVIDENCE-OF: R-62172-00036 In this implementation, the standard C +** library function localtime_r() is used to assist in the calculation of +** local time. +*/ +static int osLocaltime(time_t *t, struct tm *pTm){ + int rc; +#if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S + struct tm *pX; +#if SQLITE_THREADSAFE>0 + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif + sqlite3_mutex_enter(mutex); + pX = localtime(t); +#ifndef SQLITE_UNTESTABLE + if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0; +#endif + if( pX ) *pTm = *pX; + sqlite3_mutex_leave(mutex); + rc = pX==0; +#else +#ifndef SQLITE_UNTESTABLE + if( sqlite3GlobalConfig.bLocaltimeFault ) return 1; +#endif +#if HAVE_LOCALTIME_R + rc = localtime_r(t, pTm)==0; +#else + rc = localtime_s(pTm, t); +#endif /* HAVE_LOCALTIME_R */ +#endif /* HAVE_LOCALTIME_R || HAVE_LOCALTIME_S */ + return rc; +} +#endif /* SQLITE_OMIT_LOCALTIME */ + + +#ifndef SQLITE_OMIT_LOCALTIME +/* +** Compute the difference (in milliseconds) between localtime and UTC +** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs, +** return this value and set *pRc to SQLITE_OK. +** +** Or, if an error does occur, set *pRc to SQLITE_ERROR. The returned value +** is undefined in this case. +*/ +static sqlite3_int64 localtimeOffset( + DateTime *p, /* Date at which to calculate offset */ + sqlite3_context *pCtx, /* Write error here if one occurs */ + int *pRc /* OUT: Error code. SQLITE_OK or ERROR */ +){ + DateTime x, y; + time_t t; + struct tm sLocal; + + /* Initialize the contents of sLocal to avoid a compiler warning. */ + memset(&sLocal, 0, sizeof(sLocal)); + + x = *p; + computeYMD_HMS(&x); + if( x.Y<1971 || x.Y>=2038 ){ + /* EVIDENCE-OF: R-55269-29598 The localtime_r() C function normally only + ** works for years between 1970 and 2037. For dates outside this range, + ** SQLite attempts to map the year into an equivalent year within this + ** range, do the calculation, then map the year back. + */ + x.Y = 2000; + x.M = 1; + x.D = 1; + x.h = 0; + x.m = 0; + x.s = 0.0; + } else { + int s = (int)(x.s + 0.5); + x.s = s; + } + x.tz = 0; + x.validJD = 0; + computeJD(&x); + t = (time_t)(x.iJD/1000 - 21086676*(i64)10000); + if( osLocaltime(&t, &sLocal) ){ + sqlite3_result_error(pCtx, "local time unavailable", -1); + *pRc = SQLITE_ERROR; + return 0; + } + y.Y = sLocal.tm_year + 1900; + y.M = sLocal.tm_mon + 1; + y.D = sLocal.tm_mday; + y.h = sLocal.tm_hour; + y.m = sLocal.tm_min; + y.s = sLocal.tm_sec; + y.validYMD = 1; + y.validHMS = 1; + y.validJD = 0; + y.rawS = 0; + y.validTZ = 0; + y.isError = 0; + computeJD(&y); + *pRc = SQLITE_OK; + return y.iJD - x.iJD; +} +#endif /* SQLITE_OMIT_LOCALTIME */ + +/* +** The following table defines various date transformations of the form +** +** 'NNN days' +** +** Where NNN is an arbitrary floating-point number and "days" can be one +** of several units of time. +*/ +static const struct { + u8 eType; /* Transformation type code */ + u8 nName; /* Length of th name */ + char *zName; /* Name of the transformation */ + double rLimit; /* Maximum NNN value for this transform */ + double rXform; /* Constant used for this transform */ +} aXformType[] = { + { 0, 6, "second", 464269060800.0, 1000.0 }, + { 0, 6, "minute", 7737817680.0, 60000.0 }, + { 0, 4, "hour", 128963628.0, 3600000.0 }, + { 0, 3, "day", 5373485.0, 86400000.0 }, + { 1, 5, "month", 176546.0, 2592000000.0 }, + { 2, 4, "year", 14713.0, 31536000000.0 }, +}; + +/* +** Process a modifier to a date-time stamp. The modifiers are +** as follows: +** +** NNN days +** NNN hours +** NNN minutes +** NNN.NNNN seconds +** NNN months +** NNN years +** start of month +** start of year +** start of week +** start of day +** weekday N +** unixepoch +** localtime +** utc +** +** Return 0 on success and 1 if there is any kind of error. If the error +** is in a system call (i.e. localtime()), then an error message is written +** to context pCtx. If the error is an unrecognized modifier, no error is +** written to pCtx. +*/ +static int parseModifier( + sqlite3_context *pCtx, /* Function context */ + const char *z, /* The text of the modifier */ + int n, /* Length of zMod in bytes */ + DateTime *p /* The date/time value to be modified */ +){ + int rc = 1; + double r; + switch(sqlite3UpperToLower[(u8)z[0]] ){ +#ifndef SQLITE_OMIT_LOCALTIME + case 'l': { + /* localtime + ** + ** Assuming the current time value is UTC (a.k.a. GMT), shift it to + ** show local time. + */ + if( sqlite3_stricmp(z, "localtime")==0 && sqlite3NotPureFunc(pCtx) ){ + computeJD(p); + p->iJD += localtimeOffset(p, pCtx, &rc); + clearYMD_HMS_TZ(p); + } + break; + } +#endif + case 'u': { + /* + ** unixepoch + ** + ** Treat the current value of p->s as the number of + ** seconds since 1970. Convert to a real julian day number. + */ + if( sqlite3_stricmp(z, "unixepoch")==0 && p->rawS ){ + r = p->s*1000.0 + 210866760000000.0; + if( r>=0.0 && r<464269060800000.0 ){ + clearYMD_HMS_TZ(p); + p->iJD = (sqlite3_int64)(r + 0.5); + p->validJD = 1; + p->rawS = 0; + rc = 0; + } + } +#ifndef SQLITE_OMIT_LOCALTIME + else if( sqlite3_stricmp(z, "utc")==0 && sqlite3NotPureFunc(pCtx) ){ + if( p->tzSet==0 ){ + sqlite3_int64 c1; + computeJD(p); + c1 = localtimeOffset(p, pCtx, &rc); + if( rc==SQLITE_OK ){ + p->iJD -= c1; + clearYMD_HMS_TZ(p); + p->iJD += c1 - localtimeOffset(p, pCtx, &rc); + } + p->tzSet = 1; + }else{ + rc = SQLITE_OK; + } + } +#endif + break; + } + case 'w': { + /* + ** weekday N + ** + ** Move the date to the same time on the next occurrence of + ** weekday N where 0==Sunday, 1==Monday, and so forth. If the + ** date is already on the appropriate weekday, this is a no-op. + */ + if( sqlite3_strnicmp(z, "weekday ", 8)==0 + && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8)>0 + && (n=(int)r)==r && n>=0 && r<7 ){ + sqlite3_int64 Z; + computeYMD_HMS(p); + p->validTZ = 0; + p->validJD = 0; + computeJD(p); + Z = ((p->iJD + 129600000)/86400000) % 7; + if( Z>n ) Z -= 7; + p->iJD += (n - Z)*86400000; + clearYMD_HMS_TZ(p); + rc = 0; + } + break; + } + case 's': { + /* + ** start of TTTTT + ** + ** Move the date backwards to the beginning of the current day, + ** or month or year. + */ + if( sqlite3_strnicmp(z, "start of ", 9)!=0 ) break; + if( !p->validJD && !p->validYMD && !p->validHMS ) break; + z += 9; + computeYMD(p); + p->validHMS = 1; + p->h = p->m = 0; + p->s = 0.0; + p->rawS = 0; + p->validTZ = 0; + p->validJD = 0; + if( sqlite3_stricmp(z,"month")==0 ){ + p->D = 1; + rc = 0; + }else if( sqlite3_stricmp(z,"year")==0 ){ + p->M = 1; + p->D = 1; + rc = 0; + }else if( sqlite3_stricmp(z,"day")==0 ){ + rc = 0; + } + break; + } + case '+': + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + double rRounder; + int i; + for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){} + if( sqlite3AtoF(z, &r, n, SQLITE_UTF8)<=0 ){ + rc = 1; + break; + } + if( z[n]==':' ){ + /* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the + ** specified number of hours, minutes, seconds, and fractional seconds + ** to the time. The ".FFF" may be omitted. The ":SS.FFF" may be + ** omitted. + */ + const char *z2 = z; + DateTime tx; + sqlite3_int64 day; + if( !sqlite3Isdigit(*z2) ) z2++; + memset(&tx, 0, sizeof(tx)); + if( parseHhMmSs(z2, &tx) ) break; + computeJD(&tx); + tx.iJD -= 43200000; + day = tx.iJD/86400000; + tx.iJD -= day*86400000; + if( z[0]=='-' ) tx.iJD = -tx.iJD; + computeJD(p); + clearYMD_HMS_TZ(p); + p->iJD += tx.iJD; + rc = 0; + break; + } + + /* If control reaches this point, it means the transformation is + ** one of the forms like "+NNN days". */ + z += n; + while( sqlite3Isspace(*z) ) z++; + n = sqlite3Strlen30(z); + if( n>10 || n<3 ) break; + if( sqlite3UpperToLower[(u8)z[n-1]]=='s' ) n--; + computeJD(p); + rc = 1; + rRounder = r<0 ? -0.5 : +0.5; + for(i=0; i-aXformType[i].rLimit && rM += (int)r; + x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; + p->Y += x; + p->M -= x*12; + p->validJD = 0; + r -= (int)r; + break; + } + case 2: { /* Special processing to add years */ + int y = (int)r; + computeYMD_HMS(p); + p->Y += y; + p->validJD = 0; + r -= (int)r; + break; + } + } + computeJD(p); + p->iJD += (sqlite3_int64)(r*aXformType[i].rXform + rRounder); + rc = 0; + break; + } + } + clearYMD_HMS_TZ(p); + break; + } + default: { + break; + } + } + return rc; +} + +/* +** Process time function arguments. argv[0] is a date-time stamp. +** argv[1] and following are modifiers. Parse them all and write +** the resulting time into the DateTime structure p. Return 0 +** on success and 1 if there are any errors. +** +** If there are zero parameters (if even argv[0] is undefined) +** then assume a default value of "now" for argv[0]. +*/ +static int isDate( + sqlite3_context *context, + int argc, + sqlite3_value **argv, + DateTime *p +){ + int i, n; + const unsigned char *z; + int eType; + memset(p, 0, sizeof(*p)); + if( argc==0 ){ + return setDateTimeToCurrent(context, p); + } + if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT + || eType==SQLITE_INTEGER ){ + setRawDateNumber(p, sqlite3_value_double(argv[0])); + }else{ + z = sqlite3_value_text(argv[0]); + if( !z || parseDateOrTime(context, (char*)z, p) ){ + return 1; + } + } + for(i=1; iisError || !validJulianDay(p->iJD) ) return 1; + return 0; +} + + +/* +** The following routines implement the various date and time functions +** of SQLite. +*/ + +/* +** julianday( TIMESTRING, MOD, MOD, ...) +** +** Return the julian day number of the date specified in the arguments +*/ +static void juliandayFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + computeJD(&x); + sqlite3_result_double(context, x.iJD/86400000.0); + } +} + +/* +** datetime( TIMESTRING, MOD, MOD, ...) +** +** Return YYYY-MM-DD HH:MM:SS +*/ +static void datetimeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + char zBuf[100]; + computeYMD_HMS(&x); + sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d %02d:%02d:%02d", + x.Y, x.M, x.D, x.h, x.m, (int)(x.s)); + sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + } +} + +/* +** time( TIMESTRING, MOD, MOD, ...) +** +** Return HH:MM:SS +*/ +static void timeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + char zBuf[100]; + computeHMS(&x); + sqlite3_snprintf(sizeof(zBuf), zBuf, "%02d:%02d:%02d", x.h, x.m, (int)x.s); + sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + } +} + +/* +** date( TIMESTRING, MOD, MOD, ...) +** +** Return YYYY-MM-DD +*/ +static void dateFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + char zBuf[100]; + computeYMD(&x); + sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d", x.Y, x.M, x.D); + sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + } +} + +/* +** strftime( FORMAT, TIMESTRING, MOD, MOD, ...) +** +** Return a string described by FORMAT. Conversions as follows: +** +** %d day of month +** %f ** fractional seconds SS.SSS +** %H hour 00-24 +** %j day of year 000-366 +** %J ** julian day number +** %m month 01-12 +** %M minute 00-59 +** %s seconds since 1970-01-01 +** %S seconds 00-59 +** %w day of week 0-6 sunday==0 +** %W week of year 00-53 +** %Y year 0000-9999 +** %% % +*/ +static void strftimeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + u64 n; + size_t i,j; + char *z; + sqlite3 *db; + const char *zFmt; + char zBuf[100]; + if( argc==0 ) return; + zFmt = (const char*)sqlite3_value_text(argv[0]); + if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return; + db = sqlite3_context_db_handle(context); + for(i=0, n=1; zFmt[i]; i++, n++){ + if( zFmt[i]=='%' ){ + switch( zFmt[i+1] ){ + case 'd': + case 'H': + case 'm': + case 'M': + case 'S': + case 'W': + n++; + /* fall thru */ + case 'w': + case '%': + break; + case 'f': + n += 8; + break; + case 'j': + n += 3; + break; + case 'Y': + n += 8; + break; + case 's': + case 'J': + n += 50; + break; + default: + return; /* ERROR. return a NULL */ + } + i++; + } + } + testcase( n==sizeof(zBuf)-1 ); + testcase( n==sizeof(zBuf) ); + testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH]+1 ); + testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ); + if( n(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(context); + return; + }else{ + z = sqlite3DbMallocRawNN(db, (int)n); + if( z==0 ){ + sqlite3_result_error_nomem(context); + return; + } + } + computeJD(&x); + computeYMD_HMS(&x); + for(i=j=0; zFmt[i]; i++){ + if( zFmt[i]!='%' ){ + z[j++] = zFmt[i]; + }else{ + i++; + switch( zFmt[i] ){ + case 'd': sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break; + case 'f': { + double s = x.s; + if( s>59.999 ) s = 59.999; + sqlite3_snprintf(7, &z[j],"%06.3f", s); + j += sqlite3Strlen30(&z[j]); + break; + } + case 'H': sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break; + case 'W': /* Fall thru */ + case 'j': { + int nDay; /* Number of days since 1st day of year */ + DateTime y = x; + y.validJD = 0; + y.M = 1; + y.D = 1; + computeJD(&y); + nDay = (int)((x.iJD-y.iJD+43200000)/86400000); + if( zFmt[i]=='W' ){ + int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */ + wd = (int)(((x.iJD+43200000)/86400000)%7); + sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7); + j += 2; + }else{ + sqlite3_snprintf(4, &z[j],"%03d",nDay+1); + j += 3; + } + break; + } + case 'J': { + sqlite3_snprintf(20, &z[j],"%.16g",x.iJD/86400000.0); + j+=sqlite3Strlen30(&z[j]); + break; + } + case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break; + case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break; + case 's': { + sqlite3_snprintf(30,&z[j],"%lld", + (i64)(x.iJD/1000 - 21086676*(i64)10000)); + j += sqlite3Strlen30(&z[j]); + break; + } + case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break; + case 'w': { + z[j++] = (char)(((x.iJD+129600000)/86400000) % 7) + '0'; + break; + } + case 'Y': { + sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=sqlite3Strlen30(&z[j]); + break; + } + default: z[j++] = '%'; break; + } + } + } + z[j] = 0; + sqlite3_result_text(context, z, -1, + z==zBuf ? SQLITE_TRANSIENT : SQLITE_DYNAMIC); +} + +/* +** current_time() +** +** This function returns the same value as time('now'). +*/ +static void ctimeFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + timeFunc(context, 0, 0); +} + +/* +** current_date() +** +** This function returns the same value as date('now'). +*/ +static void cdateFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + dateFunc(context, 0, 0); +} + +/* +** current_timestamp() +** +** This function returns the same value as datetime('now'). +*/ +static void ctimestampFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + datetimeFunc(context, 0, 0); +} +#endif /* !defined(SQLITE_OMIT_DATETIME_FUNCS) */ + +#ifdef SQLITE_OMIT_DATETIME_FUNCS +/* +** If the library is compiled to omit the full-scale date and time +** handling (to get a smaller binary), the following minimal version +** of the functions current_time(), current_date() and current_timestamp() +** are included instead. This is to support column declarations that +** include "DEFAULT CURRENT_TIME" etc. +** +** This function uses the C-library functions time(), gmtime() +** and strftime(). The format string to pass to strftime() is supplied +** as the user-data for the function. +*/ +static void currentTimeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + time_t t; + char *zFormat = (char *)sqlite3_user_data(context); + sqlite3_int64 iT; + struct tm *pTm; + struct tm sNow; + char zBuf[20]; + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + + iT = sqlite3StmtCurrentTime(context); + if( iT<=0 ) return; + t = iT/1000 - 10000*(sqlite3_int64)21086676; +#if HAVE_GMTIME_R + pTm = gmtime_r(&t, &sNow); +#else + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + pTm = gmtime(&t); + if( pTm ) memcpy(&sNow, pTm, sizeof(sNow)); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); +#endif + if( pTm ){ + strftime(zBuf, 20, zFormat, &sNow); + sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + } +} +#endif + +/* +** This function registered all of the above C functions as SQL +** functions. This should be the only routine in this file with +** external linkage. +*/ +SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){ + static FuncDef aDateTimeFuncs[] = { +#ifndef SQLITE_OMIT_DATETIME_FUNCS + PURE_DATE(julianday, -1, 0, 0, juliandayFunc ), + PURE_DATE(date, -1, 0, 0, dateFunc ), + PURE_DATE(time, -1, 0, 0, timeFunc ), + PURE_DATE(datetime, -1, 0, 0, datetimeFunc ), + PURE_DATE(strftime, -1, 0, 0, strftimeFunc ), + DFUNCTION(current_time, 0, 0, 0, ctimeFunc ), + DFUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc), + DFUNCTION(current_date, 0, 0, 0, cdateFunc ), +#else + STR_FUNCTION(current_time, 0, "%H:%M:%S", 0, currentTimeFunc), + STR_FUNCTION(current_date, 0, "%Y-%m-%d", 0, currentTimeFunc), + STR_FUNCTION(current_timestamp, 0, "%Y-%m-%d %H:%M:%S", 0, currentTimeFunc), +#endif + }; + sqlite3InsertBuiltinFuncs(aDateTimeFuncs, ArraySize(aDateTimeFuncs)); +} + +/************** End of date.c ************************************************/ +/************** Begin file os.c **********************************************/ +/* +** 2005 November 29 +** +** 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 OS interface code that is common to all +** architectures. +*/ +/* #include "sqliteInt.h" */ + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#if defined(SQLITE_TEST) +SQLITE_API int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */ +SQLITE_API int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */ +SQLITE_API int sqlite3_io_error_pending = 0; /* Count down to first I/O error */ +SQLITE_API int sqlite3_io_error_persist = 0; /* True if I/O errors persist */ +SQLITE_API int sqlite3_io_error_benign = 0; /* True if errors are benign */ +SQLITE_API int sqlite3_diskfull_pending = 0; +SQLITE_API int sqlite3_diskfull = 0; +#endif /* defined(SQLITE_TEST) */ + +/* +** When testing, also keep a count of the number of open files. +*/ +#if defined(SQLITE_TEST) +SQLITE_API int sqlite3_open_file_count = 0; +#endif /* defined(SQLITE_TEST) */ + +/* +** The default SQLite sqlite3_vfs implementations do not allocate +** memory (actually, os_unix.c allocates a small amount of memory +** from within OsOpen()), but some third-party implementations may. +** So we test the effects of a malloc() failing and the sqlite3OsXXX() +** function returning SQLITE_IOERR_NOMEM using the DO_OS_MALLOC_TEST macro. +** +** The following functions are instrumented for malloc() failure +** testing: +** +** sqlite3OsRead() +** sqlite3OsWrite() +** sqlite3OsSync() +** sqlite3OsFileSize() +** sqlite3OsLock() +** sqlite3OsCheckReservedLock() +** sqlite3OsFileControl() +** sqlite3OsShmMap() +** sqlite3OsOpen() +** sqlite3OsDelete() +** sqlite3OsAccess() +** sqlite3OsFullPathname() +** +*/ +#if defined(SQLITE_TEST) +SQLITE_API int sqlite3_memdebug_vfs_oom_test = 1; + #define DO_OS_MALLOC_TEST(x) \ + if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3JournalIsInMemory(x))) { \ + void *pTstAlloc = sqlite3Malloc(10); \ + if (!pTstAlloc) return SQLITE_IOERR_NOMEM_BKPT; \ + sqlite3_free(pTstAlloc); \ + } +#else + #define DO_OS_MALLOC_TEST(x) +#endif + +/* +** The following routines are convenience wrappers around methods +** of the sqlite3_file object. This is mostly just syntactic sugar. All +** of this would be completely automatic if SQLite were coded using +** C++ instead of plain old C. +*/ +SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file *pId){ + if( pId->pMethods ){ + pId->pMethods->xClose(pId); + pId->pMethods = 0; + } +} +SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xRead(id, pBuf, amt, offset); +} +SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xWrite(id, pBuf, amt, offset); +} +SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file *id, i64 size){ + return id->pMethods->xTruncate(id, size); +} +SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file *id, int flags){ + DO_OS_MALLOC_TEST(id); + return flags ? id->pMethods->xSync(id, flags) : SQLITE_OK; +} +SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xFileSize(id, pSize); +} +SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file *id, int lockType){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xLock(id, lockType); +} +SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file *id, int lockType){ + return id->pMethods->xUnlock(id, lockType); +} +SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xCheckReservedLock(id, pResOut); +} + +/* +** Use sqlite3OsFileControl() when we are doing something that might fail +** and we need to know about the failures. Use sqlite3OsFileControlHint() +** when simply tossing information over the wall to the VFS and we do not +** really care if the VFS receives and understands the information since it +** is only a hint and can be safely ignored. The sqlite3OsFileControlHint() +** routine has no return value since the return value would be meaningless. +*/ +SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ + if( id->pMethods==0 ) return SQLITE_NOTFOUND; +#ifdef SQLITE_TEST + if( op!=SQLITE_FCNTL_COMMIT_PHASETWO + && op!=SQLITE_FCNTL_LOCK_TIMEOUT + ){ + /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite + ** is using a regular VFS, it is called after the corresponding + ** transaction has been committed. Injecting a fault at this point + ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM + ** but the transaction is committed anyway. + ** + ** The core must call OsFileControl() though, not OsFileControlHint(), + ** as if a custom VFS (e.g. zipvfs) returns an error here, it probably + ** means the commit really has failed and an error should be returned + ** to the user. */ + DO_OS_MALLOC_TEST(id); + } +#endif + return id->pMethods->xFileControl(id, op, pArg); +} +SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ + if( id->pMethods ) (void)id->pMethods->xFileControl(id, op, pArg); +} + +SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){ + int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; + return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); +} +SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ + return id->pMethods->xDeviceCharacteristics(id); +} +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int offset, int n, int flags){ + return id->pMethods->xShmLock(id, offset, n, flags); +} +SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id){ + id->pMethods->xShmBarrier(id); +} +SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int deleteFlag){ + return id->pMethods->xShmUnmap(id, deleteFlag); +} +SQLITE_PRIVATE int sqlite3OsShmMap( + sqlite3_file *id, /* Database file handle */ + int iPage, + int pgsz, + int bExtend, /* True to extend file if necessary */ + void volatile **pp /* OUT: Pointer to mapping */ +){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xShmMap(id, iPage, pgsz, bExtend, pp); +} +#endif /* SQLITE_OMIT_WAL */ + +#if SQLITE_MAX_MMAP_SIZE>0 +/* The real implementation of xFetch and xUnfetch */ +SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xFetch(id, iOff, iAmt, pp); +} +SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ + return id->pMethods->xUnfetch(id, iOff, p); +} +#else +/* No-op stubs to use when memory-mapped I/O is disabled */ +SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ + *pp = 0; + return SQLITE_OK; +} +SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ + return SQLITE_OK; +} +#endif + +/* +** The next group of routines are convenience wrappers around the +** VFS methods. +*/ +SQLITE_PRIVATE int sqlite3OsOpen( + sqlite3_vfs *pVfs, + const char *zPath, + sqlite3_file *pFile, + int flags, + int *pFlagsOut +){ + int rc; + DO_OS_MALLOC_TEST(0); + /* 0x87f7f is a mask of SQLITE_OPEN_ flags that are valid to be passed + ** down into the VFS layer. Some SQLITE_OPEN_ flags (for example, + ** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before + ** reaching the VFS. */ + rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x1087f7f, pFlagsOut); + assert( rc==SQLITE_OK || pFile->pMethods==0 ); + return rc; +} +SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + DO_OS_MALLOC_TEST(0); + assert( dirSync==0 || dirSync==1 ); + return pVfs->xDelete(pVfs, zPath, dirSync); +} +SQLITE_PRIVATE int sqlite3OsAccess( + sqlite3_vfs *pVfs, + const char *zPath, + int flags, + int *pResOut +){ + DO_OS_MALLOC_TEST(0); + return pVfs->xAccess(pVfs, zPath, flags, pResOut); +} +SQLITE_PRIVATE int sqlite3OsFullPathname( + sqlite3_vfs *pVfs, + const char *zPath, + int nPathOut, + char *zPathOut +){ + DO_OS_MALLOC_TEST(0); + zPathOut[0] = 0; + return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); +} +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + return pVfs->xDlOpen(pVfs, zPath); +} +SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + pVfs->xDlError(pVfs, nByte, zBufOut); +} +SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){ + return pVfs->xDlSym(pVfs, pHdle, zSym); +} +SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ + pVfs->xDlClose(pVfs, pHandle); +} +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ +SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + if( sqlite3Config.iPrngSeed ){ + memset(zBufOut, 0, nByte); + if( ALWAYS(nByte>(signed)sizeof(unsigned)) ) nByte = sizeof(unsigned int); + memcpy(zBufOut, &sqlite3Config.iPrngSeed, nByte); + return SQLITE_OK; + }else{ + return pVfs->xRandomness(pVfs, nByte, zBufOut); + } + +} +SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ + return pVfs->xSleep(pVfs, nMicro); +} +SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs *pVfs){ + return pVfs->xGetLastError ? pVfs->xGetLastError(pVfs, 0, 0) : 0; +} +SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){ + int rc; + /* IMPLEMENTATION-OF: R-49045-42493 SQLite will use the xCurrentTimeInt64() + ** method to get the current date and time if that method is available + ** (if iVersion is 2 or greater and the function pointer is not NULL) and + ** will fall back to xCurrentTime() if xCurrentTimeInt64() is + ** unavailable. + */ + if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ + rc = pVfs->xCurrentTimeInt64(pVfs, pTimeOut); + }else{ + double r; + rc = pVfs->xCurrentTime(pVfs, &r); + *pTimeOut = (sqlite3_int64)(r*86400000.0); + } + return rc; +} + +SQLITE_PRIVATE int sqlite3OsOpenMalloc( + sqlite3_vfs *pVfs, + const char *zFile, + sqlite3_file **ppFile, + int flags, + int *pOutFlags +){ + int rc; + sqlite3_file *pFile; + pFile = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile); + if( pFile ){ + rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); + if( rc!=SQLITE_OK ){ + sqlite3_free(pFile); + }else{ + *ppFile = pFile; + } + }else{ + rc = SQLITE_NOMEM_BKPT; + } + return rc; +} +SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *pFile){ + assert( pFile ); + sqlite3OsClose(pFile); + sqlite3_free(pFile); +} + +/* +** This function is a wrapper around the OS specific implementation of +** sqlite3_os_init(). The purpose of the wrapper is to provide the +** ability to simulate a malloc failure, so that the handling of an +** error in sqlite3_os_init() by the upper layers can be tested. +*/ +SQLITE_PRIVATE int sqlite3OsInit(void){ + void *p = sqlite3_malloc(10); + if( p==0 ) return SQLITE_NOMEM_BKPT; + sqlite3_free(p); + return sqlite3_os_init(); +} + +/* +** The list of all registered VFS implementations. +*/ +static sqlite3_vfs * SQLITE_WSD vfsList = 0; +#define vfsList GLOBAL(sqlite3_vfs *, vfsList) + +/* +** Locate a VFS by name. If no name is given, simply return the +** first VFS on the list. +*/ +SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){ + sqlite3_vfs *pVfs = 0; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex; +#endif +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return 0; +#endif +#if SQLITE_THREADSAFE + mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif + sqlite3_mutex_enter(mutex); + for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){ + if( zVfs==0 ) break; + if( strcmp(zVfs, pVfs->zName)==0 ) break; + } + sqlite3_mutex_leave(mutex); + return pVfs; +} + +/* +** Unlink a VFS from the linked list +*/ +static void vfsUnlink(sqlite3_vfs *pVfs){ + assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)) ); + if( pVfs==0 ){ + /* No-op */ + }else if( vfsList==pVfs ){ + vfsList = pVfs->pNext; + }else if( vfsList ){ + sqlite3_vfs *p = vfsList; + while( p->pNext && p->pNext!=pVfs ){ + p = p->pNext; + } + if( p->pNext==pVfs ){ + p->pNext = pVfs->pNext; + } + } +} + +/* +** Register a VFS with the system. It is harmless to register the same +** VFS multiple times. The new VFS becomes the default if makeDflt is +** true. +*/ +SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){ + MUTEX_LOGIC(sqlite3_mutex *mutex;) +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return rc; +#endif +#ifdef SQLITE_ENABLE_API_ARMOR + if( pVfs==0 ) return SQLITE_MISUSE_BKPT; +#endif + + MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + sqlite3_mutex_enter(mutex); + vfsUnlink(pVfs); + if( makeDflt || vfsList==0 ){ + pVfs->pNext = vfsList; + vfsList = pVfs; + }else{ + pVfs->pNext = vfsList->pNext; + vfsList->pNext = pVfs; + } + assert(vfsList); + sqlite3_mutex_leave(mutex); + return SQLITE_OK; +} + +/* +** Unregister a VFS so that it is no longer accessible. +*/ +SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ + MUTEX_LOGIC(sqlite3_mutex *mutex;) +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + sqlite3_mutex_enter(mutex); + vfsUnlink(pVfs); + sqlite3_mutex_leave(mutex); + return SQLITE_OK; +} + +/************** End of os.c **************************************************/ +/************** Begin file fault.c *******************************************/ +/* +** 2008 Jan 22 +** +** 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 code to support the concept of "benign" +** malloc failures (when the xMalloc() or xRealloc() method of the +** sqlite3_mem_methods structure fails to allocate a block of memory +** and returns 0). +** +** Most malloc failures are non-benign. After they occur, SQLite +** abandons the current operation and returns an error code (usually +** SQLITE_NOMEM) to the user. However, sometimes a fault is not necessarily +** fatal. For example, if a malloc fails while resizing a hash table, this +** is completely recoverable simply by not carrying out the resize. The +** hash table will continue to function normally. So a malloc failure +** during a hash table resize is a benign fault. +*/ + +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_UNTESTABLE + +/* +** Global variables. +*/ +typedef struct BenignMallocHooks BenignMallocHooks; +static SQLITE_WSD struct BenignMallocHooks { + void (*xBenignBegin)(void); + void (*xBenignEnd)(void); +} sqlite3Hooks = { 0, 0 }; + +/* The "wsdHooks" macro will resolve to the appropriate BenignMallocHooks +** structure. If writable static data is unsupported on the target, +** we have to locate the state vector at run-time. In the more common +** case where writable static data is supported, wsdHooks can refer directly +** to the "sqlite3Hooks" state vector declared above. +*/ +#ifdef SQLITE_OMIT_WSD +# define wsdHooksInit \ + BenignMallocHooks *x = &GLOBAL(BenignMallocHooks,sqlite3Hooks) +# define wsdHooks x[0] +#else +# define wsdHooksInit +# define wsdHooks sqlite3Hooks +#endif + + +/* +** Register hooks to call when sqlite3BeginBenignMalloc() and +** sqlite3EndBenignMalloc() are called, respectively. +*/ +SQLITE_PRIVATE void sqlite3BenignMallocHooks( + void (*xBenignBegin)(void), + void (*xBenignEnd)(void) +){ + wsdHooksInit; + wsdHooks.xBenignBegin = xBenignBegin; + wsdHooks.xBenignEnd = xBenignEnd; +} + +/* +** This (sqlite3EndBenignMalloc()) is called by SQLite code to indicate that +** subsequent malloc failures are benign. A call to sqlite3EndBenignMalloc() +** indicates that subsequent malloc failures are non-benign. +*/ +SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void){ + wsdHooksInit; + if( wsdHooks.xBenignBegin ){ + wsdHooks.xBenignBegin(); + } +} +SQLITE_PRIVATE void sqlite3EndBenignMalloc(void){ + wsdHooksInit; + if( wsdHooks.xBenignEnd ){ + wsdHooks.xBenignEnd(); + } +} + +#endif /* #ifndef SQLITE_UNTESTABLE */ + +/************** End of fault.c ***********************************************/ +/************** Begin file mem0.c ********************************************/ +/* +** 2008 October 28 +** +** 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 a no-op memory allocation drivers for use when +** SQLITE_ZERO_MALLOC is defined. The allocation drivers implemented +** here always fail. SQLite will not operate with these drivers. These +** are merely placeholders. Real drivers must be substituted using +** sqlite3_config() before SQLite will operate. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is the default. It is +** used when no other memory allocator is specified using compile-time +** macros. +*/ +#ifdef SQLITE_ZERO_MALLOC + +/* +** No-op versions of all memory allocation routines +*/ +static void *sqlite3MemMalloc(int nByte){ return 0; } +static void sqlite3MemFree(void *pPrior){ return; } +static void *sqlite3MemRealloc(void *pPrior, int nByte){ return 0; } +static int sqlite3MemSize(void *pPrior){ return 0; } +static int sqlite3MemRoundup(int n){ return n; } +static int sqlite3MemInit(void *NotUsed){ return SQLITE_OK; } +static void sqlite3MemShutdown(void *NotUsed){ return; } + +/* +** This routine is the only routine in this file with external linkage. +** +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. +*/ +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + static const sqlite3_mem_methods defaultMethods = { + sqlite3MemMalloc, + sqlite3MemFree, + sqlite3MemRealloc, + sqlite3MemSize, + sqlite3MemRoundup, + sqlite3MemInit, + sqlite3MemShutdown, + 0 + }; + sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods); +} + +#endif /* SQLITE_ZERO_MALLOC */ + +/************** End of mem0.c ************************************************/ +/************** Begin file mem1.c ********************************************/ +/* +** 2007 August 14 +** +** 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 low-level memory allocation drivers for when +** SQLite will use the standard C-library malloc/realloc/free interface +** to obtain the memory it needs. +** +** This file contains implementations of the low-level memory allocation +** routines specified in the sqlite3_mem_methods object. The content of +** this file is only used if SQLITE_SYSTEM_MALLOC is defined. The +** SQLITE_SYSTEM_MALLOC macro is defined automatically if neither the +** SQLITE_MEMDEBUG nor the SQLITE_WIN32_MALLOC macros are defined. The +** default configuration is to use memory allocation routines in this +** file. +** +** C-preprocessor macro summary: +** +** HAVE_MALLOC_USABLE_SIZE The configure script sets this symbol if +** the malloc_usable_size() interface exists +** on the target platform. Or, this symbol +** can be set manually, if desired. +** If an equivalent interface exists by +** a different name, using a separate -D +** option to rename it. +** +** SQLITE_WITHOUT_ZONEMALLOC Some older macs lack support for the zone +** memory allocator. Set this symbol to enable +** building on older macs. +** +** SQLITE_WITHOUT_MSIZE Set this symbol to disable the use of +** _msize() on windows systems. This might +** be necessary when compiling for Delphi, +** for example. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is the default. It is +** used when no other memory allocator is specified using compile-time +** macros. +*/ +#ifdef SQLITE_SYSTEM_MALLOC +#if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) + +/* +** Use the zone allocator available on apple products unless the +** SQLITE_WITHOUT_ZONEMALLOC symbol is defined. +*/ +#include +#include +#ifdef SQLITE_MIGHT_BE_SINGLE_CORE +#include +#endif /* SQLITE_MIGHT_BE_SINGLE_CORE */ +static malloc_zone_t* _sqliteZone_; +#define SQLITE_MALLOC(x) malloc_zone_malloc(_sqliteZone_, (x)) +#define SQLITE_FREE(x) malloc_zone_free(_sqliteZone_, (x)); +#define SQLITE_REALLOC(x,y) malloc_zone_realloc(_sqliteZone_, (x), (y)) +#define SQLITE_MALLOCSIZE(x) \ + (_sqliteZone_ ? _sqliteZone_->size(_sqliteZone_,x) : malloc_size(x)) + +#else /* if not __APPLE__ */ + +/* +** Use standard C library malloc and free on non-Apple systems. +** Also used by Apple systems if SQLITE_WITHOUT_ZONEMALLOC is defined. +*/ +#define SQLITE_MALLOC(x) malloc(x) +#define SQLITE_FREE(x) free(x) +#define SQLITE_REALLOC(x,y) realloc((x),(y)) + +/* +** The malloc.h header file is needed for malloc_usable_size() function +** on some systems (e.g. Linux). +*/ +#if HAVE_MALLOC_H && HAVE_MALLOC_USABLE_SIZE +# define SQLITE_USE_MALLOC_H 1 +# define SQLITE_USE_MALLOC_USABLE_SIZE 1 +/* +** The MSVCRT has malloc_usable_size(), but it is called _msize(). The +** use of _msize() is automatic, but can be disabled by compiling with +** -DSQLITE_WITHOUT_MSIZE. Using the _msize() function also requires +** the malloc.h header file. +*/ +#elif defined(_MSC_VER) && !defined(SQLITE_WITHOUT_MSIZE) +# define SQLITE_USE_MALLOC_H +# define SQLITE_USE_MSIZE +#endif + +/* +** Include the malloc.h header file, if necessary. Also set define macro +** SQLITE_MALLOCSIZE to the appropriate function name, which is _msize() +** for MSVC and malloc_usable_size() for most other systems (e.g. Linux). +** The memory size function can always be overridden manually by defining +** the macro SQLITE_MALLOCSIZE to the desired function name. +*/ +#if defined(SQLITE_USE_MALLOC_H) +# include +# if defined(SQLITE_USE_MALLOC_USABLE_SIZE) +# if !defined(SQLITE_MALLOCSIZE) +# define SQLITE_MALLOCSIZE(x) malloc_usable_size(x) +# endif +# elif defined(SQLITE_USE_MSIZE) +# if !defined(SQLITE_MALLOCSIZE) +# define SQLITE_MALLOCSIZE _msize +# endif +# endif +#endif /* defined(SQLITE_USE_MALLOC_H) */ + +#endif /* __APPLE__ or not __APPLE__ */ + +/* +** Like malloc(), but remember the size of the allocation +** so that we can find it later using sqlite3MemSize(). +** +** For this low-level routine, we are guaranteed that nByte>0 because +** cases of nByte<=0 will be intercepted and dealt with by higher level +** routines. +*/ +static void *sqlite3MemMalloc(int nByte){ +#ifdef SQLITE_MALLOCSIZE + void *p; + testcase( ROUND8(nByte)==nByte ); + p = SQLITE_MALLOC( nByte ); + if( p==0 ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte); + } + return p; +#else + sqlite3_int64 *p; + assert( nByte>0 ); + testcase( ROUND8(nByte)!=nByte ); + p = SQLITE_MALLOC( nByte+8 ); + if( p ){ + p[0] = nByte; + p++; + }else{ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte); + } + return (void *)p; +#endif +} + +/* +** Like free() but works for allocations obtained from sqlite3MemMalloc() +** or sqlite3MemRealloc(). +** +** For this low-level routine, we already know that pPrior!=0 since +** cases where pPrior==0 will have been intecepted and dealt with +** by higher-level routines. +*/ +static void sqlite3MemFree(void *pPrior){ +#ifdef SQLITE_MALLOCSIZE + SQLITE_FREE(pPrior); +#else + sqlite3_int64 *p = (sqlite3_int64*)pPrior; + assert( pPrior!=0 ); + p--; + SQLITE_FREE(p); +#endif +} + +/* +** Report the allocated size of a prior return from xMalloc() +** or xRealloc(). +*/ +static int sqlite3MemSize(void *pPrior){ +#ifdef SQLITE_MALLOCSIZE + assert( pPrior!=0 ); + return (int)SQLITE_MALLOCSIZE(pPrior); +#else + sqlite3_int64 *p; + assert( pPrior!=0 ); + p = (sqlite3_int64*)pPrior; + p--; + return (int)p[0]; +#endif +} + +/* +** Like realloc(). Resize an allocation previously obtained from +** sqlite3MemMalloc(). +** +** For this low-level interface, we know that pPrior!=0. Cases where +** pPrior==0 while have been intercepted by higher-level routine and +** redirected to xMalloc. Similarly, we know that nByte>0 because +** cases where nByte<=0 will have been intercepted by higher-level +** routines and redirected to xFree. +*/ +static void *sqlite3MemRealloc(void *pPrior, int nByte){ +#ifdef SQLITE_MALLOCSIZE + void *p = SQLITE_REALLOC(pPrior, nByte); + if( p==0 ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, + "failed memory resize %u to %u bytes", + SQLITE_MALLOCSIZE(pPrior), nByte); + } + return p; +#else + sqlite3_int64 *p = (sqlite3_int64*)pPrior; + assert( pPrior!=0 && nByte>0 ); + assert( nByte==ROUND8(nByte) ); /* EV: R-46199-30249 */ + p--; + p = SQLITE_REALLOC(p, nByte+8 ); + if( p ){ + p[0] = nByte; + p++; + }else{ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, + "failed memory resize %u to %u bytes", + sqlite3MemSize(pPrior), nByte); + } + return (void*)p; +#endif +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int sqlite3MemRoundup(int n){ + return ROUND8(n); +} + +/* +** Initialize this module. +*/ +static int sqlite3MemInit(void *NotUsed){ +#if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) + int cpuCount; + size_t len; + if( _sqliteZone_ ){ + return SQLITE_OK; + } + len = sizeof(cpuCount); + /* One usually wants to use hw.acctivecpu for MT decisions, but not here */ + sysctlbyname("hw.ncpu", &cpuCount, &len, NULL, 0); + if( cpuCount>1 ){ + /* defer MT decisions to system malloc */ + _sqliteZone_ = malloc_default_zone(); + }else{ + /* only 1 core, use our own zone to contention over global locks, + ** e.g. we have our own dedicated locks */ + _sqliteZone_ = malloc_create_zone(4096, 0); + malloc_set_zone_name(_sqliteZone_, "Sqlite_Heap"); + } +#endif /* defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) */ + UNUSED_PARAMETER(NotUsed); + return SQLITE_OK; +} + +/* +** Deinitialize this module. +*/ +static void sqlite3MemShutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + return; +} + +/* +** This routine is the only routine in this file with external linkage. +** +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. +*/ +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + static const sqlite3_mem_methods defaultMethods = { + sqlite3MemMalloc, + sqlite3MemFree, + sqlite3MemRealloc, + sqlite3MemSize, + sqlite3MemRoundup, + sqlite3MemInit, + sqlite3MemShutdown, + 0 + }; + sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods); +} + +#endif /* SQLITE_SYSTEM_MALLOC */ + +/************** End of mem1.c ************************************************/ +/************** Begin file mem2.c ********************************************/ +/* +** 2007 August 15 +** +** 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 low-level memory allocation drivers for when +** SQLite will use the standard C-library malloc/realloc/free interface +** to obtain the memory it needs while adding lots of additional debugging +** information to each allocation in order to help detect and fix memory +** leaks and memory usage errors. +** +** This file contains implementations of the low-level memory allocation +** routines specified in the sqlite3_mem_methods object. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is used only if the +** SQLITE_MEMDEBUG macro is defined +*/ +#ifdef SQLITE_MEMDEBUG + +/* +** The backtrace functionality is only available with GLIBC +*/ +#ifdef __GLIBC__ + extern int backtrace(void**,int); + extern void backtrace_symbols_fd(void*const*,int,int); +#else +# define backtrace(A,B) 1 +# define backtrace_symbols_fd(A,B,C) +#endif +/* #include */ + +/* +** Each memory allocation looks like this: +** +** ------------------------------------------------------------------------ +** | Title | backtrace pointers | MemBlockHdr | allocation | EndGuard | +** ------------------------------------------------------------------------ +** +** The application code sees only a pointer to the allocation. We have +** to back up from the allocation pointer to find the MemBlockHdr. The +** MemBlockHdr tells us the size of the allocation and the number of +** backtrace pointers. There is also a guard word at the end of the +** MemBlockHdr. +*/ +struct MemBlockHdr { + i64 iSize; /* Size of this allocation */ + struct MemBlockHdr *pNext, *pPrev; /* Linked list of all unfreed memory */ + char nBacktrace; /* Number of backtraces on this alloc */ + char nBacktraceSlots; /* Available backtrace slots */ + u8 nTitle; /* Bytes of title; includes '\0' */ + u8 eType; /* Allocation type code */ + int iForeGuard; /* Guard word for sanity */ +}; + +/* +** Guard words +*/ +#define FOREGUARD 0x80F5E153 +#define REARGUARD 0xE4676B53 + +/* +** Number of malloc size increments to track. +*/ +#define NCSIZE 1000 + +/* +** All of the static variables used by this module are collected +** into a single structure named "mem". This is to keep the +** static variables organized and to reduce namespace pollution +** when this module is combined with other in the amalgamation. +*/ +static struct { + + /* + ** Mutex to control access to the memory allocation subsystem. + */ + sqlite3_mutex *mutex; + + /* + ** Head and tail of a linked list of all outstanding allocations + */ + struct MemBlockHdr *pFirst; + struct MemBlockHdr *pLast; + + /* + ** The number of levels of backtrace to save in new allocations. + */ + int nBacktrace; + void (*xBacktrace)(int, int, void **); + + /* + ** Title text to insert in front of each block + */ + int nTitle; /* Bytes of zTitle to save. Includes '\0' and padding */ + char zTitle[100]; /* The title text */ + + /* + ** sqlite3MallocDisallow() increments the following counter. + ** sqlite3MallocAllow() decrements it. + */ + int disallow; /* Do not allow memory allocation */ + + /* + ** Gather statistics on the sizes of memory allocations. + ** nAlloc[i] is the number of allocation attempts of i*8 + ** bytes. i==NCSIZE is the number of allocation attempts for + ** sizes more than NCSIZE*8 bytes. + */ + int nAlloc[NCSIZE]; /* Total number of allocations */ + int nCurrent[NCSIZE]; /* Current number of allocations */ + int mxCurrent[NCSIZE]; /* Highwater mark for nCurrent */ + +} mem; + + +/* +** Adjust memory usage statistics +*/ +static void adjustStats(int iSize, int increment){ + int i = ROUND8(iSize)/8; + if( i>NCSIZE-1 ){ + i = NCSIZE - 1; + } + if( increment>0 ){ + mem.nAlloc[i]++; + mem.nCurrent[i]++; + if( mem.nCurrent[i]>mem.mxCurrent[i] ){ + mem.mxCurrent[i] = mem.nCurrent[i]; + } + }else{ + mem.nCurrent[i]--; + assert( mem.nCurrent[i]>=0 ); + } +} + +/* +** Given an allocation, find the MemBlockHdr for that allocation. +** +** This routine checks the guards at either end of the allocation and +** if they are incorrect it asserts. +*/ +static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){ + struct MemBlockHdr *p; + int *pInt; + u8 *pU8; + int nReserve; + + p = (struct MemBlockHdr*)pAllocation; + p--; + assert( p->iForeGuard==(int)FOREGUARD ); + nReserve = ROUND8(p->iSize); + pInt = (int*)pAllocation; + pU8 = (u8*)pAllocation; + assert( pInt[nReserve/sizeof(int)]==(int)REARGUARD ); + /* This checks any of the "extra" bytes allocated due + ** to rounding up to an 8 byte boundary to ensure + ** they haven't been overwritten. + */ + while( nReserve-- > p->iSize ) assert( pU8[nReserve]==0x65 ); + return p; +} + +/* +** Return the number of bytes currently allocated at address p. +*/ +static int sqlite3MemSize(void *p){ + struct MemBlockHdr *pHdr; + if( !p ){ + return 0; + } + pHdr = sqlite3MemsysGetHeader(p); + return (int)pHdr->iSize; +} + +/* +** Initialize the memory allocation subsystem. +*/ +static int sqlite3MemInit(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + assert( (sizeof(struct MemBlockHdr)&7) == 0 ); + if( !sqlite3GlobalConfig.bMemstat ){ + /* If memory status is enabled, then the malloc.c wrapper will already + ** hold the STATIC_MEM mutex when the routines here are invoked. */ + mem.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); + } + return SQLITE_OK; +} + +/* +** Deinitialize the memory allocation subsystem. +*/ +static void sqlite3MemShutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + mem.mutex = 0; +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int sqlite3MemRoundup(int n){ + return ROUND8(n); +} + +/* +** Fill a buffer with pseudo-random bytes. This is used to preset +** the content of a new memory allocation to unpredictable values and +** to clear the content of a freed allocation to unpredictable values. +*/ +static void randomFill(char *pBuf, int nByte){ + unsigned int x, y, r; + x = SQLITE_PTR_TO_INT(pBuf); + y = nByte | 1; + while( nByte >= 4 ){ + x = (x>>1) ^ (-(int)(x&1) & 0xd0000001); + y = y*1103515245 + 12345; + r = x ^ y; + *(int*)pBuf = r; + pBuf += 4; + nByte -= 4; + } + while( nByte-- > 0 ){ + x = (x>>1) ^ (-(int)(x&1) & 0xd0000001); + y = y*1103515245 + 12345; + r = x ^ y; + *(pBuf++) = r & 0xff; + } +} + +/* +** Allocate nByte bytes of memory. +*/ +static void *sqlite3MemMalloc(int nByte){ + struct MemBlockHdr *pHdr; + void **pBt; + char *z; + int *pInt; + void *p = 0; + int totalSize; + int nReserve; + sqlite3_mutex_enter(mem.mutex); + assert( mem.disallow==0 ); + nReserve = ROUND8(nByte); + totalSize = nReserve + sizeof(*pHdr) + sizeof(int) + + mem.nBacktrace*sizeof(void*) + mem.nTitle; + p = malloc(totalSize); + if( p ){ + z = p; + pBt = (void**)&z[mem.nTitle]; + pHdr = (struct MemBlockHdr*)&pBt[mem.nBacktrace]; + pHdr->pNext = 0; + pHdr->pPrev = mem.pLast; + if( mem.pLast ){ + mem.pLast->pNext = pHdr; + }else{ + mem.pFirst = pHdr; + } + mem.pLast = pHdr; + pHdr->iForeGuard = FOREGUARD; + pHdr->eType = MEMTYPE_HEAP; + pHdr->nBacktraceSlots = mem.nBacktrace; + pHdr->nTitle = mem.nTitle; + if( mem.nBacktrace ){ + void *aAddr[40]; + pHdr->nBacktrace = backtrace(aAddr, mem.nBacktrace+1)-1; + memcpy(pBt, &aAddr[1], pHdr->nBacktrace*sizeof(void*)); + assert(pBt[0]); + if( mem.xBacktrace ){ + mem.xBacktrace(nByte, pHdr->nBacktrace-1, &aAddr[1]); + } + }else{ + pHdr->nBacktrace = 0; + } + if( mem.nTitle ){ + memcpy(z, mem.zTitle, mem.nTitle); + } + pHdr->iSize = nByte; + adjustStats(nByte, +1); + pInt = (int*)&pHdr[1]; + pInt[nReserve/sizeof(int)] = REARGUARD; + randomFill((char*)pInt, nByte); + memset(((char*)pInt)+nByte, 0x65, nReserve-nByte); + p = (void*)pInt; + } + sqlite3_mutex_leave(mem.mutex); + return p; +} + +/* +** Free memory. +*/ +static void sqlite3MemFree(void *pPrior){ + struct MemBlockHdr *pHdr; + void **pBt; + char *z; + assert( sqlite3GlobalConfig.bMemstat || sqlite3GlobalConfig.bCoreMutex==0 + || mem.mutex!=0 ); + pHdr = sqlite3MemsysGetHeader(pPrior); + pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + sqlite3_mutex_enter(mem.mutex); + if( pHdr->pPrev ){ + assert( pHdr->pPrev->pNext==pHdr ); + pHdr->pPrev->pNext = pHdr->pNext; + }else{ + assert( mem.pFirst==pHdr ); + mem.pFirst = pHdr->pNext; + } + if( pHdr->pNext ){ + assert( pHdr->pNext->pPrev==pHdr ); + pHdr->pNext->pPrev = pHdr->pPrev; + }else{ + assert( mem.pLast==pHdr ); + mem.pLast = pHdr->pPrev; + } + z = (char*)pBt; + z -= pHdr->nTitle; + adjustStats((int)pHdr->iSize, -1); + randomFill(z, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) + + (int)pHdr->iSize + sizeof(int) + pHdr->nTitle); + free(z); + sqlite3_mutex_leave(mem.mutex); +} + +/* +** Change the size of an existing memory allocation. +** +** For this debugging implementation, we *always* make a copy of the +** allocation into a new place in memory. In this way, if the +** higher level code is using pointer to the old allocation, it is +** much more likely to break and we are much more liking to find +** the error. +*/ +static void *sqlite3MemRealloc(void *pPrior, int nByte){ + struct MemBlockHdr *pOldHdr; + void *pNew; + assert( mem.disallow==0 ); + assert( (nByte & 7)==0 ); /* EV: R-46199-30249 */ + pOldHdr = sqlite3MemsysGetHeader(pPrior); + pNew = sqlite3MemMalloc(nByte); + if( pNew ){ + memcpy(pNew, pPrior, (int)(nByteiSize ? nByte : pOldHdr->iSize)); + if( nByte>pOldHdr->iSize ){ + randomFill(&((char*)pNew)[pOldHdr->iSize], nByte - (int)pOldHdr->iSize); + } + sqlite3MemFree(pPrior); + } + return pNew; +} + +/* +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. +*/ +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + static const sqlite3_mem_methods defaultMethods = { + sqlite3MemMalloc, + sqlite3MemFree, + sqlite3MemRealloc, + sqlite3MemSize, + sqlite3MemRoundup, + sqlite3MemInit, + sqlite3MemShutdown, + 0 + }; + sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods); +} + +/* +** Set the "type" of an allocation. +*/ +SQLITE_PRIVATE void sqlite3MemdebugSetType(void *p, u8 eType){ + if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){ + struct MemBlockHdr *pHdr; + pHdr = sqlite3MemsysGetHeader(p); + assert( pHdr->iForeGuard==FOREGUARD ); + pHdr->eType = eType; + } +} + +/* +** Return TRUE if the mask of type in eType matches the type of the +** allocation p. Also return true if p==NULL. +** +** This routine is designed for use within an assert() statement, to +** verify the type of an allocation. For example: +** +** assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); +*/ +SQLITE_PRIVATE int sqlite3MemdebugHasType(void *p, u8 eType){ + int rc = 1; + if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){ + struct MemBlockHdr *pHdr; + pHdr = sqlite3MemsysGetHeader(p); + assert( pHdr->iForeGuard==FOREGUARD ); /* Allocation is valid */ + if( (pHdr->eType&eType)==0 ){ + rc = 0; + } + } + return rc; +} + +/* +** Return TRUE if the mask of type in eType matches no bits of the type of the +** allocation p. Also return true if p==NULL. +** +** This routine is designed for use within an assert() statement, to +** verify the type of an allocation. For example: +** +** assert( sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) ); +*/ +SQLITE_PRIVATE int sqlite3MemdebugNoType(void *p, u8 eType){ + int rc = 1; + if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){ + struct MemBlockHdr *pHdr; + pHdr = sqlite3MemsysGetHeader(p); + assert( pHdr->iForeGuard==FOREGUARD ); /* Allocation is valid */ + if( (pHdr->eType&eType)!=0 ){ + rc = 0; + } + } + return rc; +} + +/* +** Set the number of backtrace levels kept for each allocation. +** A value of zero turns off backtracing. The number is always rounded +** up to a multiple of 2. +*/ +SQLITE_PRIVATE void sqlite3MemdebugBacktrace(int depth){ + if( depth<0 ){ depth = 0; } + if( depth>20 ){ depth = 20; } + depth = (depth+1)&0xfe; + mem.nBacktrace = depth; +} + +SQLITE_PRIVATE void sqlite3MemdebugBacktraceCallback(void (*xBacktrace)(int, int, void **)){ + mem.xBacktrace = xBacktrace; +} + +/* +** Set the title string for subsequent allocations. +*/ +SQLITE_PRIVATE void sqlite3MemdebugSettitle(const char *zTitle){ + unsigned int n = sqlite3Strlen30(zTitle) + 1; + sqlite3_mutex_enter(mem.mutex); + if( n>=sizeof(mem.zTitle) ) n = sizeof(mem.zTitle)-1; + memcpy(mem.zTitle, zTitle, n); + mem.zTitle[n] = 0; + mem.nTitle = ROUND8(n); + sqlite3_mutex_leave(mem.mutex); +} + +SQLITE_PRIVATE void sqlite3MemdebugSync(){ + struct MemBlockHdr *pHdr; + for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){ + void **pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + mem.xBacktrace((int)pHdr->iSize, pHdr->nBacktrace-1, &pBt[1]); + } +} + +/* +** Open the file indicated and write a log of all unfreed memory +** allocations into that log. +*/ +SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){ + FILE *out; + struct MemBlockHdr *pHdr; + void **pBt; + int i; + out = fopen(zFilename, "w"); + if( out==0 ){ + fprintf(stderr, "** Unable to output memory debug output log: %s **\n", + zFilename); + return; + } + for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){ + char *z = (char*)pHdr; + z -= pHdr->nBacktraceSlots*sizeof(void*) + pHdr->nTitle; + fprintf(out, "**** %lld bytes at %p from %s ****\n", + pHdr->iSize, &pHdr[1], pHdr->nTitle ? z : "???"); + if( pHdr->nBacktrace ){ + fflush(out); + pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + backtrace_symbols_fd(pBt, pHdr->nBacktrace, fileno(out)); + fprintf(out, "\n"); + } + } + fprintf(out, "COUNTS:\n"); + for(i=0; i=1 ); + size = mem3.aPool[i-1].u.hdr.size4x/4; + assert( size==mem3.aPool[i+size-1].u.hdr.prevSize ); + assert( size>=2 ); + if( size <= MX_SMALL ){ + memsys3UnlinkFromList(i, &mem3.aiSmall[size-2]); + }else{ + hash = size % N_HASH; + memsys3UnlinkFromList(i, &mem3.aiHash[hash]); + } +} + +/* +** Link the chunk at mem3.aPool[i] so that is on the list rooted +** at *pRoot. +*/ +static void memsys3LinkIntoList(u32 i, u32 *pRoot){ + assert( sqlite3_mutex_held(mem3.mutex) ); + mem3.aPool[i].u.list.next = *pRoot; + mem3.aPool[i].u.list.prev = 0; + if( *pRoot ){ + mem3.aPool[*pRoot].u.list.prev = i; + } + *pRoot = i; +} + +/* +** Link the chunk at index i into either the appropriate +** small chunk list, or into the large chunk hash table. +*/ +static void memsys3Link(u32 i){ + u32 size, hash; + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( i>=1 ); + assert( (mem3.aPool[i-1].u.hdr.size4x & 1)==0 ); + size = mem3.aPool[i-1].u.hdr.size4x/4; + assert( size==mem3.aPool[i+size-1].u.hdr.prevSize ); + assert( size>=2 ); + if( size <= MX_SMALL ){ + memsys3LinkIntoList(i, &mem3.aiSmall[size-2]); + }else{ + hash = size % N_HASH; + memsys3LinkIntoList(i, &mem3.aiHash[hash]); + } +} + +/* +** If the STATIC_MEM mutex is not already held, obtain it now. The mutex +** will already be held (obtained by code in malloc.c) if +** sqlite3GlobalConfig.bMemStat is true. +*/ +static void memsys3Enter(void){ + if( sqlite3GlobalConfig.bMemstat==0 && mem3.mutex==0 ){ + mem3.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); + } + sqlite3_mutex_enter(mem3.mutex); +} +static void memsys3Leave(void){ + sqlite3_mutex_leave(mem3.mutex); +} + +/* +** Called when we are unable to satisfy an allocation of nBytes. +*/ +static void memsys3OutOfMemory(int nByte){ + if( !mem3.alarmBusy ){ + mem3.alarmBusy = 1; + assert( sqlite3_mutex_held(mem3.mutex) ); + sqlite3_mutex_leave(mem3.mutex); + sqlite3_release_memory(nByte); + sqlite3_mutex_enter(mem3.mutex); + mem3.alarmBusy = 0; + } +} + + +/* +** Chunk i is a free chunk that has been unlinked. Adjust its +** size parameters for check-out and return a pointer to the +** user portion of the chunk. +*/ +static void *memsys3Checkout(u32 i, u32 nBlock){ + u32 x; + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( i>=1 ); + assert( mem3.aPool[i-1].u.hdr.size4x/4==nBlock ); + assert( mem3.aPool[i+nBlock-1].u.hdr.prevSize==nBlock ); + x = mem3.aPool[i-1].u.hdr.size4x; + mem3.aPool[i-1].u.hdr.size4x = nBlock*4 | 1 | (x&2); + mem3.aPool[i+nBlock-1].u.hdr.prevSize = nBlock; + mem3.aPool[i+nBlock-1].u.hdr.size4x |= 2; + return &mem3.aPool[i]; +} + +/* +** Carve a piece off of the end of the mem3.iMaster free chunk. +** Return a pointer to the new allocation. Or, if the master chunk +** is not large enough, return 0. +*/ +static void *memsys3FromMaster(u32 nBlock){ + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( mem3.szMaster>=nBlock ); + if( nBlock>=mem3.szMaster-1 ){ + /* Use the entire master */ + void *p = memsys3Checkout(mem3.iMaster, mem3.szMaster); + mem3.iMaster = 0; + mem3.szMaster = 0; + mem3.mnMaster = 0; + return p; + }else{ + /* Split the master block. Return the tail. */ + u32 newi, x; + newi = mem3.iMaster + mem3.szMaster - nBlock; + assert( newi > mem3.iMaster+1 ); + mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = nBlock; + mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x |= 2; + mem3.aPool[newi-1].u.hdr.size4x = nBlock*4 + 1; + mem3.szMaster -= nBlock; + mem3.aPool[newi-1].u.hdr.prevSize = mem3.szMaster; + x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2; + mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x; + if( mem3.szMaster < mem3.mnMaster ){ + mem3.mnMaster = mem3.szMaster; + } + return (void*)&mem3.aPool[newi]; + } +} + +/* +** *pRoot is the head of a list of free chunks of the same size +** or same size hash. In other words, *pRoot is an entry in either +** mem3.aiSmall[] or mem3.aiHash[]. +** +** This routine examines all entries on the given list and tries +** to coalesce each entries with adjacent free chunks. +** +** If it sees a chunk that is larger than mem3.iMaster, it replaces +** the current mem3.iMaster with the new larger chunk. In order for +** this mem3.iMaster replacement to work, the master chunk must be +** linked into the hash tables. That is not the normal state of +** affairs, of course. The calling routine must link the master +** chunk before invoking this routine, then must unlink the (possibly +** changed) master chunk once this routine has finished. +*/ +static void memsys3Merge(u32 *pRoot){ + u32 iNext, prev, size, i, x; + + assert( sqlite3_mutex_held(mem3.mutex) ); + for(i=*pRoot; i>0; i=iNext){ + iNext = mem3.aPool[i].u.list.next; + size = mem3.aPool[i-1].u.hdr.size4x; + assert( (size&1)==0 ); + if( (size&2)==0 ){ + memsys3UnlinkFromList(i, pRoot); + assert( i > mem3.aPool[i-1].u.hdr.prevSize ); + prev = i - mem3.aPool[i-1].u.hdr.prevSize; + if( prev==iNext ){ + iNext = mem3.aPool[prev].u.list.next; + } + memsys3Unlink(prev); + size = i + size/4 - prev; + x = mem3.aPool[prev-1].u.hdr.size4x & 2; + mem3.aPool[prev-1].u.hdr.size4x = size*4 | x; + mem3.aPool[prev+size-1].u.hdr.prevSize = size; + memsys3Link(prev); + i = prev; + }else{ + size /= 4; + } + if( size>mem3.szMaster ){ + mem3.iMaster = i; + mem3.szMaster = size; + } + } +} + +/* +** Return a block of memory of at least nBytes in size. +** Return NULL if unable. +** +** This function assumes that the necessary mutexes, if any, are +** already held by the caller. Hence "Unsafe". +*/ +static void *memsys3MallocUnsafe(int nByte){ + u32 i; + u32 nBlock; + u32 toFree; + + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( sizeof(Mem3Block)==8 ); + if( nByte<=12 ){ + nBlock = 2; + }else{ + nBlock = (nByte + 11)/8; + } + assert( nBlock>=2 ); + + /* STEP 1: + ** Look for an entry of the correct size in either the small + ** chunk table or in the large chunk hash table. This is + ** successful most of the time (about 9 times out of 10). + */ + if( nBlock <= MX_SMALL ){ + i = mem3.aiSmall[nBlock-2]; + if( i>0 ){ + memsys3UnlinkFromList(i, &mem3.aiSmall[nBlock-2]); + return memsys3Checkout(i, nBlock); + } + }else{ + int hash = nBlock % N_HASH; + for(i=mem3.aiHash[hash]; i>0; i=mem3.aPool[i].u.list.next){ + if( mem3.aPool[i-1].u.hdr.size4x/4==nBlock ){ + memsys3UnlinkFromList(i, &mem3.aiHash[hash]); + return memsys3Checkout(i, nBlock); + } + } + } + + /* STEP 2: + ** Try to satisfy the allocation by carving a piece off of the end + ** of the master chunk. This step usually works if step 1 fails. + */ + if( mem3.szMaster>=nBlock ){ + return memsys3FromMaster(nBlock); + } + + + /* STEP 3: + ** Loop through the entire memory pool. Coalesce adjacent free + ** chunks. Recompute the master chunk as the largest free chunk. + ** Then try again to satisfy the allocation by carving a piece off + ** of the end of the master chunk. This step happens very + ** rarely (we hope!) + */ + for(toFree=nBlock*16; toFree<(mem3.nPool*16); toFree *= 2){ + memsys3OutOfMemory(toFree); + if( mem3.iMaster ){ + memsys3Link(mem3.iMaster); + mem3.iMaster = 0; + mem3.szMaster = 0; + } + for(i=0; i=nBlock ){ + return memsys3FromMaster(nBlock); + } + } + } + + /* If none of the above worked, then we fail. */ + return 0; +} + +/* +** Free an outstanding memory allocation. +** +** This function assumes that the necessary mutexes, if any, are +** already held by the caller. Hence "Unsafe". +*/ +static void memsys3FreeUnsafe(void *pOld){ + Mem3Block *p = (Mem3Block*)pOld; + int i; + u32 size, x; + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( p>mem3.aPool && p<&mem3.aPool[mem3.nPool] ); + i = p - mem3.aPool; + assert( (mem3.aPool[i-1].u.hdr.size4x&1)==1 ); + size = mem3.aPool[i-1].u.hdr.size4x/4; + assert( i+size<=mem3.nPool+1 ); + mem3.aPool[i-1].u.hdr.size4x &= ~1; + mem3.aPool[i+size-1].u.hdr.prevSize = size; + mem3.aPool[i+size-1].u.hdr.size4x &= ~2; + memsys3Link(i); + + /* Try to expand the master using the newly freed chunk */ + if( mem3.iMaster ){ + while( (mem3.aPool[mem3.iMaster-1].u.hdr.size4x&2)==0 ){ + size = mem3.aPool[mem3.iMaster-1].u.hdr.prevSize; + mem3.iMaster -= size; + mem3.szMaster += size; + memsys3Unlink(mem3.iMaster); + x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2; + mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x; + mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = mem3.szMaster; + } + x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2; + while( (mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x&1)==0 ){ + memsys3Unlink(mem3.iMaster+mem3.szMaster); + mem3.szMaster += mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x/4; + mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x; + mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = mem3.szMaster; + } + } +} + +/* +** Return the size of an outstanding allocation, in bytes. The +** size returned omits the 8-byte header overhead. This only +** works for chunks that are currently checked out. +*/ +static int memsys3Size(void *p){ + Mem3Block *pBlock; + assert( p!=0 ); + pBlock = (Mem3Block*)p; + assert( (pBlock[-1].u.hdr.size4x&1)!=0 ); + return (pBlock[-1].u.hdr.size4x&~3)*2 - 4; +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int memsys3Roundup(int n){ + if( n<=12 ){ + return 12; + }else{ + return ((n+11)&~7) - 4; + } +} + +/* +** Allocate nBytes of memory. +*/ +static void *memsys3Malloc(int nBytes){ + sqlite3_int64 *p; + assert( nBytes>0 ); /* malloc.c filters out 0 byte requests */ + memsys3Enter(); + p = memsys3MallocUnsafe(nBytes); + memsys3Leave(); + return (void*)p; +} + +/* +** Free memory. +*/ +static void memsys3Free(void *pPrior){ + assert( pPrior ); + memsys3Enter(); + memsys3FreeUnsafe(pPrior); + memsys3Leave(); +} + +/* +** Change the size of an existing memory allocation +*/ +static void *memsys3Realloc(void *pPrior, int nBytes){ + int nOld; + void *p; + if( pPrior==0 ){ + return sqlite3_malloc(nBytes); + } + if( nBytes<=0 ){ + sqlite3_free(pPrior); + return 0; + } + nOld = memsys3Size(pPrior); + if( nBytes<=nOld && nBytes>=nOld-128 ){ + return pPrior; + } + memsys3Enter(); + p = memsys3MallocUnsafe(nBytes); + if( p ){ + if( nOld>1)!=(size&1) ){ + fprintf(out, "%p tail checkout bit is incorrect\n", &mem3.aPool[i]); + assert( 0 ); + break; + } + if( size&1 ){ + fprintf(out, "%p %6d bytes checked out\n", &mem3.aPool[i], (size/4)*8-8); + }else{ + fprintf(out, "%p %6d bytes free%s\n", &mem3.aPool[i], (size/4)*8-8, + i==mem3.iMaster ? " **master**" : ""); + } + } + for(i=0; i0; j=mem3.aPool[j].u.list.next){ + fprintf(out, " %p(%d)", &mem3.aPool[j], + (mem3.aPool[j-1].u.hdr.size4x/4)*8-8); + } + fprintf(out, "\n"); + } + for(i=0; i0; j=mem3.aPool[j].u.list.next){ + fprintf(out, " %p(%d)", &mem3.aPool[j], + (mem3.aPool[j-1].u.hdr.size4x/4)*8-8); + } + fprintf(out, "\n"); + } + fprintf(out, "master=%d\n", mem3.iMaster); + fprintf(out, "nowUsed=%d\n", mem3.nPool*8 - mem3.szMaster*8); + fprintf(out, "mxUsed=%d\n", mem3.nPool*8 - mem3.mnMaster*8); + sqlite3_mutex_leave(mem3.mutex); + if( out==stdout ){ + fflush(stdout); + }else{ + fclose(out); + } +#else + UNUSED_PARAMETER(zFilename); +#endif +} + +/* +** This routine is the only routine in this file with external +** linkage. +** +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. The +** arguments specify the block of memory to manage. +** +** This routine is only called by sqlite3_config(), and therefore +** is not required to be threadsafe (it is not). +*/ +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void){ + static const sqlite3_mem_methods mempoolMethods = { + memsys3Malloc, + memsys3Free, + memsys3Realloc, + memsys3Size, + memsys3Roundup, + memsys3Init, + memsys3Shutdown, + 0 + }; + return &mempoolMethods; +} + +#endif /* SQLITE_ENABLE_MEMSYS3 */ + +/************** End of mem3.c ************************************************/ +/************** Begin file mem5.c ********************************************/ +/* +** 2007 October 14 +** +** 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 the C functions that implement a memory +** allocation subsystem for use by SQLite. +** +** This version of the memory allocation subsystem omits all +** use of malloc(). The application gives SQLite a block of memory +** before calling sqlite3_initialize() from which allocations +** are made and returned by the xMalloc() and xRealloc() +** implementations. Once sqlite3_initialize() has been called, +** the amount of memory available to SQLite is fixed and cannot +** be changed. +** +** This version of the memory allocation subsystem is included +** in the build only if SQLITE_ENABLE_MEMSYS5 is defined. +** +** This memory allocator uses the following algorithm: +** +** 1. All memory allocation sizes are rounded up to a power of 2. +** +** 2. If two adjacent free blocks are the halves of a larger block, +** then the two blocks are coalesced into the single larger block. +** +** 3. New memory is allocated from the first available free block. +** +** This algorithm is described in: J. M. Robson. "Bounds for Some Functions +** Concerning Dynamic Storage Allocation". Journal of the Association for +** Computing Machinery, Volume 21, Number 8, July 1974, pages 491-499. +** +** Let n be the size of the largest allocation divided by the minimum +** allocation size (after rounding all sizes up to a power of 2.) Let M +** be the maximum amount of memory ever outstanding at one time. Let +** N be the total amount of memory available for allocation. Robson +** proved that this memory allocator will never breakdown due to +** fragmentation as long as the following constraint holds: +** +** N >= M*(1 + log2(n)/2) - n + 1 +** +** The sqlite3_status() logic tracks the maximum values of n and M so +** that an application can, at any time, verify this constraint. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is used only when +** SQLITE_ENABLE_MEMSYS5 is defined. +*/ +#ifdef SQLITE_ENABLE_MEMSYS5 + +/* +** A minimum allocation is an instance of the following structure. +** Larger allocations are an array of these structures where the +** size of the array is a power of 2. +** +** The size of this object must be a power of two. That fact is +** verified in memsys5Init(). +*/ +typedef struct Mem5Link Mem5Link; +struct Mem5Link { + int next; /* Index of next free chunk */ + int prev; /* Index of previous free chunk */ +}; + +/* +** Maximum size of any allocation is ((1<=0 && i=0 && iLogsize<=LOGMAX ); + assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize ); + + next = MEM5LINK(i)->next; + prev = MEM5LINK(i)->prev; + if( prev<0 ){ + mem5.aiFreelist[iLogsize] = next; + }else{ + MEM5LINK(prev)->next = next; + } + if( next>=0 ){ + MEM5LINK(next)->prev = prev; + } +} + +/* +** Link the chunk at mem5.aPool[i] so that is on the iLogsize +** free list. +*/ +static void memsys5Link(int i, int iLogsize){ + int x; + assert( sqlite3_mutex_held(mem5.mutex) ); + assert( i>=0 && i=0 && iLogsize<=LOGMAX ); + assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize ); + + x = MEM5LINK(i)->next = mem5.aiFreelist[iLogsize]; + MEM5LINK(i)->prev = -1; + if( x>=0 ){ + assert( xprev = i; + } + mem5.aiFreelist[iLogsize] = i; +} + +/* +** Obtain or release the mutex needed to access global data structures. +*/ +static void memsys5Enter(void){ + sqlite3_mutex_enter(mem5.mutex); +} +static void memsys5Leave(void){ + sqlite3_mutex_leave(mem5.mutex); +} + +/* +** Return the size of an outstanding allocation, in bytes. +** This only works for chunks that are currently checked out. +*/ +static int memsys5Size(void *p){ + int iSize, i; + assert( p!=0 ); + i = (int)(((u8 *)p-mem5.zPool)/mem5.szAtom); + assert( i>=0 && i0 ); + + /* No more than 1GiB per allocation */ + if( nByte > 0x40000000 ) return 0; + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* Keep track of the maximum allocation request. Even unfulfilled + ** requests are counted */ + if( (u32)nByte>mem5.maxRequest ){ + mem5.maxRequest = nByte; + } +#endif + + + /* Round nByte up to the next valid power of two */ + for(iFullSz=mem5.szAtom,iLogsize=0; iFullSzLOGMAX ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes", nByte); + return 0; + } + i = mem5.aiFreelist[iBin]; + memsys5Unlink(i, iBin); + while( iBin>iLogsize ){ + int newSize; + + iBin--; + newSize = 1 << iBin; + mem5.aCtrl[i+newSize] = CTRL_FREE | iBin; + memsys5Link(i+newSize, iBin); + } + mem5.aCtrl[i] = iLogsize; + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* Update allocator performance statistics. */ + mem5.nAlloc++; + mem5.totalAlloc += iFullSz; + mem5.totalExcess += iFullSz - nByte; + mem5.currentCount++; + mem5.currentOut += iFullSz; + if( mem5.maxCount=0 && iBlock0 ); + assert( mem5.currentOut>=(size*mem5.szAtom) ); + mem5.currentCount--; + mem5.currentOut -= size*mem5.szAtom; + assert( mem5.currentOut>0 || mem5.currentCount==0 ); + assert( mem5.currentCount>0 || mem5.currentOut==0 ); +#endif + + mem5.aCtrl[iBlock] = CTRL_FREE | iLogsize; + while( ALWAYS(iLogsize>iLogsize) & 1 ){ + iBuddy = iBlock - size; + assert( iBuddy>=0 ); + }else{ + iBuddy = iBlock + size; + if( iBuddy>=mem5.nBlock ) break; + } + if( mem5.aCtrl[iBuddy]!=(CTRL_FREE | iLogsize) ) break; + memsys5Unlink(iBuddy, iLogsize); + iLogsize++; + if( iBuddy0 ){ + memsys5Enter(); + p = memsys5MallocUnsafe(nBytes); + memsys5Leave(); + } + return (void*)p; +} + +/* +** Free memory. +** +** The outer layer memory allocator prevents this routine from +** being called with pPrior==0. +*/ +static void memsys5Free(void *pPrior){ + assert( pPrior!=0 ); + memsys5Enter(); + memsys5FreeUnsafe(pPrior); + memsys5Leave(); +} + +/* +** Change the size of an existing memory allocation. +** +** The outer layer memory allocator prevents this routine from +** being called with pPrior==0. +** +** nBytes is always a value obtained from a prior call to +** memsys5Round(). Hence nBytes is always a non-negative power +** of two. If nBytes==0 that means that an oversize allocation +** (an allocation larger than 0x40000000) was requested and this +** routine should return 0 without freeing pPrior. +*/ +static void *memsys5Realloc(void *pPrior, int nBytes){ + int nOld; + void *p; + assert( pPrior!=0 ); + assert( (nBytes&(nBytes-1))==0 ); /* EV: R-46199-30249 */ + assert( nBytes>=0 ); + if( nBytes==0 ){ + return 0; + } + nOld = memsys5Size(pPrior); + if( nBytes<=nOld ){ + return pPrior; + } + p = memsys5Malloc(nBytes); + if( p ){ + memcpy(p, pPrior, nOld); + memsys5Free(pPrior); + } + return p; +} + +/* +** Round up a request size to the next valid allocation size. If +** the allocation is too large to be handled by this allocation system, +** return 0. +** +** All allocations must be a power of two and must be expressed by a +** 32-bit signed integer. Hence the largest allocation is 0x40000000 +** or 1073741824 bytes. +*/ +static int memsys5Roundup(int n){ + int iFullSz; + if( n > 0x40000000 ) return 0; + for(iFullSz=mem5.szAtom; iFullSz 0 +** memsys5Log(2) -> 1 +** memsys5Log(4) -> 2 +** memsys5Log(5) -> 3 +** memsys5Log(8) -> 3 +** memsys5Log(9) -> 4 +*/ +static int memsys5Log(int iValue){ + int iLog; + for(iLog=0; (iLog<(int)((sizeof(int)*8)-1)) && (1<mem5.szAtom ){ + mem5.szAtom = mem5.szAtom << 1; + } + + mem5.nBlock = (nByte / (mem5.szAtom+sizeof(u8))); + mem5.zPool = zByte; + mem5.aCtrl = (u8 *)&mem5.zPool[mem5.nBlock*mem5.szAtom]; + + for(ii=0; ii<=LOGMAX; ii++){ + mem5.aiFreelist[ii] = -1; + } + + iOffset = 0; + for(ii=LOGMAX; ii>=0; ii--){ + int nAlloc = (1<mem5.nBlock); + } + + /* If a mutex is required for normal operation, allocate one */ + if( sqlite3GlobalConfig.bMemstat==0 ){ + mem5.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); + } + + return SQLITE_OK; +} + +/* +** Deinitialize this module. +*/ +static void memsys5Shutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + mem5.mutex = 0; + return; +} + +#ifdef SQLITE_TEST +/* +** Open the file indicated and write a log of all unfreed memory +** allocations into that log. +*/ +SQLITE_PRIVATE void sqlite3Memsys5Dump(const char *zFilename){ + FILE *out; + int i, j, n; + int nMinLog; + + if( zFilename==0 || zFilename[0]==0 ){ + out = stdout; + }else{ + out = fopen(zFilename, "w"); + if( out==0 ){ + fprintf(stderr, "** Unable to output memory debug output log: %s **\n", + zFilename); + return; + } + } + memsys5Enter(); + nMinLog = memsys5Log(mem5.szAtom); + for(i=0; i<=LOGMAX && i+nMinLog<32; i++){ + for(n=0, j=mem5.aiFreelist[i]; j>=0; j = MEM5LINK(j)->next, n++){} + fprintf(out, "freelist items of size %d: %d\n", mem5.szAtom << i, n); + } + fprintf(out, "mem5.nAlloc = %llu\n", mem5.nAlloc); + fprintf(out, "mem5.totalAlloc = %llu\n", mem5.totalAlloc); + fprintf(out, "mem5.totalExcess = %llu\n", mem5.totalExcess); + fprintf(out, "mem5.currentOut = %u\n", mem5.currentOut); + fprintf(out, "mem5.currentCount = %u\n", mem5.currentCount); + fprintf(out, "mem5.maxOut = %u\n", mem5.maxOut); + fprintf(out, "mem5.maxCount = %u\n", mem5.maxCount); + fprintf(out, "mem5.maxRequest = %u\n", mem5.maxRequest); + memsys5Leave(); + if( out==stdout ){ + fflush(stdout); + }else{ + fclose(out); + } +} +#endif + +/* +** This routine is the only routine in this file with external +** linkage. It returns a pointer to a static sqlite3_mem_methods +** struct populated with the memsys5 methods. +*/ +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void){ + static const sqlite3_mem_methods memsys5Methods = { + memsys5Malloc, + memsys5Free, + memsys5Realloc, + memsys5Size, + memsys5Roundup, + memsys5Init, + memsys5Shutdown, + 0 + }; + return &memsys5Methods; +} + +#endif /* SQLITE_ENABLE_MEMSYS5 */ + +/************** End of mem5.c ************************************************/ +/************** Begin file mutex.c *******************************************/ +/* +** 2007 August 14 +** +** 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 the C functions that implement mutexes. +** +** This file contains code that is common across all mutex implementations. +*/ +/* #include "sqliteInt.h" */ + +#if defined(SQLITE_DEBUG) && !defined(SQLITE_MUTEX_OMIT) +/* +** For debugging purposes, record when the mutex subsystem is initialized +** and uninitialized so that we can assert() if there is an attempt to +** allocate a mutex while the system is uninitialized. +*/ +static SQLITE_WSD int mutexIsInit = 0; +#endif /* SQLITE_DEBUG && !defined(SQLITE_MUTEX_OMIT) */ + + +#ifndef SQLITE_MUTEX_OMIT + +#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS +/* +** This block (enclosed by SQLITE_ENABLE_MULTITHREADED_CHECKS) contains +** the implementation of a wrapper around the system default mutex +** implementation (sqlite3DefaultMutex()). +** +** Most calls are passed directly through to the underlying default +** mutex implementation. Except, if a mutex is configured by calling +** sqlite3MutexWarnOnContention() on it, then if contention is ever +** encountered within xMutexEnter() a warning is emitted via sqlite3_log(). +** +** This type of mutex is used as the database handle mutex when testing +** apps that usually use SQLITE_CONFIG_MULTITHREAD mode. +*/ + +/* +** Type for all mutexes used when SQLITE_ENABLE_MULTITHREADED_CHECKS +** is defined. Variable CheckMutex.mutex is a pointer to the real mutex +** allocated by the system mutex implementation. Variable iType is usually set +** to the type of mutex requested - SQLITE_MUTEX_RECURSIVE, SQLITE_MUTEX_FAST +** or one of the static mutex identifiers. Or, if this is a recursive mutex +** that has been configured using sqlite3MutexWarnOnContention(), it is +** set to SQLITE_MUTEX_WARNONCONTENTION. +*/ +typedef struct CheckMutex CheckMutex; +struct CheckMutex { + int iType; + sqlite3_mutex *mutex; +}; + +#define SQLITE_MUTEX_WARNONCONTENTION (-1) + +/* +** Pointer to real mutex methods object used by the CheckMutex +** implementation. Set by checkMutexInit(). +*/ +static SQLITE_WSD const sqlite3_mutex_methods *pGlobalMutexMethods; + +#ifdef SQLITE_DEBUG +static int checkMutexHeld(sqlite3_mutex *p){ + return pGlobalMutexMethods->xMutexHeld(((CheckMutex*)p)->mutex); +} +static int checkMutexNotheld(sqlite3_mutex *p){ + return pGlobalMutexMethods->xMutexNotheld(((CheckMutex*)p)->mutex); +} +#endif + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static int checkMutexInit(void){ + pGlobalMutexMethods = sqlite3DefaultMutex(); + return SQLITE_OK; +} +static int checkMutexEnd(void){ + pGlobalMutexMethods = 0; + return SQLITE_OK; +} + +/* +** Allocate a mutex. +*/ +static sqlite3_mutex *checkMutexAlloc(int iType){ + static CheckMutex staticMutexes[] = { + {2, 0}, {3, 0}, {4, 0}, {5, 0}, + {6, 0}, {7, 0}, {8, 0}, {9, 0}, + {10, 0}, {11, 0}, {12, 0}, {13, 0} + }; + CheckMutex *p = 0; + + assert( SQLITE_MUTEX_RECURSIVE==1 && SQLITE_MUTEX_FAST==0 ); + if( iType<2 ){ + p = sqlite3MallocZero(sizeof(CheckMutex)); + if( p==0 ) return 0; + p->iType = iType; + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + if( iType-2>=ArraySize(staticMutexes) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + p = &staticMutexes[iType-2]; + } + + if( p->mutex==0 ){ + p->mutex = pGlobalMutexMethods->xMutexAlloc(iType); + if( p->mutex==0 ){ + if( iType<2 ){ + sqlite3_free(p); + } + p = 0; + } + } + + return (sqlite3_mutex*)p; +} + +/* +** Free a mutex. +*/ +static void checkMutexFree(sqlite3_mutex *p){ + assert( SQLITE_MUTEX_RECURSIVE<2 ); + assert( SQLITE_MUTEX_FAST<2 ); + assert( SQLITE_MUTEX_WARNONCONTENTION<2 ); + +#if SQLITE_ENABLE_API_ARMOR + if( ((CheckMutex*)p)->iType<2 ) +#endif + { + CheckMutex *pCheck = (CheckMutex*)p; + pGlobalMutexMethods->xMutexFree(pCheck->mutex); + sqlite3_free(pCheck); + } +#ifdef SQLITE_ENABLE_API_ARMOR + else{ + (void)SQLITE_MISUSE_BKPT; + } +#endif +} + +/* +** Enter the mutex. +*/ +static void checkMutexEnter(sqlite3_mutex *p){ + CheckMutex *pCheck = (CheckMutex*)p; + if( pCheck->iType==SQLITE_MUTEX_WARNONCONTENTION ){ + if( SQLITE_OK==pGlobalMutexMethods->xMutexTry(pCheck->mutex) ){ + return; + } + sqlite3_log(SQLITE_MISUSE, + "illegal multi-threaded access to database connection" + ); + } + pGlobalMutexMethods->xMutexEnter(pCheck->mutex); +} + +/* +** Enter the mutex (do not block). +*/ +static int checkMutexTry(sqlite3_mutex *p){ + CheckMutex *pCheck = (CheckMutex*)p; + return pGlobalMutexMethods->xMutexTry(pCheck->mutex); +} + +/* +** Leave the mutex. +*/ +static void checkMutexLeave(sqlite3_mutex *p){ + CheckMutex *pCheck = (CheckMutex*)p; + pGlobalMutexMethods->xMutexLeave(pCheck->mutex); +} + +sqlite3_mutex_methods const *multiThreadedCheckMutex(void){ + static const sqlite3_mutex_methods sMutex = { + checkMutexInit, + checkMutexEnd, + checkMutexAlloc, + checkMutexFree, + checkMutexEnter, + checkMutexTry, + checkMutexLeave, +#ifdef SQLITE_DEBUG + checkMutexHeld, + checkMutexNotheld +#else + 0, + 0 +#endif + }; + return &sMutex; +} + +/* +** Mark the SQLITE_MUTEX_RECURSIVE mutex passed as the only argument as +** one on which there should be no contention. +*/ +SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex *p){ + if( sqlite3GlobalConfig.mutex.xMutexAlloc==checkMutexAlloc ){ + CheckMutex *pCheck = (CheckMutex*)p; + assert( pCheck->iType==SQLITE_MUTEX_RECURSIVE ); + pCheck->iType = SQLITE_MUTEX_WARNONCONTENTION; + } +} +#endif /* ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS */ + +/* +** Initialize the mutex system. +*/ +SQLITE_PRIVATE int sqlite3MutexInit(void){ + int rc = SQLITE_OK; + if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){ + /* If the xMutexAlloc method has not been set, then the user did not + ** install a mutex implementation via sqlite3_config() prior to + ** sqlite3_initialize() being called. This block copies pointers to + ** the default implementation into the sqlite3GlobalConfig structure. + */ + sqlite3_mutex_methods const *pFrom; + sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex; + + if( sqlite3GlobalConfig.bCoreMutex ){ +#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS + pFrom = multiThreadedCheckMutex(); +#else + pFrom = sqlite3DefaultMutex(); +#endif + }else{ + pFrom = sqlite3NoopMutex(); + } + pTo->xMutexInit = pFrom->xMutexInit; + pTo->xMutexEnd = pFrom->xMutexEnd; + pTo->xMutexFree = pFrom->xMutexFree; + pTo->xMutexEnter = pFrom->xMutexEnter; + pTo->xMutexTry = pFrom->xMutexTry; + pTo->xMutexLeave = pFrom->xMutexLeave; + pTo->xMutexHeld = pFrom->xMutexHeld; + pTo->xMutexNotheld = pFrom->xMutexNotheld; + sqlite3MemoryBarrier(); + pTo->xMutexAlloc = pFrom->xMutexAlloc; + } + assert( sqlite3GlobalConfig.mutex.xMutexInit ); + rc = sqlite3GlobalConfig.mutex.xMutexInit(); + +#ifdef SQLITE_DEBUG + GLOBAL(int, mutexIsInit) = 1; +#endif + + sqlite3MemoryBarrier(); + return rc; +} + +/* +** Shutdown the mutex system. This call frees resources allocated by +** sqlite3MutexInit(). +*/ +SQLITE_PRIVATE int sqlite3MutexEnd(void){ + int rc = SQLITE_OK; + if( sqlite3GlobalConfig.mutex.xMutexEnd ){ + rc = sqlite3GlobalConfig.mutex.xMutexEnd(); + } + +#ifdef SQLITE_DEBUG + GLOBAL(int, mutexIsInit) = 0; +#endif + + return rc; +} + +/* +** Retrieve a pointer to a static mutex or allocate a new dynamic one. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int id){ +#ifndef SQLITE_OMIT_AUTOINIT + if( id<=SQLITE_MUTEX_RECURSIVE && sqlite3_initialize() ) return 0; + if( id>SQLITE_MUTEX_RECURSIVE && sqlite3MutexInit() ) return 0; +#endif + assert( sqlite3GlobalConfig.mutex.xMutexAlloc ); + return sqlite3GlobalConfig.mutex.xMutexAlloc(id); +} + +SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int id){ + if( !sqlite3GlobalConfig.bCoreMutex ){ + return 0; + } + assert( GLOBAL(int, mutexIsInit) ); + assert( sqlite3GlobalConfig.mutex.xMutexAlloc ); + return sqlite3GlobalConfig.mutex.xMutexAlloc(id); +} + +/* +** Free a dynamic mutex. +*/ +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){ + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexFree ); + sqlite3GlobalConfig.mutex.xMutexFree(p); + } +} + +/* +** Obtain the mutex p. If some other thread already has the mutex, block +** until it can be obtained. +*/ +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){ + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexEnter ); + sqlite3GlobalConfig.mutex.xMutexEnter(p); + } +} + +/* +** Obtain the mutex p. If successful, return SQLITE_OK. Otherwise, if another +** thread holds the mutex and it cannot be obtained, return SQLITE_BUSY. +*/ +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){ + int rc = SQLITE_OK; + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexTry ); + return sqlite3GlobalConfig.mutex.xMutexTry(p); + } + return rc; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was previously +** entered by the same thread. The behavior is undefined if the mutex +** is not currently entered. If a NULL pointer is passed as an argument +** this function is a no-op. +*/ +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){ + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexLeave ); + sqlite3GlobalConfig.mutex.xMutexLeave(p); + } +} + +#ifndef NDEBUG +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use inside assert() statements. +*/ +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){ + assert( p==0 || sqlite3GlobalConfig.mutex.xMutexHeld ); + return p==0 || sqlite3GlobalConfig.mutex.xMutexHeld(p); +} +SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){ + assert( p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld ); + return p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld(p); +} +#endif + +#endif /* !defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex.c ***********************************************/ +/************** Begin file mutex_noop.c **************************************/ +/* +** 2008 October 07 +** +** 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 the C functions that implement mutexes. +** +** This implementation in this file does not provide any mutual +** exclusion and is thus suitable for use only in applications +** that use SQLite in a single thread. The routines defined +** here are place-holders. Applications can substitute working +** mutex routines at start-time using the +** +** sqlite3_config(SQLITE_CONFIG_MUTEX,...) +** +** interface. +** +** If compiled with SQLITE_DEBUG, then additional logic is inserted +** that does error checking on mutexes to make sure they are being +** called correctly. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_MUTEX_OMIT + +#ifndef SQLITE_DEBUG +/* +** Stub routines for all mutex methods. +** +** This routines provide no mutual exclusion or error checking. +*/ +static int noopMutexInit(void){ return SQLITE_OK; } +static int noopMutexEnd(void){ return SQLITE_OK; } +static sqlite3_mutex *noopMutexAlloc(int id){ + UNUSED_PARAMETER(id); + return (sqlite3_mutex*)8; +} +static void noopMutexFree(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } +static void noopMutexEnter(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } +static int noopMutexTry(sqlite3_mutex *p){ + UNUSED_PARAMETER(p); + return SQLITE_OK; +} +static void noopMutexLeave(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){ + static const sqlite3_mutex_methods sMutex = { + noopMutexInit, + noopMutexEnd, + noopMutexAlloc, + noopMutexFree, + noopMutexEnter, + noopMutexTry, + noopMutexLeave, + + 0, + 0, + }; + + return &sMutex; +} +#endif /* !SQLITE_DEBUG */ + +#ifdef SQLITE_DEBUG +/* +** In this implementation, error checking is provided for testing +** and debugging purposes. The mutexes still do not provide any +** mutual exclusion. +*/ + +/* +** The mutex object +*/ +typedef struct sqlite3_debug_mutex { + int id; /* The mutex type */ + int cnt; /* Number of entries without a matching leave */ +} sqlite3_debug_mutex; + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use inside assert() statements. +*/ +static int debugMutexHeld(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + return p==0 || p->cnt>0; +} +static int debugMutexNotheld(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + return p==0 || p->cnt==0; +} + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static int debugMutexInit(void){ return SQLITE_OK; } +static int debugMutexEnd(void){ return SQLITE_OK; } + +/* +** The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. If it returns NULL +** that means that a mutex could not be allocated. +*/ +static sqlite3_mutex *debugMutexAlloc(int id){ + static sqlite3_debug_mutex aStatic[SQLITE_MUTEX_STATIC_VFS3 - 1]; + sqlite3_debug_mutex *pNew = 0; + switch( id ){ + case SQLITE_MUTEX_FAST: + case SQLITE_MUTEX_RECURSIVE: { + pNew = sqlite3Malloc(sizeof(*pNew)); + if( pNew ){ + pNew->id = id; + pNew->cnt = 0; + } + break; + } + default: { +#ifdef SQLITE_ENABLE_API_ARMOR + if( id-2<0 || id-2>=ArraySize(aStatic) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + pNew = &aStatic[id-2]; + pNew->id = id; + break; + } + } + return (sqlite3_mutex*)pNew; +} + +/* +** This routine deallocates a previously allocated mutex. +*/ +static void debugMutexFree(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( p->cnt==0 ); + if( p->id==SQLITE_MUTEX_RECURSIVE || p->id==SQLITE_MUTEX_FAST ){ + sqlite3_free(p); + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + (void)SQLITE_MISUSE_BKPT; +#endif + } +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +static void debugMutexEnter(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) ); + p->cnt++; +} +static int debugMutexTry(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) ); + p->cnt++; + return SQLITE_OK; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +static void debugMutexLeave(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( debugMutexHeld(pX) ); + p->cnt--; + assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) ); +} + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){ + static const sqlite3_mutex_methods sMutex = { + debugMutexInit, + debugMutexEnd, + debugMutexAlloc, + debugMutexFree, + debugMutexEnter, + debugMutexTry, + debugMutexLeave, + + debugMutexHeld, + debugMutexNotheld + }; + + return &sMutex; +} +#endif /* SQLITE_DEBUG */ + +/* +** If compiled with SQLITE_MUTEX_NOOP, then the no-op mutex implementation +** is used regardless of the run-time threadsafety setting. +*/ +#ifdef SQLITE_MUTEX_NOOP +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ + return sqlite3NoopMutex(); +} +#endif /* defined(SQLITE_MUTEX_NOOP) */ +#endif /* !defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex_noop.c ******************************************/ +/************** Begin file mutex_unix.c **************************************/ +/* +** 2007 August 28 +** +** 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 the C functions that implement mutexes for pthreads +*/ +/* #include "sqliteInt.h" */ + +/* +** The code in this file is only used if we are compiling threadsafe +** under unix with pthreads. +** +** Note that this implementation requires a version of pthreads that +** supports recursive mutexes. +*/ +#ifdef SQLITE_MUTEX_PTHREADS + +#include + +/* +** The sqlite3_mutex.id, sqlite3_mutex.nRef, and sqlite3_mutex.owner fields +** are necessary under two condidtions: (1) Debug builds and (2) using +** home-grown mutexes. Encapsulate these conditions into a single #define. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_HOMEGROWN_RECURSIVE_MUTEX) +# define SQLITE_MUTEX_NREF 1 +#else +# define SQLITE_MUTEX_NREF 0 +#endif + +/* +** Each recursive mutex is an instance of the following structure. +*/ +struct sqlite3_mutex { + pthread_mutex_t mutex; /* Mutex controlling the lock */ +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + int id; /* Mutex type */ +#endif +#if SQLITE_MUTEX_NREF + volatile int nRef; /* Number of entrances */ + volatile pthread_t owner; /* Thread that is within this mutex */ + int trace; /* True to trace changes */ +#endif +}; +#if SQLITE_MUTEX_NREF +# define SQLITE3_MUTEX_INITIALIZER(id) \ + {PTHREAD_MUTEX_INITIALIZER,id,0,(pthread_t)0,0} +#elif defined(SQLITE_ENABLE_API_ARMOR) +# define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER, id } +#else +#define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER } +#endif + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use only inside assert() statements. On some platforms, +** there might be race conditions that can cause these routines to +** deliver incorrect results. In particular, if pthread_equal() is +** not an atomic operation, then these routines might delivery +** incorrect results. On most platforms, pthread_equal() is a +** comparison of two integers and is therefore atomic. But we are +** told that HPUX is not such a platform. If so, then these routines +** will not always work correctly on HPUX. +** +** On those platforms where pthread_equal() is not atomic, SQLite +** should be compiled without -DSQLITE_DEBUG and with -DNDEBUG to +** make sure no assert() statements are evaluated and hence these +** routines are never called. +*/ +#if !defined(NDEBUG) || defined(SQLITE_DEBUG) +static int pthreadMutexHeld(sqlite3_mutex *p){ + return (p->nRef!=0 && pthread_equal(p->owner, pthread_self())); +} +static int pthreadMutexNotheld(sqlite3_mutex *p){ + return p->nRef==0 || pthread_equal(p->owner, pthread_self())==0; +} +#endif + +/* +** Try to provide a memory barrier operation, needed for initialization +** and also for the implementation of xShmBarrier in the VFS in cases +** where SQLite is compiled without mutexes. +*/ +SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ +#if defined(SQLITE_MEMORY_BARRIER) + SQLITE_MEMORY_BARRIER; +#elif defined(__GNUC__) && GCC_VERSION>=4001000 + __sync_synchronize(); +#endif +} + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static int pthreadMutexInit(void){ return SQLITE_OK; } +static int pthreadMutexEnd(void){ return SQLITE_OK; } + +/* +** The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. If it returns NULL +** that means that a mutex could not be allocated. SQLite +** will unwind its stack and return an error. The argument +** to sqlite3_mutex_alloc() is one of these integer constants: +** +**
    +**
  • SQLITE_MUTEX_FAST +**
  • SQLITE_MUTEX_RECURSIVE +**
  • SQLITE_MUTEX_STATIC_MASTER +**
  • SQLITE_MUTEX_STATIC_MEM +**
  • SQLITE_MUTEX_STATIC_OPEN +**
  • SQLITE_MUTEX_STATIC_PRNG +**
  • SQLITE_MUTEX_STATIC_LRU +**
  • SQLITE_MUTEX_STATIC_PMEM +**
  • SQLITE_MUTEX_STATIC_APP1 +**
  • SQLITE_MUTEX_STATIC_APP2 +**
  • SQLITE_MUTEX_STATIC_APP3 +**
  • SQLITE_MUTEX_STATIC_VFS1 +**
  • SQLITE_MUTEX_STATIC_VFS2 +**
  • SQLITE_MUTEX_STATIC_VFS3 +**
+** +** The first two constants cause sqlite3_mutex_alloc() to create +** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. But SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** The other allowed parameters to sqlite3_mutex_alloc() each return +** a pointer to a static preexisting mutex. Six static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +*/ +static sqlite3_mutex *pthreadMutexAlloc(int iType){ + static sqlite3_mutex staticMutexes[] = { + SQLITE3_MUTEX_INITIALIZER(2), + SQLITE3_MUTEX_INITIALIZER(3), + SQLITE3_MUTEX_INITIALIZER(4), + SQLITE3_MUTEX_INITIALIZER(5), + SQLITE3_MUTEX_INITIALIZER(6), + SQLITE3_MUTEX_INITIALIZER(7), + SQLITE3_MUTEX_INITIALIZER(8), + SQLITE3_MUTEX_INITIALIZER(9), + SQLITE3_MUTEX_INITIALIZER(10), + SQLITE3_MUTEX_INITIALIZER(11), + SQLITE3_MUTEX_INITIALIZER(12), + SQLITE3_MUTEX_INITIALIZER(13) + }; + sqlite3_mutex *p; + switch( iType ){ + case SQLITE_MUTEX_RECURSIVE: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + /* If recursive mutexes are not available, we will have to + ** build our own. See below. */ + pthread_mutex_init(&p->mutex, 0); +#else + /* Use a recursive mutex if it is available */ + pthread_mutexattr_t recursiveAttr; + pthread_mutexattr_init(&recursiveAttr); + pthread_mutexattr_settype(&recursiveAttr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&p->mutex, &recursiveAttr); + pthread_mutexattr_destroy(&recursiveAttr); +#endif +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + p->id = SQLITE_MUTEX_RECURSIVE; +#endif + } + break; + } + case SQLITE_MUTEX_FAST: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + pthread_mutex_init(&p->mutex, 0); +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + p->id = SQLITE_MUTEX_FAST; +#endif + } + break; + } + default: { +#ifdef SQLITE_ENABLE_API_ARMOR + if( iType-2<0 || iType-2>=ArraySize(staticMutexes) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + p = &staticMutexes[iType-2]; + break; + } + } +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + assert( p==0 || p->id==iType ); +#endif + return p; +} + + +/* +** This routine deallocates a previously +** allocated mutex. SQLite is careful to deallocate every +** mutex that it allocates. +*/ +static void pthreadMutexFree(sqlite3_mutex *p){ + assert( p->nRef==0 ); +#if SQLITE_ENABLE_API_ARMOR + if( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ) +#endif + { + pthread_mutex_destroy(&p->mutex); + sqlite3_free(p); + } +#ifdef SQLITE_ENABLE_API_ARMOR + else{ + (void)SQLITE_MISUSE_BKPT; + } +#endif +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +static void pthreadMutexEnter(sqlite3_mutex *p){ + assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) ); + +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + /* If recursive mutexes are not available, then we have to grow + ** our own. This implementation assumes that pthread_equal() + ** is atomic - that it cannot be deceived into thinking self + ** and p->owner are equal if p->owner changes between two values + ** that are not equal to self while the comparison is taking place. + ** This implementation also assumes a coherent cache - that + ** separate processes cannot read different values from the same + ** address at the same time. If either of these two conditions + ** are not met, then the mutexes will fail and problems will result. + */ + { + pthread_t self = pthread_self(); + if( p->nRef>0 && pthread_equal(p->owner, self) ){ + p->nRef++; + }else{ + pthread_mutex_lock(&p->mutex); + assert( p->nRef==0 ); + p->owner = self; + p->nRef = 1; + } + } +#else + /* Use the built-in recursive mutexes if they are available. + */ + pthread_mutex_lock(&p->mutex); +#if SQLITE_MUTEX_NREF + assert( p->nRef>0 || p->owner==0 ); + p->owner = pthread_self(); + p->nRef++; +#endif +#endif + +#ifdef SQLITE_DEBUG + if( p->trace ){ + printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif +} +static int pthreadMutexTry(sqlite3_mutex *p){ + int rc; + assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) ); + +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + /* If recursive mutexes are not available, then we have to grow + ** our own. This implementation assumes that pthread_equal() + ** is atomic - that it cannot be deceived into thinking self + ** and p->owner are equal if p->owner changes between two values + ** that are not equal to self while the comparison is taking place. + ** This implementation also assumes a coherent cache - that + ** separate processes cannot read different values from the same + ** address at the same time. If either of these two conditions + ** are not met, then the mutexes will fail and problems will result. + */ + { + pthread_t self = pthread_self(); + if( p->nRef>0 && pthread_equal(p->owner, self) ){ + p->nRef++; + rc = SQLITE_OK; + }else if( pthread_mutex_trylock(&p->mutex)==0 ){ + assert( p->nRef==0 ); + p->owner = self; + p->nRef = 1; + rc = SQLITE_OK; + }else{ + rc = SQLITE_BUSY; + } + } +#else + /* Use the built-in recursive mutexes if they are available. + */ + if( pthread_mutex_trylock(&p->mutex)==0 ){ +#if SQLITE_MUTEX_NREF + p->owner = pthread_self(); + p->nRef++; +#endif + rc = SQLITE_OK; + }else{ + rc = SQLITE_BUSY; + } +#endif + +#ifdef SQLITE_DEBUG + if( rc==SQLITE_OK && p->trace ){ + printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif + return rc; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +static void pthreadMutexLeave(sqlite3_mutex *p){ + assert( pthreadMutexHeld(p) ); +#if SQLITE_MUTEX_NREF + p->nRef--; + if( p->nRef==0 ) p->owner = 0; +#endif + assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); + +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + if( p->nRef==0 ){ + pthread_mutex_unlock(&p->mutex); + } +#else + pthread_mutex_unlock(&p->mutex); +#endif + +#ifdef SQLITE_DEBUG + if( p->trace ){ + printf("leave mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif +} + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ + static const sqlite3_mutex_methods sMutex = { + pthreadMutexInit, + pthreadMutexEnd, + pthreadMutexAlloc, + pthreadMutexFree, + pthreadMutexEnter, + pthreadMutexTry, + pthreadMutexLeave, +#ifdef SQLITE_DEBUG + pthreadMutexHeld, + pthreadMutexNotheld +#else + 0, + 0 +#endif + }; + + return &sMutex; +} + +#endif /* SQLITE_MUTEX_PTHREADS */ + +/************** End of mutex_unix.c ******************************************/ +/************** Begin file mutex_w32.c ***************************************/ +/* +** 2007 August 14 +** +** 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 the C functions that implement mutexes for Win32. +*/ +/* #include "sqliteInt.h" */ + +#if SQLITE_OS_WIN +/* +** Include code that is common to all os_*.c files +*/ +/************** Include os_common.h in the middle of mutex_w32.c *************/ +/************** Begin file os_common.h ***************************************/ +/* +** 2004 May 22 +** +** 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 macros and a little bit of code that is common to +** all of the platform-specific files (os_*.c) and is #included into those +** files. +** +** This file should be #included by the os_*.c files only. It is not a +** general purpose header file. +*/ +#ifndef _OS_COMMON_H_ +#define _OS_COMMON_H_ + +/* +** At least two bugs have slipped in because we changed the MEMORY_DEBUG +** macro to SQLITE_DEBUG and some older makefiles have not yet made the +** switch. The following code should catch this problem at compile-time. +*/ +#ifdef MEMORY_DEBUG +# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." +#endif + +/* +** Macros for performance tracing. Normally turned off. Only works +** on i486 hardware. +*/ +#ifdef SQLITE_PERFORMANCE_TRACE + +/* +** hwtime.h contains inline assembler code for implementing +** high-performance timing routines. +*/ +/************** Include hwtime.h in the middle of os_common.h ****************/ +/************** Begin file hwtime.h ******************************************/ +/* +** 2008 May 27 +** +** 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 inline asm code for retrieving "high-performance" +** counters for x86 and x86_64 class CPUs. +*/ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H + +/* +** The following routine only works on pentium-class (or newer) processors. +** It uses the RDTSC opcode to read the cycle count value out of the +** processor and returns that value. This can be used for high-res +** profiling. +*/ +#if !defined(__STRICT_ANSI__) && \ + (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) + + #if defined(__GNUC__) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + + #elif defined(_MSC_VER) + + __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ + __asm { + rdtsc + ret ; return value at EDX:EAX + } + } + + #endif + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long val; + __asm__ __volatile__ ("rdtsc" : "=A" (val)); + return val; + } + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long long retval; + unsigned long junk; + __asm__ __volatile__ ("\n\ + 1: mftbu %1\n\ + mftb %L0\n\ + mftbu %0\n\ + cmpw %0,%1\n\ + bne 1b" + : "=r" (retval), "=r" (junk)); + return retval; + } + +#else + + /* + ** asm() is needed for hardware timing support. Without asm(), + ** disable the sqlite3Hwtime() routine. + ** + ** sqlite3Hwtime() is only used for some obscure debugging + ** and analysis configurations, not in any deliverable, so this + ** should not be a great loss. + */ +SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } + +#endif + +#endif /* !defined(SQLITE_HWTIME_H) */ + +/************** End of hwtime.h **********************************************/ +/************** Continuing where we left off in os_common.h ******************/ + +static sqlite_uint64 g_start; +static sqlite_uint64 g_elapsed; +#define TIMER_START g_start=sqlite3Hwtime() +#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start +#define TIMER_ELAPSED g_elapsed +#else +#define TIMER_START +#define TIMER_END +#define TIMER_ELAPSED ((sqlite_uint64)0) +#endif + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_io_error_hit; +SQLITE_API extern int sqlite3_io_error_hardhit; +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_persist; +SQLITE_API extern int sqlite3_io_error_benign; +SQLITE_API extern int sqlite3_diskfull_pending; +SQLITE_API extern int sqlite3_diskfull; +#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) +#define SimulateIOError(CODE) \ + if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ + || sqlite3_io_error_pending-- == 1 ) \ + { local_ioerr(); CODE; } +static void local_ioerr(){ + IOTRACE(("IOERR\n")); + sqlite3_io_error_hit++; + if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++; +} +#define SimulateDiskfullError(CODE) \ + if( sqlite3_diskfull_pending ){ \ + if( sqlite3_diskfull_pending == 1 ){ \ + local_ioerr(); \ + sqlite3_diskfull = 1; \ + sqlite3_io_error_hit = 1; \ + CODE; \ + }else{ \ + sqlite3_diskfull_pending--; \ + } \ + } +#else +#define SimulateIOErrorBenign(X) +#define SimulateIOError(A) +#define SimulateDiskfullError(A) +#endif /* defined(SQLITE_TEST) */ + +/* +** When testing, keep a count of the number of open files. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_open_file_count; +#define OpenCounter(X) sqlite3_open_file_count+=(X) +#else +#define OpenCounter(X) +#endif /* defined(SQLITE_TEST) */ + +#endif /* !defined(_OS_COMMON_H_) */ + +/************** End of os_common.h *******************************************/ +/************** Continuing where we left off in mutex_w32.c ******************/ + +/* +** Include the header file for the Windows VFS. +*/ +/************** Include os_win.h in the middle of mutex_w32.c ****************/ +/************** Begin file os_win.h ******************************************/ +/* +** 2013 November 25 +** +** 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 code that is specific to Windows. +*/ +#ifndef SQLITE_OS_WIN_H +#define SQLITE_OS_WIN_H + +/* +** Include the primary Windows SDK header file. +*/ +#include "windows.h" + +#ifdef __CYGWIN__ +# include +# include /* amalgamator: dontcache */ +#endif + +/* +** Determine if we are dealing with Windows NT. +** +** We ought to be able to determine if we are compiling for Windows 9x or +** Windows NT using the _WIN32_WINNT macro as follows: +** +** #if defined(_WIN32_WINNT) +** # define SQLITE_OS_WINNT 1 +** #else +** # define SQLITE_OS_WINNT 0 +** #endif +** +** However, Visual Studio 2005 does not set _WIN32_WINNT by default, as +** it ought to, so the above test does not work. We'll just assume that +** everything is Windows NT unless the programmer explicitly says otherwise +** by setting SQLITE_OS_WINNT to 0. +*/ +#if SQLITE_OS_WIN && !defined(SQLITE_OS_WINNT) +# define SQLITE_OS_WINNT 1 +#endif + +/* +** Determine if we are dealing with Windows CE - which has a much reduced +** API. +*/ +#if defined(_WIN32_WCE) +# define SQLITE_OS_WINCE 1 +#else +# define SQLITE_OS_WINCE 0 +#endif + +/* +** Determine if we are dealing with WinRT, which provides only a subset of +** the full Win32 API. +*/ +#if !defined(SQLITE_OS_WINRT) +# define SQLITE_OS_WINRT 0 +#endif + +/* +** For WinCE, some API function parameters do not appear to be declared as +** volatile. +*/ +#if SQLITE_OS_WINCE +# define SQLITE_WIN32_VOLATILE +#else +# define SQLITE_WIN32_VOLATILE volatile +#endif + +/* +** For some Windows sub-platforms, the _beginthreadex() / _endthreadex() +** functions are not available (e.g. those not using MSVC, Cygwin, etc). +*/ +#if SQLITE_OS_WIN && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && \ + SQLITE_THREADSAFE>0 && !defined(__CYGWIN__) +# define SQLITE_OS_WIN_THREADS 1 +#else +# define SQLITE_OS_WIN_THREADS 0 +#endif + +#endif /* SQLITE_OS_WIN_H */ + +/************** End of os_win.h **********************************************/ +/************** Continuing where we left off in mutex_w32.c ******************/ +#endif + +/* +** The code in this file is only used if we are compiling multithreaded +** on a Win32 system. +*/ +#ifdef SQLITE_MUTEX_W32 + +/* +** Each recursive mutex is an instance of the following structure. +*/ +struct sqlite3_mutex { + CRITICAL_SECTION mutex; /* Mutex controlling the lock */ + int id; /* Mutex type */ +#ifdef SQLITE_DEBUG + volatile int nRef; /* Number of enterances */ + volatile DWORD owner; /* Thread holding this mutex */ + volatile LONG trace; /* True to trace changes */ +#endif +}; + +/* +** These are the initializer values used when declaring a "static" mutex +** on Win32. It should be noted that all mutexes require initialization +** on the Win32 platform. +*/ +#define SQLITE_W32_MUTEX_INITIALIZER { 0 } + +#ifdef SQLITE_DEBUG +#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id, \ + 0L, (DWORD)0, 0 } +#else +#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id } +#endif + +#ifdef SQLITE_DEBUG +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use only inside assert() statements. +*/ +static int winMutexHeld(sqlite3_mutex *p){ + return p->nRef!=0 && p->owner==GetCurrentThreadId(); +} + +static int winMutexNotheld2(sqlite3_mutex *p, DWORD tid){ + return p->nRef==0 || p->owner!=tid; +} + +static int winMutexNotheld(sqlite3_mutex *p){ + DWORD tid = GetCurrentThreadId(); + return winMutexNotheld2(p, tid); +} +#endif + +/* +** Try to provide a memory barrier operation, needed for initialization +** and also for the xShmBarrier method of the VFS in cases when SQLite is +** compiled without mutexes (SQLITE_THREADSAFE=0). +*/ +SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ +#if defined(SQLITE_MEMORY_BARRIER) + SQLITE_MEMORY_BARRIER; +#elif defined(__GNUC__) + __sync_synchronize(); +#elif MSVC_VERSION>=1300 + _ReadWriteBarrier(); +#elif defined(MemoryBarrier) + MemoryBarrier(); +#endif +} + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static sqlite3_mutex winMutex_staticMutexes[] = { + SQLITE3_MUTEX_INITIALIZER(2), + SQLITE3_MUTEX_INITIALIZER(3), + SQLITE3_MUTEX_INITIALIZER(4), + SQLITE3_MUTEX_INITIALIZER(5), + SQLITE3_MUTEX_INITIALIZER(6), + SQLITE3_MUTEX_INITIALIZER(7), + SQLITE3_MUTEX_INITIALIZER(8), + SQLITE3_MUTEX_INITIALIZER(9), + SQLITE3_MUTEX_INITIALIZER(10), + SQLITE3_MUTEX_INITIALIZER(11), + SQLITE3_MUTEX_INITIALIZER(12), + SQLITE3_MUTEX_INITIALIZER(13) +}; + +static int winMutex_isInit = 0; +static int winMutex_isNt = -1; /* <0 means "need to query" */ + +/* As the winMutexInit() and winMutexEnd() functions are called as part +** of the sqlite3_initialize() and sqlite3_shutdown() processing, the +** "interlocked" magic used here is probably not strictly necessary. +*/ +static LONG SQLITE_WIN32_VOLATILE winMutex_lock = 0; + +SQLITE_API int sqlite3_win32_is_nt(void); /* os_win.c */ +SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds); /* os_win.c */ + +static int winMutexInit(void){ + /* The first to increment to 1 does actual initialization */ + if( InterlockedCompareExchange(&winMutex_lock, 1, 0)==0 ){ + int i; + for(i=0; i +**
  • SQLITE_MUTEX_FAST +**
  • SQLITE_MUTEX_RECURSIVE +**
  • SQLITE_MUTEX_STATIC_MASTER +**
  • SQLITE_MUTEX_STATIC_MEM +**
  • SQLITE_MUTEX_STATIC_OPEN +**
  • SQLITE_MUTEX_STATIC_PRNG +**
  • SQLITE_MUTEX_STATIC_LRU +**
  • SQLITE_MUTEX_STATIC_PMEM +**
  • SQLITE_MUTEX_STATIC_APP1 +**
  • SQLITE_MUTEX_STATIC_APP2 +**
  • SQLITE_MUTEX_STATIC_APP3 +**
  • SQLITE_MUTEX_STATIC_VFS1 +**
  • SQLITE_MUTEX_STATIC_VFS2 +**
  • SQLITE_MUTEX_STATIC_VFS3 +** +** +** The first two constants cause sqlite3_mutex_alloc() to create +** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. But SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** The other allowed parameters to sqlite3_mutex_alloc() each return +** a pointer to a static preexisting mutex. Six static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +*/ +static sqlite3_mutex *winMutexAlloc(int iType){ + sqlite3_mutex *p; + + switch( iType ){ + case SQLITE_MUTEX_FAST: + case SQLITE_MUTEX_RECURSIVE: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + p->id = iType; +#ifdef SQLITE_DEBUG +#ifdef SQLITE_WIN32_MUTEX_TRACE_DYNAMIC + p->trace = 1; +#endif +#endif +#if SQLITE_OS_WINRT + InitializeCriticalSectionEx(&p->mutex, 0, 0); +#else + InitializeCriticalSection(&p->mutex); +#endif + } + break; + } + default: { +#ifdef SQLITE_ENABLE_API_ARMOR + if( iType-2<0 || iType-2>=ArraySize(winMutex_staticMutexes) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + p = &winMutex_staticMutexes[iType-2]; +#ifdef SQLITE_DEBUG +#ifdef SQLITE_WIN32_MUTEX_TRACE_STATIC + InterlockedCompareExchange(&p->trace, 1, 0); +#endif +#endif + break; + } + } + assert( p==0 || p->id==iType ); + return p; +} + + +/* +** This routine deallocates a previously +** allocated mutex. SQLite is careful to deallocate every +** mutex that it allocates. +*/ +static void winMutexFree(sqlite3_mutex *p){ + assert( p ); + assert( p->nRef==0 && p->owner==0 ); + if( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ){ + DeleteCriticalSection(&p->mutex); + sqlite3_free(p); + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + (void)SQLITE_MISUSE_BKPT; +#endif + } +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +static void winMutexEnter(sqlite3_mutex *p){ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + DWORD tid = GetCurrentThreadId(); +#endif +#ifdef SQLITE_DEBUG + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld2(p, tid) ); +#else + assert( p ); +#endif + assert( winMutex_isInit==1 ); + EnterCriticalSection(&p->mutex); +#ifdef SQLITE_DEBUG + assert( p->nRef>0 || p->owner==0 ); + p->owner = tid; + p->nRef++; + if( p->trace ){ + OSTRACE(("ENTER-MUTEX tid=%lu, mutex(%d)=%p (%d), nRef=%d\n", + tid, p->id, p, p->trace, p->nRef)); + } +#endif +} + +static int winMutexTry(sqlite3_mutex *p){ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + DWORD tid = GetCurrentThreadId(); +#endif + int rc = SQLITE_BUSY; + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld2(p, tid) ); + /* + ** The sqlite3_mutex_try() routine is very rarely used, and when it + ** is used it is merely an optimization. So it is OK for it to always + ** fail. + ** + ** The TryEnterCriticalSection() interface is only available on WinNT. + ** And some windows compilers complain if you try to use it without + ** first doing some #defines that prevent SQLite from building on Win98. + ** For that reason, we will omit this optimization for now. See + ** ticket #2685. + */ +#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0400 + assert( winMutex_isInit==1 ); + assert( winMutex_isNt>=-1 && winMutex_isNt<=1 ); + if( winMutex_isNt<0 ){ + winMutex_isNt = sqlite3_win32_is_nt(); + } + assert( winMutex_isNt==0 || winMutex_isNt==1 ); + if( winMutex_isNt && TryEnterCriticalSection(&p->mutex) ){ +#ifdef SQLITE_DEBUG + p->owner = tid; + p->nRef++; +#endif + rc = SQLITE_OK; + } +#else + UNUSED_PARAMETER(p); +#endif +#ifdef SQLITE_DEBUG + if( p->trace ){ + OSTRACE(("TRY-MUTEX tid=%lu, mutex(%d)=%p (%d), owner=%lu, nRef=%d, rc=%s\n", + tid, p->id, p, p->trace, p->owner, p->nRef, sqlite3ErrName(rc))); + } +#endif + return rc; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +static void winMutexLeave(sqlite3_mutex *p){ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + DWORD tid = GetCurrentThreadId(); +#endif + assert( p ); +#ifdef SQLITE_DEBUG + assert( p->nRef>0 ); + assert( p->owner==tid ); + p->nRef--; + if( p->nRef==0 ) p->owner = 0; + assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); +#endif + assert( winMutex_isInit==1 ); + LeaveCriticalSection(&p->mutex); +#ifdef SQLITE_DEBUG + if( p->trace ){ + OSTRACE(("LEAVE-MUTEX tid=%lu, mutex(%d)=%p (%d), nRef=%d\n", + tid, p->id, p, p->trace, p->nRef)); + } +#endif +} + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ + static const sqlite3_mutex_methods sMutex = { + winMutexInit, + winMutexEnd, + winMutexAlloc, + winMutexFree, + winMutexEnter, + winMutexTry, + winMutexLeave, +#ifdef SQLITE_DEBUG + winMutexHeld, + winMutexNotheld +#else + 0, + 0 +#endif + }; + return &sMutex; +} + +#endif /* SQLITE_MUTEX_W32 */ + +/************** End of mutex_w32.c *******************************************/ +/************** Begin file malloc.c ******************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** +** Memory allocation functions used throughout sqlite. +*/ +/* #include "sqliteInt.h" */ +/* #include */ + +/* +** Attempt to release up to n bytes of non-essential memory currently +** held by SQLite. An example of non-essential memory is memory used to +** cache database pages that are not currently in use. +*/ +SQLITE_API int sqlite3_release_memory(int n){ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + return sqlite3PcacheReleaseMemory(n); +#else + /* IMPLEMENTATION-OF: R-34391-24921 The sqlite3_release_memory() routine + ** is a no-op returning zero if SQLite is not compiled with + ** SQLITE_ENABLE_MEMORY_MANAGEMENT. */ + UNUSED_PARAMETER(n); + return 0; +#endif +} + +/* +** Default value of the hard heap limit. 0 means "no limit". +*/ +#ifndef SQLITE_MAX_MEMORY +# define SQLITE_MAX_MEMORY 0 +#endif + +/* +** State information local to the memory allocation subsystem. +*/ +static SQLITE_WSD struct Mem0Global { + sqlite3_mutex *mutex; /* Mutex to serialize access */ + sqlite3_int64 alarmThreshold; /* The soft heap limit */ + sqlite3_int64 hardLimit; /* The hard upper bound on memory */ + + /* + ** True if heap is nearly "full" where "full" is defined by the + ** sqlite3_soft_heap_limit() setting. + */ + int nearlyFull; +} mem0 = { 0, SQLITE_MAX_MEMORY, SQLITE_MAX_MEMORY, 0 }; + +#define mem0 GLOBAL(struct Mem0Global, mem0) + +/* +** Return the memory allocator mutex. sqlite3_status() needs it. +*/ +SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void){ + return mem0.mutex; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Deprecated external interface. It used to set an alarm callback +** that was invoked when memory usage grew too large. Now it is a +** no-op. +*/ +SQLITE_API int sqlite3_memory_alarm( + void(*xCallback)(void *pArg, sqlite3_int64 used,int N), + void *pArg, + sqlite3_int64 iThreshold +){ + (void)xCallback; + (void)pArg; + (void)iThreshold; + return SQLITE_OK; +} +#endif + +/* +** Set the soft heap-size limit for the library. An argument of +** zero disables the limit. A negative argument is a no-op used to +** obtain the return value. +** +** The return value is the value of the heap limit just before this +** interface was called. +** +** If the hard heap limit is enabled, then the soft heap limit cannot +** be disabled nor raised above the hard heap limit. +*/ +SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){ + sqlite3_int64 priorLimit; + sqlite3_int64 excess; + sqlite3_int64 nUsed; +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return -1; +#endif + sqlite3_mutex_enter(mem0.mutex); + priorLimit = mem0.alarmThreshold; + if( n<0 ){ + sqlite3_mutex_leave(mem0.mutex); + return priorLimit; + } + if( mem0.hardLimit>0 && (n>mem0.hardLimit || n==0) ){ + n = mem0.hardLimit; + } + mem0.alarmThreshold = n; + nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + AtomicStore(&mem0.nearlyFull, n>0 && n<=nUsed); + sqlite3_mutex_leave(mem0.mutex); + excess = sqlite3_memory_used() - n; + if( excess>0 ) sqlite3_release_memory((int)(excess & 0x7fffffff)); + return priorLimit; +} +SQLITE_API void sqlite3_soft_heap_limit(int n){ + if( n<0 ) n = 0; + sqlite3_soft_heap_limit64(n); +} + +/* +** Set the hard heap-size limit for the library. An argument of zero +** disables the hard heap limit. A negative argument is a no-op used +** to obtain the return value without affecting the hard heap limit. +** +** The return value is the value of the hard heap limit just prior to +** calling this interface. +** +** Setting the hard heap limit will also activate the soft heap limit +** and constrain the soft heap limit to be no more than the hard heap +** limit. +*/ +SQLITE_API sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 n){ + sqlite3_int64 priorLimit; +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return -1; +#endif + sqlite3_mutex_enter(mem0.mutex); + priorLimit = mem0.hardLimit; + if( n>=0 ){ + mem0.hardLimit = n; + if( n0 ); + + /* In Firefox (circa 2017-02-08), xRoundup() is remapped to an internal + ** implementation of malloc_good_size(), which must be called in debug + ** mode and specifically when the DMD "Dark Matter Detector" is enabled + ** or else a crash results. Hence, do not attempt to optimize out the + ** following xRoundup() call. */ + nFull = sqlite3GlobalConfig.m.xRoundup(n); + + sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, n); + if( mem0.alarmThreshold>0 ){ + sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + if( nUsed >= mem0.alarmThreshold - nFull ){ + AtomicStore(&mem0.nearlyFull, 1); + sqlite3MallocAlarm(nFull); + if( mem0.hardLimit ){ + nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + if( nUsed >= mem0.hardLimit - nFull ){ + *pp = 0; + return; + } + } + }else{ + AtomicStore(&mem0.nearlyFull, 0); + } + } + p = sqlite3GlobalConfig.m.xMalloc(nFull); +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + if( p==0 && mem0.alarmThreshold>0 ){ + sqlite3MallocAlarm(nFull); + p = sqlite3GlobalConfig.m.xMalloc(nFull); + } +#endif + if( p ){ + nFull = sqlite3MallocSize(p); + sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nFull); + sqlite3StatusUp(SQLITE_STATUS_MALLOC_COUNT, 1); + } + *pp = p; +} + +/* +** Allocate memory. This routine is like sqlite3_malloc() except that it +** assumes the memory subsystem has already been initialized. +*/ +SQLITE_PRIVATE void *sqlite3Malloc(u64 n){ + void *p; + if( n==0 || n>=0x7fffff00 ){ + /* A memory allocation of a number of bytes which is near the maximum + ** signed integer value might cause an integer overflow inside of the + ** xMalloc(). Hence we limit the maximum size to 0x7fffff00, giving + ** 255 bytes of overhead. SQLite itself will never use anything near + ** this amount. The only way to reach the limit is with sqlite3_malloc() */ + p = 0; + }else if( sqlite3GlobalConfig.bMemstat ){ + sqlite3_mutex_enter(mem0.mutex); + mallocWithAlarm((int)n, &p); + sqlite3_mutex_leave(mem0.mutex); + }else{ + p = sqlite3GlobalConfig.m.xMalloc((int)n); + } + assert( EIGHT_BYTE_ALIGNMENT(p) ); /* IMP: R-11148-40995 */ + return p; +} + +/* +** This version of the memory allocation is for use by the application. +** First make sure the memory subsystem is initialized, then do the +** allocation. +*/ +SQLITE_API void *sqlite3_malloc(int n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return n<=0 ? 0 : sqlite3Malloc(n); +} +SQLITE_API void *sqlite3_malloc64(sqlite3_uint64 n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return sqlite3Malloc(n); +} + +/* +** TRUE if p is a lookaside memory allocation from db +*/ +#ifndef SQLITE_OMIT_LOOKASIDE +static int isLookaside(sqlite3 *db, void *p){ + return SQLITE_WITHIN(p, db->lookaside.pStart, db->lookaside.pEnd); +} +#else +#define isLookaside(A,B) 0 +#endif + +/* +** Return the size of a memory allocation previously obtained from +** sqlite3Malloc() or sqlite3_malloc(). +*/ +SQLITE_PRIVATE int sqlite3MallocSize(void *p){ + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + return sqlite3GlobalConfig.m.xSize(p); +} +static int lookasideMallocSize(sqlite3 *db, void *p){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + return plookaside.pMiddle ? db->lookaside.szTrue : LOOKASIDE_SMALL; +#else + return db->lookaside.szTrue; +#endif +} +SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){ + assert( p!=0 ); +#ifdef SQLITE_DEBUG + if( db==0 || !isLookaside(db,p) ){ + if( db==0 ){ + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + }else{ + assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + } + } +#endif + if( db ){ + if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ + assert( sqlite3_mutex_held(db->mutex) ); + return LOOKASIDE_SMALL; + } +#endif + if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){ + assert( sqlite3_mutex_held(db->mutex) ); + return db->lookaside.szTrue; + } + } + } + return sqlite3GlobalConfig.m.xSize(p); +} +SQLITE_API sqlite3_uint64 sqlite3_msize(void *p){ + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + return p ? sqlite3GlobalConfig.m.xSize(p) : 0; +} + +/* +** Free memory previously obtained from sqlite3Malloc(). +*/ +SQLITE_API void sqlite3_free(void *p){ + if( p==0 ) return; /* IMP: R-49053-54554 */ + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); + if( sqlite3GlobalConfig.bMemstat ){ + sqlite3_mutex_enter(mem0.mutex); + sqlite3StatusDown(SQLITE_STATUS_MEMORY_USED, sqlite3MallocSize(p)); + sqlite3StatusDown(SQLITE_STATUS_MALLOC_COUNT, 1); + sqlite3GlobalConfig.m.xFree(p); + sqlite3_mutex_leave(mem0.mutex); + }else{ + sqlite3GlobalConfig.m.xFree(p); + } +} + +/* +** Add the size of memory allocation "p" to the count in +** *db->pnBytesFreed. +*/ +static SQLITE_NOINLINE void measureAllocationSize(sqlite3 *db, void *p){ + *db->pnBytesFreed += sqlite3DbMallocSize(db,p); +} + +/* +** Free memory that might be associated with a particular database +** connection. Calling sqlite3DbFree(D,X) for X==0 is a harmless no-op. +** The sqlite3DbFreeNN(D,X) version requires that X be non-NULL. +*/ +SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3 *db, void *p){ + assert( db==0 || sqlite3_mutex_held(db->mutex) ); + assert( p!=0 ); + if( db ){ + if( db->pnBytesFreed ){ + measureAllocationSize(db, p); + return; + } + if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ + LookasideSlot *pBuf = (LookasideSlot*)p; +#ifdef SQLITE_DEBUG + memset(p, 0xaa, LOOKASIDE_SMALL); /* Trash freed content */ +#endif + pBuf->pNext = db->lookaside.pSmallFree; + db->lookaside.pSmallFree = pBuf; + return; + } +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){ + LookasideSlot *pBuf = (LookasideSlot*)p; +#ifdef SQLITE_DEBUG + memset(p, 0xaa, db->lookaside.szTrue); /* Trash freed content */ +#endif + pBuf->pNext = db->lookaside.pFree; + db->lookaside.pFree = pBuf; + return; + } + } + } + assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) ); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + sqlite3_free(p); +} +SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){ + assert( db==0 || sqlite3_mutex_held(db->mutex) ); + if( p ) sqlite3DbFreeNN(db, p); +} + +/* +** Change the size of an existing memory allocation +*/ +SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, u64 nBytes){ + int nOld, nNew, nDiff; + void *pNew; + assert( sqlite3MemdebugHasType(pOld, MEMTYPE_HEAP) ); + assert( sqlite3MemdebugNoType(pOld, (u8)~MEMTYPE_HEAP) ); + if( pOld==0 ){ + return sqlite3Malloc(nBytes); /* IMP: R-04300-56712 */ + } + if( nBytes==0 ){ + sqlite3_free(pOld); /* IMP: R-26507-47431 */ + return 0; + } + if( nBytes>=0x7fffff00 ){ + /* The 0x7ffff00 limit term is explained in comments on sqlite3Malloc() */ + return 0; + } + nOld = sqlite3MallocSize(pOld); + /* IMPLEMENTATION-OF: R-46199-30249 SQLite guarantees that the second + ** argument to xRealloc is always a value returned by a prior call to + ** xRoundup. */ + nNew = sqlite3GlobalConfig.m.xRoundup((int)nBytes); + if( nOld==nNew ){ + pNew = pOld; + }else if( sqlite3GlobalConfig.bMemstat ){ + sqlite3_mutex_enter(mem0.mutex); + sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); + nDiff = nNew - nOld; + if( nDiff>0 && sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= + mem0.alarmThreshold-nDiff ){ + sqlite3MallocAlarm(nDiff); + } + pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + if( pNew==0 && mem0.alarmThreshold>0 ){ + sqlite3MallocAlarm((int)nBytes); + pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); + } +#endif + if( pNew ){ + nNew = sqlite3MallocSize(pNew); + sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nNew-nOld); + } + sqlite3_mutex_leave(mem0.mutex); + }else{ + pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); + } + assert( EIGHT_BYTE_ALIGNMENT(pNew) ); /* IMP: R-11148-40995 */ + return pNew; +} + +/* +** The public interface to sqlite3Realloc. Make sure that the memory +** subsystem is initialized prior to invoking sqliteRealloc. +*/ +SQLITE_API void *sqlite3_realloc(void *pOld, int n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + if( n<0 ) n = 0; /* IMP: R-26507-47431 */ + return sqlite3Realloc(pOld, n); +} +SQLITE_API void *sqlite3_realloc64(void *pOld, sqlite3_uint64 n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return sqlite3Realloc(pOld, n); +} + + +/* +** Allocate and zero memory. +*/ +SQLITE_PRIVATE void *sqlite3MallocZero(u64 n){ + void *p = sqlite3Malloc(n); + if( p ){ + memset(p, 0, (size_t)n); + } + return p; +} + +/* +** Allocate and zero memory. If the allocation fails, make +** the mallocFailed flag in the connection pointer. +*/ +SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3 *db, u64 n){ + void *p; + testcase( db==0 ); + p = sqlite3DbMallocRaw(db, n); + if( p ) memset(p, 0, (size_t)n); + return p; +} + + +/* Finish the work of sqlite3DbMallocRawNN for the unusual and +** slower case when the allocation cannot be fulfilled using lookaside. +*/ +static SQLITE_NOINLINE void *dbMallocRawFinish(sqlite3 *db, u64 n){ + void *p; + assert( db!=0 ); + p = sqlite3Malloc(n); + if( !p ) sqlite3OomFault(db); + sqlite3MemdebugSetType(p, + (db->lookaside.bDisable==0) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP); + return p; +} + +/* +** Allocate memory, either lookaside (if possible) or heap. +** If the allocation fails, set the mallocFailed flag in +** the connection pointer. +** +** If db!=0 and db->mallocFailed is true (indicating a prior malloc +** failure on the same database connection) then always return 0. +** Hence for a particular database connection, once malloc starts +** failing, it fails consistently until mallocFailed is reset. +** This is an important assumption. There are many places in the +** code that do things like this: +** +** int *a = (int*)sqlite3DbMallocRaw(db, 100); +** int *b = (int*)sqlite3DbMallocRaw(db, 200); +** if( b ) a[10] = 9; +** +** In other words, if a subsequent malloc (ex: "b") worked, it is assumed +** that all prior mallocs (ex: "a") worked too. +** +** The sqlite3MallocRawNN() variant guarantees that the "db" parameter is +** not a NULL pointer. +*/ +SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3 *db, u64 n){ + void *p; + if( db ) return sqlite3DbMallocRawNN(db, n); + p = sqlite3Malloc(n); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + return p; +} +SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ +#ifndef SQLITE_OMIT_LOOKASIDE + LookasideSlot *pBuf; + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( db->pnBytesFreed==0 ); + if( n>db->lookaside.sz ){ + if( !db->lookaside.bDisable ){ + db->lookaside.anStat[1]++; + }else if( db->mallocFailed ){ + return 0; + } + return dbMallocRawFinish(db, n); + } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( n<=LOOKASIDE_SMALL ){ + if( (pBuf = db->lookaside.pSmallFree)!=0 ){ + db->lookaside.pSmallFree = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else if( (pBuf = db->lookaside.pSmallInit)!=0 ){ + db->lookaside.pSmallInit = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + } + } +#endif + if( (pBuf = db->lookaside.pFree)!=0 ){ + db->lookaside.pFree = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else if( (pBuf = db->lookaside.pInit)!=0 ){ + db->lookaside.pInit = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else{ + db->lookaside.anStat[2]++; + } +#else + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( db->pnBytesFreed==0 ); + if( db->mallocFailed ){ + return 0; + } +#endif + return dbMallocRawFinish(db, n); +} + +/* Forward declaration */ +static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n); + +/* +** Resize the block of memory pointed to by p to n bytes. If the +** resize fails, set the mallocFailed flag in the connection object. +*/ +SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *db, void *p, u64 n){ + assert( db!=0 ); + if( p==0 ) return sqlite3DbMallocRawNN(db, n); + assert( sqlite3_mutex_held(db->mutex) ); + if( ((uptr)p)<(uptr)db->lookaside.pEnd ){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( ((uptr)p)>=(uptr)db->lookaside.pMiddle ){ + if( n<=LOOKASIDE_SMALL ) return p; + }else +#endif + if( ((uptr)p)>=(uptr)db->lookaside.pStart ){ + if( n<=db->lookaside.szTrue ) return p; + } + } + return dbReallocFinish(db, p, n); +} +static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ + void *pNew = 0; + assert( db!=0 ); + assert( p!=0 ); + if( db->mallocFailed==0 ){ + if( isLookaside(db, p) ){ + pNew = sqlite3DbMallocRawNN(db, n); + if( pNew ){ + memcpy(pNew, p, lookasideMallocSize(db, p)); + sqlite3DbFree(db, p); + } + }else{ + assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + pNew = sqlite3Realloc(p, n); + if( !pNew ){ + sqlite3OomFault(db); + } + sqlite3MemdebugSetType(pNew, + (db->lookaside.bDisable==0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP)); + } + } + return pNew; +} + +/* +** Attempt to reallocate p. If the reallocation fails, then free p +** and set the mallocFailed flag in the database connection. +*/ +SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, u64 n){ + void *pNew; + pNew = sqlite3DbRealloc(db, p, n); + if( !pNew ){ + sqlite3DbFree(db, p); + } + return pNew; +} + +/* +** Make a copy of a string in memory obtained from sqliteMalloc(). These +** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This +** is because when memory debugging is turned on, these two functions are +** called via macros that record the current file and line number in the +** ThreadData structure. +*/ +SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3 *db, const char *z){ + char *zNew; + size_t n; + if( z==0 ){ + return 0; + } + n = strlen(z) + 1; + zNew = sqlite3DbMallocRaw(db, n); + if( zNew ){ + memcpy(zNew, z, n); + } + return zNew; +} +SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, u64 n){ + char *zNew; + assert( db!=0 ); + if( z==0 ){ + return 0; + } + assert( (n&0x7fffffff)==n ); + zNew = sqlite3DbMallocRawNN(db, n+1); + if( zNew ){ + memcpy(zNew, z, (size_t)n); + zNew[n] = 0; + } + return zNew; +} + +/* +** The text between zStart and zEnd represents a phrase within a larger +** SQL statement. Make a copy of this phrase in space obtained form +** sqlite3DbMalloc(). Omit leading and trailing whitespace. +*/ +SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){ + int n; + while( sqlite3Isspace(zStart[0]) ) zStart++; + n = (int)(zEnd - zStart); + while( ALWAYS(n>0) && sqlite3Isspace(zStart[n-1]) ) n--; + return sqlite3DbStrNDup(db, zStart, n); +} + +/* +** Free any prior content in *pz and replace it with a copy of zNew. +*/ +SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){ + sqlite3DbFree(db, *pz); + *pz = sqlite3DbStrDup(db, zNew); +} + +/* +** Call this routine to record the fact that an OOM (out-of-memory) error +** has happened. This routine will set db->mallocFailed, and also +** temporarily disable the lookaside memory allocator and interrupt +** any running VDBEs. +*/ +SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){ + if( db->mallocFailed==0 && db->bBenignMalloc==0 ){ + db->mallocFailed = 1; + if( db->nVdbeExec>0 ){ + AtomicStore(&db->u1.isInterrupted, 1); + } + DisableLookaside; + if( db->pParse ){ + db->pParse->rc = SQLITE_NOMEM_BKPT; + } + } +} + +/* +** This routine reactivates the memory allocator and clears the +** db->mallocFailed flag as necessary. +** +** The memory allocator is not restarted if there are running +** VDBEs. +*/ +SQLITE_PRIVATE void sqlite3OomClear(sqlite3 *db){ + if( db->mallocFailed && db->nVdbeExec==0 ){ + db->mallocFailed = 0; + AtomicStore(&db->u1.isInterrupted, 0); + assert( db->lookaside.bDisable>0 ); + EnableLookaside; + } +} + +/* +** Take actions at the end of an API call to indicate an OOM error +*/ +static SQLITE_NOINLINE int apiOomError(sqlite3 *db){ + sqlite3OomClear(db); + sqlite3Error(db, SQLITE_NOMEM); + return SQLITE_NOMEM_BKPT; +} + +/* +** This function must be called before exiting any API function (i.e. +** returning control to the user) that has called sqlite3_malloc or +** sqlite3_realloc. +** +** The returned value is normally a copy of the second argument to this +** function. However, if a malloc() failure has occurred since the previous +** invocation SQLITE_NOMEM is returned instead. +** +** If an OOM as occurred, then the connection error-code (the value +** returned by sqlite3_errcode()) is set to SQLITE_NOMEM. +*/ +SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){ + /* If the db handle must hold the connection handle mutex here. + ** Otherwise the read (and possible write) of db->mallocFailed + ** is unsafe, as is the call to sqlite3Error(). + */ + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + if( db->mallocFailed || rc==SQLITE_IOERR_NOMEM ){ + return apiOomError(db); + } + return rc & db->errMask; +} + +/************** End of malloc.c **********************************************/ +/************** Begin file printf.c ******************************************/ +/* +** The "printf" code that follows dates from the 1980's. It is in +** the public domain. +** +************************************************************************** +** +** This file contains code for a set of "printf"-like routines. These +** routines format strings much like the printf() from the standard C +** library, though the implementation here has enhancements to support +** SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* +** Conversion types fall into various categories as defined by the +** following enumeration. +*/ +#define etRADIX 0 /* non-decimal integer types. %x %o */ +#define etFLOAT 1 /* Floating point. %f */ +#define etEXP 2 /* Exponentional notation. %e and %E */ +#define etGENERIC 3 /* Floating or exponential, depending on exponent. %g */ +#define etSIZE 4 /* Return number of characters processed so far. %n */ +#define etSTRING 5 /* Strings. %s */ +#define etDYNSTRING 6 /* Dynamically allocated strings. %z */ +#define etPERCENT 7 /* Percent symbol. %% */ +#define etCHARX 8 /* Characters. %c */ +/* The rest are extensions, not normally found in printf() */ +#define etSQLESCAPE 9 /* Strings with '\'' doubled. %q */ +#define etSQLESCAPE2 10 /* Strings with '\'' doubled and enclosed in '', + NULL pointers replaced by SQL NULL. %Q */ +#define etTOKEN 11 /* a pointer to a Token structure */ +#define etSRCLIST 12 /* a pointer to a SrcList */ +#define etPOINTER 13 /* The %p conversion */ +#define etSQLESCAPE3 14 /* %w -> Strings with '\"' doubled */ +#define etORDINAL 15 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */ +#define etDECIMAL 16 /* %d or %u, but not %x, %o */ + +#define etINVALID 17 /* Any unrecognized conversion type */ + + +/* +** An "etByte" is an 8-bit unsigned value. +*/ +typedef unsigned char etByte; + +/* +** Each builtin conversion character (ex: the 'd' in "%d") is described +** by an instance of the following structure +*/ +typedef struct et_info { /* Information about each format field */ + char fmttype; /* The format field code letter */ + etByte base; /* The base for radix conversion */ + etByte flags; /* One or more of FLAG_ constants below */ + etByte type; /* Conversion paradigm */ + etByte charset; /* Offset into aDigits[] of the digits string */ + etByte prefix; /* Offset into aPrefix[] of the prefix string */ +} et_info; + +/* +** Allowed values for et_info.flags +*/ +#define FLAG_SIGNED 1 /* True if the value to convert is signed */ +#define FLAG_STRING 4 /* Allow infinite precision */ + + +/* +** The following table is searched linearly, so it is good to put the +** most frequently used conversion types first. +*/ +static const char aDigits[] = "0123456789ABCDEF0123456789abcdef"; +static const char aPrefix[] = "-x0\000X0"; +static const et_info fmtinfo[] = { + { 'd', 10, 1, etDECIMAL, 0, 0 }, + { 's', 0, 4, etSTRING, 0, 0 }, + { 'g', 0, 1, etGENERIC, 30, 0 }, + { 'z', 0, 4, etDYNSTRING, 0, 0 }, + { 'q', 0, 4, etSQLESCAPE, 0, 0 }, + { 'Q', 0, 4, etSQLESCAPE2, 0, 0 }, + { 'w', 0, 4, etSQLESCAPE3, 0, 0 }, + { 'c', 0, 0, etCHARX, 0, 0 }, + { 'o', 8, 0, etRADIX, 0, 2 }, + { 'u', 10, 0, etDECIMAL, 0, 0 }, + { 'x', 16, 0, etRADIX, 16, 1 }, + { 'X', 16, 0, etRADIX, 0, 4 }, +#ifndef SQLITE_OMIT_FLOATING_POINT + { 'f', 0, 1, etFLOAT, 0, 0 }, + { 'e', 0, 1, etEXP, 30, 0 }, + { 'E', 0, 1, etEXP, 14, 0 }, + { 'G', 0, 1, etGENERIC, 14, 0 }, +#endif + { 'i', 10, 1, etDECIMAL, 0, 0 }, + { 'n', 0, 0, etSIZE, 0, 0 }, + { '%', 0, 0, etPERCENT, 0, 0 }, + { 'p', 16, 0, etPOINTER, 0, 1 }, + + /* All the rest are undocumented and are for internal use only */ + { 'T', 0, 0, etTOKEN, 0, 0 }, + { 'S', 0, 0, etSRCLIST, 0, 0 }, + { 'r', 10, 1, etORDINAL, 0, 0 }, +}; + +/* Floating point constants used for rounding */ +static const double arRound[] = { + 5.0e-01, 5.0e-02, 5.0e-03, 5.0e-04, 5.0e-05, + 5.0e-06, 5.0e-07, 5.0e-08, 5.0e-09, 5.0e-10, +}; + +/* +** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point +** conversions will work. +*/ +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** "*val" is a double such that 0.1 <= *val < 10.0 +** Return the ascii code for the leading digit of *val, then +** multiply "*val" by 10.0 to renormalize. +** +** Example: +** input: *val = 3.14159 +** output: *val = 1.4159 function return = '3' +** +** The counter *cnt is incremented each time. After counter exceeds +** 16 (the number of significant digits in a 64-bit float) '0' is +** always returned. +*/ +static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ + int digit; + LONGDOUBLE_TYPE d; + if( (*cnt)<=0 ) return '0'; + (*cnt)--; + digit = (int)*val; + d = digit; + digit += '0'; + *val = (*val - d)*10.0; + return (char)digit; +} +#endif /* SQLITE_OMIT_FLOATING_POINT */ + +/* +** Set the StrAccum object to an error mode. +*/ +static void setStrAccumError(StrAccum *p, u8 eError){ + assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG ); + p->accError = eError; + if( p->mxAlloc ) sqlite3_str_reset(p); + if( eError==SQLITE_TOOBIG ) sqlite3ErrorToParser(p->db, eError); +} + +/* +** Extra argument values from a PrintfArguments object +*/ +static sqlite3_int64 getIntArg(PrintfArguments *p){ + if( p->nArg<=p->nUsed ) return 0; + return sqlite3_value_int64(p->apArg[p->nUsed++]); +} +static double getDoubleArg(PrintfArguments *p){ + if( p->nArg<=p->nUsed ) return 0.0; + return sqlite3_value_double(p->apArg[p->nUsed++]); +} +static char *getTextArg(PrintfArguments *p){ + if( p->nArg<=p->nUsed ) return 0; + return (char*)sqlite3_value_text(p->apArg[p->nUsed++]); +} + +/* +** Allocate memory for a temporary buffer needed for printf rendering. +** +** If the requested size of the temp buffer is larger than the size +** of the output buffer in pAccum, then cause an SQLITE_TOOBIG error. +** Do the size check before the memory allocation to prevent rogue +** SQL from requesting large allocations using the precision or width +** field of the printf() function. +*/ +static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ + char *z; + if( pAccum->accError ) return 0; + if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){ + setStrAccumError(pAccum, SQLITE_TOOBIG); + return 0; + } + z = sqlite3DbMallocRaw(pAccum->db, n); + if( z==0 ){ + setStrAccumError(pAccum, SQLITE_NOMEM); + } + return z; +} + +/* +** On machines with a small stack size, you can redefine the +** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired. +*/ +#ifndef SQLITE_PRINT_BUF_SIZE +# define SQLITE_PRINT_BUF_SIZE 70 +#endif +#define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */ + +/* +** Hard limit on the precision of floating-point conversions. +*/ +#ifndef SQLITE_PRINTF_PRECISION_LIMIT +# define SQLITE_FP_PRECISION_LIMIT 100000000 +#endif + +/* +** Render a string given by "fmt" into the StrAccum object. +*/ +SQLITE_API void sqlite3_str_vappendf( + sqlite3_str *pAccum, /* Accumulate results here */ + const char *fmt, /* Format string */ + va_list ap /* arguments */ +){ + int c; /* Next character in the format string */ + char *bufpt; /* Pointer to the conversion buffer */ + int precision; /* Precision of the current field */ + int length; /* Length of the field */ + int idx; /* A general purpose loop counter */ + int width; /* Width of the current field */ + etByte flag_leftjustify; /* True if "-" flag is present */ + etByte flag_prefix; /* '+' or ' ' or 0 for prefix */ + etByte flag_alternateform; /* True if "#" flag is present */ + etByte flag_altform2; /* True if "!" flag is present */ + etByte flag_zeropad; /* True if field width constant starts with zero */ + etByte flag_long; /* 1 for the "l" flag, 2 for "ll", 0 by default */ + etByte done; /* Loop termination flag */ + etByte cThousand; /* Thousands separator for %d and %u */ + etByte xtype = etINVALID; /* Conversion paradigm */ + u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */ + char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ + sqlite_uint64 longvalue; /* Value for integer types */ + LONGDOUBLE_TYPE realvalue; /* Value for real types */ + const et_info *infop; /* Pointer to the appropriate info structure */ + char *zOut; /* Rendering buffer */ + int nOut; /* Size of the rendering buffer */ + char *zExtra = 0; /* Malloced memory used by some conversion */ +#ifndef SQLITE_OMIT_FLOATING_POINT + int exp, e2; /* exponent of real numbers */ + int nsd; /* Number of significant digits returned */ + double rounder; /* Used for rounding floating point values */ + etByte flag_dp; /* True if decimal point should be shown */ + etByte flag_rtz; /* True if trailing zeros should be removed */ +#endif + PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */ + char buf[etBUFSIZE]; /* Conversion buffer */ + + /* pAccum never starts out with an empty buffer that was obtained from + ** malloc(). This precondition is required by the mprintf("%z...") + ** optimization. */ + assert( pAccum->nChar>0 || (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 ); + + bufpt = 0; + if( (pAccum->printfFlags & SQLITE_PRINTF_SQLFUNC)!=0 ){ + pArgList = va_arg(ap, PrintfArguments*); + bArgList = 1; + }else{ + bArgList = 0; + } + for(; (c=(*fmt))!=0; ++fmt){ + if( c!='%' ){ + bufpt = (char *)fmt; +#if HAVE_STRCHRNUL + fmt = strchrnul(fmt, '%'); +#else + do{ fmt++; }while( *fmt && *fmt != '%' ); +#endif + sqlite3_str_append(pAccum, bufpt, (int)(fmt - bufpt)); + if( *fmt==0 ) break; + } + if( (c=(*++fmt))==0 ){ + sqlite3_str_append(pAccum, "%", 1); + break; + } + /* Find out what flags are present */ + flag_leftjustify = flag_prefix = cThousand = + flag_alternateform = flag_altform2 = flag_zeropad = 0; + done = 0; + width = 0; + flag_long = 0; + precision = -1; + do{ + switch( c ){ + case '-': flag_leftjustify = 1; break; + case '+': flag_prefix = '+'; break; + case ' ': flag_prefix = ' '; break; + case '#': flag_alternateform = 1; break; + case '!': flag_altform2 = 1; break; + case '0': flag_zeropad = 1; break; + case ',': cThousand = ','; break; + default: done = 1; break; + case 'l': { + flag_long = 1; + c = *++fmt; + if( c=='l' ){ + c = *++fmt; + flag_long = 2; + } + done = 1; + break; + } + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': { + unsigned wx = c - '0'; + while( (c = *++fmt)>='0' && c<='9' ){ + wx = wx*10 + c - '0'; + } + testcase( wx>0x7fffffff ); + width = wx & 0x7fffffff; +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( c!='.' && c!='l' ){ + done = 1; + }else{ + fmt--; + } + break; + } + case '*': { + if( bArgList ){ + width = (int)getIntArg(pArgList); + }else{ + width = va_arg(ap,int); + } + if( width<0 ){ + flag_leftjustify = 1; + width = width >= -2147483647 ? -width : 0; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( (c = fmt[1])!='.' && c!='l' ){ + c = *++fmt; + done = 1; + } + break; + } + case '.': { + c = *++fmt; + if( c=='*' ){ + if( bArgList ){ + precision = (int)getIntArg(pArgList); + }else{ + precision = va_arg(ap,int); + } + if( precision<0 ){ + precision = precision >= -2147483647 ? -precision : -1; + } + c = *++fmt; + }else{ + unsigned px = 0; + while( c>='0' && c<='9' ){ + px = px*10 + c - '0'; + c = *++fmt; + } + testcase( px>0x7fffffff ); + precision = px & 0x7fffffff; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ + precision = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( c=='l' ){ + --fmt; + }else{ + done = 1; + } + break; + } + } + }while( !done && (c=(*++fmt))!=0 ); + + /* Fetch the info entry for the field */ + infop = &fmtinfo[0]; + xtype = etINVALID; + for(idx=0; idxtype; + break; + } + } + + /* + ** At this point, variables are initialized as follows: + ** + ** flag_alternateform TRUE if a '#' is present. + ** flag_altform2 TRUE if a '!' is present. + ** flag_prefix '+' or ' ' or zero + ** flag_leftjustify TRUE if a '-' is present or if the + ** field width was negative. + ** flag_zeropad TRUE if the width began with 0. + ** flag_long 1 for "l", 2 for "ll" + ** width The specified field width. This is + ** always non-negative. Zero is the default. + ** precision The specified precision. The default + ** is -1. + ** xtype The class of the conversion. + ** infop Pointer to the appropriate info struct. + */ + assert( width>=0 ); + assert( precision>=(-1) ); + switch( xtype ){ + case etPOINTER: + flag_long = sizeof(char*)==sizeof(i64) ? 2 : + sizeof(char*)==sizeof(long int) ? 1 : 0; + /* Fall through into the next case */ + case etORDINAL: + case etRADIX: + cThousand = 0; + /* Fall through into the next case */ + case etDECIMAL: + if( infop->flags & FLAG_SIGNED ){ + i64 v; + if( bArgList ){ + v = getIntArg(pArgList); + }else if( flag_long ){ + if( flag_long==2 ){ + v = va_arg(ap,i64) ; + }else{ + v = va_arg(ap,long int); + } + }else{ + v = va_arg(ap,int); + } + if( v<0 ){ + if( v==SMALLEST_INT64 ){ + longvalue = ((u64)1)<<63; + }else{ + longvalue = -v; + } + prefix = '-'; + }else{ + longvalue = v; + prefix = flag_prefix; + } + }else{ + if( bArgList ){ + longvalue = (u64)getIntArg(pArgList); + }else if( flag_long ){ + if( flag_long==2 ){ + longvalue = va_arg(ap,u64); + }else{ + longvalue = va_arg(ap,unsigned long int); + } + }else{ + longvalue = va_arg(ap,unsigned int); + } + prefix = 0; + } + if( longvalue==0 ) flag_alternateform = 0; + if( flag_zeropad && precision=4 || (longvalue/10)%10==1 ){ + x = 0; + } + *(--bufpt) = zOrd[x*2+1]; + *(--bufpt) = zOrd[x*2]; + } + { + const char *cset = &aDigits[infop->charset]; + u8 base = infop->base; + do{ /* Convert to ascii */ + *(--bufpt) = cset[longvalue%base]; + longvalue = longvalue/base; + }while( longvalue>0 ); + } + length = (int)(&zOut[nOut-1]-bufpt); + while( precision>length ){ + *(--bufpt) = '0'; /* Zero pad */ + length++; + } + if( cThousand ){ + int nn = (length - 1)/3; /* Number of "," to insert */ + int ix = (length - 1)%3 + 1; + bufpt -= nn; + for(idx=0; nn>0; idx++){ + bufpt[idx] = bufpt[idx+nn]; + ix--; + if( ix==0 ){ + bufpt[++idx] = cThousand; + nn--; + ix = 3; + } + } + } + if( prefix ) *(--bufpt) = prefix; /* Add sign */ + if( flag_alternateform && infop->prefix ){ /* Add "0" or "0x" */ + const char *pre; + char x; + pre = &aPrefix[infop->prefix]; + for(; (x=(*pre))!=0; pre++) *(--bufpt) = x; + } + length = (int)(&zOut[nOut-1]-bufpt); + break; + case etFLOAT: + case etEXP: + case etGENERIC: + if( bArgList ){ + realvalue = getDoubleArg(pArgList); + }else{ + realvalue = va_arg(ap,double); + } +#ifdef SQLITE_OMIT_FLOATING_POINT + length = 0; +#else + if( precision<0 ) precision = 6; /* Set default precision */ +#ifdef SQLITE_FP_PRECISION_LIMIT + if( precision>SQLITE_FP_PRECISION_LIMIT ){ + precision = SQLITE_FP_PRECISION_LIMIT; + } +#endif + if( realvalue<0.0 ){ + realvalue = -realvalue; + prefix = '-'; + }else{ + prefix = flag_prefix; + } + if( xtype==etGENERIC && precision>0 ) precision--; + testcase( precision>0xfff ); + idx = precision & 0xfff; + rounder = arRound[idx%10]; + while( idx>=10 ){ rounder *= 1.0e-10; idx -= 10; } + if( xtype==etFLOAT ){ + double rx = (double)realvalue; + sqlite3_uint64 u; + int ex; + memcpy(&u, &rx, sizeof(u)); + ex = -1023 + (int)((u>>52)&0x7ff); + if( precision+(ex/3) < 15 ) rounder += realvalue*3e-16; + realvalue += rounder; + } + /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ + exp = 0; + if( sqlite3IsNaN((double)realvalue) ){ + bufpt = "NaN"; + length = 3; + break; + } + if( realvalue>0.0 ){ + LONGDOUBLE_TYPE scale = 1.0; + while( realvalue>=1e100*scale && exp<=350 ){ scale *= 1e100;exp+=100;} + while( realvalue>=1e10*scale && exp<=350 ){ scale *= 1e10; exp+=10; } + while( realvalue>=10.0*scale && exp<=350 ){ scale *= 10.0; exp++; } + realvalue /= scale; + while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; } + while( realvalue<1.0 ){ realvalue *= 10.0; exp--; } + if( exp>350 ){ + bufpt = buf; + buf[0] = prefix; + memcpy(buf+(prefix!=0),"Inf",4); + length = 3+(prefix!=0); + break; + } + } + bufpt = buf; + /* + ** If the field type is etGENERIC, then convert to either etEXP + ** or etFLOAT, as appropriate. + */ + if( xtype!=etFLOAT ){ + realvalue += rounder; + if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; } + } + if( xtype==etGENERIC ){ + flag_rtz = !flag_alternateform; + if( exp<-4 || exp>precision ){ + xtype = etEXP; + }else{ + precision = precision - exp; + xtype = etFLOAT; + } + }else{ + flag_rtz = flag_altform2; + } + if( xtype==etEXP ){ + e2 = 0; + }else{ + e2 = exp; + } + { + i64 szBufNeeded; /* Size of a temporary buffer needed */ + szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+15; + if( szBufNeeded > etBUFSIZE ){ + bufpt = zExtra = printfTempBuf(pAccum, szBufNeeded); + if( bufpt==0 ) return; + } + } + zOut = bufpt; + nsd = 16 + flag_altform2*10; + flag_dp = (precision>0 ?1:0) | flag_alternateform | flag_altform2; + /* The sign in front of the number */ + if( prefix ){ + *(bufpt++) = prefix; + } + /* Digits prior to the decimal point */ + if( e2<0 ){ + *(bufpt++) = '0'; + }else{ + for(; e2>=0; e2--){ + *(bufpt++) = et_getdigit(&realvalue,&nsd); + } + } + /* The decimal point */ + if( flag_dp ){ + *(bufpt++) = '.'; + } + /* "0" digits after the decimal point but before the first + ** significant digit of the number */ + for(e2++; e2<0; precision--, e2++){ + assert( precision>0 ); + *(bufpt++) = '0'; + } + /* Significant digits after the decimal point */ + while( (precision--)>0 ){ + *(bufpt++) = et_getdigit(&realvalue,&nsd); + } + /* Remove trailing zeros and the "." if no digits follow the "." */ + if( flag_rtz && flag_dp ){ + while( bufpt[-1]=='0' ) *(--bufpt) = 0; + assert( bufpt>zOut ); + if( bufpt[-1]=='.' ){ + if( flag_altform2 ){ + *(bufpt++) = '0'; + }else{ + *(--bufpt) = 0; + } + } + } + /* Add the "eNNN" suffix */ + if( xtype==etEXP ){ + *(bufpt++) = aDigits[infop->charset]; + if( exp<0 ){ + *(bufpt++) = '-'; exp = -exp; + }else{ + *(bufpt++) = '+'; + } + if( exp>=100 ){ + *(bufpt++) = (char)((exp/100)+'0'); /* 100's digit */ + exp %= 100; + } + *(bufpt++) = (char)(exp/10+'0'); /* 10's digit */ + *(bufpt++) = (char)(exp%10+'0'); /* 1's digit */ + } + *bufpt = 0; + + /* The converted number is in buf[] and zero terminated. Output it. + ** Note that the number is in the usual order, not reversed as with + ** integer conversions. */ + length = (int)(bufpt-zOut); + bufpt = zOut; + + /* Special case: Add leading zeros if the flag_zeropad flag is + ** set and we are not left justified */ + if( flag_zeropad && !flag_leftjustify && length < width){ + int i; + int nPad = width - length; + for(i=width; i>=nPad; i--){ + bufpt[i] = bufpt[i-nPad]; + } + i = prefix!=0; + while( nPad-- ) bufpt[i++] = '0'; + length = width; + } +#endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */ + break; + case etSIZE: + if( !bArgList ){ + *(va_arg(ap,int*)) = pAccum->nChar; + } + length = width = 0; + break; + case etPERCENT: + buf[0] = '%'; + bufpt = buf; + length = 1; + break; + case etCHARX: + if( bArgList ){ + bufpt = getTextArg(pArgList); + length = 1; + if( bufpt ){ + buf[0] = c = *(bufpt++); + if( (c&0xc0)==0xc0 ){ + while( length<4 && (bufpt[0]&0xc0)==0x80 ){ + buf[length++] = *(bufpt++); + } + } + }else{ + buf[0] = 0; + } + }else{ + unsigned int ch = va_arg(ap,unsigned int); + if( ch<0x00080 ){ + buf[0] = ch & 0xff; + length = 1; + }else if( ch<0x00800 ){ + buf[0] = 0xc0 + (u8)((ch>>6)&0x1f); + buf[1] = 0x80 + (u8)(ch & 0x3f); + length = 2; + }else if( ch<0x10000 ){ + buf[0] = 0xe0 + (u8)((ch>>12)&0x0f); + buf[1] = 0x80 + (u8)((ch>>6) & 0x3f); + buf[2] = 0x80 + (u8)(ch & 0x3f); + length = 3; + }else{ + buf[0] = 0xf0 + (u8)((ch>>18) & 0x07); + buf[1] = 0x80 + (u8)((ch>>12) & 0x3f); + buf[2] = 0x80 + (u8)((ch>>6) & 0x3f); + buf[3] = 0x80 + (u8)(ch & 0x3f); + length = 4; + } + } + if( precision>1 ){ + width -= precision-1; + if( width>1 && !flag_leftjustify ){ + sqlite3_str_appendchar(pAccum, width-1, ' '); + width = 0; + } + while( precision-- > 1 ){ + sqlite3_str_append(pAccum, buf, length); + } + } + bufpt = buf; + flag_altform2 = 1; + goto adjust_width_for_utf8; + case etSTRING: + case etDYNSTRING: + if( bArgList ){ + bufpt = getTextArg(pArgList); + xtype = etSTRING; + }else{ + bufpt = va_arg(ap,char*); + } + if( bufpt==0 ){ + bufpt = ""; + }else if( xtype==etDYNSTRING ){ + if( pAccum->nChar==0 + && pAccum->mxAlloc + && width==0 + && precision<0 + && pAccum->accError==0 + ){ + /* Special optimization for sqlite3_mprintf("%z..."): + ** Extend an existing memory allocation rather than creating + ** a new one. */ + assert( (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 ); + pAccum->zText = bufpt; + pAccum->nAlloc = sqlite3DbMallocSize(pAccum->db, bufpt); + pAccum->nChar = 0x7fffffff & (int)strlen(bufpt); + pAccum->printfFlags |= SQLITE_PRINTF_MALLOCED; + length = 0; + break; + } + zExtra = bufpt; + } + if( precision>=0 ){ + if( flag_altform2 ){ + /* Set length to the number of bytes needed in order to display + ** precision characters */ + unsigned char *z = (unsigned char*)bufpt; + while( precision-- > 0 && z[0] ){ + SQLITE_SKIP_UTF8(z); + } + length = (int)(z - (unsigned char*)bufpt); + }else{ + for(length=0; length0 ){ + /* Adjust width to account for extra bytes in UTF-8 characters */ + int ii = length - 1; + while( ii>=0 ) if( (bufpt[ii--] & 0xc0)==0x80 ) width++; + } + break; + case etSQLESCAPE: /* %q: Escape ' characters */ + case etSQLESCAPE2: /* %Q: Escape ' and enclose in '...' */ + case etSQLESCAPE3: { /* %w: Escape " characters */ + int i, j, k, n, isnull; + int needQuote; + char ch; + char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */ + char *escarg; + + if( bArgList ){ + escarg = getTextArg(pArgList); + }else{ + escarg = va_arg(ap,char*); + } + isnull = escarg==0; + if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); + /* For %q, %Q, and %w, the precision is the number of bytes (or + ** characters if the ! flags is present) to use from the input. + ** Because of the extra quoting characters inserted, the number + ** of output characters may be larger than the precision. + */ + k = precision; + for(i=n=0; k!=0 && (ch=escarg[i])!=0; i++, k--){ + if( ch==q ) n++; + if( flag_altform2 && (ch&0xc0)==0xc0 ){ + while( (escarg[i+1]&0xc0)==0x80 ){ i++; } + } + } + needQuote = !isnull && xtype==etSQLESCAPE2; + n += i + 3; + if( n>etBUFSIZE ){ + bufpt = zExtra = printfTempBuf(pAccum, n); + if( bufpt==0 ) return; + }else{ + bufpt = buf; + } + j = 0; + if( needQuote ) bufpt[j++] = q; + k = i; + for(i=0; iprintfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return; + pToken = va_arg(ap, Token*); + assert( bArgList==0 ); + if( pToken && pToken->n ){ + sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n); + } + length = width = 0; + break; + } + case etSRCLIST: { + SrcList *pSrc; + int k; + struct SrcList_item *pItem; + if( (pAccum->printfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return; + pSrc = va_arg(ap, SrcList*); + k = va_arg(ap, int); + pItem = &pSrc->a[k]; + assert( bArgList==0 ); + assert( k>=0 && knSrc ); + if( pItem->zDatabase ){ + sqlite3_str_appendall(pAccum, pItem->zDatabase); + sqlite3_str_append(pAccum, ".", 1); + } + sqlite3_str_appendall(pAccum, pItem->zName); + length = width = 0; + break; + } + default: { + assert( xtype==etINVALID ); + return; + } + }/* End switch over the format type */ + /* + ** The text of the conversion is pointed to by "bufpt" and is + ** "length" characters long. The field width is "width". Do + ** the output. Both length and width are in bytes, not characters, + ** at this point. If the "!" flag was present on string conversions + ** indicating that width and precision should be expressed in characters, + ** then the values have been translated prior to reaching this point. + */ + width -= length; + if( width>0 ){ + if( !flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' '); + sqlite3_str_append(pAccum, bufpt, length); + if( flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' '); + }else{ + sqlite3_str_append(pAccum, bufpt, length); + } + + if( zExtra ){ + sqlite3DbFree(pAccum->db, zExtra); + zExtra = 0; + } + }/* End for loop over the format string */ +} /* End of function */ + +/* +** Enlarge the memory allocation on a StrAccum object so that it is +** able to accept at least N more bytes of text. +** +** Return the number of bytes of text that StrAccum is able to accept +** after the attempted enlargement. The value returned might be zero. +*/ +static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ + char *zNew; + assert( p->nChar+(i64)N >= p->nAlloc ); /* Only called if really needed */ + if( p->accError ){ + testcase(p->accError==SQLITE_TOOBIG); + testcase(p->accError==SQLITE_NOMEM); + return 0; + } + if( p->mxAlloc==0 ){ + setStrAccumError(p, SQLITE_TOOBIG); + return p->nAlloc - p->nChar - 1; + }else{ + char *zOld = isMalloced(p) ? p->zText : 0; + i64 szNew = p->nChar; + szNew += N + 1; + if( szNew+p->nChar<=p->mxAlloc ){ + /* Force exponential buffer size growth as long as it does not overflow, + ** to avoid having to call this routine too often */ + szNew += p->nChar; + } + if( szNew > p->mxAlloc ){ + sqlite3_str_reset(p); + setStrAccumError(p, SQLITE_TOOBIG); + return 0; + }else{ + p->nAlloc = (int)szNew; + } + if( p->db ){ + zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc); + }else{ + zNew = sqlite3Realloc(zOld, p->nAlloc); + } + if( zNew ){ + assert( p->zText!=0 || p->nChar==0 ); + if( !isMalloced(p) && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar); + p->zText = zNew; + p->nAlloc = sqlite3DbMallocSize(p->db, zNew); + p->printfFlags |= SQLITE_PRINTF_MALLOCED; + }else{ + sqlite3_str_reset(p); + setStrAccumError(p, SQLITE_NOMEM); + return 0; + } + } + return N; +} + +/* +** Append N copies of character c to the given string buffer. +*/ +SQLITE_API void sqlite3_str_appendchar(sqlite3_str *p, int N, char c){ + testcase( p->nChar + (i64)N > 0x7fffffff ); + if( p->nChar+(i64)N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ){ + return; + } + while( (N--)>0 ) p->zText[p->nChar++] = c; +} + +/* +** The StrAccum "p" is not large enough to accept N new bytes of z[]. +** So enlarge if first, then do the append. +** +** This is a helper routine to sqlite3_str_append() that does special-case +** work (enlarging the buffer) using tail recursion, so that the +** sqlite3_str_append() routine can use fast calling semantics. +*/ +static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int N){ + N = sqlite3StrAccumEnlarge(p, N); + if( N>0 ){ + memcpy(&p->zText[p->nChar], z, N); + p->nChar += N; + } +} + +/* +** Append N bytes of text from z to the StrAccum object. Increase the +** size of the memory allocation for StrAccum if necessary. +*/ +SQLITE_API void sqlite3_str_append(sqlite3_str *p, const char *z, int N){ + assert( z!=0 || N==0 ); + assert( p->zText!=0 || p->nChar==0 || p->accError ); + assert( N>=0 ); + assert( p->accError==0 || p->nAlloc==0 || p->mxAlloc==0 ); + if( p->nChar+N >= p->nAlloc ){ + enlargeAndAppend(p,z,N); + }else if( N ){ + assert( p->zText ); + p->nChar += N; + memcpy(&p->zText[p->nChar-N], z, N); + } +} + +/* +** Append the complete text of zero-terminated string z[] to the p string. +*/ +SQLITE_API void sqlite3_str_appendall(sqlite3_str *p, const char *z){ + sqlite3_str_append(p, z, sqlite3Strlen30(z)); +} + + +/* +** Finish off a string by making sure it is zero-terminated. +** Return a pointer to the resulting string. Return a NULL +** pointer if any kind of error was encountered. +*/ +static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){ + char *zText; + assert( p->mxAlloc>0 && !isMalloced(p) ); + zText = sqlite3DbMallocRaw(p->db, p->nChar+1 ); + if( zText ){ + memcpy(zText, p->zText, p->nChar+1); + p->printfFlags |= SQLITE_PRINTF_MALLOCED; + }else{ + setStrAccumError(p, SQLITE_NOMEM); + } + p->zText = zText; + return zText; +} +SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){ + if( p->zText ){ + p->zText[p->nChar] = 0; + if( p->mxAlloc>0 && !isMalloced(p) ){ + return strAccumFinishRealloc(p); + } + } + return p->zText; +} + +/* +** This singleton is an sqlite3_str object that is returned if +** sqlite3_malloc() fails to provide space for a real one. This +** sqlite3_str object accepts no new text and always returns +** an SQLITE_NOMEM error. +*/ +static sqlite3_str sqlite3OomStr = { + 0, 0, 0, 0, 0, SQLITE_NOMEM, 0 +}; + +/* Finalize a string created using sqlite3_str_new(). +*/ +SQLITE_API char *sqlite3_str_finish(sqlite3_str *p){ + char *z; + if( p!=0 && p!=&sqlite3OomStr ){ + z = sqlite3StrAccumFinish(p); + sqlite3_free(p); + }else{ + z = 0; + } + return z; +} + +/* Return any error code associated with p */ +SQLITE_API int sqlite3_str_errcode(sqlite3_str *p){ + return p ? p->accError : SQLITE_NOMEM; +} + +/* Return the current length of p in bytes */ +SQLITE_API int sqlite3_str_length(sqlite3_str *p){ + return p ? p->nChar : 0; +} + +/* Return the current value for p */ +SQLITE_API char *sqlite3_str_value(sqlite3_str *p){ + if( p==0 || p->nChar==0 ) return 0; + p->zText[p->nChar] = 0; + return p->zText; +} + +/* +** Reset an StrAccum string. Reclaim all malloced memory. +*/ +SQLITE_API void sqlite3_str_reset(StrAccum *p){ + if( isMalloced(p) ){ + sqlite3DbFree(p->db, p->zText); + p->printfFlags &= ~SQLITE_PRINTF_MALLOCED; + } + p->nAlloc = 0; + p->nChar = 0; + p->zText = 0; +} + +/* +** Initialize a string accumulator. +** +** p: The accumulator to be initialized. +** db: Pointer to a database connection. May be NULL. Lookaside +** memory is used if not NULL. db->mallocFailed is set appropriately +** when not NULL. +** zBase: An initial buffer. May be NULL in which case the initial buffer +** is malloced. +** n: Size of zBase in bytes. If total space requirements never exceed +** n then no memory allocations ever occur. +** mx: Maximum number of bytes to accumulate. If mx==0 then no memory +** allocations will ever occur. +*/ +SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum *p, sqlite3 *db, char *zBase, int n, int mx){ + p->zText = zBase; + p->db = db; + p->nAlloc = n; + p->mxAlloc = mx; + p->nChar = 0; + p->accError = 0; + p->printfFlags = 0; +} + +/* Allocate and initialize a new dynamic string object */ +SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3 *db){ + sqlite3_str *p = sqlite3_malloc64(sizeof(*p)); + if( p ){ + sqlite3StrAccumInit(p, 0, 0, 0, + db ? db->aLimit[SQLITE_LIMIT_LENGTH] : SQLITE_MAX_LENGTH); + }else{ + p = &sqlite3OomStr; + } + return p; +} + +/* +** Print into memory obtained from sqliteMalloc(). Use the internal +** %-conversion extensions. +*/ +SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){ + char *z; + char zBase[SQLITE_PRINT_BUF_SIZE]; + StrAccum acc; + assert( db!=0 ); + sqlite3StrAccumInit(&acc, db, zBase, sizeof(zBase), + db->aLimit[SQLITE_LIMIT_LENGTH]); + acc.printfFlags = SQLITE_PRINTF_INTERNAL; + sqlite3_str_vappendf(&acc, zFormat, ap); + z = sqlite3StrAccumFinish(&acc); + if( acc.accError==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } + return z; +} + +/* +** Print into memory obtained from sqliteMalloc(). Use the internal +** %-conversion extensions. +*/ +SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){ + va_list ap; + char *z; + va_start(ap, zFormat); + z = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + return z; +} + +/* +** Print into memory obtained from sqlite3_malloc(). Omit the internal +** %-conversion extensions. +*/ +SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){ + char *z; + char zBase[SQLITE_PRINT_BUF_SIZE]; + StrAccum acc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( zFormat==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + sqlite3StrAccumInit(&acc, 0, zBase, sizeof(zBase), SQLITE_MAX_LENGTH); + sqlite3_str_vappendf(&acc, zFormat, ap); + z = sqlite3StrAccumFinish(&acc); + return z; +} + +/* +** Print into memory obtained from sqlite3_malloc()(). Omit the internal +** %-conversion extensions. +*/ +SQLITE_API char *sqlite3_mprintf(const char *zFormat, ...){ + va_list ap; + char *z; +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + return z; +} + +/* +** sqlite3_snprintf() works like snprintf() except that it ignores the +** current locale settings. This is important for SQLite because we +** are not able to use a "," as the decimal point in place of "." as +** specified by some locales. +** +** Oops: The first two arguments of sqlite3_snprintf() are backwards +** from the snprintf() standard. Unfortunately, it is too late to change +** this without breaking compatibility, so we just have to live with the +** mistake. +** +** sqlite3_vsnprintf() is the varargs version. +*/ +SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_list ap){ + StrAccum acc; + if( n<=0 ) return zBuf; +#ifdef SQLITE_ENABLE_API_ARMOR + if( zBuf==0 || zFormat==0 ) { + (void)SQLITE_MISUSE_BKPT; + if( zBuf ) zBuf[0] = 0; + return zBuf; + } +#endif + sqlite3StrAccumInit(&acc, 0, zBuf, n, 0); + sqlite3_str_vappendf(&acc, zFormat, ap); + zBuf[acc.nChar] = 0; + return zBuf; +} +SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ + char *z; + va_list ap; + va_start(ap,zFormat); + z = sqlite3_vsnprintf(n, zBuf, zFormat, ap); + va_end(ap); + return z; +} + +/* +** This is the routine that actually formats the sqlite3_log() message. +** We house it in a separate routine from sqlite3_log() to avoid using +** stack space on small-stack systems when logging is disabled. +** +** sqlite3_log() must render into a static buffer. It cannot dynamically +** allocate memory because it might be called while the memory allocator +** mutex is held. +** +** sqlite3_str_vappendf() might ask for *temporary* memory allocations for +** certain format characters (%q) or for very large precisions or widths. +** Care must be taken that any sqlite3_log() calls that occur while the +** memory mutex is held do not use these mechanisms. +*/ +static void renderLogMsg(int iErrCode, const char *zFormat, va_list ap){ + StrAccum acc; /* String accumulator */ + char zMsg[SQLITE_PRINT_BUF_SIZE*3]; /* Complete log message */ + + sqlite3StrAccumInit(&acc, 0, zMsg, sizeof(zMsg), 0); + sqlite3_str_vappendf(&acc, zFormat, ap); + sqlite3GlobalConfig.xLog(sqlite3GlobalConfig.pLogArg, iErrCode, + sqlite3StrAccumFinish(&acc)); +} + +/* +** Format and write a message to the log if logging is enabled. +*/ +SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...){ + va_list ap; /* Vararg list */ + if( sqlite3GlobalConfig.xLog ){ + va_start(ap, zFormat); + renderLogMsg(iErrCode, zFormat, ap); + va_end(ap); + } +} + +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) +/* +** A version of printf() that understands %lld. Used for debugging. +** The printf() built into some versions of windows does not understand %lld +** and segfaults if you give it a long long int. +*/ +SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){ + va_list ap; + StrAccum acc; + char zBuf[SQLITE_PRINT_BUF_SIZE*10]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + va_start(ap,zFormat); + sqlite3_str_vappendf(&acc, zFormat, ap); + va_end(ap); + sqlite3StrAccumFinish(&acc); +#ifdef SQLITE_OS_TRACE_PROC + { + extern void SQLITE_OS_TRACE_PROC(const char *zBuf, int nBuf); + SQLITE_OS_TRACE_PROC(zBuf, sizeof(zBuf)); + } +#else + fprintf(stdout,"%s", zBuf); + fflush(stdout); +#endif +} +#endif + + +/* +** variable-argument wrapper around sqlite3_str_vappendf(). The bFlags argument +** can contain the bit SQLITE_PRINTF_INTERNAL enable internal formats. +*/ +SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){ + va_list ap; + va_start(ap,zFormat); + sqlite3_str_vappendf(p, zFormat, ap); + va_end(ap); +} + +/************** End of printf.c **********************************************/ +/************** Begin file treeview.c ****************************************/ +/* +** 2015-06-08 +** +** 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 C code to implement the TreeView debugging routines. +** These routines print a parse tree to standard output for debugging and +** analysis. +** +** The interfaces in this file is only available when compiling +** with SQLITE_DEBUG. +*/ +/* #include "sqliteInt.h" */ +#ifdef SQLITE_DEBUG + +/* +** Add a new subitem to the tree. The moreToFollow flag indicates that this +** is not the last item in the tree. +*/ +static TreeView *sqlite3TreeViewPush(TreeView *p, u8 moreToFollow){ + if( p==0 ){ + p = sqlite3_malloc64( sizeof(*p) ); + if( p==0 ) return 0; + memset(p, 0, sizeof(*p)); + }else{ + p->iLevel++; + } + assert( moreToFollow==0 || moreToFollow==1 ); + if( p->iLevelbLine) ) p->bLine[p->iLevel] = moreToFollow; + return p; +} + +/* +** Finished with one layer of the tree +*/ +static void sqlite3TreeViewPop(TreeView *p){ + if( p==0 ) return; + p->iLevel--; + if( p->iLevel<0 ) sqlite3_free(p); +} + +/* +** Generate a single line of output for the tree, with a prefix that contains +** all the appropriate tree lines +*/ +static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ + va_list ap; + int i; + StrAccum acc; + char zBuf[500]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + if( p ){ + for(i=0; iiLevel && ibLine)-1; i++){ + sqlite3_str_append(&acc, p->bLine[i] ? "| " : " ", 4); + } + sqlite3_str_append(&acc, p->bLine[i] ? "|-- " : "'-- ", 4); + } + if( zFormat!=0 ){ + va_start(ap, zFormat); + sqlite3_str_vappendf(&acc, zFormat, ap); + va_end(ap); + assert( acc.nChar>0 || acc.accError ); + sqlite3_str_append(&acc, "\n", 1); + } + sqlite3StrAccumFinish(&acc); + fprintf(stdout,"%s", zBuf); + fflush(stdout); +} + +/* +** Shorthand for starting a new tree item that consists of a single label +*/ +static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){ + p = sqlite3TreeViewPush(p, moreFollows); + sqlite3TreeViewLine(p, "%s", zLabel); +} + +/* +** Generate a human-readable description of a WITH clause. +*/ +SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){ + int i; + if( pWith==0 ) return; + if( pWith->nCte==0 ) return; + if( pWith->pOuter ){ + sqlite3TreeViewLine(pView, "WITH (0x%p, pOuter=0x%p)",pWith,pWith->pOuter); + }else{ + sqlite3TreeViewLine(pView, "WITH (0x%p)", pWith); + } + if( pWith->nCte>0 ){ + pView = sqlite3TreeViewPush(pView, 1); + for(i=0; inCte; i++){ + StrAccum x; + char zLine[1000]; + const struct Cte *pCte = &pWith->a[i]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3_str_appendf(&x, "%s", pCte->zName); + if( pCte->pCols && pCte->pCols->nExpr>0 ){ + char cSep = '('; + int j; + for(j=0; jpCols->nExpr; j++){ + sqlite3_str_appendf(&x, "%c%s", cSep, pCte->pCols->a[j].zEName); + cSep = ','; + } + sqlite3_str_appendf(&x, ")"); + } + sqlite3_str_appendf(&x, " AS"); + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, inCte-1); + sqlite3TreeViewSelect(pView, pCte->pSelect, 0); + sqlite3TreeViewPop(pView); + } + sqlite3TreeViewPop(pView); + } +} + +/* +** Generate a human-readable description of a SrcList object. +*/ +SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ + int i; + for(i=0; inSrc; i++){ + const struct SrcList_item *pItem = &pSrc->a[i]; + StrAccum x; + char zLine[100]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3_str_appendf(&x, "{%d:*}", pItem->iCursor); + if( pItem->zDatabase ){ + sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); + }else if( pItem->zName ){ + sqlite3_str_appendf(&x, " %s", pItem->zName); + } + if( pItem->pTab ){ + sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p used=%llx", + pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab, pItem->colUsed); + } + if( pItem->zAlias ){ + sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); + } + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3_str_appendf(&x, " LEFT-JOIN"); + } + if( pItem->fg.fromDDL ){ + sqlite3_str_appendf(&x, " DDL"); + } + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, inSrc-1); + if( pItem->pSelect ){ + sqlite3TreeViewSelect(pView, pItem->pSelect, 0); + } + if( pItem->fg.isTabFunc ){ + sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); + } + sqlite3TreeViewPop(pView); + } +} + +/* +** Generate a human-readable description of a Select object. +*/ +SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ + int n = 0; + int cnt = 0; + if( p==0 ){ + sqlite3TreeViewLine(pView, "nil-SELECT"); + return; + } + pView = sqlite3TreeViewPush(pView, moreToFollow); + if( p->pWith ){ + sqlite3TreeViewWith(pView, p->pWith, 1); + cnt = 1; + sqlite3TreeViewPush(pView, 1); + } + do{ + if( p->selFlags & SF_WhereBegin ){ + sqlite3TreeViewLine(pView, "sqlite3WhereBegin()"); + }else{ + sqlite3TreeViewLine(pView, + "SELECT%s%s (%u/%p) selFlags=0x%x nSelectRow=%d", + ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), + ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), + p->selId, p, p->selFlags, + (int)p->nSelectRow + ); + } + if( cnt++ ) sqlite3TreeViewPop(pView); + if( p->pPrior ){ + n = 1000; + }else{ + n = 0; + if( p->pSrc && p->pSrc->nSrc ) n++; + if( p->pWhere ) n++; + if( p->pGroupBy ) n++; + if( p->pHaving ) n++; + if( p->pOrderBy ) n++; + if( p->pLimit ) n++; +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ) n++; + if( p->pWinDefn ) n++; +#endif + } + if( p->pEList ){ + sqlite3TreeViewExprList(pView, p->pEList, n>0, "result-set"); + } + n--; +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ){ + Window *pX; + pView = sqlite3TreeViewPush(pView, (n--)>0); + sqlite3TreeViewLine(pView, "window-functions"); + for(pX=p->pWin; pX; pX=pX->pNextWin){ + sqlite3TreeViewWinFunc(pView, pX, pX->pNextWin!=0); + } + sqlite3TreeViewPop(pView); + } +#endif + if( p->pSrc && p->pSrc->nSrc ){ + pView = sqlite3TreeViewPush(pView, (n--)>0); + sqlite3TreeViewLine(pView, "FROM"); + sqlite3TreeViewSrcList(pView, p->pSrc); + sqlite3TreeViewPop(pView); + } + if( p->pWhere ){ + sqlite3TreeViewItem(pView, "WHERE", (n--)>0); + sqlite3TreeViewExpr(pView, p->pWhere, 0); + sqlite3TreeViewPop(pView); + } + if( p->pGroupBy ){ + sqlite3TreeViewExprList(pView, p->pGroupBy, (n--)>0, "GROUPBY"); + } + if( p->pHaving ){ + sqlite3TreeViewItem(pView, "HAVING", (n--)>0); + sqlite3TreeViewExpr(pView, p->pHaving, 0); + sqlite3TreeViewPop(pView); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWinDefn ){ + Window *pX; + sqlite3TreeViewItem(pView, "WINDOW", (n--)>0); + for(pX=p->pWinDefn; pX; pX=pX->pNextWin){ + sqlite3TreeViewWindow(pView, pX, pX->pNextWin!=0); + } + sqlite3TreeViewPop(pView); + } +#endif + if( p->pOrderBy ){ + sqlite3TreeViewExprList(pView, p->pOrderBy, (n--)>0, "ORDERBY"); + } + if( p->pLimit ){ + sqlite3TreeViewItem(pView, "LIMIT", (n--)>0); + sqlite3TreeViewExpr(pView, p->pLimit->pLeft, p->pLimit->pRight!=0); + if( p->pLimit->pRight ){ + sqlite3TreeViewItem(pView, "OFFSET", (n--)>0); + sqlite3TreeViewExpr(pView, p->pLimit->pRight, 0); + sqlite3TreeViewPop(pView); + } + sqlite3TreeViewPop(pView); + } + if( p->pPrior ){ + const char *zOp = "UNION"; + switch( p->op ){ + case TK_ALL: zOp = "UNION ALL"; break; + case TK_INTERSECT: zOp = "INTERSECT"; break; + case TK_EXCEPT: zOp = "EXCEPT"; break; + } + sqlite3TreeViewItem(pView, zOp, 1); + } + p = p->pPrior; + }while( p!=0 ); + sqlite3TreeViewPop(pView); +} + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Generate a description of starting or stopping bounds +*/ +SQLITE_PRIVATE void sqlite3TreeViewBound( + TreeView *pView, /* View context */ + u8 eBound, /* UNBOUNDED, CURRENT, PRECEDING, FOLLOWING */ + Expr *pExpr, /* Value for PRECEDING or FOLLOWING */ + u8 moreToFollow /* True if more to follow */ +){ + switch( eBound ){ + case TK_UNBOUNDED: { + sqlite3TreeViewItem(pView, "UNBOUNDED", moreToFollow); + sqlite3TreeViewPop(pView); + break; + } + case TK_CURRENT: { + sqlite3TreeViewItem(pView, "CURRENT", moreToFollow); + sqlite3TreeViewPop(pView); + break; + } + case TK_PRECEDING: { + sqlite3TreeViewItem(pView, "PRECEDING", moreToFollow); + sqlite3TreeViewExpr(pView, pExpr, 0); + sqlite3TreeViewPop(pView); + break; + } + case TK_FOLLOWING: { + sqlite3TreeViewItem(pView, "FOLLOWING", moreToFollow); + sqlite3TreeViewExpr(pView, pExpr, 0); + sqlite3TreeViewPop(pView); + break; + } + } +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Generate a human-readable explanation for a Window object +*/ +SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){ + int nElement = 0; + if( pWin->pFilter ){ + sqlite3TreeViewItem(pView, "FILTER", 1); + sqlite3TreeViewExpr(pView, pWin->pFilter, 0); + sqlite3TreeViewPop(pView); + } + pView = sqlite3TreeViewPush(pView, more); + if( pWin->zName ){ + sqlite3TreeViewLine(pView, "OVER %s (%p)", pWin->zName, pWin); + }else{ + sqlite3TreeViewLine(pView, "OVER (%p)", pWin); + } + if( pWin->zBase ) nElement++; + if( pWin->pOrderBy ) nElement++; + if( pWin->eFrmType ) nElement++; + if( pWin->eExclude ) nElement++; + if( pWin->zBase ){ + sqlite3TreeViewPush(pView, (--nElement)>0); + sqlite3TreeViewLine(pView, "window: %s", pWin->zBase); + sqlite3TreeViewPop(pView); + } + if( pWin->pPartition ){ + sqlite3TreeViewExprList(pView, pWin->pPartition, nElement>0,"PARTITION-BY"); + } + if( pWin->pOrderBy ){ + sqlite3TreeViewExprList(pView, pWin->pOrderBy, (--nElement)>0, "ORDER-BY"); + } + if( pWin->eFrmType ){ + char zBuf[30]; + const char *zFrmType = "ROWS"; + if( pWin->eFrmType==TK_RANGE ) zFrmType = "RANGE"; + if( pWin->eFrmType==TK_GROUPS ) zFrmType = "GROUPS"; + sqlite3_snprintf(sizeof(zBuf),zBuf,"%s%s",zFrmType, + pWin->bImplicitFrame ? " (implied)" : ""); + sqlite3TreeViewItem(pView, zBuf, (--nElement)>0); + sqlite3TreeViewBound(pView, pWin->eStart, pWin->pStart, 1); + sqlite3TreeViewBound(pView, pWin->eEnd, pWin->pEnd, 0); + sqlite3TreeViewPop(pView); + } + if( pWin->eExclude ){ + char zBuf[30]; + const char *zExclude; + switch( pWin->eExclude ){ + case TK_NO: zExclude = "NO OTHERS"; break; + case TK_CURRENT: zExclude = "CURRENT ROW"; break; + case TK_GROUP: zExclude = "GROUP"; break; + case TK_TIES: zExclude = "TIES"; break; + default: + sqlite3_snprintf(sizeof(zBuf),zBuf,"invalid(%d)", pWin->eExclude); + zExclude = zBuf; + break; + } + sqlite3TreeViewPush(pView, 0); + sqlite3TreeViewLine(pView, "EXCLUDE %s", zExclude); + sqlite3TreeViewPop(pView); + } + sqlite3TreeViewPop(pView); +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Generate a human-readable explanation for a Window Function object +*/ +SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView *pView, const Window *pWin, u8 more){ + pView = sqlite3TreeViewPush(pView, more); + sqlite3TreeViewLine(pView, "WINFUNC %s(%d)", + pWin->pFunc->zName, pWin->pFunc->nArg); + sqlite3TreeViewWindow(pView, pWin, 0); + sqlite3TreeViewPop(pView); +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** Generate a human-readable explanation of an expression tree. +*/ +SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ + const char *zBinOp = 0; /* Binary operator */ + const char *zUniOp = 0; /* Unary operator */ + char zFlgs[200]; + pView = sqlite3TreeViewPush(pView, moreToFollow); + if( pExpr==0 ){ + sqlite3TreeViewLine(pView, "nil"); + sqlite3TreeViewPop(pView); + return; + } + if( pExpr->flags || pExpr->affExpr || pExpr->vvaFlags ){ + StrAccum x; + sqlite3StrAccumInit(&x, 0, zFlgs, sizeof(zFlgs), 0); + sqlite3_str_appendf(&x, " fg.af=%x.%c", + pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); + if( ExprHasProperty(pExpr, EP_FromJoin) ){ + sqlite3_str_appendf(&x, " iRJT=%d", pExpr->iRightJoinTable); + } + if( ExprHasProperty(pExpr, EP_FromDDL) ){ + sqlite3_str_appendf(&x, " DDL"); + } + if( ExprHasVVAProperty(pExpr, EP_Immutable) ){ + sqlite3_str_appendf(&x, " IMMUTABLE"); + } + sqlite3StrAccumFinish(&x); + }else{ + zFlgs[0] = 0; + } + switch( pExpr->op ){ + case TK_AGG_COLUMN: { + sqlite3TreeViewLine(pView, "AGG{%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); + break; + } + case TK_COLUMN: { + if( pExpr->iTable<0 ){ + /* This only happens when coding check constraints */ + char zOp2[16]; + if( pExpr->op2 ){ + sqlite3_snprintf(sizeof(zOp2),zOp2," op2=0x%02x",pExpr->op2); + }else{ + zOp2[0] = 0; + } + sqlite3TreeViewLine(pView, "COLUMN(%d)%s%s", + pExpr->iColumn, zFlgs, zOp2); + }else{ + sqlite3TreeViewLine(pView, "{%d:%d} pTab=%p%s", + pExpr->iTable, pExpr->iColumn, + pExpr->y.pTab, zFlgs); + } + if( ExprHasProperty(pExpr, EP_FixedCol) ){ + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + } + break; + } + case TK_INTEGER: { + if( pExpr->flags & EP_IntValue ){ + sqlite3TreeViewLine(pView, "%d", pExpr->u.iValue); + }else{ + sqlite3TreeViewLine(pView, "%s", pExpr->u.zToken); + } + break; + } +#ifndef SQLITE_OMIT_FLOATING_POINT + case TK_FLOAT: { + sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); + break; + } +#endif + case TK_STRING: { + sqlite3TreeViewLine(pView,"%Q", pExpr->u.zToken); + break; + } + case TK_NULL: { + sqlite3TreeViewLine(pView,"NULL"); + break; + } + case TK_TRUEFALSE: { + sqlite3TreeViewLine(pView, + sqlite3ExprTruthValue(pExpr) ? "TRUE" : "FALSE"); + break; + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + case TK_BLOB: { + sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); + break; + } +#endif + case TK_VARIABLE: { + sqlite3TreeViewLine(pView,"VARIABLE(%s,%d)", + pExpr->u.zToken, pExpr->iColumn); + break; + } + case TK_REGISTER: { + sqlite3TreeViewLine(pView,"REGISTER(%d)", pExpr->iTable); + break; + } + case TK_ID: { + sqlite3TreeViewLine(pView,"ID \"%w\"", pExpr->u.zToken); + break; + } +#ifndef SQLITE_OMIT_CAST + case TK_CAST: { + /* Expressions of the form: CAST(pLeft AS token) */ + sqlite3TreeViewLine(pView,"CAST %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } +#endif /* SQLITE_OMIT_CAST */ + case TK_LT: zBinOp = "LT"; break; + case TK_LE: zBinOp = "LE"; break; + case TK_GT: zBinOp = "GT"; break; + case TK_GE: zBinOp = "GE"; break; + case TK_NE: zBinOp = "NE"; break; + case TK_EQ: zBinOp = "EQ"; break; + case TK_IS: zBinOp = "IS"; break; + case TK_ISNOT: zBinOp = "ISNOT"; break; + case TK_AND: zBinOp = "AND"; break; + case TK_OR: zBinOp = "OR"; break; + case TK_PLUS: zBinOp = "ADD"; break; + case TK_STAR: zBinOp = "MUL"; break; + case TK_MINUS: zBinOp = "SUB"; break; + case TK_REM: zBinOp = "REM"; break; + case TK_BITAND: zBinOp = "BITAND"; break; + case TK_BITOR: zBinOp = "BITOR"; break; + case TK_SLASH: zBinOp = "DIV"; break; + case TK_LSHIFT: zBinOp = "LSHIFT"; break; + case TK_RSHIFT: zBinOp = "RSHIFT"; break; + case TK_CONCAT: zBinOp = "CONCAT"; break; + case TK_DOT: zBinOp = "DOT"; break; + case TK_LIMIT: zBinOp = "LIMIT"; break; + + case TK_UMINUS: zUniOp = "UMINUS"; break; + case TK_UPLUS: zUniOp = "UPLUS"; break; + case TK_BITNOT: zUniOp = "BITNOT"; break; + case TK_NOT: zUniOp = "NOT"; break; + case TK_ISNULL: zUniOp = "ISNULL"; break; + case TK_NOTNULL: zUniOp = "NOTNULL"; break; + + case TK_TRUTH: { + int x; + const char *azOp[] = { + "IS-FALSE", "IS-TRUE", "IS-NOT-FALSE", "IS-NOT-TRUE" + }; + assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT ); + assert( pExpr->pRight ); + assert( sqlite3ExprSkipCollate(pExpr->pRight)->op==TK_TRUEFALSE ); + x = (pExpr->op2==TK_ISNOT)*2 + sqlite3ExprTruthValue(pExpr->pRight); + zUniOp = azOp[x]; + break; + } + + case TK_SPAN: { + sqlite3TreeViewLine(pView, "SPAN %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + + case TK_COLLATE: { + /* COLLATE operators without the EP_Collate flag are intended to + ** emulate collation associated with a table column. These show + ** up in the treeview output as "SOFT-COLLATE". Explicit COLLATE + ** operators that appear in the original SQL always have the + ** EP_Collate bit set and appear in treeview output as just "COLLATE" */ + sqlite3TreeViewLine(pView, "%sCOLLATE %Q%s", + !ExprHasProperty(pExpr, EP_Collate) ? "SOFT-" : "", + pExpr->u.zToken, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + + case TK_AGG_FUNCTION: + case TK_FUNCTION: { + ExprList *pFarg; /* List of function arguments */ + Window *pWin; + if( ExprHasProperty(pExpr, EP_TokenOnly) ){ + pFarg = 0; + pWin = 0; + }else{ + pFarg = pExpr->x.pList; +#ifndef SQLITE_OMIT_WINDOWFUNC + pWin = ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0; +#else + pWin = 0; +#endif + } + if( pExpr->op==TK_AGG_FUNCTION ){ + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s iAgg=%d agg=%p", + pExpr->op2, pExpr->u.zToken, zFlgs, + pExpr->iAgg, pExpr->pAggInfo); + }else if( pExpr->op2!=0 ){ + const char *zOp2; + char zBuf[8]; + sqlite3_snprintf(sizeof(zBuf),zBuf,"0x%02x",pExpr->op2); + zOp2 = zBuf; + if( pExpr->op2==NC_IsCheck ) zOp2 = "NC_IsCheck"; + if( pExpr->op2==NC_IdxExpr ) zOp2 = "NC_IdxExpr"; + if( pExpr->op2==NC_PartIdx ) zOp2 = "NC_PartIdx"; + if( pExpr->op2==NC_GenCol ) zOp2 = "NC_GenCol"; + sqlite3TreeViewLine(pView, "FUNCTION %Q%s op2=%s", + pExpr->u.zToken, zFlgs, zOp2); + }else{ + sqlite3TreeViewLine(pView, "FUNCTION %Q%s", pExpr->u.zToken, zFlgs); + } + if( pFarg ){ + sqlite3TreeViewExprList(pView, pFarg, pWin!=0, 0); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pWin ){ + sqlite3TreeViewWindow(pView, pWin, 0); + } +#endif + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: { + sqlite3TreeViewLine(pView, "EXISTS-expr flags=0x%x", pExpr->flags); + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + break; + } + case TK_SELECT: { + sqlite3TreeViewLine(pView, "SELECT-expr flags=0x%x", pExpr->flags); + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + break; + } + case TK_IN: { + sqlite3TreeViewLine(pView, "IN flags=0x%x", pExpr->flags); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + }else{ + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); + } + break; + } +#endif /* SQLITE_OMIT_SUBQUERY */ + + /* + ** x BETWEEN y AND z + ** + ** This is equivalent to + ** + ** x>=y AND x<=z + ** + ** X is stored in pExpr->pLeft. + ** Y is stored in pExpr->pList->a[0].pExpr. + ** Z is stored in pExpr->pList->a[1].pExpr. + */ + case TK_BETWEEN: { + Expr *pX = pExpr->pLeft; + Expr *pY = pExpr->x.pList->a[0].pExpr; + Expr *pZ = pExpr->x.pList->a[1].pExpr; + sqlite3TreeViewLine(pView, "BETWEEN"); + sqlite3TreeViewExpr(pView, pX, 1); + sqlite3TreeViewExpr(pView, pY, 1); + sqlite3TreeViewExpr(pView, pZ, 0); + break; + } + case TK_TRIGGER: { + /* If the opcode is TK_TRIGGER, then the expression is a reference + ** to a column in the new.* or old.* pseudo-tables available to + ** trigger programs. In this case Expr.iTable is set to 1 for the + ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn + ** is set to the column of the pseudo-table to read, or to -1 to + ** read the rowid field. + */ + sqlite3TreeViewLine(pView, "%s(%d)", + pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn); + break; + } + case TK_CASE: { + sqlite3TreeViewLine(pView, "CASE"); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); + break; + } +#ifndef SQLITE_OMIT_TRIGGER + case TK_RAISE: { + const char *zType = "unk"; + switch( pExpr->affExpr ){ + case OE_Rollback: zType = "rollback"; break; + case OE_Abort: zType = "abort"; break; + case OE_Fail: zType = "fail"; break; + case OE_Ignore: zType = "ignore"; break; + } + sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken); + break; + } +#endif + case TK_MATCH: { + sqlite3TreeViewLine(pView, "MATCH {%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pRight, 0); + break; + } + case TK_VECTOR: { + char *z = sqlite3_mprintf("VECTOR%s",zFlgs); + sqlite3TreeViewBareExprList(pView, pExpr->x.pList, z); + sqlite3_free(z); + break; + } + case TK_SELECT_COLUMN: { + sqlite3TreeViewLine(pView, "SELECT-COLUMN %d", pExpr->iColumn); + sqlite3TreeViewSelect(pView, pExpr->pLeft->x.pSelect, 0); + break; + } + case TK_IF_NULL_ROW: { + sqlite3TreeViewLine(pView, "IF-NULL-ROW %d", pExpr->iTable); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + default: { + sqlite3TreeViewLine(pView, "op=%d", pExpr->op); + break; + } + } + if( zBinOp ){ + sqlite3TreeViewLine(pView, "%s%s", zBinOp, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + sqlite3TreeViewExpr(pView, pExpr->pRight, 0); + }else if( zUniOp ){ + sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + } + sqlite3TreeViewPop(pView); +} + + +/* +** Generate a human-readable explanation of an expression list. +*/ +SQLITE_PRIVATE void sqlite3TreeViewBareExprList( + TreeView *pView, + const ExprList *pList, + const char *zLabel +){ + if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; + if( pList==0 ){ + sqlite3TreeViewLine(pView, "%s (empty)", zLabel); + }else{ + int i; + sqlite3TreeViewLine(pView, "%s", zLabel); + for(i=0; inExpr; i++){ + int j = pList->a[i].u.x.iOrderByCol; + char *zName = pList->a[i].zEName; + int moreToFollow = inExpr - 1; + if( pList->a[i].eEName!=ENAME_NAME ) zName = 0; + if( j || zName ){ + sqlite3TreeViewPush(pView, moreToFollow); + moreToFollow = 0; + sqlite3TreeViewLine(pView, 0); + if( zName ){ + fprintf(stdout, "AS %s ", zName); + } + if( j ){ + fprintf(stdout, "iOrderByCol=%d", j); + } + fprintf(stdout, "\n"); + fflush(stdout); + } + sqlite3TreeViewExpr(pView, pList->a[i].pExpr, moreToFollow); + if( j || zName ){ + sqlite3TreeViewPop(pView); + } + } + } +} +SQLITE_PRIVATE void sqlite3TreeViewExprList( + TreeView *pView, + const ExprList *pList, + u8 moreToFollow, + const char *zLabel +){ + pView = sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewBareExprList(pView, pList, zLabel); + sqlite3TreeViewPop(pView); +} + +#endif /* SQLITE_DEBUG */ + +/************** End of treeview.c ********************************************/ +/************** Begin file random.c ******************************************/ +/* +** 2001 September 15 +** +** 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 code to implement a pseudo-random number +** generator (PRNG) for SQLite. +** +** Random numbers are used by some of the database backends in order +** to generate random integer keys for tables or random filenames. +*/ +/* #include "sqliteInt.h" */ + + +/* All threads share a single random number generator. +** This structure is the current state of the generator. +*/ +static SQLITE_WSD struct sqlite3PrngType { + unsigned char isInit; /* True if initialized */ + unsigned char i, j; /* State variables */ + unsigned char s[256]; /* State variables */ +} sqlite3Prng; + +/* +** Return N random bytes. +*/ +SQLITE_API void sqlite3_randomness(int N, void *pBuf){ + unsigned char t; + unsigned char *zBuf = pBuf; + + /* The "wsdPrng" macro will resolve to the pseudo-random number generator + ** state vector. If writable static data is unsupported on the target, + ** we have to locate the state vector at run-time. In the more common + ** case where writable static data is supported, wsdPrng can refer directly + ** to the "sqlite3Prng" state vector declared above. + */ +#ifdef SQLITE_OMIT_WSD + struct sqlite3PrngType *p = &GLOBAL(struct sqlite3PrngType, sqlite3Prng); +# define wsdPrng p[0] +#else +# define wsdPrng sqlite3Prng +#endif + +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex; +#endif + +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return; +#endif + +#if SQLITE_THREADSAFE + mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PRNG); +#endif + + sqlite3_mutex_enter(mutex); + if( N<=0 || pBuf==0 ){ + wsdPrng.isInit = 0; + sqlite3_mutex_leave(mutex); + return; + } + + /* Initialize the state of the random number generator once, + ** the first time this routine is called. The seed value does + ** not need to contain a lot of randomness since we are not + ** trying to do secure encryption or anything like that... + ** + ** Nothing in this file or anywhere else in SQLite does any kind of + ** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random + ** number generator) not as an encryption device. + */ + if( !wsdPrng.isInit ){ + int i; + char k[256]; + wsdPrng.j = 0; + wsdPrng.i = 0; + sqlite3OsRandomness(sqlite3_vfs_find(0), 256, k); + for(i=0; i<256; i++){ + wsdPrng.s[i] = (u8)i; + } + for(i=0; i<256; i++){ + wsdPrng.j += wsdPrng.s[i] + k[i]; + t = wsdPrng.s[wsdPrng.j]; + wsdPrng.s[wsdPrng.j] = wsdPrng.s[i]; + wsdPrng.s[i] = t; + } + wsdPrng.isInit = 1; + } + + assert( N>0 ); + do{ + wsdPrng.i++; + t = wsdPrng.s[wsdPrng.i]; + wsdPrng.j += t; + wsdPrng.s[wsdPrng.i] = wsdPrng.s[wsdPrng.j]; + wsdPrng.s[wsdPrng.j] = t; + t += wsdPrng.s[wsdPrng.i]; + *(zBuf++) = wsdPrng.s[t]; + }while( --N ); + sqlite3_mutex_leave(mutex); +} + +#ifndef SQLITE_UNTESTABLE +/* +** For testing purposes, we sometimes want to preserve the state of +** PRNG and restore the PRNG to its saved state at a later time, or +** to reset the PRNG to its initial state. These routines accomplish +** those tasks. +** +** The sqlite3_test_control() interface calls these routines to +** control the PRNG. +*/ +static SQLITE_WSD struct sqlite3PrngType sqlite3SavedPrng; +SQLITE_PRIVATE void sqlite3PrngSaveState(void){ + memcpy( + &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng), + &GLOBAL(struct sqlite3PrngType, sqlite3Prng), + sizeof(sqlite3Prng) + ); +} +SQLITE_PRIVATE void sqlite3PrngRestoreState(void){ + memcpy( + &GLOBAL(struct sqlite3PrngType, sqlite3Prng), + &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng), + sizeof(sqlite3Prng) + ); +} +#endif /* SQLITE_UNTESTABLE */ + +/************** End of random.c **********************************************/ +/************** Begin file threads.c *****************************************/ +/* +** 2012 July 21 +** +** 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 presents a simple cross-platform threading interface for +** use internally by SQLite. +** +** A "thread" can be created using sqlite3ThreadCreate(). This thread +** runs independently of its creator until it is joined using +** sqlite3ThreadJoin(), at which point it terminates. +** +** Threads do not have to be real. It could be that the work of the +** "thread" is done by the main thread at either the sqlite3ThreadCreate() +** or sqlite3ThreadJoin() call. This is, in fact, what happens in +** single threaded systems. Nothing in SQLite requires multiple threads. +** This interface exists so that applications that want to take advantage +** of multiple cores can do so, while also allowing applications to stay +** single-threaded if desired. +*/ +/* #include "sqliteInt.h" */ +#if SQLITE_OS_WIN +/* # include "os_win.h" */ +#endif + +#if SQLITE_MAX_WORKER_THREADS>0 + +/********************************* Unix Pthreads ****************************/ +#if SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) && SQLITE_THREADSAFE>0 + +#define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */ +/* #include */ + +/* A running thread */ +struct SQLiteThread { + pthread_t tid; /* Thread ID */ + int done; /* Set to true when thread finishes */ + void *pOut; /* Result returned by the thread */ + void *(*xTask)(void*); /* The thread routine */ + void *pIn; /* Argument to the thread */ +}; + +/* Create a new thread */ +SQLITE_PRIVATE int sqlite3ThreadCreate( + SQLiteThread **ppThread, /* OUT: Write the thread object here */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + SQLiteThread *p; + int rc; + + assert( ppThread!=0 ); + assert( xTask!=0 ); + /* This routine is never used in single-threaded mode */ + assert( sqlite3GlobalConfig.bCoreMutex!=0 ); + + *ppThread = 0; + p = sqlite3Malloc(sizeof(*p)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + memset(p, 0, sizeof(*p)); + p->xTask = xTask; + p->pIn = pIn; + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + ** function that returns SQLITE_ERROR when passed the argument 200, that + ** forces worker threads to run sequentially and deterministically + ** for testing purposes. */ + if( sqlite3FaultSim(200) ){ + rc = 1; + }else{ + rc = pthread_create(&p->tid, 0, xTask, pIn); + } + if( rc ){ + p->done = 1; + p->pOut = xTask(pIn); + } + *ppThread = p; + return SQLITE_OK; +} + +/* Get the results of the thread */ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ + int rc; + + assert( ppOut!=0 ); + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; + if( p->done ){ + *ppOut = p->pOut; + rc = SQLITE_OK; + }else{ + rc = pthread_join(p->tid, ppOut) ? SQLITE_ERROR : SQLITE_OK; + } + sqlite3_free(p); + return rc; +} + +#endif /* SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) */ +/******************************** End Unix Pthreads *************************/ + + +/********************************* Win32 Threads ****************************/ +#if SQLITE_OS_WIN_THREADS + +#define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */ +#include + +/* A running thread */ +struct SQLiteThread { + void *tid; /* The thread handle */ + unsigned id; /* The thread identifier */ + void *(*xTask)(void*); /* The routine to run as a thread */ + void *pIn; /* Argument to xTask */ + void *pResult; /* Result of xTask */ +}; + +/* Thread procedure Win32 compatibility shim */ +static unsigned __stdcall sqlite3ThreadProc( + void *pArg /* IN: Pointer to the SQLiteThread structure */ +){ + SQLiteThread *p = (SQLiteThread *)pArg; + + assert( p!=0 ); +#if 0 + /* + ** This assert appears to trigger spuriously on certain + ** versions of Windows, possibly due to _beginthreadex() + ** and/or CreateThread() not fully setting their thread + ** ID parameter before starting the thread. + */ + assert( p->id==GetCurrentThreadId() ); +#endif + assert( p->xTask!=0 ); + p->pResult = p->xTask(p->pIn); + + _endthreadex(0); + return 0; /* NOT REACHED */ +} + +/* Create a new thread */ +SQLITE_PRIVATE int sqlite3ThreadCreate( + SQLiteThread **ppThread, /* OUT: Write the thread object here */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + SQLiteThread *p; + + assert( ppThread!=0 ); + assert( xTask!=0 ); + *ppThread = 0; + p = sqlite3Malloc(sizeof(*p)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + ** function that returns SQLITE_ERROR when passed the argument 200, that + ** forces worker threads to run sequentially and deterministically + ** (via the sqlite3FaultSim() term of the conditional) for testing + ** purposes. */ + if( sqlite3GlobalConfig.bCoreMutex==0 || sqlite3FaultSim(200) ){ + memset(p, 0, sizeof(*p)); + }else{ + p->xTask = xTask; + p->pIn = pIn; + p->tid = (void*)_beginthreadex(0, 0, sqlite3ThreadProc, p, 0, &p->id); + if( p->tid==0 ){ + memset(p, 0, sizeof(*p)); + } + } + if( p->xTask==0 ){ + p->id = GetCurrentThreadId(); + p->pResult = xTask(pIn); + } + *ppThread = p; + return SQLITE_OK; +} + +SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject); /* os_win.c */ + +/* Get the results of the thread */ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ + DWORD rc; + BOOL bRc; + + assert( ppOut!=0 ); + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; + if( p->xTask==0 ){ + /* assert( p->id==GetCurrentThreadId() ); */ + rc = WAIT_OBJECT_0; + assert( p->tid==0 ); + }else{ + assert( p->id!=0 && p->id!=GetCurrentThreadId() ); + rc = sqlite3Win32Wait((HANDLE)p->tid); + assert( rc!=WAIT_IO_COMPLETION ); + bRc = CloseHandle((HANDLE)p->tid); + assert( bRc ); + } + if( rc==WAIT_OBJECT_0 ) *ppOut = p->pResult; + sqlite3_free(p); + return (rc==WAIT_OBJECT_0) ? SQLITE_OK : SQLITE_ERROR; +} + +#endif /* SQLITE_OS_WIN_THREADS */ +/******************************** End Win32 Threads *************************/ + + +/********************************* Single-Threaded **************************/ +#ifndef SQLITE_THREADS_IMPLEMENTED +/* +** This implementation does not actually create a new thread. It does the +** work of the thread in the main thread, when either the thread is created +** or when it is joined +*/ + +/* A running thread */ +struct SQLiteThread { + void *(*xTask)(void*); /* The routine to run as a thread */ + void *pIn; /* Argument to xTask */ + void *pResult; /* Result of xTask */ +}; + +/* Create a new thread */ +SQLITE_PRIVATE int sqlite3ThreadCreate( + SQLiteThread **ppThread, /* OUT: Write the thread object here */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + SQLiteThread *p; + + assert( ppThread!=0 ); + assert( xTask!=0 ); + *ppThread = 0; + p = sqlite3Malloc(sizeof(*p)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + if( (SQLITE_PTR_TO_INT(p)/17)&1 ){ + p->xTask = xTask; + p->pIn = pIn; + }else{ + p->xTask = 0; + p->pResult = xTask(pIn); + } + *ppThread = p; + return SQLITE_OK; +} + +/* Get the results of the thread */ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ + + assert( ppOut!=0 ); + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; + if( p->xTask ){ + *ppOut = p->xTask(p->pIn); + }else{ + *ppOut = p->pResult; + } + sqlite3_free(p); + +#if defined(SQLITE_TEST) + { + void *pTstAlloc = sqlite3Malloc(10); + if (!pTstAlloc) return SQLITE_NOMEM_BKPT; + sqlite3_free(pTstAlloc); + } +#endif + + return SQLITE_OK; +} + +#endif /* !defined(SQLITE_THREADS_IMPLEMENTED) */ +/****************************** End Single-Threaded *************************/ +#endif /* SQLITE_MAX_WORKER_THREADS>0 */ + +/************** End of threads.c *********************************************/ +/************** Begin file utf.c *********************************************/ +/* +** 2004 April 13 +** +** 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 routines used to translate between UTF-8, +** UTF-16, UTF-16BE, and UTF-16LE. +** +** Notes on UTF-8: +** +** Byte-0 Byte-1 Byte-2 Byte-3 Value +** 0xxxxxxx 00000000 00000000 0xxxxxxx +** 110yyyyy 10xxxxxx 00000000 00000yyy yyxxxxxx +** 1110zzzz 10yyyyyy 10xxxxxx 00000000 zzzzyyyy yyxxxxxx +** 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx 000uuuuu zzzzyyyy yyxxxxxx +** +** +** Notes on UTF-16: (with wwww+1==uuuuu) +** +** Word-0 Word-1 Value +** 110110ww wwzzzzyy 110111yy yyxxxxxx 000uuuuu zzzzyyyy yyxxxxxx +** zzzzyyyy yyxxxxxx 00000000 zzzzyyyy yyxxxxxx +** +** +** BOM or Byte Order Mark: +** 0xff 0xfe little-endian utf-16 follows +** 0xfe 0xff big-endian utf-16 follows +** +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include "vdbeInt.h" */ + +#if !defined(SQLITE_AMALGAMATION) && SQLITE_BYTEORDER==0 +/* +** The following constant value is used by the SQLITE_BIGENDIAN and +** SQLITE_LITTLEENDIAN macros. +*/ +SQLITE_PRIVATE const int sqlite3one = 1; +#endif /* SQLITE_AMALGAMATION && SQLITE_BYTEORDER==0 */ + +/* +** This lookup table is used to help decode the first byte of +** a multi-byte UTF8 character. +*/ +static const unsigned char sqlite3Utf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + + +#define WRITE_UTF8(zOut, c) { \ + if( c<0x00080 ){ \ + *zOut++ = (u8)(c&0xFF); \ + } \ + else if( c<0x00800 ){ \ + *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ + else if( c<0x10000 ){ \ + *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + }else{ \ + *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); \ + *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ +} + +#define WRITE_UTF16LE(zOut, c) { \ + if( c<=0xFFFF ){ \ + *zOut++ = (u8)(c&0x00FF); \ + *zOut++ = (u8)((c>>8)&0x00FF); \ + }else{ \ + *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \ + *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \ + *zOut++ = (u8)(c&0x00FF); \ + *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \ + } \ +} + +#define WRITE_UTF16BE(zOut, c) { \ + if( c<=0xFFFF ){ \ + *zOut++ = (u8)((c>>8)&0x00FF); \ + *zOut++ = (u8)(c&0x00FF); \ + }else{ \ + *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \ + *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \ + *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \ + *zOut++ = (u8)(c&0x00FF); \ + } \ +} + +/* +** Translate a single UTF-8 character. Return the unicode value. +** +** During translation, assume that the byte that zTerm points +** is a 0x00. +** +** Write a pointer to the next unread byte back into *pzNext. +** +** Notes On Invalid UTF-8: +** +** * This routine never allows a 7-bit character (0x00 through 0x7f) to +** be encoded as a multi-byte character. Any multi-byte character that +** attempts to encode a value between 0x00 and 0x7f is rendered as 0xfffd. +** +** * This routine never allows a UTF16 surrogate value to be encoded. +** If a multi-byte character attempts to encode a value between +** 0xd800 and 0xe000 then it is rendered as 0xfffd. +** +** * Bytes in the range of 0x80 through 0xbf which occur as the first +** byte of a character are interpreted as single-byte characters +** and rendered as themselves even though they are technically +** invalid characters. +** +** * This routine accepts over-length UTF8 encodings +** for unicode values 0x80 and greater. It does not change over-length +** encodings to 0xfffd as some systems recommend. +*/ +#define READ_UTF8(zIn, zTerm, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = sqlite3Utf8Trans1[c-0xc0]; \ + while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + if( c<0x80 \ + || (c&0xFFFFF800)==0xD800 \ + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \ + } +SQLITE_PRIVATE u32 sqlite3Utf8Read( + const unsigned char **pz /* Pointer to string from which to read char */ +){ + unsigned int c; + + /* Same as READ_UTF8() above but without the zTerm parameter. + ** For this routine, we assume the UTF8 string is always zero-terminated. + */ + c = *((*pz)++); + if( c>=0xc0 ){ + c = sqlite3Utf8Trans1[c-0xc0]; + while( (*(*pz) & 0xc0)==0x80 ){ + c = (c<<6) + (0x3f & *((*pz)++)); + } + if( c<0x80 + || (c&0xFFFFF800)==0xD800 + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } + } + return c; +} + + + + +/* +** If the TRANSLATE_TRACE macro is defined, the value of each Mem is +** printed on stderr on the way into and out of sqlite3VdbeMemTranslate(). +*/ +/* #define TRANSLATE_TRACE 1 */ + +#ifndef SQLITE_OMIT_UTF16 +/* +** This routine transforms the internal text encoding used by pMem to +** desiredEnc. It is an error if the string is already of the desired +** encoding, or if *pMem does not contain a string value. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ + sqlite3_int64 len; /* Maximum length of output string in bytes */ + unsigned char *zOut; /* Output buffer */ + unsigned char *zIn; /* Input iterator */ + unsigned char *zTerm; /* End of input */ + unsigned char *z; /* Output iterator */ + unsigned int c; + + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( pMem->flags&MEM_Str ); + assert( pMem->enc!=desiredEnc ); + assert( pMem->enc!=0 ); + assert( pMem->n>=0 ); + +#if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG) + { + StrAccum acc; + char zBuf[1000]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3VdbeMemPrettyPrint(pMem, &acc); + fprintf(stderr, "INPUT: %s\n", sqlite3StrAccumFinish(&acc)); + } +#endif + + /* If the translation is between UTF-16 little and big endian, then + ** all that is required is to swap the byte order. This case is handled + ** differently from the others. + */ + if( pMem->enc!=SQLITE_UTF8 && desiredEnc!=SQLITE_UTF8 ){ + u8 temp; + int rc; + rc = sqlite3VdbeMemMakeWriteable(pMem); + if( rc!=SQLITE_OK ){ + assert( rc==SQLITE_NOMEM ); + return SQLITE_NOMEM_BKPT; + } + zIn = (u8*)pMem->z; + zTerm = &zIn[pMem->n&~1]; + while( zInenc = desiredEnc; + goto translate_out; + } + + /* Set len to the maximum number of bytes required in the output buffer. */ + if( desiredEnc==SQLITE_UTF8 ){ + /* When converting from UTF-16, the maximum growth results from + ** translating a 2-byte character to a 4-byte UTF-8 character. + ** A single byte is required for the output string + ** nul-terminator. + */ + pMem->n &= ~1; + len = 2 * (sqlite3_int64)pMem->n + 1; + }else{ + /* When converting from UTF-8 to UTF-16 the maximum growth is caused + ** when a 1-byte UTF-8 character is translated into a 2-byte UTF-16 + ** character. Two bytes are required in the output buffer for the + ** nul-terminator. + */ + len = 2 * (sqlite3_int64)pMem->n + 2; + } + + /* Set zIn to point at the start of the input buffer and zTerm to point 1 + ** byte past the end. + ** + ** Variable zOut is set to point at the output buffer, space obtained + ** from sqlite3_malloc(). + */ + zIn = (u8*)pMem->z; + zTerm = &zIn[pMem->n]; + zOut = sqlite3DbMallocRaw(pMem->db, len); + if( !zOut ){ + return SQLITE_NOMEM_BKPT; + } + z = zOut; + + if( pMem->enc==SQLITE_UTF8 ){ + if( desiredEnc==SQLITE_UTF16LE ){ + /* UTF-8 -> UTF-16 Little-endian */ + while( zIn UTF-16 Big-endian */ + while( zInn = (int)(z - zOut); + *z++ = 0; + }else{ + assert( desiredEnc==SQLITE_UTF8 ); + if( pMem->enc==SQLITE_UTF16LE ){ + /* UTF-16 Little-endian -> UTF-8 */ + while( zIn=0xd800 && c<0xe000 ){ +#ifdef SQLITE_REPLACE_INVALID_UTF + if( c>=0xdc00 || zIn>=zTerm ){ + c = 0xfffd; + }else{ + int c2 = *(zIn++); + c2 += (*(zIn++))<<8; + if( c2<0xdc00 || c2>=0xe000 ){ + zIn -= 2; + c = 0xfffd; + }else{ + c = ((c&0x3ff)<<10) + (c2&0x3ff) + 0x10000; + } + } +#else + if( zIn UTF-8 */ + while( zIn=0xd800 && c<0xe000 ){ +#ifdef SQLITE_REPLACE_INVALID_UTF + if( c>=0xdc00 || zIn>=zTerm ){ + c = 0xfffd; + }else{ + int c2 = (*(zIn++))<<8; + c2 += *(zIn++); + if( c2<0xdc00 || c2>=0xe000 ){ + zIn -= 2; + c = 0xfffd; + }else{ + c = ((c&0x3ff)<<10) + (c2&0x3ff) + 0x10000; + } + } +#else + if( zInn = (int)(z - zOut); + } + *z = 0; + assert( (pMem->n+(desiredEnc==SQLITE_UTF8?1:2))<=len ); + + c = pMem->flags; + sqlite3VdbeMemRelease(pMem); + pMem->flags = MEM_Str|MEM_Term|(c&(MEM_AffMask|MEM_Subtype)); + pMem->enc = desiredEnc; + pMem->z = (char*)zOut; + pMem->zMalloc = pMem->z; + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->z); + +translate_out: +#if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG) + { + StrAccum acc; + char zBuf[1000]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3VdbeMemPrettyPrint(pMem, &acc); + fprintf(stderr, "OUTPUT: %s\n", sqlite3StrAccumFinish(&acc)); + } +#endif + return SQLITE_OK; +} +#endif /* SQLITE_OMIT_UTF16 */ + +#ifndef SQLITE_OMIT_UTF16 +/* +** This routine checks for a byte-order mark at the beginning of the +** UTF-16 string stored in *pMem. If one is present, it is removed and +** the encoding of the Mem adjusted. This routine does not do any +** byte-swapping, it just sets Mem.enc appropriately. +** +** The allocation (static, dynamic etc.) and encoding of the Mem may be +** changed by this function. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem){ + int rc = SQLITE_OK; + u8 bom = 0; + + assert( pMem->n>=0 ); + if( pMem->n>1 ){ + u8 b1 = *(u8 *)pMem->z; + u8 b2 = *(((u8 *)pMem->z) + 1); + if( b1==0xFE && b2==0xFF ){ + bom = SQLITE_UTF16BE; + } + if( b1==0xFF && b2==0xFE ){ + bom = SQLITE_UTF16LE; + } + } + + if( bom ){ + rc = sqlite3VdbeMemMakeWriteable(pMem); + if( rc==SQLITE_OK ){ + pMem->n -= 2; + memmove(pMem->z, &pMem->z[2], pMem->n); + pMem->z[pMem->n] = '\0'; + pMem->z[pMem->n+1] = '\0'; + pMem->flags |= MEM_Term; + pMem->enc = bom; + } + } + return rc; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** pZ is a UTF-8 encoded unicode string. If nByte is less than zero, +** return the number of unicode characters in pZ up to (but not including) +** the first 0x00 byte. If nByte is not less than zero, return the +** number of unicode characters in the first nByte of pZ (or up to +** the first 0x00, whichever comes first). +*/ +SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *zIn, int nByte){ + int r = 0; + const u8 *z = (const u8*)zIn; + const u8 *zTerm; + if( nByte>=0 ){ + zTerm = &z[nByte]; + }else{ + zTerm = (const u8*)(-1); + } + assert( z<=zTerm ); + while( *z!=0 && zmallocFailed ){ + sqlite3VdbeMemRelease(&m); + m.z = 0; + } + assert( (m.flags & MEM_Term)!=0 || db->mallocFailed ); + assert( (m.flags & MEM_Str)!=0 || db->mallocFailed ); + assert( m.z || db->mallocFailed ); + return m.z; +} + +/* +** zIn is a UTF-16 encoded unicode string at least nChar characters long. +** Return the number of bytes in the first nChar unicode characters +** in pZ. nChar must be non-negative. +*/ +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){ + int c; + unsigned char const *z = zIn; + int n = 0; + + if( SQLITE_UTF16NATIVE==SQLITE_UTF16LE ) z++; + while( n=0xd8 && c<0xdc && z[0]>=0xdc && z[0]<0xe0 ) z += 2; + n++; + } + return (int)(z-(unsigned char const *)zIn) + - (SQLITE_UTF16NATIVE==SQLITE_UTF16LE); +} + +#if defined(SQLITE_TEST) +/* +** This routine is called from the TCL test function "translate_selftest". +** It checks that the primitives for serializing and deserializing +** characters in each encoding are inverses of each other. +*/ +SQLITE_PRIVATE void sqlite3UtfSelfTest(void){ + unsigned int i, t; + unsigned char zBuf[20]; + unsigned char *z; + int n; + unsigned int c; + + for(i=0; i<0x00110000; i++){ + z = zBuf; + WRITE_UTF8(z, i); + n = (int)(z-zBuf); + assert( n>0 && n<=4 ); + z[0] = 0; + z = zBuf; + c = sqlite3Utf8Read((const u8**)&z); + t = i; + if( i>=0xD800 && i<=0xDFFF ) t = 0xFFFD; + if( (i&0xFFFFFFFE)==0xFFFE ) t = 0xFFFD; + assert( c==t ); + assert( (z-zBuf)==n ); + } +} +#endif /* SQLITE_TEST */ +#endif /* SQLITE_OMIT_UTF16 */ + +/************** End of utf.c *************************************************/ +/************** Begin file util.c ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Utility functions used throughout sqlite. +** +** This file contains functions for allocating memory, comparing +** strings, and stuff like that. +** +*/ +/* #include "sqliteInt.h" */ +/* #include */ +#ifndef SQLITE_OMIT_FLOATING_POINT +#include +#endif + +/* +** Routine needed to support the testcase() macro. +*/ +#ifdef SQLITE_COVERAGE_TEST +SQLITE_PRIVATE void sqlite3Coverage(int x){ + static unsigned dummy = 0; + dummy += (unsigned)x; +} +#endif + +/* +** Calls to sqlite3FaultSim() are used to simulate a failure during testing, +** or to bypass normal error detection during testing in order to let +** execute proceed futher downstream. +** +** In deployment, sqlite3FaultSim() *always* return SQLITE_OK (0). The +** sqlite3FaultSim() function only returns non-zero during testing. +** +** During testing, if the test harness has set a fault-sim callback using +** a call to sqlite3_test_control(SQLITE_TESTCTRL_FAULT_INSTALL), then +** each call to sqlite3FaultSim() is relayed to that application-supplied +** callback and the integer return value form the application-supplied +** callback is returned by sqlite3FaultSim(). +** +** The integer argument to sqlite3FaultSim() is a code to identify which +** sqlite3FaultSim() instance is being invoked. Each call to sqlite3FaultSim() +** should have a unique code. To prevent legacy testing applications from +** breaking, the codes should not be changed or reused. +*/ +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE int sqlite3FaultSim(int iTest){ + int (*xCallback)(int) = sqlite3GlobalConfig.xTestCallback; + return xCallback ? xCallback(iTest) : SQLITE_OK; +} +#endif + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** Return true if the floating point value is Not a Number (NaN). +*/ +SQLITE_PRIVATE int sqlite3IsNaN(double x){ + u64 y; + memcpy(&y,&x,sizeof(y)); + return IsNaN(y); +} +#endif /* SQLITE_OMIT_FLOATING_POINT */ + +/* +** Compute a string length that is limited to what can be stored in +** lower 30 bits of a 32-bit signed integer. +** +** The value returned will never be negative. Nor will it ever be greater +** than the actual length of the string. For very long strings (greater +** than 1GiB) the value returned might be less than the true string length. +*/ +SQLITE_PRIVATE int sqlite3Strlen30(const char *z){ + if( z==0 ) return 0; + return 0x3fffffff & (int)strlen(z); +} + +/* +** Return the declared type of a column. Or return zDflt if the column +** has no declared type. +** +** The column type is an extra string stored after the zero-terminator on +** the column name if and only if the COLFLAG_HASTYPE flag is set. +*/ +SQLITE_PRIVATE char *sqlite3ColumnType(Column *pCol, char *zDflt){ + if( (pCol->colFlags & COLFLAG_HASTYPE)==0 ) return zDflt; + return pCol->zName + strlen(pCol->zName) + 1; +} + +/* +** Helper function for sqlite3Error() - called rarely. Broken out into +** a separate routine to avoid unnecessary register saves on entry to +** sqlite3Error(). +*/ +static SQLITE_NOINLINE void sqlite3ErrorFinish(sqlite3 *db, int err_code){ + if( db->pErr ) sqlite3ValueSetNull(db->pErr); + sqlite3SystemError(db, err_code); +} + +/* +** Set the current error code to err_code and clear any prior error message. +** Also set iSysErrno (by calling sqlite3System) if the err_code indicates +** that would be appropriate. +*/ +SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code){ + assert( db!=0 ); + db->errCode = err_code; + if( err_code || db->pErr ) sqlite3ErrorFinish(db, err_code); +} + +/* +** Load the sqlite3.iSysErrno field if that is an appropriate thing +** to do based on the SQLite error code in rc. +*/ +SQLITE_PRIVATE void sqlite3SystemError(sqlite3 *db, int rc){ + if( rc==SQLITE_IOERR_NOMEM ) return; + rc &= 0xff; + if( rc==SQLITE_CANTOPEN || rc==SQLITE_IOERR ){ + db->iSysErrno = sqlite3OsGetLastError(db->pVfs); + } +} + +/* +** Set the most recent error code and error string for the sqlite +** handle "db". The error code is set to "err_code". +** +** If it is not NULL, string zFormat specifies the format of the +** error string in the style of the printf functions: The following +** format characters are allowed: +** +** %s Insert a string +** %z A string that should be freed after use +** %d Insert an integer +** %T Insert a token +** %S Insert the first element of a SrcList +** +** zFormat and any string tokens that follow it are assumed to be +** encoded in UTF-8. +** +** To clear the most recent error for sqlite handle "db", sqlite3Error +** should be called with err_code set to SQLITE_OK and zFormat set +** to NULL. +*/ +SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3 *db, int err_code, const char *zFormat, ...){ + assert( db!=0 ); + db->errCode = err_code; + sqlite3SystemError(db, err_code); + if( zFormat==0 ){ + sqlite3Error(db, err_code); + }else if( db->pErr || (db->pErr = sqlite3ValueNew(db))!=0 ){ + char *z; + va_list ap; + va_start(ap, zFormat); + z = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC); + } +} + +/* +** Add an error message to pParse->zErrMsg and increment pParse->nErr. +** The following formatting characters are allowed: +** +** %s Insert a string +** %z A string that should be freed after use +** %d Insert an integer +** %T Insert a token +** %S Insert the first element of a SrcList +** +** This function should be used to report any error that occurs while +** compiling an SQL statement (i.e. within sqlite3_prepare()). The +** last thing the sqlite3_prepare() function does is copy the error +** stored by this function into the database handle using sqlite3Error(). +** Functions sqlite3Error() or sqlite3ErrorWithMsg() should be used +** during statement execution (sqlite3_step() etc.). +*/ +SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ + char *zMsg; + va_list ap; + sqlite3 *db = pParse->db; + va_start(ap, zFormat); + zMsg = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + if( db->suppressErr ){ + sqlite3DbFree(db, zMsg); + }else{ + pParse->nErr++; + sqlite3DbFree(db, pParse->zErrMsg); + pParse->zErrMsg = zMsg; + pParse->rc = SQLITE_ERROR; + pParse->pWith = 0; + } +} + +/* +** If database connection db is currently parsing SQL, then transfer +** error code errCode to that parser if the parser has not already +** encountered some other kind of error. +*/ +SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3 *db, int errCode){ + Parse *pParse; + if( db==0 || (pParse = db->pParse)==0 ) return errCode; + pParse->rc = errCode; + pParse->nErr++; + return errCode; +} + +/* +** Convert an SQL-style quoted string into a normal string by removing +** the quote characters. The conversion is done in-place. If the +** input does not begin with a quote character, then this routine +** is a no-op. +** +** The input string must be zero-terminated. A new zero-terminator +** is added to the dequoted string. +** +** The return value is -1 if no dequoting occurs or the length of the +** dequoted string, exclusive of the zero terminator, if dequoting does +** occur. +** +** 2002-02-14: This routine is extended to remove MS-Access style +** brackets from around identifiers. For example: "[a-b-c]" becomes +** "a-b-c". +*/ +SQLITE_PRIVATE void sqlite3Dequote(char *z){ + char quote; + int i, j; + if( z==0 ) return; + quote = z[0]; + if( !sqlite3Isquote(quote) ) return; + if( quote=='[' ) quote = ']'; + for(i=1, j=0;; i++){ + assert( z[i] ); + if( z[i]==quote ){ + if( z[i+1]==quote ){ + z[j++] = quote; + i++; + }else{ + break; + } + }else{ + z[j++] = z[i]; + } + } + z[j] = 0; +} +SQLITE_PRIVATE void sqlite3DequoteExpr(Expr *p){ + assert( sqlite3Isquote(p->u.zToken[0]) ); + p->flags |= p->u.zToken[0]=='"' ? EP_Quoted|EP_DblQuoted : EP_Quoted; + sqlite3Dequote(p->u.zToken); +} + +/* +** Generate a Token object from a string +*/ +SQLITE_PRIVATE void sqlite3TokenInit(Token *p, char *z){ + p->z = z; + p->n = sqlite3Strlen30(z); +} + +/* Convenient short-hand */ +#define UpperToLower sqlite3UpperToLower + +/* +** Some systems have stricmp(). Others have strcasecmp(). Because +** there is no consistency, we will define our own. +** +** IMPLEMENTATION-OF: R-30243-02494 The sqlite3_stricmp() and +** sqlite3_strnicmp() APIs allow applications and extensions to compare +** the contents of two buffers containing UTF-8 strings in a +** case-independent fashion, using the same definition of "case +** independence" that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_stricmp(const char *zLeft, const char *zRight){ + if( zLeft==0 ){ + return zRight ? -1 : 0; + }else if( zRight==0 ){ + return 1; + } + return sqlite3StrICmp(zLeft, zRight); +} +SQLITE_PRIVATE int sqlite3StrICmp(const char *zLeft, const char *zRight){ + unsigned char *a, *b; + int c, x; + a = (unsigned char *)zLeft; + b = (unsigned char *)zRight; + for(;;){ + c = *a; + x = *b; + if( c==x ){ + if( c==0 ) break; + }else{ + c = (int)UpperToLower[c] - (int)UpperToLower[x]; + if( c ) break; + } + a++; + b++; + } + return c; +} +SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){ + register unsigned char *a, *b; + if( zLeft==0 ){ + return zRight ? -1 : 0; + }else if( zRight==0 ){ + return 1; + } + a = (unsigned char *)zLeft; + b = (unsigned char *)zRight; + while( N-- > 0 && *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; } + return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b]; +} + +/* +** Compute an 8-bit hash on a string that is insensitive to case differences +*/ +SQLITE_PRIVATE u8 sqlite3StrIHash(const char *z){ + u8 h = 0; + if( z==0 ) return 0; + while( z[0] ){ + h += UpperToLower[(unsigned char)z[0]]; + z++; + } + return h; +} + +/* +** Compute 10 to the E-th power. Examples: E==1 results in 10. +** E==2 results in 100. E==50 results in 1.0e50. +** +** This routine only works for values of E between 1 and 341. +*/ +static LONGDOUBLE_TYPE sqlite3Pow10(int E){ +#if defined(_MSC_VER) + static const LONGDOUBLE_TYPE x[] = { + 1.0e+001L, + 1.0e+002L, + 1.0e+004L, + 1.0e+008L, + 1.0e+016L, + 1.0e+032L, + 1.0e+064L, + 1.0e+128L, + 1.0e+256L + }; + LONGDOUBLE_TYPE r = 1.0; + int i; + assert( E>=0 && E<=307 ); + for(i=0; E!=0; i++, E >>=1){ + if( E & 1 ) r *= x[i]; + } + return r; +#else + LONGDOUBLE_TYPE x = 10.0; + LONGDOUBLE_TYPE r = 1.0; + while(1){ + if( E & 1 ) r *= x; + E >>= 1; + if( E==0 ) break; + x *= x; + } + return r; +#endif +} + +/* +** The string z[] is an text representation of a real number. +** Convert this string to a double and write it into *pResult. +** +** The string z[] is length bytes in length (bytes, not characters) and +** uses the encoding enc. The string is not necessarily zero-terminated. +** +** Return TRUE if the result is a valid real number (or integer) and FALSE +** if the string is empty or contains extraneous text. More specifically +** return +** 1 => The input string is a pure integer +** 2 or more => The input has a decimal point or eNNN clause +** 0 or less => The input string is not a valid number +** -1 => Not a valid number, but has a valid prefix which +** includes a decimal point and/or an eNNN clause +** +** Valid numbers are in one of these formats: +** +** [+-]digits[E[+-]digits] +** [+-]digits.[digits][E[+-]digits] +** [+-].digits[E[+-]digits] +** +** Leading and trailing whitespace is ignored for the purpose of determining +** validity. +** +** If some prefix of the input string is a valid number, this routine +** returns FALSE but it still converts the prefix and writes the result +** into *pResult. +*/ +#if defined(_MSC_VER) +#pragma warning(disable : 4756) +#endif +SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ +#ifndef SQLITE_OMIT_FLOATING_POINT + int incr; + const char *zEnd; + /* sign * significand * (10 ^ (esign * exponent)) */ + int sign = 1; /* sign of significand */ + i64 s = 0; /* significand */ + int d = 0; /* adjust exponent for shifting decimal point */ + int esign = 1; /* sign of exponent */ + int e = 0; /* exponent */ + int eValid = 1; /* True exponent is either not used or is well-formed */ + double result; + int nDigit = 0; /* Number of digits processed */ + int eType = 1; /* 1: pure integer, 2+: fractional -1 or less: bad UTF16 */ + + assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); + *pResult = 0.0; /* Default return value, in case of an error */ + if( length==0 ) return 0; + + if( enc==SQLITE_UTF8 ){ + incr = 1; + zEnd = z + length; + }else{ + int i; + incr = 2; + length &= ~1; + assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + testcase( enc==SQLITE_UTF16LE ); + testcase( enc==SQLITE_UTF16BE ); + for(i=3-enc; i=zEnd ) return 0; + + /* get sign of significand */ + if( *z=='-' ){ + sign = -1; + z+=incr; + }else if( *z=='+' ){ + z+=incr; + } + + /* copy max significant digits to significand */ + while( z=((LARGEST_INT64-9)/10) ){ + /* skip non-significant significand digits + ** (increase exponent by d to shift decimal left) */ + while( z=zEnd ) goto do_atof_calc; + + /* if decimal point is present */ + if( *z=='.' ){ + z+=incr; + eType++; + /* copy digits from after decimal to significand + ** (decrease exponent by d to shift decimal right) */ + while( z=zEnd ) goto do_atof_calc; + + /* if exponent is present */ + if( *z=='e' || *z=='E' ){ + z+=incr; + eValid = 0; + eType++; + + /* This branch is needed to avoid a (harmless) buffer overread. The + ** special comment alerts the mutation tester that the correct answer + ** is obtained even if the branch is omitted */ + if( z>=zEnd ) goto do_atof_calc; /*PREVENTS-HARMLESS-OVERREAD*/ + + /* get sign of exponent */ + if( *z=='-' ){ + esign = -1; + z+=incr; + }else if( *z=='+' ){ + z+=incr; + } + /* copy digits to exponent */ + while( z0 ){ /*OPTIMIZATION-IF-TRUE*/ + if( esign>0 ){ + if( s>=(LARGEST_INT64/10) ) break; /*OPTIMIZATION-IF-FALSE*/ + s *= 10; + }else{ + if( s%10!=0 ) break; /*OPTIMIZATION-IF-FALSE*/ + s /= 10; + } + e--; + } + + /* adjust the sign of significand */ + s = sign<0 ? -s : s; + + if( e==0 ){ /*OPTIMIZATION-IF-TRUE*/ + result = (double)s; + }else{ + /* attempt to handle extremely small/large numbers better */ + if( e>307 ){ /*OPTIMIZATION-IF-TRUE*/ + if( e<342 ){ /*OPTIMIZATION-IF-TRUE*/ + LONGDOUBLE_TYPE scale = sqlite3Pow10(e-308); + if( esign<0 ){ + result = s / scale; + result /= 1.0e+308; + }else{ + result = s * scale; + result *= 1.0e+308; + } + }else{ assert( e>=342 ); + if( esign<0 ){ + result = 0.0*s; + }else{ +#ifdef INFINITY + result = INFINITY*s; +#else + result = 1e308*1e308*s; /* Infinity */ +#endif + } + } + }else{ + LONGDOUBLE_TYPE scale = sqlite3Pow10(e); + if( esign<0 ){ + result = s / scale; + }else{ + result = s * scale; + } + } + } + } + + /* store the result */ + *pResult = result; + + /* return true if number and no extra non-whitespace chracters after */ + if( z==zEnd && nDigit>0 && eValid && eType>0 ){ + return eType; + }else if( eType>=2 && (eType==3 || eValid) && nDigit>0 ){ + return -1; + }else{ + return 0; + } +#else + return !sqlite3Atoi64(z, pResult, length, enc); +#endif /* SQLITE_OMIT_FLOATING_POINT */ +} +#if defined(_MSC_VER) +#pragma warning(default : 4756) +#endif + +/* +** Compare the 19-character string zNum against the text representation +** value 2^63: 9223372036854775808. Return negative, zero, or positive +** if zNum is less than, equal to, or greater than the string. +** Note that zNum must contain exactly 19 characters. +** +** Unlike memcmp() this routine is guaranteed to return the difference +** in the values of the last digit if the only difference is in the +** last digit. So, for example, +** +** compare2pow63("9223372036854775800", 1) +** +** will return -8. +*/ +static int compare2pow63(const char *zNum, int incr){ + int c = 0; + int i; + /* 012345678901234567 */ + const char *pow63 = "922337203685477580"; + for(i=0; c==0 && i<18; i++){ + c = (zNum[i*incr]-pow63[i])*10; + } + if( c==0 ){ + c = zNum[18*incr] - '8'; + testcase( c==(-1) ); + testcase( c==0 ); + testcase( c==(+1) ); + } + return c; +} + +/* +** Convert zNum to a 64-bit signed integer. zNum must be decimal. This +** routine does *not* accept hexadecimal notation. +** +** Returns: +** +** -1 Not even a prefix of the input text looks like an integer +** 0 Successful transformation. Fits in a 64-bit signed integer. +** 1 Excess non-space text after the integer value +** 2 Integer too large for a 64-bit signed integer or is malformed +** 3 Special case of 9223372036854775808 +** +** length is the number of bytes in the string (bytes, not characters). +** The string is not necessarily zero-terminated. The encoding is +** given by enc. +*/ +SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc){ + int incr; + u64 u = 0; + int neg = 0; /* assume positive */ + int i; + int c = 0; + int nonNum = 0; /* True if input contains UTF16 with high byte non-zero */ + int rc; /* Baseline return code */ + const char *zStart; + const char *zEnd = zNum + length; + assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); + if( enc==SQLITE_UTF8 ){ + incr = 1; + }else{ + incr = 2; + assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + for(i=3-enc; i='0' && c<='9'; i+=incr){ + u = u*10 + c - '0'; + } + testcase( i==18*incr ); + testcase( i==19*incr ); + testcase( i==20*incr ); + if( u>LARGEST_INT64 ){ + /* This test and assignment is needed only to suppress UB warnings + ** from clang and -fsanitize=undefined. This test and assignment make + ** the code a little larger and slower, and no harm comes from omitting + ** them, but we must appaise the undefined-behavior pharisees. */ + *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64; + }else if( neg ){ + *pNum = -(i64)u; + }else{ + *pNum = (i64)u; + } + rc = 0; + if( i==0 && zStart==zNum ){ /* No digits */ + rc = -1; + }else if( nonNum ){ /* UTF16 with high-order bytes non-zero */ + rc = 1; + }else if( &zNum[i]19*incr ? 1 : compare2pow63(zNum, incr); + if( c<0 ){ + /* zNum is less than 9223372036854775808 so it fits */ + assert( u<=LARGEST_INT64 ); + return rc; + }else{ + *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64; + if( c>0 ){ + /* zNum is greater than 9223372036854775808 so it overflows */ + return 2; + }else{ + /* zNum is exactly 9223372036854775808. Fits if negative. The + ** special case 2 overflow if positive */ + assert( u-1==LARGEST_INT64 ); + return neg ? rc : 3; + } + } + } +} + +/* +** Transform a UTF-8 integer literal, in either decimal or hexadecimal, +** into a 64-bit signed integer. This routine accepts hexadecimal literals, +** whereas sqlite3Atoi64() does not. +** +** Returns: +** +** 0 Successful transformation. Fits in a 64-bit signed integer. +** 1 Excess text after the integer value +** 2 Integer too large for a 64-bit signed integer or is malformed +** 3 Special case of 9223372036854775808 +*/ +SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char *z, i64 *pOut){ +#ifndef SQLITE_OMIT_HEX_INTEGER + if( z[0]=='0' + && (z[1]=='x' || z[1]=='X') + ){ + u64 u = 0; + int i, k; + for(i=2; z[i]=='0'; i++){} + for(k=i; sqlite3Isxdigit(z[k]); k++){ + u = u*16 + sqlite3HexToInt(z[k]); + } + memcpy(pOut, &u, 8); + return (z[k]==0 && k-i<=16) ? 0 : 2; + }else +#endif /* SQLITE_OMIT_HEX_INTEGER */ + { + return sqlite3Atoi64(z, pOut, sqlite3Strlen30(z), SQLITE_UTF8); + } +} + +/* +** If zNum represents an integer that will fit in 32-bits, then set +** *pValue to that integer and return true. Otherwise return false. +** +** This routine accepts both decimal and hexadecimal notation for integers. +** +** Any non-numeric characters that following zNum are ignored. +** This is different from sqlite3Atoi64() which requires the +** input number to be zero-terminated. +*/ +SQLITE_PRIVATE int sqlite3GetInt32(const char *zNum, int *pValue){ + sqlite_int64 v = 0; + int i, c; + int neg = 0; + if( zNum[0]=='-' ){ + neg = 1; + zNum++; + }else if( zNum[0]=='+' ){ + zNum++; + } +#ifndef SQLITE_OMIT_HEX_INTEGER + else if( zNum[0]=='0' + && (zNum[1]=='x' || zNum[1]=='X') + && sqlite3Isxdigit(zNum[2]) + ){ + u32 u = 0; + zNum += 2; + while( zNum[0]=='0' ) zNum++; + for(i=0; sqlite3Isxdigit(zNum[i]) && i<8; i++){ + u = u*16 + sqlite3HexToInt(zNum[i]); + } + if( (u&0x80000000)==0 && sqlite3Isxdigit(zNum[i])==0 ){ + memcpy(pValue, &u, 4); + return 1; + }else{ + return 0; + } + } +#endif + if( !sqlite3Isdigit(zNum[0]) ) return 0; + while( zNum[0]=='0' ) zNum++; + for(i=0; i<11 && (c = zNum[i] - '0')>=0 && c<=9; i++){ + v = v*10 + c; + } + + /* The longest decimal representation of a 32 bit integer is 10 digits: + ** + ** 1234567890 + ** 2^31 -> 2147483648 + */ + testcase( i==10 ); + if( i>10 ){ + return 0; + } + testcase( v-neg==2147483647 ); + if( v-neg>2147483647 ){ + return 0; + } + if( neg ){ + v = -v; + } + *pValue = (int)v; + return 1; +} + +/* +** Return a 32-bit integer value extracted from a string. If the +** string is not an integer, just return 0. +*/ +SQLITE_PRIVATE int sqlite3Atoi(const char *z){ + int x = 0; + if( z ) sqlite3GetInt32(z, &x); + return x; +} + +/* +** The variable-length integer encoding is as follows: +** +** KEY: +** A = 0xxxxxxx 7 bits of data and one flag bit +** B = 1xxxxxxx 7 bits of data and one flag bit +** C = xxxxxxxx 8 bits of data +** +** 7 bits - A +** 14 bits - BA +** 21 bits - BBA +** 28 bits - BBBA +** 35 bits - BBBBA +** 42 bits - BBBBBA +** 49 bits - BBBBBBA +** 56 bits - BBBBBBBA +** 64 bits - BBBBBBBBC +*/ + +/* +** Write a 64-bit variable-length integer to memory starting at p[0]. +** The length of data write will be between 1 and 9 bytes. The number +** of bytes written is returned. +** +** A variable-length integer consists of the lower 7 bits of each byte +** for all bytes that have the 8th bit set and one byte with the 8th +** bit clear. Except, if we get to the 9th byte, it stores the full +** 8 bits and is the last byte. +*/ +static int SQLITE_NOINLINE putVarint64(unsigned char *p, u64 v){ + int i, j, n; + u8 buf[10]; + if( v & (((u64)0xff000000)<<32) ){ + p[8] = (u8)v; + v >>= 8; + for(i=7; i>=0; i--){ + p[i] = (u8)((v & 0x7f) | 0x80); + v >>= 7; + } + return 9; + } + n = 0; + do{ + buf[n++] = (u8)((v & 0x7f) | 0x80); + v >>= 7; + }while( v!=0 ); + buf[0] &= 0x7f; + assert( n<=9 ); + for(i=0, j=n-1; j>=0; j--, i++){ + p[i] = buf[j]; + } + return n; +} +SQLITE_PRIVATE int sqlite3PutVarint(unsigned char *p, u64 v){ + if( v<=0x7f ){ + p[0] = v&0x7f; + return 1; + } + if( v<=0x3fff ){ + p[0] = ((v>>7)&0x7f)|0x80; + p[1] = v&0x7f; + return 2; + } + return putVarint64(p,v); +} + +/* +** Bitmasks used by sqlite3GetVarint(). These precomputed constants +** are defined here rather than simply putting the constant expressions +** inline in order to work around bugs in the RVT compiler. +** +** SLOT_2_0 A mask for (0x7f<<14) | 0x7f +** +** SLOT_4_2_0 A mask for (0x7f<<28) | SLOT_2_0 +*/ +#define SLOT_2_0 0x001fc07f +#define SLOT_4_2_0 0xf01fc07f + + +/* +** Read a 64-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read. The value is stored in *v. +*/ +SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ + u32 a,b,s; + + if( ((signed char*)p)[0]>=0 ){ + *v = *p; + return 1; + } + if( ((signed char*)p)[1]>=0 ){ + *v = ((u32)(p[0]&0x7f)<<7) | p[1]; + return 2; + } + + /* Verify that constants are precomputed correctly */ + assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) ); + assert( SLOT_4_2_0 == ((0xfU<<28) | (0x7f<<14) | (0x7f)) ); + + a = ((u32)p[0])<<14; + b = p[1]; + p += 2; + a |= *p; + /* a: p0<<14 | p2 (unmasked) */ + if (!(a&0x80)) + { + a &= SLOT_2_0; + b &= 0x7f; + b = b<<7; + a |= b; + *v = a; + return 3; + } + + /* CSE1 from below */ + a &= SLOT_2_0; + p++; + b = b<<14; + b |= *p; + /* b: p1<<14 | p3 (unmasked) */ + if (!(b&0x80)) + { + b &= SLOT_2_0; + /* moved CSE1 up */ + /* a &= (0x7f<<14)|(0x7f); */ + a = a<<7; + a |= b; + *v = a; + return 4; + } + + /* a: p0<<14 | p2 (masked) */ + /* b: p1<<14 | p3 (unmasked) */ + /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + /* moved CSE1 up */ + /* a &= (0x7f<<14)|(0x7f); */ + b &= SLOT_2_0; + s = a; + /* s: p0<<14 | p2 (masked) */ + + p++; + a = a<<14; + a |= *p; + /* a: p0<<28 | p2<<14 | p4 (unmasked) */ + if (!(a&0x80)) + { + /* we can skip these cause they were (effectively) done above + ** while calculating s */ + /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ + /* b &= (0x7f<<14)|(0x7f); */ + b = b<<7; + a |= b; + s = s>>18; + *v = ((u64)s)<<32 | a; + return 5; + } + + /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + s = s<<7; + s |= b; + /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + + p++; + b = b<<14; + b |= *p; + /* b: p1<<28 | p3<<14 | p5 (unmasked) */ + if (!(b&0x80)) + { + /* we can skip this cause it was (effectively) done above in calc'ing s */ + /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ + a &= SLOT_2_0; + a = a<<7; + a |= b; + s = s>>18; + *v = ((u64)s)<<32 | a; + return 6; + } + + p++; + a = a<<14; + a |= *p; + /* a: p2<<28 | p4<<14 | p6 (unmasked) */ + if (!(a&0x80)) + { + a &= SLOT_4_2_0; + b &= SLOT_2_0; + b = b<<7; + a |= b; + s = s>>11; + *v = ((u64)s)<<32 | a; + return 7; + } + + /* CSE2 from below */ + a &= SLOT_2_0; + p++; + b = b<<14; + b |= *p; + /* b: p3<<28 | p5<<14 | p7 (unmasked) */ + if (!(b&0x80)) + { + b &= SLOT_4_2_0; + /* moved CSE2 up */ + /* a &= (0x7f<<14)|(0x7f); */ + a = a<<7; + a |= b; + s = s>>4; + *v = ((u64)s)<<32 | a; + return 8; + } + + p++; + a = a<<15; + a |= *p; + /* a: p4<<29 | p6<<15 | p8 (unmasked) */ + + /* moved CSE2 up */ + /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */ + b &= SLOT_2_0; + b = b<<8; + a |= b; + + s = s<<4; + b = p[-4]; + b &= 0x7f; + b = b>>3; + s |= b; + + *v = ((u64)s)<<32 | a; + + return 9; +} + +/* +** Read a 32-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read. The value is stored in *v. +** +** If the varint stored in p[0] is larger than can fit in a 32-bit unsigned +** integer, then set *v to 0xffffffff. +** +** A MACRO version, getVarint32, is provided which inlines the +** single-byte case. All code should use the MACRO version as +** this function assumes the single-byte case has already been handled. +*/ +SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ + u32 a,b; + + /* The 1-byte case. Overwhelmingly the most common. Handled inline + ** by the getVarin32() macro */ + a = *p; + /* a: p0 (unmasked) */ +#ifndef getVarint32 + if (!(a&0x80)) + { + /* Values between 0 and 127 */ + *v = a; + return 1; + } +#endif + + /* The 2-byte case */ + p++; + b = *p; + /* b: p1 (unmasked) */ + if (!(b&0x80)) + { + /* Values between 128 and 16383 */ + a &= 0x7f; + a = a<<7; + *v = a | b; + return 2; + } + + /* The 3-byte case */ + p++; + a = a<<14; + a |= *p; + /* a: p0<<14 | p2 (unmasked) */ + if (!(a&0x80)) + { + /* Values between 16384 and 2097151 */ + a &= (0x7f<<14)|(0x7f); + b &= 0x7f; + b = b<<7; + *v = a | b; + return 3; + } + + /* A 32-bit varint is used to store size information in btrees. + ** Objects are rarely larger than 2MiB limit of a 3-byte varint. + ** A 3-byte varint is sufficient, for example, to record the size + ** of a 1048569-byte BLOB or string. + ** + ** We only unroll the first 1-, 2-, and 3- byte cases. The very + ** rare larger cases can be handled by the slower 64-bit varint + ** routine. + */ +#if 1 + { + u64 v64; + u8 n; + + p -= 2; + n = sqlite3GetVarint(p, &v64); + assert( n>3 && n<=9 ); + if( (v64 & SQLITE_MAX_U32)!=v64 ){ + *v = 0xffffffff; + }else{ + *v = (u32)v64; + } + return n; + } + +#else + /* For following code (kept for historical record only) shows an + ** unrolling for the 3- and 4-byte varint cases. This code is + ** slightly faster, but it is also larger and much harder to test. + */ + p++; + b = b<<14; + b |= *p; + /* b: p1<<14 | p3 (unmasked) */ + if (!(b&0x80)) + { + /* Values between 2097152 and 268435455 */ + b &= (0x7f<<14)|(0x7f); + a &= (0x7f<<14)|(0x7f); + a = a<<7; + *v = a | b; + return 4; + } + + p++; + a = a<<14; + a |= *p; + /* a: p0<<28 | p2<<14 | p4 (unmasked) */ + if (!(a&0x80)) + { + /* Values between 268435456 and 34359738367 */ + a &= SLOT_4_2_0; + b &= SLOT_4_2_0; + b = b<<7; + *v = a | b; + return 5; + } + + /* We can only reach this point when reading a corrupt database + ** file. In that case we are not in any hurry. Use the (relatively + ** slow) general-purpose sqlite3GetVarint() routine to extract the + ** value. */ + { + u64 v64; + u8 n; + + p -= 4; + n = sqlite3GetVarint(p, &v64); + assert( n>5 && n<=9 ); + *v = (u32)v64; + return n; + } +#endif +} + +/* +** Return the number of bytes that will be needed to store the given +** 64-bit integer. +*/ +SQLITE_PRIVATE int sqlite3VarintLen(u64 v){ + int i; + for(i=1; (v >>= 7)!=0; i++){ assert( i<10 ); } + return i; +} + + +/* +** Read or write a four-byte big-endian integer value. +*/ +SQLITE_PRIVATE u32 sqlite3Get4byte(const u8 *p){ +#if SQLITE_BYTEORDER==4321 + u32 x; + memcpy(&x,p,4); + return x; +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + u32 x; + memcpy(&x,p,4); + return __builtin_bswap32(x); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + u32 x; + memcpy(&x,p,4); + return _byteswap_ulong(x); +#else + testcase( p[0]&0x80 ); + return ((unsigned)p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; +#endif +} +SQLITE_PRIVATE void sqlite3Put4byte(unsigned char *p, u32 v){ +#if SQLITE_BYTEORDER==4321 + memcpy(p,&v,4); +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + u32 x = __builtin_bswap32(v); + memcpy(p,&x,4); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + u32 x = _byteswap_ulong(v); + memcpy(p,&x,4); +#else + p[0] = (u8)(v>>24); + p[1] = (u8)(v>>16); + p[2] = (u8)(v>>8); + p[3] = (u8)v; +#endif +} + + + +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +SQLITE_PRIVATE u8 sqlite3HexToInt(int h){ + assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') ); +#ifdef SQLITE_ASCII + h += 9*(1&(h>>6)); +#endif +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); +#endif + return (u8)(h & 0xf); +} + +#if !defined(SQLITE_OMIT_BLOB_LITERAL) +/* +** Convert a BLOB literal of the form "x'hhhhhh'" into its binary +** value. Return a pointer to its binary value. Space to hold the +** binary value has been obtained from malloc and must be freed by +** the calling routine. +*/ +SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3 *db, const char *z, int n){ + char *zBlob; + int i; + + zBlob = (char *)sqlite3DbMallocRawNN(db, n/2 + 1); + n--; + if( zBlob ){ + for(i=0; imagic; + if( magic!=SQLITE_MAGIC_OPEN ){ + if( sqlite3SafetyCheckSickOrOk(db) ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + logBadConnection("unopened"); + } + return 0; + }else{ + return 1; + } +} +SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ + u32 magic; + magic = db->magic; + if( magic!=SQLITE_MAGIC_SICK && + magic!=SQLITE_MAGIC_OPEN && + magic!=SQLITE_MAGIC_BUSY ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + logBadConnection("invalid"); + return 0; + }else{ + return 1; + } +} + +/* +** Attempt to add, substract, or multiply the 64-bit signed value iB against +** the other 64-bit signed integer at *pA and store the result in *pA. +** Return 0 on success. Or if the operation would have resulted in an +** overflow, leave *pA unchanged and return 1. +*/ +SQLITE_PRIVATE int sqlite3AddInt64(i64 *pA, i64 iB){ +#if GCC_VERSION>=5004000 && !defined(__INTEL_COMPILER) + return __builtin_add_overflow(*pA, iB, pA); +#else + i64 iA = *pA; + testcase( iA==0 ); testcase( iA==1 ); + testcase( iB==-1 ); testcase( iB==0 ); + if( iB>=0 ){ + testcase( iA>0 && LARGEST_INT64 - iA == iB ); + testcase( iA>0 && LARGEST_INT64 - iA == iB - 1 ); + if( iA>0 && LARGEST_INT64 - iA < iB ) return 1; + }else{ + testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 1 ); + testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 2 ); + if( iA<0 && -(iA + LARGEST_INT64) > iB + 1 ) return 1; + } + *pA += iB; + return 0; +#endif +} +SQLITE_PRIVATE int sqlite3SubInt64(i64 *pA, i64 iB){ +#if GCC_VERSION>=5004000 && !defined(__INTEL_COMPILER) + return __builtin_sub_overflow(*pA, iB, pA); +#else + testcase( iB==SMALLEST_INT64+1 ); + if( iB==SMALLEST_INT64 ){ + testcase( (*pA)==(-1) ); testcase( (*pA)==0 ); + if( (*pA)>=0 ) return 1; + *pA -= iB; + return 0; + }else{ + return sqlite3AddInt64(pA, -iB); + } +#endif +} +SQLITE_PRIVATE int sqlite3MulInt64(i64 *pA, i64 iB){ +#if GCC_VERSION>=5004000 && !defined(__INTEL_COMPILER) + return __builtin_mul_overflow(*pA, iB, pA); +#else + i64 iA = *pA; + if( iB>0 ){ + if( iA>LARGEST_INT64/iB ) return 1; + if( iA0 ){ + if( iBLARGEST_INT64/-iB ) return 1; + } + } + *pA = iA*iB; + return 0; +#endif +} + +/* +** Compute the absolute value of a 32-bit signed integer, of possible. Or +** if the integer has a value of -2147483648, return +2147483647 +*/ +SQLITE_PRIVATE int sqlite3AbsInt32(int x){ + if( x>=0 ) return x; + if( x==(int)0x80000000 ) return 0x7fffffff; + return -x; +} + +#ifdef SQLITE_ENABLE_8_3_NAMES +/* +** If SQLITE_ENABLE_8_3_NAMES is set at compile-time and if the database +** filename in zBaseFilename is a URI with the "8_3_names=1" parameter and +** if filename in z[] has a suffix (a.k.a. "extension") that is longer than +** three characters, then shorten the suffix on z[] to be the last three +** characters of the original suffix. +** +** If SQLITE_ENABLE_8_3_NAMES is set to 2 at compile-time, then always +** do the suffix shortening regardless of URI parameter. +** +** Examples: +** +** test.db-journal => test.nal +** test.db-wal => test.wal +** test.db-shm => test.shm +** test.db-mj7f3319fa => test.9fa +*/ +SQLITE_PRIVATE void sqlite3FileSuffix3(const char *zBaseFilename, char *z){ +#if SQLITE_ENABLE_8_3_NAMES<2 + if( sqlite3_uri_boolean(zBaseFilename, "8_3_names", 0) ) +#endif + { + int i, sz; + sz = sqlite3Strlen30(z); + for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} + if( z[i]=='.' && ALWAYS(sz>i+4) ) memmove(&z[i+1], &z[sz-3], 4); + } +} +#endif + +/* +** Find (an approximate) sum of two LogEst values. This computation is +** not a simple "+" operator because LogEst is stored as a logarithmic +** value. +** +*/ +SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst a, LogEst b){ + static const unsigned char x[] = { + 10, 10, /* 0,1 */ + 9, 9, /* 2,3 */ + 8, 8, /* 4,5 */ + 7, 7, 7, /* 6,7,8 */ + 6, 6, 6, /* 9,10,11 */ + 5, 5, 5, /* 12-14 */ + 4, 4, 4, 4, /* 15-18 */ + 3, 3, 3, 3, 3, 3, /* 19-24 */ + 2, 2, 2, 2, 2, 2, 2, /* 25-31 */ + }; + if( a>=b ){ + if( a>b+49 ) return a; + if( a>b+31 ) return a+1; + return a+x[a-b]; + }else{ + if( b>a+49 ) return b; + if( b>a+31 ) return b+1; + return b+x[b-a]; + } +} + +/* +** Convert an integer into a LogEst. In other words, compute an +** approximation for 10*log2(x). +*/ +SQLITE_PRIVATE LogEst sqlite3LogEst(u64 x){ + static LogEst a[] = { 0, 2, 3, 5, 6, 7, 8, 9 }; + LogEst y = 40; + if( x<8 ){ + if( x<2 ) return 0; + while( x<8 ){ y -= 10; x <<= 1; } + }else{ +#if GCC_VERSION>=5004000 + int i = 60 - __builtin_clzll(x); + y += i*10; + x >>= i; +#else + while( x>255 ){ y += 40; x >>= 4; } /*OPTIMIZATION-IF-TRUE*/ + while( x>15 ){ y += 10; x >>= 1; } +#endif + } + return a[x&7] + y - 10; +} + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Convert a double into a LogEst +** In other words, compute an approximation for 10*log2(x). +*/ +SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double x){ + u64 a; + LogEst e; + assert( sizeof(x)==8 && sizeof(a)==8 ); + if( x<=1 ) return 0; + if( x<=2000000000 ) return sqlite3LogEst((u64)x); + memcpy(&a, &x, 8); + e = (a>>52) - 1022; + return e*10; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ + defined(SQLITE_ENABLE_STAT4) || \ + defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) +/* +** Convert a LogEst into an integer. +** +** Note that this routine is only used when one or more of various +** non-standard compile-time options is enabled. +*/ +SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ + u64 n; + n = x%10; + x /= 10; + if( n>=5 ) n -= 2; + else if( n>=1 ) n -= 1; +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ + defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) + if( x>60 ) return (u64)LARGEST_INT64; +#else + /* If only SQLITE_ENABLE_STAT4 is on, then the largest input + ** possible to this routine is 310, resulting in a maximum x of 31 */ + assert( x<=60 ); +#endif + return x>=3 ? (n+8)<<(x-3) : (n+8)>>(3-x); +} +#endif /* defined SCANSTAT or STAT4 or ESTIMATED_ROWS */ + +/* +** Add a new name/number pair to a VList. This might require that the +** VList object be reallocated, so return the new VList. If an OOM +** error occurs, the original VList returned and the +** db->mallocFailed flag is set. +** +** A VList is really just an array of integers. To destroy a VList, +** simply pass it to sqlite3DbFree(). +** +** The first integer is the number of integers allocated for the whole +** VList. The second integer is the number of integers actually used. +** Each name/number pair is encoded by subsequent groups of 3 or more +** integers. +** +** Each name/number pair starts with two integers which are the numeric +** value for the pair and the size of the name/number pair, respectively. +** The text name overlays one or more following integers. The text name +** is always zero-terminated. +** +** Conceptually: +** +** struct VList { +** int nAlloc; // Number of allocated slots +** int nUsed; // Number of used slots +** struct VListEntry { +** int iValue; // Value for this entry +** int nSlot; // Slots used by this entry +** // ... variable name goes here +** } a[0]; +** } +** +** During code generation, pointers to the variable names within the +** VList are taken. When that happens, nAlloc is set to zero as an +** indication that the VList may never again be enlarged, since the +** accompanying realloc() would invalidate the pointers. +*/ +SQLITE_PRIVATE VList *sqlite3VListAdd( + sqlite3 *db, /* The database connection used for malloc() */ + VList *pIn, /* The input VList. Might be NULL */ + const char *zName, /* Name of symbol to add */ + int nName, /* Bytes of text in zName */ + int iVal /* Value to associate with zName */ +){ + int nInt; /* number of sizeof(int) objects needed for zName */ + char *z; /* Pointer to where zName will be stored */ + int i; /* Index in pIn[] where zName is stored */ + + nInt = nName/4 + 3; + assert( pIn==0 || pIn[0]>=3 ); /* Verify ok to add new elements */ + if( pIn==0 || pIn[1]+nInt > pIn[0] ){ + /* Enlarge the allocation */ + sqlite3_int64 nAlloc = (pIn ? 2*(sqlite3_int64)pIn[0] : 10) + nInt; + VList *pOut = sqlite3DbRealloc(db, pIn, nAlloc*sizeof(int)); + if( pOut==0 ) return pIn; + if( pIn==0 ) pOut[1] = 2; + pIn = pOut; + pIn[0] = nAlloc; + } + i = pIn[1]; + pIn[i] = iVal; + pIn[i+1] = nInt; + z = (char*)&pIn[i+2]; + pIn[1] = i+nInt; + assert( pIn[1]<=pIn[0] ); + memcpy(z, zName, nName); + z[nName] = 0; + return pIn; +} + +/* +** Return a pointer to the name of a variable in the given VList that +** has the value iVal. Or return a NULL if there is no such variable in +** the list +*/ +SQLITE_PRIVATE const char *sqlite3VListNumToName(VList *pIn, int iVal){ + int i, mx; + if( pIn==0 ) return 0; + mx = pIn[1]; + i = 2; + do{ + if( pIn[i]==iVal ) return (char*)&pIn[i+2]; + i += pIn[i+1]; + }while( i */ + +/* Turn bulk memory into a hash table object by initializing the +** fields of the Hash structure. +** +** "pNew" is a pointer to the hash table that is to be initialized. +*/ +SQLITE_PRIVATE void sqlite3HashInit(Hash *pNew){ + assert( pNew!=0 ); + pNew->first = 0; + pNew->count = 0; + pNew->htsize = 0; + pNew->ht = 0; +} + +/* Remove all entries from a hash table. Reclaim all memory. +** Call this routine to delete a hash table or to reset a hash table +** to the empty state. +*/ +SQLITE_PRIVATE void sqlite3HashClear(Hash *pH){ + HashElem *elem; /* For looping over all elements of the table */ + + assert( pH!=0 ); + elem = pH->first; + pH->first = 0; + sqlite3_free(pH->ht); + pH->ht = 0; + pH->htsize = 0; + while( elem ){ + HashElem *next_elem = elem->next; + sqlite3_free(elem); + elem = next_elem; + } + pH->count = 0; +} + +/* +** The hashing function. +*/ +static unsigned int strHash(const char *z){ + unsigned int h = 0; + unsigned char c; + while( (c = (unsigned char)*z++)!=0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Knuth multiplicative hashing. (Sorting & Searching, p. 510). + ** 0x9e3779b1 is 2654435761 which is the closest prime number to + ** (2**32)*golden_ratio, where golden_ratio = (sqrt(5) - 1)/2. */ + h += sqlite3UpperToLower[c]; + h *= 0x9e3779b1; + } + return h; +} + + +/* Link pNew element into the hash table pH. If pEntry!=0 then also +** insert pNew into the pEntry hash bucket. +*/ +static void insertElement( + Hash *pH, /* The complete hash table */ + struct _ht *pEntry, /* The entry into which pNew is inserted */ + HashElem *pNew /* The element to be inserted */ +){ + HashElem *pHead; /* First element already in pEntry */ + if( pEntry ){ + pHead = pEntry->count ? pEntry->chain : 0; + pEntry->count++; + pEntry->chain = pNew; + }else{ + pHead = 0; + } + if( pHead ){ + pNew->next = pHead; + pNew->prev = pHead->prev; + if( pHead->prev ){ pHead->prev->next = pNew; } + else { pH->first = pNew; } + pHead->prev = pNew; + }else{ + pNew->next = pH->first; + if( pH->first ){ pH->first->prev = pNew; } + pNew->prev = 0; + pH->first = pNew; + } +} + + +/* Resize the hash table so that it cantains "new_size" buckets. +** +** The hash table might fail to resize if sqlite3_malloc() fails or +** if the new size is the same as the prior size. +** Return TRUE if the resize occurs and false if not. +*/ +static int rehash(Hash *pH, unsigned int new_size){ + struct _ht *new_ht; /* The new hash table */ + HashElem *elem, *next_elem; /* For looping over existing elements */ + +#if SQLITE_MALLOC_SOFT_LIMIT>0 + if( new_size*sizeof(struct _ht)>SQLITE_MALLOC_SOFT_LIMIT ){ + new_size = SQLITE_MALLOC_SOFT_LIMIT/sizeof(struct _ht); + } + if( new_size==pH->htsize ) return 0; +#endif + + /* The inability to allocates space for a larger hash table is + ** a performance hit but it is not a fatal error. So mark the + ** allocation as a benign. Use sqlite3Malloc()/memset(0) instead of + ** sqlite3MallocZero() to make the allocation, as sqlite3MallocZero() + ** only zeroes the requested number of bytes whereas this module will + ** use the actual amount of space allocated for the hash table (which + ** may be larger than the requested amount). + */ + sqlite3BeginBenignMalloc(); + new_ht = (struct _ht *)sqlite3Malloc( new_size*sizeof(struct _ht) ); + sqlite3EndBenignMalloc(); + + if( new_ht==0 ) return 0; + sqlite3_free(pH->ht); + pH->ht = new_ht; + pH->htsize = new_size = sqlite3MallocSize(new_ht)/sizeof(struct _ht); + memset(new_ht, 0, new_size*sizeof(struct _ht)); + for(elem=pH->first, pH->first=0; elem; elem = next_elem){ + unsigned int h = strHash(elem->pKey) % new_size; + next_elem = elem->next; + insertElement(pH, &new_ht[h], elem); + } + return 1; +} + +/* This function (for internal use only) locates an element in an +** hash table that matches the given key. If no element is found, +** a pointer to a static null element with HashElem.data==0 is returned. +** If pH is not NULL, then the hash for this key is written to *pH. +*/ +static HashElem *findElementWithHash( + const Hash *pH, /* The pH to be searched */ + const char *pKey, /* The key we are searching for */ + unsigned int *pHash /* Write the hash value here */ +){ + HashElem *elem; /* Used to loop thru the element list */ + unsigned int count; /* Number of elements left to test */ + unsigned int h; /* The computed hash */ + static HashElem nullElement = { 0, 0, 0, 0 }; + + if( pH->ht ){ /*OPTIMIZATION-IF-TRUE*/ + struct _ht *pEntry; + h = strHash(pKey) % pH->htsize; + pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + }else{ + h = 0; + elem = pH->first; + count = pH->count; + } + if( pHash ) *pHash = h; + while( count-- ){ + assert( elem!=0 ); + if( sqlite3StrICmp(elem->pKey,pKey)==0 ){ + return elem; + } + elem = elem->next; + } + return &nullElement; +} + +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. +*/ +static void removeElementGivenHash( + Hash *pH, /* The pH containing "elem" */ + HashElem* elem, /* The element to be removed from the pH */ + unsigned int h /* Hash value for the element */ +){ + struct _ht *pEntry; + if( elem->prev ){ + elem->prev->next = elem->next; + }else{ + pH->first = elem->next; + } + if( elem->next ){ + elem->next->prev = elem->prev; + } + if( pH->ht ){ + pEntry = &pH->ht[h]; + if( pEntry->chain==elem ){ + pEntry->chain = elem->next; + } + assert( pEntry->count>0 ); + pEntry->count--; + } + sqlite3_free( elem ); + pH->count--; + if( pH->count==0 ){ + assert( pH->first==0 ); + assert( pH->count==0 ); + sqlite3HashClear(pH); + } +} + +/* Attempt to locate an element of the hash table pH with a key +** that matches pKey. Return the data for this element if it is +** found, or NULL if there is no match. +*/ +SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const char *pKey){ + assert( pH!=0 ); + assert( pKey!=0 ); + return findElementWithHash(pH, pKey, 0)->data; +} + +/* Insert an element into the hash table pH. The key is pKey +** and the data is "data". +** +** If no element exists with a matching key, then a new +** element is created and NULL is returned. +** +** If another element already exists with the same key, then the +** new data replaces the old data and the old data is returned. +** The key is not copied in this instance. If a malloc fails, then +** the new data is returned and the hash table is unchanged. +** +** If the "data" parameter to this function is NULL, then the +** element corresponding to "key" is removed from the hash table. +*/ +SQLITE_PRIVATE void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){ + unsigned int h; /* the hash of the key modulo hash table size */ + HashElem *elem; /* Used to loop thru the element list */ + HashElem *new_elem; /* New element added to the pH */ + + assert( pH!=0 ); + assert( pKey!=0 ); + elem = findElementWithHash(pH,pKey,&h); + if( elem->data ){ + void *old_data = elem->data; + if( data==0 ){ + removeElementGivenHash(pH,elem,h); + }else{ + elem->data = data; + elem->pKey = pKey; + } + return old_data; + } + if( data==0 ) return 0; + new_elem = (HashElem*)sqlite3Malloc( sizeof(HashElem) ); + if( new_elem==0 ) return data; + new_elem->pKey = pKey; + new_elem->data = data; + pH->count++; + if( pH->count>=10 && pH->count > 2*pH->htsize ){ + if( rehash(pH, pH->count*2) ){ + assert( pH->htsize>0 ); + h = strHash(pKey) % pH->htsize; + } + } + insertElement(pH, pH->ht ? &pH->ht[h] : 0, new_elem); + return 0; +} + +/************** End of hash.c ************************************************/ +/************** Begin file opcodes.c *****************************************/ +/* Automatically generated. Do not edit */ +/* See the tool/mkopcodec.tcl script for details. */ +#if !defined(SQLITE_OMIT_EXPLAIN) \ + || defined(VDBE_PROFILE) \ + || defined(SQLITE_DEBUG) +#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) || defined(SQLITE_DEBUG) +# define OpHelp(X) "\0" X +#else +# define OpHelp(X) +#endif +SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ + static const char *const azName[] = { + /* 0 */ "Savepoint" OpHelp(""), + /* 1 */ "AutoCommit" OpHelp(""), + /* 2 */ "Transaction" OpHelp(""), + /* 3 */ "SorterNext" OpHelp(""), + /* 4 */ "Prev" OpHelp(""), + /* 5 */ "Next" OpHelp(""), + /* 6 */ "Checkpoint" OpHelp(""), + /* 7 */ "JournalMode" OpHelp(""), + /* 8 */ "Vacuum" OpHelp(""), + /* 9 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"), + /* 10 */ "VUpdate" OpHelp("data=r[P3@P2]"), + /* 11 */ "Goto" OpHelp(""), + /* 12 */ "Gosub" OpHelp(""), + /* 13 */ "InitCoroutine" OpHelp(""), + /* 14 */ "Yield" OpHelp(""), + /* 15 */ "MustBeInt" OpHelp(""), + /* 16 */ "Jump" OpHelp(""), + /* 17 */ "Once" OpHelp(""), + /* 18 */ "If" OpHelp(""), + /* 19 */ "Not" OpHelp("r[P2]= !r[P1]"), + /* 20 */ "IfNot" OpHelp(""), + /* 21 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"), + /* 22 */ "SeekLT" OpHelp("key=r[P3@P4]"), + /* 23 */ "SeekLE" OpHelp("key=r[P3@P4]"), + /* 24 */ "SeekGE" OpHelp("key=r[P3@P4]"), + /* 25 */ "SeekGT" OpHelp("key=r[P3@P4]"), + /* 26 */ "IfNotOpen" OpHelp("if( !csr[P1] ) goto P2"), + /* 27 */ "IfNoHope" OpHelp("key=r[P3@P4]"), + /* 28 */ "NoConflict" OpHelp("key=r[P3@P4]"), + /* 29 */ "NotFound" OpHelp("key=r[P3@P4]"), + /* 30 */ "Found" OpHelp("key=r[P3@P4]"), + /* 31 */ "SeekRowid" OpHelp("intkey=r[P3]"), + /* 32 */ "NotExists" OpHelp("intkey=r[P3]"), + /* 33 */ "Last" OpHelp(""), + /* 34 */ "IfSmaller" OpHelp(""), + /* 35 */ "SorterSort" OpHelp(""), + /* 36 */ "Sort" OpHelp(""), + /* 37 */ "Rewind" OpHelp(""), + /* 38 */ "IdxLE" OpHelp("key=r[P3@P4]"), + /* 39 */ "IdxGT" OpHelp("key=r[P3@P4]"), + /* 40 */ "IdxLT" OpHelp("key=r[P3@P4]"), + /* 41 */ "IdxGE" OpHelp("key=r[P3@P4]"), + /* 42 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), + /* 43 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"), + /* 44 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"), + /* 45 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), + /* 46 */ "Program" OpHelp(""), + /* 47 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), + /* 48 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), + /* 49 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"), + /* 50 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), + /* 51 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), + /* 52 */ "Ne" OpHelp("IF r[P3]!=r[P1]"), + /* 53 */ "Eq" OpHelp("IF r[P3]==r[P1]"), + /* 54 */ "Gt" OpHelp("IF r[P3]>r[P1]"), + /* 55 */ "Le" OpHelp("IF r[P3]<=r[P1]"), + /* 56 */ "Lt" OpHelp("IF r[P3]=r[P1]"), + /* 58 */ "ElseNotEq" OpHelp(""), + /* 59 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), + /* 60 */ "IncrVacuum" OpHelp(""), + /* 61 */ "VNext" OpHelp(""), + /* 62 */ "Init" OpHelp("Start at P2"), + /* 63 */ "PureFunc" OpHelp("r[P3]=func(r[P2@NP])"), + /* 64 */ "Function" OpHelp("r[P3]=func(r[P2@NP])"), + /* 65 */ "Return" OpHelp(""), + /* 66 */ "EndCoroutine" OpHelp(""), + /* 67 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), + /* 68 */ "Halt" OpHelp(""), + /* 69 */ "Integer" OpHelp("r[P2]=P1"), + /* 70 */ "Int64" OpHelp("r[P2]=P4"), + /* 71 */ "String" OpHelp("r[P2]='P4' (len=P1)"), + /* 72 */ "Null" OpHelp("r[P2..P3]=NULL"), + /* 73 */ "SoftNull" OpHelp("r[P1]=NULL"), + /* 74 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), + /* 75 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), + /* 76 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), + /* 77 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), + /* 78 */ "SCopy" OpHelp("r[P2]=r[P1]"), + /* 79 */ "IntCopy" OpHelp("r[P2]=r[P1]"), + /* 80 */ "ResultRow" OpHelp("output=r[P1@P2]"), + /* 81 */ "CollSeq" OpHelp(""), + /* 82 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), + /* 83 */ "RealAffinity" OpHelp(""), + /* 84 */ "Cast" OpHelp("affinity(r[P1])"), + /* 85 */ "Permutation" OpHelp(""), + /* 86 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), + /* 87 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), + /* 88 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), + /* 89 */ "Column" OpHelp("r[P3]=PX"), + /* 90 */ "Affinity" OpHelp("affinity(r[P1@P2])"), + /* 91 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 92 */ "Count" OpHelp("r[P2]=count()"), + /* 93 */ "ReadCookie" OpHelp(""), + /* 94 */ "SetCookie" OpHelp(""), + /* 95 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), + /* 96 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 97 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), + /* 98 */ "OpenDup" OpHelp(""), + /* 99 */ "OpenAutoindex" OpHelp("nColumn=P2"), + /* 100 */ "OpenEphemeral" OpHelp("nColumn=P2"), + /* 101 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), + /* 102 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), + /* 103 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), + /* 105 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), + /* 106 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), + /* 107 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), + /* 108 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), + /* 109 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), + /* 110 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), + /* 111 */ "SorterOpen" OpHelp(""), + /* 112 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), + /* 113 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), + /* 114 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), + /* 115 */ "String8" OpHelp("r[P2]='P4'"), + /* 116 */ "Close" OpHelp(""), + /* 117 */ "ColumnsUsed" OpHelp(""), + /* 118 */ "SeekHit" OpHelp("seekHit=P2"), + /* 119 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), + /* 120 */ "NewRowid" OpHelp("r[P2]=rowid"), + /* 121 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), + /* 122 */ "Delete" OpHelp(""), + /* 123 */ "ResetCount" OpHelp(""), + /* 124 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), + /* 125 */ "SorterData" OpHelp("r[P2]=data"), + /* 126 */ "RowData" OpHelp("r[P2]=data"), + /* 127 */ "Rowid" OpHelp("r[P2]=rowid"), + /* 128 */ "NullRow" OpHelp(""), + /* 129 */ "SeekEnd" OpHelp(""), + /* 130 */ "IdxInsert" OpHelp("key=r[P2]"), + /* 131 */ "SorterInsert" OpHelp("key=r[P2]"), + /* 132 */ "IdxDelete" OpHelp("key=r[P2@P3]"), + /* 133 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"), + /* 134 */ "IdxRowid" OpHelp("r[P2]=rowid"), + /* 135 */ "FinishSeek" OpHelp(""), + /* 136 */ "Destroy" OpHelp(""), + /* 137 */ "Clear" OpHelp(""), + /* 138 */ "ResetSorter" OpHelp(""), + /* 139 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"), + /* 140 */ "SqlExec" OpHelp(""), + /* 141 */ "ParseSchema" OpHelp(""), + /* 142 */ "LoadAnalysis" OpHelp(""), + /* 143 */ "DropTable" OpHelp(""), + /* 144 */ "DropIndex" OpHelp(""), + /* 145 */ "DropTrigger" OpHelp(""), + /* 146 */ "IntegrityCk" OpHelp(""), + /* 147 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 148 */ "Param" OpHelp(""), + /* 149 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 150 */ "Real" OpHelp("r[P2]=P4"), + /* 151 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 152 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), + /* 153 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), + /* 154 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 155 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 156 */ "AggValue" OpHelp("r[P3]=value N=P2"), + /* 157 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 158 */ "Expire" OpHelp(""), + /* 159 */ "CursorLock" OpHelp(""), + /* 160 */ "CursorUnlock" OpHelp(""), + /* 161 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 162 */ "VBegin" OpHelp(""), + /* 163 */ "VCreate" OpHelp(""), + /* 164 */ "VDestroy" OpHelp(""), + /* 165 */ "VOpen" OpHelp(""), + /* 166 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 167 */ "VRename" OpHelp(""), + /* 168 */ "Pagecount" OpHelp(""), + /* 169 */ "MaxPgcnt" OpHelp(""), + /* 170 */ "Trace" OpHelp(""), + /* 171 */ "CursorHint" OpHelp(""), + /* 172 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), + /* 173 */ "Noop" OpHelp(""), + /* 174 */ "Explain" OpHelp(""), + /* 175 */ "Abortable" OpHelp(""), + }; + return azName[i]; +} +#endif + +/************** End of opcodes.c *********************************************/ +/************** Begin file os_unix.c *****************************************/ +/* +** 2004 May 22 +** +** 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 the VFS implementation for unix-like operating systems +** include Linux, MacOSX, *BSD, QNX, VxWorks, AIX, HPUX, and others. +** +** There are actually several different VFS implementations in this file. +** The differences are in the way that file locking is done. The default +** implementation uses Posix Advisory Locks. Alternative implementations +** use flock(), dot-files, various proprietary locking schemas, or simply +** skip locking all together. +** +** This source file is organized into divisions where the logic for various +** subfunctions is contained within the appropriate division. PLEASE +** KEEP THE STRUCTURE OF THIS FILE INTACT. New code should be placed +** in the correct division and should be clearly labeled. +** +** The layout of divisions is as follows: +** +** * General-purpose declarations and utility functions. +** * Unique file ID logic used by VxWorks. +** * Various locking primitive implementations (all except proxy locking): +** + for Posix Advisory Locks +** + for no-op locks +** + for dot-file locks +** + for flock() locking +** + for named semaphore locks (VxWorks only) +** + for AFP filesystem locks (MacOSX only) +** * sqlite3_file methods not associated with locking. +** * Definitions of sqlite3_io_methods objects for all locking +** methods plus "finder" functions for each locking method. +** * sqlite3_vfs method implementations. +** * Locking primitives for the proxy uber-locking-method. (MacOSX only) +** * Definitions of sqlite3_vfs objects for all locking methods +** plus implementations of sqlite3_os_init() and sqlite3_os_end(). +*/ +/* #include "sqliteInt.h" */ +#if SQLITE_OS_UNIX /* This file is used on unix only */ + +/* +** There are various methods for file locking used for concurrency +** control: +** +** 1. POSIX locking (the default), +** 2. No locking, +** 3. Dot-file locking, +** 4. flock() locking, +** 5. AFP locking (OSX only), +** 6. Named POSIX semaphores (VXWorks only), +** 7. proxy locking. (OSX only) +** +** Styles 4, 5, and 7 are only available of SQLITE_ENABLE_LOCKING_STYLE +** is defined to 1. The SQLITE_ENABLE_LOCKING_STYLE also enables automatic +** selection of the appropriate locking style based on the filesystem +** where the database is located. +*/ +#if !defined(SQLITE_ENABLE_LOCKING_STYLE) +# if defined(__APPLE__) +# define SQLITE_ENABLE_LOCKING_STYLE 1 +# else +# define SQLITE_ENABLE_LOCKING_STYLE 0 +# endif +#endif + +/* Use pread() and pwrite() if they are available */ +#if defined(__APPLE__) +# define HAVE_PREAD 1 +# define HAVE_PWRITE 1 +#endif +#if defined(HAVE_PREAD64) && defined(HAVE_PWRITE64) +# undef USE_PREAD +# define USE_PREAD64 1 +#elif defined(HAVE_PREAD) && defined(HAVE_PWRITE) +# undef USE_PREAD64 +# define USE_PREAD 1 +#endif + +/* +** standard include files. +*/ +#include +#include +#include +#include +#include +/* #include */ +#include +#include +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 +# include +#endif + +#if SQLITE_ENABLE_LOCKING_STYLE +/* # include */ +# include +# include +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + +/* +** Try to determine if gethostuuid() is available based on standard +** macros. This might sometimes compute the wrong value for some +** obscure platforms. For those cases, simply compile with one of +** the following: +** +** -DHAVE_GETHOSTUUID=0 +** -DHAVE_GETHOSTUUID=1 +** +** None if this matters except when building on Apple products with +** -DSQLITE_ENABLE_LOCKING_STYLE. +*/ +#ifndef HAVE_GETHOSTUUID +# define HAVE_GETHOSTUUID 0 +# if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \ + (__IPHONE_OS_VERSION_MIN_REQUIRED > 2000)) +# if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \ + && (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0)) +# undef HAVE_GETHOSTUUID +# define HAVE_GETHOSTUUID 1 +# else +# warning "gethostuuid() is disabled." +# endif +# endif +#endif + + +#if OS_VXWORKS +/* # include */ +# include +# include +#endif /* OS_VXWORKS */ + +#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE +# include +#endif + +#ifdef HAVE_UTIME +# include +#endif + +/* +** Allowed values of unixFile.fsFlags +*/ +#define SQLITE_FSFLAGS_IS_MSDOS 0x1 + +/* +** If we are to be thread-safe, include the pthreads header. +*/ +#if SQLITE_THREADSAFE +/* # include */ +#endif + +/* +** Default permissions when creating a new file +*/ +#ifndef SQLITE_DEFAULT_FILE_PERMISSIONS +# define SQLITE_DEFAULT_FILE_PERMISSIONS 0644 +#endif + +/* +** Default permissions when creating auto proxy dir +*/ +#ifndef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS +# define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755 +#endif + +/* +** Maximum supported path-length. +*/ +#define MAX_PATHNAME 512 + +/* +** Maximum supported symbolic links +*/ +#define SQLITE_MAX_SYMLINKS 100 + +/* Always cast the getpid() return type for compatibility with +** kernel modules in VxWorks. */ +#define osGetpid(X) (pid_t)getpid() + +/* +** Only set the lastErrno if the error code is a real error and not +** a normal expected return code of SQLITE_BUSY or SQLITE_OK +*/ +#define IS_LOCK_ERROR(x) ((x != SQLITE_OK) && (x != SQLITE_BUSY)) + +/* Forward references */ +typedef struct unixShm unixShm; /* Connection shared memory */ +typedef struct unixShmNode unixShmNode; /* Shared memory instance */ +typedef struct unixInodeInfo unixInodeInfo; /* An i-node */ +typedef struct UnixUnusedFd UnixUnusedFd; /* An unused file descriptor */ + +/* +** Sometimes, after a file handle is closed by SQLite, the file descriptor +** cannot be closed immediately. In these cases, instances of the following +** structure are used to store the file descriptor while waiting for an +** opportunity to either close or reuse it. +*/ +struct UnixUnusedFd { + int fd; /* File descriptor to close */ + int flags; /* Flags this file descriptor was opened with */ + UnixUnusedFd *pNext; /* Next unused file descriptor on same file */ +}; + +/* +** The unixFile structure is subclass of sqlite3_file specific to the unix +** VFS implementations. +*/ +typedef struct unixFile unixFile; +struct unixFile { + sqlite3_io_methods const *pMethod; /* Always the first entry */ + sqlite3_vfs *pVfs; /* The VFS that created this unixFile */ + unixInodeInfo *pInode; /* Info about locks on this inode */ + int h; /* The file descriptor */ + unsigned char eFileLock; /* The type of lock held on this fd */ + unsigned short int ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */ + int lastErrno; /* The unix errno from last I/O error */ + void *lockingContext; /* Locking style specific state */ + UnixUnusedFd *pPreallocatedUnused; /* Pre-allocated UnixUnusedFd */ + const char *zPath; /* Name of the file */ + unixShm *pShm; /* Shared memory segment information */ + int szChunk; /* Configured by FCNTL_CHUNK_SIZE */ +#if SQLITE_MAX_MMAP_SIZE>0 + int nFetchOut; /* Number of outstanding xFetch refs */ + sqlite3_int64 mmapSize; /* Usable size of mapping at pMapRegion */ + sqlite3_int64 mmapSizeActual; /* Actual size of mapping at pMapRegion */ + sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ + void *pMapRegion; /* Memory mapped region */ +#endif + int sectorSize; /* Device sector size */ + int deviceCharacteristics; /* Precomputed device characteristics */ +#if SQLITE_ENABLE_LOCKING_STYLE + int openFlags; /* The flags specified at open() */ +#endif +#if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__) + unsigned fsFlags; /* cached details from statfs() */ +#endif +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + unsigned iBusyTimeout; /* Wait this many millisec on locks */ +#endif +#if OS_VXWORKS + struct vxworksFileId *pId; /* Unique file ID */ +#endif +#ifdef SQLITE_DEBUG + /* The next group of variables are used to track whether or not the + ** transaction counter in bytes 24-27 of database files are updated + ** whenever any part of the database changes. An assertion fault will + ** occur if a file is updated without also updating the transaction + ** counter. This test is made to avoid new problems similar to the + ** one described by ticket #3584. + */ + unsigned char transCntrChng; /* True if the transaction counter changed */ + unsigned char dbUpdate; /* True if any part of database file changed */ + unsigned char inNormalWrite; /* True if in a normal write operation */ + +#endif + +#ifdef SQLITE_TEST + /* In test mode, increase the size of this structure a bit so that + ** it is larger than the struct CrashFile defined in test6.c. + */ + char aPadding[32]; +#endif +}; + +/* This variable holds the process id (pid) from when the xRandomness() +** method was called. If xOpen() is called from a different process id, +** indicating that a fork() has occurred, the PRNG will be reset. +*/ +static pid_t randomnessPid = 0; + +/* +** Allowed values for the unixFile.ctrlFlags bitmask: +*/ +#define UNIXFILE_EXCL 0x01 /* Connections from one process only */ +#define UNIXFILE_RDONLY 0x02 /* Connection is read only */ +#define UNIXFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */ +#ifndef SQLITE_DISABLE_DIRSYNC +# define UNIXFILE_DIRSYNC 0x08 /* Directory sync needed */ +#else +# define UNIXFILE_DIRSYNC 0x00 +#endif +#define UNIXFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */ +#define UNIXFILE_DELETE 0x20 /* Delete on close */ +#define UNIXFILE_URI 0x40 /* Filename might have query parameters */ +#define UNIXFILE_NOLOCK 0x80 /* Do no file locking */ + +/* +** Include code that is common to all os_*.c files +*/ +/************** Include os_common.h in the middle of os_unix.c ***************/ +/************** Begin file os_common.h ***************************************/ +/* +** 2004 May 22 +** +** 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 macros and a little bit of code that is common to +** all of the platform-specific files (os_*.c) and is #included into those +** files. +** +** This file should be #included by the os_*.c files only. It is not a +** general purpose header file. +*/ +#ifndef _OS_COMMON_H_ +#define _OS_COMMON_H_ + +/* +** At least two bugs have slipped in because we changed the MEMORY_DEBUG +** macro to SQLITE_DEBUG and some older makefiles have not yet made the +** switch. The following code should catch this problem at compile-time. +*/ +#ifdef MEMORY_DEBUG +# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." +#endif + +/* +** Macros for performance tracing. Normally turned off. Only works +** on i486 hardware. +*/ +#ifdef SQLITE_PERFORMANCE_TRACE + +/* +** hwtime.h contains inline assembler code for implementing +** high-performance timing routines. +*/ +/************** Include hwtime.h in the middle of os_common.h ****************/ +/************** Begin file hwtime.h ******************************************/ +/* +** 2008 May 27 +** +** 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 inline asm code for retrieving "high-performance" +** counters for x86 and x86_64 class CPUs. +*/ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H + +/* +** The following routine only works on pentium-class (or newer) processors. +** It uses the RDTSC opcode to read the cycle count value out of the +** processor and returns that value. This can be used for high-res +** profiling. +*/ +#if !defined(__STRICT_ANSI__) && \ + (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) + + #if defined(__GNUC__) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + + #elif defined(_MSC_VER) + + __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ + __asm { + rdtsc + ret ; return value at EDX:EAX + } + } + + #endif + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long val; + __asm__ __volatile__ ("rdtsc" : "=A" (val)); + return val; + } + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long long retval; + unsigned long junk; + __asm__ __volatile__ ("\n\ + 1: mftbu %1\n\ + mftb %L0\n\ + mftbu %0\n\ + cmpw %0,%1\n\ + bne 1b" + : "=r" (retval), "=r" (junk)); + return retval; + } + +#else + + /* + ** asm() is needed for hardware timing support. Without asm(), + ** disable the sqlite3Hwtime() routine. + ** + ** sqlite3Hwtime() is only used for some obscure debugging + ** and analysis configurations, not in any deliverable, so this + ** should not be a great loss. + */ +SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } + +#endif + +#endif /* !defined(SQLITE_HWTIME_H) */ + +/************** End of hwtime.h **********************************************/ +/************** Continuing where we left off in os_common.h ******************/ + +static sqlite_uint64 g_start; +static sqlite_uint64 g_elapsed; +#define TIMER_START g_start=sqlite3Hwtime() +#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start +#define TIMER_ELAPSED g_elapsed +#else +#define TIMER_START +#define TIMER_END +#define TIMER_ELAPSED ((sqlite_uint64)0) +#endif + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_io_error_hit; +SQLITE_API extern int sqlite3_io_error_hardhit; +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_persist; +SQLITE_API extern int sqlite3_io_error_benign; +SQLITE_API extern int sqlite3_diskfull_pending; +SQLITE_API extern int sqlite3_diskfull; +#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) +#define SimulateIOError(CODE) \ + if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ + || sqlite3_io_error_pending-- == 1 ) \ + { local_ioerr(); CODE; } +static void local_ioerr(){ + IOTRACE(("IOERR\n")); + sqlite3_io_error_hit++; + if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++; +} +#define SimulateDiskfullError(CODE) \ + if( sqlite3_diskfull_pending ){ \ + if( sqlite3_diskfull_pending == 1 ){ \ + local_ioerr(); \ + sqlite3_diskfull = 1; \ + sqlite3_io_error_hit = 1; \ + CODE; \ + }else{ \ + sqlite3_diskfull_pending--; \ + } \ + } +#else +#define SimulateIOErrorBenign(X) +#define SimulateIOError(A) +#define SimulateDiskfullError(A) +#endif /* defined(SQLITE_TEST) */ + +/* +** When testing, keep a count of the number of open files. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_open_file_count; +#define OpenCounter(X) sqlite3_open_file_count+=(X) +#else +#define OpenCounter(X) +#endif /* defined(SQLITE_TEST) */ + +#endif /* !defined(_OS_COMMON_H_) */ + +/************** End of os_common.h *******************************************/ +/************** Continuing where we left off in os_unix.c ********************/ + +/* +** Define various macros that are missing from some systems. +*/ +#ifndef O_LARGEFILE +# define O_LARGEFILE 0 +#endif +#ifdef SQLITE_DISABLE_LFS +# undef O_LARGEFILE +# define O_LARGEFILE 0 +#endif +#ifndef O_NOFOLLOW +# define O_NOFOLLOW 0 +#endif +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +/* +** The threadid macro resolves to the thread-id or to 0. Used for +** testing and debugging only. +*/ +#if SQLITE_THREADSAFE +#define threadid pthread_self() +#else +#define threadid 0 +#endif + +/* +** HAVE_MREMAP defaults to true on Linux and false everywhere else. +*/ +#if !defined(HAVE_MREMAP) +# if defined(__linux__) && defined(_GNU_SOURCE) +# define HAVE_MREMAP 1 +# else +# define HAVE_MREMAP 0 +# endif +#endif + +/* +** Explicitly call the 64-bit version of lseek() on Android. Otherwise, lseek() +** is the 32-bit version, even if _FILE_OFFSET_BITS=64 is defined. +*/ +#ifdef __ANDROID__ +# define lseek lseek64 +#endif + +#ifdef __linux__ +/* +** Linux-specific IOCTL magic numbers used for controlling F2FS +*/ +#define F2FS_IOCTL_MAGIC 0xf5 +#define F2FS_IOC_START_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 1) +#define F2FS_IOC_COMMIT_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 2) +#define F2FS_IOC_START_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 3) +#define F2FS_IOC_ABORT_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 5) +#define F2FS_IOC_GET_FEATURES _IOR(F2FS_IOCTL_MAGIC, 12, u32) +#define F2FS_FEATURE_ATOMIC_WRITE 0x0004 +#endif /* __linux__ */ + + +/* +** Different Unix systems declare open() in different ways. Same use +** open(const char*,int,mode_t). Others use open(const char*,int,...). +** The difference is important when using a pointer to the function. +** +** The safest way to deal with the problem is to always use this wrapper +** which always has the same well-defined interface. +*/ +static int posixOpen(const char *zFile, int flags, int mode){ + return open(zFile, flags, mode); +} + +/* Forward reference */ +static int openDirectory(const char*, int*); +static int unixGetpagesize(void); + +/* +** Many system calls are accessed through pointer-to-functions so that +** they may be overridden at runtime to facilitate fault injection during +** testing and sandboxing. The following array holds the names and pointers +** to all overrideable system calls. +*/ +static struct unix_syscall { + const char *zName; /* Name of the system call */ + sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ + sqlite3_syscall_ptr pDefault; /* Default value */ +} aSyscall[] = { + { "open", (sqlite3_syscall_ptr)posixOpen, 0 }, +#define osOpen ((int(*)(const char*,int,int))aSyscall[0].pCurrent) + + { "close", (sqlite3_syscall_ptr)close, 0 }, +#define osClose ((int(*)(int))aSyscall[1].pCurrent) + + { "access", (sqlite3_syscall_ptr)access, 0 }, +#define osAccess ((int(*)(const char*,int))aSyscall[2].pCurrent) + + { "getcwd", (sqlite3_syscall_ptr)getcwd, 0 }, +#define osGetcwd ((char*(*)(char*,size_t))aSyscall[3].pCurrent) + + { "stat", (sqlite3_syscall_ptr)stat, 0 }, +#define osStat ((int(*)(const char*,struct stat*))aSyscall[4].pCurrent) + +/* +** The DJGPP compiler environment looks mostly like Unix, but it +** lacks the fcntl() system call. So redefine fcntl() to be something +** that always succeeds. This means that locking does not occur under +** DJGPP. But it is DOS - what did you expect? +*/ +#ifdef __DJGPP__ + { "fstat", 0, 0 }, +#define osFstat(a,b,c) 0 +#else + { "fstat", (sqlite3_syscall_ptr)fstat, 0 }, +#define osFstat ((int(*)(int,struct stat*))aSyscall[5].pCurrent) +#endif + + { "ftruncate", (sqlite3_syscall_ptr)ftruncate, 0 }, +#define osFtruncate ((int(*)(int,off_t))aSyscall[6].pCurrent) + + { "fcntl", (sqlite3_syscall_ptr)fcntl, 0 }, +#define osFcntl ((int(*)(int,int,...))aSyscall[7].pCurrent) + + { "read", (sqlite3_syscall_ptr)read, 0 }, +#define osRead ((ssize_t(*)(int,void*,size_t))aSyscall[8].pCurrent) + +#if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE + { "pread", (sqlite3_syscall_ptr)pread, 0 }, +#else + { "pread", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPread ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[9].pCurrent) + +#if defined(USE_PREAD64) + { "pread64", (sqlite3_syscall_ptr)pread64, 0 }, +#else + { "pread64", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPread64 ((ssize_t(*)(int,void*,size_t,off64_t))aSyscall[10].pCurrent) + + { "write", (sqlite3_syscall_ptr)write, 0 }, +#define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) + +#if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE + { "pwrite", (sqlite3_syscall_ptr)pwrite, 0 }, +#else + { "pwrite", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPwrite ((ssize_t(*)(int,const void*,size_t,off_t))\ + aSyscall[12].pCurrent) + +#if defined(USE_PREAD64) + { "pwrite64", (sqlite3_syscall_ptr)pwrite64, 0 }, +#else + { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off64_t))\ + aSyscall[13].pCurrent) + + { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, +#define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) + +#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE + { "fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0 }, +#else + { "fallocate", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) + + { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, +#define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) + + { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, +#define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) + + { "mkdir", (sqlite3_syscall_ptr)mkdir, 0 }, +#define osMkdir ((int(*)(const char*,mode_t))aSyscall[18].pCurrent) + + { "rmdir", (sqlite3_syscall_ptr)rmdir, 0 }, +#define osRmdir ((int(*)(const char*))aSyscall[19].pCurrent) + +#if defined(HAVE_FCHOWN) + { "fchown", (sqlite3_syscall_ptr)fchown, 0 }, +#else + { "fchown", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent) + +#if defined(HAVE_FCHOWN) + { "geteuid", (sqlite3_syscall_ptr)geteuid, 0 }, +#else + { "geteuid", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent) + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "mmap", (sqlite3_syscall_ptr)mmap, 0 }, +#else + { "mmap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[22].pCurrent) + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "munmap", (sqlite3_syscall_ptr)munmap, 0 }, +#else + { "munmap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMunmap ((int(*)(void*,size_t))aSyscall[23].pCurrent) + +#if HAVE_MREMAP && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) + { "mremap", (sqlite3_syscall_ptr)mremap, 0 }, +#else + { "mremap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[24].pCurrent) + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "getpagesize", (sqlite3_syscall_ptr)unixGetpagesize, 0 }, +#else + { "getpagesize", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osGetpagesize ((int(*)(void))aSyscall[25].pCurrent) + +#if defined(HAVE_READLINK) + { "readlink", (sqlite3_syscall_ptr)readlink, 0 }, +#else + { "readlink", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osReadlink ((ssize_t(*)(const char*,char*,size_t))aSyscall[26].pCurrent) + +#if defined(HAVE_LSTAT) + { "lstat", (sqlite3_syscall_ptr)lstat, 0 }, +#else + { "lstat", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osLstat ((int(*)(const char*,struct stat*))aSyscall[27].pCurrent) + +#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) +# ifdef __ANDROID__ + { "ioctl", (sqlite3_syscall_ptr)(int(*)(int, int, ...))ioctl, 0 }, +#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent) +# else + { "ioctl", (sqlite3_syscall_ptr)ioctl, 0 }, +#define osIoctl ((int(*)(int,unsigned long,...))aSyscall[28].pCurrent) +# endif +#else + { "ioctl", (sqlite3_syscall_ptr)0, 0 }, +#endif + +}; /* End of the overrideable system calls */ + + +/* +** On some systems, calls to fchown() will trigger a message in a security +** log if they come from non-root processes. So avoid calling fchown() if +** we are not running as root. +*/ +static int robustFchown(int fd, uid_t uid, gid_t gid){ +#if defined(HAVE_FCHOWN) + return osGeteuid() ? 0 : osFchown(fd,uid,gid); +#else + return 0; +#endif +} + +/* +** This is the xSetSystemCall() method of sqlite3_vfs for all of the +** "unix" VFSes. Return SQLITE_OK opon successfully updating the +** system call pointer, or SQLITE_NOTFOUND if there is no configurable +** system call named zName. +*/ +static int unixSetSystemCall( + sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */ + const char *zName, /* Name of system call to override */ + sqlite3_syscall_ptr pNewFunc /* Pointer to new system call value */ +){ + unsigned int i; + int rc = SQLITE_NOTFOUND; + + UNUSED_PARAMETER(pNotUsed); + if( zName==0 ){ + /* If no zName is given, restore all system calls to their default + ** settings and return NULL + */ + rc = SQLITE_OK; + for(i=0; i=SQLITE_MINIMUM_FILE_DESCRIPTOR ) break; + osClose(fd); + sqlite3_log(SQLITE_WARNING, + "attempt to open \"%s\" as file descriptor %d", z, fd); + fd = -1; + if( osOpen("/dev/null", O_RDONLY, m)<0 ) break; + } + if( fd>=0 ){ + if( m!=0 ){ + struct stat statbuf; + if( osFstat(fd, &statbuf)==0 + && statbuf.st_size==0 + && (statbuf.st_mode&0777)!=m + ){ + osFchmod(fd, m); + } + } +#if defined(FD_CLOEXEC) && (!defined(O_CLOEXEC) || O_CLOEXEC==0) + osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); +#endif + } + return fd; +} + +/* +** Helper functions to obtain and relinquish the global mutex. The +** global mutex is used to protect the unixInodeInfo and +** vxworksFileId objects used by this file, all of which may be +** shared by multiple threads. +** +** Function unixMutexHeld() is used to assert() that the global mutex +** is held when required. This function is only used as part of assert() +** statements. e.g. +** +** unixEnterMutex() +** assert( unixMutexHeld() ); +** unixEnterLeave() +** +** To prevent deadlock, the global unixBigLock must must be acquired +** before the unixInodeInfo.pLockMutex mutex, if both are held. It is +** OK to get the pLockMutex without holding unixBigLock first, but if +** that happens, the unixBigLock mutex must not be acquired until after +** pLockMutex is released. +** +** OK: enter(unixBigLock), enter(pLockInfo) +** OK: enter(unixBigLock) +** OK: enter(pLockInfo) +** ERROR: enter(pLockInfo), enter(unixBigLock) +*/ +static sqlite3_mutex *unixBigLock = 0; +static void unixEnterMutex(void){ + assert( sqlite3_mutex_notheld(unixBigLock) ); /* Not a recursive mutex */ + sqlite3_mutex_enter(unixBigLock); +} +static void unixLeaveMutex(void){ + assert( sqlite3_mutex_held(unixBigLock) ); + sqlite3_mutex_leave(unixBigLock); +} +#ifdef SQLITE_DEBUG +static int unixMutexHeld(void) { + return sqlite3_mutex_held(unixBigLock); +} +#endif + + +#ifdef SQLITE_HAVE_OS_TRACE +/* +** Helper function for printing out trace information from debugging +** binaries. This returns the string representation of the supplied +** integer lock-type. +*/ +static const char *azFileLock(int eFileLock){ + switch( eFileLock ){ + case NO_LOCK: return "NONE"; + case SHARED_LOCK: return "SHARED"; + case RESERVED_LOCK: return "RESERVED"; + case PENDING_LOCK: return "PENDING"; + case EXCLUSIVE_LOCK: return "EXCLUSIVE"; + } + return "ERROR"; +} +#endif + +#ifdef SQLITE_LOCK_TRACE +/* +** Print out information about all locking operations. +** +** This routine is used for troubleshooting locks on multithreaded +** platforms. Enable by compiling with the -DSQLITE_LOCK_TRACE +** command-line option on the compiler. This code is normally +** turned off. +*/ +static int lockTrace(int fd, int op, struct flock *p){ + char *zOpName, *zType; + int s; + int savedErrno; + if( op==F_GETLK ){ + zOpName = "GETLK"; + }else if( op==F_SETLK ){ + zOpName = "SETLK"; + }else{ + s = osFcntl(fd, op, p); + sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s); + return s; + } + if( p->l_type==F_RDLCK ){ + zType = "RDLCK"; + }else if( p->l_type==F_WRLCK ){ + zType = "WRLCK"; + }else if( p->l_type==F_UNLCK ){ + zType = "UNLCK"; + }else{ + assert( 0 ); + } + assert( p->l_whence==SEEK_SET ); + s = osFcntl(fd, op, p); + savedErrno = errno; + sqlite3DebugPrintf("fcntl %d %d %s %s %d %d %d %d\n", + threadid, fd, zOpName, zType, (int)p->l_start, (int)p->l_len, + (int)p->l_pid, s); + if( s==(-1) && op==F_SETLK && (p->l_type==F_RDLCK || p->l_type==F_WRLCK) ){ + struct flock l2; + l2 = *p; + osFcntl(fd, F_GETLK, &l2); + if( l2.l_type==F_RDLCK ){ + zType = "RDLCK"; + }else if( l2.l_type==F_WRLCK ){ + zType = "WRLCK"; + }else if( l2.l_type==F_UNLCK ){ + zType = "UNLCK"; + }else{ + assert( 0 ); + } + sqlite3DebugPrintf("fcntl-failure-reason: %s %d %d %d\n", + zType, (int)l2.l_start, (int)l2.l_len, (int)l2.l_pid); + } + errno = savedErrno; + return s; +} +#undef osFcntl +#define osFcntl lockTrace +#endif /* SQLITE_LOCK_TRACE */ + +/* +** Retry ftruncate() calls that fail due to EINTR +** +** All calls to ftruncate() within this file should be made through +** this wrapper. On the Android platform, bypassing the logic below +** could lead to a corrupt database. +*/ +static int robust_ftruncate(int h, sqlite3_int64 sz){ + int rc; +#ifdef __ANDROID__ + /* On Android, ftruncate() always uses 32-bit offsets, even if + ** _FILE_OFFSET_BITS=64 is defined. This means it is unsafe to attempt to + ** truncate a file to any size larger than 2GiB. Silently ignore any + ** such attempts. */ + if( sz>(sqlite3_int64)0x7FFFFFFF ){ + rc = SQLITE_OK; + }else +#endif + do{ rc = osFtruncate(h,sz); }while( rc<0 && errno==EINTR ); + return rc; +} + +/* +** This routine translates a standard POSIX errno code into something +** useful to the clients of the sqlite3 functions. Specifically, it is +** intended to translate a variety of "try again" errors into SQLITE_BUSY +** and a variety of "please close the file descriptor NOW" errors into +** SQLITE_IOERR +** +** Errors during initialization of locks, or file system support for locks, +** should handle ENOLCK, ENOTSUP, EOPNOTSUPP separately. +*/ +static int sqliteErrorFromPosixError(int posixError, int sqliteIOErr) { + assert( (sqliteIOErr == SQLITE_IOERR_LOCK) || + (sqliteIOErr == SQLITE_IOERR_UNLOCK) || + (sqliteIOErr == SQLITE_IOERR_RDLOCK) || + (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK) ); + switch (posixError) { + case EACCES: + case EAGAIN: + case ETIMEDOUT: + case EBUSY: + case EINTR: + case ENOLCK: + /* random NFS retry error, unless during file system support + * introspection, in which it actually means what it says */ + return SQLITE_BUSY; + + case EPERM: + return SQLITE_PERM; + + default: + return sqliteIOErr; + } +} + + +/****************************************************************************** +****************** Begin Unique File ID Utility Used By VxWorks *************** +** +** On most versions of unix, we can get a unique ID for a file by concatenating +** the device number and the inode number. But this does not work on VxWorks. +** On VxWorks, a unique file id must be based on the canonical filename. +** +** A pointer to an instance of the following structure can be used as a +** unique file ID in VxWorks. Each instance of this structure contains +** a copy of the canonical filename. There is also a reference count. +** The structure is reclaimed when the number of pointers to it drops to +** zero. +** +** There are never very many files open at one time and lookups are not +** a performance-critical path, so it is sufficient to put these +** structures on a linked list. +*/ +struct vxworksFileId { + struct vxworksFileId *pNext; /* Next in a list of them all */ + int nRef; /* Number of references to this one */ + int nName; /* Length of the zCanonicalName[] string */ + char *zCanonicalName; /* Canonical filename */ +}; + +#if OS_VXWORKS +/* +** All unique filenames are held on a linked list headed by this +** variable: +*/ +static struct vxworksFileId *vxworksFileList = 0; + +/* +** Simplify a filename into its canonical form +** by making the following changes: +** +** * removing any trailing and duplicate / +** * convert /./ into just / +** * convert /A/../ where A is any simple name into just / +** +** Changes are made in-place. Return the new name length. +** +** The original filename is in z[0..n-1]. Return the number of +** characters in the simplified name. +*/ +static int vxworksSimplifyName(char *z, int n){ + int i, j; + while( n>1 && z[n-1]=='/' ){ n--; } + for(i=j=0; i0 && z[j-1]!='/' ){ j--; } + if( j>0 ){ j--; } + i += 2; + continue; + } + } + z[j++] = z[i]; + } + z[j] = 0; + return j; +} + +/* +** Find a unique file ID for the given absolute pathname. Return +** a pointer to the vxworksFileId object. This pointer is the unique +** file ID. +** +** The nRef field of the vxworksFileId object is incremented before +** the object is returned. A new vxworksFileId object is created +** and added to the global list if necessary. +** +** If a memory allocation error occurs, return NULL. +*/ +static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){ + struct vxworksFileId *pNew; /* search key and new file ID */ + struct vxworksFileId *pCandidate; /* For looping over existing file IDs */ + int n; /* Length of zAbsoluteName string */ + + assert( zAbsoluteName[0]=='/' ); + n = (int)strlen(zAbsoluteName); + pNew = sqlite3_malloc64( sizeof(*pNew) + (n+1) ); + if( pNew==0 ) return 0; + pNew->zCanonicalName = (char*)&pNew[1]; + memcpy(pNew->zCanonicalName, zAbsoluteName, n+1); + n = vxworksSimplifyName(pNew->zCanonicalName, n); + + /* Search for an existing entry that matching the canonical name. + ** If found, increment the reference count and return a pointer to + ** the existing file ID. + */ + unixEnterMutex(); + for(pCandidate=vxworksFileList; pCandidate; pCandidate=pCandidate->pNext){ + if( pCandidate->nName==n + && memcmp(pCandidate->zCanonicalName, pNew->zCanonicalName, n)==0 + ){ + sqlite3_free(pNew); + pCandidate->nRef++; + unixLeaveMutex(); + return pCandidate; + } + } + + /* No match was found. We will make a new file ID */ + pNew->nRef = 1; + pNew->nName = n; + pNew->pNext = vxworksFileList; + vxworksFileList = pNew; + unixLeaveMutex(); + return pNew; +} + +/* +** Decrement the reference count on a vxworksFileId object. Free +** the object when the reference count reaches zero. +*/ +static void vxworksReleaseFileId(struct vxworksFileId *pId){ + unixEnterMutex(); + assert( pId->nRef>0 ); + pId->nRef--; + if( pId->nRef==0 ){ + struct vxworksFileId **pp; + for(pp=&vxworksFileList; *pp && *pp!=pId; pp = &((*pp)->pNext)){} + assert( *pp==pId ); + *pp = pId->pNext; + sqlite3_free(pId); + } + unixLeaveMutex(); +} +#endif /* OS_VXWORKS */ +/*************** End of Unique File ID Utility Used By VxWorks **************** +******************************************************************************/ + + +/****************************************************************************** +*************************** Posix Advisory Locking **************************** +** +** POSIX advisory locks are broken by design. ANSI STD 1003.1 (1996) +** section 6.5.2.2 lines 483 through 490 specify that when a process +** sets or clears a lock, that operation overrides any prior locks set +** by the same process. It does not explicitly say so, but this implies +** that it overrides locks set by the same process using a different +** file descriptor. Consider this test case: +** +** int fd1 = open("./file1", O_RDWR|O_CREAT, 0644); +** int fd2 = open("./file2", O_RDWR|O_CREAT, 0644); +** +** Suppose ./file1 and ./file2 are really the same file (because +** one is a hard or symbolic link to the other) then if you set +** an exclusive lock on fd1, then try to get an exclusive lock +** on fd2, it works. I would have expected the second lock to +** fail since there was already a lock on the file due to fd1. +** But not so. Since both locks came from the same process, the +** second overrides the first, even though they were on different +** file descriptors opened on different file names. +** +** This means that we cannot use POSIX locks to synchronize file access +** among competing threads of the same process. POSIX locks will work fine +** to synchronize access for threads in separate processes, but not +** threads within the same process. +** +** To work around the problem, SQLite has to manage file locks internally +** on its own. Whenever a new database is opened, we have to find the +** specific inode of the database file (the inode is determined by the +** st_dev and st_ino fields of the stat structure that fstat() fills in) +** and check for locks already existing on that inode. When locks are +** created or removed, we have to look at our own internal record of the +** locks to see if another thread has previously set a lock on that same +** inode. +** +** (Aside: The use of inode numbers as unique IDs does not work on VxWorks. +** For VxWorks, we have to use the alternative unique ID system based on +** canonical filename and implemented in the previous division.) +** +** The sqlite3_file structure for POSIX is no longer just an integer file +** descriptor. It is now a structure that holds the integer file +** descriptor and a pointer to a structure that describes the internal +** locks on the corresponding inode. There is one locking structure +** per inode, so if the same inode is opened twice, both unixFile structures +** point to the same locking structure. The locking structure keeps +** a reference count (so we will know when to delete it) and a "cnt" +** field that tells us its internal lock status. cnt==0 means the +** file is unlocked. cnt==-1 means the file has an exclusive lock. +** cnt>0 means there are cnt shared locks on the file. +** +** Any attempt to lock or unlock a file first checks the locking +** structure. The fcntl() system call is only invoked to set a +** POSIX lock if the internal lock structure transitions between +** a locked and an unlocked state. +** +** But wait: there are yet more problems with POSIX advisory locks. +** +** If you close a file descriptor that points to a file that has locks, +** all locks on that file that are owned by the current process are +** released. To work around this problem, each unixInodeInfo object +** maintains a count of the number of pending locks on tha inode. +** When an attempt is made to close an unixFile, if there are +** other unixFile open on the same inode that are holding locks, the call +** to close() the file descriptor is deferred until all of the locks clear. +** The unixInodeInfo structure keeps a list of file descriptors that need to +** be closed and that list is walked (and cleared) when the last lock +** clears. +** +** Yet another problem: LinuxThreads do not play well with posix locks. +** +** Many older versions of linux use the LinuxThreads library which is +** not posix compliant. Under LinuxThreads, a lock created by thread +** A cannot be modified or overridden by a different thread B. +** Only thread A can modify the lock. Locking behavior is correct +** if the appliation uses the newer Native Posix Thread Library (NPTL) +** on linux - with NPTL a lock created by thread A can override locks +** in thread B. But there is no way to know at compile-time which +** threading library is being used. So there is no way to know at +** compile-time whether or not thread A can override locks on thread B. +** One has to do a run-time check to discover the behavior of the +** current process. +** +** SQLite used to support LinuxThreads. But support for LinuxThreads +** was dropped beginning with version 3.7.0. SQLite will still work with +** LinuxThreads provided that (1) there is no more than one connection +** per database file in the same process and (2) database connections +** do not move across threads. +*/ + +/* +** An instance of the following structure serves as the key used +** to locate a particular unixInodeInfo object. +*/ +struct unixFileId { + dev_t dev; /* Device number */ +#if OS_VXWORKS + struct vxworksFileId *pId; /* Unique file ID for vxworks. */ +#else + /* We are told that some versions of Android contain a bug that + ** sizes ino_t at only 32-bits instead of 64-bits. (See + ** https://android-review.googlesource.com/#/c/115351/3/dist/sqlite3.c) + ** To work around this, always allocate 64-bits for the inode number. + ** On small machines that only have 32-bit inodes, this wastes 4 bytes, + ** but that should not be a big deal. */ + /* WAS: ino_t ino; */ + u64 ino; /* Inode number */ +#endif +}; + +/* +** An instance of the following structure is allocated for each open +** inode. +** +** A single inode can have multiple file descriptors, so each unixFile +** structure contains a pointer to an instance of this object and this +** object keeps a count of the number of unixFile pointing to it. +** +** Mutex rules: +** +** (1) Only the pLockMutex mutex must be held in order to read or write +** any of the locking fields: +** nShared, nLock, eFileLock, bProcessLock, pUnused +** +** (2) When nRef>0, then the following fields are unchanging and can +** be read (but not written) without holding any mutex: +** fileId, pLockMutex +** +** (3) With the exceptions above, all the fields may only be read +** or written while holding the global unixBigLock mutex. +** +** Deadlock prevention: The global unixBigLock mutex may not +** be acquired while holding the pLockMutex mutex. If both unixBigLock +** and pLockMutex are needed, then unixBigLock must be acquired first. +*/ +struct unixInodeInfo { + struct unixFileId fileId; /* The lookup key */ + sqlite3_mutex *pLockMutex; /* Hold this mutex for... */ + int nShared; /* Number of SHARED locks held */ + int nLock; /* Number of outstanding file locks */ + unsigned char eFileLock; /* One of SHARED_LOCK, RESERVED_LOCK etc. */ + unsigned char bProcessLock; /* An exclusive process lock is held */ + UnixUnusedFd *pUnused; /* Unused file descriptors to close */ + int nRef; /* Number of pointers to this structure */ + unixShmNode *pShmNode; /* Shared memory associated with this inode */ + unixInodeInfo *pNext; /* List of all unixInodeInfo objects */ + unixInodeInfo *pPrev; /* .... doubly linked */ +#if SQLITE_ENABLE_LOCKING_STYLE + unsigned long long sharedByte; /* for AFP simulated shared lock */ +#endif +#if OS_VXWORKS + sem_t *pSem; /* Named POSIX semaphore */ + char aSemName[MAX_PATHNAME+2]; /* Name of that semaphore */ +#endif +}; + +/* +** A lists of all unixInodeInfo objects. +** +** Must hold unixBigLock in order to read or write this variable. +*/ +static unixInodeInfo *inodeList = 0; /* All unixInodeInfo objects */ + +#ifdef SQLITE_DEBUG +/* +** True if the inode mutex (on the unixFile.pFileMutex field) is held, or not. +** This routine is used only within assert() to help verify correct mutex +** usage. +*/ +int unixFileMutexHeld(unixFile *pFile){ + assert( pFile->pInode ); + return sqlite3_mutex_held(pFile->pInode->pLockMutex); +} +int unixFileMutexNotheld(unixFile *pFile){ + assert( pFile->pInode ); + return sqlite3_mutex_notheld(pFile->pInode->pLockMutex); +} +#endif + +/* +** +** This function - unixLogErrorAtLine(), is only ever called via the macro +** unixLogError(). +** +** It is invoked after an error occurs in an OS function and errno has been +** set. It logs a message using sqlite3_log() containing the current value of +** errno and, if possible, the human-readable equivalent from strerror() or +** strerror_r(). +** +** The first argument passed to the macro should be the error code that +** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN). +** The two subsequent arguments should be the name of the OS function that +** failed (e.g. "unlink", "open") and the associated file-system path, +** if any. +*/ +#define unixLogError(a,b,c) unixLogErrorAtLine(a,b,c,__LINE__) +static int unixLogErrorAtLine( + int errcode, /* SQLite error code */ + const char *zFunc, /* Name of OS function that failed */ + const char *zPath, /* File path associated with error */ + int iLine /* Source line number where error occurred */ +){ + char *zErr; /* Message from strerror() or equivalent */ + int iErrno = errno; /* Saved syscall error number */ + + /* If this is not a threadsafe build (SQLITE_THREADSAFE==0), then use + ** the strerror() function to obtain the human-readable error message + ** equivalent to errno. Otherwise, use strerror_r(). + */ +#if SQLITE_THREADSAFE && defined(HAVE_STRERROR_R) + char aErr[80]; + memset(aErr, 0, sizeof(aErr)); + zErr = aErr; + + /* If STRERROR_R_CHAR_P (set by autoconf scripts) or __USE_GNU is defined, + ** assume that the system provides the GNU version of strerror_r() that + ** returns a pointer to a buffer containing the error message. That pointer + ** may point to aErr[], or it may point to some static storage somewhere. + ** Otherwise, assume that the system provides the POSIX version of + ** strerror_r(), which always writes an error message into aErr[]. + ** + ** If the code incorrectly assumes that it is the POSIX version that is + ** available, the error message will often be an empty string. Not a + ** huge problem. Incorrectly concluding that the GNU version is available + ** could lead to a segfault though. + */ +#if defined(STRERROR_R_CHAR_P) || defined(__USE_GNU) + zErr = +# endif + strerror_r(iErrno, aErr, sizeof(aErr)-1); + +#elif SQLITE_THREADSAFE + /* This is a threadsafe build, but strerror_r() is not available. */ + zErr = ""; +#else + /* Non-threadsafe build, use strerror(). */ + zErr = strerror(iErrno); +#endif + + if( zPath==0 ) zPath = ""; + sqlite3_log(errcode, + "os_unix.c:%d: (%d) %s(%s) - %s", + iLine, iErrno, zFunc, zPath, zErr + ); + + return errcode; +} + +/* +** Close a file descriptor. +** +** We assume that close() almost always works, since it is only in a +** very sick application or on a very sick platform that it might fail. +** If it does fail, simply leak the file descriptor, but do log the +** error. +** +** Note that it is not safe to retry close() after EINTR since the +** file descriptor might have already been reused by another thread. +** So we don't even try to recover from an EINTR. Just log the error +** and move on. +*/ +static void robust_close(unixFile *pFile, int h, int lineno){ + if( osClose(h) ){ + unixLogErrorAtLine(SQLITE_IOERR_CLOSE, "close", + pFile ? pFile->zPath : 0, lineno); + } +} + +/* +** Set the pFile->lastErrno. Do this in a subroutine as that provides +** a convenient place to set a breakpoint. +*/ +static void storeLastErrno(unixFile *pFile, int error){ + pFile->lastErrno = error; +} + +/* +** Close all file descriptors accumuated in the unixInodeInfo->pUnused list. +*/ +static void closePendingFds(unixFile *pFile){ + unixInodeInfo *pInode = pFile->pInode; + UnixUnusedFd *p; + UnixUnusedFd *pNext; + assert( unixFileMutexHeld(pFile) ); + for(p=pInode->pUnused; p; p=pNext){ + pNext = p->pNext; + robust_close(pFile, p->fd, __LINE__); + sqlite3_free(p); + } + pInode->pUnused = 0; +} + +/* +** Release a unixInodeInfo structure previously allocated by findInodeInfo(). +** +** The global mutex must be held when this routine is called, but the mutex +** on the inode being deleted must NOT be held. +*/ +static void releaseInodeInfo(unixFile *pFile){ + unixInodeInfo *pInode = pFile->pInode; + assert( unixMutexHeld() ); + assert( unixFileMutexNotheld(pFile) ); + if( ALWAYS(pInode) ){ + pInode->nRef--; + if( pInode->nRef==0 ){ + assert( pInode->pShmNode==0 ); + sqlite3_mutex_enter(pInode->pLockMutex); + closePendingFds(pFile); + sqlite3_mutex_leave(pInode->pLockMutex); + if( pInode->pPrev ){ + assert( pInode->pPrev->pNext==pInode ); + pInode->pPrev->pNext = pInode->pNext; + }else{ + assert( inodeList==pInode ); + inodeList = pInode->pNext; + } + if( pInode->pNext ){ + assert( pInode->pNext->pPrev==pInode ); + pInode->pNext->pPrev = pInode->pPrev; + } + sqlite3_mutex_free(pInode->pLockMutex); + sqlite3_free(pInode); + } + } +} + +/* +** Given a file descriptor, locate the unixInodeInfo object that +** describes that file descriptor. Create a new one if necessary. The +** return value might be uninitialized if an error occurs. +** +** The global mutex must held when calling this routine. +** +** Return an appropriate error code. +*/ +static int findInodeInfo( + unixFile *pFile, /* Unix file with file desc used in the key */ + unixInodeInfo **ppInode /* Return the unixInodeInfo object here */ +){ + int rc; /* System call return code */ + int fd; /* The file descriptor for pFile */ + struct unixFileId fileId; /* Lookup key for the unixInodeInfo */ + struct stat statbuf; /* Low-level file information */ + unixInodeInfo *pInode = 0; /* Candidate unixInodeInfo object */ + + assert( unixMutexHeld() ); + + /* Get low-level information about the file that we can used to + ** create a unique name for the file. + */ + fd = pFile->h; + rc = osFstat(fd, &statbuf); + if( rc!=0 ){ + storeLastErrno(pFile, errno); +#if defined(EOVERFLOW) && defined(SQLITE_DISABLE_LFS) + if( pFile->lastErrno==EOVERFLOW ) return SQLITE_NOLFS; +#endif + return SQLITE_IOERR; + } + +#ifdef __APPLE__ + /* On OS X on an msdos filesystem, the inode number is reported + ** incorrectly for zero-size files. See ticket #3260. To work + ** around this problem (we consider it a bug in OS X, not SQLite) + ** we always increase the file size to 1 by writing a single byte + ** prior to accessing the inode number. The one byte written is + ** an ASCII 'S' character which also happens to be the first byte + ** in the header of every SQLite database. In this way, if there + ** is a race condition such that another thread has already populated + ** the first page of the database, no damage is done. + */ + if( statbuf.st_size==0 && (pFile->fsFlags & SQLITE_FSFLAGS_IS_MSDOS)!=0 ){ + do{ rc = osWrite(fd, "S", 1); }while( rc<0 && errno==EINTR ); + if( rc!=1 ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR; + } + rc = osFstat(fd, &statbuf); + if( rc!=0 ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR; + } + } +#endif + + memset(&fileId, 0, sizeof(fileId)); + fileId.dev = statbuf.st_dev; +#if OS_VXWORKS + fileId.pId = pFile->pId; +#else + fileId.ino = (u64)statbuf.st_ino; +#endif + assert( unixMutexHeld() ); + pInode = inodeList; + while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){ + pInode = pInode->pNext; + } + if( pInode==0 ){ + pInode = sqlite3_malloc64( sizeof(*pInode) ); + if( pInode==0 ){ + return SQLITE_NOMEM_BKPT; + } + memset(pInode, 0, sizeof(*pInode)); + memcpy(&pInode->fileId, &fileId, sizeof(fileId)); + if( sqlite3GlobalConfig.bCoreMutex ){ + pInode->pLockMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pInode->pLockMutex==0 ){ + sqlite3_free(pInode); + return SQLITE_NOMEM_BKPT; + } + } + pInode->nRef = 1; + assert( unixMutexHeld() ); + pInode->pNext = inodeList; + pInode->pPrev = 0; + if( inodeList ) inodeList->pPrev = pInode; + inodeList = pInode; + }else{ + pInode->nRef++; + } + *ppInode = pInode; + return SQLITE_OK; +} + +/* +** Return TRUE if pFile has been renamed or unlinked since it was first opened. +*/ +static int fileHasMoved(unixFile *pFile){ +#if OS_VXWORKS + return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId; +#else + struct stat buf; + return pFile->pInode!=0 && + (osStat(pFile->zPath, &buf)!=0 + || (u64)buf.st_ino!=pFile->pInode->fileId.ino); +#endif +} + + +/* +** Check a unixFile that is a database. Verify the following: +** +** (1) There is exactly one hard link on the file +** (2) The file is not a symbolic link +** (3) The file has not been renamed or unlinked +** +** Issue sqlite3_log(SQLITE_WARNING,...) messages if anything is not right. +*/ +static void verifyDbFile(unixFile *pFile){ + struct stat buf; + int rc; + + /* These verifications occurs for the main database only */ + if( pFile->ctrlFlags & UNIXFILE_NOLOCK ) return; + + rc = osFstat(pFile->h, &buf); + if( rc!=0 ){ + sqlite3_log(SQLITE_WARNING, "cannot fstat db file %s", pFile->zPath); + return; + } + if( buf.st_nlink==0 ){ + sqlite3_log(SQLITE_WARNING, "file unlinked while open: %s", pFile->zPath); + return; + } + if( buf.st_nlink>1 ){ + sqlite3_log(SQLITE_WARNING, "multiple links to file: %s", pFile->zPath); + return; + } + if( fileHasMoved(pFile) ){ + sqlite3_log(SQLITE_WARNING, "file renamed while open: %s", pFile->zPath); + return; + } +} + + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + assert( pFile->eFileLock<=SHARED_LOCK ); + sqlite3_mutex_enter(pFile->pInode->pLockMutex); + + /* Check if a thread in this process holds such a lock */ + if( pFile->pInode->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. + */ +#ifndef __DJGPP__ + if( !reserved && !pFile->pInode->bProcessLock ){ + struct flock lock; + lock.l_whence = SEEK_SET; + lock.l_start = RESERVED_BYTE; + lock.l_len = 1; + lock.l_type = F_WRLCK; + if( osFcntl(pFile->h, F_GETLK, &lock) ){ + rc = SQLITE_IOERR_CHECKRESERVEDLOCK; + storeLastErrno(pFile, errno); + } else if( lock.l_type!=F_UNLCK ){ + reserved = 1; + } + } +#endif + + sqlite3_mutex_leave(pFile->pInode->pLockMutex); + OSTRACE(("TEST WR-LOCK %d %d %d (unix)\n", pFile->h, rc, reserved)); + + *pResOut = reserved; + return rc; +} + +/* +** Set a posix-advisory-lock. +** +** There are two versions of this routine. If compiled with +** SQLITE_ENABLE_SETLK_TIMEOUT then the routine has an extra parameter +** which is a pointer to a unixFile. If the unixFile->iBusyTimeout +** value is set, then it is the number of milliseconds to wait before +** failing the lock. The iBusyTimeout value is always reset back to +** zero on each call. +** +** If SQLITE_ENABLE_SETLK_TIMEOUT is not defined, then do a non-blocking +** attempt to set the lock. +*/ +#ifndef SQLITE_ENABLE_SETLK_TIMEOUT +# define osSetPosixAdvisoryLock(h,x,t) osFcntl(h,F_SETLK,x) +#else +static int osSetPosixAdvisoryLock( + int h, /* The file descriptor on which to take the lock */ + struct flock *pLock, /* The description of the lock */ + unixFile *pFile /* Structure holding timeout value */ +){ + int tm = pFile->iBusyTimeout; + int rc = osFcntl(h,F_SETLK,pLock); + while( rc<0 && tm>0 ){ + /* On systems that support some kind of blocking file lock with a timeout, + ** make appropriate changes here to invoke that blocking file lock. On + ** generic posix, however, there is no such API. So we simply try the + ** lock once every millisecond until either the timeout expires, or until + ** the lock is obtained. */ + usleep(1000); + rc = osFcntl(h,F_SETLK,pLock); + tm--; + } + return rc; +} +#endif /* SQLITE_ENABLE_SETLK_TIMEOUT */ + + +/* +** Attempt to set a system-lock on the file pFile. The lock is +** described by pLock. +** +** If the pFile was opened read/write from unix-excl, then the only lock +** ever obtained is an exclusive lock, and it is obtained exactly once +** the first time any lock is attempted. All subsequent system locking +** operations become no-ops. Locking operations still happen internally, +** in order to coordinate access between separate database connections +** within this process, but all of that is handled in memory and the +** operating system does not participate. +** +** This function is a pass-through to fcntl(F_SETLK) if pFile is using +** any VFS other than "unix-excl" or if pFile is opened on "unix-excl" +** and is read-only. +** +** Zero is returned if the call completes successfully, or -1 if a call +** to fcntl() fails. In this case, errno is set appropriately (by fcntl()). +*/ +static int unixFileLock(unixFile *pFile, struct flock *pLock){ + int rc; + unixInodeInfo *pInode = pFile->pInode; + assert( pInode!=0 ); + assert( sqlite3_mutex_held(pInode->pLockMutex) ); + if( (pFile->ctrlFlags & (UNIXFILE_EXCL|UNIXFILE_RDONLY))==UNIXFILE_EXCL ){ + if( pInode->bProcessLock==0 ){ + struct flock lock; + assert( pInode->nLock==0 ); + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + lock.l_type = F_WRLCK; + rc = osSetPosixAdvisoryLock(pFile->h, &lock, pFile); + if( rc<0 ) return rc; + pInode->bProcessLock = 1; + pInode->nLock++; + }else{ + rc = 0; + } + }else{ + rc = osSetPosixAdvisoryLock(pFile->h, pLock, pFile); + } + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int unixLock(sqlite3_file *id, int eFileLock){ + /* The following describes the implementation of the various locks and + ** lock transitions in terms of the POSIX advisory shared and exclusive + ** lock primitives (called read-locks and write-locks below, to avoid + ** confusion with SQLite lock names). The algorithms are complicated + ** slightly in order to be compatible with Windows95 systems simultaneously + ** accessing the same database file, in case that is ever required. + ** + ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved + ** byte', each single bytes at well known offsets, and the 'shared byte + ** range', a range of 510 bytes at a well known offset. + ** + ** To obtain a SHARED lock, a read-lock is obtained on the 'pending + ** byte'. If this is successful, 'shared byte range' is read-locked + ** and the lock on the 'pending byte' released. (Legacy note: When + ** SQLite was first developed, Windows95 systems were still very common, + ** and Widnows95 lacks a shared-lock capability. So on Windows95, a + ** single randomly selected by from the 'shared byte range' is locked. + ** Windows95 is now pretty much extinct, but this work-around for the + ** lack of shared-locks on Windows95 lives on, for backwards + ** compatibility.) + ** + ** A process may only obtain a RESERVED lock after it has a SHARED lock. + ** A RESERVED lock is implemented by grabbing a write-lock on the + ** 'reserved byte'. + ** + ** A process may only obtain a PENDING lock after it has obtained a + ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock + ** on the 'pending byte'. This ensures that no new SHARED locks can be + ** obtained, but existing SHARED locks are allowed to persist. A process + ** does not have to obtain a RESERVED lock on the way to a PENDING lock. + ** This property is used by the algorithm for rolling back a journal file + ** after a crash. + ** + ** An EXCLUSIVE lock, obtained after a PENDING lock is held, is + ** implemented by obtaining a write-lock on the entire 'shared byte + ** range'. Since all other locks require a read-lock on one of the bytes + ** within this range, this ensures that no other locks are held on the + ** database. + */ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode; + struct flock lock; + int tErrno = 0; + + assert( pFile ); + OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h, + azFileLock(eFileLock), azFileLock(pFile->eFileLock), + azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared, + osGetpid(0))); + + /* If there is already a lock of this type or more restrictive on the + ** unixFile, do nothing. Don't use the end_lock: exit path, as + ** unixEnterMutex() hasn't been called yet. + */ + if( pFile->eFileLock>=eFileLock ){ + OSTRACE(("LOCK %d %s ok (already held) (unix)\n", pFile->h, + azFileLock(eFileLock))); + return SQLITE_OK; + } + + /* Make sure the locking sequence is correct. + ** (1) We never move from unlocked to anything higher than shared lock. + ** (2) SQLite never explicitly requests a pendig lock. + ** (3) A shared lock is always held when a reserve lock is requested. + */ + assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK ); + assert( eFileLock!=PENDING_LOCK ); + assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK ); + + /* This mutex is needed because pFile->pInode is shared across threads + */ + pInode = pFile->pInode; + sqlite3_mutex_enter(pInode->pLockMutex); + + /* If some thread using this PID has a lock via a different unixFile* + ** handle that precludes the requested lock, return BUSY. + */ + if( (pFile->eFileLock!=pInode->eFileLock && + (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK)) + ){ + rc = SQLITE_BUSY; + goto end_lock; + } + + /* If a SHARED lock is requested, and some thread using this PID already + ** has a SHARED or RESERVED lock, then increment reference counts and + ** return SQLITE_OK. + */ + if( eFileLock==SHARED_LOCK && + (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){ + assert( eFileLock==SHARED_LOCK ); + assert( pFile->eFileLock==0 ); + assert( pInode->nShared>0 ); + pFile->eFileLock = SHARED_LOCK; + pInode->nShared++; + pInode->nLock++; + goto end_lock; + } + + + /* A PENDING lock is needed before acquiring a SHARED lock and before + ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will + ** be released. + */ + lock.l_len = 1L; + lock.l_whence = SEEK_SET; + if( eFileLock==SHARED_LOCK + || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLocknShared==0 ); + assert( pInode->eFileLock==0 ); + assert( rc==SQLITE_OK ); + + /* Now get the read-lock */ + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + if( unixFileLock(pFile, &lock) ){ + tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + } + + /* Drop the temporary PENDING lock */ + lock.l_start = PENDING_BYTE; + lock.l_len = 1L; + lock.l_type = F_UNLCK; + if( unixFileLock(pFile, &lock) && rc==SQLITE_OK ){ + /* This could happen with a network mount */ + tErrno = errno; + rc = SQLITE_IOERR_UNLOCK; + } + + if( rc ){ + if( rc!=SQLITE_BUSY ){ + storeLastErrno(pFile, tErrno); + } + goto end_lock; + }else{ + pFile->eFileLock = SHARED_LOCK; + pInode->nLock++; + pInode->nShared = 1; + } + }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){ + /* We are trying for an exclusive lock but another thread in this + ** same process is still holding a shared lock. */ + rc = SQLITE_BUSY; + }else{ + /* The request was for a RESERVED or EXCLUSIVE lock. It is + ** assumed that there is a SHARED or greater lock on the file + ** already. + */ + assert( 0!=pFile->eFileLock ); + lock.l_type = F_WRLCK; + + assert( eFileLock==RESERVED_LOCK || eFileLock==EXCLUSIVE_LOCK ); + if( eFileLock==RESERVED_LOCK ){ + lock.l_start = RESERVED_BYTE; + lock.l_len = 1L; + }else{ + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + } + + if( unixFileLock(pFile, &lock) ){ + tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( rc!=SQLITE_BUSY ){ + storeLastErrno(pFile, tErrno); + } + } + } + + +#ifdef SQLITE_DEBUG + /* Set up the transaction-counter change checking flags when + ** transitioning from a SHARED to a RESERVED lock. The change + ** from SHARED to RESERVED marks the beginning of a normal + ** write operation (not a hot journal rollback). + */ + if( rc==SQLITE_OK + && pFile->eFileLock<=SHARED_LOCK + && eFileLock==RESERVED_LOCK + ){ + pFile->transCntrChng = 0; + pFile->dbUpdate = 0; + pFile->inNormalWrite = 1; + } +#endif + + + if( rc==SQLITE_OK ){ + pFile->eFileLock = eFileLock; + pInode->eFileLock = eFileLock; + }else if( eFileLock==EXCLUSIVE_LOCK ){ + pFile->eFileLock = PENDING_LOCK; + pInode->eFileLock = PENDING_LOCK; + } + +end_lock: + sqlite3_mutex_leave(pInode->pLockMutex); + OSTRACE(("LOCK %d %s %s (unix)\n", pFile->h, azFileLock(eFileLock), + rc==SQLITE_OK ? "ok" : "failed")); + return rc; +} + +/* +** Add the file descriptor used by file handle pFile to the corresponding +** pUnused list. +*/ +static void setPendingFd(unixFile *pFile){ + unixInodeInfo *pInode = pFile->pInode; + UnixUnusedFd *p = pFile->pPreallocatedUnused; + assert( unixFileMutexHeld(pFile) ); + p->pNext = pInode->pUnused; + pInode->pUnused = p; + pFile->h = -1; + pFile->pPreallocatedUnused = 0; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** If handleNFSUnlock is true, then on downgrading an EXCLUSIVE_LOCK to SHARED +** the byte range is divided into 2 parts and the first part is unlocked then +** set to a read lock, then the other part is simply unlocked. This works +** around a bug in BSD NFS lockd (also seen on MacOSX 10.3+) that fails to +** remove the write lock on a region when a read lock is set. +*/ +static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode; + struct flock lock; + int rc = SQLITE_OK; + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock, + pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, + osGetpid(0))); + + assert( eFileLock<=SHARED_LOCK ); + if( pFile->eFileLock<=eFileLock ){ + return SQLITE_OK; + } + pInode = pFile->pInode; + sqlite3_mutex_enter(pInode->pLockMutex); + assert( pInode->nShared!=0 ); + if( pFile->eFileLock>SHARED_LOCK ){ + assert( pInode->eFileLock==pFile->eFileLock ); + +#ifdef SQLITE_DEBUG + /* When reducing a lock such that other processes can start + ** reading the database file again, make sure that the + ** transaction counter was updated if any part of the database + ** file changed. If the transaction counter is not updated, + ** other connections to the same file might not realize that + ** the file has changed and hence might not know to flush their + ** cache. The use of a stale cache can lead to database corruption. + */ + pFile->inNormalWrite = 0; +#endif + + /* downgrading to a shared lock on NFS involves clearing the write lock + ** before establishing the readlock - to avoid a race condition we downgrade + ** the lock in 2 blocks, so that part of the range will be covered by a + ** write lock until the rest is covered by a read lock: + ** 1: [WWWWW] + ** 2: [....W] + ** 3: [RRRRW] + ** 4: [RRRR.] + */ + if( eFileLock==SHARED_LOCK ){ +#if !defined(__APPLE__) || !SQLITE_ENABLE_LOCKING_STYLE + (void)handleNFSUnlock; + assert( handleNFSUnlock==0 ); +#endif +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE + if( handleNFSUnlock ){ + int tErrno; /* Error code from system call errors */ + off_t divSize = SHARED_SIZE - 1; + + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = divSize; + if( unixFileLock(pFile, &lock)==(-1) ){ + tErrno = errno; + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + goto end_unlock; + } + lock.l_type = F_RDLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = divSize; + if( unixFileLock(pFile, &lock)==(-1) ){ + tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_RDLOCK); + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + goto end_unlock; + } + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST+divSize; + lock.l_len = SHARED_SIZE-divSize; + if( unixFileLock(pFile, &lock)==(-1) ){ + tErrno = errno; + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + goto end_unlock; + } + }else +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ + { + lock.l_type = F_RDLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + if( unixFileLock(pFile, &lock) ){ + /* In theory, the call to unixFileLock() cannot fail because another + ** process is holding an incompatible lock. If it does, this + ** indicates that the other process is not following the locking + ** protocol. If this happens, return SQLITE_IOERR_RDLOCK. Returning + ** SQLITE_BUSY would confuse the upper layer (in practice it causes + ** an assert to fail). */ + rc = SQLITE_IOERR_RDLOCK; + storeLastErrno(pFile, errno); + goto end_unlock; + } + } + } + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = PENDING_BYTE; + lock.l_len = 2L; assert( PENDING_BYTE+1==RESERVED_BYTE ); + if( unixFileLock(pFile, &lock)==0 ){ + pInode->eFileLock = SHARED_LOCK; + }else{ + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, errno); + goto end_unlock; + } + } + if( eFileLock==NO_LOCK ){ + /* Decrement the shared lock counter. Release the lock using an + ** OS call only when all threads in this same process have released + ** the lock. + */ + pInode->nShared--; + if( pInode->nShared==0 ){ + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = lock.l_len = 0L; + if( unixFileLock(pFile, &lock)==0 ){ + pInode->eFileLock = NO_LOCK; + }else{ + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, errno); + pInode->eFileLock = NO_LOCK; + pFile->eFileLock = NO_LOCK; + } + } + + /* Decrement the count of locks against this same file. When the + ** count reaches zero, close any other file descriptors whose close + ** was deferred because of outstanding locks. + */ + pInode->nLock--; + assert( pInode->nLock>=0 ); + if( pInode->nLock==0 ) closePendingFds(pFile); + } + +end_unlock: + sqlite3_mutex_leave(pInode->pLockMutex); + if( rc==SQLITE_OK ){ + pFile->eFileLock = eFileLock; + } + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int unixUnlock(sqlite3_file *id, int eFileLock){ +#if SQLITE_MAX_MMAP_SIZE>0 + assert( eFileLock==SHARED_LOCK || ((unixFile *)id)->nFetchOut==0 ); +#endif + return posixUnlock(id, eFileLock, 0); +} + +#if SQLITE_MAX_MMAP_SIZE>0 +static int unixMapfile(unixFile *pFd, i64 nByte); +static void unixUnmapfile(unixFile *pFd); +#endif + +/* +** This function performs the parts of the "close file" operation +** common to all locking schemes. It closes the directory and file +** handles, if they are valid, and sets all fields of the unixFile +** structure to 0. +** +** It is *not* necessary to hold the mutex when this routine is called, +** even on VxWorks. A mutex will be acquired on VxWorks by the +** vxworksReleaseFileId() routine. +*/ +static int closeUnixFile(sqlite3_file *id){ + unixFile *pFile = (unixFile*)id; +#if SQLITE_MAX_MMAP_SIZE>0 + unixUnmapfile(pFile); +#endif + if( pFile->h>=0 ){ + robust_close(pFile, pFile->h, __LINE__); + pFile->h = -1; + } +#if OS_VXWORKS + if( pFile->pId ){ + if( pFile->ctrlFlags & UNIXFILE_DELETE ){ + osUnlink(pFile->pId->zCanonicalName); + } + vxworksReleaseFileId(pFile->pId); + pFile->pId = 0; + } +#endif +#ifdef SQLITE_UNLINK_AFTER_CLOSE + if( pFile->ctrlFlags & UNIXFILE_DELETE ){ + osUnlink(pFile->zPath); + sqlite3_free(*(char**)&pFile->zPath); + pFile->zPath = 0; + } +#endif + OSTRACE(("CLOSE %-3d\n", pFile->h)); + OpenCounter(-1); + sqlite3_free(pFile->pPreallocatedUnused); + memset(pFile, 0, sizeof(unixFile)); + return SQLITE_OK; +} + +/* +** Close a file. +*/ +static int unixClose(sqlite3_file *id){ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile *)id; + unixInodeInfo *pInode = pFile->pInode; + + assert( pInode!=0 ); + verifyDbFile(pFile); + unixUnlock(id, NO_LOCK); + assert( unixFileMutexNotheld(pFile) ); + unixEnterMutex(); + + /* unixFile.pInode is always valid here. Otherwise, a different close + ** routine (e.g. nolockClose()) would be called instead. + */ + assert( pFile->pInode->nLock>0 || pFile->pInode->bProcessLock==0 ); + sqlite3_mutex_enter(pInode->pLockMutex); + if( pInode->nLock ){ + /* If there are outstanding locks, do not actually close the file just + ** yet because that would clear those locks. Instead, add the file + ** descriptor to pInode->pUnused list. It will be automatically closed + ** when the last lock is cleared. + */ + setPendingFd(pFile); + } + sqlite3_mutex_leave(pInode->pLockMutex); + releaseInodeInfo(pFile); + rc = closeUnixFile(id); + unixLeaveMutex(); + return rc; +} + +/************** End of the posix advisory lock implementation ***************** +******************************************************************************/ + +/****************************************************************************** +****************************** No-op Locking ********************************** +** +** Of the various locking implementations available, this is by far the +** simplest: locking is ignored. No attempt is made to lock the database +** file for reading or writing. +** +** This locking mode is appropriate for use on read-only databases +** (ex: databases that are burned into CD-ROM, for example.) It can +** also be used if the application employs some external mechanism to +** prevent simultaneous access of the same database by two or more +** database connections. But there is a serious risk of database +** corruption if this locking mode is used in situations where multiple +** database connections are accessing the same database file at the same +** time and one or more of those connections are writing. +*/ + +static int nolockCheckReservedLock(sqlite3_file *NotUsed, int *pResOut){ + UNUSED_PARAMETER(NotUsed); + *pResOut = 0; + return SQLITE_OK; +} +static int nolockLock(sqlite3_file *NotUsed, int NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return SQLITE_OK; +} +static int nolockUnlock(sqlite3_file *NotUsed, int NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return SQLITE_OK; +} + +/* +** Close the file. +*/ +static int nolockClose(sqlite3_file *id) { + return closeUnixFile(id); +} + +/******************* End of the no-op lock implementation ********************* +******************************************************************************/ + +/****************************************************************************** +************************* Begin dot-file Locking ****************************** +** +** The dotfile locking implementation uses the existence of separate lock +** files (really a directory) to control access to the database. This works +** on just about every filesystem imaginable. But there are serious downsides: +** +** (1) There is zero concurrency. A single reader blocks all other +** connections from reading or writing the database. +** +** (2) An application crash or power loss can leave stale lock files +** sitting around that need to be cleared manually. +** +** Nevertheless, a dotlock is an appropriate locking mode for use if no +** other locking strategy is available. +** +** Dotfile locking works by creating a subdirectory in the same directory as +** the database and with the same name but with a ".lock" extension added. +** The existence of a lock directory implies an EXCLUSIVE lock. All other +** lock types (SHARED, RESERVED, PENDING) are mapped into EXCLUSIVE. +*/ + +/* +** The file suffix added to the data base filename in order to create the +** lock directory. +*/ +#define DOTLOCK_SUFFIX ".lock" + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +** +** In dotfile locking, either a lock exists or it does not. So in this +** variation of CheckReservedLock(), *pResOut is set to true if any lock +** is held on the file and false if the file is unlocked. +*/ +static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) { + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + reserved = osAccess((const char*)pFile->lockingContext, 0)==0; + OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved)); + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +** +** With dotfile locking, we really only support state (4): EXCLUSIVE. +** But we track the other locking levels internally. +*/ +static int dotlockLock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + char *zLockFile = (char *)pFile->lockingContext; + int rc = SQLITE_OK; + + + /* If we have any lock, then the lock file already exists. All we have + ** to do is adjust our internal record of the lock level. + */ + if( pFile->eFileLock > NO_LOCK ){ + pFile->eFileLock = eFileLock; + /* Always update the timestamp on the old file */ +#ifdef HAVE_UTIME + utime(zLockFile, NULL); +#else + utimes(zLockFile, NULL); +#endif + return SQLITE_OK; + } + + /* grab an exclusive lock */ + rc = osMkdir(zLockFile, 0777); + if( rc<0 ){ + /* failed to open/create the lock directory */ + int tErrno = errno; + if( EEXIST == tErrno ){ + rc = SQLITE_BUSY; + } else { + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( rc!=SQLITE_BUSY ){ + storeLastErrno(pFile, tErrno); + } + } + return rc; + } + + /* got it, set the type and return ok */ + pFile->eFileLock = eFileLock; + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** When the locking level reaches NO_LOCK, delete the lock file. +*/ +static int dotlockUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + char *zLockFile = (char *)pFile->lockingContext; + int rc; + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock, + pFile->eFileLock, osGetpid(0))); + assert( eFileLock<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->eFileLock==eFileLock ){ + return SQLITE_OK; + } + + /* To downgrade to shared, simply update our internal notion of the + ** lock state. No need to mess with the file on disk. + */ + if( eFileLock==SHARED_LOCK ){ + pFile->eFileLock = SHARED_LOCK; + return SQLITE_OK; + } + + /* To fully unlock the database, delete the lock file */ + assert( eFileLock==NO_LOCK ); + rc = osRmdir(zLockFile); + if( rc<0 ){ + int tErrno = errno; + if( tErrno==ENOENT ){ + rc = SQLITE_OK; + }else{ + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + } + return rc; + } + pFile->eFileLock = NO_LOCK; + return SQLITE_OK; +} + +/* +** Close a file. Make sure the lock has been released before closing. +*/ +static int dotlockClose(sqlite3_file *id) { + unixFile *pFile = (unixFile*)id; + assert( id!=0 ); + dotlockUnlock(id, NO_LOCK); + sqlite3_free(pFile->lockingContext); + return closeUnixFile(id); +} +/****************** End of the dot-file lock implementation ******************* +******************************************************************************/ + +/****************************************************************************** +************************** Begin flock Locking ******************************** +** +** Use the flock() system call to do file locking. +** +** flock() locking is like dot-file locking in that the various +** fine-grain locking levels supported by SQLite are collapsed into +** a single exclusive lock. In other words, SHARED, RESERVED, and +** PENDING locks are the same thing as an EXCLUSIVE lock. SQLite +** still works when you do this, but concurrency is reduced since +** only a single process can be reading the database at a time. +** +** Omit this section if SQLITE_ENABLE_LOCKING_STYLE is turned off +*/ +#if SQLITE_ENABLE_LOCKING_STYLE + +/* +** Retry flock() calls that fail with EINTR +*/ +#ifdef EINTR +static int robust_flock(int fd, int op){ + int rc; + do{ rc = flock(fd,op); }while( rc<0 && errno==EINTR ); + return rc; +} +#else +# define robust_flock(a,b) flock(a,b) +#endif + + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + + /* Check if a thread in this process holds such a lock */ + if( pFile->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. */ + if( !reserved ){ + /* attempt to get the lock */ + int lrc = robust_flock(pFile->h, LOCK_EX | LOCK_NB); + if( !lrc ){ + /* got the lock, unlock it */ + lrc = robust_flock(pFile->h, LOCK_UN); + if ( lrc ) { + int tErrno = errno; + /* unlock failed with an error */ + lrc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + rc = lrc; + } + } else { + int tErrno = errno; + reserved = 1; + /* someone else might have it reserved */ + lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( IS_LOCK_ERROR(lrc) ){ + storeLastErrno(pFile, tErrno); + rc = lrc; + } + } + } + OSTRACE(("TEST WR-LOCK %d %d %d (flock)\n", pFile->h, rc, reserved)); + +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS + if( (rc & 0xff) == SQLITE_IOERR ){ + rc = SQLITE_OK; + reserved=1; + } +#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** flock() only really support EXCLUSIVE locks. We track intermediate +** lock states in the sqlite3_file structure, but all locks SHARED or +** above are really EXCLUSIVE locks and exclude all other processes from +** access the file. +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int flockLock(sqlite3_file *id, int eFileLock) { + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + + assert( pFile ); + + /* if we already have a lock, it is exclusive. + ** Just adjust level and punt on outta here. */ + if (pFile->eFileLock > NO_LOCK) { + pFile->eFileLock = eFileLock; + return SQLITE_OK; + } + + /* grab an exclusive lock */ + + if (robust_flock(pFile->h, LOCK_EX | LOCK_NB)) { + int tErrno = errno; + /* didn't get, must be busy */ + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + } else { + /* got it, set the type and return ok */ + pFile->eFileLock = eFileLock; + } + OSTRACE(("LOCK %d %s %s (flock)\n", pFile->h, azFileLock(eFileLock), + rc==SQLITE_OK ? "ok" : "failed")); +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS + if( (rc & 0xff) == SQLITE_IOERR ){ + rc = SQLITE_BUSY; + } +#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ + return rc; +} + + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int flockUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, eFileLock, + pFile->eFileLock, osGetpid(0))); + assert( eFileLock<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->eFileLock==eFileLock ){ + return SQLITE_OK; + } + + /* shared can just be set because we always have an exclusive */ + if (eFileLock==SHARED_LOCK) { + pFile->eFileLock = eFileLock; + return SQLITE_OK; + } + + /* no, really, unlock. */ + if( robust_flock(pFile->h, LOCK_UN) ){ +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS + return SQLITE_OK; +#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ + return SQLITE_IOERR_UNLOCK; + }else{ + pFile->eFileLock = NO_LOCK; + return SQLITE_OK; + } +} + +/* +** Close a file. +*/ +static int flockClose(sqlite3_file *id) { + assert( id!=0 ); + flockUnlock(id, NO_LOCK); + return closeUnixFile(id); +} + +#endif /* SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORK */ + +/******************* End of the flock lock implementation ********************* +******************************************************************************/ + +/****************************************************************************** +************************ Begin Named Semaphore Locking ************************ +** +** Named semaphore locking is only supported on VxWorks. +** +** Semaphore locking is like dot-lock and flock in that it really only +** supports EXCLUSIVE locking. Only a single process can read or write +** the database file at a time. This reduces potential concurrency, but +** makes the lock implementation much easier. +*/ +#if OS_VXWORKS + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int semXCheckReservedLock(sqlite3_file *id, int *pResOut) { + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + + /* Check if a thread in this process holds such a lock */ + if( pFile->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. */ + if( !reserved ){ + sem_t *pSem = pFile->pInode->pSem; + + if( sem_trywait(pSem)==-1 ){ + int tErrno = errno; + if( EAGAIN != tErrno ){ + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_CHECKRESERVEDLOCK); + storeLastErrno(pFile, tErrno); + } else { + /* someone else has the lock when we are in NO_LOCK */ + reserved = (pFile->eFileLock < SHARED_LOCK); + } + }else{ + /* we could have it if we want it */ + sem_post(pSem); + } + } + OSTRACE(("TEST WR-LOCK %d %d %d (sem)\n", pFile->h, rc, reserved)); + + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** Semaphore locks only really support EXCLUSIVE locks. We track intermediate +** lock states in the sqlite3_file structure, but all locks SHARED or +** above are really EXCLUSIVE locks and exclude all other processes from +** access the file. +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int semXLock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + sem_t *pSem = pFile->pInode->pSem; + int rc = SQLITE_OK; + + /* if we already have a lock, it is exclusive. + ** Just adjust level and punt on outta here. */ + if (pFile->eFileLock > NO_LOCK) { + pFile->eFileLock = eFileLock; + rc = SQLITE_OK; + goto sem_end_lock; + } + + /* lock semaphore now but bail out when already locked. */ + if( sem_trywait(pSem)==-1 ){ + rc = SQLITE_BUSY; + goto sem_end_lock; + } + + /* got it, set the type and return ok */ + pFile->eFileLock = eFileLock; + + sem_end_lock: + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int semXUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + sem_t *pSem = pFile->pInode->pSem; + + assert( pFile ); + assert( pSem ); + OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock, + pFile->eFileLock, osGetpid(0))); + assert( eFileLock<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->eFileLock==eFileLock ){ + return SQLITE_OK; + } + + /* shared can just be set because we always have an exclusive */ + if (eFileLock==SHARED_LOCK) { + pFile->eFileLock = eFileLock; + return SQLITE_OK; + } + + /* no, really unlock. */ + if ( sem_post(pSem)==-1 ) { + int rc, tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK); + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + return rc; + } + pFile->eFileLock = NO_LOCK; + return SQLITE_OK; +} + +/* + ** Close a file. + */ +static int semXClose(sqlite3_file *id) { + if( id ){ + unixFile *pFile = (unixFile*)id; + semXUnlock(id, NO_LOCK); + assert( pFile ); + assert( unixFileMutexNotheld(pFile) ); + unixEnterMutex(); + releaseInodeInfo(pFile); + unixLeaveMutex(); + closeUnixFile(id); + } + return SQLITE_OK; +} + +#endif /* OS_VXWORKS */ +/* +** Named semaphore locking is only available on VxWorks. +** +*************** End of the named semaphore lock implementation **************** +******************************************************************************/ + + +/****************************************************************************** +*************************** Begin AFP Locking ********************************* +** +** AFP is the Apple Filing Protocol. AFP is a network filesystem found +** on Apple Macintosh computers - both OS9 and OSX. +** +** Third-party implementations of AFP are available. But this code here +** only works on OSX. +*/ + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +/* +** The afpLockingContext structure contains all afp lock specific state +*/ +typedef struct afpLockingContext afpLockingContext; +struct afpLockingContext { + int reserved; + const char *dbPath; /* Name of the open file */ +}; + +struct ByteRangeLockPB2 +{ + unsigned long long offset; /* offset to first byte to lock */ + unsigned long long length; /* nbr of bytes to lock */ + unsigned long long retRangeStart; /* nbr of 1st byte locked if successful */ + unsigned char unLockFlag; /* 1 = unlock, 0 = lock */ + unsigned char startEndFlag; /* 1=rel to end of fork, 0=rel to start */ + int fd; /* file desc to assoc this lock with */ +}; + +#define afpfsByteRangeLock2FSCTL _IOWR('z', 23, struct ByteRangeLockPB2) + +/* +** This is a utility for setting or clearing a bit-range lock on an +** AFP filesystem. +** +** Return SQLITE_OK on success, SQLITE_BUSY on failure. +*/ +static int afpSetLock( + const char *path, /* Name of the file to be locked or unlocked */ + unixFile *pFile, /* Open file descriptor on path */ + unsigned long long offset, /* First byte to be locked */ + unsigned long long length, /* Number of bytes to lock */ + int setLockFlag /* True to set lock. False to clear lock */ +){ + struct ByteRangeLockPB2 pb; + int err; + + pb.unLockFlag = setLockFlag ? 0 : 1; + pb.startEndFlag = 0; + pb.offset = offset; + pb.length = length; + pb.fd = pFile->h; + + OSTRACE(("AFPSETLOCK [%s] for %d%s in range %llx:%llx\n", + (setLockFlag?"ON":"OFF"), pFile->h, (pb.fd==-1?"[testval-1]":""), + offset, length)); + err = fsctl(path, afpfsByteRangeLock2FSCTL, &pb, 0); + if ( err==-1 ) { + int rc; + int tErrno = errno; + OSTRACE(("AFPSETLOCK failed to fsctl() '%s' %d %s\n", + path, tErrno, strerror(tErrno))); +#ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS + rc = SQLITE_BUSY; +#else + rc = sqliteErrorFromPosixError(tErrno, + setLockFlag ? SQLITE_IOERR_LOCK : SQLITE_IOERR_UNLOCK); +#endif /* SQLITE_IGNORE_AFP_LOCK_ERRORS */ + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + return rc; + } else { + return SQLITE_OK; + } +} + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + afpLockingContext *context; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + context = (afpLockingContext *) pFile->lockingContext; + if( context->reserved ){ + *pResOut = 1; + return SQLITE_OK; + } + sqlite3_mutex_enter(pFile->pInode->pLockMutex); + /* Check if a thread in this process holds such a lock */ + if( pFile->pInode->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. + */ + if( !reserved ){ + /* lock the RESERVED byte */ + int lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1); + if( SQLITE_OK==lrc ){ + /* if we succeeded in taking the reserved lock, unlock it to restore + ** the original state */ + lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0); + } else { + /* if we failed to get the lock then someone else must have it */ + reserved = 1; + } + if( IS_LOCK_ERROR(lrc) ){ + rc=lrc; + } + } + + sqlite3_mutex_leave(pFile->pInode->pLockMutex); + OSTRACE(("TEST WR-LOCK %d %d %d (afp)\n", pFile->h, rc, reserved)); + + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int afpLock(sqlite3_file *id, int eFileLock){ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode = pFile->pInode; + afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; + + assert( pFile ); + OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (afp)\n", pFile->h, + azFileLock(eFileLock), azFileLock(pFile->eFileLock), + azFileLock(pInode->eFileLock), pInode->nShared , osGetpid(0))); + + /* If there is already a lock of this type or more restrictive on the + ** unixFile, do nothing. Don't use the afp_end_lock: exit path, as + ** unixEnterMutex() hasn't been called yet. + */ + if( pFile->eFileLock>=eFileLock ){ + OSTRACE(("LOCK %d %s ok (already held) (afp)\n", pFile->h, + azFileLock(eFileLock))); + return SQLITE_OK; + } + + /* Make sure the locking sequence is correct + ** (1) We never move from unlocked to anything higher than shared lock. + ** (2) SQLite never explicitly requests a pendig lock. + ** (3) A shared lock is always held when a reserve lock is requested. + */ + assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK ); + assert( eFileLock!=PENDING_LOCK ); + assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK ); + + /* This mutex is needed because pFile->pInode is shared across threads + */ + pInode = pFile->pInode; + sqlite3_mutex_enter(pInode->pLockMutex); + + /* If some thread using this PID has a lock via a different unixFile* + ** handle that precludes the requested lock, return BUSY. + */ + if( (pFile->eFileLock!=pInode->eFileLock && + (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK)) + ){ + rc = SQLITE_BUSY; + goto afp_end_lock; + } + + /* If a SHARED lock is requested, and some thread using this PID already + ** has a SHARED or RESERVED lock, then increment reference counts and + ** return SQLITE_OK. + */ + if( eFileLock==SHARED_LOCK && + (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){ + assert( eFileLock==SHARED_LOCK ); + assert( pFile->eFileLock==0 ); + assert( pInode->nShared>0 ); + pFile->eFileLock = SHARED_LOCK; + pInode->nShared++; + pInode->nLock++; + goto afp_end_lock; + } + + /* A PENDING lock is needed before acquiring a SHARED lock and before + ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will + ** be released. + */ + if( eFileLock==SHARED_LOCK + || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLockdbPath, pFile, PENDING_BYTE, 1, 1); + if (failed) { + rc = failed; + goto afp_end_lock; + } + } + + /* If control gets to this point, then actually go ahead and make + ** operating system calls for the specified lock. + */ + if( eFileLock==SHARED_LOCK ){ + int lrc1, lrc2, lrc1Errno = 0; + long lk, mask; + + assert( pInode->nShared==0 ); + assert( pInode->eFileLock==0 ); + + mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff; + /* Now get the read-lock SHARED_LOCK */ + /* note that the quality of the randomness doesn't matter that much */ + lk = random(); + pInode->sharedByte = (lk & mask)%(SHARED_SIZE - 1); + lrc1 = afpSetLock(context->dbPath, pFile, + SHARED_FIRST+pInode->sharedByte, 1, 1); + if( IS_LOCK_ERROR(lrc1) ){ + lrc1Errno = pFile->lastErrno; + } + /* Drop the temporary PENDING lock */ + lrc2 = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0); + + if( IS_LOCK_ERROR(lrc1) ) { + storeLastErrno(pFile, lrc1Errno); + rc = lrc1; + goto afp_end_lock; + } else if( IS_LOCK_ERROR(lrc2) ){ + rc = lrc2; + goto afp_end_lock; + } else if( lrc1 != SQLITE_OK ) { + rc = lrc1; + } else { + pFile->eFileLock = SHARED_LOCK; + pInode->nLock++; + pInode->nShared = 1; + } + }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){ + /* We are trying for an exclusive lock but another thread in this + ** same process is still holding a shared lock. */ + rc = SQLITE_BUSY; + }else{ + /* The request was for a RESERVED or EXCLUSIVE lock. It is + ** assumed that there is a SHARED or greater lock on the file + ** already. + */ + int failed = 0; + assert( 0!=pFile->eFileLock ); + if (eFileLock >= RESERVED_LOCK && pFile->eFileLock < RESERVED_LOCK) { + /* Acquire a RESERVED lock */ + failed = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1); + if( !failed ){ + context->reserved = 1; + } + } + if (!failed && eFileLock == EXCLUSIVE_LOCK) { + /* Acquire an EXCLUSIVE lock */ + + /* Remove the shared lock before trying the range. we'll need to + ** reestablish the shared lock if we can't get the afpUnlock + */ + if( !(failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST + + pInode->sharedByte, 1, 0)) ){ + int failed2 = SQLITE_OK; + /* now attemmpt to get the exclusive lock range */ + failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST, + SHARED_SIZE, 1); + if( failed && (failed2 = afpSetLock(context->dbPath, pFile, + SHARED_FIRST + pInode->sharedByte, 1, 1)) ){ + /* Can't reestablish the shared lock. Sqlite can't deal, this is + ** a critical I/O error + */ + rc = ((failed & 0xff) == SQLITE_IOERR) ? failed2 : + SQLITE_IOERR_LOCK; + goto afp_end_lock; + } + }else{ + rc = failed; + } + } + if( failed ){ + rc = failed; + } + } + + if( rc==SQLITE_OK ){ + pFile->eFileLock = eFileLock; + pInode->eFileLock = eFileLock; + }else if( eFileLock==EXCLUSIVE_LOCK ){ + pFile->eFileLock = PENDING_LOCK; + pInode->eFileLock = PENDING_LOCK; + } + +afp_end_lock: + sqlite3_mutex_leave(pInode->pLockMutex); + OSTRACE(("LOCK %d %s %s (afp)\n", pFile->h, azFileLock(eFileLock), + rc==SQLITE_OK ? "ok" : "failed")); + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int afpUnlock(sqlite3_file *id, int eFileLock) { + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode; + afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; + int skipShared = 0; +#ifdef SQLITE_TEST + int h = pFile->h; +#endif + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, eFileLock, + pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, + osGetpid(0))); + + assert( eFileLock<=SHARED_LOCK ); + if( pFile->eFileLock<=eFileLock ){ + return SQLITE_OK; + } + pInode = pFile->pInode; + sqlite3_mutex_enter(pInode->pLockMutex); + assert( pInode->nShared!=0 ); + if( pFile->eFileLock>SHARED_LOCK ){ + assert( pInode->eFileLock==pFile->eFileLock ); + SimulateIOErrorBenign(1); + SimulateIOError( h=(-1) ) + SimulateIOErrorBenign(0); + +#ifdef SQLITE_DEBUG + /* When reducing a lock such that other processes can start + ** reading the database file again, make sure that the + ** transaction counter was updated if any part of the database + ** file changed. If the transaction counter is not updated, + ** other connections to the same file might not realize that + ** the file has changed and hence might not know to flush their + ** cache. The use of a stale cache can lead to database corruption. + */ + assert( pFile->inNormalWrite==0 + || pFile->dbUpdate==0 + || pFile->transCntrChng==1 ); + pFile->inNormalWrite = 0; +#endif + + if( pFile->eFileLock==EXCLUSIVE_LOCK ){ + rc = afpSetLock(context->dbPath, pFile, SHARED_FIRST, SHARED_SIZE, 0); + if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1) ){ + /* only re-establish the shared lock if necessary */ + int sharedLockByte = SHARED_FIRST+pInode->sharedByte; + rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 1); + } else { + skipShared = 1; + } + } + if( rc==SQLITE_OK && pFile->eFileLock>=PENDING_LOCK ){ + rc = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0); + } + if( rc==SQLITE_OK && pFile->eFileLock>=RESERVED_LOCK && context->reserved ){ + rc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0); + if( !rc ){ + context->reserved = 0; + } + } + if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1)){ + pInode->eFileLock = SHARED_LOCK; + } + } + if( rc==SQLITE_OK && eFileLock==NO_LOCK ){ + + /* Decrement the shared lock counter. Release the lock using an + ** OS call only when all threads in this same process have released + ** the lock. + */ + unsigned long long sharedLockByte = SHARED_FIRST+pInode->sharedByte; + pInode->nShared--; + if( pInode->nShared==0 ){ + SimulateIOErrorBenign(1); + SimulateIOError( h=(-1) ) + SimulateIOErrorBenign(0); + if( !skipShared ){ + rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 0); + } + if( !rc ){ + pInode->eFileLock = NO_LOCK; + pFile->eFileLock = NO_LOCK; + } + } + if( rc==SQLITE_OK ){ + pInode->nLock--; + assert( pInode->nLock>=0 ); + if( pInode->nLock==0 ) closePendingFds(pFile); + } + } + + sqlite3_mutex_leave(pInode->pLockMutex); + if( rc==SQLITE_OK ){ + pFile->eFileLock = eFileLock; + } + return rc; +} + +/* +** Close a file & cleanup AFP specific locking context +*/ +static int afpClose(sqlite3_file *id) { + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + assert( id!=0 ); + afpUnlock(id, NO_LOCK); + assert( unixFileMutexNotheld(pFile) ); + unixEnterMutex(); + if( pFile->pInode ){ + unixInodeInfo *pInode = pFile->pInode; + sqlite3_mutex_enter(pInode->pLockMutex); + if( pInode->nLock ){ + /* If there are outstanding locks, do not actually close the file just + ** yet because that would clear those locks. Instead, add the file + ** descriptor to pInode->aPending. It will be automatically closed when + ** the last lock is cleared. + */ + setPendingFd(pFile); + } + sqlite3_mutex_leave(pInode->pLockMutex); + } + releaseInodeInfo(pFile); + sqlite3_free(pFile->lockingContext); + rc = closeUnixFile(id); + unixLeaveMutex(); + return rc; +} + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ +/* +** The code above is the AFP lock implementation. The code is specific +** to MacOSX and does not work on other unix platforms. No alternative +** is available. If you don't compile for a mac, then the "unix-afp" +** VFS is not available. +** +********************* End of the AFP lock implementation ********************** +******************************************************************************/ + +/****************************************************************************** +*************************** Begin NFS Locking ********************************/ + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +/* + ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock + ** must be either NO_LOCK or SHARED_LOCK. + ** + ** If the locking level of the file descriptor is already at or below + ** the requested locking level, this routine is a no-op. + */ +static int nfsUnlock(sqlite3_file *id, int eFileLock){ + return posixUnlock(id, eFileLock, 1); +} + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ +/* +** The code above is the NFS lock implementation. The code is specific +** to MacOSX and does not work on other unix platforms. No alternative +** is available. +** +********************* End of the NFS lock implementation ********************** +******************************************************************************/ + +/****************************************************************************** +**************** Non-locking sqlite3_file methods ***************************** +** +** The next division contains implementations for all methods of the +** sqlite3_file object other than the locking methods. The locking +** methods were defined in divisions above (one locking method per +** division). Those methods that are common to all locking modes +** are gather together into this division. +*/ + +/* +** Seek to the offset passed as the second argument, then read cnt +** bytes into pBuf. Return the number of bytes actually read. +** +** NB: If you define USE_PREAD or USE_PREAD64, then it might also +** be necessary to define _XOPEN_SOURCE to be 500. This varies from +** one system to another. Since SQLite does not define USE_PREAD +** in any form by default, we will not attempt to define _XOPEN_SOURCE. +** See tickets #2741 and #2681. +** +** To avoid stomping the errno value on a failed read the lastErrno value +** is set before returning. +*/ +static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ + int got; + int prior = 0; +#if (!defined(USE_PREAD) && !defined(USE_PREAD64)) + i64 newOffset; +#endif + TIMER_START; + assert( cnt==(cnt&0x1ffff) ); + assert( id->h>2 ); + do{ +#if defined(USE_PREAD) + got = osPread(id->h, pBuf, cnt, offset); + SimulateIOError( got = -1 ); +#elif defined(USE_PREAD64) + got = osPread64(id->h, pBuf, cnt, offset); + SimulateIOError( got = -1 ); +#else + newOffset = lseek(id->h, offset, SEEK_SET); + SimulateIOError( newOffset = -1 ); + if( newOffset<0 ){ + storeLastErrno((unixFile*)id, errno); + return -1; + } + got = osRead(id->h, pBuf, cnt); +#endif + if( got==cnt ) break; + if( got<0 ){ + if( errno==EINTR ){ got = 1; continue; } + prior = 0; + storeLastErrno((unixFile*)id, errno); + break; + }else if( got>0 ){ + cnt -= got; + offset += got; + prior += got; + pBuf = (void*)(got + (char*)pBuf); + } + }while( got>0 ); + TIMER_END; + OSTRACE(("READ %-3d %5d %7lld %llu\n", + id->h, got+prior, offset-prior, TIMER_ELAPSED)); + return got+prior; +} + +/* +** Read data from a file into a buffer. Return SQLITE_OK if all +** bytes were read successfully and SQLITE_IOERR if anything goes +** wrong. +*/ +static int unixRead( + sqlite3_file *id, + void *pBuf, + int amt, + sqlite3_int64 offset +){ + unixFile *pFile = (unixFile *)id; + int got; + assert( id ); + assert( offset>=0 ); + assert( amt>0 ); + + /* If this is a database file (not a journal, master-journal or temp + ** file), the bytes in the locking range should never be read or written. */ +#if 0 + assert( pFile->pPreallocatedUnused==0 + || offset>=PENDING_BYTE+512 + || offset+amt<=PENDING_BYTE + ); +#endif + +#if SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this read request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); + return SQLITE_OK; + }else{ + int nCopy = pFile->mmapSize - offset; + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + + got = seekAndRead(pFile, offset, pBuf, amt); + if( got==amt ){ + return SQLITE_OK; + }else if( got<0 ){ + /* lastErrno set by seekAndRead */ + return SQLITE_IOERR_READ; + }else{ + storeLastErrno(pFile, 0); /* not a system error */ + /* Unread parts of the buffer must be zero-filled */ + memset(&((char*)pBuf)[got], 0, amt-got); + return SQLITE_IOERR_SHORT_READ; + } +} + +/* +** Attempt to seek the file-descriptor passed as the first argument to +** absolute offset iOff, then attempt to write nBuf bytes of data from +** pBuf to it. If an error occurs, return -1 and set *piErrno. Otherwise, +** return the actual number of bytes written (which may be less than +** nBuf). +*/ +static int seekAndWriteFd( + int fd, /* File descriptor to write to */ + i64 iOff, /* File offset to begin writing at */ + const void *pBuf, /* Copy data from this buffer to the file */ + int nBuf, /* Size of buffer pBuf in bytes */ + int *piErrno /* OUT: Error number if error occurs */ +){ + int rc = 0; /* Value returned by system call */ + + assert( nBuf==(nBuf&0x1ffff) ); + assert( fd>2 ); + assert( piErrno!=0 ); + nBuf &= 0x1ffff; + TIMER_START; + +#if defined(USE_PREAD) + do{ rc = (int)osPwrite(fd, pBuf, nBuf, iOff); }while( rc<0 && errno==EINTR ); +#elif defined(USE_PREAD64) + do{ rc = (int)osPwrite64(fd, pBuf, nBuf, iOff);}while( rc<0 && errno==EINTR); +#else + do{ + i64 iSeek = lseek(fd, iOff, SEEK_SET); + SimulateIOError( iSeek = -1 ); + if( iSeek<0 ){ + rc = -1; + break; + } + rc = osWrite(fd, pBuf, nBuf); + }while( rc<0 && errno==EINTR ); +#endif + + TIMER_END; + OSTRACE(("WRITE %-3d %5d %7lld %llu\n", fd, rc, iOff, TIMER_ELAPSED)); + + if( rc<0 ) *piErrno = errno; + return rc; +} + + +/* +** Seek to the offset in id->offset then read cnt bytes into pBuf. +** Return the number of bytes actually read. Update the offset. +** +** To avoid stomping the errno value on a failed write the lastErrno value +** is set before returning. +*/ +static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){ + return seekAndWriteFd(id->h, offset, pBuf, cnt, &id->lastErrno); +} + + +/* +** Write data from a buffer into a file. Return SQLITE_OK on success +** or some other error code on failure. +*/ +static int unixWrite( + sqlite3_file *id, + const void *pBuf, + int amt, + sqlite3_int64 offset +){ + unixFile *pFile = (unixFile*)id; + int wrote = 0; + assert( id ); + assert( amt>0 ); + + /* If this is a database file (not a journal, master-journal or temp + ** file), the bytes in the locking range should never be read or written. */ +#if 0 + assert( pFile->pPreallocatedUnused==0 + || offset>=PENDING_BYTE+512 + || offset+amt<=PENDING_BYTE + ); +#endif + +#ifdef SQLITE_DEBUG + /* If we are doing a normal write to a database file (as opposed to + ** doing a hot-journal rollback or a write to some file other than a + ** normal database file) then record the fact that the database + ** has changed. If the transaction counter is modified, record that + ** fact too. + */ + if( pFile->inNormalWrite ){ + pFile->dbUpdate = 1; /* The database has been modified */ + if( offset<=24 && offset+amt>=27 ){ + int rc; + char oldCntr[4]; + SimulateIOErrorBenign(1); + rc = seekAndRead(pFile, 24, oldCntr, 4); + SimulateIOErrorBenign(0); + if( rc!=4 || memcmp(oldCntr, &((char*)pBuf)[24-offset], 4)!=0 ){ + pFile->transCntrChng = 1; /* The transaction counter has changed */ + } + } + } +#endif + +#if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this write request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, amt); + return SQLITE_OK; + }else{ + int nCopy = pFile->mmapSize - offset; + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + + while( (wrote = seekAndWrite(pFile, offset, pBuf, amt))0 ){ + amt -= wrote; + offset += wrote; + pBuf = &((char*)pBuf)[wrote]; + } + SimulateIOError(( wrote=(-1), amt=1 )); + SimulateDiskfullError(( wrote=0, amt=1 )); + + if( amt>wrote ){ + if( wrote<0 && pFile->lastErrno!=ENOSPC ){ + /* lastErrno set by seekAndWrite */ + return SQLITE_IOERR_WRITE; + }else{ + storeLastErrno(pFile, 0); /* not a system error */ + return SQLITE_FULL; + } + } + + return SQLITE_OK; +} + +#ifdef SQLITE_TEST +/* +** Count the number of fullsyncs and normal syncs. This is used to test +** that syncs and fullsyncs are occurring at the right times. +*/ +SQLITE_API int sqlite3_sync_count = 0; +SQLITE_API int sqlite3_fullsync_count = 0; +#endif + +/* +** We do not trust systems to provide a working fdatasync(). Some do. +** Others do no. To be safe, we will stick with the (slightly slower) +** fsync(). If you know that your system does support fdatasync() correctly, +** then simply compile with -Dfdatasync=fdatasync or -DHAVE_FDATASYNC +*/ +#if !defined(fdatasync) && !HAVE_FDATASYNC +# define fdatasync fsync +#endif + +/* +** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not +** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently +** only available on Mac OS X. But that could change. +*/ +#ifdef F_FULLFSYNC +# define HAVE_FULLFSYNC 1 +#else +# define HAVE_FULLFSYNC 0 +#endif + + +/* +** The fsync() system call does not work as advertised on many +** unix systems. The following procedure is an attempt to make +** it work better. +** +** The SQLITE_NO_SYNC macro disables all fsync()s. This is useful +** for testing when we want to run through the test suite quickly. +** You are strongly advised *not* to deploy with SQLITE_NO_SYNC +** enabled, however, since with SQLITE_NO_SYNC enabled, an OS crash +** or power failure will likely corrupt the database file. +** +** SQLite sets the dataOnly flag if the size of the file is unchanged. +** The idea behind dataOnly is that it should only write the file content +** to disk, not the inode. We only set dataOnly if the file size is +** unchanged since the file size is part of the inode. However, +** Ted Ts'o tells us that fdatasync() will also write the inode if the +** file size has changed. The only real difference between fdatasync() +** and fsync(), Ted tells us, is that fdatasync() will not flush the +** inode if the mtime or owner or other inode attributes have changed. +** We only care about the file size, not the other file attributes, so +** as far as SQLite is concerned, an fdatasync() is always adequate. +** So, we always use fdatasync() if it is available, regardless of +** the value of the dataOnly flag. +*/ +static int full_fsync(int fd, int fullSync, int dataOnly){ + int rc; + + /* The following "ifdef/elif/else/" block has the same structure as + ** the one below. It is replicated here solely to avoid cluttering + ** up the real code with the UNUSED_PARAMETER() macros. + */ +#ifdef SQLITE_NO_SYNC + UNUSED_PARAMETER(fd); + UNUSED_PARAMETER(fullSync); + UNUSED_PARAMETER(dataOnly); +#elif HAVE_FULLFSYNC + UNUSED_PARAMETER(dataOnly); +#else + UNUSED_PARAMETER(fullSync); + UNUSED_PARAMETER(dataOnly); +#endif + + /* Record the number of times that we do a normal fsync() and + ** FULLSYNC. This is used during testing to verify that this procedure + ** gets called with the correct arguments. + */ +#ifdef SQLITE_TEST + if( fullSync ) sqlite3_fullsync_count++; + sqlite3_sync_count++; +#endif + + /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a + ** no-op. But go ahead and call fstat() to validate the file + ** descriptor as we need a method to provoke a failure during + ** coverate testing. + */ +#ifdef SQLITE_NO_SYNC + { + struct stat buf; + rc = osFstat(fd, &buf); + } +#elif HAVE_FULLFSYNC + if( fullSync ){ + rc = osFcntl(fd, F_FULLFSYNC, 0); + }else{ + rc = 1; + } + /* If the FULLFSYNC failed, fall back to attempting an fsync(). + ** It shouldn't be possible for fullfsync to fail on the local + ** file system (on OSX), so failure indicates that FULLFSYNC + ** isn't supported for this file system. So, attempt an fsync + ** and (for now) ignore the overhead of a superfluous fcntl call. + ** It'd be better to detect fullfsync support once and avoid + ** the fcntl call every time sync is called. + */ + if( rc ) rc = fsync(fd); + +#elif defined(__APPLE__) + /* fdatasync() on HFS+ doesn't yet flush the file size if it changed correctly + ** so currently we default to the macro that redefines fdatasync to fsync + */ + rc = fsync(fd); +#else + rc = fdatasync(fd); +#if OS_VXWORKS + if( rc==-1 && errno==ENOTSUP ){ + rc = fsync(fd); + } +#endif /* OS_VXWORKS */ +#endif /* ifdef SQLITE_NO_SYNC elif HAVE_FULLFSYNC */ + + if( OS_VXWORKS && rc!= -1 ){ + rc = 0; + } + return rc; +} + +/* +** Open a file descriptor to the directory containing file zFilename. +** If successful, *pFd is set to the opened file descriptor and +** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM +** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined +** value. +** +** The directory file descriptor is used for only one thing - to +** fsync() a directory to make sure file creation and deletion events +** are flushed to disk. Such fsyncs are not needed on newer +** journaling filesystems, but are required on older filesystems. +** +** This routine can be overridden using the xSetSysCall interface. +** The ability to override this routine was added in support of the +** chromium sandbox. Opening a directory is a security risk (we are +** told) so making it overrideable allows the chromium sandbox to +** replace this routine with a harmless no-op. To make this routine +** a no-op, replace it with a stub that returns SQLITE_OK but leaves +** *pFd set to a negative number. +** +** If SQLITE_OK is returned, the caller is responsible for closing +** the file descriptor *pFd using close(). +*/ +static int openDirectory(const char *zFilename, int *pFd){ + int ii; + int fd = -1; + char zDirname[MAX_PATHNAME+1]; + + sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); + for(ii=(int)strlen(zDirname); ii>0 && zDirname[ii]!='/'; ii--); + if( ii>0 ){ + zDirname[ii] = '\0'; + }else{ + if( zDirname[0]!='/' ) zDirname[0] = '.'; + zDirname[1] = 0; + } + fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); + if( fd>=0 ){ + OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); + } + *pFd = fd; + if( fd>=0 ) return SQLITE_OK; + return unixLogError(SQLITE_CANTOPEN_BKPT, "openDirectory", zDirname); +} + +/* +** Make sure all writes to a particular file are committed to disk. +** +** If dataOnly==0 then both the file itself and its metadata (file +** size, access time, etc) are synced. If dataOnly!=0 then only the +** file data is synced. +** +** Under Unix, also make sure that the directory entry for the file +** has been created by fsync-ing the directory that contains the file. +** If we do not do this and we encounter a power failure, the directory +** entry for the journal might not exist after we reboot. The next +** SQLite to access the file will not know that the journal exists (because +** the directory entry for the journal was never created) and the transaction +** will not roll back - possibly leading to database corruption. +*/ +static int unixSync(sqlite3_file *id, int flags){ + int rc; + unixFile *pFile = (unixFile*)id; + + int isDataOnly = (flags&SQLITE_SYNC_DATAONLY); + int isFullsync = (flags&0x0F)==SQLITE_SYNC_FULL; + + /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ + assert((flags&0x0F)==SQLITE_SYNC_NORMAL + || (flags&0x0F)==SQLITE_SYNC_FULL + ); + + /* Unix cannot, but some systems may return SQLITE_FULL from here. This + ** line is to test that doing so does not cause any problems. + */ + SimulateDiskfullError( return SQLITE_FULL ); + + assert( pFile ); + OSTRACE(("SYNC %-3d\n", pFile->h)); + rc = full_fsync(pFile->h, isFullsync, isDataOnly); + SimulateIOError( rc=1 ); + if( rc ){ + storeLastErrno(pFile, errno); + return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath); + } + + /* Also fsync the directory containing the file if the DIRSYNC flag + ** is set. This is a one-time occurrence. Many systems (examples: AIX) + ** are unable to fsync a directory, so ignore errors on the fsync. + */ + if( pFile->ctrlFlags & UNIXFILE_DIRSYNC ){ + int dirfd; + OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, + HAVE_FULLFSYNC, isFullsync)); + rc = osOpenDirectory(pFile->zPath, &dirfd); + if( rc==SQLITE_OK ){ + full_fsync(dirfd, 0, 0); + robust_close(pFile, dirfd, __LINE__); + }else{ + assert( rc==SQLITE_CANTOPEN ); + rc = SQLITE_OK; + } + pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC; + } + return rc; +} + +/* +** Truncate an open file to a specified size +*/ +static int unixTruncate(sqlite3_file *id, i64 nByte){ + unixFile *pFile = (unixFile *)id; + int rc; + assert( pFile ); + SimulateIOError( return SQLITE_IOERR_TRUNCATE ); + + /* If the user has configured a chunk-size for this file, truncate the + ** file so that it consists of an integer number of chunks (i.e. the + ** actual file size after the operation may be larger than the requested + ** size). + */ + if( pFile->szChunk>0 ){ + nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk; + } + + rc = robust_ftruncate(pFile->h, nByte); + if( rc ){ + storeLastErrno(pFile, errno); + return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); + }else{ +#ifdef SQLITE_DEBUG + /* If we are doing a normal write to a database file (as opposed to + ** doing a hot-journal rollback or a write to some file other than a + ** normal database file) and we truncate the file to zero length, + ** that effectively updates the change counter. This might happen + ** when restoring a database using the backup API from a zero-length + ** source. + */ + if( pFile->inNormalWrite && nByte==0 ){ + pFile->transCntrChng = 1; + } +#endif + +#if SQLITE_MAX_MMAP_SIZE>0 + /* If the file was just truncated to a size smaller than the currently + ** mapped region, reduce the effective mapping size as well. SQLite will + ** use read() and write() to access data beyond this point from now on. + */ + if( nBytemmapSize ){ + pFile->mmapSize = nByte; + } +#endif + + return SQLITE_OK; + } +} + +/* +** Determine the current size of a file in bytes +*/ +static int unixFileSize(sqlite3_file *id, i64 *pSize){ + int rc; + struct stat buf; + assert( id ); + rc = osFstat(((unixFile*)id)->h, &buf); + SimulateIOError( rc=1 ); + if( rc!=0 ){ + storeLastErrno((unixFile*)id, errno); + return SQLITE_IOERR_FSTAT; + } + *pSize = buf.st_size; + + /* When opening a zero-size database, the findInodeInfo() procedure + ** writes a single byte into that file in order to work around a bug + ** in the OS-X msdos filesystem. In order to avoid problems with upper + ** layers, we need to report this file size as zero even though it is + ** really 1. Ticket #3260. + */ + if( *pSize==1 ) *pSize = 0; + + + return SQLITE_OK; +} + +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) +/* +** Handler for proxy-locking file-control verbs. Defined below in the +** proxying locking division. +*/ +static int proxyFileControl(sqlite3_file*,int,void*); +#endif + +/* +** This function is called to handle the SQLITE_FCNTL_SIZE_HINT +** file-control operation. Enlarge the database to nBytes in size +** (rounded up to the next chunk-size). If the database is already +** nBytes or larger, this routine is a no-op. +*/ +static int fcntlSizeHint(unixFile *pFile, i64 nByte){ + if( pFile->szChunk>0 ){ + i64 nSize; /* Required file size */ + struct stat buf; /* Used to hold return values of fstat() */ + + if( osFstat(pFile->h, &buf) ){ + return SQLITE_IOERR_FSTAT; + } + + nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; + if( nSize>(i64)buf.st_size ){ + +#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE + /* The code below is handling the return value of osFallocate() + ** correctly. posix_fallocate() is defined to "returns zero on success, + ** or an error number on failure". See the manpage for details. */ + int err; + do{ + err = osFallocate(pFile->h, buf.st_size, nSize-buf.st_size); + }while( err==EINTR ); + if( err && err!=EINVAL ) return SQLITE_IOERR_WRITE; +#else + /* If the OS does not have posix_fallocate(), fake it. Write a + ** single byte to the last byte in each block that falls entirely + ** within the extended region. Then, if required, a single byte + ** at offset (nSize-1), to set the size of the file correctly. + ** This is a similar technique to that used by glibc on systems + ** that do not have a real fallocate() call. + */ + int nBlk = buf.st_blksize; /* File-system block size */ + int nWrite = 0; /* Number of bytes written by seekAndWrite */ + i64 iWrite; /* Next offset to write to */ + + iWrite = (buf.st_size/nBlk)*nBlk + nBlk - 1; + assert( iWrite>=buf.st_size ); + assert( ((iWrite+1)%nBlk)==0 ); + for(/*no-op*/; iWrite=nSize ) iWrite = nSize - 1; + nWrite = seekAndWrite(pFile, iWrite, "", 1); + if( nWrite!=1 ) return SQLITE_IOERR_WRITE; + } +#endif + } + } + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->mmapSizeMax>0 && nByte>pFile->mmapSize ){ + int rc; + if( pFile->szChunk<=0 ){ + if( robust_ftruncate(pFile->h, nByte) ){ + storeLastErrno(pFile, errno); + return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); + } + } + + rc = unixMapfile(pFile, nByte); + return rc; + } +#endif + + return SQLITE_OK; +} + +/* +** If *pArg is initially negative then this is a query. Set *pArg to +** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. +** +** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags. +*/ +static void unixModeBit(unixFile *pFile, unsigned char mask, int *pArg){ + if( *pArg<0 ){ + *pArg = (pFile->ctrlFlags & mask)!=0; + }else if( (*pArg)==0 ){ + pFile->ctrlFlags &= ~mask; + }else{ + pFile->ctrlFlags |= mask; + } +} + +/* Forward declaration */ +static int unixGetTempname(int nBuf, char *zBuf); + +/* +** Information and control of an open file handle. +*/ +static int unixFileControl(sqlite3_file *id, int op, void *pArg){ + unixFile *pFile = (unixFile*)id; + switch( op ){ +#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + case SQLITE_FCNTL_BEGIN_ATOMIC_WRITE: { + int rc = osIoctl(pFile->h, F2FS_IOC_START_ATOMIC_WRITE); + return rc ? SQLITE_IOERR_BEGIN_ATOMIC : SQLITE_OK; + } + case SQLITE_FCNTL_COMMIT_ATOMIC_WRITE: { + int rc = osIoctl(pFile->h, F2FS_IOC_COMMIT_ATOMIC_WRITE); + return rc ? SQLITE_IOERR_COMMIT_ATOMIC : SQLITE_OK; + } + case SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE: { + int rc = osIoctl(pFile->h, F2FS_IOC_ABORT_VOLATILE_WRITE); + return rc ? SQLITE_IOERR_ROLLBACK_ATOMIC : SQLITE_OK; + } +#endif /* __linux__ && SQLITE_ENABLE_BATCH_ATOMIC_WRITE */ + + case SQLITE_FCNTL_LOCKSTATE: { + *(int*)pArg = pFile->eFileLock; + return SQLITE_OK; + } + case SQLITE_FCNTL_LAST_ERRNO: { + *(int*)pArg = pFile->lastErrno; + return SQLITE_OK; + } + case SQLITE_FCNTL_CHUNK_SIZE: { + pFile->szChunk = *(int *)pArg; + return SQLITE_OK; + } + case SQLITE_FCNTL_SIZE_HINT: { + int rc; + SimulateIOErrorBenign(1); + rc = fcntlSizeHint(pFile, *(i64 *)pArg); + SimulateIOErrorBenign(0); + return rc; + } + case SQLITE_FCNTL_PERSIST_WAL: { + unixModeBit(pFile, UNIXFILE_PERSIST_WAL, (int*)pArg); + return SQLITE_OK; + } + case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { + unixModeBit(pFile, UNIXFILE_PSOW, (int*)pArg); + return SQLITE_OK; + } + case SQLITE_FCNTL_VFSNAME: { + *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); + return SQLITE_OK; + } + case SQLITE_FCNTL_TEMPFILENAME: { + char *zTFile = sqlite3_malloc64( pFile->pVfs->mxPathname ); + if( zTFile ){ + unixGetTempname(pFile->pVfs->mxPathname, zTFile); + *(char**)pArg = zTFile; + } + return SQLITE_OK; + } + case SQLITE_FCNTL_HAS_MOVED: { + *(int*)pArg = fileHasMoved(pFile); + return SQLITE_OK; + } +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + case SQLITE_FCNTL_LOCK_TIMEOUT: { + int iOld = pFile->iBusyTimeout; + pFile->iBusyTimeout = *(int*)pArg; + *(int*)pArg = iOld; + return SQLITE_OK; + } +#endif +#if SQLITE_MAX_MMAP_SIZE>0 + case SQLITE_FCNTL_MMAP_SIZE: { + i64 newLimit = *(i64*)pArg; + int rc = SQLITE_OK; + if( newLimit>sqlite3GlobalConfig.mxMmap ){ + newLimit = sqlite3GlobalConfig.mxMmap; + } + + /* The value of newLimit may be eventually cast to (size_t) and passed + ** to mmap(). Restrict its value to 2GB if (size_t) is not at least a + ** 64-bit type. */ + if( newLimit>0 && sizeof(size_t)<8 ){ + newLimit = (newLimit & 0x7FFFFFFF); + } + + *(i64*)pArg = pFile->mmapSizeMax; + if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ + pFile->mmapSizeMax = newLimit; + if( pFile->mmapSize>0 ){ + unixUnmapfile(pFile); + rc = unixMapfile(pFile, -1); + } + } + return rc; + } +#endif +#ifdef SQLITE_DEBUG + /* The pager calls this method to signal that it has done + ** a rollback and that the database is therefore unchanged and + ** it hence it is OK for the transaction change counter to be + ** unchanged. + */ + case SQLITE_FCNTL_DB_UNCHANGED: { + ((unixFile*)id)->dbUpdate = 0; + return SQLITE_OK; + } +#endif +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + case SQLITE_FCNTL_SET_LOCKPROXYFILE: + case SQLITE_FCNTL_GET_LOCKPROXYFILE: { + return proxyFileControl(id,op,pArg); + } +#endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */ + } + return SQLITE_NOTFOUND; +} + +/* +** If pFd->sectorSize is non-zero when this function is called, it is a +** no-op. Otherwise, the values of pFd->sectorSize and +** pFd->deviceCharacteristics are set according to the file-system +** characteristics. +** +** There are two versions of this function. One for QNX and one for all +** other systems. +*/ +#ifndef __QNXNTO__ +static void setDeviceCharacteristics(unixFile *pFd){ + assert( pFd->deviceCharacteristics==0 || pFd->sectorSize!=0 ); + if( pFd->sectorSize==0 ){ +#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + int res; + u32 f = 0; + + /* Check for support for F2FS atomic batch writes. */ + res = osIoctl(pFd->h, F2FS_IOC_GET_FEATURES, &f); + if( res==0 && (f & F2FS_FEATURE_ATOMIC_WRITE) ){ + pFd->deviceCharacteristics = SQLITE_IOCAP_BATCH_ATOMIC; + } +#endif /* __linux__ && SQLITE_ENABLE_BATCH_ATOMIC_WRITE */ + + /* Set the POWERSAFE_OVERWRITE flag if requested. */ + if( pFd->ctrlFlags & UNIXFILE_PSOW ){ + pFd->deviceCharacteristics |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; + } + + pFd->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; + } +} +#else +#include +#include +static void setDeviceCharacteristics(unixFile *pFile){ + if( pFile->sectorSize == 0 ){ + struct statvfs fsInfo; + + /* Set defaults for non-supported filesystems */ + pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; + pFile->deviceCharacteristics = 0; + if( fstatvfs(pFile->h, &fsInfo) == -1 ) { + return; + } + + if( !strcmp(fsInfo.f_basetype, "tmp") ) { + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + SQLITE_IOCAP_ATOMIC4K | /* All ram filesystem writes are atomic */ + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( strstr(fsInfo.f_basetype, "etfs") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + /* etfs cluster size writes are atomic */ + (pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) | + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( !strcmp(fsInfo.f_basetype, "qnx6") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + SQLITE_IOCAP_ATOMIC | /* All filesystem writes are atomic */ + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( !strcmp(fsInfo.f_basetype, "qnx4") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + /* full bitset of atomics from max sector size and smaller */ + ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 | + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( strstr(fsInfo.f_basetype, "dos") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + /* full bitset of atomics from max sector size and smaller */ + ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 | + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else{ + pFile->deviceCharacteristics = + SQLITE_IOCAP_ATOMIC512 | /* blocks are atomic */ + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + 0; + } + } + /* Last chance verification. If the sector size isn't a multiple of 512 + ** then it isn't valid.*/ + if( pFile->sectorSize % 512 != 0 ){ + pFile->deviceCharacteristics = 0; + pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; + } +} +#endif + +/* +** Return the sector size in bytes of the underlying block device for +** the specified file. This is almost always 512 bytes, but may be +** larger for some devices. +** +** SQLite code assumes this function cannot fail. It also assumes that +** if two files are created in the same file-system directory (i.e. +** a database and its journal file) that the sector size will be the +** same for both. +*/ +static int unixSectorSize(sqlite3_file *id){ + unixFile *pFd = (unixFile*)id; + setDeviceCharacteristics(pFd); + return pFd->sectorSize; +} + +/* +** Return the device characteristics for the file. +** +** This VFS is set up to return SQLITE_IOCAP_POWERSAFE_OVERWRITE by default. +** However, that choice is controversial since technically the underlying +** file system does not always provide powersafe overwrites. (In other +** words, after a power-loss event, parts of the file that were never +** written might end up being altered.) However, non-PSOW behavior is very, +** very rare. And asserting PSOW makes a large reduction in the amount +** of required I/O for journaling, since a lot of padding is eliminated. +** Hence, while POWERSAFE_OVERWRITE is on by default, there is a file-control +** available to turn it off and URI query parameter available to turn it off. +*/ +static int unixDeviceCharacteristics(sqlite3_file *id){ + unixFile *pFd = (unixFile*)id; + setDeviceCharacteristics(pFd); + return pFd->deviceCharacteristics; +} + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + +/* +** Return the system page size. +** +** This function should not be called directly by other code in this file. +** Instead, it should be called via macro osGetpagesize(). +*/ +static int unixGetpagesize(void){ +#if OS_VXWORKS + return 1024; +#elif defined(_BSD_SOURCE) + return getpagesize(); +#else + return (int)sysconf(_SC_PAGESIZE); +#endif +} + +#endif /* !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 */ + +#ifndef SQLITE_OMIT_WAL + +/* +** Object used to represent an shared memory buffer. +** +** When multiple threads all reference the same wal-index, each thread +** has its own unixShm object, but they all point to a single instance +** of this unixShmNode object. In other words, each wal-index is opened +** only once per process. +** +** Each unixShmNode object is connected to a single unixInodeInfo object. +** We could coalesce this object into unixInodeInfo, but that would mean +** every open file that does not use shared memory (in other words, most +** open files) would have to carry around this extra information. So +** the unixInodeInfo object contains a pointer to this unixShmNode object +** and the unixShmNode object is created only when needed. +** +** unixMutexHeld() must be true when creating or destroying +** this object or while reading or writing the following fields: +** +** nRef +** +** The following fields are read-only after the object is created: +** +** hShm +** zFilename +** +** Either unixShmNode.pShmMutex must be held or unixShmNode.nRef==0 and +** unixMutexHeld() is true when reading or writing any other field +** in this structure. +*/ +struct unixShmNode { + unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */ + sqlite3_mutex *pShmMutex; /* Mutex to access this object */ + char *zFilename; /* Name of the mmapped file */ + int hShm; /* Open file descriptor */ + int szRegion; /* Size of shared-memory regions */ + u16 nRegion; /* Size of array apRegion */ + u8 isReadonly; /* True if read-only */ + u8 isUnlocked; /* True if no DMS lock held */ + char **apRegion; /* Array of mapped shared-memory regions */ + int nRef; /* Number of unixShm objects pointing to this */ + unixShm *pFirst; /* All unixShm objects pointing to this */ +#ifdef SQLITE_DEBUG + u8 exclMask; /* Mask of exclusive locks held */ + u8 sharedMask; /* Mask of shared locks held */ + u8 nextShmId; /* Next available unixShm.id value */ +#endif +}; + +/* +** Structure used internally by this VFS to record the state of an +** open shared memory connection. +** +** The following fields are initialized when this object is created and +** are read-only thereafter: +** +** unixShm.pShmNode +** unixShm.id +** +** All other fields are read/write. The unixShm.pShmNode->pShmMutex must +** be held while accessing any read/write fields. +*/ +struct unixShm { + unixShmNode *pShmNode; /* The underlying unixShmNode object */ + unixShm *pNext; /* Next unixShm with the same unixShmNode */ + u8 hasMutex; /* True if holding the unixShmNode->pShmMutex */ + u8 id; /* Id of this connection within its unixShmNode */ + u16 sharedMask; /* Mask of shared locks held */ + u16 exclMask; /* Mask of exclusive locks held */ +}; + +/* +** Constants used for locking +*/ +#define UNIX_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ +#define UNIX_SHM_DMS (UNIX_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ + +/* +** Apply posix advisory locks for all bytes from ofst through ofst+n-1. +** +** Locks block if the mask is exactly UNIX_SHM_C and are non-blocking +** otherwise. +*/ +static int unixShmSystemLock( + unixFile *pFile, /* Open connection to the WAL file */ + int lockType, /* F_UNLCK, F_RDLCK, or F_WRLCK */ + int ofst, /* First byte of the locking range */ + int n /* Number of bytes to lock */ +){ + unixShmNode *pShmNode; /* Apply locks to this open shared-memory segment */ + struct flock f; /* The posix advisory locking structure */ + int rc = SQLITE_OK; /* Result code form fcntl() */ + + /* Access to the unixShmNode object is serialized by the caller */ + pShmNode = pFile->pInode->pShmNode; + assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->pShmMutex) ); + assert( pShmNode->nRef>0 || unixMutexHeld() ); + + /* Shared locks never span more than one byte */ + assert( n==1 || lockType!=F_RDLCK ); + + /* Locks are within range */ + assert( n>=1 && n<=SQLITE_SHM_NLOCK ); + + if( pShmNode->hShm>=0 ){ + int res; + /* Initialize the locking parameters */ + f.l_type = lockType; + f.l_whence = SEEK_SET; + f.l_start = ofst; + f.l_len = n; + res = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile); + if( res==-1 ){ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + rc = (pFile->iBusyTimeout ? SQLITE_BUSY_TIMEOUT : SQLITE_BUSY); +#else + rc = SQLITE_BUSY; +#endif + } + } + + /* Update the global lock state and do debug tracing */ +#ifdef SQLITE_DEBUG + { u16 mask; + OSTRACE(("SHM-LOCK ")); + mask = ofst>31 ? 0xffff : (1<<(ofst+n)) - (1<exclMask &= ~mask; + pShmNode->sharedMask &= ~mask; + }else if( lockType==F_RDLCK ){ + OSTRACE(("read-lock %d ok", ofst)); + pShmNode->exclMask &= ~mask; + pShmNode->sharedMask |= mask; + }else{ + assert( lockType==F_WRLCK ); + OSTRACE(("write-lock %d ok", ofst)); + pShmNode->exclMask |= mask; + pShmNode->sharedMask &= ~mask; + } + }else{ + if( lockType==F_UNLCK ){ + OSTRACE(("unlock %d failed", ofst)); + }else if( lockType==F_RDLCK ){ + OSTRACE(("read-lock failed")); + }else{ + assert( lockType==F_WRLCK ); + OSTRACE(("write-lock %d failed", ofst)); + } + } + OSTRACE((" - afterwards %03x,%03x\n", + pShmNode->sharedMask, pShmNode->exclMask)); + } +#endif + + return rc; +} + +/* +** Return the minimum number of 32KB shm regions that should be mapped at +** a time, assuming that each mapping must be an integer multiple of the +** current system page-size. +** +** Usually, this is 1. The exception seems to be systems that are configured +** to use 64KB pages - in this case each mapping must cover at least two +** shm regions. +*/ +static int unixShmRegionPerMap(void){ + int shmsz = 32*1024; /* SHM region size */ + int pgsz = osGetpagesize(); /* System page size */ + assert( ((pgsz-1)&pgsz)==0 ); /* Page size must be a power of 2 */ + if( pgszpInode->pShmNode; + assert( unixMutexHeld() ); + if( p && ALWAYS(p->nRef==0) ){ + int nShmPerMap = unixShmRegionPerMap(); + int i; + assert( p->pInode==pFd->pInode ); + sqlite3_mutex_free(p->pShmMutex); + for(i=0; inRegion; i+=nShmPerMap){ + if( p->hShm>=0 ){ + osMunmap(p->apRegion[i], p->szRegion); + }else{ + sqlite3_free(p->apRegion[i]); + } + } + sqlite3_free(p->apRegion); + if( p->hShm>=0 ){ + robust_close(pFd, p->hShm, __LINE__); + p->hShm = -1; + } + p->pInode->pShmNode = 0; + sqlite3_free(p); + } +} + +/* +** The DMS lock has not yet been taken on shm file pShmNode. Attempt to +** take it now. Return SQLITE_OK if successful, or an SQLite error +** code otherwise. +** +** If the DMS cannot be locked because this is a readonly_shm=1 +** connection and no other process already holds a lock, return +** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1. +*/ +static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ + struct flock lock; + int rc = SQLITE_OK; + + /* Use F_GETLK to determine the locks other processes are holding + ** on the DMS byte. If it indicates that another process is holding + ** a SHARED lock, then this process may also take a SHARED lock + ** and proceed with opening the *-shm file. + ** + ** Or, if no other process is holding any lock, then this process + ** is the first to open it. In this case take an EXCLUSIVE lock on the + ** DMS byte and truncate the *-shm file to zero bytes in size. Then + ** downgrade to a SHARED lock on the DMS byte. + ** + ** If another process is holding an EXCLUSIVE lock on the DMS byte, + ** return SQLITE_BUSY to the caller (it will try again). An earlier + ** version of this code attempted the SHARED lock at this point. But + ** this introduced a subtle race condition: if the process holding + ** EXCLUSIVE failed just before truncating the *-shm file, then this + ** process might open and use the *-shm file without truncating it. + ** And if the *-shm file has been corrupted by a power failure or + ** system crash, the database itself may also become corrupt. */ + lock.l_whence = SEEK_SET; + lock.l_start = UNIX_SHM_DMS; + lock.l_len = 1; + lock.l_type = F_WRLCK; + if( osFcntl(pShmNode->hShm, F_GETLK, &lock)!=0 ) { + rc = SQLITE_IOERR_LOCK; + }else if( lock.l_type==F_UNLCK ){ + if( pShmNode->isReadonly ){ + pShmNode->isUnlocked = 1; + rc = SQLITE_READONLY_CANTINIT; + }else{ + rc = unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1); + /* The first connection to attach must truncate the -shm file. We + ** truncate to 3 bytes (an arbitrary small number, less than the + ** -shm header size) rather than 0 as a system debugging aid, to + ** help detect if a -shm file truncation is legitimate or is the work + ** or a rogue process. */ + if( rc==SQLITE_OK && robust_ftruncate(pShmNode->hShm, 3) ){ + rc = unixLogError(SQLITE_IOERR_SHMOPEN,"ftruncate",pShmNode->zFilename); + } + } + }else if( lock.l_type==F_WRLCK ){ + rc = SQLITE_BUSY; + } + + if( rc==SQLITE_OK ){ + assert( lock.l_type==F_UNLCK || lock.l_type==F_RDLCK ); + rc = unixShmSystemLock(pDbFd, F_RDLCK, UNIX_SHM_DMS, 1); + } + return rc; +} + +/* +** Open a shared-memory area associated with open database file pDbFd. +** This particular implementation uses mmapped files. +** +** The file used to implement shared-memory is in the same directory +** as the open database file and has the same name as the open database +** file with the "-shm" suffix added. For example, if the database file +** is "/home/user1/config.db" then the file that is created and mmapped +** for shared memory will be called "/home/user1/config.db-shm". +** +** Another approach to is to use files in /dev/shm or /dev/tmp or an +** some other tmpfs mount. But if a file in a different directory +** from the database file is used, then differing access permissions +** or a chroot() might cause two different processes on the same +** database to end up using different files for shared memory - +** meaning that their memory would not really be shared - resulting +** in database corruption. Nevertheless, this tmpfs file usage +** can be enabled at compile-time using -DSQLITE_SHM_DIRECTORY="/dev/shm" +** or the equivalent. The use of the SQLITE_SHM_DIRECTORY compile-time +** option results in an incompatible build of SQLite; builds of SQLite +** that with differing SQLITE_SHM_DIRECTORY settings attempt to use the +** same database file at the same time, database corruption will likely +** result. The SQLITE_SHM_DIRECTORY compile-time option is considered +** "unsupported" and may go away in a future SQLite release. +** +** When opening a new shared-memory file, if no other instances of that +** file are currently open, in this process or in other processes, then +** the file must be truncated to zero length or have its header cleared. +** +** If the original database file (pDbFd) is using the "unix-excl" VFS +** that means that an exclusive lock is held on the database file and +** that no other processes are able to read or write the database. In +** that case, we do not really need shared memory. No shared memory +** file is created. The shared memory will be simulated with heap memory. +*/ +static int unixOpenSharedMemory(unixFile *pDbFd){ + struct unixShm *p = 0; /* The connection to be opened */ + struct unixShmNode *pShmNode; /* The underlying mmapped file */ + int rc = SQLITE_OK; /* Result code */ + unixInodeInfo *pInode; /* The inode of fd */ + char *zShm; /* Name of the file used for SHM */ + int nShmFilename; /* Size of the SHM filename in bytes */ + + /* Allocate space for the new unixShm object. */ + p = sqlite3_malloc64( sizeof(*p) ); + if( p==0 ) return SQLITE_NOMEM_BKPT; + memset(p, 0, sizeof(*p)); + assert( pDbFd->pShm==0 ); + + /* Check to see if a unixShmNode object already exists. Reuse an existing + ** one if present. Create a new one if necessary. + */ + assert( unixFileMutexNotheld(pDbFd) ); + unixEnterMutex(); + pInode = pDbFd->pInode; + pShmNode = pInode->pShmNode; + if( pShmNode==0 ){ + struct stat sStat; /* fstat() info for database file */ +#ifndef SQLITE_SHM_DIRECTORY + const char *zBasePath = pDbFd->zPath; +#endif + + /* Call fstat() to figure out the permissions on the database file. If + ** a new *-shm file is created, an attempt will be made to create it + ** with the same permissions. + */ + if( osFstat(pDbFd->h, &sStat) ){ + rc = SQLITE_IOERR_FSTAT; + goto shm_open_err; + } + +#ifdef SQLITE_SHM_DIRECTORY + nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 31; +#else + nShmFilename = 6 + (int)strlen(zBasePath); +#endif + pShmNode = sqlite3_malloc64( sizeof(*pShmNode) + nShmFilename ); + if( pShmNode==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shm_open_err; + } + memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename); + zShm = pShmNode->zFilename = (char*)&pShmNode[1]; +#ifdef SQLITE_SHM_DIRECTORY + sqlite3_snprintf(nShmFilename, zShm, + SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x", + (u32)sStat.st_ino, (u32)sStat.st_dev); +#else + sqlite3_snprintf(nShmFilename, zShm, "%s-shm", zBasePath); + sqlite3FileSuffix3(pDbFd->zPath, zShm); +#endif + pShmNode->hShm = -1; + pDbFd->pInode->pShmNode = pShmNode; + pShmNode->pInode = pDbFd->pInode; + if( sqlite3GlobalConfig.bCoreMutex ){ + pShmNode->pShmMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->pShmMutex==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shm_open_err; + } + } + + if( pInode->bProcessLock==0 ){ + if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ + pShmNode->hShm = robust_open(zShm, O_RDWR|O_CREAT|O_NOFOLLOW, + (sStat.st_mode&0777)); + } + if( pShmNode->hShm<0 ){ + pShmNode->hShm = robust_open(zShm, O_RDONLY|O_NOFOLLOW, + (sStat.st_mode&0777)); + if( pShmNode->hShm<0 ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShm); + goto shm_open_err; + } + pShmNode->isReadonly = 1; + } + + /* If this process is running as root, make sure that the SHM file + ** is owned by the same user that owns the original database. Otherwise, + ** the original owner will not be able to connect. + */ + robustFchown(pShmNode->hShm, sStat.st_uid, sStat.st_gid); + + rc = unixLockSharedMemory(pDbFd, pShmNode); + if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err; + } + } + + /* Make the new connection a child of the unixShmNode */ + p->pShmNode = pShmNode; +#ifdef SQLITE_DEBUG + p->id = pShmNode->nextShmId++; +#endif + pShmNode->nRef++; + pDbFd->pShm = p; + unixLeaveMutex(); + + /* The reference count on pShmNode has already been incremented under + ** the cover of the unixEnterMutex() mutex and the pointer from the + ** new (struct unixShm) object to the pShmNode has been set. All that is + ** left to do is to link the new object into the linked list starting + ** at pShmNode->pFirst. This must be done while holding the + ** pShmNode->pShmMutex. + */ + sqlite3_mutex_enter(pShmNode->pShmMutex); + p->pNext = pShmNode->pFirst; + pShmNode->pFirst = p; + sqlite3_mutex_leave(pShmNode->pShmMutex); + return rc; + + /* Jump here on any error */ +shm_open_err: + unixShmPurge(pDbFd); /* This call frees pShmNode if required */ + sqlite3_free(p); + unixLeaveMutex(); + return rc; +} + +/* +** This function is called to obtain a pointer to region iRegion of the +** shared-memory associated with the database file fd. Shared-memory regions +** are numbered starting from zero. Each shared-memory region is szRegion +** bytes in size. +** +** If an error occurs, an error code is returned and *pp is set to NULL. +** +** Otherwise, if the bExtend parameter is 0 and the requested shared-memory +** region has not been allocated (by any client, including one running in a +** separate process), then *pp is set to NULL and SQLITE_OK returned. If +** bExtend is non-zero and the requested shared-memory region has not yet +** been allocated, it is allocated by this function. +** +** If the shared-memory region has already been allocated or is allocated by +** this call as described above, then it is mapped into this processes +** address space (if it is not already), *pp is set to point to the mapped +** memory and SQLITE_OK returned. +*/ +static int unixShmMap( + sqlite3_file *fd, /* Handle open on database file */ + int iRegion, /* Region to retrieve */ + int szRegion, /* Size of regions */ + int bExtend, /* True to extend file if necessary */ + void volatile **pp /* OUT: Mapped memory */ +){ + unixFile *pDbFd = (unixFile*)fd; + unixShm *p; + unixShmNode *pShmNode; + int rc = SQLITE_OK; + int nShmPerMap = unixShmRegionPerMap(); + int nReqRegion; + + /* If the shared-memory file has not yet been opened, open it now. */ + if( pDbFd->pShm==0 ){ + rc = unixOpenSharedMemory(pDbFd); + if( rc!=SQLITE_OK ) return rc; + } + + p = pDbFd->pShm; + pShmNode = p->pShmNode; + sqlite3_mutex_enter(pShmNode->pShmMutex); + if( pShmNode->isUnlocked ){ + rc = unixLockSharedMemory(pDbFd, pShmNode); + if( rc!=SQLITE_OK ) goto shmpage_out; + pShmNode->isUnlocked = 0; + } + assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); + assert( pShmNode->pInode==pDbFd->pInode ); + assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); + assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); + + /* Minimum number of regions required to be mapped. */ + nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap; + + if( pShmNode->nRegionszRegion = szRegion; + + if( pShmNode->hShm>=0 ){ + /* The requested region is not mapped into this processes address space. + ** Check to see if it has been allocated (i.e. if the wal-index file is + ** large enough to contain the requested region). + */ + if( osFstat(pShmNode->hShm, &sStat) ){ + rc = SQLITE_IOERR_SHMSIZE; + goto shmpage_out; + } + + if( sStat.st_sizehShm, iPg*pgsz + pgsz-1,"",1,&x)!=1 ){ + const char *zFile = pShmNode->zFilename; + rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile); + goto shmpage_out; + } + } + } + } + } + + /* Map the requested memory region into this processes address space. */ + apNew = (char **)sqlite3_realloc( + pShmNode->apRegion, nReqRegion*sizeof(char *) + ); + if( !apNew ){ + rc = SQLITE_IOERR_NOMEM_BKPT; + goto shmpage_out; + } + pShmNode->apRegion = apNew; + while( pShmNode->nRegionhShm>=0 ){ + pMem = osMmap(0, nMap, + pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, + MAP_SHARED, pShmNode->hShm, szRegion*(i64)pShmNode->nRegion + ); + if( pMem==MAP_FAILED ){ + rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename); + goto shmpage_out; + } + }else{ + pMem = sqlite3_malloc64(nMap); + if( pMem==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shmpage_out; + } + memset(pMem, 0, nMap); + } + + for(i=0; iapRegion[pShmNode->nRegion+i] = &((char*)pMem)[szRegion*i]; + } + pShmNode->nRegion += nShmPerMap; + } + } + +shmpage_out: + if( pShmNode->nRegion>iRegion ){ + *pp = pShmNode->apRegion[iRegion]; + }else{ + *pp = 0; + } + if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; + sqlite3_mutex_leave(pShmNode->pShmMutex); + return rc; +} + +/* +** Change the lock state for a shared-memory segment. +** +** Note that the relationship between SHAREd and EXCLUSIVE locks is a little +** different here than in posix. In xShmLock(), one can go from unlocked +** to shared and back or from unlocked to exclusive and back. But one may +** not go from shared to exclusive or from exclusive to shared. +*/ +static int unixShmLock( + sqlite3_file *fd, /* Database file holding the shared memory */ + int ofst, /* First lock to acquire or release */ + int n, /* Number of locks to acquire or release */ + int flags /* What to do with the lock */ +){ + unixFile *pDbFd = (unixFile*)fd; /* Connection holding shared memory */ + unixShm *p = pDbFd->pShm; /* The shared memory being locked */ + unixShm *pX; /* For looping over all siblings */ + unixShmNode *pShmNode = p->pShmNode; /* The underlying file iNode */ + int rc = SQLITE_OK; /* Result code */ + u16 mask; /* Mask of locks to take or release */ + + assert( pShmNode==pDbFd->pInode->pShmNode ); + assert( pShmNode->pInode==pDbFd->pInode ); + assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK ); + assert( n>=1 ); + assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); + assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); + assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); + assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); + + /* Check that, if this to be a blocking lock, no locks that occur later + ** in the following list than the lock being obtained are already held: + ** + ** 1. Checkpointer lock (ofst==1). + ** 2. Write lock (ofst==0). + ** 3. Read locks (ofst>=3 && ofstiBusyTimeout==0 || ( + (ofst!=2) /* not RECOVER */ + && (ofst!=1 || (p->exclMask|p->sharedMask)==0) + && (ofst!=0 || (p->exclMask|p->sharedMask)<3) + && (ofst<3 || (p->exclMask|p->sharedMask)<(1<1 || mask==(1<pShmMutex); + if( flags & SQLITE_SHM_UNLOCK ){ + u16 allMask = 0; /* Mask of locks held by siblings */ + + /* See if any siblings hold this same lock */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( pX==p ) continue; + assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 ); + allMask |= pX->sharedMask; + } + + /* Unlock the system-level locks */ + if( (mask & allMask)==0 ){ + rc = unixShmSystemLock(pDbFd, F_UNLCK, ofst+UNIX_SHM_BASE, n); + }else{ + rc = SQLITE_OK; + } + + /* Undo the local locks */ + if( rc==SQLITE_OK ){ + p->exclMask &= ~mask; + p->sharedMask &= ~mask; + } + }else if( flags & SQLITE_SHM_SHARED ){ + u16 allShared = 0; /* Union of locks held by connections other than "p" */ + + /* Find out which shared locks are already held by sibling connections. + ** If any sibling already holds an exclusive lock, go ahead and return + ** SQLITE_BUSY. + */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( (pX->exclMask & mask)!=0 ){ + rc = SQLITE_BUSY; + break; + } + allShared |= pX->sharedMask; + } + + /* Get shared locks at the system level, if necessary */ + if( rc==SQLITE_OK ){ + if( (allShared & mask)==0 ){ + rc = unixShmSystemLock(pDbFd, F_RDLCK, ofst+UNIX_SHM_BASE, n); + }else{ + rc = SQLITE_OK; + } + } + + /* Get the local shared locks */ + if( rc==SQLITE_OK ){ + p->sharedMask |= mask; + } + }else{ + /* Make sure no sibling connections hold locks that will block this + ** lock. If any do, return SQLITE_BUSY right away. + */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){ + rc = SQLITE_BUSY; + break; + } + } + + /* Get the exclusive locks at the system level. Then if successful + ** also mark the local connection as being locked. + */ + if( rc==SQLITE_OK ){ + rc = unixShmSystemLock(pDbFd, F_WRLCK, ofst+UNIX_SHM_BASE, n); + if( rc==SQLITE_OK ){ + assert( (p->sharedMask & mask)==0 ); + p->exclMask |= mask; + } + } + } + sqlite3_mutex_leave(pShmNode->pShmMutex); + OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n", + p->id, osGetpid(0), p->sharedMask, p->exclMask)); + return rc; +} + +/* +** Implement a memory barrier or memory fence on shared memory. +** +** All loads and stores begun before the barrier must complete before +** any load or store begun after the barrier. +*/ +static void unixShmBarrier( + sqlite3_file *fd /* Database file holding the shared memory */ +){ + UNUSED_PARAMETER(fd); + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + assert( fd->pMethods->xLock==nolockLock + || unixFileMutexNotheld((unixFile*)fd) + ); + unixEnterMutex(); /* Also mutex, for redundancy */ + unixLeaveMutex(); +} + +/* +** Close a connection to shared-memory. Delete the underlying +** storage if deleteFlag is true. +** +** If there is no shared memory associated with the connection then this +** routine is a harmless no-op. +*/ +static int unixShmUnmap( + sqlite3_file *fd, /* The underlying database file */ + int deleteFlag /* Delete shared-memory if true */ +){ + unixShm *p; /* The connection to be closed */ + unixShmNode *pShmNode; /* The underlying shared-memory file */ + unixShm **pp; /* For looping over sibling connections */ + unixFile *pDbFd; /* The underlying database file */ + + pDbFd = (unixFile*)fd; + p = pDbFd->pShm; + if( p==0 ) return SQLITE_OK; + pShmNode = p->pShmNode; + + assert( pShmNode==pDbFd->pInode->pShmNode ); + assert( pShmNode->pInode==pDbFd->pInode ); + + /* Remove connection p from the set of connections associated + ** with pShmNode */ + sqlite3_mutex_enter(pShmNode->pShmMutex); + for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){} + *pp = p->pNext; + + /* Free the connection p */ + sqlite3_free(p); + pDbFd->pShm = 0; + sqlite3_mutex_leave(pShmNode->pShmMutex); + + /* If pShmNode->nRef has reached 0, then close the underlying + ** shared-memory file, too */ + assert( unixFileMutexNotheld(pDbFd) ); + unixEnterMutex(); + assert( pShmNode->nRef>0 ); + pShmNode->nRef--; + if( pShmNode->nRef==0 ){ + if( deleteFlag && pShmNode->hShm>=0 ){ + osUnlink(pShmNode->zFilename); + } + unixShmPurge(pDbFd); + } + unixLeaveMutex(); + + return SQLITE_OK; +} + + +#else +# define unixShmMap 0 +# define unixShmLock 0 +# define unixShmBarrier 0 +# define unixShmUnmap 0 +#endif /* #ifndef SQLITE_OMIT_WAL */ + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** If it is currently memory mapped, unmap file pFd. +*/ +static void unixUnmapfile(unixFile *pFd){ + assert( pFd->nFetchOut==0 ); + if( pFd->pMapRegion ){ + osMunmap(pFd->pMapRegion, pFd->mmapSizeActual); + pFd->pMapRegion = 0; + pFd->mmapSize = 0; + pFd->mmapSizeActual = 0; + } +} + +/* +** Attempt to set the size of the memory mapping maintained by file +** descriptor pFd to nNew bytes. Any existing mapping is discarded. +** +** If successful, this function sets the following variables: +** +** unixFile.pMapRegion +** unixFile.mmapSize +** unixFile.mmapSizeActual +** +** If unsuccessful, an error message is logged via sqlite3_log() and +** the three variables above are zeroed. In this case SQLite should +** continue accessing the database using the xRead() and xWrite() +** methods. +*/ +static void unixRemapfile( + unixFile *pFd, /* File descriptor object */ + i64 nNew /* Required mapping size */ +){ + const char *zErr = "mmap"; + int h = pFd->h; /* File descriptor open on db file */ + u8 *pOrig = (u8 *)pFd->pMapRegion; /* Pointer to current file mapping */ + i64 nOrig = pFd->mmapSizeActual; /* Size of pOrig region in bytes */ + u8 *pNew = 0; /* Location of new mapping */ + int flags = PROT_READ; /* Flags to pass to mmap() */ + + assert( pFd->nFetchOut==0 ); + assert( nNew>pFd->mmapSize ); + assert( nNew<=pFd->mmapSizeMax ); + assert( nNew>0 ); + assert( pFd->mmapSizeActual>=pFd->mmapSize ); + assert( MAP_FAILED!=0 ); + +#ifdef SQLITE_MMAP_READWRITE + if( (pFd->ctrlFlags & UNIXFILE_RDONLY)==0 ) flags |= PROT_WRITE; +#endif + + if( pOrig ){ +#if HAVE_MREMAP + i64 nReuse = pFd->mmapSize; +#else + const int szSyspage = osGetpagesize(); + i64 nReuse = (pFd->mmapSize & ~(szSyspage-1)); +#endif + u8 *pReq = &pOrig[nReuse]; + + /* Unmap any pages of the existing mapping that cannot be reused. */ + if( nReuse!=nOrig ){ + osMunmap(pReq, nOrig-nReuse); + } + +#if HAVE_MREMAP + pNew = osMremap(pOrig, nReuse, nNew, MREMAP_MAYMOVE); + zErr = "mremap"; +#else + pNew = osMmap(pReq, nNew-nReuse, flags, MAP_SHARED, h, nReuse); + if( pNew!=MAP_FAILED ){ + if( pNew!=pReq ){ + osMunmap(pNew, nNew - nReuse); + pNew = 0; + }else{ + pNew = pOrig; + } + } +#endif + + /* The attempt to extend the existing mapping failed. Free it. */ + if( pNew==MAP_FAILED || pNew==0 ){ + osMunmap(pOrig, nReuse); + } + } + + /* If pNew is still NULL, try to create an entirely new mapping. */ + if( pNew==0 ){ + pNew = osMmap(0, nNew, flags, MAP_SHARED, h, 0); + } + + if( pNew==MAP_FAILED ){ + pNew = 0; + nNew = 0; + unixLogError(SQLITE_OK, zErr, pFd->zPath); + + /* If the mmap() above failed, assume that all subsequent mmap() calls + ** will probably fail too. Fall back to using xRead/xWrite exclusively + ** in this case. */ + pFd->mmapSizeMax = 0; + } + pFd->pMapRegion = (void *)pNew; + pFd->mmapSize = pFd->mmapSizeActual = nNew; +} + +/* +** Memory map or remap the file opened by file-descriptor pFd (if the file +** is already mapped, the existing mapping is replaced by the new). Or, if +** there already exists a mapping for this file, and there are still +** outstanding xFetch() references to it, this function is a no-op. +** +** If parameter nByte is non-negative, then it is the requested size of +** the mapping to create. Otherwise, if nByte is less than zero, then the +** requested size is the size of the file on disk. The actual size of the +** created mapping is either the requested size or the value configured +** using SQLITE_FCNTL_MMAP_LIMIT, whichever is smaller. +** +** SQLITE_OK is returned if no error occurs (even if the mapping is not +** recreated as a result of outstanding references) or an SQLite error +** code otherwise. +*/ +static int unixMapfile(unixFile *pFd, i64 nMap){ + assert( nMap>=0 || pFd->nFetchOut==0 ); + assert( nMap>0 || (pFd->mmapSize==0 && pFd->pMapRegion==0) ); + if( pFd->nFetchOut>0 ) return SQLITE_OK; + + if( nMap<0 ){ + struct stat statbuf; /* Low-level file information */ + if( osFstat(pFd->h, &statbuf) ){ + return SQLITE_IOERR_FSTAT; + } + nMap = statbuf.st_size; + } + if( nMap>pFd->mmapSizeMax ){ + nMap = pFd->mmapSizeMax; + } + + assert( nMap>0 || (pFd->mmapSize==0 && pFd->pMapRegion==0) ); + if( nMap!=pFd->mmapSize ){ + unixRemapfile(pFd, nMap); + } + + return SQLITE_OK; +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* +** If possible, return a pointer to a mapping of file fd starting at offset +** iOff. The mapping must be valid for at least nAmt bytes. +** +** If such a pointer can be obtained, store it in *pp and return SQLITE_OK. +** Or, if one cannot but no error occurs, set *pp to 0 and return SQLITE_OK. +** Finally, if an error does occur, return an SQLite error code. The final +** value of *pp is undefined in this case. +** +** If this function does return a pointer, the caller must eventually +** release the reference by calling unixUnfetch(). +*/ +static int unixFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ +#if SQLITE_MAX_MMAP_SIZE>0 + unixFile *pFd = (unixFile *)fd; /* The underlying database file */ +#endif + *pp = 0; + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFd->mmapSizeMax>0 ){ + if( pFd->pMapRegion==0 ){ + int rc = unixMapfile(pFd, -1); + if( rc!=SQLITE_OK ) return rc; + } + if( pFd->mmapSize >= iOff+nAmt ){ + *pp = &((u8 *)pFd->pMapRegion)[iOff]; + pFd->nFetchOut++; + } + } +#endif + return SQLITE_OK; +} + +/* +** If the third argument is non-NULL, then this function releases a +** reference obtained by an earlier call to unixFetch(). The second +** argument passed to this function must be the same as the corresponding +** argument that was passed to the unixFetch() invocation. +** +** Or, if the third argument is NULL, then this function is being called +** to inform the VFS layer that, according to POSIX, any existing mapping +** may now be invalid and should be unmapped. +*/ +static int unixUnfetch(sqlite3_file *fd, i64 iOff, void *p){ +#if SQLITE_MAX_MMAP_SIZE>0 + unixFile *pFd = (unixFile *)fd; /* The underlying database file */ + UNUSED_PARAMETER(iOff); + + /* If p==0 (unmap the entire file) then there must be no outstanding + ** xFetch references. Or, if p!=0 (meaning it is an xFetch reference), + ** then there must be at least one outstanding. */ + assert( (p==0)==(pFd->nFetchOut==0) ); + + /* If p!=0, it must match the iOff value. */ + assert( p==0 || p==&((u8 *)pFd->pMapRegion)[iOff] ); + + if( p ){ + pFd->nFetchOut--; + }else{ + unixUnmapfile(pFd); + } + + assert( pFd->nFetchOut>=0 ); +#else + UNUSED_PARAMETER(fd); + UNUSED_PARAMETER(p); + UNUSED_PARAMETER(iOff); +#endif + return SQLITE_OK; +} + +/* +** Here ends the implementation of all sqlite3_file methods. +** +********************** End sqlite3_file Methods ******************************* +******************************************************************************/ + +/* +** This division contains definitions of sqlite3_io_methods objects that +** implement various file locking strategies. It also contains definitions +** of "finder" functions. A finder-function is used to locate the appropriate +** sqlite3_io_methods object for a particular database file. The pAppData +** field of the sqlite3_vfs VFS objects are initialized to be pointers to +** the correct finder-function for that VFS. +** +** Most finder functions return a pointer to a fixed sqlite3_io_methods +** object. The only interesting finder-function is autolockIoFinder, which +** looks at the filesystem type and tries to guess the best locking +** strategy from that. +** +** For finder-function F, two objects are created: +** +** (1) The real finder-function named "FImpt()". +** +** (2) A constant pointer to this function named just "F". +** +** +** A pointer to the F pointer is used as the pAppData value for VFS +** objects. We have to do this instead of letting pAppData point +** directly at the finder-function since C90 rules prevent a void* +** from be cast into a function pointer. +** +** +** Each instance of this macro generates two objects: +** +** * A constant sqlite3_io_methods object call METHOD that has locking +** methods CLOSE, LOCK, UNLOCK, CKRESLOCK. +** +** * An I/O method finder function called FINDER that returns a pointer +** to the METHOD object in the previous bullet. +*/ +#define IOMETHODS(FINDER,METHOD,VERSION,CLOSE,LOCK,UNLOCK,CKLOCK,SHMMAP) \ +static const sqlite3_io_methods METHOD = { \ + VERSION, /* iVersion */ \ + CLOSE, /* xClose */ \ + unixRead, /* xRead */ \ + unixWrite, /* xWrite */ \ + unixTruncate, /* xTruncate */ \ + unixSync, /* xSync */ \ + unixFileSize, /* xFileSize */ \ + LOCK, /* xLock */ \ + UNLOCK, /* xUnlock */ \ + CKLOCK, /* xCheckReservedLock */ \ + unixFileControl, /* xFileControl */ \ + unixSectorSize, /* xSectorSize */ \ + unixDeviceCharacteristics, /* xDeviceCapabilities */ \ + SHMMAP, /* xShmMap */ \ + unixShmLock, /* xShmLock */ \ + unixShmBarrier, /* xShmBarrier */ \ + unixShmUnmap, /* xShmUnmap */ \ + unixFetch, /* xFetch */ \ + unixUnfetch, /* xUnfetch */ \ +}; \ +static const sqlite3_io_methods *FINDER##Impl(const char *z, unixFile *p){ \ + UNUSED_PARAMETER(z); UNUSED_PARAMETER(p); \ + return &METHOD; \ +} \ +static const sqlite3_io_methods *(*const FINDER)(const char*,unixFile *p) \ + = FINDER##Impl; + +/* +** Here are all of the sqlite3_io_methods objects for each of the +** locking strategies. Functions that return pointers to these methods +** are also created. +*/ +IOMETHODS( + posixIoFinder, /* Finder function name */ + posixIoMethods, /* sqlite3_io_methods object name */ + 3, /* shared memory and mmap are enabled */ + unixClose, /* xClose method */ + unixLock, /* xLock method */ + unixUnlock, /* xUnlock method */ + unixCheckReservedLock, /* xCheckReservedLock method */ + unixShmMap /* xShmMap method */ +) +IOMETHODS( + nolockIoFinder, /* Finder function name */ + nolockIoMethods, /* sqlite3_io_methods object name */ + 3, /* shared memory and mmap are enabled */ + nolockClose, /* xClose method */ + nolockLock, /* xLock method */ + nolockUnlock, /* xUnlock method */ + nolockCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +IOMETHODS( + dotlockIoFinder, /* Finder function name */ + dotlockIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + dotlockClose, /* xClose method */ + dotlockLock, /* xLock method */ + dotlockUnlock, /* xUnlock method */ + dotlockCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) + +#if SQLITE_ENABLE_LOCKING_STYLE +IOMETHODS( + flockIoFinder, /* Finder function name */ + flockIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + flockClose, /* xClose method */ + flockLock, /* xLock method */ + flockUnlock, /* xUnlock method */ + flockCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +#if OS_VXWORKS +IOMETHODS( + semIoFinder, /* Finder function name */ + semIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + semXClose, /* xClose method */ + semXLock, /* xLock method */ + semXUnlock, /* xUnlock method */ + semXCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +IOMETHODS( + afpIoFinder, /* Finder function name */ + afpIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + afpClose, /* xClose method */ + afpLock, /* xLock method */ + afpUnlock, /* xUnlock method */ + afpCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +/* +** The proxy locking method is a "super-method" in the sense that it +** opens secondary file descriptors for the conch and lock files and +** it uses proxy, dot-file, AFP, and flock() locking methods on those +** secondary files. For this reason, the division that implements +** proxy locking is located much further down in the file. But we need +** to go ahead and define the sqlite3_io_methods and finder function +** for proxy locking here. So we forward declare the I/O methods. +*/ +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +static int proxyClose(sqlite3_file*); +static int proxyLock(sqlite3_file*, int); +static int proxyUnlock(sqlite3_file*, int); +static int proxyCheckReservedLock(sqlite3_file*, int*); +IOMETHODS( + proxyIoFinder, /* Finder function name */ + proxyIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + proxyClose, /* xClose method */ + proxyLock, /* xLock method */ + proxyUnlock, /* xUnlock method */ + proxyCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +/* nfs lockd on OSX 10.3+ doesn't clear write locks when a read lock is set */ +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +IOMETHODS( + nfsIoFinder, /* Finder function name */ + nfsIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + unixClose, /* xClose method */ + unixLock, /* xLock method */ + nfsUnlock, /* xUnlock method */ + unixCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +/* +** This "finder" function attempts to determine the best locking strategy +** for the database file "filePath". It then returns the sqlite3_io_methods +** object that implements that strategy. +** +** This is for MacOSX only. +*/ +static const sqlite3_io_methods *autolockIoFinderImpl( + const char *filePath, /* name of the database file */ + unixFile *pNew /* open file object for the database file */ +){ + static const struct Mapping { + const char *zFilesystem; /* Filesystem type name */ + const sqlite3_io_methods *pMethods; /* Appropriate locking method */ + } aMap[] = { + { "hfs", &posixIoMethods }, + { "ufs", &posixIoMethods }, + { "afpfs", &afpIoMethods }, + { "smbfs", &afpIoMethods }, + { "webdav", &nolockIoMethods }, + { 0, 0 } + }; + int i; + struct statfs fsInfo; + struct flock lockInfo; + + if( !filePath ){ + /* If filePath==NULL that means we are dealing with a transient file + ** that does not need to be locked. */ + return &nolockIoMethods; + } + if( statfs(filePath, &fsInfo) != -1 ){ + if( fsInfo.f_flags & MNT_RDONLY ){ + return &nolockIoMethods; + } + for(i=0; aMap[i].zFilesystem; i++){ + if( strcmp(fsInfo.f_fstypename, aMap[i].zFilesystem)==0 ){ + return aMap[i].pMethods; + } + } + } + + /* Default case. Handles, amongst others, "nfs". + ** Test byte-range lock using fcntl(). If the call succeeds, + ** assume that the file-system supports POSIX style locks. + */ + lockInfo.l_len = 1; + lockInfo.l_start = 0; + lockInfo.l_whence = SEEK_SET; + lockInfo.l_type = F_RDLCK; + if( osFcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) { + if( strcmp(fsInfo.f_fstypename, "nfs")==0 ){ + return &nfsIoMethods; + } else { + return &posixIoMethods; + } + }else{ + return &dotlockIoMethods; + } +} +static const sqlite3_io_methods + *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ + +#if OS_VXWORKS +/* +** This "finder" function for VxWorks checks to see if posix advisory +** locking works. If it does, then that is what is used. If it does not +** work, then fallback to named semaphore locking. +*/ +static const sqlite3_io_methods *vxworksIoFinderImpl( + const char *filePath, /* name of the database file */ + unixFile *pNew /* the open file object */ +){ + struct flock lockInfo; + + if( !filePath ){ + /* If filePath==NULL that means we are dealing with a transient file + ** that does not need to be locked. */ + return &nolockIoMethods; + } + + /* Test if fcntl() is supported and use POSIX style locks. + ** Otherwise fall back to the named semaphore method. + */ + lockInfo.l_len = 1; + lockInfo.l_start = 0; + lockInfo.l_whence = SEEK_SET; + lockInfo.l_type = F_RDLCK; + if( osFcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) { + return &posixIoMethods; + }else{ + return &semIoMethods; + } +} +static const sqlite3_io_methods + *(*const vxworksIoFinder)(const char*,unixFile*) = vxworksIoFinderImpl; + +#endif /* OS_VXWORKS */ + +/* +** An abstract type for a pointer to an IO method finder function: +*/ +typedef const sqlite3_io_methods *(*finder_type)(const char*,unixFile*); + + +/**************************************************************************** +**************************** sqlite3_vfs methods **************************** +** +** This division contains the implementation of methods on the +** sqlite3_vfs object. +*/ + +/* +** Initialize the contents of the unixFile structure pointed to by pId. +*/ +static int fillInUnixFile( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + int h, /* Open file descriptor of file being opened */ + sqlite3_file *pId, /* Write to the unixFile structure here */ + const char *zFilename, /* Name of the file being opened */ + int ctrlFlags /* Zero or more UNIXFILE_* values */ +){ + const sqlite3_io_methods *pLockingStyle; + unixFile *pNew = (unixFile *)pId; + int rc = SQLITE_OK; + + assert( pNew->pInode==NULL ); + + /* No locking occurs in temporary files */ + assert( zFilename!=0 || (ctrlFlags & UNIXFILE_NOLOCK)!=0 ); + + OSTRACE(("OPEN %-3d %s\n", h, zFilename)); + pNew->h = h; + pNew->pVfs = pVfs; + pNew->zPath = zFilename; + pNew->ctrlFlags = (u8)ctrlFlags; +#if SQLITE_MAX_MMAP_SIZE>0 + pNew->mmapSizeMax = sqlite3GlobalConfig.szMmap; +#endif + if( sqlite3_uri_boolean(((ctrlFlags & UNIXFILE_URI) ? zFilename : 0), + "psow", SQLITE_POWERSAFE_OVERWRITE) ){ + pNew->ctrlFlags |= UNIXFILE_PSOW; + } + if( strcmp(pVfs->zName,"unix-excl")==0 ){ + pNew->ctrlFlags |= UNIXFILE_EXCL; + } + +#if OS_VXWORKS + pNew->pId = vxworksFindFileId(zFilename); + if( pNew->pId==0 ){ + ctrlFlags |= UNIXFILE_NOLOCK; + rc = SQLITE_NOMEM_BKPT; + } +#endif + + if( ctrlFlags & UNIXFILE_NOLOCK ){ + pLockingStyle = &nolockIoMethods; + }else{ + pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew); +#if SQLITE_ENABLE_LOCKING_STYLE + /* Cache zFilename in the locking context (AFP and dotlock override) for + ** proxyLock activation is possible (remote proxy is based on db name) + ** zFilename remains valid until file is closed, to support */ + pNew->lockingContext = (void*)zFilename; +#endif + } + + if( pLockingStyle == &posixIoMethods +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE + || pLockingStyle == &nfsIoMethods +#endif + ){ + unixEnterMutex(); + rc = findInodeInfo(pNew, &pNew->pInode); + if( rc!=SQLITE_OK ){ + /* If an error occurred in findInodeInfo(), close the file descriptor + ** immediately, before releasing the mutex. findInodeInfo() may fail + ** in two scenarios: + ** + ** (a) A call to fstat() failed. + ** (b) A malloc failed. + ** + ** Scenario (b) may only occur if the process is holding no other + ** file descriptors open on the same file. If there were other file + ** descriptors on this file, then no malloc would be required by + ** findInodeInfo(). If this is the case, it is quite safe to close + ** handle h - as it is guaranteed that no posix locks will be released + ** by doing so. + ** + ** If scenario (a) caused the error then things are not so safe. The + ** implicit assumption here is that if fstat() fails, things are in + ** such bad shape that dropping a lock or two doesn't matter much. + */ + robust_close(pNew, h, __LINE__); + h = -1; + } + unixLeaveMutex(); + } + +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + else if( pLockingStyle == &afpIoMethods ){ + /* AFP locking uses the file path so it needs to be included in + ** the afpLockingContext. + */ + afpLockingContext *pCtx; + pNew->lockingContext = pCtx = sqlite3_malloc64( sizeof(*pCtx) ); + if( pCtx==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + /* NB: zFilename exists and remains valid until the file is closed + ** according to requirement F11141. So we do not need to make a + ** copy of the filename. */ + pCtx->dbPath = zFilename; + pCtx->reserved = 0; + srandomdev(); + unixEnterMutex(); + rc = findInodeInfo(pNew, &pNew->pInode); + if( rc!=SQLITE_OK ){ + sqlite3_free(pNew->lockingContext); + robust_close(pNew, h, __LINE__); + h = -1; + } + unixLeaveMutex(); + } + } +#endif + + else if( pLockingStyle == &dotlockIoMethods ){ + /* Dotfile locking uses the file path so it needs to be included in + ** the dotlockLockingContext + */ + char *zLockFile; + int nFilename; + assert( zFilename!=0 ); + nFilename = (int)strlen(zFilename) + 6; + zLockFile = (char *)sqlite3_malloc64(nFilename); + if( zLockFile==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename); + } + pNew->lockingContext = zLockFile; + } + +#if OS_VXWORKS + else if( pLockingStyle == &semIoMethods ){ + /* Named semaphore locking uses the file path so it needs to be + ** included in the semLockingContext + */ + unixEnterMutex(); + rc = findInodeInfo(pNew, &pNew->pInode); + if( (rc==SQLITE_OK) && (pNew->pInode->pSem==NULL) ){ + char *zSemName = pNew->pInode->aSemName; + int n; + sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem", + pNew->pId->zCanonicalName); + for( n=1; zSemName[n]; n++ ) + if( zSemName[n]=='/' ) zSemName[n] = '_'; + pNew->pInode->pSem = sem_open(zSemName, O_CREAT, 0666, 1); + if( pNew->pInode->pSem == SEM_FAILED ){ + rc = SQLITE_NOMEM_BKPT; + pNew->pInode->aSemName[0] = '\0'; + } + } + unixLeaveMutex(); + } +#endif + + storeLastErrno(pNew, 0); +#if OS_VXWORKS + if( rc!=SQLITE_OK ){ + if( h>=0 ) robust_close(pNew, h, __LINE__); + h = -1; + osUnlink(zFilename); + pNew->ctrlFlags |= UNIXFILE_DELETE; + } +#endif + if( rc!=SQLITE_OK ){ + if( h>=0 ) robust_close(pNew, h, __LINE__); + }else{ + pNew->pMethod = pLockingStyle; + OpenCounter(+1); + verifyDbFile(pNew); + } + return rc; +} + +/* +** Return the name of a directory in which to put temporary files. +** If no suitable temporary file directory can be found, return NULL. +*/ +static const char *unixTempFileDir(void){ + static const char *azDirs[] = { + 0, + 0, + "/var/tmp", + "/usr/tmp", + "/tmp", + "." + }; + unsigned int i = 0; + struct stat buf; + const char *zDir = sqlite3_temp_directory; + + if( !azDirs[0] ) azDirs[0] = getenv("SQLITE_TMPDIR"); + if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR"); + while(1){ + if( zDir!=0 + && osStat(zDir, &buf)==0 + && S_ISDIR(buf.st_mode) + && osAccess(zDir, 03)==0 + ){ + return zDir; + } + if( i>=sizeof(azDirs)/sizeof(azDirs[0]) ) break; + zDir = azDirs[i++]; + } + return 0; +} + +/* +** Create a temporary file name in zBuf. zBuf must be allocated +** by the calling process and must be big enough to hold at least +** pVfs->mxPathname bytes. +*/ +static int unixGetTempname(int nBuf, char *zBuf){ + const char *zDir; + int iLimit = 0; + + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this + ** function failing. + */ + zBuf[0] = 0; + SimulateIOError( return SQLITE_IOERR ); + + zDir = unixTempFileDir(); + if( zDir==0 ) return SQLITE_IOERR_GETTEMPPATH; + do{ + u64 r; + sqlite3_randomness(sizeof(r), &r); + assert( nBuf>2 ); + zBuf[nBuf-2] = 0; + sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c", + zDir, r, 0); + if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ) return SQLITE_ERROR; + }while( osAccess(zBuf,0)==0 ); + return SQLITE_OK; +} + +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) +/* +** Routine to transform a unixFile into a proxy-locking unixFile. +** Implementation in the proxy-lock division, but used by unixOpen() +** if SQLITE_PREFER_PROXY_LOCKING is defined. +*/ +static int proxyTransformUnixFile(unixFile*, const char*); +#endif + +/* +** Search for an unused file descriptor that was opened on the database +** file (not a journal or master-journal file) identified by pathname +** zPath with SQLITE_OPEN_XXX flags matching those passed as the second +** argument to this function. +** +** Such a file descriptor may exist if a database connection was closed +** but the associated file descriptor could not be closed because some +** other file descriptor open on the same file is holding a file-lock. +** Refer to comments in the unixClose() function and the lengthy comment +** describing "Posix Advisory Locking" at the start of this file for +** further details. Also, ticket #4018. +** +** If a suitable file descriptor is found, then it is returned. If no +** such file descriptor is located, -1 is returned. +*/ +static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ + UnixUnusedFd *pUnused = 0; + + /* Do not search for an unused file descriptor on vxworks. Not because + ** vxworks would not benefit from the change (it might, we're not sure), + ** but because no way to test it is currently available. It is better + ** not to risk breaking vxworks support for the sake of such an obscure + ** feature. */ +#if !OS_VXWORKS + struct stat sStat; /* Results of stat() call */ + + unixEnterMutex(); + + /* A stat() call may fail for various reasons. If this happens, it is + ** almost certain that an open() call on the same path will also fail. + ** For this reason, if an error occurs in the stat() call here, it is + ** ignored and -1 is returned. The caller will try to open a new file + ** descriptor on the same path, fail, and return an error to SQLite. + ** + ** Even if a subsequent open() call does succeed, the consequences of + ** not searching for a reusable file descriptor are not dire. */ + if( inodeList!=0 && 0==osStat(zPath, &sStat) ){ + unixInodeInfo *pInode; + + pInode = inodeList; + while( pInode && (pInode->fileId.dev!=sStat.st_dev + || pInode->fileId.ino!=(u64)sStat.st_ino) ){ + pInode = pInode->pNext; + } + if( pInode ){ + UnixUnusedFd **pp; + assert( sqlite3_mutex_notheld(pInode->pLockMutex) ); + sqlite3_mutex_enter(pInode->pLockMutex); + flags &= (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); + for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); + pUnused = *pp; + if( pUnused ){ + *pp = pUnused->pNext; + } + sqlite3_mutex_leave(pInode->pLockMutex); + } + } + unixLeaveMutex(); +#endif /* if !OS_VXWORKS */ + return pUnused; +} + +/* +** Find the mode, uid and gid of file zFile. +*/ +static int getFileMode( + const char *zFile, /* File name */ + mode_t *pMode, /* OUT: Permissions of zFile */ + uid_t *pUid, /* OUT: uid of zFile. */ + gid_t *pGid /* OUT: gid of zFile. */ +){ + struct stat sStat; /* Output of stat() on database file */ + int rc = SQLITE_OK; + if( 0==osStat(zFile, &sStat) ){ + *pMode = sStat.st_mode & 0777; + *pUid = sStat.st_uid; + *pGid = sStat.st_gid; + }else{ + rc = SQLITE_IOERR_FSTAT; + } + return rc; +} + +/* +** This function is called by unixOpen() to determine the unix permissions +** to create new files with. If no error occurs, then SQLITE_OK is returned +** and a value suitable for passing as the third argument to open(2) is +** written to *pMode. If an IO error occurs, an SQLite error code is +** returned and the value of *pMode is not modified. +** +** In most cases, this routine sets *pMode to 0, which will become +** an indication to robust_open() to create the file using +** SQLITE_DEFAULT_FILE_PERMISSIONS adjusted by the umask. +** But if the file being opened is a WAL or regular journal file, then +** this function queries the file-system for the permissions on the +** corresponding database file and sets *pMode to this value. Whenever +** possible, WAL and journal files are created using the same permissions +** as the associated database file. +** +** If the SQLITE_ENABLE_8_3_NAMES option is enabled, then the +** original filename is unavailable. But 8_3_NAMES is only used for +** FAT filesystems and permissions do not matter there, so just use +** the default permissions. In 8_3_NAMES mode, leave *pMode set to zero. +*/ +static int findCreateFileMode( + const char *zPath, /* Path of file (possibly) being created */ + int flags, /* Flags passed as 4th argument to xOpen() */ + mode_t *pMode, /* OUT: Permissions to open file with */ + uid_t *pUid, /* OUT: uid to set on the file */ + gid_t *pGid /* OUT: gid to set on the file */ +){ + int rc = SQLITE_OK; /* Return Code */ + *pMode = 0; + *pUid = 0; + *pGid = 0; + if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ + char zDb[MAX_PATHNAME+1]; /* Database file path */ + int nDb; /* Number of valid bytes in zDb */ + + /* zPath is a path to a WAL or journal file. The following block derives + ** the path to the associated database file from zPath. This block handles + ** the following naming conventions: + ** + ** "-journal" + ** "-wal" + ** "-journalNN" + ** "-walNN" + ** + ** where NN is a decimal number. The NN naming schemes are + ** used by the test_multiplex.c module. + */ + nDb = sqlite3Strlen30(zPath) - 1; + while( zPath[nDb]!='-' ){ + /* In normal operation, the journal file name will always contain + ** a '-' character. However in 8+3 filename mode, or if a corrupt + ** rollback journal specifies a master journal with a goofy name, then + ** the '-' might be missing. */ + if( nDb==0 || zPath[nDb]=='.' ) return SQLITE_OK; + nDb--; + } + memcpy(zDb, zPath, nDb); + zDb[nDb] = '\0'; + + rc = getFileMode(zDb, pMode, pUid, pGid); + }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ + *pMode = 0600; + }else if( flags & SQLITE_OPEN_URI ){ + /* If this is a main database file and the file was opened using a URI + ** filename, check for the "modeof" parameter. If present, interpret + ** its value as a filename and try to copy the mode, uid and gid from + ** that file. */ + const char *z = sqlite3_uri_parameter(zPath, "modeof"); + if( z ){ + rc = getFileMode(z, pMode, pUid, pGid); + } + } + return rc; +} + +/* +** Open the file zPath. +** +** Previously, the SQLite OS layer used three functions in place of this +** one: +** +** sqlite3OsOpenReadWrite(); +** sqlite3OsOpenReadOnly(); +** sqlite3OsOpenExclusive(); +** +** These calls correspond to the following combinations of flags: +** +** ReadWrite() -> (READWRITE | CREATE) +** ReadOnly() -> (READONLY) +** OpenExclusive() -> (READWRITE | CREATE | EXCLUSIVE) +** +** The old OpenExclusive() accepted a boolean argument - "delFlag". If +** true, the file was configured to be automatically deleted when the +** file handle closed. To achieve the same effect using this new +** interface, add the DELETEONCLOSE flag to those specified above for +** OpenExclusive(). +*/ +static int unixOpen( + sqlite3_vfs *pVfs, /* The VFS for which this is the xOpen method */ + const char *zPath, /* Pathname of file to be opened */ + sqlite3_file *pFile, /* The file descriptor to be filled in */ + int flags, /* Input flags to control the opening */ + int *pOutFlags /* Output flags returned to SQLite core */ +){ + unixFile *p = (unixFile *)pFile; + int fd = -1; /* File descriptor returned by open() */ + int openFlags = 0; /* Flags to pass to open() */ + int eType = flags&0x0FFF00; /* Type of file to open */ + int noLock; /* True to omit locking primitives */ + int rc = SQLITE_OK; /* Function Return Code */ + int ctrlFlags = 0; /* UNIXFILE_* flags */ + + int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); + int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); + int isCreate = (flags & SQLITE_OPEN_CREATE); + int isReadonly = (flags & SQLITE_OPEN_READONLY); + int isReadWrite = (flags & SQLITE_OPEN_READWRITE); +#if SQLITE_ENABLE_LOCKING_STYLE + int isAutoProxy = (flags & SQLITE_OPEN_AUTOPROXY); +#endif +#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE + struct statfs fsInfo; +#endif + + /* If creating a master or main-file journal, this function will open + ** a file-descriptor on the directory too. The first time unixSync() + ** is called the directory file descriptor will be fsync()ed and close()d. + */ + int isNewJrnl = (isCreate && ( + eType==SQLITE_OPEN_MASTER_JOURNAL + || eType==SQLITE_OPEN_MAIN_JOURNAL + || eType==SQLITE_OPEN_WAL + )); + + /* If argument zPath is a NULL pointer, this function is required to open + ** a temporary file. Use this buffer to store the file name in. + */ + char zTmpname[MAX_PATHNAME+2]; + const char *zName = zPath; + + /* Check the following statements are true: + ** + ** (a) Exactly one of the READWRITE and READONLY flags must be set, and + ** (b) if CREATE is set, then READWRITE must also be set, and + ** (c) if EXCLUSIVE is set, then CREATE must also be set. + ** (d) if DELETEONCLOSE is set, then CREATE must also be set. + */ + assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); + assert(isCreate==0 || isReadWrite); + assert(isExclusive==0 || isCreate); + assert(isDelete==0 || isCreate); + + /* The main DB, main journal, WAL file and master journal are never + ** automatically deleted. Nor are they ever temporary files. */ + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MASTER_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL ); + + /* Assert that the upper layer has set one of the "file-type" flags. */ + assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB + || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL + || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL + || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL + ); + + /* Detect a pid change and reset the PRNG. There is a race condition + ** here such that two or more threads all trying to open databases at + ** the same instant might all reset the PRNG. But multiple resets + ** are harmless. + */ + if( randomnessPid!=osGetpid(0) ){ + randomnessPid = osGetpid(0); + sqlite3_randomness(0,0); + } + memset(p, 0, sizeof(unixFile)); + + if( eType==SQLITE_OPEN_MAIN_DB ){ + UnixUnusedFd *pUnused; + pUnused = findReusableFd(zName, flags); + if( pUnused ){ + fd = pUnused->fd; + }else{ + pUnused = sqlite3_malloc64(sizeof(*pUnused)); + if( !pUnused ){ + return SQLITE_NOMEM_BKPT; + } + } + p->pPreallocatedUnused = pUnused; + + /* Database filenames are double-zero terminated if they are not + ** URIs with parameters. Hence, they can always be passed into + ** sqlite3_uri_parameter(). */ + assert( (flags & SQLITE_OPEN_URI) || zName[strlen(zName)+1]==0 ); + + }else if( !zName ){ + /* If zName is NULL, the upper layer is requesting a temp file. */ + assert(isDelete && !isNewJrnl); + rc = unixGetTempname(pVfs->mxPathname, zTmpname); + if( rc!=SQLITE_OK ){ + return rc; + } + zName = zTmpname; + + /* Generated temporary filenames are always double-zero terminated + ** for use by sqlite3_uri_parameter(). */ + assert( zName[strlen(zName)+1]==0 ); + } + + /* Determine the value of the flags parameter passed to POSIX function + ** open(). These must be calculated even if open() is not called, as + ** they may be stored as part of the file handle and used by the + ** 'conch file' locking functions later on. */ + if( isReadonly ) openFlags |= O_RDONLY; + if( isReadWrite ) openFlags |= O_RDWR; + if( isCreate ) openFlags |= O_CREAT; + if( isExclusive ) openFlags |= (O_EXCL|O_NOFOLLOW); + openFlags |= (O_LARGEFILE|O_BINARY|O_NOFOLLOW); + + if( fd<0 ){ + mode_t openMode; /* Permissions to create file with */ + uid_t uid; /* Userid for the file */ + gid_t gid; /* Groupid for the file */ + rc = findCreateFileMode(zName, flags, &openMode, &uid, &gid); + if( rc!=SQLITE_OK ){ + assert( !p->pPreallocatedUnused ); + assert( eType==SQLITE_OPEN_WAL || eType==SQLITE_OPEN_MAIN_JOURNAL ); + return rc; + } + fd = robust_open(zName, openFlags, openMode); + OSTRACE(("OPENX %-3d %s 0%o\n", fd, zName, openFlags)); + assert( !isExclusive || (openFlags & O_CREAT)!=0 ); + if( fd<0 ){ + if( isNewJrnl && errno==EACCES && osAccess(zName, F_OK) ){ + /* If unable to create a journal because the directory is not + ** writable, change the error code to indicate that. */ + rc = SQLITE_READONLY_DIRECTORY; + }else if( errno!=EISDIR && isReadWrite ){ + /* Failed to open the file for read/write access. Try read-only. */ + flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); + openFlags &= ~(O_RDWR|O_CREAT); + flags |= SQLITE_OPEN_READONLY; + openFlags |= O_RDONLY; + isReadonly = 1; + fd = robust_open(zName, openFlags, openMode); + } + } + if( fd<0 ){ + int rc2 = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName); + if( rc==SQLITE_OK ) rc = rc2; + goto open_finished; + } + + /* The owner of the rollback journal or WAL file should always be the + ** same as the owner of the database file. Try to ensure that this is + ** the case. The chown() system call will be a no-op if the current + ** process lacks root privileges, be we should at least try. Without + ** this step, if a root process opens a database file, it can leave + ** behinds a journal/WAL that is owned by root and hence make the + ** database inaccessible to unprivileged processes. + ** + ** If openMode==0, then that means uid and gid are not set correctly + ** (probably because SQLite is configured to use 8+3 filename mode) and + ** in that case we do not want to attempt the chown(). + */ + if( openMode && (flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL))!=0 ){ + robustFchown(fd, uid, gid); + } + } + assert( fd>=0 ); + if( pOutFlags ){ + *pOutFlags = flags; + } + + if( p->pPreallocatedUnused ){ + p->pPreallocatedUnused->fd = fd; + p->pPreallocatedUnused->flags = + flags & (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); + } + + if( isDelete ){ +#if OS_VXWORKS + zPath = zName; +#elif defined(SQLITE_UNLINK_AFTER_CLOSE) + zPath = sqlite3_mprintf("%s", zName); + if( zPath==0 ){ + robust_close(p, fd, __LINE__); + return SQLITE_NOMEM_BKPT; + } +#else + osUnlink(zName); +#endif + } +#if SQLITE_ENABLE_LOCKING_STYLE + else{ + p->openFlags = openFlags; + } +#endif + +#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE + if( fstatfs(fd, &fsInfo) == -1 ){ + storeLastErrno(p, errno); + robust_close(p, fd, __LINE__); + return SQLITE_IOERR_ACCESS; + } + if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) { + ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; + } + if (0 == strncmp("exfat", fsInfo.f_fstypename, 5)) { + ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; + } +#endif + + /* Set up appropriate ctrlFlags */ + if( isDelete ) ctrlFlags |= UNIXFILE_DELETE; + if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY; + noLock = eType!=SQLITE_OPEN_MAIN_DB; + if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK; + if( isNewJrnl ) ctrlFlags |= UNIXFILE_DIRSYNC; + if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI; + +#if SQLITE_ENABLE_LOCKING_STYLE +#if SQLITE_PREFER_PROXY_LOCKING + isAutoProxy = 1; +#endif + if( isAutoProxy && (zPath!=NULL) && (!noLock) && pVfs->xOpen ){ + char *envforce = getenv("SQLITE_FORCE_PROXY_LOCKING"); + int useProxy = 0; + + /* SQLITE_FORCE_PROXY_LOCKING==1 means force always use proxy, 0 means + ** never use proxy, NULL means use proxy for non-local files only. */ + if( envforce!=NULL ){ + useProxy = atoi(envforce)>0; + }else{ + useProxy = !(fsInfo.f_flags&MNT_LOCAL); + } + if( useProxy ){ + rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); + if( rc==SQLITE_OK ){ + rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); + if( rc!=SQLITE_OK ){ + /* Use unixClose to clean up the resources added in fillInUnixFile + ** and clear all the structure's references. Specifically, + ** pFile->pMethods will be NULL so sqlite3OsClose will be a no-op + */ + unixClose(pFile); + return rc; + } + } + goto open_finished; + } + } +#endif + + assert( zPath==0 || zPath[0]=='/' + || eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL + ); + rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); + +open_finished: + if( rc!=SQLITE_OK ){ + sqlite3_free(p->pPreallocatedUnused); + } + return rc; +} + + +/* +** Delete the file at zPath. If the dirSync argument is true, fsync() +** the directory after deleting the file. +*/ +static int unixDelete( + sqlite3_vfs *NotUsed, /* VFS containing this as the xDelete method */ + const char *zPath, /* Name of file to be deleted */ + int dirSync /* If true, fsync() directory after deleting file */ +){ + int rc = SQLITE_OK; + UNUSED_PARAMETER(NotUsed); + SimulateIOError(return SQLITE_IOERR_DELETE); + if( osUnlink(zPath)==(-1) ){ + if( errno==ENOENT +#if OS_VXWORKS + || osAccess(zPath,0)!=0 +#endif + ){ + rc = SQLITE_IOERR_DELETE_NOENT; + }else{ + rc = unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); + } + return rc; + } +#ifndef SQLITE_DISABLE_DIRSYNC + if( (dirSync & 1)!=0 ){ + int fd; + rc = osOpenDirectory(zPath, &fd); + if( rc==SQLITE_OK ){ + if( full_fsync(fd,0,0) ){ + rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); + } + robust_close(0, fd, __LINE__); + }else{ + assert( rc==SQLITE_CANTOPEN ); + rc = SQLITE_OK; + } + } +#endif + return rc; +} + +/* +** Test the existence of or access permissions of file zPath. The +** test performed depends on the value of flags: +** +** SQLITE_ACCESS_EXISTS: Return 1 if the file exists +** SQLITE_ACCESS_READWRITE: Return 1 if the file is read and writable. +** SQLITE_ACCESS_READONLY: Return 1 if the file is readable. +** +** Otherwise return 0. +*/ +static int unixAccess( + sqlite3_vfs *NotUsed, /* The VFS containing this xAccess method */ + const char *zPath, /* Path of the file to examine */ + int flags, /* What do we want to learn about the zPath file? */ + int *pResOut /* Write result boolean here */ +){ + UNUSED_PARAMETER(NotUsed); + SimulateIOError( return SQLITE_IOERR_ACCESS; ); + assert( pResOut!=0 ); + + /* The spec says there are three possible values for flags. But only + ** two of them are actually used */ + assert( flags==SQLITE_ACCESS_EXISTS || flags==SQLITE_ACCESS_READWRITE ); + + if( flags==SQLITE_ACCESS_EXISTS ){ + struct stat buf; + *pResOut = 0==osStat(zPath, &buf) && + (!S_ISREG(buf.st_mode) || buf.st_size>0); + }else{ + *pResOut = osAccess(zPath, W_OK|R_OK)==0; + } + return SQLITE_OK; +} + +/* +** +*/ +static int mkFullPathname( + const char *zPath, /* Input path */ + char *zOut, /* Output buffer */ + int nOut /* Allocated size of buffer zOut */ +){ + int nPath = sqlite3Strlen30(zPath); + int iOff = 0; + if( zPath[0]!='/' ){ + if( osGetcwd(zOut, nOut-2)==0 ){ + return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); + } + iOff = sqlite3Strlen30(zOut); + zOut[iOff++] = '/'; + } + if( (iOff+nPath+1)>nOut ){ + /* SQLite assumes that xFullPathname() nul-terminates the output buffer + ** even if it returns an error. */ + zOut[iOff] = '\0'; + return SQLITE_CANTOPEN_BKPT; + } + sqlite3_snprintf(nOut-iOff, &zOut[iOff], "%s", zPath); + return SQLITE_OK; +} + +/* +** Turn a relative pathname into a full pathname. The relative path +** is stored as a nul-terminated string in the buffer pointed to by +** zPath. +** +** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes +** (in this case, MAX_PATHNAME bytes). The full-path is written to +** this buffer before returning. +*/ +static int unixFullPathname( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + const char *zPath, /* Possibly relative input path */ + int nOut, /* Size of output buffer in bytes */ + char *zOut /* Output buffer */ +){ +#if !defined(HAVE_READLINK) || !defined(HAVE_LSTAT) + return mkFullPathname(zPath, zOut, nOut); +#else + int rc = SQLITE_OK; + int nByte; + int nLink = 0; /* Number of symbolic links followed so far */ + const char *zIn = zPath; /* Input path for each iteration of loop */ + char *zDel = 0; + + assert( pVfs->mxPathname==MAX_PATHNAME ); + UNUSED_PARAMETER(pVfs); + + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this + ** function failing. This function could fail if, for example, the + ** current working directory has been unlinked. + */ + SimulateIOError( return SQLITE_ERROR ); + + do { + + /* Call stat() on path zIn. Set bLink to true if the path is a symbolic + ** link, or false otherwise. */ + int bLink = 0; + struct stat buf; + if( osLstat(zIn, &buf)!=0 ){ + if( errno!=ENOENT ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn); + } + }else{ + bLink = S_ISLNK(buf.st_mode); + } + + if( bLink ){ + nLink++; + if( zDel==0 ){ + zDel = sqlite3_malloc(nOut); + if( zDel==0 ) rc = SQLITE_NOMEM_BKPT; + }else if( nLink>=SQLITE_MAX_SYMLINKS ){ + rc = SQLITE_CANTOPEN_BKPT; + } + + if( rc==SQLITE_OK ){ + nByte = osReadlink(zIn, zDel, nOut-1); + if( nByte<0 ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn); + }else{ + if( zDel[0]!='/' ){ + int n; + for(n = sqlite3Strlen30(zIn); n>0 && zIn[n-1]!='/'; n--); + if( nByte+n+1>nOut ){ + rc = SQLITE_CANTOPEN_BKPT; + }else{ + memmove(&zDel[n], zDel, nByte+1); + memcpy(zDel, zIn, n); + nByte += n; + } + } + zDel[nByte] = '\0'; + } + } + + zIn = zDel; + } + + assert( rc!=SQLITE_OK || zIn!=zOut || zIn[0]=='/' ); + if( rc==SQLITE_OK && zIn!=zOut ){ + rc = mkFullPathname(zIn, zOut, nOut); + } + if( bLink==0 ) break; + zIn = zOut; + }while( rc==SQLITE_OK ); + + sqlite3_free(zDel); + if( rc==SQLITE_OK && nLink ) rc = SQLITE_OK_SYMLINK; + return rc; +#endif /* HAVE_READLINK && HAVE_LSTAT */ +} + + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Interfaces for opening a shared library, finding entry points +** within the shared library, and closing the shared library. +*/ +#include +static void *unixDlOpen(sqlite3_vfs *NotUsed, const char *zFilename){ + UNUSED_PARAMETER(NotUsed); + return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL); +} + +/* +** SQLite calls this function immediately after a call to unixDlSym() or +** unixDlOpen() fails (returns a null pointer). If a more detailed error +** message is available, it is written to zBufOut. If no error message +** is available, zBufOut is left unmodified and SQLite uses a default +** error message. +*/ +static void unixDlError(sqlite3_vfs *NotUsed, int nBuf, char *zBufOut){ + const char *zErr; + UNUSED_PARAMETER(NotUsed); + unixEnterMutex(); + zErr = dlerror(); + if( zErr ){ + sqlite3_snprintf(nBuf, zBufOut, "%s", zErr); + } + unixLeaveMutex(); +} +static void (*unixDlSym(sqlite3_vfs *NotUsed, void *p, const char*zSym))(void){ + /* + ** GCC with -pedantic-errors says that C90 does not allow a void* to be + ** cast into a pointer to a function. And yet the library dlsym() routine + ** returns a void* which is really a pointer to a function. So how do we + ** use dlsym() with -pedantic-errors? + ** + ** Variable x below is defined to be a pointer to a function taking + ** parameters void* and const char* and returning a pointer to a function. + ** We initialize x by assigning it a pointer to the dlsym() function. + ** (That assignment requires a cast.) Then we call the function that + ** x points to. + ** + ** This work-around is unlikely to work correctly on any system where + ** you really cannot cast a function pointer into void*. But then, on the + ** other hand, dlsym() will not work on such a system either, so we have + ** not really lost anything. + */ + void (*(*x)(void*,const char*))(void); + UNUSED_PARAMETER(NotUsed); + x = (void(*(*)(void*,const char*))(void))dlsym; + return (*x)(p, zSym); +} +static void unixDlClose(sqlite3_vfs *NotUsed, void *pHandle){ + UNUSED_PARAMETER(NotUsed); + dlclose(pHandle); +} +#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ + #define unixDlOpen 0 + #define unixDlError 0 + #define unixDlSym 0 + #define unixDlClose 0 +#endif + +/* +** Write nBuf bytes of random data to the supplied buffer zBuf. +*/ +static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ + UNUSED_PARAMETER(NotUsed); + assert((size_t)nBuf>=(sizeof(time_t)+sizeof(int))); + + /* We have to initialize zBuf to prevent valgrind from reporting + ** errors. The reports issued by valgrind are incorrect - we would + ** prefer that the randomness be increased by making use of the + ** uninitialized space in zBuf - but valgrind errors tend to worry + ** some users. Rather than argue, it seems easier just to initialize + ** the whole array and silence valgrind, even if that means less randomness + ** in the random seed. + ** + ** When testing, initializing zBuf[] to zero is all we do. That means + ** that we always use the same random number sequence. This makes the + ** tests repeatable. + */ + memset(zBuf, 0, nBuf); + randomnessPid = osGetpid(0); +#if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) + { + int fd, got; + fd = robust_open("/dev/urandom", O_RDONLY, 0); + if( fd<0 ){ + time_t t; + time(&t); + memcpy(zBuf, &t, sizeof(t)); + memcpy(&zBuf[sizeof(t)], &randomnessPid, sizeof(randomnessPid)); + assert( sizeof(t)+sizeof(randomnessPid)<=(size_t)nBuf ); + nBuf = sizeof(t) + sizeof(randomnessPid); + }else{ + do{ got = osRead(fd, zBuf, nBuf); }while( got<0 && errno==EINTR ); + robust_close(0, fd, __LINE__); + } + } +#endif + return nBuf; +} + + +/* +** Sleep for a little while. Return the amount of time slept. +** The argument is the number of microseconds we want to sleep. +** The return value is the number of microseconds of sleep actually +** requested from the underlying operating system, a number which +** might be greater than or equal to the argument, but not less +** than the argument. +*/ +static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){ +#if OS_VXWORKS + struct timespec sp; + + sp.tv_sec = microseconds / 1000000; + sp.tv_nsec = (microseconds % 1000000) * 1000; + nanosleep(&sp, NULL); + UNUSED_PARAMETER(NotUsed); + return microseconds; +#elif defined(HAVE_USLEEP) && HAVE_USLEEP + usleep(microseconds); + UNUSED_PARAMETER(NotUsed); + return microseconds; +#else + int seconds = (microseconds+999999)/1000000; + sleep(seconds); + UNUSED_PARAMETER(NotUsed); + return seconds*1000000; +#endif +} + +/* +** The following variable, if set to a non-zero value, is interpreted as +** the number of seconds since 1970 and is used to set the result of +** sqlite3OsCurrentTime() during testing. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ +#endif + +/* +** Find the current time (in Universal Coordinated Time). Write into *piNow +** the current time and date as a Julian Day number times 86_400_000. In +** other words, write into *piNow the number of milliseconds since the Julian +** epoch of noon in Greenwich on November 24, 4714 B.C according to the +** proleptic Gregorian calendar. +** +** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date +** cannot be found. +*/ +static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){ + static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000; + int rc = SQLITE_OK; +#if defined(NO_GETTOD) + time_t t; + time(&t); + *piNow = ((sqlite3_int64)t)*1000 + unixEpoch; +#elif OS_VXWORKS + struct timespec sNow; + clock_gettime(CLOCK_REALTIME, &sNow); + *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000; +#else + struct timeval sNow; + (void)gettimeofday(&sNow, 0); /* Cannot fail given valid arguments */ + *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000; +#endif + +#ifdef SQLITE_TEST + if( sqlite3_current_time ){ + *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch; + } +#endif + UNUSED_PARAMETER(NotUsed); + return rc; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Find the current time (in Universal Coordinated Time). Write the +** current time and date as a Julian Day number into *prNow and +** return 0. Return 1 if the time and date cannot be found. +*/ +static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){ + sqlite3_int64 i = 0; + int rc; + UNUSED_PARAMETER(NotUsed); + rc = unixCurrentTimeInt64(0, &i); + *prNow = i/86400000.0; + return rc; +} +#else +# define unixCurrentTime 0 +#endif + +/* +** The xGetLastError() method is designed to return a better +** low-level error message when operating-system problems come up +** during SQLite operation. Only the integer return code is currently +** used. +*/ +static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ + UNUSED_PARAMETER(NotUsed); + UNUSED_PARAMETER(NotUsed2); + UNUSED_PARAMETER(NotUsed3); + return errno; +} + + +/* +************************ End of sqlite3_vfs methods *************************** +******************************************************************************/ + +/****************************************************************************** +************************** Begin Proxy Locking ******************************** +** +** Proxy locking is a "uber-locking-method" in this sense: It uses the +** other locking methods on secondary lock files. Proxy locking is a +** meta-layer over top of the primitive locking implemented above. For +** this reason, the division that implements of proxy locking is deferred +** until late in the file (here) after all of the other I/O methods have +** been defined - so that the primitive locking methods are available +** as services to help with the implementation of proxy locking. +** +**** +** +** The default locking schemes in SQLite use byte-range locks on the +** database file to coordinate safe, concurrent access by multiple readers +** and writers [http://sqlite.org/lockingv3.html]. The five file locking +** states (UNLOCKED, PENDING, SHARED, RESERVED, EXCLUSIVE) are implemented +** as POSIX read & write locks over fixed set of locations (via fsctl), +** on AFP and SMB only exclusive byte-range locks are available via fsctl +** with _IOWR('z', 23, struct ByteRangeLockPB2) to track the same 5 states. +** To simulate a F_RDLCK on the shared range, on AFP a randomly selected +** address in the shared range is taken for a SHARED lock, the entire +** shared range is taken for an EXCLUSIVE lock): +** +** PENDING_BYTE 0x40000000 +** RESERVED_BYTE 0x40000001 +** SHARED_RANGE 0x40000002 -> 0x40000200 +** +** This works well on the local file system, but shows a nearly 100x +** slowdown in read performance on AFP because the AFP client disables +** the read cache when byte-range locks are present. Enabling the read +** cache exposes a cache coherency problem that is present on all OS X +** supported network file systems. NFS and AFP both observe the +** close-to-open semantics for ensuring cache coherency +** [http://nfs.sourceforge.net/#faq_a8], which does not effectively +** address the requirements for concurrent database access by multiple +** readers and writers +** [http://www.nabble.com/SQLite-on-NFS-cache-coherency-td15655701.html]. +** +** To address the performance and cache coherency issues, proxy file locking +** changes the way database access is controlled by limiting access to a +** single host at a time and moving file locks off of the database file +** and onto a proxy file on the local file system. +** +** +** Using proxy locks +** ----------------- +** +** C APIs +** +** sqlite3_file_control(db, dbname, SQLITE_FCNTL_SET_LOCKPROXYFILE, +** | ":auto:"); +** sqlite3_file_control(db, dbname, SQLITE_FCNTL_GET_LOCKPROXYFILE, +** &); +** +** +** SQL pragmas +** +** PRAGMA [database.]lock_proxy_file= | :auto: +** PRAGMA [database.]lock_proxy_file +** +** Specifying ":auto:" means that if there is a conch file with a matching +** host ID in it, the proxy path in the conch file will be used, otherwise +** a proxy path based on the user's temp dir +** (via confstr(_CS_DARWIN_USER_TEMP_DIR,...)) will be used and the +** actual proxy file name is generated from the name and path of the +** database file. For example: +** +** For database path "/Users/me/foo.db" +** The lock path will be "/sqliteplocks/_Users_me_foo.db:auto:") +** +** Once a lock proxy is configured for a database connection, it can not +** be removed, however it may be switched to a different proxy path via +** the above APIs (assuming the conch file is not being held by another +** connection or process). +** +** +** How proxy locking works +** ----------------------- +** +** Proxy file locking relies primarily on two new supporting files: +** +** * conch file to limit access to the database file to a single host +** at a time +** +** * proxy file to act as a proxy for the advisory locks normally +** taken on the database +** +** The conch file - to use a proxy file, sqlite must first "hold the conch" +** by taking an sqlite-style shared lock on the conch file, reading the +** contents and comparing the host's unique host ID (see below) and lock +** proxy path against the values stored in the conch. The conch file is +** stored in the same directory as the database file and the file name +** is patterned after the database file name as ".-conch". +** If the conch file does not exist, or its contents do not match the +** host ID and/or proxy path, then the lock is escalated to an exclusive +** lock and the conch file contents is updated with the host ID and proxy +** path and the lock is downgraded to a shared lock again. If the conch +** is held by another process (with a shared lock), the exclusive lock +** will fail and SQLITE_BUSY is returned. +** +** The proxy file - a single-byte file used for all advisory file locks +** normally taken on the database file. This allows for safe sharing +** of the database file for multiple readers and writers on the same +** host (the conch ensures that they all use the same local lock file). +** +** Requesting the lock proxy does not immediately take the conch, it is +** only taken when the first request to lock database file is made. +** This matches the semantics of the traditional locking behavior, where +** opening a connection to a database file does not take a lock on it. +** The shared lock and an open file descriptor are maintained until +** the connection to the database is closed. +** +** The proxy file and the lock file are never deleted so they only need +** to be created the first time they are used. +** +** Configuration options +** --------------------- +** +** SQLITE_PREFER_PROXY_LOCKING +** +** Database files accessed on non-local file systems are +** automatically configured for proxy locking, lock files are +** named automatically using the same logic as +** PRAGMA lock_proxy_file=":auto:" +** +** SQLITE_PROXY_DEBUG +** +** Enables the logging of error messages during host id file +** retrieval and creation +** +** LOCKPROXYDIR +** +** Overrides the default directory used for lock proxy files that +** are named automatically via the ":auto:" setting +** +** SQLITE_DEFAULT_PROXYDIR_PERMISSIONS +** +** Permissions to use when creating a directory for storing the +** lock proxy files, only used when LOCKPROXYDIR is not set. +** +** +** As mentioned above, when compiled with SQLITE_PREFER_PROXY_LOCKING, +** setting the environment variable SQLITE_FORCE_PROXY_LOCKING to 1 will +** force proxy locking to be used for every database file opened, and 0 +** will force automatic proxy locking to be disabled for all database +** files (explicitly calling the SQLITE_FCNTL_SET_LOCKPROXYFILE pragma or +** sqlite_file_control API is not affected by SQLITE_FORCE_PROXY_LOCKING). +*/ + +/* +** Proxy locking is only available on MacOSX +*/ +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE + +/* +** The proxyLockingContext has the path and file structures for the remote +** and local proxy files in it +*/ +typedef struct proxyLockingContext proxyLockingContext; +struct proxyLockingContext { + unixFile *conchFile; /* Open conch file */ + char *conchFilePath; /* Name of the conch file */ + unixFile *lockProxy; /* Open proxy lock file */ + char *lockProxyPath; /* Name of the proxy lock file */ + char *dbPath; /* Name of the open file */ + int conchHeld; /* 1 if the conch is held, -1 if lockless */ + int nFails; /* Number of conch taking failures */ + void *oldLockingContext; /* Original lockingcontext to restore on close */ + sqlite3_io_methods const *pOldMethod; /* Original I/O methods for close */ +}; + +/* +** The proxy lock file path for the database at dbPath is written into lPath, +** which must point to valid, writable memory large enough for a maxLen length +** file path. +*/ +static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){ + int len; + int dbLen; + int i; + +#ifdef LOCKPROXYDIR + len = strlcpy(lPath, LOCKPROXYDIR, maxLen); +#else +# ifdef _CS_DARWIN_USER_TEMP_DIR + { + if( !confstr(_CS_DARWIN_USER_TEMP_DIR, lPath, maxLen) ){ + OSTRACE(("GETLOCKPATH failed %s errno=%d pid=%d\n", + lPath, errno, osGetpid(0))); + return SQLITE_IOERR_LOCK; + } + len = strlcat(lPath, "sqliteplocks", maxLen); + } +# else + len = strlcpy(lPath, "/tmp/", maxLen); +# endif +#endif + + if( lPath[len-1]!='/' ){ + len = strlcat(lPath, "/", maxLen); + } + + /* transform the db path to a unique cache name */ + dbLen = (int)strlen(dbPath); + for( i=0; i 0) ){ + /* only mkdir if leaf dir != "." or "/" or ".." */ + if( i-start>2 || (i-start==1 && buf[start] != '.' && buf[start] != '/') + || (i-start==2 && buf[start] != '.' && buf[start+1] != '.') ){ + buf[i]='\0'; + if( osMkdir(buf, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){ + int err=errno; + if( err!=EEXIST ) { + OSTRACE(("CREATELOCKPATH FAILED creating %s, " + "'%s' proxy lock path=%s pid=%d\n", + buf, strerror(err), lockPath, osGetpid(0))); + return err; + } + } + } + start=i+1; + } + buf[i] = lockPath[i]; + } + OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n",lockPath,osGetpid(0))); + return 0; +} + +/* +** Create a new VFS file descriptor (stored in memory obtained from +** sqlite3_malloc) and open the file named "path" in the file descriptor. +** +** The caller is responsible not only for closing the file descriptor +** but also for freeing the memory associated with the file descriptor. +*/ +static int proxyCreateUnixFile( + const char *path, /* path for the new unixFile */ + unixFile **ppFile, /* unixFile created and returned by ref */ + int islockfile /* if non zero missing dirs will be created */ +) { + int fd = -1; + unixFile *pNew; + int rc = SQLITE_OK; + int openFlags = O_RDWR | O_CREAT | O_NOFOLLOW; + sqlite3_vfs dummyVfs; + int terrno = 0; + UnixUnusedFd *pUnused = NULL; + + /* 1. first try to open/create the file + ** 2. if that fails, and this is a lock file (not-conch), try creating + ** the parent directories and then try again. + ** 3. if that fails, try to open the file read-only + ** otherwise return BUSY (if lock file) or CANTOPEN for the conch file + */ + pUnused = findReusableFd(path, openFlags); + if( pUnused ){ + fd = pUnused->fd; + }else{ + pUnused = sqlite3_malloc64(sizeof(*pUnused)); + if( !pUnused ){ + return SQLITE_NOMEM_BKPT; + } + } + if( fd<0 ){ + fd = robust_open(path, openFlags, 0); + terrno = errno; + if( fd<0 && errno==ENOENT && islockfile ){ + if( proxyCreateLockPath(path) == SQLITE_OK ){ + fd = robust_open(path, openFlags, 0); + } + } + } + if( fd<0 ){ + openFlags = O_RDONLY | O_NOFOLLOW; + fd = robust_open(path, openFlags, 0); + terrno = errno; + } + if( fd<0 ){ + if( islockfile ){ + return SQLITE_BUSY; + } + switch (terrno) { + case EACCES: + return SQLITE_PERM; + case EIO: + return SQLITE_IOERR_LOCK; /* even though it is the conch */ + default: + return SQLITE_CANTOPEN_BKPT; + } + } + + pNew = (unixFile *)sqlite3_malloc64(sizeof(*pNew)); + if( pNew==NULL ){ + rc = SQLITE_NOMEM_BKPT; + goto end_create_proxy; + } + memset(pNew, 0, sizeof(unixFile)); + pNew->openFlags = openFlags; + memset(&dummyVfs, 0, sizeof(dummyVfs)); + dummyVfs.pAppData = (void*)&autolockIoFinder; + dummyVfs.zName = "dummy"; + pUnused->fd = fd; + pUnused->flags = openFlags; + pNew->pPreallocatedUnused = pUnused; + + rc = fillInUnixFile(&dummyVfs, fd, (sqlite3_file*)pNew, path, 0); + if( rc==SQLITE_OK ){ + *ppFile = pNew; + return SQLITE_OK; + } +end_create_proxy: + robust_close(pNew, fd, __LINE__); + sqlite3_free(pNew); + sqlite3_free(pUnused); + return rc; +} + +#ifdef SQLITE_TEST +/* simulate multiple hosts by creating unique hostid file paths */ +SQLITE_API int sqlite3_hostid_num = 0; +#endif + +#define PROXY_HOSTIDLEN 16 /* conch file host id length */ + +#if HAVE_GETHOSTUUID +/* Not always defined in the headers as it ought to be */ +extern int gethostuuid(uuid_t id, const struct timespec *wait); +#endif + +/* get the host ID via gethostuuid(), pHostID must point to PROXY_HOSTIDLEN +** bytes of writable memory. +*/ +static int proxyGetHostID(unsigned char *pHostID, int *pError){ + assert(PROXY_HOSTIDLEN == sizeof(uuid_t)); + memset(pHostID, 0, PROXY_HOSTIDLEN); +#if HAVE_GETHOSTUUID + { + struct timespec timeout = {1, 0}; /* 1 sec timeout */ + if( gethostuuid(pHostID, &timeout) ){ + int err = errno; + if( pError ){ + *pError = err; + } + return SQLITE_IOERR; + } + } +#else + UNUSED_PARAMETER(pError); +#endif +#ifdef SQLITE_TEST + /* simulate multiple hosts by creating unique hostid file paths */ + if( sqlite3_hostid_num != 0){ + pHostID[0] = (char)(pHostID[0] + (char)(sqlite3_hostid_num & 0xFF)); + } +#endif + + return SQLITE_OK; +} + +/* The conch file contains the header, host id and lock file path + */ +#define PROXY_CONCHVERSION 2 /* 1-byte header, 16-byte host id, path */ +#define PROXY_HEADERLEN 1 /* conch file header length */ +#define PROXY_PATHINDEX (PROXY_HEADERLEN+PROXY_HOSTIDLEN) +#define PROXY_MAXCONCHLEN (PROXY_HEADERLEN+PROXY_HOSTIDLEN+MAXPATHLEN) + +/* +** Takes an open conch file, copies the contents to a new path and then moves +** it back. The newly created file's file descriptor is assigned to the +** conch file structure and finally the original conch file descriptor is +** closed. Returns zero if successful. +*/ +static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + unixFile *conchFile = pCtx->conchFile; + char tPath[MAXPATHLEN]; + char buf[PROXY_MAXCONCHLEN]; + char *cPath = pCtx->conchFilePath; + size_t readLen = 0; + size_t pathLen = 0; + char errmsg[64] = ""; + int fd = -1; + int rc = -1; + UNUSED_PARAMETER(myHostID); + + /* create a new path by replace the trailing '-conch' with '-break' */ + pathLen = strlcpy(tPath, cPath, MAXPATHLEN); + if( pathLen>MAXPATHLEN || pathLen<6 || + (strlcpy(&tPath[pathLen-5], "break", 6) != 5) ){ + sqlite3_snprintf(sizeof(errmsg),errmsg,"path error (len %d)",(int)pathLen); + goto end_breaklock; + } + /* read the conch content */ + readLen = osPread(conchFile->h, buf, PROXY_MAXCONCHLEN, 0); + if( readLenh, __LINE__); + conchFile->h = fd; + conchFile->openFlags = O_RDWR | O_CREAT; + +end_breaklock: + if( rc ){ + if( fd>=0 ){ + osUnlink(tPath); + robust_close(pFile, fd, __LINE__); + } + fprintf(stderr, "failed to break stale lock on %s, %s\n", cPath, errmsg); + } + return rc; +} + +/* Take the requested lock on the conch file and break a stale lock if the +** host id matches. +*/ +static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + unixFile *conchFile = pCtx->conchFile; + int rc = SQLITE_OK; + int nTries = 0; + struct timespec conchModTime; + + memset(&conchModTime, 0, sizeof(conchModTime)); + do { + rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); + nTries ++; + if( rc==SQLITE_BUSY ){ + /* If the lock failed (busy): + * 1st try: get the mod time of the conch, wait 0.5s and try again. + * 2nd try: fail if the mod time changed or host id is different, wait + * 10 sec and try again + * 3rd try: break the lock unless the mod time has changed. + */ + struct stat buf; + if( osFstat(conchFile->h, &buf) ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR_LOCK; + } + + if( nTries==1 ){ + conchModTime = buf.st_mtimespec; + usleep(500000); /* wait 0.5 sec and try the lock again*/ + continue; + } + + assert( nTries>1 ); + if( conchModTime.tv_sec != buf.st_mtimespec.tv_sec || + conchModTime.tv_nsec != buf.st_mtimespec.tv_nsec ){ + return SQLITE_BUSY; + } + + if( nTries==2 ){ + char tBuf[PROXY_MAXCONCHLEN]; + int len = osPread(conchFile->h, tBuf, PROXY_MAXCONCHLEN, 0); + if( len<0 ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR_LOCK; + } + if( len>PROXY_PATHINDEX && tBuf[0]==(char)PROXY_CONCHVERSION){ + /* don't break the lock if the host id doesn't match */ + if( 0!=memcmp(&tBuf[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN) ){ + return SQLITE_BUSY; + } + }else{ + /* don't break the lock on short read or a version mismatch */ + return SQLITE_BUSY; + } + usleep(10000000); /* wait 10 sec and try the lock again */ + continue; + } + + assert( nTries==3 ); + if( 0==proxyBreakConchLock(pFile, myHostID) ){ + rc = SQLITE_OK; + if( lockType==EXCLUSIVE_LOCK ){ + rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, SHARED_LOCK); + } + if( !rc ){ + rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); + } + } + } + } while( rc==SQLITE_BUSY && nTries<3 ); + + return rc; +} + +/* Takes the conch by taking a shared lock and read the contents conch, if +** lockPath is non-NULL, the host ID and lock file path must match. A NULL +** lockPath means that the lockPath in the conch file will be used if the +** host IDs match, or a new lock path will be generated automatically +** and written to the conch file. +*/ +static int proxyTakeConch(unixFile *pFile){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + + if( pCtx->conchHeld!=0 ){ + return SQLITE_OK; + }else{ + unixFile *conchFile = pCtx->conchFile; + uuid_t myHostID; + int pError = 0; + char readBuf[PROXY_MAXCONCHLEN]; + char lockPath[MAXPATHLEN]; + char *tempLockPath = NULL; + int rc = SQLITE_OK; + int createConch = 0; + int hostIdMatch = 0; + int readLen = 0; + int tryOldLockPath = 0; + int forceNewLockPath = 0; + + OSTRACE(("TAKECONCH %d for %s pid=%d\n", conchFile->h, + (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), + osGetpid(0))); + + rc = proxyGetHostID(myHostID, &pError); + if( (rc&0xff)==SQLITE_IOERR ){ + storeLastErrno(pFile, pError); + goto end_takeconch; + } + rc = proxyConchLock(pFile, myHostID, SHARED_LOCK); + if( rc!=SQLITE_OK ){ + goto end_takeconch; + } + /* read the existing conch file */ + readLen = seekAndRead((unixFile*)conchFile, 0, readBuf, PROXY_MAXCONCHLEN); + if( readLen<0 ){ + /* I/O error: lastErrno set by seekAndRead */ + storeLastErrno(pFile, conchFile->lastErrno); + rc = SQLITE_IOERR_READ; + goto end_takeconch; + }else if( readLen<=(PROXY_HEADERLEN+PROXY_HOSTIDLEN) || + readBuf[0]!=(char)PROXY_CONCHVERSION ){ + /* a short read or version format mismatch means we need to create a new + ** conch file. + */ + createConch = 1; + } + /* if the host id matches and the lock path already exists in the conch + ** we'll try to use the path there, if we can't open that path, we'll + ** retry with a new auto-generated path + */ + do { /* in case we need to try again for an :auto: named lock file */ + + if( !createConch && !forceNewLockPath ){ + hostIdMatch = !memcmp(&readBuf[PROXY_HEADERLEN], myHostID, + PROXY_HOSTIDLEN); + /* if the conch has data compare the contents */ + if( !pCtx->lockProxyPath ){ + /* for auto-named local lock file, just check the host ID and we'll + ** use the local lock file path that's already in there + */ + if( hostIdMatch ){ + size_t pathLen = (readLen - PROXY_PATHINDEX); + + if( pathLen>=MAXPATHLEN ){ + pathLen=MAXPATHLEN-1; + } + memcpy(lockPath, &readBuf[PROXY_PATHINDEX], pathLen); + lockPath[pathLen] = 0; + tempLockPath = lockPath; + tryOldLockPath = 1; + /* create a copy of the lock path if the conch is taken */ + goto end_takeconch; + } + }else if( hostIdMatch + && !strncmp(pCtx->lockProxyPath, &readBuf[PROXY_PATHINDEX], + readLen-PROXY_PATHINDEX) + ){ + /* conch host and lock path match */ + goto end_takeconch; + } + } + + /* if the conch isn't writable and doesn't match, we can't take it */ + if( (conchFile->openFlags&O_RDWR) == 0 ){ + rc = SQLITE_BUSY; + goto end_takeconch; + } + + /* either the conch didn't match or we need to create a new one */ + if( !pCtx->lockProxyPath ){ + proxyGetLockPath(pCtx->dbPath, lockPath, MAXPATHLEN); + tempLockPath = lockPath; + /* create a copy of the lock path _only_ if the conch is taken */ + } + + /* update conch with host and path (this will fail if other process + ** has a shared lock already), if the host id matches, use the big + ** stick. + */ + futimes(conchFile->h, NULL); + if( hostIdMatch && !createConch ){ + if( conchFile->pInode && conchFile->pInode->nShared>1 ){ + /* We are trying for an exclusive lock but another thread in this + ** same process is still holding a shared lock. */ + rc = SQLITE_BUSY; + } else { + rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK); + } + }else{ + rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK); + } + if( rc==SQLITE_OK ){ + char writeBuffer[PROXY_MAXCONCHLEN]; + int writeSize = 0; + + writeBuffer[0] = (char)PROXY_CONCHVERSION; + memcpy(&writeBuffer[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); + if( pCtx->lockProxyPath!=NULL ){ + strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, + MAXPATHLEN); + }else{ + strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAXPATHLEN); + } + writeSize = PROXY_PATHINDEX + strlen(&writeBuffer[PROXY_PATHINDEX]); + robust_ftruncate(conchFile->h, writeSize); + rc = unixWrite((sqlite3_file *)conchFile, writeBuffer, writeSize, 0); + full_fsync(conchFile->h,0,0); + /* If we created a new conch file (not just updated the contents of a + ** valid conch file), try to match the permissions of the database + */ + if( rc==SQLITE_OK && createConch ){ + struct stat buf; + int err = osFstat(pFile->h, &buf); + if( err==0 ){ + mode_t cmode = buf.st_mode&(S_IRUSR|S_IWUSR | S_IRGRP|S_IWGRP | + S_IROTH|S_IWOTH); + /* try to match the database file R/W permissions, ignore failure */ +#ifndef SQLITE_PROXY_DEBUG + osFchmod(conchFile->h, cmode); +#else + do{ + rc = osFchmod(conchFile->h, cmode); + }while( rc==(-1) && errno==EINTR ); + if( rc!=0 ){ + int code = errno; + fprintf(stderr, "fchmod %o FAILED with %d %s\n", + cmode, code, strerror(code)); + } else { + fprintf(stderr, "fchmod %o SUCCEDED\n",cmode); + } + }else{ + int code = errno; + fprintf(stderr, "STAT FAILED[%d] with %d %s\n", + err, code, strerror(code)); +#endif + } + } + } + conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, SHARED_LOCK); + + end_takeconch: + OSTRACE(("TRANSPROXY: CLOSE %d\n", pFile->h)); + if( rc==SQLITE_OK && pFile->openFlags ){ + int fd; + if( pFile->h>=0 ){ + robust_close(pFile, pFile->h, __LINE__); + } + pFile->h = -1; + fd = robust_open(pCtx->dbPath, pFile->openFlags, 0); + OSTRACE(("TRANSPROXY: OPEN %d\n", fd)); + if( fd>=0 ){ + pFile->h = fd; + }else{ + rc=SQLITE_CANTOPEN_BKPT; /* SQLITE_BUSY? proxyTakeConch called + during locking */ + } + } + if( rc==SQLITE_OK && !pCtx->lockProxy ){ + char *path = tempLockPath ? tempLockPath : pCtx->lockProxyPath; + rc = proxyCreateUnixFile(path, &pCtx->lockProxy, 1); + if( rc!=SQLITE_OK && rc!=SQLITE_NOMEM && tryOldLockPath ){ + /* we couldn't create the proxy lock file with the old lock file path + ** so try again via auto-naming + */ + forceNewLockPath = 1; + tryOldLockPath = 0; + continue; /* go back to the do {} while start point, try again */ + } + } + if( rc==SQLITE_OK ){ + /* Need to make a copy of path if we extracted the value + ** from the conch file or the path was allocated on the stack + */ + if( tempLockPath ){ + pCtx->lockProxyPath = sqlite3DbStrDup(0, tempLockPath); + if( !pCtx->lockProxyPath ){ + rc = SQLITE_NOMEM_BKPT; + } + } + } + if( rc==SQLITE_OK ){ + pCtx->conchHeld = 1; + + if( pCtx->lockProxy->pMethod == &afpIoMethods ){ + afpLockingContext *afpCtx; + afpCtx = (afpLockingContext *)pCtx->lockProxy->lockingContext; + afpCtx->dbPath = pCtx->lockProxyPath; + } + } else { + conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); + } + OSTRACE(("TAKECONCH %d %s\n", conchFile->h, + rc==SQLITE_OK?"ok":"failed")); + return rc; + } while (1); /* in case we need to retry the :auto: lock file - + ** we should never get here except via the 'continue' call. */ + } +} + +/* +** If pFile holds a lock on a conch file, then release that lock. +*/ +static int proxyReleaseConch(unixFile *pFile){ + int rc = SQLITE_OK; /* Subroutine return code */ + proxyLockingContext *pCtx; /* The locking context for the proxy lock */ + unixFile *conchFile; /* Name of the conch file */ + + pCtx = (proxyLockingContext *)pFile->lockingContext; + conchFile = pCtx->conchFile; + OSTRACE(("RELEASECONCH %d for %s pid=%d\n", conchFile->h, + (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), + osGetpid(0))); + if( pCtx->conchHeld>0 ){ + rc = conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); + } + pCtx->conchHeld = 0; + OSTRACE(("RELEASECONCH %d %s\n", conchFile->h, + (rc==SQLITE_OK ? "ok" : "failed"))); + return rc; +} + +/* +** Given the name of a database file, compute the name of its conch file. +** Store the conch filename in memory obtained from sqlite3_malloc64(). +** Make *pConchPath point to the new name. Return SQLITE_OK on success +** or SQLITE_NOMEM if unable to obtain memory. +** +** The caller is responsible for ensuring that the allocated memory +** space is eventually freed. +** +** *pConchPath is set to NULL if a memory allocation error occurs. +*/ +static int proxyCreateConchPathname(char *dbPath, char **pConchPath){ + int i; /* Loop counter */ + int len = (int)strlen(dbPath); /* Length of database filename - dbPath */ + char *conchPath; /* buffer in which to construct conch name */ + + /* Allocate space for the conch filename and initialize the name to + ** the name of the original database file. */ + *pConchPath = conchPath = (char *)sqlite3_malloc64(len + 8); + if( conchPath==0 ){ + return SQLITE_NOMEM_BKPT; + } + memcpy(conchPath, dbPath, len+1); + + /* now insert a "." before the last / character */ + for( i=(len-1); i>=0; i-- ){ + if( conchPath[i]=='/' ){ + i++; + break; + } + } + conchPath[i]='.'; + while ( ilockingContext; + char *oldPath = pCtx->lockProxyPath; + int rc = SQLITE_OK; + + if( pFile->eFileLock!=NO_LOCK ){ + return SQLITE_BUSY; + } + + /* nothing to do if the path is NULL, :auto: or matches the existing path */ + if( !path || path[0]=='\0' || !strcmp(path, ":auto:") || + (oldPath && !strncmp(oldPath, path, MAXPATHLEN)) ){ + return SQLITE_OK; + }else{ + unixFile *lockProxy = pCtx->lockProxy; + pCtx->lockProxy=NULL; + pCtx->conchHeld = 0; + if( lockProxy!=NULL ){ + rc=lockProxy->pMethod->xClose((sqlite3_file *)lockProxy); + if( rc ) return rc; + sqlite3_free(lockProxy); + } + sqlite3_free(oldPath); + pCtx->lockProxyPath = sqlite3DbStrDup(0, path); + } + + return rc; +} + +/* +** pFile is a file that has been opened by a prior xOpen call. dbPath +** is a string buffer at least MAXPATHLEN+1 characters in size. +** +** This routine find the filename associated with pFile and writes it +** int dbPath. +*/ +static int proxyGetDbPathForUnixFile(unixFile *pFile, char *dbPath){ +#if defined(__APPLE__) + if( pFile->pMethod == &afpIoMethods ){ + /* afp style keeps a reference to the db path in the filePath field + ** of the struct */ + assert( (int)strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); + strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, + MAXPATHLEN); + } else +#endif + if( pFile->pMethod == &dotlockIoMethods ){ + /* dot lock style uses the locking context to store the dot lock + ** file path */ + int len = strlen((char *)pFile->lockingContext) - strlen(DOTLOCK_SUFFIX); + memcpy(dbPath, (char *)pFile->lockingContext, len + 1); + }else{ + /* all other styles use the locking context to store the db file path */ + assert( strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); + strlcpy(dbPath, (char *)pFile->lockingContext, MAXPATHLEN); + } + return SQLITE_OK; +} + +/* +** Takes an already filled in unix file and alters it so all file locking +** will be performed on the local proxy lock file. The following fields +** are preserved in the locking context so that they can be restored and +** the unix structure properly cleaned up at close time: +** ->lockingContext +** ->pMethod +*/ +static int proxyTransformUnixFile(unixFile *pFile, const char *path) { + proxyLockingContext *pCtx; + char dbPath[MAXPATHLEN+1]; /* Name of the database file */ + char *lockPath=NULL; + int rc = SQLITE_OK; + + if( pFile->eFileLock!=NO_LOCK ){ + return SQLITE_BUSY; + } + proxyGetDbPathForUnixFile(pFile, dbPath); + if( !path || path[0]=='\0' || !strcmp(path, ":auto:") ){ + lockPath=NULL; + }else{ + lockPath=(char *)path; + } + + OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h, + (lockPath ? lockPath : ":auto:"), osGetpid(0))); + + pCtx = sqlite3_malloc64( sizeof(*pCtx) ); + if( pCtx==0 ){ + return SQLITE_NOMEM_BKPT; + } + memset(pCtx, 0, sizeof(*pCtx)); + + rc = proxyCreateConchPathname(dbPath, &pCtx->conchFilePath); + if( rc==SQLITE_OK ){ + rc = proxyCreateUnixFile(pCtx->conchFilePath, &pCtx->conchFile, 0); + if( rc==SQLITE_CANTOPEN && ((pFile->openFlags&O_RDWR) == 0) ){ + /* if (a) the open flags are not O_RDWR, (b) the conch isn't there, and + ** (c) the file system is read-only, then enable no-locking access. + ** Ugh, since O_RDONLY==0x0000 we test for !O_RDWR since unixOpen asserts + ** that openFlags will have only one of O_RDONLY or O_RDWR. + */ + struct statfs fsInfo; + struct stat conchInfo; + int goLockless = 0; + + if( osStat(pCtx->conchFilePath, &conchInfo) == -1 ) { + int err = errno; + if( (err==ENOENT) && (statfs(dbPath, &fsInfo) != -1) ){ + goLockless = (fsInfo.f_flags&MNT_RDONLY) == MNT_RDONLY; + } + } + if( goLockless ){ + pCtx->conchHeld = -1; /* read only FS/ lockless */ + rc = SQLITE_OK; + } + } + } + if( rc==SQLITE_OK && lockPath ){ + pCtx->lockProxyPath = sqlite3DbStrDup(0, lockPath); + } + + if( rc==SQLITE_OK ){ + pCtx->dbPath = sqlite3DbStrDup(0, dbPath); + if( pCtx->dbPath==NULL ){ + rc = SQLITE_NOMEM_BKPT; + } + } + if( rc==SQLITE_OK ){ + /* all memory is allocated, proxys are created and assigned, + ** switch the locking context and pMethod then return. + */ + pCtx->oldLockingContext = pFile->lockingContext; + pFile->lockingContext = pCtx; + pCtx->pOldMethod = pFile->pMethod; + pFile->pMethod = &proxyIoMethods; + }else{ + if( pCtx->conchFile ){ + pCtx->conchFile->pMethod->xClose((sqlite3_file *)pCtx->conchFile); + sqlite3_free(pCtx->conchFile); + } + sqlite3DbFree(0, pCtx->lockProxyPath); + sqlite3_free(pCtx->conchFilePath); + sqlite3_free(pCtx); + } + OSTRACE(("TRANSPROXY %d %s\n", pFile->h, + (rc==SQLITE_OK ? "ok" : "failed"))); + return rc; +} + + +/* +** This routine handles sqlite3_file_control() calls that are specific +** to proxy locking. +*/ +static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ + switch( op ){ + case SQLITE_FCNTL_GET_LOCKPROXYFILE: { + unixFile *pFile = (unixFile*)id; + if( pFile->pMethod == &proxyIoMethods ){ + proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext; + proxyTakeConch(pFile); + if( pCtx->lockProxyPath ){ + *(const char **)pArg = pCtx->lockProxyPath; + }else{ + *(const char **)pArg = ":auto: (not held)"; + } + } else { + *(const char **)pArg = NULL; + } + return SQLITE_OK; + } + case SQLITE_FCNTL_SET_LOCKPROXYFILE: { + unixFile *pFile = (unixFile*)id; + int rc = SQLITE_OK; + int isProxyStyle = (pFile->pMethod == &proxyIoMethods); + if( pArg==NULL || (const char *)pArg==0 ){ + if( isProxyStyle ){ + /* turn off proxy locking - not supported. If support is added for + ** switching proxy locking mode off then it will need to fail if + ** the journal mode is WAL mode. + */ + rc = SQLITE_ERROR /*SQLITE_PROTOCOL? SQLITE_MISUSE?*/; + }else{ + /* turn off proxy locking - already off - NOOP */ + rc = SQLITE_OK; + } + }else{ + const char *proxyPath = (const char *)pArg; + if( isProxyStyle ){ + proxyLockingContext *pCtx = + (proxyLockingContext*)pFile->lockingContext; + if( !strcmp(pArg, ":auto:") + || (pCtx->lockProxyPath && + !strncmp(pCtx->lockProxyPath, proxyPath, MAXPATHLEN)) + ){ + rc = SQLITE_OK; + }else{ + rc = switchLockProxyPath(pFile, proxyPath); + } + }else{ + /* turn on proxy file locking */ + rc = proxyTransformUnixFile(pFile, proxyPath); + } + } + return rc; + } + default: { + assert( 0 ); /* The call assures that only valid opcodes are sent */ + } + } + /*NOTREACHED*/ assert(0); + return SQLITE_ERROR; +} + +/* +** Within this division (the proxying locking implementation) the procedures +** above this point are all utilities. The lock-related methods of the +** proxy-locking sqlite3_io_method object follow. +*/ + + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int proxyCheckReservedLock(sqlite3_file *id, int *pResOut) { + unixFile *pFile = (unixFile*)id; + int rc = proxyTakeConch(pFile); + if( rc==SQLITE_OK ){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + if( pCtx->conchHeld>0 ){ + unixFile *proxy = pCtx->lockProxy; + return proxy->pMethod->xCheckReservedLock((sqlite3_file*)proxy, pResOut); + }else{ /* conchHeld < 0 is lockless */ + pResOut=0; + } + } + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int proxyLock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + int rc = proxyTakeConch(pFile); + if( rc==SQLITE_OK ){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + if( pCtx->conchHeld>0 ){ + unixFile *proxy = pCtx->lockProxy; + rc = proxy->pMethod->xLock((sqlite3_file*)proxy, eFileLock); + pFile->eFileLock = proxy->eFileLock; + }else{ + /* conchHeld < 0 is lockless */ + } + } + return rc; +} + + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int proxyUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + int rc = proxyTakeConch(pFile); + if( rc==SQLITE_OK ){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + if( pCtx->conchHeld>0 ){ + unixFile *proxy = pCtx->lockProxy; + rc = proxy->pMethod->xUnlock((sqlite3_file*)proxy, eFileLock); + pFile->eFileLock = proxy->eFileLock; + }else{ + /* conchHeld < 0 is lockless */ + } + } + return rc; +} + +/* +** Close a file that uses proxy locks. +*/ +static int proxyClose(sqlite3_file *id) { + if( ALWAYS(id) ){ + unixFile *pFile = (unixFile*)id; + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + unixFile *lockProxy = pCtx->lockProxy; + unixFile *conchFile = pCtx->conchFile; + int rc = SQLITE_OK; + + if( lockProxy ){ + rc = lockProxy->pMethod->xUnlock((sqlite3_file*)lockProxy, NO_LOCK); + if( rc ) return rc; + rc = lockProxy->pMethod->xClose((sqlite3_file*)lockProxy); + if( rc ) return rc; + sqlite3_free(lockProxy); + pCtx->lockProxy = 0; + } + if( conchFile ){ + if( pCtx->conchHeld ){ + rc = proxyReleaseConch(pFile); + if( rc ) return rc; + } + rc = conchFile->pMethod->xClose((sqlite3_file*)conchFile); + if( rc ) return rc; + sqlite3_free(conchFile); + } + sqlite3DbFree(0, pCtx->lockProxyPath); + sqlite3_free(pCtx->conchFilePath); + sqlite3DbFree(0, pCtx->dbPath); + /* restore the original locking context and pMethod then close it */ + pFile->lockingContext = pCtx->oldLockingContext; + pFile->pMethod = pCtx->pOldMethod; + sqlite3_free(pCtx); + return pFile->pMethod->xClose(id); + } + return SQLITE_OK; +} + + + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ +/* +** The proxy locking style is intended for use with AFP filesystems. +** And since AFP is only supported on MacOSX, the proxy locking is also +** restricted to MacOSX. +** +** +******************* End of the proxy lock implementation ********************** +******************************************************************************/ + +/* +** Initialize the operating system interface. +** +** This routine registers all VFS implementations for unix-like operating +** systems. This routine, and the sqlite3_os_end() routine that follows, +** should be the only routines in this file that are visible from other +** files. +** +** This routine is called once during SQLite initialization and by a +** single thread. The memory allocation and mutex subsystems have not +** necessarily been initialized when this routine is called, and so they +** should not be used. +*/ +SQLITE_API int sqlite3_os_init(void){ + /* + ** The following macro defines an initializer for an sqlite3_vfs object. + ** The name of the VFS is NAME. The pAppData is a pointer to a pointer + ** to the "finder" function. (pAppData is a pointer to a pointer because + ** silly C90 rules prohibit a void* from being cast to a function pointer + ** and so we have to go through the intermediate pointer to avoid problems + ** when compiling with -pedantic-errors on GCC.) + ** + ** The FINDER parameter to this macro is the name of the pointer to the + ** finder-function. The finder-function returns a pointer to the + ** sqlite_io_methods object that implements the desired locking + ** behaviors. See the division above that contains the IOMETHODS + ** macro for addition information on finder-functions. + ** + ** Most finders simply return a pointer to a fixed sqlite3_io_methods + ** object. But the "autolockIoFinder" available on MacOSX does a little + ** more than that; it looks at the filesystem type that hosts the + ** database file and tries to choose an locking method appropriate for + ** that filesystem time. + */ + #define UNIXVFS(VFSNAME, FINDER) { \ + 3, /* iVersion */ \ + sizeof(unixFile), /* szOsFile */ \ + MAX_PATHNAME, /* mxPathname */ \ + 0, /* pNext */ \ + VFSNAME, /* zName */ \ + (void*)&FINDER, /* pAppData */ \ + unixOpen, /* xOpen */ \ + unixDelete, /* xDelete */ \ + unixAccess, /* xAccess */ \ + unixFullPathname, /* xFullPathname */ \ + unixDlOpen, /* xDlOpen */ \ + unixDlError, /* xDlError */ \ + unixDlSym, /* xDlSym */ \ + unixDlClose, /* xDlClose */ \ + unixRandomness, /* xRandomness */ \ + unixSleep, /* xSleep */ \ + unixCurrentTime, /* xCurrentTime */ \ + unixGetLastError, /* xGetLastError */ \ + unixCurrentTimeInt64, /* xCurrentTimeInt64 */ \ + unixSetSystemCall, /* xSetSystemCall */ \ + unixGetSystemCall, /* xGetSystemCall */ \ + unixNextSystemCall, /* xNextSystemCall */ \ + } + + /* + ** All default VFSes for unix are contained in the following array. + ** + ** Note that the sqlite3_vfs.pNext field of the VFS object is modified + ** by the SQLite core when the VFS is registered. So the following + ** array cannot be const. + */ + static sqlite3_vfs aVfs[] = { +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + UNIXVFS("unix", autolockIoFinder ), +#elif OS_VXWORKS + UNIXVFS("unix", vxworksIoFinder ), +#else + UNIXVFS("unix", posixIoFinder ), +#endif + UNIXVFS("unix-none", nolockIoFinder ), + UNIXVFS("unix-dotfile", dotlockIoFinder ), + UNIXVFS("unix-excl", posixIoFinder ), +#if OS_VXWORKS + UNIXVFS("unix-namedsem", semIoFinder ), +#endif +#if SQLITE_ENABLE_LOCKING_STYLE || OS_VXWORKS + UNIXVFS("unix-posix", posixIoFinder ), +#endif +#if SQLITE_ENABLE_LOCKING_STYLE + UNIXVFS("unix-flock", flockIoFinder ), +#endif +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + UNIXVFS("unix-afp", afpIoFinder ), + UNIXVFS("unix-nfs", nfsIoFinder ), + UNIXVFS("unix-proxy", proxyIoFinder ), +#endif + }; + unsigned int i; /* Loop counter */ + + /* Double-check that the aSyscall[] array has been constructed + ** correctly. See ticket [bb3a86e890c8e96ab] */ + assert( ArraySize(aSyscall)==29 ); + + /* Register all VFSes defined in the aVfs[] array */ + for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ + sqlite3_vfs_register(&aVfs[i], i==0); + } + unixBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); + return SQLITE_OK; +} + +/* +** Shutdown the operating system interface. +** +** Some operating systems might need to do some cleanup in this routine, +** to release dynamically allocated objects. But not on unix. +** This routine is a no-op for unix. +*/ +SQLITE_API int sqlite3_os_end(void){ + unixBigLock = 0; + return SQLITE_OK; +} + +#endif /* SQLITE_OS_UNIX */ + +/************** End of os_unix.c *********************************************/ +/************** Begin file os_win.c ******************************************/ +/* +** 2004 May 22 +** +** 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 code that is specific to Windows. +*/ +/* #include "sqliteInt.h" */ +#if SQLITE_OS_WIN /* This file is used for Windows only */ + +/* +** Include code that is common to all os_*.c files +*/ +/************** Include os_common.h in the middle of os_win.c ****************/ +/************** Begin file os_common.h ***************************************/ +/* +** 2004 May 22 +** +** 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 macros and a little bit of code that is common to +** all of the platform-specific files (os_*.c) and is #included into those +** files. +** +** This file should be #included by the os_*.c files only. It is not a +** general purpose header file. +*/ +#ifndef _OS_COMMON_H_ +#define _OS_COMMON_H_ + +/* +** At least two bugs have slipped in because we changed the MEMORY_DEBUG +** macro to SQLITE_DEBUG and some older makefiles have not yet made the +** switch. The following code should catch this problem at compile-time. +*/ +#ifdef MEMORY_DEBUG +# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." +#endif + +/* +** Macros for performance tracing. Normally turned off. Only works +** on i486 hardware. +*/ +#ifdef SQLITE_PERFORMANCE_TRACE + +/* +** hwtime.h contains inline assembler code for implementing +** high-performance timing routines. +*/ +/************** Include hwtime.h in the middle of os_common.h ****************/ +/************** Begin file hwtime.h ******************************************/ +/* +** 2008 May 27 +** +** 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 inline asm code for retrieving "high-performance" +** counters for x86 and x86_64 class CPUs. +*/ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H + +/* +** The following routine only works on pentium-class (or newer) processors. +** It uses the RDTSC opcode to read the cycle count value out of the +** processor and returns that value. This can be used for high-res +** profiling. +*/ +#if !defined(__STRICT_ANSI__) && \ + (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) + + #if defined(__GNUC__) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + + #elif defined(_MSC_VER) + + __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ + __asm { + rdtsc + ret ; return value at EDX:EAX + } + } + + #endif + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long val; + __asm__ __volatile__ ("rdtsc" : "=A" (val)); + return val; + } + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long long retval; + unsigned long junk; + __asm__ __volatile__ ("\n\ + 1: mftbu %1\n\ + mftb %L0\n\ + mftbu %0\n\ + cmpw %0,%1\n\ + bne 1b" + : "=r" (retval), "=r" (junk)); + return retval; + } + +#else + + /* + ** asm() is needed for hardware timing support. Without asm(), + ** disable the sqlite3Hwtime() routine. + ** + ** sqlite3Hwtime() is only used for some obscure debugging + ** and analysis configurations, not in any deliverable, so this + ** should not be a great loss. + */ +SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } + +#endif + +#endif /* !defined(SQLITE_HWTIME_H) */ + +/************** End of hwtime.h **********************************************/ +/************** Continuing where we left off in os_common.h ******************/ + +static sqlite_uint64 g_start; +static sqlite_uint64 g_elapsed; +#define TIMER_START g_start=sqlite3Hwtime() +#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start +#define TIMER_ELAPSED g_elapsed +#else +#define TIMER_START +#define TIMER_END +#define TIMER_ELAPSED ((sqlite_uint64)0) +#endif + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_io_error_hit; +SQLITE_API extern int sqlite3_io_error_hardhit; +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_persist; +SQLITE_API extern int sqlite3_io_error_benign; +SQLITE_API extern int sqlite3_diskfull_pending; +SQLITE_API extern int sqlite3_diskfull; +#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) +#define SimulateIOError(CODE) \ + if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ + || sqlite3_io_error_pending-- == 1 ) \ + { local_ioerr(); CODE; } +static void local_ioerr(){ + IOTRACE(("IOERR\n")); + sqlite3_io_error_hit++; + if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++; +} +#define SimulateDiskfullError(CODE) \ + if( sqlite3_diskfull_pending ){ \ + if( sqlite3_diskfull_pending == 1 ){ \ + local_ioerr(); \ + sqlite3_diskfull = 1; \ + sqlite3_io_error_hit = 1; \ + CODE; \ + }else{ \ + sqlite3_diskfull_pending--; \ + } \ + } +#else +#define SimulateIOErrorBenign(X) +#define SimulateIOError(A) +#define SimulateDiskfullError(A) +#endif /* defined(SQLITE_TEST) */ + +/* +** When testing, keep a count of the number of open files. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_open_file_count; +#define OpenCounter(X) sqlite3_open_file_count+=(X) +#else +#define OpenCounter(X) +#endif /* defined(SQLITE_TEST) */ + +#endif /* !defined(_OS_COMMON_H_) */ + +/************** End of os_common.h *******************************************/ +/************** Continuing where we left off in os_win.c *********************/ + +/* +** Include the header file for the Windows VFS. +*/ +/* #include "os_win.h" */ + +/* +** Compiling and using WAL mode requires several APIs that are only +** available in Windows platforms based on the NT kernel. +*/ +#if !SQLITE_OS_WINNT && !defined(SQLITE_OMIT_WAL) +# error "WAL mode requires support from the Windows NT kernel, compile\ + with SQLITE_OMIT_WAL." +#endif + +#if !SQLITE_OS_WINNT && SQLITE_MAX_MMAP_SIZE>0 +# error "Memory mapped files require support from the Windows NT kernel,\ + compile with SQLITE_MAX_MMAP_SIZE=0." +#endif + +/* +** Are most of the Win32 ANSI APIs available (i.e. with certain exceptions +** based on the sub-platform)? +*/ +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(SQLITE_WIN32_NO_ANSI) +# define SQLITE_WIN32_HAS_ANSI +#endif + +/* +** Are most of the Win32 Unicode APIs available (i.e. with certain exceptions +** based on the sub-platform)? +*/ +#if (SQLITE_OS_WINCE || SQLITE_OS_WINNT || SQLITE_OS_WINRT) && \ + !defined(SQLITE_WIN32_NO_WIDE) +# define SQLITE_WIN32_HAS_WIDE +#endif + +/* +** Make sure at least one set of Win32 APIs is available. +*/ +#if !defined(SQLITE_WIN32_HAS_ANSI) && !defined(SQLITE_WIN32_HAS_WIDE) +# error "At least one of SQLITE_WIN32_HAS_ANSI and SQLITE_WIN32_HAS_WIDE\ + must be defined." +#endif + +/* +** Define the required Windows SDK version constants if they are not +** already available. +*/ +#ifndef NTDDI_WIN8 +# define NTDDI_WIN8 0x06020000 +#endif + +#ifndef NTDDI_WINBLUE +# define NTDDI_WINBLUE 0x06030000 +#endif + +#ifndef NTDDI_WINTHRESHOLD +# define NTDDI_WINTHRESHOLD 0x06040000 +#endif + +/* +** Check to see if the GetVersionEx[AW] functions are deprecated on the +** target system. GetVersionEx was first deprecated in Win8.1. +*/ +#ifndef SQLITE_WIN32_GETVERSIONEX +# if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WINBLUE +# define SQLITE_WIN32_GETVERSIONEX 0 /* GetVersionEx() is deprecated */ +# else +# define SQLITE_WIN32_GETVERSIONEX 1 /* GetVersionEx() is current */ +# endif +#endif + +/* +** Check to see if the CreateFileMappingA function is supported on the +** target system. It is unavailable when using "mincore.lib" on Win10. +** When compiling for Windows 10, always assume "mincore.lib" is in use. +*/ +#ifndef SQLITE_WIN32_CREATEFILEMAPPINGA +# if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WINTHRESHOLD +# define SQLITE_WIN32_CREATEFILEMAPPINGA 0 +# else +# define SQLITE_WIN32_CREATEFILEMAPPINGA 1 +# endif +#endif + +/* +** This constant should already be defined (in the "WinDef.h" SDK file). +*/ +#ifndef MAX_PATH +# define MAX_PATH (260) +#endif + +/* +** Maximum pathname length (in chars) for Win32. This should normally be +** MAX_PATH. +*/ +#ifndef SQLITE_WIN32_MAX_PATH_CHARS +# define SQLITE_WIN32_MAX_PATH_CHARS (MAX_PATH) +#endif + +/* +** This constant should already be defined (in the "WinNT.h" SDK file). +*/ +#ifndef UNICODE_STRING_MAX_CHARS +# define UNICODE_STRING_MAX_CHARS (32767) +#endif + +/* +** Maximum pathname length (in chars) for WinNT. This should normally be +** UNICODE_STRING_MAX_CHARS. +*/ +#ifndef SQLITE_WINNT_MAX_PATH_CHARS +# define SQLITE_WINNT_MAX_PATH_CHARS (UNICODE_STRING_MAX_CHARS) +#endif + +/* +** Maximum pathname length (in bytes) for Win32. The MAX_PATH macro is in +** characters, so we allocate 4 bytes per character assuming worst-case of +** 4-bytes-per-character for UTF8. +*/ +#ifndef SQLITE_WIN32_MAX_PATH_BYTES +# define SQLITE_WIN32_MAX_PATH_BYTES (SQLITE_WIN32_MAX_PATH_CHARS*4) +#endif + +/* +** Maximum pathname length (in bytes) for WinNT. This should normally be +** UNICODE_STRING_MAX_CHARS * sizeof(WCHAR). +*/ +#ifndef SQLITE_WINNT_MAX_PATH_BYTES +# define SQLITE_WINNT_MAX_PATH_BYTES \ + (sizeof(WCHAR) * SQLITE_WINNT_MAX_PATH_CHARS) +#endif + +/* +** Maximum error message length (in chars) for WinRT. +*/ +#ifndef SQLITE_WIN32_MAX_ERRMSG_CHARS +# define SQLITE_WIN32_MAX_ERRMSG_CHARS (1024) +#endif + +/* +** Returns non-zero if the character should be treated as a directory +** separator. +*/ +#ifndef winIsDirSep +# define winIsDirSep(a) (((a) == '/') || ((a) == '\\')) +#endif + +/* +** This macro is used when a local variable is set to a value that is +** [sometimes] not used by the code (e.g. via conditional compilation). +*/ +#ifndef UNUSED_VARIABLE_VALUE +# define UNUSED_VARIABLE_VALUE(x) (void)(x) +#endif + +/* +** Returns the character that should be used as the directory separator. +*/ +#ifndef winGetDirSep +# define winGetDirSep() '\\' +#endif + +/* +** Do we need to manually define the Win32 file mapping APIs for use with WAL +** mode or memory mapped files (e.g. these APIs are available in the Windows +** CE SDK; however, they are not present in the header file)? +*/ +#if SQLITE_WIN32_FILEMAPPING_API && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) +/* +** Two of the file mapping APIs are different under WinRT. Figure out which +** set we need. +*/ +#if SQLITE_OS_WINRT +WINBASEAPI HANDLE WINAPI CreateFileMappingFromApp(HANDLE, \ + LPSECURITY_ATTRIBUTES, ULONG, ULONG64, LPCWSTR); + +WINBASEAPI LPVOID WINAPI MapViewOfFileFromApp(HANDLE, ULONG, ULONG64, SIZE_T); +#else +#if defined(SQLITE_WIN32_HAS_ANSI) +WINBASEAPI HANDLE WINAPI CreateFileMappingA(HANDLE, LPSECURITY_ATTRIBUTES, \ + DWORD, DWORD, DWORD, LPCSTR); +#endif /* defined(SQLITE_WIN32_HAS_ANSI) */ + +#if defined(SQLITE_WIN32_HAS_WIDE) +WINBASEAPI HANDLE WINAPI CreateFileMappingW(HANDLE, LPSECURITY_ATTRIBUTES, \ + DWORD, DWORD, DWORD, LPCWSTR); +#endif /* defined(SQLITE_WIN32_HAS_WIDE) */ + +WINBASEAPI LPVOID WINAPI MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, SIZE_T); +#endif /* SQLITE_OS_WINRT */ + +/* +** These file mapping APIs are common to both Win32 and WinRT. +*/ + +WINBASEAPI BOOL WINAPI FlushViewOfFile(LPCVOID, SIZE_T); +WINBASEAPI BOOL WINAPI UnmapViewOfFile(LPCVOID); +#endif /* SQLITE_WIN32_FILEMAPPING_API */ + +/* +** Some Microsoft compilers lack this definition. +*/ +#ifndef INVALID_FILE_ATTRIBUTES +# define INVALID_FILE_ATTRIBUTES ((DWORD)-1) +#endif + +#ifndef FILE_FLAG_MASK +# define FILE_FLAG_MASK (0xFF3C0000) +#endif + +#ifndef FILE_ATTRIBUTE_MASK +# define FILE_ATTRIBUTE_MASK (0x0003FFF7) +#endif + +#ifndef SQLITE_OMIT_WAL +/* Forward references to structures used for WAL */ +typedef struct winShm winShm; /* A connection to shared-memory */ +typedef struct winShmNode winShmNode; /* A region of shared-memory */ +#endif + +/* +** WinCE lacks native support for file locking so we have to fake it +** with some code of our own. +*/ +#if SQLITE_OS_WINCE +typedef struct winceLock { + int nReaders; /* Number of reader locks obtained */ + BOOL bPending; /* Indicates a pending lock has been obtained */ + BOOL bReserved; /* Indicates a reserved lock has been obtained */ + BOOL bExclusive; /* Indicates an exclusive lock has been obtained */ +} winceLock; +#endif + +/* +** The winFile structure is a subclass of sqlite3_file* specific to the win32 +** portability layer. +*/ +typedef struct winFile winFile; +struct winFile { + const sqlite3_io_methods *pMethod; /*** Must be first ***/ + sqlite3_vfs *pVfs; /* The VFS used to open this file */ + HANDLE h; /* Handle for accessing the file */ + u8 locktype; /* Type of lock currently held on this file */ + short sharedLockByte; /* Randomly chosen byte used as a shared lock */ + u8 ctrlFlags; /* Flags. See WINFILE_* below */ + DWORD lastErrno; /* The Windows errno from the last I/O error */ +#ifndef SQLITE_OMIT_WAL + winShm *pShm; /* Instance of shared memory on this file */ +#endif + const char *zPath; /* Full pathname of this file */ + int szChunk; /* Chunk size configured by FCNTL_CHUNK_SIZE */ +#if SQLITE_OS_WINCE + LPWSTR zDeleteOnClose; /* Name of file to delete when closing */ + HANDLE hMutex; /* Mutex used to control access to shared lock */ + HANDLE hShared; /* Shared memory segment used for locking */ + winceLock local; /* Locks obtained by this instance of winFile */ + winceLock *shared; /* Global shared lock memory for the file */ +#endif +#if SQLITE_MAX_MMAP_SIZE>0 + int nFetchOut; /* Number of outstanding xFetch references */ + HANDLE hMap; /* Handle for accessing memory mapping */ + void *pMapRegion; /* Area memory mapped */ + sqlite3_int64 mmapSize; /* Size of mapped region */ + sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ +#endif +}; + +/* +** The winVfsAppData structure is used for the pAppData member for all of the +** Win32 VFS variants. +*/ +typedef struct winVfsAppData winVfsAppData; +struct winVfsAppData { + const sqlite3_io_methods *pMethod; /* The file I/O methods to use. */ + void *pAppData; /* The extra pAppData, if any. */ + BOOL bNoLock; /* Non-zero if locking is disabled. */ +}; + +/* +** Allowed values for winFile.ctrlFlags +*/ +#define WINFILE_RDONLY 0x02 /* Connection is read only */ +#define WINFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */ +#define WINFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */ + +/* + * The size of the buffer used by sqlite3_win32_write_debug(). + */ +#ifndef SQLITE_WIN32_DBG_BUF_SIZE +# define SQLITE_WIN32_DBG_BUF_SIZE ((int)(4096-sizeof(DWORD))) +#endif + +/* + * If compiled with SQLITE_WIN32_MALLOC on Windows, we will use the + * various Win32 API heap functions instead of our own. + */ +#ifdef SQLITE_WIN32_MALLOC + +/* + * If this is non-zero, an isolated heap will be created by the native Win32 + * allocator subsystem; otherwise, the default process heap will be used. This + * setting has no effect when compiling for WinRT. By default, this is enabled + * and an isolated heap will be created to store all allocated data. + * + ****************************************************************************** + * WARNING: It is important to note that when this setting is non-zero and the + * winMemShutdown function is called (e.g. by the sqlite3_shutdown + * function), all data that was allocated using the isolated heap will + * be freed immediately and any attempt to access any of that freed + * data will almost certainly result in an immediate access violation. + ****************************************************************************** + */ +#ifndef SQLITE_WIN32_HEAP_CREATE +# define SQLITE_WIN32_HEAP_CREATE (TRUE) +#endif + +/* + * This is the maximum possible initial size of the Win32-specific heap, in + * bytes. + */ +#ifndef SQLITE_WIN32_HEAP_MAX_INIT_SIZE +# define SQLITE_WIN32_HEAP_MAX_INIT_SIZE (4294967295U) +#endif + +/* + * This is the extra space for the initial size of the Win32-specific heap, + * in bytes. This value may be zero. + */ +#ifndef SQLITE_WIN32_HEAP_INIT_EXTRA +# define SQLITE_WIN32_HEAP_INIT_EXTRA (4194304) +#endif + +/* + * Calculate the maximum legal cache size, in pages, based on the maximum + * possible initial heap size and the default page size, setting aside the + * needed extra space. + */ +#ifndef SQLITE_WIN32_MAX_CACHE_SIZE +# define SQLITE_WIN32_MAX_CACHE_SIZE (((SQLITE_WIN32_HEAP_MAX_INIT_SIZE) - \ + (SQLITE_WIN32_HEAP_INIT_EXTRA)) / \ + (SQLITE_DEFAULT_PAGE_SIZE)) +#endif + +/* + * This is cache size used in the calculation of the initial size of the + * Win32-specific heap. It cannot be negative. + */ +#ifndef SQLITE_WIN32_CACHE_SIZE +# if SQLITE_DEFAULT_CACHE_SIZE>=0 +# define SQLITE_WIN32_CACHE_SIZE (SQLITE_DEFAULT_CACHE_SIZE) +# else +# define SQLITE_WIN32_CACHE_SIZE (-(SQLITE_DEFAULT_CACHE_SIZE)) +# endif +#endif + +/* + * Make sure that the calculated cache size, in pages, cannot cause the + * initial size of the Win32-specific heap to exceed the maximum amount + * of memory that can be specified in the call to HeapCreate. + */ +#if SQLITE_WIN32_CACHE_SIZE>SQLITE_WIN32_MAX_CACHE_SIZE +# undef SQLITE_WIN32_CACHE_SIZE +# define SQLITE_WIN32_CACHE_SIZE (2000) +#endif + +/* + * The initial size of the Win32-specific heap. This value may be zero. + */ +#ifndef SQLITE_WIN32_HEAP_INIT_SIZE +# define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_WIN32_CACHE_SIZE) * \ + (SQLITE_DEFAULT_PAGE_SIZE) + \ + (SQLITE_WIN32_HEAP_INIT_EXTRA)) +#endif + +/* + * The maximum size of the Win32-specific heap. This value may be zero. + */ +#ifndef SQLITE_WIN32_HEAP_MAX_SIZE +# define SQLITE_WIN32_HEAP_MAX_SIZE (0) +#endif + +/* + * The extra flags to use in calls to the Win32 heap APIs. This value may be + * zero for the default behavior. + */ +#ifndef SQLITE_WIN32_HEAP_FLAGS +# define SQLITE_WIN32_HEAP_FLAGS (0) +#endif + + +/* +** The winMemData structure stores information required by the Win32-specific +** sqlite3_mem_methods implementation. +*/ +typedef struct winMemData winMemData; +struct winMemData { +#ifndef NDEBUG + u32 magic1; /* Magic number to detect structure corruption. */ +#endif + HANDLE hHeap; /* The handle to our heap. */ + BOOL bOwned; /* Do we own the heap (i.e. destroy it on shutdown)? */ +#ifndef NDEBUG + u32 magic2; /* Magic number to detect structure corruption. */ +#endif +}; + +#ifndef NDEBUG +#define WINMEM_MAGIC1 0x42b2830b +#define WINMEM_MAGIC2 0xbd4d7cf4 +#endif + +static struct winMemData win_mem_data = { +#ifndef NDEBUG + WINMEM_MAGIC1, +#endif + NULL, FALSE +#ifndef NDEBUG + ,WINMEM_MAGIC2 +#endif +}; + +#ifndef NDEBUG +#define winMemAssertMagic1() assert( win_mem_data.magic1==WINMEM_MAGIC1 ) +#define winMemAssertMagic2() assert( win_mem_data.magic2==WINMEM_MAGIC2 ) +#define winMemAssertMagic() winMemAssertMagic1(); winMemAssertMagic2(); +#else +#define winMemAssertMagic() +#endif + +#define winMemGetDataPtr() &win_mem_data +#define winMemGetHeap() win_mem_data.hHeap +#define winMemGetOwned() win_mem_data.bOwned + +static void *winMemMalloc(int nBytes); +static void winMemFree(void *pPrior); +static void *winMemRealloc(void *pPrior, int nBytes); +static int winMemSize(void *p); +static int winMemRoundup(int n); +static int winMemInit(void *pAppData); +static void winMemShutdown(void *pAppData); + +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void); +#endif /* SQLITE_WIN32_MALLOC */ + +/* +** The following variable is (normally) set once and never changes +** thereafter. It records whether the operating system is Win9x +** or WinNT. +** +** 0: Operating system unknown. +** 1: Operating system is Win9x. +** 2: Operating system is WinNT. +** +** In order to facilitate testing on a WinNT system, the test fixture +** can manually set this value to 1 to emulate Win98 behavior. +*/ +#ifdef SQLITE_TEST +SQLITE_API LONG SQLITE_WIN32_VOLATILE sqlite3_os_type = 0; +#else +static LONG SQLITE_WIN32_VOLATILE sqlite3_os_type = 0; +#endif + +#ifndef SYSCALL +# define SYSCALL sqlite3_syscall_ptr +#endif + +/* +** This function is not available on Windows CE or WinRT. + */ + +#if SQLITE_OS_WINCE || SQLITE_OS_WINRT +# define osAreFileApisANSI() 1 +#endif + +/* +** Many system calls are accessed through pointer-to-functions so that +** they may be overridden at runtime to facilitate fault injection during +** testing and sandboxing. The following array holds the names and pointers +** to all overrideable system calls. +*/ +static struct win_syscall { + const char *zName; /* Name of the system call */ + sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ + sqlite3_syscall_ptr pDefault; /* Default value */ +} aSyscall[] = { +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "AreFileApisANSI", (SYSCALL)AreFileApisANSI, 0 }, +#else + { "AreFileApisANSI", (SYSCALL)0, 0 }, +#endif + +#ifndef osAreFileApisANSI +#define osAreFileApisANSI ((BOOL(WINAPI*)(VOID))aSyscall[0].pCurrent) +#endif + +#if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) + { "CharLowerW", (SYSCALL)CharLowerW, 0 }, +#else + { "CharLowerW", (SYSCALL)0, 0 }, +#endif + +#define osCharLowerW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[1].pCurrent) + +#if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) + { "CharUpperW", (SYSCALL)CharUpperW, 0 }, +#else + { "CharUpperW", (SYSCALL)0, 0 }, +#endif + +#define osCharUpperW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[2].pCurrent) + + { "CloseHandle", (SYSCALL)CloseHandle, 0 }, + +#define osCloseHandle ((BOOL(WINAPI*)(HANDLE))aSyscall[3].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "CreateFileA", (SYSCALL)CreateFileA, 0 }, +#else + { "CreateFileA", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileA ((HANDLE(WINAPI*)(LPCSTR,DWORD,DWORD, \ + LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[4].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "CreateFileW", (SYSCALL)CreateFileW, 0 }, +#else + { "CreateFileW", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \ + LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_ANSI) && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) && \ + SQLITE_WIN32_CREATEFILEMAPPINGA + { "CreateFileMappingA", (SYSCALL)CreateFileMappingA, 0 }, +#else + { "CreateFileMappingA", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileMappingA ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ + DWORD,DWORD,DWORD,LPCSTR))aSyscall[6].pCurrent) + +#if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)) + { "CreateFileMappingW", (SYSCALL)CreateFileMappingW, 0 }, +#else + { "CreateFileMappingW", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileMappingW ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ + DWORD,DWORD,DWORD,LPCWSTR))aSyscall[7].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "CreateMutexW", (SYSCALL)CreateMutexW, 0 }, +#else + { "CreateMutexW", (SYSCALL)0, 0 }, +#endif + +#define osCreateMutexW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,BOOL, \ + LPCWSTR))aSyscall[8].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "DeleteFileA", (SYSCALL)DeleteFileA, 0 }, +#else + { "DeleteFileA", (SYSCALL)0, 0 }, +#endif + +#define osDeleteFileA ((BOOL(WINAPI*)(LPCSTR))aSyscall[9].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "DeleteFileW", (SYSCALL)DeleteFileW, 0 }, +#else + { "DeleteFileW", (SYSCALL)0, 0 }, +#endif + +#define osDeleteFileW ((BOOL(WINAPI*)(LPCWSTR))aSyscall[10].pCurrent) + +#if SQLITE_OS_WINCE + { "FileTimeToLocalFileTime", (SYSCALL)FileTimeToLocalFileTime, 0 }, +#else + { "FileTimeToLocalFileTime", (SYSCALL)0, 0 }, +#endif + +#define osFileTimeToLocalFileTime ((BOOL(WINAPI*)(CONST FILETIME*, \ + LPFILETIME))aSyscall[11].pCurrent) + +#if SQLITE_OS_WINCE + { "FileTimeToSystemTime", (SYSCALL)FileTimeToSystemTime, 0 }, +#else + { "FileTimeToSystemTime", (SYSCALL)0, 0 }, +#endif + +#define osFileTimeToSystemTime ((BOOL(WINAPI*)(CONST FILETIME*, \ + LPSYSTEMTIME))aSyscall[12].pCurrent) + + { "FlushFileBuffers", (SYSCALL)FlushFileBuffers, 0 }, + +#define osFlushFileBuffers ((BOOL(WINAPI*)(HANDLE))aSyscall[13].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "FormatMessageA", (SYSCALL)FormatMessageA, 0 }, +#else + { "FormatMessageA", (SYSCALL)0, 0 }, +#endif + +#define osFormatMessageA ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPSTR, \ + DWORD,va_list*))aSyscall[14].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "FormatMessageW", (SYSCALL)FormatMessageW, 0 }, +#else + { "FormatMessageW", (SYSCALL)0, 0 }, +#endif + +#define osFormatMessageW ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPWSTR, \ + DWORD,va_list*))aSyscall[15].pCurrent) + +#if !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "FreeLibrary", (SYSCALL)FreeLibrary, 0 }, +#else + { "FreeLibrary", (SYSCALL)0, 0 }, +#endif + +#define osFreeLibrary ((BOOL(WINAPI*)(HMODULE))aSyscall[16].pCurrent) + + { "GetCurrentProcessId", (SYSCALL)GetCurrentProcessId, 0 }, + +#define osGetCurrentProcessId ((DWORD(WINAPI*)(VOID))aSyscall[17].pCurrent) + +#if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI) + { "GetDiskFreeSpaceA", (SYSCALL)GetDiskFreeSpaceA, 0 }, +#else + { "GetDiskFreeSpaceA", (SYSCALL)0, 0 }, +#endif + +#define osGetDiskFreeSpaceA ((BOOL(WINAPI*)(LPCSTR,LPDWORD,LPDWORD,LPDWORD, \ + LPDWORD))aSyscall[18].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetDiskFreeSpaceW", (SYSCALL)GetDiskFreeSpaceW, 0 }, +#else + { "GetDiskFreeSpaceW", (SYSCALL)0, 0 }, +#endif + +#define osGetDiskFreeSpaceW ((BOOL(WINAPI*)(LPCWSTR,LPDWORD,LPDWORD,LPDWORD, \ + LPDWORD))aSyscall[19].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "GetFileAttributesA", (SYSCALL)GetFileAttributesA, 0 }, +#else + { "GetFileAttributesA", (SYSCALL)0, 0 }, +#endif + +#define osGetFileAttributesA ((DWORD(WINAPI*)(LPCSTR))aSyscall[20].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetFileAttributesW", (SYSCALL)GetFileAttributesW, 0 }, +#else + { "GetFileAttributesW", (SYSCALL)0, 0 }, +#endif + +#define osGetFileAttributesW ((DWORD(WINAPI*)(LPCWSTR))aSyscall[21].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "GetFileAttributesExW", (SYSCALL)GetFileAttributesExW, 0 }, +#else + { "GetFileAttributesExW", (SYSCALL)0, 0 }, +#endif + +#define osGetFileAttributesExW ((BOOL(WINAPI*)(LPCWSTR,GET_FILEEX_INFO_LEVELS, \ + LPVOID))aSyscall[22].pCurrent) + +#if !SQLITE_OS_WINRT + { "GetFileSize", (SYSCALL)GetFileSize, 0 }, +#else + { "GetFileSize", (SYSCALL)0, 0 }, +#endif + +#define osGetFileSize ((DWORD(WINAPI*)(HANDLE,LPDWORD))aSyscall[23].pCurrent) + +#if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI) + { "GetFullPathNameA", (SYSCALL)GetFullPathNameA, 0 }, +#else + { "GetFullPathNameA", (SYSCALL)0, 0 }, +#endif + +#define osGetFullPathNameA ((DWORD(WINAPI*)(LPCSTR,DWORD,LPSTR, \ + LPSTR*))aSyscall[24].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetFullPathNameW", (SYSCALL)GetFullPathNameW, 0 }, +#else + { "GetFullPathNameW", (SYSCALL)0, 0 }, +#endif + +#define osGetFullPathNameW ((DWORD(WINAPI*)(LPCWSTR,DWORD,LPWSTR, \ + LPWSTR*))aSyscall[25].pCurrent) + + { "GetLastError", (SYSCALL)GetLastError, 0 }, + +#define osGetLastError ((DWORD(WINAPI*)(VOID))aSyscall[26].pCurrent) + +#if !defined(SQLITE_OMIT_LOAD_EXTENSION) +#if SQLITE_OS_WINCE + /* The GetProcAddressA() routine is only available on Windows CE. */ + { "GetProcAddressA", (SYSCALL)GetProcAddressA, 0 }, +#else + /* All other Windows platforms expect GetProcAddress() to take + ** an ANSI string regardless of the _UNICODE setting */ + { "GetProcAddressA", (SYSCALL)GetProcAddress, 0 }, +#endif +#else + { "GetProcAddressA", (SYSCALL)0, 0 }, +#endif + +#define osGetProcAddressA ((FARPROC(WINAPI*)(HMODULE, \ + LPCSTR))aSyscall[27].pCurrent) + +#if !SQLITE_OS_WINRT + { "GetSystemInfo", (SYSCALL)GetSystemInfo, 0 }, +#else + { "GetSystemInfo", (SYSCALL)0, 0 }, +#endif + +#define osGetSystemInfo ((VOID(WINAPI*)(LPSYSTEM_INFO))aSyscall[28].pCurrent) + + { "GetSystemTime", (SYSCALL)GetSystemTime, 0 }, + +#define osGetSystemTime ((VOID(WINAPI*)(LPSYSTEMTIME))aSyscall[29].pCurrent) + +#if !SQLITE_OS_WINCE + { "GetSystemTimeAsFileTime", (SYSCALL)GetSystemTimeAsFileTime, 0 }, +#else + { "GetSystemTimeAsFileTime", (SYSCALL)0, 0 }, +#endif + +#define osGetSystemTimeAsFileTime ((VOID(WINAPI*)( \ + LPFILETIME))aSyscall[30].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "GetTempPathA", (SYSCALL)GetTempPathA, 0 }, +#else + { "GetTempPathA", (SYSCALL)0, 0 }, +#endif + +#define osGetTempPathA ((DWORD(WINAPI*)(DWORD,LPSTR))aSyscall[31].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetTempPathW", (SYSCALL)GetTempPathW, 0 }, +#else + { "GetTempPathW", (SYSCALL)0, 0 }, +#endif + +#define osGetTempPathW ((DWORD(WINAPI*)(DWORD,LPWSTR))aSyscall[32].pCurrent) + +#if !SQLITE_OS_WINRT + { "GetTickCount", (SYSCALL)GetTickCount, 0 }, +#else + { "GetTickCount", (SYSCALL)0, 0 }, +#endif + +#define osGetTickCount ((DWORD(WINAPI*)(VOID))aSyscall[33].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_GETVERSIONEX + { "GetVersionExA", (SYSCALL)GetVersionExA, 0 }, +#else + { "GetVersionExA", (SYSCALL)0, 0 }, +#endif + +#define osGetVersionExA ((BOOL(WINAPI*)( \ + LPOSVERSIONINFOA))aSyscall[34].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ + SQLITE_WIN32_GETVERSIONEX + { "GetVersionExW", (SYSCALL)GetVersionExW, 0 }, +#else + { "GetVersionExW", (SYSCALL)0, 0 }, +#endif + +#define osGetVersionExW ((BOOL(WINAPI*)( \ + LPOSVERSIONINFOW))aSyscall[35].pCurrent) + + { "HeapAlloc", (SYSCALL)HeapAlloc, 0 }, + +#define osHeapAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD, \ + SIZE_T))aSyscall[36].pCurrent) + +#if !SQLITE_OS_WINRT + { "HeapCreate", (SYSCALL)HeapCreate, 0 }, +#else + { "HeapCreate", (SYSCALL)0, 0 }, +#endif + +#define osHeapCreate ((HANDLE(WINAPI*)(DWORD,SIZE_T, \ + SIZE_T))aSyscall[37].pCurrent) + +#if !SQLITE_OS_WINRT + { "HeapDestroy", (SYSCALL)HeapDestroy, 0 }, +#else + { "HeapDestroy", (SYSCALL)0, 0 }, +#endif + +#define osHeapDestroy ((BOOL(WINAPI*)(HANDLE))aSyscall[38].pCurrent) + + { "HeapFree", (SYSCALL)HeapFree, 0 }, + +#define osHeapFree ((BOOL(WINAPI*)(HANDLE,DWORD,LPVOID))aSyscall[39].pCurrent) + + { "HeapReAlloc", (SYSCALL)HeapReAlloc, 0 }, + +#define osHeapReAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD,LPVOID, \ + SIZE_T))aSyscall[40].pCurrent) + + { "HeapSize", (SYSCALL)HeapSize, 0 }, + +#define osHeapSize ((SIZE_T(WINAPI*)(HANDLE,DWORD, \ + LPCVOID))aSyscall[41].pCurrent) + +#if !SQLITE_OS_WINRT + { "HeapValidate", (SYSCALL)HeapValidate, 0 }, +#else + { "HeapValidate", (SYSCALL)0, 0 }, +#endif + +#define osHeapValidate ((BOOL(WINAPI*)(HANDLE,DWORD, \ + LPCVOID))aSyscall[42].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "HeapCompact", (SYSCALL)HeapCompact, 0 }, +#else + { "HeapCompact", (SYSCALL)0, 0 }, +#endif + +#define osHeapCompact ((UINT(WINAPI*)(HANDLE,DWORD))aSyscall[43].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "LoadLibraryA", (SYSCALL)LoadLibraryA, 0 }, +#else + { "LoadLibraryA", (SYSCALL)0, 0 }, +#endif + +#define osLoadLibraryA ((HMODULE(WINAPI*)(LPCSTR))aSyscall[44].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ + !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "LoadLibraryW", (SYSCALL)LoadLibraryW, 0 }, +#else + { "LoadLibraryW", (SYSCALL)0, 0 }, +#endif + +#define osLoadLibraryW ((HMODULE(WINAPI*)(LPCWSTR))aSyscall[45].pCurrent) + +#if !SQLITE_OS_WINRT + { "LocalFree", (SYSCALL)LocalFree, 0 }, +#else + { "LocalFree", (SYSCALL)0, 0 }, +#endif + +#define osLocalFree ((HLOCAL(WINAPI*)(HLOCAL))aSyscall[46].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "LockFile", (SYSCALL)LockFile, 0 }, +#else + { "LockFile", (SYSCALL)0, 0 }, +#endif + +#ifndef osLockFile +#define osLockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + DWORD))aSyscall[47].pCurrent) +#endif + +#if !SQLITE_OS_WINCE + { "LockFileEx", (SYSCALL)LockFileEx, 0 }, +#else + { "LockFileEx", (SYSCALL)0, 0 }, +#endif + +#ifndef osLockFileEx +#define osLockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD,DWORD, \ + LPOVERLAPPED))aSyscall[48].pCurrent) +#endif + +#if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)) + { "MapViewOfFile", (SYSCALL)MapViewOfFile, 0 }, +#else + { "MapViewOfFile", (SYSCALL)0, 0 }, +#endif + +#define osMapViewOfFile ((LPVOID(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + SIZE_T))aSyscall[49].pCurrent) + + { "MultiByteToWideChar", (SYSCALL)MultiByteToWideChar, 0 }, + +#define osMultiByteToWideChar ((int(WINAPI*)(UINT,DWORD,LPCSTR,int,LPWSTR, \ + int))aSyscall[50].pCurrent) + + { "QueryPerformanceCounter", (SYSCALL)QueryPerformanceCounter, 0 }, + +#define osQueryPerformanceCounter ((BOOL(WINAPI*)( \ + LARGE_INTEGER*))aSyscall[51].pCurrent) + + { "ReadFile", (SYSCALL)ReadFile, 0 }, + +#define osReadFile ((BOOL(WINAPI*)(HANDLE,LPVOID,DWORD,LPDWORD, \ + LPOVERLAPPED))aSyscall[52].pCurrent) + + { "SetEndOfFile", (SYSCALL)SetEndOfFile, 0 }, + +#define osSetEndOfFile ((BOOL(WINAPI*)(HANDLE))aSyscall[53].pCurrent) + +#if !SQLITE_OS_WINRT + { "SetFilePointer", (SYSCALL)SetFilePointer, 0 }, +#else + { "SetFilePointer", (SYSCALL)0, 0 }, +#endif + +#define osSetFilePointer ((DWORD(WINAPI*)(HANDLE,LONG,PLONG, \ + DWORD))aSyscall[54].pCurrent) + +#if !SQLITE_OS_WINRT + { "Sleep", (SYSCALL)Sleep, 0 }, +#else + { "Sleep", (SYSCALL)0, 0 }, +#endif + +#define osSleep ((VOID(WINAPI*)(DWORD))aSyscall[55].pCurrent) + + { "SystemTimeToFileTime", (SYSCALL)SystemTimeToFileTime, 0 }, + +#define osSystemTimeToFileTime ((BOOL(WINAPI*)(CONST SYSTEMTIME*, \ + LPFILETIME))aSyscall[56].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "UnlockFile", (SYSCALL)UnlockFile, 0 }, +#else + { "UnlockFile", (SYSCALL)0, 0 }, +#endif + +#ifndef osUnlockFile +#define osUnlockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + DWORD))aSyscall[57].pCurrent) +#endif + +#if !SQLITE_OS_WINCE + { "UnlockFileEx", (SYSCALL)UnlockFileEx, 0 }, +#else + { "UnlockFileEx", (SYSCALL)0, 0 }, +#endif + +#define osUnlockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + LPOVERLAPPED))aSyscall[58].pCurrent) + +#if SQLITE_OS_WINCE || !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "UnmapViewOfFile", (SYSCALL)UnmapViewOfFile, 0 }, +#else + { "UnmapViewOfFile", (SYSCALL)0, 0 }, +#endif + +#define osUnmapViewOfFile ((BOOL(WINAPI*)(LPCVOID))aSyscall[59].pCurrent) + + { "WideCharToMultiByte", (SYSCALL)WideCharToMultiByte, 0 }, + +#define osWideCharToMultiByte ((int(WINAPI*)(UINT,DWORD,LPCWSTR,int,LPSTR,int, \ + LPCSTR,LPBOOL))aSyscall[60].pCurrent) + + { "WriteFile", (SYSCALL)WriteFile, 0 }, + +#define osWriteFile ((BOOL(WINAPI*)(HANDLE,LPCVOID,DWORD,LPDWORD, \ + LPOVERLAPPED))aSyscall[61].pCurrent) + +#if SQLITE_OS_WINRT + { "CreateEventExW", (SYSCALL)CreateEventExW, 0 }, +#else + { "CreateEventExW", (SYSCALL)0, 0 }, +#endif + +#define osCreateEventExW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,LPCWSTR, \ + DWORD,DWORD))aSyscall[62].pCurrent) + +#if !SQLITE_OS_WINRT + { "WaitForSingleObject", (SYSCALL)WaitForSingleObject, 0 }, +#else + { "WaitForSingleObject", (SYSCALL)0, 0 }, +#endif + +#define osWaitForSingleObject ((DWORD(WINAPI*)(HANDLE, \ + DWORD))aSyscall[63].pCurrent) + +#if !SQLITE_OS_WINCE + { "WaitForSingleObjectEx", (SYSCALL)WaitForSingleObjectEx, 0 }, +#else + { "WaitForSingleObjectEx", (SYSCALL)0, 0 }, +#endif + +#define osWaitForSingleObjectEx ((DWORD(WINAPI*)(HANDLE,DWORD, \ + BOOL))aSyscall[64].pCurrent) + +#if SQLITE_OS_WINRT + { "SetFilePointerEx", (SYSCALL)SetFilePointerEx, 0 }, +#else + { "SetFilePointerEx", (SYSCALL)0, 0 }, +#endif + +#define osSetFilePointerEx ((BOOL(WINAPI*)(HANDLE,LARGE_INTEGER, \ + PLARGE_INTEGER,DWORD))aSyscall[65].pCurrent) + +#if SQLITE_OS_WINRT + { "GetFileInformationByHandleEx", (SYSCALL)GetFileInformationByHandleEx, 0 }, +#else + { "GetFileInformationByHandleEx", (SYSCALL)0, 0 }, +#endif + +#define osGetFileInformationByHandleEx ((BOOL(WINAPI*)(HANDLE, \ + FILE_INFO_BY_HANDLE_CLASS,LPVOID,DWORD))aSyscall[66].pCurrent) + +#if SQLITE_OS_WINRT && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) + { "MapViewOfFileFromApp", (SYSCALL)MapViewOfFileFromApp, 0 }, +#else + { "MapViewOfFileFromApp", (SYSCALL)0, 0 }, +#endif + +#define osMapViewOfFileFromApp ((LPVOID(WINAPI*)(HANDLE,ULONG,ULONG64, \ + SIZE_T))aSyscall[67].pCurrent) + +#if SQLITE_OS_WINRT + { "CreateFile2", (SYSCALL)CreateFile2, 0 }, +#else + { "CreateFile2", (SYSCALL)0, 0 }, +#endif + +#define osCreateFile2 ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD,DWORD, \ + LPCREATEFILE2_EXTENDED_PARAMETERS))aSyscall[68].pCurrent) + +#if SQLITE_OS_WINRT && !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "LoadPackagedLibrary", (SYSCALL)LoadPackagedLibrary, 0 }, +#else + { "LoadPackagedLibrary", (SYSCALL)0, 0 }, +#endif + +#define osLoadPackagedLibrary ((HMODULE(WINAPI*)(LPCWSTR, \ + DWORD))aSyscall[69].pCurrent) + +#if SQLITE_OS_WINRT + { "GetTickCount64", (SYSCALL)GetTickCount64, 0 }, +#else + { "GetTickCount64", (SYSCALL)0, 0 }, +#endif + +#define osGetTickCount64 ((ULONGLONG(WINAPI*)(VOID))aSyscall[70].pCurrent) + +#if SQLITE_OS_WINRT + { "GetNativeSystemInfo", (SYSCALL)GetNativeSystemInfo, 0 }, +#else + { "GetNativeSystemInfo", (SYSCALL)0, 0 }, +#endif + +#define osGetNativeSystemInfo ((VOID(WINAPI*)( \ + LPSYSTEM_INFO))aSyscall[71].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "OutputDebugStringA", (SYSCALL)OutputDebugStringA, 0 }, +#else + { "OutputDebugStringA", (SYSCALL)0, 0 }, +#endif + +#define osOutputDebugStringA ((VOID(WINAPI*)(LPCSTR))aSyscall[72].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "OutputDebugStringW", (SYSCALL)OutputDebugStringW, 0 }, +#else + { "OutputDebugStringW", (SYSCALL)0, 0 }, +#endif + +#define osOutputDebugStringW ((VOID(WINAPI*)(LPCWSTR))aSyscall[73].pCurrent) + + { "GetProcessHeap", (SYSCALL)GetProcessHeap, 0 }, + +#define osGetProcessHeap ((HANDLE(WINAPI*)(VOID))aSyscall[74].pCurrent) + +#if SQLITE_OS_WINRT && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) + { "CreateFileMappingFromApp", (SYSCALL)CreateFileMappingFromApp, 0 }, +#else + { "CreateFileMappingFromApp", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \ + LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[75].pCurrent) + +/* +** NOTE: On some sub-platforms, the InterlockedCompareExchange "function" +** is really just a macro that uses a compiler intrinsic (e.g. x64). +** So do not try to make this is into a redefinable interface. +*/ +#if defined(InterlockedCompareExchange) + { "InterlockedCompareExchange", (SYSCALL)0, 0 }, + +#define osInterlockedCompareExchange InterlockedCompareExchange +#else + { "InterlockedCompareExchange", (SYSCALL)InterlockedCompareExchange, 0 }, + +#define osInterlockedCompareExchange ((LONG(WINAPI*)(LONG \ + SQLITE_WIN32_VOLATILE*, LONG,LONG))aSyscall[76].pCurrent) +#endif /* defined(InterlockedCompareExchange) */ + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { "UuidCreate", (SYSCALL)UuidCreate, 0 }, +#else + { "UuidCreate", (SYSCALL)0, 0 }, +#endif + +#define osUuidCreate ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[77].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { "UuidCreateSequential", (SYSCALL)UuidCreateSequential, 0 }, +#else + { "UuidCreateSequential", (SYSCALL)0, 0 }, +#endif + +#define osUuidCreateSequential \ + ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[78].pCurrent) + +#if !defined(SQLITE_NO_SYNC) && SQLITE_MAX_MMAP_SIZE>0 + { "FlushViewOfFile", (SYSCALL)FlushViewOfFile, 0 }, +#else + { "FlushViewOfFile", (SYSCALL)0, 0 }, +#endif + +#define osFlushViewOfFile \ + ((BOOL(WINAPI*)(LPCVOID,SIZE_T))aSyscall[79].pCurrent) + +}; /* End of the overrideable system calls */ + +/* +** This is the xSetSystemCall() method of sqlite3_vfs for all of the +** "win32" VFSes. Return SQLITE_OK opon successfully updating the +** system call pointer, or SQLITE_NOTFOUND if there is no configurable +** system call named zName. +*/ +static int winSetSystemCall( + sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */ + const char *zName, /* Name of system call to override */ + sqlite3_syscall_ptr pNewFunc /* Pointer to new system call value */ +){ + unsigned int i; + int rc = SQLITE_NOTFOUND; + + UNUSED_PARAMETER(pNotUsed); + if( zName==0 ){ + /* If no zName is given, restore all system calls to their default + ** settings and return NULL + */ + rc = SQLITE_OK; + for(i=0; i0 ){ + memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); + memcpy(zDbgBuf, zBuf, nMin); + osOutputDebugStringA(zDbgBuf); + }else{ + osOutputDebugStringA(zBuf); + } +#elif defined(SQLITE_WIN32_HAS_WIDE) + memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); + if ( osMultiByteToWideChar( + osAreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, zBuf, + nMin, (LPWSTR)zDbgBuf, SQLITE_WIN32_DBG_BUF_SIZE/sizeof(WCHAR))<=0 ){ + return; + } + osOutputDebugStringW((LPCWSTR)zDbgBuf); +#else + if( nMin>0 ){ + memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); + memcpy(zDbgBuf, zBuf, nMin); + fprintf(stderr, "%s", zDbgBuf); + }else{ + fprintf(stderr, "%s", zBuf); + } +#endif +} + +/* +** The following routine suspends the current thread for at least ms +** milliseconds. This is equivalent to the Win32 Sleep() interface. +*/ +#if SQLITE_OS_WINRT +static HANDLE sleepObj = NULL; +#endif + +SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds){ +#if SQLITE_OS_WINRT + if ( sleepObj==NULL ){ + sleepObj = osCreateEventExW(NULL, NULL, CREATE_EVENT_MANUAL_RESET, + SYNCHRONIZE); + } + assert( sleepObj!=NULL ); + osWaitForSingleObjectEx(sleepObj, milliseconds, FALSE); +#else + osSleep(milliseconds); +#endif +} + +#if SQLITE_MAX_WORKER_THREADS>0 && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && \ + SQLITE_THREADSAFE>0 +SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject){ + DWORD rc; + while( (rc = osWaitForSingleObjectEx(hObject, INFINITE, + TRUE))==WAIT_IO_COMPLETION ){} + return rc; +} +#endif + +/* +** Return true (non-zero) if we are running under WinNT, Win2K, WinXP, +** or WinCE. Return false (zero) for Win95, Win98, or WinME. +** +** Here is an interesting observation: Win95, Win98, and WinME lack +** the LockFileEx() API. But we can still statically link against that +** API as long as we don't call it when running Win95/98/ME. A call to +** this routine is used to determine if the host is Win95/98/ME or +** WinNT/2K/XP so that we will know whether or not we can safely call +** the LockFileEx() API. +*/ + +#if !SQLITE_WIN32_GETVERSIONEX +# define osIsNT() (1) +#elif SQLITE_OS_WINCE || SQLITE_OS_WINRT || !defined(SQLITE_WIN32_HAS_ANSI) +# define osIsNT() (1) +#elif !defined(SQLITE_WIN32_HAS_WIDE) +# define osIsNT() (0) +#else +# define osIsNT() ((sqlite3_os_type==2) || sqlite3_win32_is_nt()) +#endif + +/* +** This function determines if the machine is running a version of Windows +** based on the NT kernel. +*/ +SQLITE_API int sqlite3_win32_is_nt(void){ +#if SQLITE_OS_WINRT + /* + ** NOTE: The WinRT sub-platform is always assumed to be based on the NT + ** kernel. + */ + return 1; +#elif SQLITE_WIN32_GETVERSIONEX + if( osInterlockedCompareExchange(&sqlite3_os_type, 0, 0)==0 ){ +#if defined(SQLITE_WIN32_HAS_ANSI) + OSVERSIONINFOA sInfo; + sInfo.dwOSVersionInfoSize = sizeof(sInfo); + osGetVersionExA(&sInfo); + osInterlockedCompareExchange(&sqlite3_os_type, + (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1, 0); +#elif defined(SQLITE_WIN32_HAS_WIDE) + OSVERSIONINFOW sInfo; + sInfo.dwOSVersionInfoSize = sizeof(sInfo); + osGetVersionExW(&sInfo); + osInterlockedCompareExchange(&sqlite3_os_type, + (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1, 0); +#endif + } + return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2)==2; +#elif SQLITE_TEST + return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2)==2; +#else + /* + ** NOTE: All sub-platforms where the GetVersionEx[AW] functions are + ** deprecated are always assumed to be based on the NT kernel. + */ + return 1; +#endif +} + +#ifdef SQLITE_WIN32_MALLOC +/* +** Allocate nBytes of memory. +*/ +static void *winMemMalloc(int nBytes){ + HANDLE hHeap; + void *p; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); +#endif + assert( nBytes>=0 ); + p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); + if( !p ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapAlloc %u bytes (%lu), heap=%p", + nBytes, osGetLastError(), (void*)hHeap); + } + return p; +} + +/* +** Free memory. +*/ +static void winMemFree(void *pPrior){ + HANDLE hHeap; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ); +#endif + if( !pPrior ) return; /* Passing NULL to HeapFree is undefined. */ + if( !osHeapFree(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapFree block %p (%lu), heap=%p", + pPrior, osGetLastError(), (void*)hHeap); + } +} + +/* +** Change the size of an existing memory allocation +*/ +static void *winMemRealloc(void *pPrior, int nBytes){ + HANDLE hHeap; + void *p; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ); +#endif + assert( nBytes>=0 ); + if( !pPrior ){ + p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); + }else{ + p = osHeapReAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior, (SIZE_T)nBytes); + } + if( !p ){ + sqlite3_log(SQLITE_NOMEM, "failed to %s %u bytes (%lu), heap=%p", + pPrior ? "HeapReAlloc" : "HeapAlloc", nBytes, osGetLastError(), + (void*)hHeap); + } + return p; +} + +/* +** Return the size of an outstanding allocation, in bytes. +*/ +static int winMemSize(void *p){ + HANDLE hHeap; + SIZE_T n; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, p) ); +#endif + if( !p ) return 0; + n = osHeapSize(hHeap, SQLITE_WIN32_HEAP_FLAGS, p); + if( n==(SIZE_T)-1 ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapSize block %p (%lu), heap=%p", + p, osGetLastError(), (void*)hHeap); + return 0; + } + return (int)n; +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int winMemRoundup(int n){ + return n; +} + +/* +** Initialize this module. +*/ +static int winMemInit(void *pAppData){ + winMemData *pWinMemData = (winMemData *)pAppData; + + if( !pWinMemData ) return SQLITE_ERROR; + assert( pWinMemData->magic1==WINMEM_MAGIC1 ); + assert( pWinMemData->magic2==WINMEM_MAGIC2 ); + +#if !SQLITE_OS_WINRT && SQLITE_WIN32_HEAP_CREATE + if( !pWinMemData->hHeap ){ + DWORD dwInitialSize = SQLITE_WIN32_HEAP_INIT_SIZE; + DWORD dwMaximumSize = (DWORD)sqlite3GlobalConfig.nHeap; + if( dwMaximumSize==0 ){ + dwMaximumSize = SQLITE_WIN32_HEAP_MAX_SIZE; + }else if( dwInitialSize>dwMaximumSize ){ + dwInitialSize = dwMaximumSize; + } + pWinMemData->hHeap = osHeapCreate(SQLITE_WIN32_HEAP_FLAGS, + dwInitialSize, dwMaximumSize); + if( !pWinMemData->hHeap ){ + sqlite3_log(SQLITE_NOMEM, + "failed to HeapCreate (%lu), flags=%u, initSize=%lu, maxSize=%lu", + osGetLastError(), SQLITE_WIN32_HEAP_FLAGS, dwInitialSize, + dwMaximumSize); + return SQLITE_NOMEM_BKPT; + } + pWinMemData->bOwned = TRUE; + assert( pWinMemData->bOwned ); + } +#else + pWinMemData->hHeap = osGetProcessHeap(); + if( !pWinMemData->hHeap ){ + sqlite3_log(SQLITE_NOMEM, + "failed to GetProcessHeap (%lu)", osGetLastError()); + return SQLITE_NOMEM_BKPT; + } + pWinMemData->bOwned = FALSE; + assert( !pWinMemData->bOwned ); +#endif + assert( pWinMemData->hHeap!=0 ); + assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); +#endif + return SQLITE_OK; +} + +/* +** Deinitialize this module. +*/ +static void winMemShutdown(void *pAppData){ + winMemData *pWinMemData = (winMemData *)pAppData; + + if( !pWinMemData ) return; + assert( pWinMemData->magic1==WINMEM_MAGIC1 ); + assert( pWinMemData->magic2==WINMEM_MAGIC2 ); + + if( pWinMemData->hHeap ){ + assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); +#endif + if( pWinMemData->bOwned ){ + if( !osHeapDestroy(pWinMemData->hHeap) ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapDestroy (%lu), heap=%p", + osGetLastError(), (void*)pWinMemData->hHeap); + } + pWinMemData->bOwned = FALSE; + } + pWinMemData->hHeap = NULL; + } +} + +/* +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. The +** arguments specify the block of memory to manage. +** +** This routine is only called by sqlite3_config(), and therefore +** is not required to be threadsafe (it is not). +*/ +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void){ + static const sqlite3_mem_methods winMemMethods = { + winMemMalloc, + winMemFree, + winMemRealloc, + winMemSize, + winMemRoundup, + winMemInit, + winMemShutdown, + &win_mem_data + }; + return &winMemMethods; +} + +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetWin32()); +} +#endif /* SQLITE_WIN32_MALLOC */ + +/* +** Convert a UTF-8 string to Microsoft Unicode. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static LPWSTR winUtf8ToUnicode(const char *zText){ + int nChar; + LPWSTR zWideText; + + nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, NULL, 0); + if( nChar==0 ){ + return 0; + } + zWideText = sqlite3MallocZero( nChar*sizeof(WCHAR) ); + if( zWideText==0 ){ + return 0; + } + nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, zWideText, + nChar); + if( nChar==0 ){ + sqlite3_free(zWideText); + zWideText = 0; + } + return zWideText; +} + +/* +** Convert a Microsoft Unicode string to UTF-8. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winUnicodeToUtf8(LPCWSTR zWideText){ + int nByte; + char *zText; + + nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, 0, 0, 0, 0); + if( nByte == 0 ){ + return 0; + } + zText = sqlite3MallocZero( nByte ); + if( zText==0 ){ + return 0; + } + nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, zText, nByte, + 0, 0); + if( nByte == 0 ){ + sqlite3_free(zText); + zText = 0; + } + return zText; +} + +/* +** Convert an ANSI string to Microsoft Unicode, using the ANSI or OEM +** code page. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static LPWSTR winMbcsToUnicode(const char *zText, int useAnsi){ + int nByte; + LPWSTR zMbcsText; + int codepage = useAnsi ? CP_ACP : CP_OEMCP; + + nByte = osMultiByteToWideChar(codepage, 0, zText, -1, NULL, + 0)*sizeof(WCHAR); + if( nByte==0 ){ + return 0; + } + zMbcsText = sqlite3MallocZero( nByte*sizeof(WCHAR) ); + if( zMbcsText==0 ){ + return 0; + } + nByte = osMultiByteToWideChar(codepage, 0, zText, -1, zMbcsText, + nByte); + if( nByte==0 ){ + sqlite3_free(zMbcsText); + zMbcsText = 0; + } + return zMbcsText; +} + +/* +** Convert a Microsoft Unicode string to a multi-byte character string, +** using the ANSI or OEM code page. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winUnicodeToMbcs(LPCWSTR zWideText, int useAnsi){ + int nByte; + char *zText; + int codepage = useAnsi ? CP_ACP : CP_OEMCP; + + nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, 0, 0, 0, 0); + if( nByte == 0 ){ + return 0; + } + zText = sqlite3MallocZero( nByte ); + if( zText==0 ){ + return 0; + } + nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, zText, + nByte, 0, 0); + if( nByte == 0 ){ + sqlite3_free(zText); + zText = 0; + } + return zText; +} + +/* +** Convert a multi-byte character string to UTF-8. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winMbcsToUtf8(const char *zText, int useAnsi){ + char *zTextUtf8; + LPWSTR zTmpWide; + + zTmpWide = winMbcsToUnicode(zText, useAnsi); + if( zTmpWide==0 ){ + return 0; + } + zTextUtf8 = winUnicodeToUtf8(zTmpWide); + sqlite3_free(zTmpWide); + return zTextUtf8; +} + +/* +** Convert a UTF-8 string to a multi-byte character string. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winUtf8ToMbcs(const char *zText, int useAnsi){ + char *zTextMbcs; + LPWSTR zTmpWide; + + zTmpWide = winUtf8ToUnicode(zText); + if( zTmpWide==0 ){ + return 0; + } + zTextMbcs = winUnicodeToMbcs(zTmpWide, useAnsi); + sqlite3_free(zTmpWide); + return zTextMbcs; +} + +/* +** This is a public wrapper for the winUtf8ToUnicode() function. +*/ +SQLITE_API LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToUnicode(zText); +} + +/* +** This is a public wrapper for the winUnicodeToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_unicode_to_utf8(LPCWSTR zWideText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zWideText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUnicodeToUtf8(zWideText); +} + +/* +** This is a public wrapper for the winMbcsToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winMbcsToUtf8(zText, osAreFileApisANSI()); +} + +/* +** This is a public wrapper for the winMbcsToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_mbcs_to_utf8_v2(const char *zText, int useAnsi){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winMbcsToUtf8(zText, useAnsi); +} + +/* +** This is a public wrapper for the winUtf8ToMbcs() function. +*/ +SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToMbcs(zText, osAreFileApisANSI()); +} + +/* +** This is a public wrapper for the winUtf8ToMbcs() function. +*/ +SQLITE_API char *sqlite3_win32_utf8_to_mbcs_v2(const char *zText, int useAnsi){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToMbcs(zText, useAnsi); +} + +/* +** This function is the same as sqlite3_win32_set_directory (below); however, +** it accepts a UTF-8 string. +*/ +SQLITE_API int sqlite3_win32_set_directory8( + unsigned long type, /* Identifier for directory being set or reset */ + const char *zValue /* New value for directory being set or reset */ +){ + char **ppDirectory = 0; +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){ + ppDirectory = &sqlite3_data_directory; + }else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){ + ppDirectory = &sqlite3_temp_directory; + } + assert( !ppDirectory || type==SQLITE_WIN32_DATA_DIRECTORY_TYPE + || type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE + ); + assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) ); + if( ppDirectory ){ + char *zCopy = 0; + if( zValue && zValue[0] ){ + zCopy = sqlite3_mprintf("%s", zValue); + if ( zCopy==0 ){ + return SQLITE_NOMEM_BKPT; + } + } + sqlite3_free(*ppDirectory); + *ppDirectory = zCopy; + return SQLITE_OK; + } + return SQLITE_ERROR; +} + +/* +** This function is the same as sqlite3_win32_set_directory (below); however, +** it accepts a UTF-16 string. +*/ +SQLITE_API int sqlite3_win32_set_directory16( + unsigned long type, /* Identifier for directory being set or reset */ + const void *zValue /* New value for directory being set or reset */ +){ + int rc; + char *zUtf8 = 0; + if( zValue ){ + zUtf8 = sqlite3_win32_unicode_to_utf8(zValue); + if( zUtf8==0 ) return SQLITE_NOMEM_BKPT; + } + rc = sqlite3_win32_set_directory8(type, zUtf8); + if( zUtf8 ) sqlite3_free(zUtf8); + return rc; +} + +/* +** This function sets the data directory or the temporary directory based on +** the provided arguments. The type argument must be 1 in order to set the +** data directory or 2 in order to set the temporary directory. The zValue +** argument is the name of the directory to use. The return value will be +** SQLITE_OK if successful. +*/ +SQLITE_API int sqlite3_win32_set_directory( + unsigned long type, /* Identifier for directory being set or reset */ + void *zValue /* New value for directory being set or reset */ +){ + return sqlite3_win32_set_directory16(type, zValue); +} + +/* +** The return value of winGetLastErrorMsg +** is zero if the error message fits in the buffer, or non-zero +** otherwise (if the message was truncated). +*/ +static int winGetLastErrorMsg(DWORD lastErrno, int nBuf, char *zBuf){ + /* FormatMessage returns 0 on failure. Otherwise it + ** returns the number of TCHARs written to the output + ** buffer, excluding the terminating null char. + */ + DWORD dwLen = 0; + char *zOut = 0; + + if( osIsNT() ){ +#if SQLITE_OS_WINRT + WCHAR zTempWide[SQLITE_WIN32_MAX_ERRMSG_CHARS+1]; + dwLen = osFormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + lastErrno, + 0, + zTempWide, + SQLITE_WIN32_MAX_ERRMSG_CHARS, + 0); +#else + LPWSTR zTempWide = NULL; + dwLen = osFormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + lastErrno, + 0, + (LPWSTR) &zTempWide, + 0, + 0); +#endif + if( dwLen > 0 ){ + /* allocate a buffer and convert to UTF8 */ + sqlite3BeginBenignMalloc(); + zOut = winUnicodeToUtf8(zTempWide); + sqlite3EndBenignMalloc(); +#if !SQLITE_OS_WINRT + /* free the system buffer allocated by FormatMessage */ + osLocalFree(zTempWide); +#endif + } + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + char *zTemp = NULL; + dwLen = osFormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + lastErrno, + 0, + (LPSTR) &zTemp, + 0, + 0); + if( dwLen > 0 ){ + /* allocate a buffer and convert to UTF8 */ + sqlite3BeginBenignMalloc(); + zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI()); + sqlite3EndBenignMalloc(); + /* free the system buffer allocated by FormatMessage */ + osLocalFree(zTemp); + } + } +#endif + if( 0 == dwLen ){ + sqlite3_snprintf(nBuf, zBuf, "OsError 0x%lx (%lu)", lastErrno, lastErrno); + }else{ + /* copy a maximum of nBuf chars to output buffer */ + sqlite3_snprintf(nBuf, zBuf, "%s", zOut); + /* free the UTF8 buffer */ + sqlite3_free(zOut); + } + return 0; +} + +/* +** +** This function - winLogErrorAtLine() - is only ever called via the macro +** winLogError(). +** +** This routine is invoked after an error occurs in an OS function. +** It logs a message using sqlite3_log() containing the current value of +** error code and, if possible, the human-readable equivalent from +** FormatMessage. +** +** The first argument passed to the macro should be the error code that +** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN). +** The two subsequent arguments should be the name of the OS function that +** failed and the associated file-system path, if any. +*/ +#define winLogError(a,b,c,d) winLogErrorAtLine(a,b,c,d,__LINE__) +static int winLogErrorAtLine( + int errcode, /* SQLite error code */ + DWORD lastErrno, /* Win32 last error */ + const char *zFunc, /* Name of OS function that failed */ + const char *zPath, /* File path associated with error */ + int iLine /* Source line number where error occurred */ +){ + char zMsg[500]; /* Human readable error text */ + int i; /* Loop counter */ + + zMsg[0] = 0; + winGetLastErrorMsg(lastErrno, sizeof(zMsg), zMsg); + assert( errcode!=SQLITE_OK ); + if( zPath==0 ) zPath = ""; + for(i=0; zMsg[i] && zMsg[i]!='\r' && zMsg[i]!='\n'; i++){} + zMsg[i] = 0; + sqlite3_log(errcode, + "os_win.c:%d: (%lu) %s(%s) - %s", + iLine, lastErrno, zFunc, zPath, zMsg + ); + + return errcode; +} + +/* +** The number of times that a ReadFile(), WriteFile(), and DeleteFile() +** will be retried following a locking error - probably caused by +** antivirus software. Also the initial delay before the first retry. +** The delay increases linearly with each retry. +*/ +#ifndef SQLITE_WIN32_IOERR_RETRY +# define SQLITE_WIN32_IOERR_RETRY 10 +#endif +#ifndef SQLITE_WIN32_IOERR_RETRY_DELAY +# define SQLITE_WIN32_IOERR_RETRY_DELAY 25 +#endif +static int winIoerrRetry = SQLITE_WIN32_IOERR_RETRY; +static int winIoerrRetryDelay = SQLITE_WIN32_IOERR_RETRY_DELAY; + +/* +** The "winIoerrCanRetry1" macro is used to determine if a particular I/O +** error code obtained via GetLastError() is eligible to be retried. It +** must accept the error code DWORD as its only argument and should return +** non-zero if the error code is transient in nature and the operation +** responsible for generating the original error might succeed upon being +** retried. The argument to this macro should be a variable. +** +** Additionally, a macro named "winIoerrCanRetry2" may be defined. If it +** is defined, it will be consulted only when the macro "winIoerrCanRetry1" +** returns zero. The "winIoerrCanRetry2" macro is completely optional and +** may be used to include additional error codes in the set that should +** result in the failing I/O operation being retried by the caller. If +** defined, the "winIoerrCanRetry2" macro must exhibit external semantics +** identical to those of the "winIoerrCanRetry1" macro. +*/ +#if !defined(winIoerrCanRetry1) +#define winIoerrCanRetry1(a) (((a)==ERROR_ACCESS_DENIED) || \ + ((a)==ERROR_SHARING_VIOLATION) || \ + ((a)==ERROR_LOCK_VIOLATION) || \ + ((a)==ERROR_DEV_NOT_EXIST) || \ + ((a)==ERROR_NETNAME_DELETED) || \ + ((a)==ERROR_SEM_TIMEOUT) || \ + ((a)==ERROR_NETWORK_UNREACHABLE)) +#endif + +/* +** If a ReadFile() or WriteFile() error occurs, invoke this routine +** to see if it should be retried. Return TRUE to retry. Return FALSE +** to give up with an error. +*/ +static int winRetryIoerr(int *pnRetry, DWORD *pError){ + DWORD e = osGetLastError(); + if( *pnRetry>=winIoerrRetry ){ + if( pError ){ + *pError = e; + } + return 0; + } + if( winIoerrCanRetry1(e) ){ + sqlite3_win32_sleep(winIoerrRetryDelay*(1+*pnRetry)); + ++*pnRetry; + return 1; + } +#if defined(winIoerrCanRetry2) + else if( winIoerrCanRetry2(e) ){ + sqlite3_win32_sleep(winIoerrRetryDelay*(1+*pnRetry)); + ++*pnRetry; + return 1; + } +#endif + if( pError ){ + *pError = e; + } + return 0; +} + +/* +** Log a I/O error retry episode. +*/ +static void winLogIoerr(int nRetry, int lineno){ + if( nRetry ){ + sqlite3_log(SQLITE_NOTICE, + "delayed %dms for lock/sharing conflict at line %d", + winIoerrRetryDelay*nRetry*(nRetry+1)/2, lineno + ); + } +} + +/* +** This #if does not rely on the SQLITE_OS_WINCE define because the +** corresponding section in "date.c" cannot use it. +*/ +#if !defined(SQLITE_OMIT_LOCALTIME) && defined(_WIN32_WCE) && \ + (!defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API) +/* +** The MSVC CRT on Windows CE may not have a localtime() function. +** So define a substitute. +*/ +/* # include */ +struct tm *__cdecl localtime(const time_t *t) +{ + static struct tm y; + FILETIME uTm, lTm; + SYSTEMTIME pTm; + sqlite3_int64 t64; + t64 = *t; + t64 = (t64 + 11644473600)*10000000; + uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF); + uTm.dwHighDateTime= (DWORD)(t64 >> 32); + osFileTimeToLocalFileTime(&uTm,&lTm); + osFileTimeToSystemTime(&lTm,&pTm); + y.tm_year = pTm.wYear - 1900; + y.tm_mon = pTm.wMonth - 1; + y.tm_wday = pTm.wDayOfWeek; + y.tm_mday = pTm.wDay; + y.tm_hour = pTm.wHour; + y.tm_min = pTm.wMinute; + y.tm_sec = pTm.wSecond; + return &y; +} +#endif + +#if SQLITE_OS_WINCE +/************************************************************************* +** This section contains code for WinCE only. +*/ +#define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)] + +/* +** Acquire a lock on the handle h +*/ +static void winceMutexAcquire(HANDLE h){ + DWORD dwErr; + do { + dwErr = osWaitForSingleObject(h, INFINITE); + } while (dwErr != WAIT_OBJECT_0 && dwErr != WAIT_ABANDONED); +} +/* +** Release a lock acquired by winceMutexAcquire() +*/ +#define winceMutexRelease(h) ReleaseMutex(h) + +/* +** Create the mutex and shared memory used for locking in the file +** descriptor pFile +*/ +static int winceCreateLock(const char *zFilename, winFile *pFile){ + LPWSTR zTok; + LPWSTR zName; + DWORD lastErrno; + BOOL bLogged = FALSE; + BOOL bInit = TRUE; + + zName = winUtf8ToUnicode(zFilename); + if( zName==0 ){ + /* out of memory */ + return SQLITE_IOERR_NOMEM_BKPT; + } + + /* Initialize the local lockdata */ + memset(&pFile->local, 0, sizeof(pFile->local)); + + /* Replace the backslashes from the filename and lowercase it + ** to derive a mutex name. */ + zTok = osCharLowerW(zName); + for (;*zTok;zTok++){ + if (*zTok == '\\') *zTok = '_'; + } + + /* Create/open the named mutex */ + pFile->hMutex = osCreateMutexW(NULL, FALSE, zName); + if (!pFile->hMutex){ + pFile->lastErrno = osGetLastError(); + sqlite3_free(zName); + return winLogError(SQLITE_IOERR, pFile->lastErrno, + "winceCreateLock1", zFilename); + } + + /* Acquire the mutex before continuing */ + winceMutexAcquire(pFile->hMutex); + + /* Since the names of named mutexes, semaphores, file mappings etc are + ** case-sensitive, take advantage of that by uppercasing the mutex name + ** and using that as the shared filemapping name. + */ + osCharUpperW(zName); + pFile->hShared = osCreateFileMappingW(INVALID_HANDLE_VALUE, NULL, + PAGE_READWRITE, 0, sizeof(winceLock), + zName); + + /* Set a flag that indicates we're the first to create the memory so it + ** must be zero-initialized */ + lastErrno = osGetLastError(); + if (lastErrno == ERROR_ALREADY_EXISTS){ + bInit = FALSE; + } + + sqlite3_free(zName); + + /* If we succeeded in making the shared memory handle, map it. */ + if( pFile->hShared ){ + pFile->shared = (winceLock*)osMapViewOfFile(pFile->hShared, + FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock)); + /* If mapping failed, close the shared memory handle and erase it */ + if( !pFile->shared ){ + pFile->lastErrno = osGetLastError(); + winLogError(SQLITE_IOERR, pFile->lastErrno, + "winceCreateLock2", zFilename); + bLogged = TRUE; + osCloseHandle(pFile->hShared); + pFile->hShared = NULL; + } + } + + /* If shared memory could not be created, then close the mutex and fail */ + if( pFile->hShared==NULL ){ + if( !bLogged ){ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_IOERR, pFile->lastErrno, + "winceCreateLock3", zFilename); + bLogged = TRUE; + } + winceMutexRelease(pFile->hMutex); + osCloseHandle(pFile->hMutex); + pFile->hMutex = NULL; + return SQLITE_IOERR; + } + + /* Initialize the shared memory if we're supposed to */ + if( bInit ){ + memset(pFile->shared, 0, sizeof(winceLock)); + } + + winceMutexRelease(pFile->hMutex); + return SQLITE_OK; +} + +/* +** Destroy the part of winFile that deals with wince locks +*/ +static void winceDestroyLock(winFile *pFile){ + if (pFile->hMutex){ + /* Acquire the mutex */ + winceMutexAcquire(pFile->hMutex); + + /* The following blocks should probably assert in debug mode, but they + are to cleanup in case any locks remained open */ + if (pFile->local.nReaders){ + pFile->shared->nReaders --; + } + if (pFile->local.bReserved){ + pFile->shared->bReserved = FALSE; + } + if (pFile->local.bPending){ + pFile->shared->bPending = FALSE; + } + if (pFile->local.bExclusive){ + pFile->shared->bExclusive = FALSE; + } + + /* De-reference and close our copy of the shared memory handle */ + osUnmapViewOfFile(pFile->shared); + osCloseHandle(pFile->hShared); + + /* Done with the mutex */ + winceMutexRelease(pFile->hMutex); + osCloseHandle(pFile->hMutex); + pFile->hMutex = NULL; + } +} + +/* +** An implementation of the LockFile() API of Windows for CE +*/ +static BOOL winceLockFile( + LPHANDLE phFile, + DWORD dwFileOffsetLow, + DWORD dwFileOffsetHigh, + DWORD nNumberOfBytesToLockLow, + DWORD nNumberOfBytesToLockHigh +){ + winFile *pFile = HANDLE_TO_WINFILE(phFile); + BOOL bReturn = FALSE; + + UNUSED_PARAMETER(dwFileOffsetHigh); + UNUSED_PARAMETER(nNumberOfBytesToLockHigh); + + if (!pFile->hMutex) return TRUE; + winceMutexAcquire(pFile->hMutex); + + /* Wanting an exclusive lock? */ + if (dwFileOffsetLow == (DWORD)SHARED_FIRST + && nNumberOfBytesToLockLow == (DWORD)SHARED_SIZE){ + if (pFile->shared->nReaders == 0 && pFile->shared->bExclusive == 0){ + pFile->shared->bExclusive = TRUE; + pFile->local.bExclusive = TRUE; + bReturn = TRUE; + } + } + + /* Want a read-only lock? */ + else if (dwFileOffsetLow == (DWORD)SHARED_FIRST && + nNumberOfBytesToLockLow == 1){ + if (pFile->shared->bExclusive == 0){ + pFile->local.nReaders ++; + if (pFile->local.nReaders == 1){ + pFile->shared->nReaders ++; + } + bReturn = TRUE; + } + } + + /* Want a pending lock? */ + else if (dwFileOffsetLow == (DWORD)PENDING_BYTE + && nNumberOfBytesToLockLow == 1){ + /* If no pending lock has been acquired, then acquire it */ + if (pFile->shared->bPending == 0) { + pFile->shared->bPending = TRUE; + pFile->local.bPending = TRUE; + bReturn = TRUE; + } + } + + /* Want a reserved lock? */ + else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE + && nNumberOfBytesToLockLow == 1){ + if (pFile->shared->bReserved == 0) { + pFile->shared->bReserved = TRUE; + pFile->local.bReserved = TRUE; + bReturn = TRUE; + } + } + + winceMutexRelease(pFile->hMutex); + return bReturn; +} + +/* +** An implementation of the UnlockFile API of Windows for CE +*/ +static BOOL winceUnlockFile( + LPHANDLE phFile, + DWORD dwFileOffsetLow, + DWORD dwFileOffsetHigh, + DWORD nNumberOfBytesToUnlockLow, + DWORD nNumberOfBytesToUnlockHigh +){ + winFile *pFile = HANDLE_TO_WINFILE(phFile); + BOOL bReturn = FALSE; + + UNUSED_PARAMETER(dwFileOffsetHigh); + UNUSED_PARAMETER(nNumberOfBytesToUnlockHigh); + + if (!pFile->hMutex) return TRUE; + winceMutexAcquire(pFile->hMutex); + + /* Releasing a reader lock or an exclusive lock */ + if (dwFileOffsetLow == (DWORD)SHARED_FIRST){ + /* Did we have an exclusive lock? */ + if (pFile->local.bExclusive){ + assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE); + pFile->local.bExclusive = FALSE; + pFile->shared->bExclusive = FALSE; + bReturn = TRUE; + } + + /* Did we just have a reader lock? */ + else if (pFile->local.nReaders){ + assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE + || nNumberOfBytesToUnlockLow == 1); + pFile->local.nReaders --; + if (pFile->local.nReaders == 0) + { + pFile->shared->nReaders --; + } + bReturn = TRUE; + } + } + + /* Releasing a pending lock */ + else if (dwFileOffsetLow == (DWORD)PENDING_BYTE + && nNumberOfBytesToUnlockLow == 1){ + if (pFile->local.bPending){ + pFile->local.bPending = FALSE; + pFile->shared->bPending = FALSE; + bReturn = TRUE; + } + } + /* Releasing a reserved lock */ + else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE + && nNumberOfBytesToUnlockLow == 1){ + if (pFile->local.bReserved) { + pFile->local.bReserved = FALSE; + pFile->shared->bReserved = FALSE; + bReturn = TRUE; + } + } + + winceMutexRelease(pFile->hMutex); + return bReturn; +} +/* +** End of the special code for wince +*****************************************************************************/ +#endif /* SQLITE_OS_WINCE */ + +/* +** Lock a file region. +*/ +static BOOL winLockFile( + LPHANDLE phFile, + DWORD flags, + DWORD offsetLow, + DWORD offsetHigh, + DWORD numBytesLow, + DWORD numBytesHigh +){ +#if SQLITE_OS_WINCE + /* + ** NOTE: Windows CE is handled differently here due its lack of the Win32 + ** API LockFile. + */ + return winceLockFile(phFile, offsetLow, offsetHigh, + numBytesLow, numBytesHigh); +#else + if( osIsNT() ){ + OVERLAPPED ovlp; + memset(&ovlp, 0, sizeof(OVERLAPPED)); + ovlp.Offset = offsetLow; + ovlp.OffsetHigh = offsetHigh; + return osLockFileEx(*phFile, flags, 0, numBytesLow, numBytesHigh, &ovlp); + }else{ + return osLockFile(*phFile, offsetLow, offsetHigh, numBytesLow, + numBytesHigh); + } +#endif +} + +/* +** Unlock a file region. + */ +static BOOL winUnlockFile( + LPHANDLE phFile, + DWORD offsetLow, + DWORD offsetHigh, + DWORD numBytesLow, + DWORD numBytesHigh +){ +#if SQLITE_OS_WINCE + /* + ** NOTE: Windows CE is handled differently here due its lack of the Win32 + ** API UnlockFile. + */ + return winceUnlockFile(phFile, offsetLow, offsetHigh, + numBytesLow, numBytesHigh); +#else + if( osIsNT() ){ + OVERLAPPED ovlp; + memset(&ovlp, 0, sizeof(OVERLAPPED)); + ovlp.Offset = offsetLow; + ovlp.OffsetHigh = offsetHigh; + return osUnlockFileEx(*phFile, 0, numBytesLow, numBytesHigh, &ovlp); + }else{ + return osUnlockFile(*phFile, offsetLow, offsetHigh, numBytesLow, + numBytesHigh); + } +#endif +} + +/***************************************************************************** +** The next group of routines implement the I/O methods specified +** by the sqlite3_io_methods object. +******************************************************************************/ + +/* +** Some Microsoft compilers lack this definition. +*/ +#ifndef INVALID_SET_FILE_POINTER +# define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif + +/* +** Move the current position of the file handle passed as the first +** argument to offset iOffset within the file. If successful, return 0. +** Otherwise, set pFile->lastErrno and return non-zero. +*/ +static int winSeekFile(winFile *pFile, sqlite3_int64 iOffset){ +#if !SQLITE_OS_WINRT + LONG upperBits; /* Most sig. 32 bits of new offset */ + LONG lowerBits; /* Least sig. 32 bits of new offset */ + DWORD dwRet; /* Value returned by SetFilePointer() */ + DWORD lastErrno; /* Value returned by GetLastError() */ + + OSTRACE(("SEEK file=%p, offset=%lld\n", pFile->h, iOffset)); + + upperBits = (LONG)((iOffset>>32) & 0x7fffffff); + lowerBits = (LONG)(iOffset & 0xffffffff); + + /* API oddity: If successful, SetFilePointer() returns a dword + ** containing the lower 32-bits of the new file-offset. Or, if it fails, + ** it returns INVALID_SET_FILE_POINTER. However according to MSDN, + ** INVALID_SET_FILE_POINTER may also be a valid new offset. So to determine + ** whether an error has actually occurred, it is also necessary to call + ** GetLastError(). + */ + dwRet = osSetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); + + if( (dwRet==INVALID_SET_FILE_POINTER + && ((lastErrno = osGetLastError())!=NO_ERROR)) ){ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, + "winSeekFile", pFile->zPath); + OSTRACE(("SEEK file=%p, rc=SQLITE_IOERR_SEEK\n", pFile->h)); + return 1; + } + + OSTRACE(("SEEK file=%p, rc=SQLITE_OK\n", pFile->h)); + return 0; +#else + /* + ** Same as above, except that this implementation works for WinRT. + */ + + LARGE_INTEGER x; /* The new offset */ + BOOL bRet; /* Value returned by SetFilePointerEx() */ + + x.QuadPart = iOffset; + bRet = osSetFilePointerEx(pFile->h, x, 0, FILE_BEGIN); + + if(!bRet){ + pFile->lastErrno = osGetLastError(); + winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, + "winSeekFile", pFile->zPath); + OSTRACE(("SEEK file=%p, rc=SQLITE_IOERR_SEEK\n", pFile->h)); + return 1; + } + + OSTRACE(("SEEK file=%p, rc=SQLITE_OK\n", pFile->h)); + return 0; +#endif +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* Forward references to VFS helper methods used for memory mapped files */ +static int winMapfile(winFile*, sqlite3_int64); +static int winUnmapfile(winFile*); +#endif + +/* +** Close a file. +** +** It is reported that an attempt to close a handle might sometimes +** fail. This is a very unreasonable result, but Windows is notorious +** for being unreasonable so I do not doubt that it might happen. If +** the close fails, we pause for 100 milliseconds and try again. As +** many as MX_CLOSE_ATTEMPT attempts to close the handle are made before +** giving up and returning an error. +*/ +#define MX_CLOSE_ATTEMPT 3 +static int winClose(sqlite3_file *id){ + int rc, cnt = 0; + winFile *pFile = (winFile*)id; + + assert( id!=0 ); +#ifndef SQLITE_OMIT_WAL + assert( pFile->pShm==0 ); +#endif + assert( pFile->h!=NULL && pFile->h!=INVALID_HANDLE_VALUE ); + OSTRACE(("CLOSE pid=%lu, pFile=%p, file=%p\n", + osGetCurrentProcessId(), pFile, pFile->h)); + +#if SQLITE_MAX_MMAP_SIZE>0 + winUnmapfile(pFile); +#endif + + do{ + rc = osCloseHandle(pFile->h); + /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */ + }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) ); +#if SQLITE_OS_WINCE +#define WINCE_DELETION_ATTEMPTS 3 + { + winVfsAppData *pAppData = (winVfsAppData*)pFile->pVfs->pAppData; + if( pAppData==NULL || !pAppData->bNoLock ){ + winceDestroyLock(pFile); + } + } + if( pFile->zDeleteOnClose ){ + int cnt = 0; + while( + osDeleteFileW(pFile->zDeleteOnClose)==0 + && osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff + && cnt++ < WINCE_DELETION_ATTEMPTS + ){ + sqlite3_win32_sleep(100); /* Wait a little before trying again */ + } + sqlite3_free(pFile->zDeleteOnClose); + } +#endif + if( rc ){ + pFile->h = NULL; + } + OpenCounter(-1); + OSTRACE(("CLOSE pid=%lu, pFile=%p, file=%p, rc=%s\n", + osGetCurrentProcessId(), pFile, pFile->h, rc ? "ok" : "failed")); + return rc ? SQLITE_OK + : winLogError(SQLITE_IOERR_CLOSE, osGetLastError(), + "winClose", pFile->zPath); +} + +/* +** Read data from a file into a buffer. Return SQLITE_OK if all +** bytes were read successfully and SQLITE_IOERR if anything goes +** wrong. +*/ +static int winRead( + sqlite3_file *id, /* File to read from */ + void *pBuf, /* Write content into this buffer */ + int amt, /* Number of bytes to read */ + sqlite3_int64 offset /* Begin reading at this offset */ +){ +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + OVERLAPPED overlapped; /* The offset for ReadFile. */ +#endif + winFile *pFile = (winFile*)id; /* file handle */ + DWORD nRead; /* Number of bytes actually read from file */ + int nRetry = 0; /* Number of retrys */ + + assert( id!=0 ); + assert( amt>0 ); + assert( offset>=0 ); + SimulateIOError(return SQLITE_IOERR_READ); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, " + "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile, + pFile->h, pBuf, amt, offset, pFile->locktype)); + +#if SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this read request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); + OSTRACE(("READ-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; + }else{ + int nCopy = (int)(pFile->mmapSize - offset); + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + +#if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) + if( winSeekFile(pFile, offset) ){ + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_FULL\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_FULL; + } + while( !osReadFile(pFile->h, pBuf, amt, &nRead, 0) ){ +#else + memset(&overlapped, 0, sizeof(OVERLAPPED)); + overlapped.Offset = (LONG)(offset & 0xffffffff); + overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); + while( !osReadFile(pFile->h, pBuf, amt, &nRead, &overlapped) && + osGetLastError()!=ERROR_HANDLE_EOF ){ +#endif + DWORD lastErrno; + if( winRetryIoerr(&nRetry, &lastErrno) ) continue; + pFile->lastErrno = lastErrno; + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_READ\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_IOERR_READ, pFile->lastErrno, + "winRead", pFile->zPath); + } + winLogIoerr(nRetry, __LINE__); + if( nRead<(DWORD)amt ){ + /* Unread parts of the buffer must be zero-filled */ + memset(&((char*)pBuf)[nRead], 0, amt-nRead); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_SHORT_READ\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_IOERR_SHORT_READ; + } + + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; +} + +/* +** Write data from a buffer into a file. Return SQLITE_OK on success +** or some other error code on failure. +*/ +static int winWrite( + sqlite3_file *id, /* File to write into */ + const void *pBuf, /* The bytes to be written */ + int amt, /* Number of bytes to write */ + sqlite3_int64 offset /* Offset into the file to begin writing at */ +){ + int rc = 0; /* True if error has occurred, else false */ + winFile *pFile = (winFile*)id; /* File handle */ + int nRetry = 0; /* Number of retries */ + + assert( amt>0 ); + assert( pFile ); + SimulateIOError(return SQLITE_IOERR_WRITE); + SimulateDiskfullError(return SQLITE_FULL); + + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, " + "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile, + pFile->h, pBuf, amt, offset, pFile->locktype)); + +#if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this write request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, amt); + OSTRACE(("WRITE-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; + }else{ + int nCopy = (int)(pFile->mmapSize - offset); + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + +#if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) + rc = winSeekFile(pFile, offset); + if( rc==0 ){ +#else + { +#endif +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + OVERLAPPED overlapped; /* The offset for WriteFile. */ +#endif + u8 *aRem = (u8 *)pBuf; /* Data yet to be written */ + int nRem = amt; /* Number of bytes yet to be written */ + DWORD nWrite; /* Bytes written by each WriteFile() call */ + DWORD lastErrno = NO_ERROR; /* Value returned by GetLastError() */ + +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + memset(&overlapped, 0, sizeof(OVERLAPPED)); + overlapped.Offset = (LONG)(offset & 0xffffffff); + overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); +#endif + + while( nRem>0 ){ +#if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) + if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, 0) ){ +#else + if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, &overlapped) ){ +#endif + if( winRetryIoerr(&nRetry, &lastErrno) ) continue; + break; + } + assert( nWrite==0 || nWrite<=(DWORD)nRem ); + if( nWrite==0 || nWrite>(DWORD)nRem ){ + lastErrno = osGetLastError(); + break; + } +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + offset += nWrite; + overlapped.Offset = (LONG)(offset & 0xffffffff); + overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); +#endif + aRem += nWrite; + nRem -= nWrite; + } + if( nRem>0 ){ + pFile->lastErrno = lastErrno; + rc = 1; + } + } + + if( rc ){ + if( ( pFile->lastErrno==ERROR_HANDLE_DISK_FULL ) + || ( pFile->lastErrno==ERROR_DISK_FULL )){ + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_FULL\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_FULL, pFile->lastErrno, + "winWrite1", pFile->zPath); + } + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_WRITE\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_IOERR_WRITE, pFile->lastErrno, + "winWrite2", pFile->zPath); + }else{ + winLogIoerr(nRetry, __LINE__); + } + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; +} + +/* +** Truncate an open file to a specified size +*/ +static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ + winFile *pFile = (winFile*)id; /* File handle object */ + int rc = SQLITE_OK; /* Return code for this function */ + DWORD lastErrno; +#if SQLITE_MAX_MMAP_SIZE>0 + sqlite3_int64 oldMmapSize; + if( pFile->nFetchOut>0 ){ + /* File truncation is a no-op if there are outstanding memory mapped + ** pages. This is because truncating the file means temporarily unmapping + ** the file, and that might delete memory out from under existing cursors. + ** + ** This can result in incremental vacuum not truncating the file, + ** if there is an active read cursor when the incremental vacuum occurs. + ** No real harm comes of this - the database file is not corrupted, + ** though some folks might complain that the file is bigger than it + ** needs to be. + ** + ** The only feasible work-around is to defer the truncation until after + ** all references to memory-mapped content are closed. That is doable, + ** but involves adding a few branches in the common write code path which + ** could slow down normal operations slightly. Hence, we have decided for + ** now to simply make trancations a no-op if there are pending reads. We + ** can maybe revisit this decision in the future. + */ + return SQLITE_OK; + } +#endif + + assert( pFile ); + SimulateIOError(return SQLITE_IOERR_TRUNCATE); + OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, size=%lld, lock=%d\n", + osGetCurrentProcessId(), pFile, pFile->h, nByte, pFile->locktype)); + + /* If the user has configured a chunk-size for this file, truncate the + ** file so that it consists of an integer number of chunks (i.e. the + ** actual file size after the operation may be larger than the requested + ** size). + */ + if( pFile->szChunk>0 ){ + nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk; + } + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->pMapRegion ){ + oldMmapSize = pFile->mmapSize; + }else{ + oldMmapSize = 0; + } + winUnmapfile(pFile); +#endif + + /* SetEndOfFile() returns non-zero when successful, or zero when it fails. */ + if( winSeekFile(pFile, nByte) ){ + rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno, + "winTruncate1", pFile->zPath); + }else if( 0==osSetEndOfFile(pFile->h) && + ((lastErrno = osGetLastError())!=ERROR_USER_MAPPED_FILE) ){ + pFile->lastErrno = lastErrno; + rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno, + "winTruncate2", pFile->zPath); + } + +#if SQLITE_MAX_MMAP_SIZE>0 + if( rc==SQLITE_OK && oldMmapSize>0 ){ + if( oldMmapSize>nByte ){ + winMapfile(pFile, -1); + }else{ + winMapfile(pFile, oldMmapSize); + } + } +#endif + + OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, rc=%s\n", + osGetCurrentProcessId(), pFile, pFile->h, sqlite3ErrName(rc))); + return rc; +} + +#ifdef SQLITE_TEST +/* +** Count the number of fullsyncs and normal syncs. This is used to test +** that syncs and fullsyncs are occuring at the right times. +*/ +SQLITE_API int sqlite3_sync_count = 0; +SQLITE_API int sqlite3_fullsync_count = 0; +#endif + +/* +** Make sure all writes to a particular file are committed to disk. +*/ +static int winSync(sqlite3_file *id, int flags){ +#ifndef SQLITE_NO_SYNC + /* + ** Used only when SQLITE_NO_SYNC is not defined. + */ + BOOL rc; +#endif +#if !defined(NDEBUG) || !defined(SQLITE_NO_SYNC) || \ + defined(SQLITE_HAVE_OS_TRACE) + /* + ** Used when SQLITE_NO_SYNC is not defined and by the assert() and/or + ** OSTRACE() macros. + */ + winFile *pFile = (winFile*)id; +#else + UNUSED_PARAMETER(id); +#endif + + assert( pFile ); + /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ + assert((flags&0x0F)==SQLITE_SYNC_NORMAL + || (flags&0x0F)==SQLITE_SYNC_FULL + ); + + /* Unix cannot, but some systems may return SQLITE_FULL from here. This + ** line is to test that doing so does not cause any problems. + */ + SimulateDiskfullError( return SQLITE_FULL ); + + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, flags=%x, lock=%d\n", + osGetCurrentProcessId(), pFile, pFile->h, flags, + pFile->locktype)); + +#ifndef SQLITE_TEST + UNUSED_PARAMETER(flags); +#else + if( (flags&0x0F)==SQLITE_SYNC_FULL ){ + sqlite3_fullsync_count++; + } + sqlite3_sync_count++; +#endif + + /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a + ** no-op + */ +#ifdef SQLITE_NO_SYNC + OSTRACE(("SYNC-NOP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; +#else +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->pMapRegion ){ + if( osFlushViewOfFile(pFile->pMapRegion, 0) ){ + OSTRACE(("SYNC-MMAP pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_OK\n", osGetCurrentProcessId(), + pFile, pFile->pMapRegion)); + }else{ + pFile->lastErrno = osGetLastError(); + OSTRACE(("SYNC-MMAP pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_IOERR_MMAP\n", osGetCurrentProcessId(), + pFile, pFile->pMapRegion)); + return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno, + "winSync1", pFile->zPath); + } + } +#endif + rc = osFlushFileBuffers(pFile->h); + SimulateIOError( rc=FALSE ); + if( rc ){ + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; + }else{ + pFile->lastErrno = osGetLastError(); + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_FSYNC\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_IOERR_FSYNC, pFile->lastErrno, + "winSync2", pFile->zPath); + } +#endif +} + +/* +** Determine the current size of a file in bytes +*/ +static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ + winFile *pFile = (winFile*)id; + int rc = SQLITE_OK; + + assert( id!=0 ); + assert( pSize!=0 ); + SimulateIOError(return SQLITE_IOERR_FSTAT); + OSTRACE(("SIZE file=%p, pSize=%p\n", pFile->h, pSize)); + +#if SQLITE_OS_WINRT + { + FILE_STANDARD_INFO info; + if( osGetFileInformationByHandleEx(pFile->h, FileStandardInfo, + &info, sizeof(info)) ){ + *pSize = info.EndOfFile.QuadPart; + }else{ + pFile->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno, + "winFileSize", pFile->zPath); + } + } +#else + { + DWORD upperBits; + DWORD lowerBits; + DWORD lastErrno; + + lowerBits = osGetFileSize(pFile->h, &upperBits); + *pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits; + if( (lowerBits == INVALID_FILE_SIZE) + && ((lastErrno = osGetLastError())!=NO_ERROR) ){ + pFile->lastErrno = lastErrno; + rc = winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno, + "winFileSize", pFile->zPath); + } + } +#endif + OSTRACE(("SIZE file=%p, pSize=%p, *pSize=%lld, rc=%s\n", + pFile->h, pSize, *pSize, sqlite3ErrName(rc))); + return rc; +} + +/* +** LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. +*/ +#ifndef LOCKFILE_FAIL_IMMEDIATELY +# define LOCKFILE_FAIL_IMMEDIATELY 1 +#endif + +#ifndef LOCKFILE_EXCLUSIVE_LOCK +# define LOCKFILE_EXCLUSIVE_LOCK 2 +#endif + +/* +** Historically, SQLite has used both the LockFile and LockFileEx functions. +** When the LockFile function was used, it was always expected to fail +** immediately if the lock could not be obtained. Also, it always expected to +** obtain an exclusive lock. These flags are used with the LockFileEx function +** and reflect those expectations; therefore, they should not be changed. +*/ +#ifndef SQLITE_LOCKFILE_FLAGS +# define SQLITE_LOCKFILE_FLAGS (LOCKFILE_FAIL_IMMEDIATELY | \ + LOCKFILE_EXCLUSIVE_LOCK) +#endif + +/* +** Currently, SQLite never calls the LockFileEx function without wanting the +** call to fail immediately if the lock cannot be obtained. +*/ +#ifndef SQLITE_LOCKFILEEX_FLAGS +# define SQLITE_LOCKFILEEX_FLAGS (LOCKFILE_FAIL_IMMEDIATELY) +#endif + +/* +** Acquire a reader lock. +** Different API routines are called depending on whether or not this +** is Win9x or WinNT. +*/ +static int winGetReadLock(winFile *pFile){ + int res; + OSTRACE(("READ-LOCK file=%p, lock=%d\n", pFile->h, pFile->locktype)); + if( osIsNT() ){ +#if SQLITE_OS_WINCE + /* + ** NOTE: Windows CE is handled differently here due its lack of the Win32 + ** API LockFileEx. + */ + res = winceLockFile(&pFile->h, SHARED_FIRST, 0, 1, 0); +#else + res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS, SHARED_FIRST, 0, + SHARED_SIZE, 0); +#endif + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + int lk; + sqlite3_randomness(sizeof(lk), &lk); + pFile->sharedLockByte = (short)((lk & 0x7fffffff)%(SHARED_SIZE - 1)); + res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, + SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); + } +#endif + if( res == 0 ){ + pFile->lastErrno = osGetLastError(); + /* No need to log a failure to lock */ + } + OSTRACE(("READ-LOCK file=%p, result=%d\n", pFile->h, res)); + return res; +} + +/* +** Undo a readlock +*/ +static int winUnlockReadLock(winFile *pFile){ + int res; + DWORD lastErrno; + OSTRACE(("READ-UNLOCK file=%p, lock=%d\n", pFile->h, pFile->locktype)); + if( osIsNT() ){ + res = winUnlockFile(&pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + res = winUnlockFile(&pFile->h, SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); + } +#endif + if( res==0 && ((lastErrno = osGetLastError())!=ERROR_NOT_LOCKED) ){ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_IOERR_UNLOCK, pFile->lastErrno, + "winUnlockReadLock", pFile->zPath); + } + OSTRACE(("READ-UNLOCK file=%p, result=%d\n", pFile->h, res)); + return res; +} + +/* +** Lock the file with the lock specified by parameter locktype - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. The winUnlock() routine +** erases all locks at once and returns us immediately to locking level 0. +** It is not possible to lower the locking level one step at a time. You +** must go straight to locking level 0. +*/ +static int winLock(sqlite3_file *id, int locktype){ + int rc = SQLITE_OK; /* Return code from subroutines */ + int res = 1; /* Result of a Windows lock call */ + int newLocktype; /* Set pFile->locktype to this value before exiting */ + int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */ + winFile *pFile = (winFile*)id; + DWORD lastErrno = NO_ERROR; + + assert( id!=0 ); + OSTRACE(("LOCK file=%p, oldLock=%d(%d), newLock=%d\n", + pFile->h, pFile->locktype, pFile->sharedLockByte, locktype)); + + /* If there is already a lock of this type or more restrictive on the + ** OsFile, do nothing. Don't use the end_lock: exit path, as + ** sqlite3OsEnterMutex() hasn't been called yet. + */ + if( pFile->locktype>=locktype ){ + OSTRACE(("LOCK-HELD file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + + /* Do not allow any kind of write-lock on a read-only database + */ + if( (pFile->ctrlFlags & WINFILE_RDONLY)!=0 && locktype>=RESERVED_LOCK ){ + return SQLITE_IOERR_LOCK; + } + + /* Make sure the locking sequence is correct + */ + assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); + assert( locktype!=PENDING_LOCK ); + assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); + + /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or + ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of + ** the PENDING_LOCK byte is temporary. + */ + newLocktype = pFile->locktype; + if( pFile->locktype==NO_LOCK + || (locktype==EXCLUSIVE_LOCK && pFile->locktype<=RESERVED_LOCK) + ){ + int cnt = 3; + while( cnt-->0 && (res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, + PENDING_BYTE, 0, 1, 0))==0 ){ + /* Try 3 times to get the pending lock. This is needed to work + ** around problems caused by indexing and/or anti-virus software on + ** Windows systems. + ** If you are using this code as a model for alternative VFSes, do not + ** copy this retry logic. It is a hack intended for Windows only. + */ + lastErrno = osGetLastError(); + OSTRACE(("LOCK-PENDING-FAIL file=%p, count=%d, result=%d\n", + pFile->h, cnt, res)); + if( lastErrno==ERROR_INVALID_HANDLE ){ + pFile->lastErrno = lastErrno; + rc = SQLITE_IOERR_LOCK; + OSTRACE(("LOCK-FAIL file=%p, count=%d, rc=%s\n", + pFile->h, cnt, sqlite3ErrName(rc))); + return rc; + } + if( cnt ) sqlite3_win32_sleep(1); + } + gotPendingLock = res; + if( !res ){ + lastErrno = osGetLastError(); + } + } + + /* Acquire a shared lock + */ + if( locktype==SHARED_LOCK && res ){ + assert( pFile->locktype==NO_LOCK ); + res = winGetReadLock(pFile); + if( res ){ + newLocktype = SHARED_LOCK; + }else{ + lastErrno = osGetLastError(); + } + } + + /* Acquire a RESERVED lock + */ + if( locktype==RESERVED_LOCK && res ){ + assert( pFile->locktype==SHARED_LOCK ); + res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, RESERVED_BYTE, 0, 1, 0); + if( res ){ + newLocktype = RESERVED_LOCK; + }else{ + lastErrno = osGetLastError(); + } + } + + /* Acquire a PENDING lock + */ + if( locktype==EXCLUSIVE_LOCK && res ){ + newLocktype = PENDING_LOCK; + gotPendingLock = 0; + } + + /* Acquire an EXCLUSIVE lock + */ + if( locktype==EXCLUSIVE_LOCK && res ){ + assert( pFile->locktype>=SHARED_LOCK ); + res = winUnlockReadLock(pFile); + res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, SHARED_FIRST, 0, + SHARED_SIZE, 0); + if( res ){ + newLocktype = EXCLUSIVE_LOCK; + }else{ + lastErrno = osGetLastError(); + winGetReadLock(pFile); + } + } + + /* If we are holding a PENDING lock that ought to be released, then + ** release it now. + */ + if( gotPendingLock && locktype==SHARED_LOCK ){ + winUnlockFile(&pFile->h, PENDING_BYTE, 0, 1, 0); + } + + /* Update the state of the lock has held in the file descriptor then + ** return the appropriate result code. + */ + if( res ){ + rc = SQLITE_OK; + }else{ + pFile->lastErrno = lastErrno; + rc = SQLITE_BUSY; + OSTRACE(("LOCK-FAIL file=%p, wanted=%d, got=%d\n", + pFile->h, locktype, newLocktype)); + } + pFile->locktype = (u8)newLocktype; + OSTRACE(("LOCK file=%p, lock=%d, rc=%s\n", + pFile->h, pFile->locktype, sqlite3ErrName(rc))); + return rc; +} + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, return +** non-zero, otherwise zero. +*/ +static int winCheckReservedLock(sqlite3_file *id, int *pResOut){ + int res; + winFile *pFile = (winFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p\n", pFile->h, pResOut)); + + assert( id!=0 ); + if( pFile->locktype>=RESERVED_LOCK ){ + res = 1; + OSTRACE(("TEST-WR-LOCK file=%p, result=%d (local)\n", pFile->h, res)); + }else{ + res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS,RESERVED_BYTE,0,1,0); + if( res ){ + winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0); + } + res = !res; + OSTRACE(("TEST-WR-LOCK file=%p, result=%d (remote)\n", pFile->h, res)); + } + *pResOut = res; + OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", + pFile->h, pResOut, *pResOut)); + return SQLITE_OK; +} + +/* +** Lower the locking level on file descriptor id to locktype. locktype +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** It is not possible for this routine to fail if the second argument +** is NO_LOCK. If the second argument is SHARED_LOCK then this routine +** might return SQLITE_IOERR; +*/ +static int winUnlock(sqlite3_file *id, int locktype){ + int type; + winFile *pFile = (winFile*)id; + int rc = SQLITE_OK; + assert( pFile!=0 ); + assert( locktype<=SHARED_LOCK ); + OSTRACE(("UNLOCK file=%p, oldLock=%d(%d), newLock=%d\n", + pFile->h, pFile->locktype, pFile->sharedLockByte, locktype)); + type = pFile->locktype; + if( type>=EXCLUSIVE_LOCK ){ + winUnlockFile(&pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); + if( locktype==SHARED_LOCK && !winGetReadLock(pFile) ){ + /* This should never happen. We should always be able to + ** reacquire the read lock */ + rc = winLogError(SQLITE_IOERR_UNLOCK, osGetLastError(), + "winUnlock", pFile->zPath); + } + } + if( type>=RESERVED_LOCK ){ + winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0); + } + if( locktype==NO_LOCK && type>=SHARED_LOCK ){ + winUnlockReadLock(pFile); + } + if( type>=PENDING_LOCK ){ + winUnlockFile(&pFile->h, PENDING_BYTE, 0, 1, 0); + } + pFile->locktype = (u8)locktype; + OSTRACE(("UNLOCK file=%p, lock=%d, rc=%s\n", + pFile->h, pFile->locktype, sqlite3ErrName(rc))); + return rc; +} + +/****************************************************************************** +****************************** No-op Locking ********************************** +** +** Of the various locking implementations available, this is by far the +** simplest: locking is ignored. No attempt is made to lock the database +** file for reading or writing. +** +** This locking mode is appropriate for use on read-only databases +** (ex: databases that are burned into CD-ROM, for example.) It can +** also be used if the application employs some external mechanism to +** prevent simultaneous access of the same database by two or more +** database connections. But there is a serious risk of database +** corruption if this locking mode is used in situations where multiple +** database connections are accessing the same database file at the same +** time and one or more of those connections are writing. +*/ + +static int winNolockLock(sqlite3_file *id, int locktype){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(locktype); + return SQLITE_OK; +} + +static int winNolockCheckReservedLock(sqlite3_file *id, int *pResOut){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(pResOut); + return SQLITE_OK; +} + +static int winNolockUnlock(sqlite3_file *id, int locktype){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(locktype); + return SQLITE_OK; +} + +/******************* End of the no-op lock implementation ********************* +******************************************************************************/ + +/* +** If *pArg is initially negative then this is a query. Set *pArg to +** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. +** +** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags. +*/ +static void winModeBit(winFile *pFile, unsigned char mask, int *pArg){ + if( *pArg<0 ){ + *pArg = (pFile->ctrlFlags & mask)!=0; + }else if( (*pArg)==0 ){ + pFile->ctrlFlags &= ~mask; + }else{ + pFile->ctrlFlags |= mask; + } +} + +/* Forward references to VFS helper methods used for temporary files */ +static int winGetTempname(sqlite3_vfs *, char **); +static int winIsDir(const void *); +static BOOL winIsLongPathPrefix(const char *); +static BOOL winIsDriveLetterAndColon(const char *); + +/* +** Control and query of the open file handle. +*/ +static int winFileControl(sqlite3_file *id, int op, void *pArg){ + winFile *pFile = (winFile*)id; + OSTRACE(("FCNTL file=%p, op=%d, pArg=%p\n", pFile->h, op, pArg)); + switch( op ){ + case SQLITE_FCNTL_LOCKSTATE: { + *(int*)pArg = pFile->locktype; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_LAST_ERRNO: { + *(int*)pArg = (int)pFile->lastErrno; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_CHUNK_SIZE: { + pFile->szChunk = *(int *)pArg; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_SIZE_HINT: { + if( pFile->szChunk>0 ){ + sqlite3_int64 oldSz; + int rc = winFileSize(id, &oldSz); + if( rc==SQLITE_OK ){ + sqlite3_int64 newSz = *(sqlite3_int64*)pArg; + if( newSz>oldSz ){ + SimulateIOErrorBenign(1); + rc = winTruncate(id, newSz); + SimulateIOErrorBenign(0); + } + } + OSTRACE(("FCNTL file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); + return rc; + } + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_PERSIST_WAL: { + winModeBit(pFile, WINFILE_PERSIST_WAL, (int*)pArg); + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { + winModeBit(pFile, WINFILE_PSOW, (int*)pArg); + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_VFSNAME: { + *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_WIN32_AV_RETRY: { + int *a = (int*)pArg; + if( a[0]>0 ){ + winIoerrRetry = a[0]; + }else{ + a[0] = winIoerrRetry; + } + if( a[1]>0 ){ + winIoerrRetryDelay = a[1]; + }else{ + a[1] = winIoerrRetryDelay; + } + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_WIN32_GET_HANDLE: { + LPHANDLE phFile = (LPHANDLE)pArg; + *phFile = pFile->h; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } +#ifdef SQLITE_TEST + case SQLITE_FCNTL_WIN32_SET_HANDLE: { + LPHANDLE phFile = (LPHANDLE)pArg; + HANDLE hOldFile = pFile->h; + pFile->h = *phFile; + *phFile = hOldFile; + OSTRACE(("FCNTL oldFile=%p, newFile=%p, rc=SQLITE_OK\n", + hOldFile, pFile->h)); + return SQLITE_OK; + } +#endif + case SQLITE_FCNTL_TEMPFILENAME: { + char *zTFile = 0; + int rc = winGetTempname(pFile->pVfs, &zTFile); + if( rc==SQLITE_OK ){ + *(char**)pArg = zTFile; + } + OSTRACE(("FCNTL file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); + return rc; + } +#if SQLITE_MAX_MMAP_SIZE>0 + case SQLITE_FCNTL_MMAP_SIZE: { + i64 newLimit = *(i64*)pArg; + int rc = SQLITE_OK; + if( newLimit>sqlite3GlobalConfig.mxMmap ){ + newLimit = sqlite3GlobalConfig.mxMmap; + } + + /* The value of newLimit may be eventually cast to (SIZE_T) and passed + ** to MapViewOfFile(). Restrict its value to 2GB if (SIZE_T) is not at + ** least a 64-bit type. */ + if( newLimit>0 && sizeof(SIZE_T)<8 ){ + newLimit = (newLimit & 0x7FFFFFFF); + } + + *(i64*)pArg = pFile->mmapSizeMax; + if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ + pFile->mmapSizeMax = newLimit; + if( pFile->mmapSize>0 ){ + winUnmapfile(pFile); + rc = winMapfile(pFile, -1); + } + } + OSTRACE(("FCNTL file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); + return rc; + } +#endif + } + OSTRACE(("FCNTL file=%p, rc=SQLITE_NOTFOUND\n", pFile->h)); + return SQLITE_NOTFOUND; +} + +/* +** Return the sector size in bytes of the underlying block device for +** the specified file. This is almost always 512 bytes, but may be +** larger for some devices. +** +** SQLite code assumes this function cannot fail. It also assumes that +** if two files are created in the same file-system directory (i.e. +** a database and its journal file) that the sector size will be the +** same for both. +*/ +static int winSectorSize(sqlite3_file *id){ + (void)id; + return SQLITE_DEFAULT_SECTOR_SIZE; +} + +/* +** Return a vector of device characteristics. +*/ +static int winDeviceCharacteristics(sqlite3_file *id){ + winFile *p = (winFile*)id; + return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | + ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0); +} + +/* +** Windows will only let you create file view mappings +** on allocation size granularity boundaries. +** During sqlite3_os_init() we do a GetSystemInfo() +** to get the granularity size. +*/ +static SYSTEM_INFO winSysInfo; + +#ifndef SQLITE_OMIT_WAL + +/* +** Helper functions to obtain and relinquish the global mutex. The +** global mutex is used to protect the winLockInfo objects used by +** this file, all of which may be shared by multiple threads. +** +** Function winShmMutexHeld() is used to assert() that the global mutex +** is held when required. This function is only used as part of assert() +** statements. e.g. +** +** winShmEnterMutex() +** assert( winShmMutexHeld() ); +** winShmLeaveMutex() +*/ +static sqlite3_mutex *winBigLock = 0; +static void winShmEnterMutex(void){ + sqlite3_mutex_enter(winBigLock); +} +static void winShmLeaveMutex(void){ + sqlite3_mutex_leave(winBigLock); +} +#ifndef NDEBUG +static int winShmMutexHeld(void) { + return sqlite3_mutex_held(winBigLock); +} +#endif + +/* +** Object used to represent a single file opened and mmapped to provide +** shared memory. When multiple threads all reference the same +** log-summary, each thread has its own winFile object, but they all +** point to a single instance of this object. In other words, each +** log-summary is opened only once per process. +** +** winShmMutexHeld() must be true when creating or destroying +** this object or while reading or writing the following fields: +** +** nRef +** pNext +** +** The following fields are read-only after the object is created: +** +** fid +** zFilename +** +** Either winShmNode.mutex must be held or winShmNode.nRef==0 and +** winShmMutexHeld() is true when reading or writing any other field +** in this structure. +** +*/ +struct winShmNode { + sqlite3_mutex *mutex; /* Mutex to access this object */ + char *zFilename; /* Name of the file */ + winFile hFile; /* File handle from winOpen */ + + int szRegion; /* Size of shared-memory regions */ + int nRegion; /* Size of array apRegion */ + u8 isReadonly; /* True if read-only */ + u8 isUnlocked; /* True if no DMS lock held */ + + struct ShmRegion { + HANDLE hMap; /* File handle from CreateFileMapping */ + void *pMap; + } *aRegion; + DWORD lastErrno; /* The Windows errno from the last I/O error */ + + int nRef; /* Number of winShm objects pointing to this */ + winShm *pFirst; /* All winShm objects pointing to this */ + winShmNode *pNext; /* Next in list of all winShmNode objects */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) + u8 nextShmId; /* Next available winShm.id value */ +#endif +}; + +/* +** A global array of all winShmNode objects. +** +** The winShmMutexHeld() must be true while reading or writing this list. +*/ +static winShmNode *winShmNodeList = 0; + +/* +** Structure used internally by this VFS to record the state of an +** open shared memory connection. +** +** The following fields are initialized when this object is created and +** are read-only thereafter: +** +** winShm.pShmNode +** winShm.id +** +** All other fields are read/write. The winShm.pShmNode->mutex must be held +** while accessing any read/write fields. +*/ +struct winShm { + winShmNode *pShmNode; /* The underlying winShmNode object */ + winShm *pNext; /* Next winShm with the same winShmNode */ + u8 hasMutex; /* True if holding the winShmNode mutex */ + u16 sharedMask; /* Mask of shared locks held */ + u16 exclMask; /* Mask of exclusive locks held */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) + u8 id; /* Id of this connection with its winShmNode */ +#endif +}; + +/* +** Constants used for locking +*/ +#define WIN_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ +#define WIN_SHM_DMS (WIN_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ + +/* +** Apply advisory locks for all n bytes beginning at ofst. +*/ +#define WINSHM_UNLCK 1 +#define WINSHM_RDLCK 2 +#define WINSHM_WRLCK 3 +static int winShmSystemLock( + winShmNode *pFile, /* Apply locks to this open shared-memory segment */ + int lockType, /* WINSHM_UNLCK, WINSHM_RDLCK, or WINSHM_WRLCK */ + int ofst, /* Offset to first byte to be locked/unlocked */ + int nByte /* Number of bytes to lock or unlock */ +){ + int rc = 0; /* Result code form Lock/UnlockFileEx() */ + + /* Access to the winShmNode object is serialized by the caller */ + assert( pFile->nRef==0 || sqlite3_mutex_held(pFile->mutex) ); + + OSTRACE(("SHM-LOCK file=%p, lock=%d, offset=%d, size=%d\n", + pFile->hFile.h, lockType, ofst, nByte)); + + /* Release/Acquire the system-level lock */ + if( lockType==WINSHM_UNLCK ){ + rc = winUnlockFile(&pFile->hFile.h, ofst, 0, nByte, 0); + }else{ + /* Initialize the locking parameters */ + DWORD dwFlags = LOCKFILE_FAIL_IMMEDIATELY; + if( lockType == WINSHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK; + rc = winLockFile(&pFile->hFile.h, dwFlags, ofst, 0, nByte, 0); + } + + if( rc!= 0 ){ + rc = SQLITE_OK; + }else{ + pFile->lastErrno = osGetLastError(); + rc = SQLITE_BUSY; + } + + OSTRACE(("SHM-LOCK file=%p, func=%s, errno=%lu, rc=%s\n", + pFile->hFile.h, (lockType == WINSHM_UNLCK) ? "winUnlockFile" : + "winLockFile", pFile->lastErrno, sqlite3ErrName(rc))); + + return rc; +} + +/* Forward references to VFS methods */ +static int winOpen(sqlite3_vfs*,const char*,sqlite3_file*,int,int*); +static int winDelete(sqlite3_vfs *,const char*,int); + +/* +** Purge the winShmNodeList list of all entries with winShmNode.nRef==0. +** +** This is not a VFS shared-memory method; it is a utility function called +** by VFS shared-memory methods. +*/ +static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){ + winShmNode **pp; + winShmNode *p; + assert( winShmMutexHeld() ); + OSTRACE(("SHM-PURGE pid=%lu, deleteFlag=%d\n", + osGetCurrentProcessId(), deleteFlag)); + pp = &winShmNodeList; + while( (p = *pp)!=0 ){ + if( p->nRef==0 ){ + int i; + if( p->mutex ){ sqlite3_mutex_free(p->mutex); } + for(i=0; inRegion; i++){ + BOOL bRc = osUnmapViewOfFile(p->aRegion[i].pMap); + OSTRACE(("SHM-PURGE-UNMAP pid=%lu, region=%d, rc=%s\n", + osGetCurrentProcessId(), i, bRc ? "ok" : "failed")); + UNUSED_VARIABLE_VALUE(bRc); + bRc = osCloseHandle(p->aRegion[i].hMap); + OSTRACE(("SHM-PURGE-CLOSE pid=%lu, region=%d, rc=%s\n", + osGetCurrentProcessId(), i, bRc ? "ok" : "failed")); + UNUSED_VARIABLE_VALUE(bRc); + } + if( p->hFile.h!=NULL && p->hFile.h!=INVALID_HANDLE_VALUE ){ + SimulateIOErrorBenign(1); + winClose((sqlite3_file *)&p->hFile); + SimulateIOErrorBenign(0); + } + if( deleteFlag ){ + SimulateIOErrorBenign(1); + sqlite3BeginBenignMalloc(); + winDelete(pVfs, p->zFilename, 0); + sqlite3EndBenignMalloc(); + SimulateIOErrorBenign(0); + } + *pp = p->pNext; + sqlite3_free(p->aRegion); + sqlite3_free(p); + }else{ + pp = &p->pNext; + } + } +} + +/* +** The DMS lock has not yet been taken on shm file pShmNode. Attempt to +** take it now. Return SQLITE_OK if successful, or an SQLite error +** code otherwise. +** +** If the DMS cannot be locked because this is a readonly_shm=1 +** connection and no other process already holds a lock, return +** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1. +*/ +static int winLockSharedMemory(winShmNode *pShmNode){ + int rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, WIN_SHM_DMS, 1); + + if( rc==SQLITE_OK ){ + if( pShmNode->isReadonly ){ + pShmNode->isUnlocked = 1; + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + return SQLITE_READONLY_CANTINIT; + }else if( winTruncate((sqlite3_file*)&pShmNode->hFile, 0) ){ + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + return winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(), + "winLockSharedMemory", pShmNode->zFilename); + } + } + + if( rc==SQLITE_OK ){ + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + } + + return winShmSystemLock(pShmNode, WINSHM_RDLCK, WIN_SHM_DMS, 1); +} + +/* +** Open the shared-memory area associated with database file pDbFd. +** +** When opening a new shared-memory file, if no other instances of that +** file are currently open, in this process or in other processes, then +** the file must be truncated to zero length or have its header cleared. +*/ +static int winOpenSharedMemory(winFile *pDbFd){ + struct winShm *p; /* The connection to be opened */ + winShmNode *pShmNode = 0; /* The underlying mmapped file */ + int rc = SQLITE_OK; /* Result code */ + winShmNode *pNew; /* Newly allocated winShmNode */ + int nName; /* Size of zName in bytes */ + + assert( pDbFd->pShm==0 ); /* Not previously opened */ + + /* Allocate space for the new sqlite3_shm object. Also speculatively + ** allocate space for a new winShmNode and filename. + */ + p = sqlite3MallocZero( sizeof(*p) ); + if( p==0 ) return SQLITE_IOERR_NOMEM_BKPT; + nName = sqlite3Strlen30(pDbFd->zPath); + pNew = sqlite3MallocZero( sizeof(*pShmNode) + nName + 17 ); + if( pNew==0 ){ + sqlite3_free(p); + return SQLITE_IOERR_NOMEM_BKPT; + } + pNew->zFilename = (char*)&pNew[1]; + sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath); + sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename); + + /* Look to see if there is an existing winShmNode that can be used. + ** If no matching winShmNode currently exists, create a new one. + */ + winShmEnterMutex(); + for(pShmNode = winShmNodeList; pShmNode; pShmNode=pShmNode->pNext){ + /* TBD need to come up with better match here. Perhaps + ** use FILE_ID_BOTH_DIR_INFO Structure. + */ + if( sqlite3StrICmp(pShmNode->zFilename, pNew->zFilename)==0 ) break; + } + if( pShmNode ){ + sqlite3_free(pNew); + }else{ + int inFlags = SQLITE_OPEN_WAL; + int outFlags = 0; + + pShmNode = pNew; + pNew = 0; + ((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE; + pShmNode->pNext = winShmNodeList; + winShmNodeList = pShmNode; + + if( sqlite3GlobalConfig.bCoreMutex ){ + pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->mutex==0 ){ + rc = SQLITE_IOERR_NOMEM_BKPT; + goto shm_open_err; + } + } + + if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ + inFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; + }else{ + inFlags |= SQLITE_OPEN_READONLY; + } + rc = winOpen(pDbFd->pVfs, pShmNode->zFilename, + (sqlite3_file*)&pShmNode->hFile, + inFlags, &outFlags); + if( rc!=SQLITE_OK ){ + rc = winLogError(rc, osGetLastError(), "winOpenShm", + pShmNode->zFilename); + goto shm_open_err; + } + if( outFlags==SQLITE_OPEN_READONLY ) pShmNode->isReadonly = 1; + + rc = winLockSharedMemory(pShmNode); + if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err; + } + + /* Make the new connection a child of the winShmNode */ + p->pShmNode = pShmNode; +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) + p->id = pShmNode->nextShmId++; +#endif + pShmNode->nRef++; + pDbFd->pShm = p; + winShmLeaveMutex(); + + /* The reference count on pShmNode has already been incremented under + ** the cover of the winShmEnterMutex() mutex and the pointer from the + ** new (struct winShm) object to the pShmNode has been set. All that is + ** left to do is to link the new object into the linked list starting + ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex + ** mutex. + */ + sqlite3_mutex_enter(pShmNode->mutex); + p->pNext = pShmNode->pFirst; + pShmNode->pFirst = p; + sqlite3_mutex_leave(pShmNode->mutex); + return rc; + + /* Jump here on any error */ +shm_open_err: + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + winShmPurge(pDbFd->pVfs, 0); /* This call frees pShmNode if required */ + sqlite3_free(p); + sqlite3_free(pNew); + winShmLeaveMutex(); + return rc; +} + +/* +** Close a connection to shared-memory. Delete the underlying +** storage if deleteFlag is true. +*/ +static int winShmUnmap( + sqlite3_file *fd, /* Database holding shared memory */ + int deleteFlag /* Delete after closing if true */ +){ + winFile *pDbFd; /* Database holding shared-memory */ + winShm *p; /* The connection to be closed */ + winShmNode *pShmNode; /* The underlying shared-memory file */ + winShm **pp; /* For looping over sibling connections */ + + pDbFd = (winFile*)fd; + p = pDbFd->pShm; + if( p==0 ) return SQLITE_OK; + pShmNode = p->pShmNode; + + /* Remove connection p from the set of connections associated + ** with pShmNode */ + sqlite3_mutex_enter(pShmNode->mutex); + for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){} + *pp = p->pNext; + + /* Free the connection p */ + sqlite3_free(p); + pDbFd->pShm = 0; + sqlite3_mutex_leave(pShmNode->mutex); + + /* If pShmNode->nRef has reached 0, then close the underlying + ** shared-memory file, too */ + winShmEnterMutex(); + assert( pShmNode->nRef>0 ); + pShmNode->nRef--; + if( pShmNode->nRef==0 ){ + winShmPurge(pDbFd->pVfs, deleteFlag); + } + winShmLeaveMutex(); + + return SQLITE_OK; +} + +/* +** Change the lock state for a shared-memory segment. +*/ +static int winShmLock( + sqlite3_file *fd, /* Database file holding the shared memory */ + int ofst, /* First lock to acquire or release */ + int n, /* Number of locks to acquire or release */ + int flags /* What to do with the lock */ +){ + winFile *pDbFd = (winFile*)fd; /* Connection holding shared memory */ + winShm *p = pDbFd->pShm; /* The shared memory being locked */ + winShm *pX; /* For looping over all siblings */ + winShmNode *pShmNode = p->pShmNode; + int rc = SQLITE_OK; /* Result code */ + u16 mask; /* Mask of locks to take or release */ + + assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK ); + assert( n>=1 ); + assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); + assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); + + mask = (u16)((1U<<(ofst+n)) - (1U<1 || mask==(1<mutex); + if( flags & SQLITE_SHM_UNLOCK ){ + u16 allMask = 0; /* Mask of locks held by siblings */ + + /* See if any siblings hold this same lock */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( pX==p ) continue; + assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 ); + allMask |= pX->sharedMask; + } + + /* Unlock the system-level locks */ + if( (mask & allMask)==0 ){ + rc = winShmSystemLock(pShmNode, WINSHM_UNLCK, ofst+WIN_SHM_BASE, n); + }else{ + rc = SQLITE_OK; + } + + /* Undo the local locks */ + if( rc==SQLITE_OK ){ + p->exclMask &= ~mask; + p->sharedMask &= ~mask; + } + }else if( flags & SQLITE_SHM_SHARED ){ + u16 allShared = 0; /* Union of locks held by connections other than "p" */ + + /* Find out which shared locks are already held by sibling connections. + ** If any sibling already holds an exclusive lock, go ahead and return + ** SQLITE_BUSY. + */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( (pX->exclMask & mask)!=0 ){ + rc = SQLITE_BUSY; + break; + } + allShared |= pX->sharedMask; + } + + /* Get shared locks at the system level, if necessary */ + if( rc==SQLITE_OK ){ + if( (allShared & mask)==0 ){ + rc = winShmSystemLock(pShmNode, WINSHM_RDLCK, ofst+WIN_SHM_BASE, n); + }else{ + rc = SQLITE_OK; + } + } + + /* Get the local shared locks */ + if( rc==SQLITE_OK ){ + p->sharedMask |= mask; + } + }else{ + /* Make sure no sibling connections hold locks that will block this + ** lock. If any do, return SQLITE_BUSY right away. + */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){ + rc = SQLITE_BUSY; + break; + } + } + + /* Get the exclusive locks at the system level. Then if successful + ** also mark the local connection as being locked. + */ + if( rc==SQLITE_OK ){ + rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, ofst+WIN_SHM_BASE, n); + if( rc==SQLITE_OK ){ + assert( (p->sharedMask & mask)==0 ); + p->exclMask |= mask; + } + } + } + sqlite3_mutex_leave(pShmNode->mutex); + OSTRACE(("SHM-LOCK pid=%lu, id=%d, sharedMask=%03x, exclMask=%03x, rc=%s\n", + osGetCurrentProcessId(), p->id, p->sharedMask, p->exclMask, + sqlite3ErrName(rc))); + return rc; +} + +/* +** Implement a memory barrier or memory fence on shared memory. +** +** All loads and stores begun before the barrier must complete before +** any load or store begun after the barrier. +*/ +static void winShmBarrier( + sqlite3_file *fd /* Database holding the shared memory */ +){ + UNUSED_PARAMETER(fd); + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + winShmEnterMutex(); /* Also mutex, for redundancy */ + winShmLeaveMutex(); +} + +/* +** This function is called to obtain a pointer to region iRegion of the +** shared-memory associated with the database file fd. Shared-memory regions +** are numbered starting from zero. Each shared-memory region is szRegion +** bytes in size. +** +** If an error occurs, an error code is returned and *pp is set to NULL. +** +** Otherwise, if the isWrite parameter is 0 and the requested shared-memory +** region has not been allocated (by any client, including one running in a +** separate process), then *pp is set to NULL and SQLITE_OK returned. If +** isWrite is non-zero and the requested shared-memory region has not yet +** been allocated, it is allocated by this function. +** +** If the shared-memory region has already been allocated or is allocated by +** this call as described above, then it is mapped into this processes +** address space (if it is not already), *pp is set to point to the mapped +** memory and SQLITE_OK returned. +*/ +static int winShmMap( + sqlite3_file *fd, /* Handle open on database file */ + int iRegion, /* Region to retrieve */ + int szRegion, /* Size of regions */ + int isWrite, /* True to extend file if necessary */ + void volatile **pp /* OUT: Mapped memory */ +){ + winFile *pDbFd = (winFile*)fd; + winShm *pShm = pDbFd->pShm; + winShmNode *pShmNode; + DWORD protect = PAGE_READWRITE; + DWORD flags = FILE_MAP_WRITE | FILE_MAP_READ; + int rc = SQLITE_OK; + + if( !pShm ){ + rc = winOpenSharedMemory(pDbFd); + if( rc!=SQLITE_OK ) return rc; + pShm = pDbFd->pShm; + assert( pShm!=0 ); + } + pShmNode = pShm->pShmNode; + + sqlite3_mutex_enter(pShmNode->mutex); + if( pShmNode->isUnlocked ){ + rc = winLockSharedMemory(pShmNode); + if( rc!=SQLITE_OK ) goto shmpage_out; + pShmNode->isUnlocked = 0; + } + assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); + + if( pShmNode->nRegion<=iRegion ){ + struct ShmRegion *apNew; /* New aRegion[] array */ + int nByte = (iRegion+1)*szRegion; /* Minimum required file size */ + sqlite3_int64 sz; /* Current size of wal-index file */ + + pShmNode->szRegion = szRegion; + + /* The requested region is not mapped into this processes address space. + ** Check to see if it has been allocated (i.e. if the wal-index file is + ** large enough to contain the requested region). + */ + rc = winFileSize((sqlite3_file *)&pShmNode->hFile, &sz); + if( rc!=SQLITE_OK ){ + rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(), + "winShmMap1", pDbFd->zPath); + goto shmpage_out; + } + + if( szhFile, nByte); + if( rc!=SQLITE_OK ){ + rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(), + "winShmMap2", pDbFd->zPath); + goto shmpage_out; + } + } + + /* Map the requested memory region into this processes address space. */ + apNew = (struct ShmRegion *)sqlite3_realloc64( + pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0]) + ); + if( !apNew ){ + rc = SQLITE_IOERR_NOMEM_BKPT; + goto shmpage_out; + } + pShmNode->aRegion = apNew; + + if( pShmNode->isReadonly ){ + protect = PAGE_READONLY; + flags = FILE_MAP_READ; + } + + while( pShmNode->nRegion<=iRegion ){ + HANDLE hMap = NULL; /* file-mapping handle */ + void *pMap = 0; /* Mapped memory region */ + +#if SQLITE_OS_WINRT + hMap = osCreateFileMappingFromApp(pShmNode->hFile.h, + NULL, protect, nByte, NULL + ); +#elif defined(SQLITE_WIN32_HAS_WIDE) + hMap = osCreateFileMappingW(pShmNode->hFile.h, + NULL, protect, 0, nByte, NULL + ); +#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA + hMap = osCreateFileMappingA(pShmNode->hFile.h, + NULL, protect, 0, nByte, NULL + ); +#endif + OSTRACE(("SHM-MAP-CREATE pid=%lu, region=%d, size=%d, rc=%s\n", + osGetCurrentProcessId(), pShmNode->nRegion, nByte, + hMap ? "ok" : "failed")); + if( hMap ){ + int iOffset = pShmNode->nRegion*szRegion; + int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; +#if SQLITE_OS_WINRT + pMap = osMapViewOfFileFromApp(hMap, flags, + iOffset - iOffsetShift, szRegion + iOffsetShift + ); +#else + pMap = osMapViewOfFile(hMap, flags, + 0, iOffset - iOffsetShift, szRegion + iOffsetShift + ); +#endif + OSTRACE(("SHM-MAP-MAP pid=%lu, region=%d, offset=%d, size=%d, rc=%s\n", + osGetCurrentProcessId(), pShmNode->nRegion, iOffset, + szRegion, pMap ? "ok" : "failed")); + } + if( !pMap ){ + pShmNode->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_SHMMAP, pShmNode->lastErrno, + "winShmMap3", pDbFd->zPath); + if( hMap ) osCloseHandle(hMap); + goto shmpage_out; + } + + pShmNode->aRegion[pShmNode->nRegion].pMap = pMap; + pShmNode->aRegion[pShmNode->nRegion].hMap = hMap; + pShmNode->nRegion++; + } + } + +shmpage_out: + if( pShmNode->nRegion>iRegion ){ + int iOffset = iRegion*szRegion; + int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; + char *p = (char *)pShmNode->aRegion[iRegion].pMap; + *pp = (void *)&p[iOffsetShift]; + }else{ + *pp = 0; + } + if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; + sqlite3_mutex_leave(pShmNode->mutex); + return rc; +} + +#else +# define winShmMap 0 +# define winShmLock 0 +# define winShmBarrier 0 +# define winShmUnmap 0 +#endif /* #ifndef SQLITE_OMIT_WAL */ + +/* +** Cleans up the mapped region of the specified file, if any. +*/ +#if SQLITE_MAX_MMAP_SIZE>0 +static int winUnmapfile(winFile *pFile){ + assert( pFile!=0 ); + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, hMap=%p, pMapRegion=%p, " + "mmapSize=%lld, mmapSizeMax=%lld\n", + osGetCurrentProcessId(), pFile, pFile->hMap, pFile->pMapRegion, + pFile->mmapSize, pFile->mmapSizeMax)); + if( pFile->pMapRegion ){ + if( !osUnmapViewOfFile(pFile->pMapRegion) ){ + pFile->lastErrno = osGetLastError(); + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_IOERR_MMAP\n", osGetCurrentProcessId(), pFile, + pFile->pMapRegion)); + return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno, + "winUnmapfile1", pFile->zPath); + } + pFile->pMapRegion = 0; + pFile->mmapSize = 0; + } + if( pFile->hMap!=NULL ){ + if( !osCloseHandle(pFile->hMap) ){ + pFile->lastErrno = osGetLastError(); + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, hMap=%p, rc=SQLITE_IOERR_MMAP\n", + osGetCurrentProcessId(), pFile, pFile->hMap)); + return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno, + "winUnmapfile2", pFile->zPath); + } + pFile->hMap = NULL; + } + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile)); + return SQLITE_OK; +} + +/* +** Memory map or remap the file opened by file-descriptor pFd (if the file +** is already mapped, the existing mapping is replaced by the new). Or, if +** there already exists a mapping for this file, and there are still +** outstanding xFetch() references to it, this function is a no-op. +** +** If parameter nByte is non-negative, then it is the requested size of +** the mapping to create. Otherwise, if nByte is less than zero, then the +** requested size is the size of the file on disk. The actual size of the +** created mapping is either the requested size or the value configured +** using SQLITE_FCNTL_MMAP_SIZE, whichever is smaller. +** +** SQLITE_OK is returned if no error occurs (even if the mapping is not +** recreated as a result of outstanding references) or an SQLite error +** code otherwise. +*/ +static int winMapfile(winFile *pFd, sqlite3_int64 nByte){ + sqlite3_int64 nMap = nByte; + int rc; + + assert( nMap>=0 || pFd->nFetchOut==0 ); + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, size=%lld\n", + osGetCurrentProcessId(), pFd, nByte)); + + if( pFd->nFetchOut>0 ) return SQLITE_OK; + + if( nMap<0 ){ + rc = winFileSize((sqlite3_file*)pFd, &nMap); + if( rc ){ + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_IOERR_FSTAT\n", + osGetCurrentProcessId(), pFd)); + return SQLITE_IOERR_FSTAT; + } + } + if( nMap>pFd->mmapSizeMax ){ + nMap = pFd->mmapSizeMax; + } + nMap &= ~(sqlite3_int64)(winSysInfo.dwPageSize - 1); + + if( nMap==0 && pFd->mmapSize>0 ){ + winUnmapfile(pFd); + } + if( nMap!=pFd->mmapSize ){ + void *pNew = 0; + DWORD protect = PAGE_READONLY; + DWORD flags = FILE_MAP_READ; + + winUnmapfile(pFd); +#ifdef SQLITE_MMAP_READWRITE + if( (pFd->ctrlFlags & WINFILE_RDONLY)==0 ){ + protect = PAGE_READWRITE; + flags |= FILE_MAP_WRITE; + } +#endif +#if SQLITE_OS_WINRT + pFd->hMap = osCreateFileMappingFromApp(pFd->h, NULL, protect, nMap, NULL); +#elif defined(SQLITE_WIN32_HAS_WIDE) + pFd->hMap = osCreateFileMappingW(pFd->h, NULL, protect, + (DWORD)((nMap>>32) & 0xffffffff), + (DWORD)(nMap & 0xffffffff), NULL); +#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA + pFd->hMap = osCreateFileMappingA(pFd->h, NULL, protect, + (DWORD)((nMap>>32) & 0xffffffff), + (DWORD)(nMap & 0xffffffff), NULL); +#endif + if( pFd->hMap==NULL ){ + pFd->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_MMAP, pFd->lastErrno, + "winMapfile1", pFd->zPath); + /* Log the error, but continue normal operation using xRead/xWrite */ + OSTRACE(("MAP-FILE-CREATE pid=%lu, pFile=%p, rc=%s\n", + osGetCurrentProcessId(), pFd, sqlite3ErrName(rc))); + return SQLITE_OK; + } + assert( (nMap % winSysInfo.dwPageSize)==0 ); + assert( sizeof(SIZE_T)==sizeof(sqlite3_int64) || nMap<=0xffffffff ); +#if SQLITE_OS_WINRT + pNew = osMapViewOfFileFromApp(pFd->hMap, flags, 0, (SIZE_T)nMap); +#else + pNew = osMapViewOfFile(pFd->hMap, flags, 0, 0, (SIZE_T)nMap); +#endif + if( pNew==NULL ){ + osCloseHandle(pFd->hMap); + pFd->hMap = NULL; + pFd->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_MMAP, pFd->lastErrno, + "winMapfile2", pFd->zPath); + /* Log the error, but continue normal operation using xRead/xWrite */ + OSTRACE(("MAP-FILE-MAP pid=%lu, pFile=%p, rc=%s\n", + osGetCurrentProcessId(), pFd, sqlite3ErrName(rc))); + return SQLITE_OK; + } + pFd->pMapRegion = pNew; + pFd->mmapSize = nMap; + } + + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFd)); + return SQLITE_OK; +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* +** If possible, return a pointer to a mapping of file fd starting at offset +** iOff. The mapping must be valid for at least nAmt bytes. +** +** If such a pointer can be obtained, store it in *pp and return SQLITE_OK. +** Or, if one cannot but no error occurs, set *pp to 0 and return SQLITE_OK. +** Finally, if an error does occur, return an SQLite error code. The final +** value of *pp is undefined in this case. +** +** If this function does return a pointer, the caller must eventually +** release the reference by calling winUnfetch(). +*/ +static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ +#if SQLITE_MAX_MMAP_SIZE>0 + winFile *pFd = (winFile*)fd; /* The underlying database file */ +#endif + *pp = 0; + + OSTRACE(("FETCH pid=%lu, pFile=%p, offset=%lld, amount=%d, pp=%p\n", + osGetCurrentProcessId(), fd, iOff, nAmt, pp)); + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFd->mmapSizeMax>0 ){ + if( pFd->pMapRegion==0 ){ + int rc = winMapfile(pFd, -1); + if( rc!=SQLITE_OK ){ + OSTRACE(("FETCH pid=%lu, pFile=%p, rc=%s\n", + osGetCurrentProcessId(), pFd, sqlite3ErrName(rc))); + return rc; + } + } + if( pFd->mmapSize >= iOff+nAmt ){ + assert( pFd->pMapRegion!=0 ); + *pp = &((u8 *)pFd->pMapRegion)[iOff]; + pFd->nFetchOut++; + } + } +#endif + + OSTRACE(("FETCH pid=%lu, pFile=%p, pp=%p, *pp=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), fd, pp, *pp)); + return SQLITE_OK; +} + +/* +** If the third argument is non-NULL, then this function releases a +** reference obtained by an earlier call to winFetch(). The second +** argument passed to this function must be the same as the corresponding +** argument that was passed to the winFetch() invocation. +** +** Or, if the third argument is NULL, then this function is being called +** to inform the VFS layer that, according to POSIX, any existing mapping +** may now be invalid and should be unmapped. +*/ +static int winUnfetch(sqlite3_file *fd, i64 iOff, void *p){ +#if SQLITE_MAX_MMAP_SIZE>0 + winFile *pFd = (winFile*)fd; /* The underlying database file */ + + /* If p==0 (unmap the entire file) then there must be no outstanding + ** xFetch references. Or, if p!=0 (meaning it is an xFetch reference), + ** then there must be at least one outstanding. */ + assert( (p==0)==(pFd->nFetchOut==0) ); + + /* If p!=0, it must match the iOff value. */ + assert( p==0 || p==&((u8 *)pFd->pMapRegion)[iOff] ); + + OSTRACE(("UNFETCH pid=%lu, pFile=%p, offset=%lld, p=%p\n", + osGetCurrentProcessId(), pFd, iOff, p)); + + if( p ){ + pFd->nFetchOut--; + }else{ + /* FIXME: If Windows truly always prevents truncating or deleting a + ** file while a mapping is held, then the following winUnmapfile() call + ** is unnecessary can be omitted - potentially improving + ** performance. */ + winUnmapfile(pFd); + } + + assert( pFd->nFetchOut>=0 ); +#endif + + OSTRACE(("UNFETCH pid=%lu, pFile=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), fd)); + return SQLITE_OK; +} + +/* +** Here ends the implementation of all sqlite3_file methods. +** +********************** End sqlite3_file Methods ******************************* +******************************************************************************/ + +/* +** This vector defines all the methods that can operate on an +** sqlite3_file for win32. +*/ +static const sqlite3_io_methods winIoMethod = { + 3, /* iVersion */ + winClose, /* xClose */ + winRead, /* xRead */ + winWrite, /* xWrite */ + winTruncate, /* xTruncate */ + winSync, /* xSync */ + winFileSize, /* xFileSize */ + winLock, /* xLock */ + winUnlock, /* xUnlock */ + winCheckReservedLock, /* xCheckReservedLock */ + winFileControl, /* xFileControl */ + winSectorSize, /* xSectorSize */ + winDeviceCharacteristics, /* xDeviceCharacteristics */ + winShmMap, /* xShmMap */ + winShmLock, /* xShmLock */ + winShmBarrier, /* xShmBarrier */ + winShmUnmap, /* xShmUnmap */ + winFetch, /* xFetch */ + winUnfetch /* xUnfetch */ +}; + +/* +** This vector defines all the methods that can operate on an +** sqlite3_file for win32 without performing any locking. +*/ +static const sqlite3_io_methods winIoNolockMethod = { + 3, /* iVersion */ + winClose, /* xClose */ + winRead, /* xRead */ + winWrite, /* xWrite */ + winTruncate, /* xTruncate */ + winSync, /* xSync */ + winFileSize, /* xFileSize */ + winNolockLock, /* xLock */ + winNolockUnlock, /* xUnlock */ + winNolockCheckReservedLock, /* xCheckReservedLock */ + winFileControl, /* xFileControl */ + winSectorSize, /* xSectorSize */ + winDeviceCharacteristics, /* xDeviceCharacteristics */ + winShmMap, /* xShmMap */ + winShmLock, /* xShmLock */ + winShmBarrier, /* xShmBarrier */ + winShmUnmap, /* xShmUnmap */ + winFetch, /* xFetch */ + winUnfetch /* xUnfetch */ +}; + +static winVfsAppData winAppData = { + &winIoMethod, /* pMethod */ + 0, /* pAppData */ + 0 /* bNoLock */ +}; + +static winVfsAppData winNolockAppData = { + &winIoNolockMethod, /* pMethod */ + 0, /* pAppData */ + 1 /* bNoLock */ +}; + +/**************************************************************************** +**************************** sqlite3_vfs methods **************************** +** +** This division contains the implementation of methods on the +** sqlite3_vfs object. +*/ + +#if defined(__CYGWIN__) +/* +** Convert a filename from whatever the underlying operating system +** supports for filenames into UTF-8. Space to hold the result is +** obtained from malloc and must be freed by the calling function. +*/ +static char *winConvertToUtf8Filename(const void *zFilename){ + char *zConverted = 0; + if( osIsNT() ){ + zConverted = winUnicodeToUtf8(zFilename); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + zConverted = winMbcsToUtf8(zFilename, osAreFileApisANSI()); + } +#endif + /* caller will handle out of memory */ + return zConverted; +} +#endif + +/* +** Convert a UTF-8 filename into whatever form the underlying +** operating system wants filenames in. Space to hold the result +** is obtained from malloc and must be freed by the calling +** function. +*/ +static void *winConvertFromUtf8Filename(const char *zFilename){ + void *zConverted = 0; + if( osIsNT() ){ + zConverted = winUtf8ToUnicode(zFilename); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + zConverted = winUtf8ToMbcs(zFilename, osAreFileApisANSI()); + } +#endif + /* caller will handle out of memory */ + return zConverted; +} + +/* +** This function returns non-zero if the specified UTF-8 string buffer +** ends with a directory separator character or one was successfully +** added to it. +*/ +static int winMakeEndInDirSep(int nBuf, char *zBuf){ + if( zBuf ){ + int nLen = sqlite3Strlen30(zBuf); + if( nLen>0 ){ + if( winIsDirSep(zBuf[nLen-1]) ){ + return 1; + }else if( nLen+1mxPathname; nBuf = nMax + 2; + zBuf = sqlite3MallocZero( nBuf ); + if( !zBuf ){ + OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); + return SQLITE_IOERR_NOMEM_BKPT; + } + + /* Figure out the effective temporary directory. First, check if one + ** has been explicitly set by the application; otherwise, use the one + ** configured by the operating system. + */ + nDir = nMax - (nPre + 15); + assert( nDir>0 ); + if( sqlite3_temp_directory ){ + int nDirLen = sqlite3Strlen30(sqlite3_temp_directory); + if( nDirLen>0 ){ + if( !winIsDirSep(sqlite3_temp_directory[nDirLen-1]) ){ + nDirLen++; + } + if( nDirLen>nDir ){ + sqlite3_free(zBuf); + OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n")); + return winLogError(SQLITE_ERROR, 0, "winGetTempname1", 0); + } + sqlite3_snprintf(nMax, zBuf, "%s", sqlite3_temp_directory); + } + } +#if defined(__CYGWIN__) + else{ + static const char *azDirs[] = { + 0, /* getenv("SQLITE_TMPDIR") */ + 0, /* getenv("TMPDIR") */ + 0, /* getenv("TMP") */ + 0, /* getenv("TEMP") */ + 0, /* getenv("USERPROFILE") */ + "/var/tmp", + "/usr/tmp", + "/tmp", + ".", + 0 /* List terminator */ + }; + unsigned int i; + const char *zDir = 0; + + if( !azDirs[0] ) azDirs[0] = getenv("SQLITE_TMPDIR"); + if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR"); + if( !azDirs[2] ) azDirs[2] = getenv("TMP"); + if( !azDirs[3] ) azDirs[3] = getenv("TEMP"); + if( !azDirs[4] ) azDirs[4] = getenv("USERPROFILE"); + for(i=0; i/etilqs_XXXXXXXXXXXXXXX\0\0" + ** + ** If not, return SQLITE_ERROR. The number 17 is used here in order to + ** account for the space used by the 15 character random suffix and the + ** two trailing NUL characters. The final directory separator character + ** has already added if it was not already present. + */ + nLen = sqlite3Strlen30(zBuf); + if( (nLen + nPre + 17) > nBuf ){ + sqlite3_free(zBuf); + OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n")); + return winLogError(SQLITE_ERROR, 0, "winGetTempname5", 0); + } + + sqlite3_snprintf(nBuf-16-nLen, zBuf+nLen, SQLITE_TEMP_FILE_PREFIX); + + j = sqlite3Strlen30(zBuf); + sqlite3_randomness(15, &zBuf[j]); + for(i=0; i<15; i++, j++){ + zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; + } + zBuf[j] = 0; + zBuf[j+1] = 0; + *pzBuf = zBuf; + + OSTRACE(("TEMP-FILENAME name=%s, rc=SQLITE_OK\n", zBuf)); + return SQLITE_OK; +} + +/* +** Return TRUE if the named file is really a directory. Return false if +** it is something other than a directory, or if there is any kind of memory +** allocation failure. +*/ +static int winIsDir(const void *zConverted){ + DWORD attr; + int rc = 0; + DWORD lastErrno; + + if( osIsNT() ){ + int cnt = 0; + WIN32_FILE_ATTRIBUTE_DATA sAttrData; + memset(&sAttrData, 0, sizeof(sAttrData)); + while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted, + GetFileExInfoStandard, + &sAttrData)) && winRetryIoerr(&cnt, &lastErrno) ){} + if( !rc ){ + return 0; /* Invalid name? */ + } + attr = sAttrData.dwFileAttributes; +#if SQLITE_OS_WINCE==0 + }else{ + attr = osGetFileAttributesA((char*)zConverted); +#endif + } + return (attr!=INVALID_FILE_ATTRIBUTES) && (attr&FILE_ATTRIBUTE_DIRECTORY); +} + +/* forward reference */ +static int winAccess( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to check */ + int flags, /* Type of test to make on this file */ + int *pResOut /* OUT: Result */ +); + +/* +** Open a file. +*/ +static int winOpen( + sqlite3_vfs *pVfs, /* Used to get maximum path length and AppData */ + const char *zName, /* Name of the file (UTF-8) */ + sqlite3_file *id, /* Write the SQLite file handle here */ + int flags, /* Open mode flags */ + int *pOutFlags /* Status return flags */ +){ + HANDLE h; + DWORD lastErrno = 0; + DWORD dwDesiredAccess; + DWORD dwShareMode; + DWORD dwCreationDisposition; + DWORD dwFlagsAndAttributes = 0; +#if SQLITE_OS_WINCE + int isTemp = 0; +#endif + winVfsAppData *pAppData; + winFile *pFile = (winFile*)id; + void *zConverted; /* Filename in OS encoding */ + const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */ + int cnt = 0; + + /* If argument zPath is a NULL pointer, this function is required to open + ** a temporary file. Use this buffer to store the file name in. + */ + char *zTmpname = 0; /* For temporary filename, if necessary. */ + + int rc = SQLITE_OK; /* Function Return Code */ +#if !defined(NDEBUG) || SQLITE_OS_WINCE + int eType = flags&0xFFFFFF00; /* Type of file to open */ +#endif + + int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); + int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); + int isCreate = (flags & SQLITE_OPEN_CREATE); + int isReadonly = (flags & SQLITE_OPEN_READONLY); + int isReadWrite = (flags & SQLITE_OPEN_READWRITE); + +#ifndef NDEBUG + int isOpenJournal = (isCreate && ( + eType==SQLITE_OPEN_MASTER_JOURNAL + || eType==SQLITE_OPEN_MAIN_JOURNAL + || eType==SQLITE_OPEN_WAL + )); +#endif + + OSTRACE(("OPEN name=%s, pFile=%p, flags=%x, pOutFlags=%p\n", + zUtf8Name, id, flags, pOutFlags)); + + /* Check the following statements are true: + ** + ** (a) Exactly one of the READWRITE and READONLY flags must be set, and + ** (b) if CREATE is set, then READWRITE must also be set, and + ** (c) if EXCLUSIVE is set, then CREATE must also be set. + ** (d) if DELETEONCLOSE is set, then CREATE must also be set. + */ + assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); + assert(isCreate==0 || isReadWrite); + assert(isExclusive==0 || isCreate); + assert(isDelete==0 || isCreate); + + /* The main DB, main journal, WAL file and master journal are never + ** automatically deleted. Nor are they ever temporary files. */ + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MASTER_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL ); + + /* Assert that the upper layer has set one of the "file-type" flags. */ + assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB + || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL + || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL + || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL + ); + + assert( pFile!=0 ); + memset(pFile, 0, sizeof(winFile)); + pFile->h = INVALID_HANDLE_VALUE; + +#if SQLITE_OS_WINRT + if( !zUtf8Name && !sqlite3_temp_directory ){ + sqlite3_log(SQLITE_ERROR, + "sqlite3_temp_directory variable should be set for WinRT"); + } +#endif + + /* If the second argument to this function is NULL, generate a + ** temporary file name to use + */ + if( !zUtf8Name ){ + assert( isDelete && !isOpenJournal ); + rc = winGetTempname(pVfs, &zTmpname); + if( rc!=SQLITE_OK ){ + OSTRACE(("OPEN name=%s, rc=%s", zUtf8Name, sqlite3ErrName(rc))); + return rc; + } + zUtf8Name = zTmpname; + } + + /* Database filenames are double-zero terminated if they are not + ** URIs with parameters. Hence, they can always be passed into + ** sqlite3_uri_parameter(). + */ + assert( (eType!=SQLITE_OPEN_MAIN_DB) || (flags & SQLITE_OPEN_URI) || + zUtf8Name[sqlite3Strlen30(zUtf8Name)+1]==0 ); + + /* Convert the filename to the system encoding. */ + zConverted = winConvertFromUtf8Filename(zUtf8Name); + if( zConverted==0 ){ + sqlite3_free(zTmpname); + OSTRACE(("OPEN name=%s, rc=SQLITE_IOERR_NOMEM", zUtf8Name)); + return SQLITE_IOERR_NOMEM_BKPT; + } + + if( winIsDir(zConverted) ){ + sqlite3_free(zConverted); + sqlite3_free(zTmpname); + OSTRACE(("OPEN name=%s, rc=SQLITE_CANTOPEN_ISDIR", zUtf8Name)); + return SQLITE_CANTOPEN_ISDIR; + } + + if( isReadWrite ){ + dwDesiredAccess = GENERIC_READ | GENERIC_WRITE; + }else{ + dwDesiredAccess = GENERIC_READ; + } + + /* SQLITE_OPEN_EXCLUSIVE is used to make sure that a new file is + ** created. SQLite doesn't use it to indicate "exclusive access" + ** as it is usually understood. + */ + if( isExclusive ){ + /* Creates a new file, only if it does not already exist. */ + /* If the file exists, it fails. */ + dwCreationDisposition = CREATE_NEW; + }else if( isCreate ){ + /* Open existing file, or create if it doesn't exist */ + dwCreationDisposition = OPEN_ALWAYS; + }else{ + /* Opens a file, only if it exists. */ + dwCreationDisposition = OPEN_EXISTING; + } + + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; + + if( isDelete ){ +#if SQLITE_OS_WINCE + dwFlagsAndAttributes = FILE_ATTRIBUTE_HIDDEN; + isTemp = 1; +#else + dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY + | FILE_ATTRIBUTE_HIDDEN + | FILE_FLAG_DELETE_ON_CLOSE; +#endif + }else{ + dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; + } + /* Reports from the internet are that performance is always + ** better if FILE_FLAG_RANDOM_ACCESS is used. Ticket #2699. */ +#if SQLITE_OS_WINCE + dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS; +#endif + + if( osIsNT() ){ +#if SQLITE_OS_WINRT + CREATEFILE2_EXTENDED_PARAMETERS extendedParameters; + extendedParameters.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS); + extendedParameters.dwFileAttributes = + dwFlagsAndAttributes & FILE_ATTRIBUTE_MASK; + extendedParameters.dwFileFlags = dwFlagsAndAttributes & FILE_FLAG_MASK; + extendedParameters.dwSecurityQosFlags = SECURITY_ANONYMOUS; + extendedParameters.lpSecurityAttributes = NULL; + extendedParameters.hTemplateFile = NULL; + do{ + h = osCreateFile2((LPCWSTR)zConverted, + dwDesiredAccess, + dwShareMode, + dwCreationDisposition, + &extendedParameters); + if( h!=INVALID_HANDLE_VALUE ) break; + if( isReadWrite ){ + int rc2, isRO = 0; + sqlite3BeginBenignMalloc(); + rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + sqlite3EndBenignMalloc(); + if( rc2==SQLITE_OK && isRO ) break; + } + }while( winRetryIoerr(&cnt, &lastErrno) ); +#else + do{ + h = osCreateFileW((LPCWSTR)zConverted, + dwDesiredAccess, + dwShareMode, NULL, + dwCreationDisposition, + dwFlagsAndAttributes, + NULL); + if( h!=INVALID_HANDLE_VALUE ) break; + if( isReadWrite ){ + int rc2, isRO = 0; + sqlite3BeginBenignMalloc(); + rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + sqlite3EndBenignMalloc(); + if( rc2==SQLITE_OK && isRO ) break; + } + }while( winRetryIoerr(&cnt, &lastErrno) ); +#endif + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + do{ + h = osCreateFileA((LPCSTR)zConverted, + dwDesiredAccess, + dwShareMode, NULL, + dwCreationDisposition, + dwFlagsAndAttributes, + NULL); + if( h!=INVALID_HANDLE_VALUE ) break; + if( isReadWrite ){ + int rc2, isRO = 0; + sqlite3BeginBenignMalloc(); + rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + sqlite3EndBenignMalloc(); + if( rc2==SQLITE_OK && isRO ) break; + } + }while( winRetryIoerr(&cnt, &lastErrno) ); + } +#endif + winLogIoerr(cnt, __LINE__); + + OSTRACE(("OPEN file=%p, name=%s, access=%lx, rc=%s\n", h, zUtf8Name, + dwDesiredAccess, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok")); + + if( h==INVALID_HANDLE_VALUE ){ + sqlite3_free(zConverted); + sqlite3_free(zTmpname); + if( isReadWrite && !isExclusive ){ + return winOpen(pVfs, zName, id, + ((flags|SQLITE_OPEN_READONLY) & + ~(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE)), + pOutFlags); + }else{ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_CANTOPEN, pFile->lastErrno, "winOpen", zUtf8Name); + return SQLITE_CANTOPEN_BKPT; + } + } + + if( pOutFlags ){ + if( isReadWrite ){ + *pOutFlags = SQLITE_OPEN_READWRITE; + }else{ + *pOutFlags = SQLITE_OPEN_READONLY; + } + } + + OSTRACE(("OPEN file=%p, name=%s, access=%lx, pOutFlags=%p, *pOutFlags=%d, " + "rc=%s\n", h, zUtf8Name, dwDesiredAccess, pOutFlags, pOutFlags ? + *pOutFlags : 0, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok")); + + pAppData = (winVfsAppData*)pVfs->pAppData; + +#if SQLITE_OS_WINCE + { + if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB + && ((pAppData==NULL) || !pAppData->bNoLock) + && (rc = winceCreateLock(zName, pFile))!=SQLITE_OK + ){ + osCloseHandle(h); + sqlite3_free(zConverted); + sqlite3_free(zTmpname); + OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc))); + return rc; + } + } + if( isTemp ){ + pFile->zDeleteOnClose = zConverted; + }else +#endif + { + sqlite3_free(zConverted); + } + + sqlite3_free(zTmpname); + pFile->pMethod = pAppData ? pAppData->pMethod : &winIoMethod; + pFile->pVfs = pVfs; + pFile->h = h; + if( isReadonly ){ + pFile->ctrlFlags |= WINFILE_RDONLY; + } + if( (flags & SQLITE_OPEN_MAIN_DB) + && sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) + ){ + pFile->ctrlFlags |= WINFILE_PSOW; + } + pFile->lastErrno = NO_ERROR; + pFile->zPath = zName; +#if SQLITE_MAX_MMAP_SIZE>0 + pFile->hMap = NULL; + pFile->pMapRegion = 0; + pFile->mmapSize = 0; + pFile->mmapSizeMax = sqlite3GlobalConfig.szMmap; +#endif + + OpenCounter(+1); + return rc; +} + +/* +** Delete the named file. +** +** Note that Windows does not allow a file to be deleted if some other +** process has it open. Sometimes a virus scanner or indexing program +** will open a journal file shortly after it is created in order to do +** whatever it does. While this other process is holding the +** file open, we will be unable to delete it. To work around this +** problem, we delay 100 milliseconds and try to delete again. Up +** to MX_DELETION_ATTEMPTs deletion attempts are run before giving +** up and returning an error. +*/ +static int winDelete( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to delete */ + int syncDir /* Not used on win32 */ +){ + int cnt = 0; + int rc; + DWORD attr; + DWORD lastErrno = 0; + void *zConverted; + UNUSED_PARAMETER(pVfs); + UNUSED_PARAMETER(syncDir); + + SimulateIOError(return SQLITE_IOERR_DELETE); + OSTRACE(("DELETE name=%s, syncDir=%d\n", zFilename, syncDir)); + + zConverted = winConvertFromUtf8Filename(zFilename); + if( zConverted==0 ){ + OSTRACE(("DELETE name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); + return SQLITE_IOERR_NOMEM_BKPT; + } + if( osIsNT() ){ + do { +#if SQLITE_OS_WINRT + WIN32_FILE_ATTRIBUTE_DATA sAttrData; + memset(&sAttrData, 0, sizeof(sAttrData)); + if ( osGetFileAttributesExW(zConverted, GetFileExInfoStandard, + &sAttrData) ){ + attr = sAttrData.dwFileAttributes; + }else{ + lastErrno = osGetLastError(); + if( lastErrno==ERROR_FILE_NOT_FOUND + || lastErrno==ERROR_PATH_NOT_FOUND ){ + rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ + }else{ + rc = SQLITE_ERROR; + } + break; + } +#else + attr = osGetFileAttributesW(zConverted); +#endif + if ( attr==INVALID_FILE_ATTRIBUTES ){ + lastErrno = osGetLastError(); + if( lastErrno==ERROR_FILE_NOT_FOUND + || lastErrno==ERROR_PATH_NOT_FOUND ){ + rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ + }else{ + rc = SQLITE_ERROR; + } + break; + } + if ( attr&FILE_ATTRIBUTE_DIRECTORY ){ + rc = SQLITE_ERROR; /* Files only. */ + break; + } + if ( osDeleteFileW(zConverted) ){ + rc = SQLITE_OK; /* Deleted OK. */ + break; + } + if ( !winRetryIoerr(&cnt, &lastErrno) ){ + rc = SQLITE_ERROR; /* No more retries. */ + break; + } + } while(1); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + do { + attr = osGetFileAttributesA(zConverted); + if ( attr==INVALID_FILE_ATTRIBUTES ){ + lastErrno = osGetLastError(); + if( lastErrno==ERROR_FILE_NOT_FOUND + || lastErrno==ERROR_PATH_NOT_FOUND ){ + rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ + }else{ + rc = SQLITE_ERROR; + } + break; + } + if ( attr&FILE_ATTRIBUTE_DIRECTORY ){ + rc = SQLITE_ERROR; /* Files only. */ + break; + } + if ( osDeleteFileA(zConverted) ){ + rc = SQLITE_OK; /* Deleted OK. */ + break; + } + if ( !winRetryIoerr(&cnt, &lastErrno) ){ + rc = SQLITE_ERROR; /* No more retries. */ + break; + } + } while(1); + } +#endif + if( rc && rc!=SQLITE_IOERR_DELETE_NOENT ){ + rc = winLogError(SQLITE_IOERR_DELETE, lastErrno, "winDelete", zFilename); + }else{ + winLogIoerr(cnt, __LINE__); + } + sqlite3_free(zConverted); + OSTRACE(("DELETE name=%s, rc=%s\n", zFilename, sqlite3ErrName(rc))); + return rc; +} + +/* +** Check the existence and status of a file. +*/ +static int winAccess( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to check */ + int flags, /* Type of test to make on this file */ + int *pResOut /* OUT: Result */ +){ + DWORD attr; + int rc = 0; + DWORD lastErrno = 0; + void *zConverted; + UNUSED_PARAMETER(pVfs); + + SimulateIOError( return SQLITE_IOERR_ACCESS; ); + OSTRACE(("ACCESS name=%s, flags=%x, pResOut=%p\n", + zFilename, flags, pResOut)); + + zConverted = winConvertFromUtf8Filename(zFilename); + if( zConverted==0 ){ + OSTRACE(("ACCESS name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); + return SQLITE_IOERR_NOMEM_BKPT; + } + if( osIsNT() ){ + int cnt = 0; + WIN32_FILE_ATTRIBUTE_DATA sAttrData; + memset(&sAttrData, 0, sizeof(sAttrData)); + while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted, + GetFileExInfoStandard, + &sAttrData)) && winRetryIoerr(&cnt, &lastErrno) ){} + if( rc ){ + /* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file + ** as if it does not exist. + */ + if( flags==SQLITE_ACCESS_EXISTS + && sAttrData.nFileSizeHigh==0 + && sAttrData.nFileSizeLow==0 ){ + attr = INVALID_FILE_ATTRIBUTES; + }else{ + attr = sAttrData.dwFileAttributes; + } + }else{ + winLogIoerr(cnt, __LINE__); + if( lastErrno!=ERROR_FILE_NOT_FOUND && lastErrno!=ERROR_PATH_NOT_FOUND ){ + sqlite3_free(zConverted); + return winLogError(SQLITE_IOERR_ACCESS, lastErrno, "winAccess", + zFilename); + }else{ + attr = INVALID_FILE_ATTRIBUTES; + } + } + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + attr = osGetFileAttributesA((char*)zConverted); + } +#endif + sqlite3_free(zConverted); + switch( flags ){ + case SQLITE_ACCESS_READ: + case SQLITE_ACCESS_EXISTS: + rc = attr!=INVALID_FILE_ATTRIBUTES; + break; + case SQLITE_ACCESS_READWRITE: + rc = attr!=INVALID_FILE_ATTRIBUTES && + (attr & FILE_ATTRIBUTE_READONLY)==0; + break; + default: + assert(!"Invalid flags argument"); + } + *pResOut = rc; + OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", + zFilename, pResOut, *pResOut)); + return SQLITE_OK; +} + +/* +** Returns non-zero if the specified path name starts with the "long path" +** prefix. +*/ +static BOOL winIsLongPathPrefix( + const char *zPathname +){ + return ( zPathname[0]=='\\' && zPathname[1]=='\\' + && zPathname[2]=='?' && zPathname[3]=='\\' ); +} + +/* +** Returns non-zero if the specified path name starts with a drive letter +** followed by a colon character. +*/ +static BOOL winIsDriveLetterAndColon( + const char *zPathname +){ + return ( sqlite3Isalpha(zPathname[0]) && zPathname[1]==':' ); +} + +/* +** Returns non-zero if the specified path name should be used verbatim. If +** non-zero is returned from this function, the calling function must simply +** use the provided path name verbatim -OR- resolve it into a full path name +** using the GetFullPathName Win32 API function (if available). +*/ +static BOOL winIsVerbatimPathname( + const char *zPathname +){ + /* + ** If the path name starts with a forward slash or a backslash, it is either + ** a legal UNC name, a volume relative path, or an absolute path name in the + ** "Unix" format on Windows. There is no easy way to differentiate between + ** the final two cases; therefore, we return the safer return value of TRUE + ** so that callers of this function will simply use it verbatim. + */ + if ( winIsDirSep(zPathname[0]) ){ + return TRUE; + } + + /* + ** If the path name starts with a letter and a colon it is either a volume + ** relative path or an absolute path. Callers of this function must not + ** attempt to treat it as a relative path name (i.e. they should simply use + ** it verbatim). + */ + if ( winIsDriveLetterAndColon(zPathname) ){ + return TRUE; + } + + /* + ** If we get to this point, the path name should almost certainly be a purely + ** relative one (i.e. not a UNC name, not absolute, and not volume relative). + */ + return FALSE; +} + +/* +** Turn a relative pathname into a full pathname. Write the full +** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname +** bytes in size. +*/ +static int winFullPathname( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + const char *zRelative, /* Possibly relative input path */ + int nFull, /* Size of output buffer in bytes */ + char *zFull /* Output buffer */ +){ +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) + DWORD nByte; + void *zConverted; + char *zOut; +#endif + + /* If this path name begins with "/X:" or "\\?\", where "X" is any + ** alphabetic character, discard the initial "/" from the pathname. + */ + if( zRelative[0]=='/' && (winIsDriveLetterAndColon(zRelative+1) + || winIsLongPathPrefix(zRelative+1)) ){ + zRelative++; + } + +#if defined(__CYGWIN__) + SimulateIOError( return SQLITE_ERROR ); + UNUSED_PARAMETER(nFull); + assert( nFull>=pVfs->mxPathname ); + if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ + /* + ** NOTE: We are dealing with a relative path name and the data + ** directory has been set. Therefore, use it as the basis + ** for converting the relative path name to an absolute + ** one by prepending the data directory and a slash. + */ + char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); + if( !zOut ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + if( cygwin_conv_path( + (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A) | + CCP_RELATIVE, zRelative, zOut, pVfs->mxPathname+1)<0 ){ + sqlite3_free(zOut); + return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, + "winFullPathname1", zRelative); + }else{ + char *zUtf8 = winConvertToUtf8Filename(zOut); + if( !zUtf8 ){ + sqlite3_free(zOut); + return SQLITE_IOERR_NOMEM_BKPT; + } + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", + sqlite3_data_directory, winGetDirSep(), zUtf8); + sqlite3_free(zUtf8); + sqlite3_free(zOut); + } + }else{ + char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); + if( !zOut ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + if( cygwin_conv_path( + (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A), + zRelative, zOut, pVfs->mxPathname+1)<0 ){ + sqlite3_free(zOut); + return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, + "winFullPathname2", zRelative); + }else{ + char *zUtf8 = winConvertToUtf8Filename(zOut); + if( !zUtf8 ){ + sqlite3_free(zOut); + return SQLITE_IOERR_NOMEM_BKPT; + } + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zUtf8); + sqlite3_free(zUtf8); + sqlite3_free(zOut); + } + } + return SQLITE_OK; +#endif + +#if (SQLITE_OS_WINCE || SQLITE_OS_WINRT) && !defined(__CYGWIN__) + SimulateIOError( return SQLITE_ERROR ); + /* WinCE has no concept of a relative pathname, or so I am told. */ + /* WinRT has no way to convert a relative path to an absolute one. */ + if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ + /* + ** NOTE: We are dealing with a relative path name and the data + ** directory has been set. Therefore, use it as the basis + ** for converting the relative path name to an absolute + ** one by prepending the data directory and a backslash. + */ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", + sqlite3_data_directory, winGetDirSep(), zRelative); + }else{ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zRelative); + } + return SQLITE_OK; +#endif + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this + ** function failing. This function could fail if, for example, the + ** current working directory has been unlinked. + */ + SimulateIOError( return SQLITE_ERROR ); + if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ + /* + ** NOTE: We are dealing with a relative path name and the data + ** directory has been set. Therefore, use it as the basis + ** for converting the relative path name to an absolute + ** one by prepending the data directory and a backslash. + */ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", + sqlite3_data_directory, winGetDirSep(), zRelative); + return SQLITE_OK; + } + zConverted = winConvertFromUtf8Filename(zRelative); + if( zConverted==0 ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + if( osIsNT() ){ + LPWSTR zTemp; + nByte = osGetFullPathNameW((LPCWSTR)zConverted, 0, 0, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname1", zRelative); + } + nByte += 3; + zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); + if( zTemp==0 ){ + sqlite3_free(zConverted); + return SQLITE_IOERR_NOMEM_BKPT; + } + nByte = osGetFullPathNameW((LPCWSTR)zConverted, nByte, zTemp, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + sqlite3_free(zTemp); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname2", zRelative); + } + sqlite3_free(zConverted); + zOut = winUnicodeToUtf8(zTemp); + sqlite3_free(zTemp); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + char *zTemp; + nByte = osGetFullPathNameA((char*)zConverted, 0, 0, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname3", zRelative); + } + nByte += 3; + zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); + if( zTemp==0 ){ + sqlite3_free(zConverted); + return SQLITE_IOERR_NOMEM_BKPT; + } + nByte = osGetFullPathNameA((char*)zConverted, nByte, zTemp, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + sqlite3_free(zTemp); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname4", zRelative); + } + sqlite3_free(zConverted); + zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI()); + sqlite3_free(zTemp); + } +#endif + if( zOut ){ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zOut); + sqlite3_free(zOut); + return SQLITE_OK; + }else{ + return SQLITE_IOERR_NOMEM_BKPT; + } +#endif +} + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Interfaces for opening a shared library, finding entry points +** within the shared library, and closing the shared library. +*/ +static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ + HANDLE h; +#if defined(__CYGWIN__) + int nFull = pVfs->mxPathname+1; + char *zFull = sqlite3MallocZero( nFull ); + void *zConverted = 0; + if( zFull==0 ){ + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + if( winFullPathname(pVfs, zFilename, nFull, zFull)!=SQLITE_OK ){ + sqlite3_free(zFull); + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + zConverted = winConvertFromUtf8Filename(zFull); + sqlite3_free(zFull); +#else + void *zConverted = winConvertFromUtf8Filename(zFilename); + UNUSED_PARAMETER(pVfs); +#endif + if( zConverted==0 ){ + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + if( osIsNT() ){ +#if SQLITE_OS_WINRT + h = osLoadPackagedLibrary((LPCWSTR)zConverted, 0); +#else + h = osLoadLibraryW((LPCWSTR)zConverted); +#endif + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + h = osLoadLibraryA((char*)zConverted); + } +#endif + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)h)); + sqlite3_free(zConverted); + return (void*)h; +} +static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ + UNUSED_PARAMETER(pVfs); + winGetLastErrorMsg(osGetLastError(), nBuf, zBufOut); +} +static void (*winDlSym(sqlite3_vfs *pVfs,void *pH,const char *zSym))(void){ + FARPROC proc; + UNUSED_PARAMETER(pVfs); + proc = osGetProcAddressA((HANDLE)pH, zSym); + OSTRACE(("DLSYM handle=%p, symbol=%s, address=%p\n", + (void*)pH, zSym, (void*)proc)); + return (void(*)(void))proc; +} +static void winDlClose(sqlite3_vfs *pVfs, void *pHandle){ + UNUSED_PARAMETER(pVfs); + osFreeLibrary((HANDLE)pHandle); + OSTRACE(("DLCLOSE handle=%p\n", (void*)pHandle)); +} +#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ + #define winDlOpen 0 + #define winDlError 0 + #define winDlSym 0 + #define winDlClose 0 +#endif + +/* State information for the randomness gatherer. */ +typedef struct EntropyGatherer EntropyGatherer; +struct EntropyGatherer { + unsigned char *a; /* Gather entropy into this buffer */ + int na; /* Size of a[] in bytes */ + int i; /* XOR next input into a[i] */ + int nXor; /* Number of XOR operations done */ +}; + +#if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) +/* Mix sz bytes of entropy into p. */ +static void xorMemory(EntropyGatherer *p, unsigned char *x, int sz){ + int j, k; + for(j=0, k=p->i; ja[k++] ^= x[j]; + if( k>=p->na ) k = 0; + } + p->i = k; + p->nXor += sz; +} +#endif /* !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) */ + +/* +** Write up to nBuf bytes of randomness into zBuf. +*/ +static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ +#if defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS) + UNUSED_PARAMETER(pVfs); + memset(zBuf, 0, nBuf); + return nBuf; +#else + EntropyGatherer e; + UNUSED_PARAMETER(pVfs); + memset(zBuf, 0, nBuf); + e.a = (unsigned char*)zBuf; + e.na = nBuf; + e.nXor = 0; + e.i = 0; + { + SYSTEMTIME x; + osGetSystemTime(&x); + xorMemory(&e, (unsigned char*)&x, sizeof(SYSTEMTIME)); + } + { + DWORD pid = osGetCurrentProcessId(); + xorMemory(&e, (unsigned char*)&pid, sizeof(DWORD)); + } +#if SQLITE_OS_WINRT + { + ULONGLONG cnt = osGetTickCount64(); + xorMemory(&e, (unsigned char*)&cnt, sizeof(ULONGLONG)); + } +#else + { + DWORD cnt = osGetTickCount(); + xorMemory(&e, (unsigned char*)&cnt, sizeof(DWORD)); + } +#endif /* SQLITE_OS_WINRT */ + { + LARGE_INTEGER i; + osQueryPerformanceCounter(&i); + xorMemory(&e, (unsigned char*)&i, sizeof(LARGE_INTEGER)); + } +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { + UUID id; + memset(&id, 0, sizeof(UUID)); + osUuidCreate(&id); + xorMemory(&e, (unsigned char*)&id, sizeof(UUID)); + memset(&id, 0, sizeof(UUID)); + osUuidCreateSequential(&id); + xorMemory(&e, (unsigned char*)&id, sizeof(UUID)); + } +#endif /* !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID */ + return e.nXor>nBuf ? nBuf : e.nXor; +#endif /* defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS) */ +} + + +/* +** Sleep for a little while. Return the amount of time slept. +*/ +static int winSleep(sqlite3_vfs *pVfs, int microsec){ + sqlite3_win32_sleep((microsec+999)/1000); + UNUSED_PARAMETER(pVfs); + return ((microsec+999)/1000)*1000; +} + +/* +** The following variable, if set to a non-zero value, is interpreted as +** the number of seconds since 1970 and is used to set the result of +** sqlite3OsCurrentTime() during testing. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ +#endif + +/* +** Find the current time (in Universal Coordinated Time). Write into *piNow +** the current time and date as a Julian Day number times 86_400_000. In +** other words, write into *piNow the number of milliseconds since the Julian +** epoch of noon in Greenwich on November 24, 4714 B.C according to the +** proleptic Gregorian calendar. +** +** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date +** cannot be found. +*/ +static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){ + /* FILETIME structure is a 64-bit value representing the number of + 100-nanosecond intervals since January 1, 1601 (= JD 2305813.5). + */ + FILETIME ft; + static const sqlite3_int64 winFiletimeEpoch = 23058135*(sqlite3_int64)8640000; +#ifdef SQLITE_TEST + static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000; +#endif + /* 2^32 - to avoid use of LL and warnings in gcc */ + static const sqlite3_int64 max32BitValue = + (sqlite3_int64)2000000000 + (sqlite3_int64)2000000000 + + (sqlite3_int64)294967296; + +#if SQLITE_OS_WINCE + SYSTEMTIME time; + osGetSystemTime(&time); + /* if SystemTimeToFileTime() fails, it returns zero. */ + if (!osSystemTimeToFileTime(&time,&ft)){ + return SQLITE_ERROR; + } +#else + osGetSystemTimeAsFileTime( &ft ); +#endif + + *piNow = winFiletimeEpoch + + ((((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) + + (sqlite3_int64)ft.dwLowDateTime)/(sqlite3_int64)10000; + +#ifdef SQLITE_TEST + if( sqlite3_current_time ){ + *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch; + } +#endif + UNUSED_PARAMETER(pVfs); + return SQLITE_OK; +} + +/* +** Find the current time (in Universal Coordinated Time). Write the +** current time and date as a Julian Day number into *prNow and +** return 0. Return 1 if the time and date cannot be found. +*/ +static int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){ + int rc; + sqlite3_int64 i; + rc = winCurrentTimeInt64(pVfs, &i); + if( !rc ){ + *prNow = i/86400000.0; + } + return rc; +} + +/* +** The idea is that this function works like a combination of +** GetLastError() and FormatMessage() on Windows (or errno and +** strerror_r() on Unix). After an error is returned by an OS +** function, SQLite calls this function with zBuf pointing to +** a buffer of nBuf bytes. The OS layer should populate the +** buffer with a nul-terminated UTF-8 encoded error message +** describing the last IO error to have occurred within the calling +** thread. +** +** If the error message is too large for the supplied buffer, +** it should be truncated. The return value of xGetLastError +** is zero if the error message fits in the buffer, or non-zero +** otherwise (if the message was truncated). If non-zero is returned, +** then it is not necessary to include the nul-terminator character +** in the output buffer. +** +** Not supplying an error message will have no adverse effect +** on SQLite. It is fine to have an implementation that never +** returns an error message: +** +** int xGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ +** assert(zBuf[0]=='\0'); +** return 0; +** } +** +** However if an error message is supplied, it will be incorporated +** by sqlite into the error message available to the user using +** sqlite3_errmsg(), possibly making IO errors easier to debug. +*/ +static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ + DWORD e = osGetLastError(); + UNUSED_PARAMETER(pVfs); + if( nBuf>0 ) winGetLastErrorMsg(e, nBuf, zBuf); + return e; +} + +/* +** Initialize and deinitialize the operating system interface. +*/ +SQLITE_API int sqlite3_os_init(void){ + static sqlite3_vfs winVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32", /* zName */ + &winAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#if defined(SQLITE_WIN32_HAS_WIDE) + static sqlite3_vfs winLongPathVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-longpath", /* zName */ + &winAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#endif + static sqlite3_vfs winNolockVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-none", /* zName */ + &winNolockAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#if defined(SQLITE_WIN32_HAS_WIDE) + static sqlite3_vfs winLongPathNolockVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-longpath-none", /* zName */ + &winNolockAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#endif + + /* Double-check that the aSyscall[] array has been constructed + ** correctly. See ticket [bb3a86e890c8e96ab] */ + assert( ArraySize(aSyscall)==80 ); + + /* get memory map allocation granularity */ + memset(&winSysInfo, 0, sizeof(SYSTEM_INFO)); +#if SQLITE_OS_WINRT + osGetNativeSystemInfo(&winSysInfo); +#else + osGetSystemInfo(&winSysInfo); +#endif + assert( winSysInfo.dwAllocationGranularity>0 ); + assert( winSysInfo.dwPageSize>0 ); + + sqlite3_vfs_register(&winVfs, 1); + +#if defined(SQLITE_WIN32_HAS_WIDE) + sqlite3_vfs_register(&winLongPathVfs, 0); +#endif + + sqlite3_vfs_register(&winNolockVfs, 0); + +#if defined(SQLITE_WIN32_HAS_WIDE) + sqlite3_vfs_register(&winLongPathNolockVfs, 0); +#endif + +#ifndef SQLITE_OMIT_WAL + winBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); +#endif + + return SQLITE_OK; +} + +SQLITE_API int sqlite3_os_end(void){ +#if SQLITE_OS_WINRT + if( sleepObj!=NULL ){ + osCloseHandle(sleepObj); + sleepObj = NULL; + } +#endif + +#ifndef SQLITE_OMIT_WAL + winBigLock = 0; +#endif + + return SQLITE_OK; +} + +#endif /* SQLITE_OS_WIN */ + +/************** End of os_win.c **********************************************/ +/************** Begin file memdb.c *******************************************/ +/* +** 2016-09-07 +** +** 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 implements an in-memory VFS. A database is held as a contiguous +** block of memory. +** +** This file also implements interface sqlite3_serialize() and +** sqlite3_deserialize(). +*/ +/* #include "sqliteInt.h" */ +#ifdef SQLITE_ENABLE_DESERIALIZE + +/* +** Forward declaration of objects used by this utility +*/ +typedef struct sqlite3_vfs MemVfs; +typedef struct MemFile MemFile; + +/* Access to a lower-level VFS that (might) implement dynamic loading, +** access to randomness, etc. +*/ +#define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData)) + +/* An open file */ +struct MemFile { + sqlite3_file base; /* IO methods */ + sqlite3_int64 sz; /* Size of the file */ + sqlite3_int64 szAlloc; /* Space allocated to aData */ + sqlite3_int64 szMax; /* Maximum allowed size of the file */ + unsigned char *aData; /* content of the file */ + int nMmap; /* Number of memory mapped pages */ + unsigned mFlags; /* Flags */ + int eLock; /* Most recent lock against this file */ +}; + +/* +** Methods for MemFile +*/ +static int memdbClose(sqlite3_file*); +static int memdbRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); +static int memdbWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst); +static int memdbTruncate(sqlite3_file*, sqlite3_int64 size); +static int memdbSync(sqlite3_file*, int flags); +static int memdbFileSize(sqlite3_file*, sqlite3_int64 *pSize); +static int memdbLock(sqlite3_file*, int); +/* static int memdbCheckReservedLock(sqlite3_file*, int *pResOut);// not used */ +static int memdbFileControl(sqlite3_file*, int op, void *pArg); +/* static int memdbSectorSize(sqlite3_file*); // not used */ +static int memdbDeviceCharacteristics(sqlite3_file*); +static int memdbFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); +static int memdbUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p); + +/* +** Methods for MemVfs +*/ +static int memdbOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *); +/* static int memdbDelete(sqlite3_vfs*, const char *zName, int syncDir); */ +static int memdbAccess(sqlite3_vfs*, const char *zName, int flags, int *); +static int memdbFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut); +static void *memdbDlOpen(sqlite3_vfs*, const char *zFilename); +static void memdbDlError(sqlite3_vfs*, int nByte, char *zErrMsg); +static void (*memdbDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void); +static void memdbDlClose(sqlite3_vfs*, void*); +static int memdbRandomness(sqlite3_vfs*, int nByte, char *zOut); +static int memdbSleep(sqlite3_vfs*, int microseconds); +/* static int memdbCurrentTime(sqlite3_vfs*, double*); */ +static int memdbGetLastError(sqlite3_vfs*, int, char *); +static int memdbCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*); + +static sqlite3_vfs memdb_vfs = { + 2, /* iVersion */ + 0, /* szOsFile (set when registered) */ + 1024, /* mxPathname */ + 0, /* pNext */ + "memdb", /* zName */ + 0, /* pAppData (set when registered) */ + memdbOpen, /* xOpen */ + 0, /* memdbDelete, */ /* xDelete */ + memdbAccess, /* xAccess */ + memdbFullPathname, /* xFullPathname */ + memdbDlOpen, /* xDlOpen */ + memdbDlError, /* xDlError */ + memdbDlSym, /* xDlSym */ + memdbDlClose, /* xDlClose */ + memdbRandomness, /* xRandomness */ + memdbSleep, /* xSleep */ + 0, /* memdbCurrentTime, */ /* xCurrentTime */ + memdbGetLastError, /* xGetLastError */ + memdbCurrentTimeInt64 /* xCurrentTimeInt64 */ +}; + +static const sqlite3_io_methods memdb_io_methods = { + 3, /* iVersion */ + memdbClose, /* xClose */ + memdbRead, /* xRead */ + memdbWrite, /* xWrite */ + memdbTruncate, /* xTruncate */ + memdbSync, /* xSync */ + memdbFileSize, /* xFileSize */ + memdbLock, /* xLock */ + memdbLock, /* xUnlock - same as xLock in this case */ + 0, /* memdbCheckReservedLock, */ /* xCheckReservedLock */ + memdbFileControl, /* xFileControl */ + 0, /* memdbSectorSize,*/ /* xSectorSize */ + memdbDeviceCharacteristics, /* xDeviceCharacteristics */ + 0, /* xShmMap */ + 0, /* xShmLock */ + 0, /* xShmBarrier */ + 0, /* xShmUnmap */ + memdbFetch, /* xFetch */ + memdbUnfetch /* xUnfetch */ +}; + + + +/* +** Close an memdb-file. +** +** The pData pointer is owned by the application, so there is nothing +** to free. +*/ +static int memdbClose(sqlite3_file *pFile){ + MemFile *p = (MemFile *)pFile; + if( p->mFlags & SQLITE_DESERIALIZE_FREEONCLOSE ) sqlite3_free(p->aData); + return SQLITE_OK; +} + +/* +** Read data from an memdb-file. +*/ +static int memdbRead( + sqlite3_file *pFile, + void *zBuf, + int iAmt, + sqlite_int64 iOfst +){ + MemFile *p = (MemFile *)pFile; + if( iOfst+iAmt>p->sz ){ + memset(zBuf, 0, iAmt); + if( iOfstsz ) memcpy(zBuf, p->aData+iOfst, p->sz - iOfst); + return SQLITE_IOERR_SHORT_READ; + } + memcpy(zBuf, p->aData+iOfst, iAmt); + return SQLITE_OK; +} + +/* +** Try to enlarge the memory allocation to hold at least sz bytes +*/ +static int memdbEnlarge(MemFile *p, sqlite3_int64 newSz){ + unsigned char *pNew; + if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){ + return SQLITE_FULL; + } + if( newSz>p->szMax ){ + return SQLITE_FULL; + } + newSz *= 2; + if( newSz>p->szMax ) newSz = p->szMax; + pNew = sqlite3Realloc(p->aData, newSz); + if( pNew==0 ) return SQLITE_NOMEM; + p->aData = pNew; + p->szAlloc = newSz; + return SQLITE_OK; +} + +/* +** Write data to an memdb-file. +*/ +static int memdbWrite( + sqlite3_file *pFile, + const void *z, + int iAmt, + sqlite_int64 iOfst +){ + MemFile *p = (MemFile *)pFile; + if( NEVER(p->mFlags & SQLITE_DESERIALIZE_READONLY) ) return SQLITE_READONLY; + if( iOfst+iAmt>p->sz ){ + int rc; + if( iOfst+iAmt>p->szAlloc + && (rc = memdbEnlarge(p, iOfst+iAmt))!=SQLITE_OK + ){ + return rc; + } + if( iOfst>p->sz ) memset(p->aData+p->sz, 0, iOfst-p->sz); + p->sz = iOfst+iAmt; + } + memcpy(p->aData+iOfst, z, iAmt); + return SQLITE_OK; +} + +/* +** Truncate an memdb-file. +** +** In rollback mode (which is always the case for memdb, as it does not +** support WAL mode) the truncate() method is only used to reduce +** the size of a file, never to increase the size. +*/ +static int memdbTruncate(sqlite3_file *pFile, sqlite_int64 size){ + MemFile *p = (MemFile *)pFile; + if( NEVER(size>p->sz) ) return SQLITE_FULL; + p->sz = size; + return SQLITE_OK; +} + +/* +** Sync an memdb-file. +*/ +static int memdbSync(sqlite3_file *pFile, int flags){ + return SQLITE_OK; +} + +/* +** Return the current file-size of an memdb-file. +*/ +static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ + MemFile *p = (MemFile *)pFile; + *pSize = p->sz; + return SQLITE_OK; +} + +/* +** Lock an memdb-file. +*/ +static int memdbLock(sqlite3_file *pFile, int eLock){ + MemFile *p = (MemFile *)pFile; + if( eLock>SQLITE_LOCK_SHARED + && (p->mFlags & SQLITE_DESERIALIZE_READONLY)!=0 + ){ + return SQLITE_READONLY; + } + p->eLock = eLock; + return SQLITE_OK; +} + +#if 0 /* Never used because memdbAccess() always returns false */ +/* +** Check if another file-handle holds a RESERVED lock on an memdb-file. +*/ +static int memdbCheckReservedLock(sqlite3_file *pFile, int *pResOut){ + *pResOut = 0; + return SQLITE_OK; +} +#endif + +/* +** File control method. For custom operations on an memdb-file. +*/ +static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){ + MemFile *p = (MemFile *)pFile; + int rc = SQLITE_NOTFOUND; + if( op==SQLITE_FCNTL_VFSNAME ){ + *(char**)pArg = sqlite3_mprintf("memdb(%p,%lld)", p->aData, p->sz); + rc = SQLITE_OK; + } + if( op==SQLITE_FCNTL_SIZE_LIMIT ){ + sqlite3_int64 iLimit = *(sqlite3_int64*)pArg; + if( iLimitsz ){ + if( iLimit<0 ){ + iLimit = p->szMax; + }else{ + iLimit = p->sz; + } + } + p->szMax = iLimit; + *(sqlite3_int64*)pArg = iLimit; + rc = SQLITE_OK; + } + return rc; +} + +#if 0 /* Not used because of SQLITE_IOCAP_POWERSAFE_OVERWRITE */ +/* +** Return the sector-size in bytes for an memdb-file. +*/ +static int memdbSectorSize(sqlite3_file *pFile){ + return 1024; +} +#endif + +/* +** Return the device characteristic flags supported by an memdb-file. +*/ +static int memdbDeviceCharacteristics(sqlite3_file *pFile){ + return SQLITE_IOCAP_ATOMIC | + SQLITE_IOCAP_POWERSAFE_OVERWRITE | + SQLITE_IOCAP_SAFE_APPEND | + SQLITE_IOCAP_SEQUENTIAL; +} + +/* Fetch a page of a memory-mapped file */ +static int memdbFetch( + sqlite3_file *pFile, + sqlite3_int64 iOfst, + int iAmt, + void **pp +){ + MemFile *p = (MemFile *)pFile; + if( iOfst+iAmt>p->sz ){ + *pp = 0; + }else{ + p->nMmap++; + *pp = (void*)(p->aData + iOfst); + } + return SQLITE_OK; +} + +/* Release a memory-mapped page */ +static int memdbUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){ + MemFile *p = (MemFile *)pFile; + p->nMmap--; + return SQLITE_OK; +} + +/* +** Open an mem file handle. +*/ +static int memdbOpen( + sqlite3_vfs *pVfs, + const char *zName, + sqlite3_file *pFile, + int flags, + int *pOutFlags +){ + MemFile *p = (MemFile*)pFile; + if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){ + return ORIGVFS(pVfs)->xOpen(ORIGVFS(pVfs), zName, pFile, flags, pOutFlags); + } + memset(p, 0, sizeof(*p)); + p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE; + assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */ + *pOutFlags = flags | SQLITE_OPEN_MEMORY; + p->base.pMethods = &memdb_io_methods; + p->szMax = sqlite3GlobalConfig.mxMemdbSize; + return SQLITE_OK; +} + +#if 0 /* Only used to delete rollback journals, master journals, and WAL + ** files, none of which exist in memdb. So this routine is never used */ +/* +** Delete the file located at zPath. If the dirSync argument is true, +** ensure the file-system modifications are synced to disk before +** returning. +*/ +static int memdbDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + return SQLITE_IOERR_DELETE; +} +#endif + +/* +** Test for access permissions. Return true if the requested permission +** is available, or false otherwise. +** +** With memdb, no files ever exist on disk. So always return false. +*/ +static int memdbAccess( + sqlite3_vfs *pVfs, + const char *zPath, + int flags, + int *pResOut +){ + *pResOut = 0; + return SQLITE_OK; +} + +/* +** Populate buffer zOut with the full canonical pathname corresponding +** to the pathname in zPath. zOut is guaranteed to point to a buffer +** of at least (INST_MAX_PATHNAME+1) bytes. +*/ +static int memdbFullPathname( + sqlite3_vfs *pVfs, + const char *zPath, + int nOut, + char *zOut +){ + sqlite3_snprintf(nOut, zOut, "%s", zPath); + return SQLITE_OK; +} + +/* +** Open the dynamic library located at zPath and return a handle. +*/ +static void *memdbDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath); +} + +/* +** Populate the buffer zErrMsg (size nByte bytes) with a human readable +** utf-8 string describing the most recent error encountered associated +** with dynamic libraries. +*/ +static void memdbDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ + ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg); +} + +/* +** Return a pointer to the symbol zSymbol in the dynamic library pHandle. +*/ +static void (*memdbDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){ + return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym); +} + +/* +** Close the dynamic library handle pHandle. +*/ +static void memdbDlClose(sqlite3_vfs *pVfs, void *pHandle){ + ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle); +} + +/* +** Populate the buffer pointed to by zBufOut with nByte bytes of +** random data. +*/ +static int memdbRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut); +} + +/* +** Sleep for nMicro microseconds. Return the number of microseconds +** actually slept. +*/ +static int memdbSleep(sqlite3_vfs *pVfs, int nMicro){ + return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro); +} + +#if 0 /* Never used. Modern cores only call xCurrentTimeInt64() */ +/* +** Return the current time as a Julian Day number in *pTimeOut. +*/ +static int memdbCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ + return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut); +} +#endif + +static int memdbGetLastError(sqlite3_vfs *pVfs, int a, char *b){ + return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b); +} +static int memdbCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){ + return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p); +} + +/* +** Translate a database connection pointer and schema name into a +** MemFile pointer. +*/ +static MemFile *memdbFromDbSchema(sqlite3 *db, const char *zSchema){ + MemFile *p = 0; + int rc = sqlite3_file_control(db, zSchema, SQLITE_FCNTL_FILE_POINTER, &p); + if( rc ) return 0; + if( p->base.pMethods!=&memdb_io_methods ) return 0; + return p; +} + +/* +** Return the serialization of a database +*/ +SQLITE_API unsigned char *sqlite3_serialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which database within the connection */ + sqlite3_int64 *piSize, /* Write size here, if not NULL */ + unsigned int mFlags /* Maybe SQLITE_SERIALIZE_NOCOPY */ +){ + MemFile *p; + int iDb; + Btree *pBt; + sqlite3_int64 sz; + int szPage = 0; + sqlite3_stmt *pStmt = 0; + unsigned char *pOut; + char *zSql; + int rc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + if( zSchema==0 ) zSchema = db->aDb[0].zDbSName; + p = memdbFromDbSchema(db, zSchema); + iDb = sqlite3FindDbName(db, zSchema); + if( piSize ) *piSize = -1; + if( iDb<0 ) return 0; + if( p ){ + if( piSize ) *piSize = p->sz; + if( mFlags & SQLITE_SERIALIZE_NOCOPY ){ + pOut = p->aData; + }else{ + pOut = sqlite3_malloc64( p->sz ); + if( pOut ) memcpy(pOut, p->aData, p->sz); + } + return pOut; + } + pBt = db->aDb[iDb].pBt; + if( pBt==0 ) return 0; + szPage = sqlite3BtreeGetPageSize(pBt); + zSql = sqlite3_mprintf("PRAGMA \"%w\".page_count", zSchema); + rc = zSql ? sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) : SQLITE_NOMEM; + sqlite3_free(zSql); + if( rc ) return 0; + rc = sqlite3_step(pStmt); + if( rc!=SQLITE_ROW ){ + pOut = 0; + }else{ + sz = sqlite3_column_int64(pStmt, 0)*szPage; + if( piSize ) *piSize = sz; + if( mFlags & SQLITE_SERIALIZE_NOCOPY ){ + pOut = 0; + }else{ + pOut = sqlite3_malloc64( sz ); + if( pOut ){ + int nPage = sqlite3_column_int(pStmt, 0); + Pager *pPager = sqlite3BtreePager(pBt); + int pgno; + for(pgno=1; pgno<=nPage; pgno++){ + DbPage *pPage = 0; + unsigned char *pTo = pOut + szPage*(sqlite3_int64)(pgno-1); + rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pPage, 0); + if( rc==SQLITE_OK ){ + memcpy(pTo, sqlite3PagerGetData(pPage), szPage); + }else{ + memset(pTo, 0, szPage); + } + sqlite3PagerUnref(pPage); + } + } + } + } + sqlite3_finalize(pStmt); + return pOut; +} + +/* Convert zSchema to a MemDB and initialize its content. +*/ +SQLITE_API int sqlite3_deserialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to reopen with the deserialization */ + unsigned char *pData, /* The serialized database content */ + sqlite3_int64 szDb, /* Number bytes in the deserialization */ + sqlite3_int64 szBuf, /* Total size of buffer pData[] */ + unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */ +){ + MemFile *p; + char *zSql; + sqlite3_stmt *pStmt = 0; + int rc; + int iDb; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + if( szDb<0 ) return SQLITE_MISUSE_BKPT; + if( szBuf<0 ) return SQLITE_MISUSE_BKPT; +#endif + + sqlite3_mutex_enter(db->mutex); + if( zSchema==0 ) zSchema = db->aDb[0].zDbSName; + iDb = sqlite3FindDbName(db, zSchema); + if( iDb<0 ){ + rc = SQLITE_ERROR; + goto end_deserialize; + } + zSql = sqlite3_mprintf("ATTACH x AS %Q", zSchema); + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rc ) goto end_deserialize; + db->init.iDb = (u8)iDb; + db->init.reopenMemdb = 1; + rc = sqlite3_step(pStmt); + db->init.reopenMemdb = 0; + if( rc!=SQLITE_DONE ){ + rc = SQLITE_ERROR; + goto end_deserialize; + } + p = memdbFromDbSchema(db, zSchema); + if( p==0 ){ + rc = SQLITE_ERROR; + }else{ + p->aData = pData; + p->sz = szDb; + p->szAlloc = szBuf; + p->szMax = szBuf; + if( p->szMaxszMax = sqlite3GlobalConfig.mxMemdbSize; + } + p->mFlags = mFlags; + rc = SQLITE_OK; + } + +end_deserialize: + sqlite3_finalize(pStmt); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** This routine is called when the extension is loaded. +** Register the new VFS. +*/ +SQLITE_PRIVATE int sqlite3MemdbInit(void){ + sqlite3_vfs *pLower = sqlite3_vfs_find(0); + int sz = pLower->szOsFile; + memdb_vfs.pAppData = pLower; + /* The following conditional can only be true when compiled for + ** Windows x86 and SQLITE_MAX_MMAP_SIZE=0. We always leave + ** it in, to be safe, but it is marked as NO_TEST since there + ** is no way to reach it under most builds. */ + if( szBITVEC_NBIT and iDivisor==0 then Bitvec.u.aHash[] is +** a hash table that will hold up to BITVEC_MXHASH distinct values. +** +** Otherwise, the value i is redirected into one of BITVEC_NPTR +** sub-bitmaps pointed to by Bitvec.u.apSub[]. Each subbitmap +** handles up to iDivisor separate values of i. apSub[0] holds +** values between 1 and iDivisor. apSub[1] holds values between +** iDivisor+1 and 2*iDivisor. apSub[N] holds values between +** N*iDivisor+1 and (N+1)*iDivisor. Each subbitmap is normalized +** to hold deal with values between 1 and iDivisor. +*/ +struct Bitvec { + u32 iSize; /* Maximum bit index. Max iSize is 4,294,967,296. */ + u32 nSet; /* Number of bits that are set - only valid for aHash + ** element. Max is BITVEC_NINT. For BITVEC_SZ of 512, + ** this would be 125. */ + u32 iDivisor; /* Number of bits handled by each apSub[] entry. */ + /* Should >=0 for apSub element. */ + /* Max iDivisor is max(u32) / BITVEC_NPTR + 1. */ + /* For a BITVEC_SZ of 512, this would be 34,359,739. */ + union { + BITVEC_TELEM aBitmap[BITVEC_NELEM]; /* Bitmap representation */ + u32 aHash[BITVEC_NINT]; /* Hash table representation */ + Bitvec *apSub[BITVEC_NPTR]; /* Recursive representation */ + } u; +}; + +/* +** Create a new bitmap object able to handle bits between 0 and iSize, +** inclusive. Return a pointer to the new object. Return NULL if +** malloc fails. +*/ +SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32 iSize){ + Bitvec *p; + assert( sizeof(*p)==BITVEC_SZ ); + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + p->iSize = iSize; + } + return p; +} + +/* +** Check to see if the i-th bit is set. Return true or false. +** If p is NULL (if the bitmap has not been created) or if +** i is out of range, then return false. +*/ +SQLITE_PRIVATE int sqlite3BitvecTestNotNull(Bitvec *p, u32 i){ + assert( p!=0 ); + i--; + if( i>=p->iSize ) return 0; + while( p->iDivisor ){ + u32 bin = i/p->iDivisor; + i = i%p->iDivisor; + p = p->u.apSub[bin]; + if (!p) { + return 0; + } + } + if( p->iSize<=BITVEC_NBIT ){ + return (p->u.aBitmap[i/BITVEC_SZELEM] & (1<<(i&(BITVEC_SZELEM-1))))!=0; + } else{ + u32 h = BITVEC_HASH(i++); + while( p->u.aHash[h] ){ + if( p->u.aHash[h]==i ) return 1; + h = (h+1) % BITVEC_NINT; + } + return 0; + } +} +SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec *p, u32 i){ + return p!=0 && sqlite3BitvecTestNotNull(p,i); +} + +/* +** Set the i-th bit. Return 0 on success and an error code if +** anything goes wrong. +** +** This routine might cause sub-bitmaps to be allocated. Failing +** to get the memory needed to hold the sub-bitmap is the only +** that can go wrong with an insert, assuming p and i are valid. +** +** The calling function must ensure that p is a valid Bitvec object +** and that the value for "i" is within range of the Bitvec object. +** Otherwise the behavior is undefined. +*/ +SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec *p, u32 i){ + u32 h; + if( p==0 ) return SQLITE_OK; + assert( i>0 ); + assert( i<=p->iSize ); + i--; + while((p->iSize > BITVEC_NBIT) && p->iDivisor) { + u32 bin = i/p->iDivisor; + i = i%p->iDivisor; + if( p->u.apSub[bin]==0 ){ + p->u.apSub[bin] = sqlite3BitvecCreate( p->iDivisor ); + if( p->u.apSub[bin]==0 ) return SQLITE_NOMEM_BKPT; + } + p = p->u.apSub[bin]; + } + if( p->iSize<=BITVEC_NBIT ){ + p->u.aBitmap[i/BITVEC_SZELEM] |= 1 << (i&(BITVEC_SZELEM-1)); + return SQLITE_OK; + } + h = BITVEC_HASH(i++); + /* if there wasn't a hash collision, and this doesn't */ + /* completely fill the hash, then just add it without */ + /* worring about sub-dividing and re-hashing. */ + if( !p->u.aHash[h] ){ + if (p->nSet<(BITVEC_NINT-1)) { + goto bitvec_set_end; + } else { + goto bitvec_set_rehash; + } + } + /* there was a collision, check to see if it's already */ + /* in hash, if not, try to find a spot for it */ + do { + if( p->u.aHash[h]==i ) return SQLITE_OK; + h++; + if( h>=BITVEC_NINT ) h = 0; + } while( p->u.aHash[h] ); + /* we didn't find it in the hash. h points to the first */ + /* available free spot. check to see if this is going to */ + /* make our hash too "full". */ +bitvec_set_rehash: + if( p->nSet>=BITVEC_MXHASH ){ + unsigned int j; + int rc; + u32 *aiValues = sqlite3StackAllocRaw(0, sizeof(p->u.aHash)); + if( aiValues==0 ){ + return SQLITE_NOMEM_BKPT; + }else{ + memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash)); + memset(p->u.apSub, 0, sizeof(p->u.apSub)); + p->iDivisor = (p->iSize + BITVEC_NPTR - 1)/BITVEC_NPTR; + rc = sqlite3BitvecSet(p, i); + for(j=0; jnSet++; + p->u.aHash[h] = i; + return SQLITE_OK; +} + +/* +** Clear the i-th bit. +** +** pBuf must be a pointer to at least BITVEC_SZ bytes of temporary storage +** that BitvecClear can use to rebuilt its hash table. +*/ +SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec *p, u32 i, void *pBuf){ + if( p==0 ) return; + assert( i>0 ); + i--; + while( p->iDivisor ){ + u32 bin = i/p->iDivisor; + i = i%p->iDivisor; + p = p->u.apSub[bin]; + if (!p) { + return; + } + } + if( p->iSize<=BITVEC_NBIT ){ + p->u.aBitmap[i/BITVEC_SZELEM] &= ~(1 << (i&(BITVEC_SZELEM-1))); + }else{ + unsigned int j; + u32 *aiValues = pBuf; + memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash)); + memset(p->u.aHash, 0, sizeof(p->u.aHash)); + p->nSet = 0; + for(j=0; jnSet++; + while( p->u.aHash[h] ){ + h++; + if( h>=BITVEC_NINT ) h = 0; + } + p->u.aHash[h] = aiValues[j]; + } + } + } +} + +/* +** Destroy a bitmap object. Reclaim all memory used. +*/ +SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec *p){ + if( p==0 ) return; + if( p->iDivisor ){ + unsigned int i; + for(i=0; iu.apSub[i]); + } + } + sqlite3_free(p); +} + +/* +** Return the value of the iSize parameter specified when Bitvec *p +** was created. +*/ +SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ + return p->iSize; +} + +#ifndef SQLITE_UNTESTABLE +/* +** Let V[] be an array of unsigned characters sufficient to hold +** up to N bits. Let I be an integer between 0 and N. 0<=I>3] |= (1<<(I&7)) +#define CLEARBIT(V,I) V[I>>3] &= ~(1<<(I&7)) +#define TESTBIT(V,I) (V[I>>3]&(1<<(I&7)))!=0 + +/* +** This routine runs an extensive test of the Bitvec code. +** +** The input is an array of integers that acts as a program +** to test the Bitvec. The integers are opcodes followed +** by 0, 1, or 3 operands, depending on the opcode. Another +** opcode follows immediately after the last operand. +** +** There are 6 opcodes numbered from 0 through 5. 0 is the +** "halt" opcode and causes the test to end. +** +** 0 Halt and return the number of errors +** 1 N S X Set N bits beginning with S and incrementing by X +** 2 N S X Clear N bits beginning with S and incrementing by X +** 3 N Set N randomly chosen bits +** 4 N Clear N randomly chosen bits +** 5 N S X Set N bits from S increment X in array only, not in bitvec +** +** The opcodes 1 through 4 perform set and clear operations are performed +** on both a Bitvec object and on a linear array of bits obtained from malloc. +** Opcode 5 works on the linear array only, not on the Bitvec. +** Opcode 5 is used to deliberately induce a fault in order to +** confirm that error detection works. +** +** At the conclusion of the test the linear array is compared +** against the Bitvec object. If there are any differences, +** an error is returned. If they are the same, zero is returned. +** +** If a memory allocation error occurs, return -1. +*/ +SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ + Bitvec *pBitvec = 0; + unsigned char *pV = 0; + int rc = -1; + int i, nx, pc, op; + void *pTmpSpace; + + /* Allocate the Bitvec to be tested and a linear array of + ** bits to act as the reference */ + pBitvec = sqlite3BitvecCreate( sz ); + pV = sqlite3MallocZero( (sz+7)/8 + 1 ); + pTmpSpace = sqlite3_malloc64(BITVEC_SZ); + if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end; + + /* NULL pBitvec tests */ + sqlite3BitvecSet(0, 1); + sqlite3BitvecClear(0, 1, pTmpSpace); + + /* Run the program */ + pc = 0; + while( (op = aOp[pc])!=0 ){ + switch( op ){ + case 1: + case 2: + case 5: { + nx = 4; + i = aOp[pc+2] - 1; + aOp[pc+2] += aOp[pc+3]; + break; + } + case 3: + case 4: + default: { + nx = 2; + sqlite3_randomness(sizeof(i), &i); + break; + } + } + if( (--aOp[pc+1]) > 0 ) nx = 0; + pc += nx; + i = (i & 0x7fffffff)%sz; + if( (op & 1)!=0 ){ + SETBIT(pV, (i+1)); + if( op!=5 ){ + if( sqlite3BitvecSet(pBitvec, i+1) ) goto bitvec_end; + } + }else{ + CLEARBIT(pV, (i+1)); + sqlite3BitvecClear(pBitvec, i+1, pTmpSpace); + } + } + + /* Test to make sure the linear array exactly matches the + ** Bitvec object. Start with the assumption that they do + ** match (rc==0). Change rc to non-zero if a discrepancy + ** is found. + */ + rc = sqlite3BitvecTest(0,0) + sqlite3BitvecTest(pBitvec, sz+1) + + sqlite3BitvecTest(pBitvec, 0) + + (sqlite3BitvecSize(pBitvec) - sz); + for(i=1; i<=sz; i++){ + if( (TESTBIT(pV,i))!=sqlite3BitvecTest(pBitvec,i) ){ + rc = i; + break; + } + } + + /* Free allocated structure */ +bitvec_end: + sqlite3_free(pTmpSpace); + sqlite3_free(pV); + sqlite3BitvecDestroy(pBitvec); + return rc; +} +#endif /* SQLITE_UNTESTABLE */ + +/************** End of bitvec.c **********************************************/ +/************** Begin file pcache.c ******************************************/ +/* +** 2008 August 05 +** +** 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 implements that page cache. +*/ +/* #include "sqliteInt.h" */ + +/* +** A complete page cache is an instance of this structure. Every +** entry in the cache holds a single page of the database file. The +** btree layer only operates on the cached copy of the database pages. +** +** A page cache entry is "clean" if it exactly matches what is currently +** on disk. A page is "dirty" if it has been modified and needs to be +** persisted to disk. +** +** pDirty, pDirtyTail, pSynced: +** All dirty pages are linked into the doubly linked list using +** PgHdr.pDirtyNext and pDirtyPrev. The list is maintained in LRU order +** such that p was added to the list more recently than p->pDirtyNext. +** PCache.pDirty points to the first (newest) element in the list and +** pDirtyTail to the last (oldest). +** +** The PCache.pSynced variable is used to optimize searching for a dirty +** page to eject from the cache mid-transaction. It is better to eject +** a page that does not require a journal sync than one that does. +** Therefore, pSynced is maintained so that it *almost* always points +** to either the oldest page in the pDirty/pDirtyTail list that has a +** clear PGHDR_NEED_SYNC flag or to a page that is older than this one +** (so that the right page to eject can be found by following pDirtyPrev +** pointers). +*/ +struct PCache { + PgHdr *pDirty, *pDirtyTail; /* List of dirty pages in LRU order */ + PgHdr *pSynced; /* Last synced page in dirty page list */ + int nRefSum; /* Sum of ref counts over all pages */ + int szCache; /* Configured cache size */ + int szSpill; /* Size before spilling occurs */ + int szPage; /* Size of every page in this cache */ + int szExtra; /* Size of extra space for each page */ + u8 bPurgeable; /* True if pages are on backing store */ + u8 eCreate; /* eCreate value for for xFetch() */ + int (*xStress)(void*,PgHdr*); /* Call to try make a page clean */ + void *pStress; /* Argument to xStress */ + sqlite3_pcache *pCache; /* Pluggable cache module */ +}; + +/********************************** Test and Debug Logic **********************/ +/* +** Debug tracing macros. Enable by by changing the "0" to "1" and +** recompiling. +** +** When sqlite3PcacheTrace is 1, single line trace messages are issued. +** When sqlite3PcacheTrace is 2, a dump of the pcache showing all cache entries +** is displayed for many operations, resulting in a lot of output. +*/ +#if defined(SQLITE_DEBUG) && 0 + int sqlite3PcacheTrace = 2; /* 0: off 1: simple 2: cache dumps */ + int sqlite3PcacheMxDump = 9999; /* Max cache entries for pcacheDump() */ +# define pcacheTrace(X) if(sqlite3PcacheTrace){sqlite3DebugPrintf X;} + void pcacheDump(PCache *pCache){ + int N; + int i, j; + sqlite3_pcache_page *pLower; + PgHdr *pPg; + unsigned char *a; + + if( sqlite3PcacheTrace<2 ) return; + if( pCache->pCache==0 ) return; + N = sqlite3PcachePagecount(pCache); + if( N>sqlite3PcacheMxDump ) N = sqlite3PcacheMxDump; + for(i=1; i<=N; i++){ + pLower = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, i, 0); + if( pLower==0 ) continue; + pPg = (PgHdr*)pLower->pExtra; + printf("%3d: nRef %2d flgs %02x data ", i, pPg->nRef, pPg->flags); + a = (unsigned char *)pLower->pBuf; + for(j=0; j<12; j++) printf("%02x", a[j]); + printf("\n"); + if( pPg->pPage==0 ){ + sqlite3GlobalConfig.pcache2.xUnpin(pCache->pCache, pLower, 0); + } + } + } + #else +# define pcacheTrace(X) +# define pcacheDump(X) +#endif + +/* +** Check invariants on a PgHdr entry. Return true if everything is OK. +** Return false if any invariant is violated. +** +** This routine is for use inside of assert() statements only. For +** example: +** +** assert( sqlite3PcachePageSanity(pPg) ); +*/ +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr *pPg){ + PCache *pCache; + assert( pPg!=0 ); + assert( pPg->pgno>0 || pPg->pPager==0 ); /* Page number is 1 or more */ + pCache = pPg->pCache; + assert( pCache!=0 ); /* Every page has an associated PCache */ + if( pPg->flags & PGHDR_CLEAN ){ + assert( (pPg->flags & PGHDR_DIRTY)==0 );/* Cannot be both CLEAN and DIRTY */ + assert( pCache->pDirty!=pPg ); /* CLEAN pages not on dirty list */ + assert( pCache->pDirtyTail!=pPg ); + } + /* WRITEABLE pages must also be DIRTY */ + if( pPg->flags & PGHDR_WRITEABLE ){ + assert( pPg->flags & PGHDR_DIRTY ); /* WRITEABLE implies DIRTY */ + } + /* NEED_SYNC can be set independently of WRITEABLE. This can happen, + ** for example, when using the sqlite3PagerDontWrite() optimization: + ** (1) Page X is journalled, and gets WRITEABLE and NEED_SEEK. + ** (2) Page X moved to freelist, WRITEABLE is cleared + ** (3) Page X reused, WRITEABLE is set again + ** If NEED_SYNC had been cleared in step 2, then it would not be reset + ** in step 3, and page might be written into the database without first + ** syncing the rollback journal, which might cause corruption on a power + ** loss. + ** + ** Another example is when the database page size is smaller than the + ** disk sector size. When any page of a sector is journalled, all pages + ** in that sector are marked NEED_SYNC even if they are still CLEAN, just + ** in case they are later modified, since all pages in the same sector + ** must be journalled and synced before any of those pages can be safely + ** written. + */ + return 1; +} +#endif /* SQLITE_DEBUG */ + + +/********************************** Linked List Management ********************/ + +/* Allowed values for second argument to pcacheManageDirtyList() */ +#define PCACHE_DIRTYLIST_REMOVE 1 /* Remove pPage from dirty list */ +#define PCACHE_DIRTYLIST_ADD 2 /* Add pPage to the dirty list */ +#define PCACHE_DIRTYLIST_FRONT 3 /* Move pPage to the front of the list */ + +/* +** Manage pPage's participation on the dirty list. Bits of the addRemove +** argument determines what operation to do. The 0x01 bit means first +** remove pPage from the dirty list. The 0x02 means add pPage back to +** the dirty list. Doing both moves pPage to the front of the dirty list. +*/ +static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ + PCache *p = pPage->pCache; + + pcacheTrace(("%p.DIRTYLIST.%s %d\n", p, + addRemove==1 ? "REMOVE" : addRemove==2 ? "ADD" : "FRONT", + pPage->pgno)); + if( addRemove & PCACHE_DIRTYLIST_REMOVE ){ + assert( pPage->pDirtyNext || pPage==p->pDirtyTail ); + assert( pPage->pDirtyPrev || pPage==p->pDirty ); + + /* Update the PCache1.pSynced variable if necessary. */ + if( p->pSynced==pPage ){ + p->pSynced = pPage->pDirtyPrev; + } + + if( pPage->pDirtyNext ){ + pPage->pDirtyNext->pDirtyPrev = pPage->pDirtyPrev; + }else{ + assert( pPage==p->pDirtyTail ); + p->pDirtyTail = pPage->pDirtyPrev; + } + if( pPage->pDirtyPrev ){ + pPage->pDirtyPrev->pDirtyNext = pPage->pDirtyNext; + }else{ + /* If there are now no dirty pages in the cache, set eCreate to 2. + ** This is an optimization that allows sqlite3PcacheFetch() to skip + ** searching for a dirty page to eject from the cache when it might + ** otherwise have to. */ + assert( pPage==p->pDirty ); + p->pDirty = pPage->pDirtyNext; + assert( p->bPurgeable || p->eCreate==2 ); + if( p->pDirty==0 ){ /*OPTIMIZATION-IF-TRUE*/ + assert( p->bPurgeable==0 || p->eCreate==1 ); + p->eCreate = 2; + } + } + } + if( addRemove & PCACHE_DIRTYLIST_ADD ){ + pPage->pDirtyPrev = 0; + pPage->pDirtyNext = p->pDirty; + if( pPage->pDirtyNext ){ + assert( pPage->pDirtyNext->pDirtyPrev==0 ); + pPage->pDirtyNext->pDirtyPrev = pPage; + }else{ + p->pDirtyTail = pPage; + if( p->bPurgeable ){ + assert( p->eCreate==2 ); + p->eCreate = 1; + } + } + p->pDirty = pPage; + + /* If pSynced is NULL and this page has a clear NEED_SYNC flag, set + ** pSynced to point to it. Checking the NEED_SYNC flag is an + ** optimization, as if pSynced points to a page with the NEED_SYNC + ** flag set sqlite3PcacheFetchStress() searches through all newer + ** entries of the dirty-list for a page with NEED_SYNC clear anyway. */ + if( !p->pSynced + && 0==(pPage->flags&PGHDR_NEED_SYNC) /*OPTIMIZATION-IF-FALSE*/ + ){ + p->pSynced = pPage; + } + } + pcacheDump(p); +} + +/* +** Wrapper around the pluggable caches xUnpin method. If the cache is +** being used for an in-memory database, this function is a no-op. +*/ +static void pcacheUnpin(PgHdr *p){ + if( p->pCache->bPurgeable ){ + pcacheTrace(("%p.UNPIN %d\n", p->pCache, p->pgno)); + sqlite3GlobalConfig.pcache2.xUnpin(p->pCache->pCache, p->pPage, 0); + pcacheDump(p->pCache); + } +} + +/* +** Compute the number of pages of cache requested. p->szCache is the +** cache size requested by the "PRAGMA cache_size" statement. +*/ +static int numberOfCachePages(PCache *p){ + if( p->szCache>=0 ){ + /* IMPLEMENTATION-OF: R-42059-47211 If the argument N is positive then the + ** suggested cache size is set to N. */ + return p->szCache; + }else{ + /* IMPLEMANTATION-OF: R-59858-46238 If the argument N is negative, then the + ** number of cache pages is adjusted to be a number of pages that would + ** use approximately abs(N*1024) bytes of memory based on the current + ** page size. */ + return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra)); + } +} + +/*************************************************** General Interfaces ****** +** +** Initialize and shutdown the page cache subsystem. Neither of these +** functions are threadsafe. +*/ +SQLITE_PRIVATE int sqlite3PcacheInitialize(void){ + if( sqlite3GlobalConfig.pcache2.xInit==0 ){ + /* IMPLEMENTATION-OF: R-26801-64137 If the xInit() method is NULL, then the + ** built-in default page cache is used instead of the application defined + ** page cache. */ + sqlite3PCacheSetDefault(); + assert( sqlite3GlobalConfig.pcache2.xInit!=0 ); + } + return sqlite3GlobalConfig.pcache2.xInit(sqlite3GlobalConfig.pcache2.pArg); +} +SQLITE_PRIVATE void sqlite3PcacheShutdown(void){ + if( sqlite3GlobalConfig.pcache2.xShutdown ){ + /* IMPLEMENTATION-OF: R-26000-56589 The xShutdown() method may be NULL. */ + sqlite3GlobalConfig.pcache2.xShutdown(sqlite3GlobalConfig.pcache2.pArg); + } +} + +/* +** Return the size in bytes of a PCache object. +*/ +SQLITE_PRIVATE int sqlite3PcacheSize(void){ return sizeof(PCache); } + +/* +** Create a new PCache object. Storage space to hold the object +** has already been allocated and is passed in as the p pointer. +** The caller discovers how much space needs to be allocated by +** calling sqlite3PcacheSize(). +** +** szExtra is some extra space allocated for each page. The first +** 8 bytes of the extra space will be zeroed as the page is allocated, +** but remaining content will be uninitialized. Though it is opaque +** to this module, the extra space really ends up being the MemPage +** structure in the pager. +*/ +SQLITE_PRIVATE int sqlite3PcacheOpen( + int szPage, /* Size of every page */ + int szExtra, /* Extra space associated with each page */ + int bPurgeable, /* True if pages are on backing store */ + int (*xStress)(void*,PgHdr*),/* Call to try to make pages clean */ + void *pStress, /* Argument to xStress */ + PCache *p /* Preallocated space for the PCache */ +){ + memset(p, 0, sizeof(PCache)); + p->szPage = 1; + p->szExtra = szExtra; + assert( szExtra>=8 ); /* First 8 bytes will be zeroed */ + p->bPurgeable = bPurgeable; + p->eCreate = 2; + p->xStress = xStress; + p->pStress = pStress; + p->szCache = 100; + p->szSpill = 1; + pcacheTrace(("%p.OPEN szPage %d bPurgeable %d\n",p,szPage,bPurgeable)); + return sqlite3PcacheSetPageSize(p, szPage); +} + +/* +** Change the page size for PCache object. The caller must ensure that there +** are no outstanding page references when this function is called. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetPageSize(PCache *pCache, int szPage){ + assert( pCache->nRefSum==0 && pCache->pDirty==0 ); + if( pCache->szPage ){ + sqlite3_pcache *pNew; + pNew = sqlite3GlobalConfig.pcache2.xCreate( + szPage, pCache->szExtra + ROUND8(sizeof(PgHdr)), + pCache->bPurgeable + ); + if( pNew==0 ) return SQLITE_NOMEM_BKPT; + sqlite3GlobalConfig.pcache2.xCachesize(pNew, numberOfCachePages(pCache)); + if( pCache->pCache ){ + sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); + } + pCache->pCache = pNew; + pCache->szPage = szPage; + pcacheTrace(("%p.PAGESIZE %d\n",pCache,szPage)); + } + return SQLITE_OK; +} + +/* +** Try to obtain a page from the cache. +** +** This routine returns a pointer to an sqlite3_pcache_page object if +** such an object is already in cache, or if a new one is created. +** This routine returns a NULL pointer if the object was not in cache +** and could not be created. +** +** The createFlags should be 0 to check for existing pages and should +** be 3 (not 1, but 3) to try to create a new page. +** +** If the createFlag is 0, then NULL is always returned if the page +** is not already in the cache. If createFlag is 1, then a new page +** is created only if that can be done without spilling dirty pages +** and without exceeding the cache size limit. +** +** The caller needs to invoke sqlite3PcacheFetchFinish() to properly +** initialize the sqlite3_pcache_page object and convert it into a +** PgHdr object. The sqlite3PcacheFetch() and sqlite3PcacheFetchFinish() +** routines are split this way for performance reasons. When separated +** they can both (usually) operate without having to push values to +** the stack on entry and pop them back off on exit, which saves a +** lot of pushing and popping. +*/ +SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number to obtain */ + int createFlag /* If true, create page if it does not exist already */ +){ + int eCreate; + sqlite3_pcache_page *pRes; + + assert( pCache!=0 ); + assert( pCache->pCache!=0 ); + assert( createFlag==3 || createFlag==0 ); + assert( pCache->eCreate==((pCache->bPurgeable && pCache->pDirty) ? 1 : 2) ); + + /* eCreate defines what to do if the page does not exist. + ** 0 Do not allocate a new page. (createFlag==0) + ** 1 Allocate a new page if doing so is inexpensive. + ** (createFlag==1 AND bPurgeable AND pDirty) + ** 2 Allocate a new page even it doing so is difficult. + ** (createFlag==1 AND !(bPurgeable AND pDirty) + */ + eCreate = createFlag & pCache->eCreate; + assert( eCreate==0 || eCreate==1 || eCreate==2 ); + assert( createFlag==0 || pCache->eCreate==eCreate ); + assert( createFlag==0 || eCreate==1+(!pCache->bPurgeable||!pCache->pDirty) ); + pRes = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, eCreate); + pcacheTrace(("%p.FETCH %d%s (result: %p)\n",pCache,pgno, + createFlag?" create":"",pRes)); + return pRes; +} + +/* +** If the sqlite3PcacheFetch() routine is unable to allocate a new +** page because no clean pages are available for reuse and the cache +** size limit has been reached, then this routine can be invoked to +** try harder to allocate a page. This routine might invoke the stress +** callback to spill dirty pages to the journal. It will then try to +** allocate the new page and will only fail to allocate a new page on +** an OOM error. +** +** This routine should be invoked only after sqlite3PcacheFetch() fails. +*/ +SQLITE_PRIVATE int sqlite3PcacheFetchStress( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number to obtain */ + sqlite3_pcache_page **ppPage /* Write result here */ +){ + PgHdr *pPg; + if( pCache->eCreate==2 ) return 0; + + if( sqlite3PcachePagecount(pCache)>pCache->szSpill ){ + /* Find a dirty page to write-out and recycle. First try to find a + ** page that does not require a journal-sync (one with PGHDR_NEED_SYNC + ** cleared), but if that is not possible settle for any other + ** unreferenced dirty page. + ** + ** If the LRU page in the dirty list that has a clear PGHDR_NEED_SYNC + ** flag is currently referenced, then the following may leave pSynced + ** set incorrectly (pointing to other than the LRU page with NEED_SYNC + ** cleared). This is Ok, as pSynced is just an optimization. */ + for(pPg=pCache->pSynced; + pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC)); + pPg=pPg->pDirtyPrev + ); + pCache->pSynced = pPg; + if( !pPg ){ + for(pPg=pCache->pDirtyTail; pPg && pPg->nRef; pPg=pPg->pDirtyPrev); + } + if( pPg ){ + int rc; +#ifdef SQLITE_LOG_CACHE_SPILL + sqlite3_log(SQLITE_FULL, + "spill page %d making room for %d - cache used: %d/%d", + pPg->pgno, pgno, + sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache), + numberOfCachePages(pCache)); +#endif + pcacheTrace(("%p.SPILL %d\n",pCache,pPg->pgno)); + rc = pCache->xStress(pCache->pStress, pPg); + pcacheDump(pCache); + if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){ + return rc; + } + } + } + *ppPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, 2); + return *ppPage==0 ? SQLITE_NOMEM_BKPT : SQLITE_OK; +} + +/* +** This is a helper routine for sqlite3PcacheFetchFinish() +** +** In the uncommon case where the page being fetched has not been +** initialized, this routine is invoked to do the initialization. +** This routine is broken out into a separate function since it +** requires extra stack manipulation that can be avoided in the common +** case. +*/ +static SQLITE_NOINLINE PgHdr *pcacheFetchFinishWithInit( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number obtained */ + sqlite3_pcache_page *pPage /* Page obtained by prior PcacheFetch() call */ +){ + PgHdr *pPgHdr; + assert( pPage!=0 ); + pPgHdr = (PgHdr*)pPage->pExtra; + assert( pPgHdr->pPage==0 ); + memset(&pPgHdr->pDirty, 0, sizeof(PgHdr) - offsetof(PgHdr,pDirty)); + pPgHdr->pPage = pPage; + pPgHdr->pData = pPage->pBuf; + pPgHdr->pExtra = (void *)&pPgHdr[1]; + memset(pPgHdr->pExtra, 0, 8); + pPgHdr->pCache = pCache; + pPgHdr->pgno = pgno; + pPgHdr->flags = PGHDR_CLEAN; + return sqlite3PcacheFetchFinish(pCache,pgno,pPage); +} + +/* +** This routine converts the sqlite3_pcache_page object returned by +** sqlite3PcacheFetch() into an initialized PgHdr object. This routine +** must be called after sqlite3PcacheFetch() in order to get a usable +** result. +*/ +SQLITE_PRIVATE PgHdr *sqlite3PcacheFetchFinish( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number obtained */ + sqlite3_pcache_page *pPage /* Page obtained by prior PcacheFetch() call */ +){ + PgHdr *pPgHdr; + + assert( pPage!=0 ); + pPgHdr = (PgHdr *)pPage->pExtra; + + if( !pPgHdr->pPage ){ + return pcacheFetchFinishWithInit(pCache, pgno, pPage); + } + pCache->nRefSum++; + pPgHdr->nRef++; + assert( sqlite3PcachePageSanity(pPgHdr) ); + return pPgHdr; +} + +/* +** Decrement the reference count on a page. If the page is clean and the +** reference count drops to 0, then it is made eligible for recycling. +*/ +SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr *p){ + assert( p->nRef>0 ); + p->pCache->nRefSum--; + if( (--p->nRef)==0 ){ + if( p->flags&PGHDR_CLEAN ){ + pcacheUnpin(p); + }else{ + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); + } + } +} + +/* +** Increase the reference count of a supplied page by 1. +*/ +SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr *p){ + assert(p->nRef>0); + assert( sqlite3PcachePageSanity(p) ); + p->nRef++; + p->pCache->nRefSum++; +} + +/* +** Drop a page from the cache. There must be exactly one reference to the +** page. This function deletes that reference, so after it returns the +** page pointed to by p is invalid. +*/ +SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){ + assert( p->nRef==1 ); + assert( sqlite3PcachePageSanity(p) ); + if( p->flags&PGHDR_DIRTY ){ + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE); + } + p->pCache->nRefSum--; + sqlite3GlobalConfig.pcache2.xUnpin(p->pCache->pCache, p->pPage, 1); +} + +/* +** Make sure the page is marked as dirty. If it isn't dirty already, +** make it so. +*/ +SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){ + assert( p->nRef>0 ); + assert( sqlite3PcachePageSanity(p) ); + if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){ /*OPTIMIZATION-IF-FALSE*/ + p->flags &= ~PGHDR_DONT_WRITE; + if( p->flags & PGHDR_CLEAN ){ + p->flags ^= (PGHDR_DIRTY|PGHDR_CLEAN); + pcacheTrace(("%p.DIRTY %d\n",p->pCache,p->pgno)); + assert( (p->flags & (PGHDR_DIRTY|PGHDR_CLEAN))==PGHDR_DIRTY ); + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_ADD); + } + assert( sqlite3PcachePageSanity(p) ); + } +} + +/* +** Make sure the page is marked as clean. If it isn't clean already, +** make it so. +*/ +SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr *p){ + assert( sqlite3PcachePageSanity(p) ); + assert( (p->flags & PGHDR_DIRTY)!=0 ); + assert( (p->flags & PGHDR_CLEAN)==0 ); + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE); + p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC|PGHDR_WRITEABLE); + p->flags |= PGHDR_CLEAN; + pcacheTrace(("%p.CLEAN %d\n",p->pCache,p->pgno)); + assert( sqlite3PcachePageSanity(p) ); + if( p->nRef==0 ){ + pcacheUnpin(p); + } +} + +/* +** Make every page in the cache clean. +*/ +SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache *pCache){ + PgHdr *p; + pcacheTrace(("%p.CLEAN-ALL\n",pCache)); + while( (p = pCache->pDirty)!=0 ){ + sqlite3PcacheMakeClean(p); + } +} + +/* +** Clear the PGHDR_NEED_SYNC and PGHDR_WRITEABLE flag from all dirty pages. +*/ +SQLITE_PRIVATE void sqlite3PcacheClearWritable(PCache *pCache){ + PgHdr *p; + pcacheTrace(("%p.CLEAR-WRITEABLE\n",pCache)); + for(p=pCache->pDirty; p; p=p->pDirtyNext){ + p->flags &= ~(PGHDR_NEED_SYNC|PGHDR_WRITEABLE); + } + pCache->pSynced = pCache->pDirtyTail; +} + +/* +** Clear the PGHDR_NEED_SYNC flag from all dirty pages. +*/ +SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){ + PgHdr *p; + for(p=pCache->pDirty; p; p=p->pDirtyNext){ + p->flags &= ~PGHDR_NEED_SYNC; + } + pCache->pSynced = pCache->pDirtyTail; +} + +/* +** Change the page number of page p to newPgno. +*/ +SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){ + PCache *pCache = p->pCache; + assert( p->nRef>0 ); + assert( newPgno>0 ); + assert( sqlite3PcachePageSanity(p) ); + pcacheTrace(("%p.MOVE %d -> %d\n",pCache,p->pgno,newPgno)); + sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, p->pgno,newPgno); + p->pgno = newPgno; + if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){ + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); + } +} + +/* +** Drop every cache entry whose page number is greater than "pgno". The +** caller must ensure that there are no outstanding references to any pages +** other than page 1 with a page number greater than pgno. +** +** If there is a reference to page 1 and the pgno parameter passed to this +** function is 0, then the data area associated with page 1 is zeroed, but +** the page object is not dropped. +*/ +SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache *pCache, Pgno pgno){ + if( pCache->pCache ){ + PgHdr *p; + PgHdr *pNext; + pcacheTrace(("%p.TRUNCATE %d\n",pCache,pgno)); + for(p=pCache->pDirty; p; p=pNext){ + pNext = p->pDirtyNext; + /* This routine never gets call with a positive pgno except right + ** after sqlite3PcacheCleanAll(). So if there are dirty pages, + ** it must be that pgno==0. + */ + assert( p->pgno>0 ); + if( p->pgno>pgno ){ + assert( p->flags&PGHDR_DIRTY ); + sqlite3PcacheMakeClean(p); + } + } + if( pgno==0 && pCache->nRefSum ){ + sqlite3_pcache_page *pPage1; + pPage1 = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache,1,0); + if( ALWAYS(pPage1) ){ /* Page 1 is always available in cache, because + ** pCache->nRefSum>0 */ + memset(pPage1->pBuf, 0, pCache->szPage); + pgno = 1; + } + } + sqlite3GlobalConfig.pcache2.xTruncate(pCache->pCache, pgno+1); + } +} + +/* +** Close a cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheClose(PCache *pCache){ + assert( pCache->pCache!=0 ); + pcacheTrace(("%p.CLOSE\n",pCache)); + sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); +} + +/* +** Discard the contents of the cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheClear(PCache *pCache){ + sqlite3PcacheTruncate(pCache, 0); +} + +/* +** Merge two lists of pages connected by pDirty and in pgno order. +** Do not bother fixing the pDirtyPrev pointers. +*/ +static PgHdr *pcacheMergeDirtyList(PgHdr *pA, PgHdr *pB){ + PgHdr result, *pTail; + pTail = &result; + assert( pA!=0 && pB!=0 ); + for(;;){ + if( pA->pgnopgno ){ + pTail->pDirty = pA; + pTail = pA; + pA = pA->pDirty; + if( pA==0 ){ + pTail->pDirty = pB; + break; + } + }else{ + pTail->pDirty = pB; + pTail = pB; + pB = pB->pDirty; + if( pB==0 ){ + pTail->pDirty = pA; + break; + } + } + } + return result.pDirty; +} + +/* +** Sort the list of pages in accending order by pgno. Pages are +** connected by pDirty pointers. The pDirtyPrev pointers are +** corrupted by this sort. +** +** Since there cannot be more than 2^31 distinct pages in a database, +** there cannot be more than 31 buckets required by the merge sorter. +** One extra bucket is added to catch overflow in case something +** ever changes to make the previous sentence incorrect. +*/ +#define N_SORT_BUCKET 32 +static PgHdr *pcacheSortDirtyList(PgHdr *pIn){ + PgHdr *a[N_SORT_BUCKET], *p; + int i; + memset(a, 0, sizeof(a)); + while( pIn ){ + p = pIn; + pIn = p->pDirty; + p->pDirty = 0; + for(i=0; ALWAYS(ipDirty; p; p=p->pDirtyNext){ + p->pDirty = p->pDirtyNext; + } + return pcacheSortDirtyList(pCache->pDirty); +} + +/* +** Return the total number of references to all pages held by the cache. +** +** This is not the total number of pages referenced, but the sum of the +** reference count for all pages. +*/ +SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache *pCache){ + return pCache->nRefSum; +} + +/* +** Return the number of references to the page supplied as an argument. +*/ +SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr *p){ + return p->nRef; +} + +/* +** Return the total number of pages in the cache. +*/ +SQLITE_PRIVATE int sqlite3PcachePagecount(PCache *pCache){ + assert( pCache->pCache!=0 ); + return sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache); +} + +#ifdef SQLITE_TEST +/* +** Get the suggested cache-size value. +*/ +SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *pCache){ + return numberOfCachePages(pCache); +} +#endif + +/* +** Set the suggested cache-size value. +*/ +SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *pCache, int mxPage){ + assert( pCache->pCache!=0 ); + pCache->szCache = mxPage; + sqlite3GlobalConfig.pcache2.xCachesize(pCache->pCache, + numberOfCachePages(pCache)); +} + +/* +** Set the suggested cache-spill value. Make no changes if if the +** argument is zero. Return the effective cache-spill size, which will +** be the larger of the szSpill and szCache. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetSpillsize(PCache *p, int mxPage){ + int res; + assert( p->pCache!=0 ); + if( mxPage ){ + if( mxPage<0 ){ + mxPage = (int)((-1024*(i64)mxPage)/(p->szPage+p->szExtra)); + } + p->szSpill = mxPage; + } + res = numberOfCachePages(p); + if( resszSpill ) res = p->szSpill; + return res; +} + +/* +** Free up as much memory as possible from the page cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheShrink(PCache *pCache){ + assert( pCache->pCache!=0 ); + sqlite3GlobalConfig.pcache2.xShrink(pCache->pCache); +} + +/* +** Return the size of the header added by this middleware layer +** in the page-cache hierarchy. +*/ +SQLITE_PRIVATE int sqlite3HeaderSizePcache(void){ return ROUND8(sizeof(PgHdr)); } + +/* +** Return the number of dirty pages currently in the cache, as a percentage +** of the configured cache size. +*/ +SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache *pCache){ + PgHdr *pDirty; + int nDirty = 0; + int nCache = numberOfCachePages(pCache); + for(pDirty=pCache->pDirty; pDirty; pDirty=pDirty->pDirtyNext) nDirty++; + return nCache ? (int)(((i64)nDirty * 100) / nCache) : 0; +} + +#ifdef SQLITE_DIRECT_OVERFLOW_READ +/* +** Return true if there are one or more dirty pages in the cache. Else false. +*/ +SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache){ + return (pCache->pDirty!=0); +} +#endif + +#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) +/* +** For all dirty pages currently in the cache, invoke the specified +** callback. This is only used if the SQLITE_CHECK_PAGES macro is +** defined. +*/ +SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)){ + PgHdr *pDirty; + for(pDirty=pCache->pDirty; pDirty; pDirty=pDirty->pDirtyNext){ + xIter(pDirty); + } +} +#endif + +/************** End of pcache.c **********************************************/ +/************** Begin file pcache1.c *****************************************/ +/* +** 2008 November 05 +** +** 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 implements the default page cache implementation (the +** sqlite3_pcache interface). It also contains part of the implementation +** of the SQLITE_CONFIG_PAGECACHE and sqlite3_release_memory() features. +** If the default page cache implementation is overridden, then neither of +** these two features are available. +** +** A Page cache line looks like this: +** +** ------------------------------------------------------------- +** | database page content | PgHdr1 | MemPage | PgHdr | +** ------------------------------------------------------------- +** +** The database page content is up front (so that buffer overreads tend to +** flow harmlessly into the PgHdr1, MemPage, and PgHdr extensions). MemPage +** is the extension added by the btree.c module containing information such +** as the database page number and how that database page is used. PgHdr +** is added by the pcache.c layer and contains information used to keep track +** of which pages are "dirty". PgHdr1 is an extension added by this +** module (pcache1.c). The PgHdr1 header is a subclass of sqlite3_pcache_page. +** PgHdr1 contains information needed to look up a page by its page number. +** The superclass sqlite3_pcache_page.pBuf points to the start of the +** database page content and sqlite3_pcache_page.pExtra points to PgHdr. +** +** The size of the extension (MemPage+PgHdr+PgHdr1) can be determined at +** runtime using sqlite3_config(SQLITE_CONFIG_PCACHE_HDRSZ, &size). The +** sizes of the extensions sum to 272 bytes on x64 for 3.8.10, but this +** size can vary according to architecture, compile-time options, and +** SQLite library version number. +** +** If SQLITE_PCACHE_SEPARATE_HEADER is defined, then the extension is obtained +** using a separate memory allocation from the database page content. This +** seeks to overcome the "clownshoe" problem (also called "internal +** fragmentation" in academic literature) of allocating a few bytes more +** than a power of two with the memory allocator rounding up to the next +** power of two, and leaving the rounded-up space unused. +** +** This module tracks pointers to PgHdr1 objects. Only pcache.c communicates +** with this module. Information is passed back and forth as PgHdr1 pointers. +** +** The pcache.c and pager.c modules deal pointers to PgHdr objects. +** The btree.c module deals with pointers to MemPage objects. +** +** SOURCE OF PAGE CACHE MEMORY: +** +** Memory for a page might come from any of three sources: +** +** (1) The general-purpose memory allocator - sqlite3Malloc() +** (2) Global page-cache memory provided using sqlite3_config() with +** SQLITE_CONFIG_PAGECACHE. +** (3) PCache-local bulk allocation. +** +** The third case is a chunk of heap memory (defaulting to 100 pages worth) +** that is allocated when the page cache is created. The size of the local +** bulk allocation can be adjusted using +** +** sqlite3_config(SQLITE_CONFIG_PAGECACHE, (void*)0, 0, N). +** +** If N is positive, then N pages worth of memory are allocated using a single +** sqlite3Malloc() call and that memory is used for the first N pages allocated. +** Or if N is negative, then -1024*N bytes of memory are allocated and used +** for as many pages as can be accomodated. +** +** Only one of (2) or (3) can be used. Once the memory available to (2) or +** (3) is exhausted, subsequent allocations fail over to the general-purpose +** memory allocator (1). +** +** Earlier versions of SQLite used only methods (1) and (2). But experiments +** show that method (3) with N==100 provides about a 5% performance boost for +** common workloads. +*/ +/* #include "sqliteInt.h" */ + +typedef struct PCache1 PCache1; +typedef struct PgHdr1 PgHdr1; +typedef struct PgFreeslot PgFreeslot; +typedef struct PGroup PGroup; + +/* +** Each cache entry is represented by an instance of the following +** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of +** PgHdr1.pCache->szPage bytes is allocated directly before this structure +** in memory. +** +** Note: Variables isBulkLocal and isAnchor were once type "u8". That works, +** but causes a 2-byte gap in the structure for most architectures (since +** pointers must be either 4 or 8-byte aligned). As this structure is located +** in memory directly after the associated page data, if the database is +** corrupt, code at the b-tree layer may overread the page buffer and +** read part of this structure before the corruption is detected. This +** can cause a valgrind error if the unitialized gap is accessed. Using u16 +** ensures there is no such gap, and therefore no bytes of unitialized memory +** in the structure. +*/ +struct PgHdr1 { + sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */ + unsigned int iKey; /* Key value (page number) */ + u16 isBulkLocal; /* This page from bulk local storage */ + u16 isAnchor; /* This is the PGroup.lru element */ + PgHdr1 *pNext; /* Next in hash table chain */ + PCache1 *pCache; /* Cache that currently owns this page */ + PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ + PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */ + /* NB: pLruPrev is only valid if pLruNext!=0 */ +}; + +/* +** A page is pinned if it is not on the LRU list. To be "pinned" means +** that the page is in active use and must not be deallocated. +*/ +#define PAGE_IS_PINNED(p) ((p)->pLruNext==0) +#define PAGE_IS_UNPINNED(p) ((p)->pLruNext!=0) + +/* Each page cache (or PCache) belongs to a PGroup. A PGroup is a set +** of one or more PCaches that are able to recycle each other's unpinned +** pages when they are under memory pressure. A PGroup is an instance of +** the following object. +** +** This page cache implementation works in one of two modes: +** +** (1) Every PCache is the sole member of its own PGroup. There is +** one PGroup per PCache. +** +** (2) There is a single global PGroup that all PCaches are a member +** of. +** +** Mode 1 uses more memory (since PCache instances are not able to rob +** unused pages from other PCaches) but it also operates without a mutex, +** and is therefore often faster. Mode 2 requires a mutex in order to be +** threadsafe, but recycles pages more efficiently. +** +** For mode (1), PGroup.mutex is NULL. For mode (2) there is only a single +** PGroup which is the pcache1.grp global variable and its mutex is +** SQLITE_MUTEX_STATIC_LRU. +*/ +struct PGroup { + sqlite3_mutex *mutex; /* MUTEX_STATIC_LRU or NULL */ + unsigned int nMaxPage; /* Sum of nMax for purgeable caches */ + unsigned int nMinPage; /* Sum of nMin for purgeable caches */ + unsigned int mxPinned; /* nMaxpage + 10 - nMinPage */ + unsigned int nPurgeable; /* Number of purgeable pages allocated */ + PgHdr1 lru; /* The beginning and end of the LRU list */ +}; + +/* Each page cache is an instance of the following object. Every +** open database file (including each in-memory database and each +** temporary or transient database) has a single page cache which +** is an instance of this object. +** +** Pointers to structures of this type are cast and returned as +** opaque sqlite3_pcache* handles. +*/ +struct PCache1 { + /* Cache configuration parameters. Page size (szPage) and the purgeable + ** flag (bPurgeable) and the pnPurgeable pointer are all set when the + ** cache is created and are never changed thereafter. nMax may be + ** modified at any time by a call to the pcache1Cachesize() method. + ** The PGroup mutex must be held when accessing nMax. + */ + PGroup *pGroup; /* PGroup this cache belongs to */ + unsigned int *pnPurgeable; /* Pointer to pGroup->nPurgeable */ + int szPage; /* Size of database content section */ + int szExtra; /* sizeof(MemPage)+sizeof(PgHdr) */ + int szAlloc; /* Total size of one pcache line */ + int bPurgeable; /* True if cache is purgeable */ + unsigned int nMin; /* Minimum number of pages reserved */ + unsigned int nMax; /* Configured "cache_size" value */ + unsigned int n90pct; /* nMax*9/10 */ + unsigned int iMaxKey; /* Largest key seen since xTruncate() */ + unsigned int nPurgeableDummy; /* pnPurgeable points here when not used*/ + + /* Hash table of all pages. The following variables may only be accessed + ** when the accessor is holding the PGroup mutex. + */ + unsigned int nRecyclable; /* Number of pages in the LRU list */ + unsigned int nPage; /* Total number of pages in apHash */ + unsigned int nHash; /* Number of slots in apHash[] */ + PgHdr1 **apHash; /* Hash table for fast lookup by key */ + PgHdr1 *pFree; /* List of unused pcache-local pages */ + void *pBulk; /* Bulk memory used by pcache-local */ +}; + +/* +** Free slots in the allocator used to divide up the global page cache +** buffer provided using the SQLITE_CONFIG_PAGECACHE mechanism. +*/ +struct PgFreeslot { + PgFreeslot *pNext; /* Next free slot */ +}; + +/* +** Global data used by this cache. +*/ +static SQLITE_WSD struct PCacheGlobal { + PGroup grp; /* The global PGroup for mode (2) */ + + /* Variables related to SQLITE_CONFIG_PAGECACHE settings. The + ** szSlot, nSlot, pStart, pEnd, nReserve, and isInit values are all + ** fixed at sqlite3_initialize() time and do not require mutex protection. + ** The nFreeSlot and pFree values do require mutex protection. + */ + int isInit; /* True if initialized */ + int separateCache; /* Use a new PGroup for each PCache */ + int nInitPage; /* Initial bulk allocation size */ + int szSlot; /* Size of each free slot */ + int nSlot; /* The number of pcache slots */ + int nReserve; /* Try to keep nFreeSlot above this */ + void *pStart, *pEnd; /* Bounds of global page cache memory */ + /* Above requires no mutex. Use mutex below for variable that follow. */ + sqlite3_mutex *mutex; /* Mutex for accessing the following: */ + PgFreeslot *pFree; /* Free page blocks */ + int nFreeSlot; /* Number of unused pcache slots */ + /* The following value requires a mutex to change. We skip the mutex on + ** reading because (1) most platforms read a 32-bit integer atomically and + ** (2) even if an incorrect value is read, no great harm is done since this + ** is really just an optimization. */ + int bUnderPressure; /* True if low on PAGECACHE memory */ +} pcache1_g; + +/* +** All code in this file should access the global structure above via the +** alias "pcache1". This ensures that the WSD emulation is used when +** compiling for systems that do not support real WSD. +*/ +#define pcache1 (GLOBAL(struct PCacheGlobal, pcache1_g)) + +/* +** Macros to enter and leave the PCache LRU mutex. +*/ +#if !defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) || SQLITE_THREADSAFE==0 +# define pcache1EnterMutex(X) assert((X)->mutex==0) +# define pcache1LeaveMutex(X) assert((X)->mutex==0) +# define PCACHE1_MIGHT_USE_GROUP_MUTEX 0 +#else +# define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex) +# define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex) +# define PCACHE1_MIGHT_USE_GROUP_MUTEX 1 +#endif + +/******************************************************************************/ +/******** Page Allocation/SQLITE_CONFIG_PCACHE Related Functions **************/ + + +/* +** This function is called during initialization if a static buffer is +** supplied to use for the page-cache by passing the SQLITE_CONFIG_PAGECACHE +** verb to sqlite3_config(). Parameter pBuf points to an allocation large +** enough to contain 'n' buffers of 'sz' bytes each. +** +** This routine is called from sqlite3_initialize() and so it is guaranteed +** to be serialized already. There is no need for further mutexing. +*/ +SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *pBuf, int sz, int n){ + if( pcache1.isInit ){ + PgFreeslot *p; + if( pBuf==0 ) sz = n = 0; + if( n==0 ) sz = 0; + sz = ROUNDDOWN8(sz); + pcache1.szSlot = sz; + pcache1.nSlot = pcache1.nFreeSlot = n; + pcache1.nReserve = n>90 ? 10 : (n/10 + 1); + pcache1.pStart = pBuf; + pcache1.pFree = 0; + pcache1.bUnderPressure = 0; + while( n-- ){ + p = (PgFreeslot*)pBuf; + p->pNext = pcache1.pFree; + pcache1.pFree = p; + pBuf = (void*)&((char*)pBuf)[sz]; + } + pcache1.pEnd = pBuf; + } +} + +/* +** Try to initialize the pCache->pFree and pCache->pBulk fields. Return +** true if pCache->pFree ends up containing one or more free pages. +*/ +static int pcache1InitBulk(PCache1 *pCache){ + i64 szBulk; + char *zBulk; + if( pcache1.nInitPage==0 ) return 0; + /* Do not bother with a bulk allocation if the cache size very small */ + if( pCache->nMax<3 ) return 0; + sqlite3BeginBenignMalloc(); + if( pcache1.nInitPage>0 ){ + szBulk = pCache->szAlloc * (i64)pcache1.nInitPage; + }else{ + szBulk = -1024 * (i64)pcache1.nInitPage; + } + if( szBulk > pCache->szAlloc*(i64)pCache->nMax ){ + szBulk = pCache->szAlloc*(i64)pCache->nMax; + } + zBulk = pCache->pBulk = sqlite3Malloc( szBulk ); + sqlite3EndBenignMalloc(); + if( zBulk ){ + int nBulk = sqlite3MallocSize(zBulk)/pCache->szAlloc; + do{ + PgHdr1 *pX = (PgHdr1*)&zBulk[pCache->szPage]; + pX->page.pBuf = zBulk; + pX->page.pExtra = &pX[1]; + pX->isBulkLocal = 1; + pX->isAnchor = 0; + pX->pNext = pCache->pFree; + pX->pLruPrev = 0; /* Initializing this saves a valgrind error */ + pCache->pFree = pX; + zBulk += pCache->szAlloc; + }while( --nBulk ); + } + return pCache->pFree!=0; +} + +/* +** Malloc function used within this file to allocate space from the buffer +** configured using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no +** such buffer exists or there is no space left in it, this function falls +** back to sqlite3Malloc(). +** +** Multiple threads can run this routine at the same time. Global variables +** in pcache1 need to be protected via mutex. +*/ +static void *pcache1Alloc(int nByte){ + void *p = 0; + assert( sqlite3_mutex_notheld(pcache1.grp.mutex) ); + if( nByte<=pcache1.szSlot ){ + sqlite3_mutex_enter(pcache1.mutex); + p = (PgHdr1 *)pcache1.pFree; + if( p ){ + pcache1.pFree = pcache1.pFree->pNext; + pcache1.nFreeSlot--; + pcache1.bUnderPressure = pcache1.nFreeSlot=0 ); + sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte); + sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_USED, 1); + } + sqlite3_mutex_leave(pcache1.mutex); + } + if( p==0 ){ + /* Memory is not available in the SQLITE_CONFIG_PAGECACHE pool. Get + ** it from sqlite3Malloc instead. + */ + p = sqlite3Malloc(nByte); +#ifndef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS + if( p ){ + int sz = sqlite3MallocSize(p); + sqlite3_mutex_enter(pcache1.mutex); + sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte); + sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_OVERFLOW, sz); + sqlite3_mutex_leave(pcache1.mutex); + } +#endif + sqlite3MemdebugSetType(p, MEMTYPE_PCACHE); + } + return p; +} + +/* +** Free an allocated buffer obtained from pcache1Alloc(). +*/ +static void pcache1Free(void *p){ + if( p==0 ) return; + if( SQLITE_WITHIN(p, pcache1.pStart, pcache1.pEnd) ){ + PgFreeslot *pSlot; + sqlite3_mutex_enter(pcache1.mutex); + sqlite3StatusDown(SQLITE_STATUS_PAGECACHE_USED, 1); + pSlot = (PgFreeslot*)p; + pSlot->pNext = pcache1.pFree; + pcache1.pFree = pSlot; + pcache1.nFreeSlot++; + pcache1.bUnderPressure = pcache1.nFreeSlot=pcache1.pStart && ppGroup->mutex) ); + if( pCache->pFree || (pCache->nPage==0 && pcache1InitBulk(pCache)) ){ + assert( pCache->pFree!=0 ); + p = pCache->pFree; + pCache->pFree = p->pNext; + p->pNext = 0; + }else{ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + /* The group mutex must be released before pcache1Alloc() is called. This + ** is because it might call sqlite3_release_memory(), which assumes that + ** this mutex is not held. */ + assert( pcache1.separateCache==0 ); + assert( pCache->pGroup==&pcache1.grp ); + pcache1LeaveMutex(pCache->pGroup); +#endif + if( benignMalloc ){ sqlite3BeginBenignMalloc(); } +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + pPg = pcache1Alloc(pCache->szPage); + p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra); + if( !pPg || !p ){ + pcache1Free(pPg); + sqlite3_free(p); + pPg = 0; + } +#else + pPg = pcache1Alloc(pCache->szAlloc); +#endif + if( benignMalloc ){ sqlite3EndBenignMalloc(); } +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + pcache1EnterMutex(pCache->pGroup); +#endif + if( pPg==0 ) return 0; +#ifndef SQLITE_PCACHE_SEPARATE_HEADER + p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; +#endif + p->page.pBuf = pPg; + p->page.pExtra = &p[1]; + p->isBulkLocal = 0; + p->isAnchor = 0; + } + (*pCache->pnPurgeable)++; + return p; +} + +/* +** Free a page object allocated by pcache1AllocPage(). +*/ +static void pcache1FreePage(PgHdr1 *p){ + PCache1 *pCache; + assert( p!=0 ); + pCache = p->pCache; + assert( sqlite3_mutex_held(p->pCache->pGroup->mutex) ); + if( p->isBulkLocal ){ + p->pNext = pCache->pFree; + pCache->pFree = p; + }else{ + pcache1Free(p->page.pBuf); +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + sqlite3_free(p); +#endif + } + (*pCache->pnPurgeable)--; +} + +/* +** Malloc function used by SQLite to obtain space from the buffer configured +** using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no such buffer +** exists, this function falls back to sqlite3Malloc(). +*/ +SQLITE_PRIVATE void *sqlite3PageMalloc(int sz){ + assert( sz<=65536+8 ); /* These allocations are never very large */ + return pcache1Alloc(sz); +} + +/* +** Free an allocated buffer obtained from sqlite3PageMalloc(). +*/ +SQLITE_PRIVATE void sqlite3PageFree(void *p){ + pcache1Free(p); +} + + +/* +** Return true if it desirable to avoid allocating a new page cache +** entry. +** +** If memory was allocated specifically to the page cache using +** SQLITE_CONFIG_PAGECACHE but that memory has all been used, then +** it is desirable to avoid allocating a new page cache entry because +** presumably SQLITE_CONFIG_PAGECACHE was suppose to be sufficient +** for all page cache needs and we should not need to spill the +** allocation onto the heap. +** +** Or, the heap is used for all page cache memory but the heap is +** under memory pressure, then again it is desirable to avoid +** allocating a new page cache entry in order to avoid stressing +** the heap even further. +*/ +static int pcache1UnderMemoryPressure(PCache1 *pCache){ + if( pcache1.nSlot && (pCache->szPage+pCache->szExtra)<=pcache1.szSlot ){ + return pcache1.bUnderPressure; + }else{ + return sqlite3HeapNearlyFull(); + } +} + +/******************************************************************************/ +/******** General Implementation Functions ************************************/ + +/* +** This function is used to resize the hash table used by the cache passed +** as the first argument. +** +** The PCache mutex must be held when this function is called. +*/ +static void pcache1ResizeHash(PCache1 *p){ + PgHdr1 **apNew; + unsigned int nNew; + unsigned int i; + + assert( sqlite3_mutex_held(p->pGroup->mutex) ); + + nNew = p->nHash*2; + if( nNew<256 ){ + nNew = 256; + } + + pcache1LeaveMutex(p->pGroup); + if( p->nHash ){ sqlite3BeginBenignMalloc(); } + apNew = (PgHdr1 **)sqlite3MallocZero(sizeof(PgHdr1 *)*nNew); + if( p->nHash ){ sqlite3EndBenignMalloc(); } + pcache1EnterMutex(p->pGroup); + if( apNew ){ + for(i=0; inHash; i++){ + PgHdr1 *pPage; + PgHdr1 *pNext = p->apHash[i]; + while( (pPage = pNext)!=0 ){ + unsigned int h = pPage->iKey % nNew; + pNext = pPage->pNext; + pPage->pNext = apNew[h]; + apNew[h] = pPage; + } + } + sqlite3_free(p->apHash); + p->apHash = apNew; + p->nHash = nNew; + } +} + +/* +** This function is used internally to remove the page pPage from the +** PGroup LRU list, if is part of it. If pPage is not part of the PGroup +** LRU list, then this function is a no-op. +** +** The PGroup mutex must be held when this function is called. +*/ +static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ + assert( pPage!=0 ); + assert( PAGE_IS_UNPINNED(pPage) ); + assert( pPage->pLruNext ); + assert( pPage->pLruPrev ); + assert( sqlite3_mutex_held(pPage->pCache->pGroup->mutex) ); + pPage->pLruPrev->pLruNext = pPage->pLruNext; + pPage->pLruNext->pLruPrev = pPage->pLruPrev; + pPage->pLruNext = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev as it is never accessed if pLruNext is 0 */ + assert( pPage->isAnchor==0 ); + assert( pPage->pCache->pGroup->lru.isAnchor==1 ); + pPage->pCache->nRecyclable--; + return pPage; +} + + +/* +** Remove the page supplied as an argument from the hash table +** (PCache1.apHash structure) that it is currently stored in. +** Also free the page if freePage is true. +** +** The PGroup mutex must be held when this function is called. +*/ +static void pcache1RemoveFromHash(PgHdr1 *pPage, int freeFlag){ + unsigned int h; + PCache1 *pCache = pPage->pCache; + PgHdr1 **pp; + + assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); + h = pPage->iKey % pCache->nHash; + for(pp=&pCache->apHash[h]; (*pp)!=pPage; pp=&(*pp)->pNext); + *pp = (*pp)->pNext; + + pCache->nPage--; + if( freeFlag ) pcache1FreePage(pPage); +} + +/* +** If there are currently more than nMaxPage pages allocated, try +** to recycle pages to reduce the number allocated to nMaxPage. +*/ +static void pcache1EnforceMaxPage(PCache1 *pCache){ + PGroup *pGroup = pCache->pGroup; + PgHdr1 *p; + assert( sqlite3_mutex_held(pGroup->mutex) ); + while( pGroup->nPurgeable>pGroup->nMaxPage + && (p=pGroup->lru.pLruPrev)->isAnchor==0 + ){ + assert( p->pCache->pGroup==pGroup ); + assert( PAGE_IS_UNPINNED(p) ); + pcache1PinPage(p); + pcache1RemoveFromHash(p, 1); + } + if( pCache->nPage==0 && pCache->pBulk ){ + sqlite3_free(pCache->pBulk); + pCache->pBulk = pCache->pFree = 0; + } +} + +/* +** Discard all pages from cache pCache with a page number (key value) +** greater than or equal to iLimit. Any pinned pages that meet this +** criteria are unpinned before they are discarded. +** +** The PCache mutex must be held when this function is called. +*/ +static void pcache1TruncateUnsafe( + PCache1 *pCache, /* The cache to truncate */ + unsigned int iLimit /* Drop pages with this pgno or larger */ +){ + TESTONLY( int nPage = 0; ) /* To assert pCache->nPage is correct */ + unsigned int h, iStop; + assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); + assert( pCache->iMaxKey >= iLimit ); + assert( pCache->nHash > 0 ); + if( pCache->iMaxKey - iLimit < pCache->nHash ){ + /* If we are just shaving the last few pages off the end of the + ** cache, then there is no point in scanning the entire hash table. + ** Only scan those hash slots that might contain pages that need to + ** be removed. */ + h = iLimit % pCache->nHash; + iStop = pCache->iMaxKey % pCache->nHash; + TESTONLY( nPage = -10; ) /* Disable the pCache->nPage validity check */ + }else{ + /* This is the general case where many pages are being removed. + ** It is necessary to scan the entire hash table */ + h = pCache->nHash/2; + iStop = h - 1; + } + for(;;){ + PgHdr1 **pp; + PgHdr1 *pPage; + assert( hnHash ); + pp = &pCache->apHash[h]; + while( (pPage = *pp)!=0 ){ + if( pPage->iKey>=iLimit ){ + pCache->nPage--; + *pp = pPage->pNext; + if( PAGE_IS_UNPINNED(pPage) ) pcache1PinPage(pPage); + pcache1FreePage(pPage); + }else{ + pp = &pPage->pNext; + TESTONLY( if( nPage>=0 ) nPage++; ) + } + } + if( h==iStop ) break; + h = (h+1) % pCache->nHash; + } + assert( nPage<0 || pCache->nPage==(unsigned)nPage ); +} + +/******************************************************************************/ +/******** sqlite3_pcache Methods **********************************************/ + +/* +** Implementation of the sqlite3_pcache.xInit method. +*/ +static int pcache1Init(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + assert( pcache1.isInit==0 ); + memset(&pcache1, 0, sizeof(pcache1)); + + + /* + ** The pcache1.separateCache variable is true if each PCache has its own + ** private PGroup (mode-1). pcache1.separateCache is false if the single + ** PGroup in pcache1.grp is used for all page caches (mode-2). + ** + ** * Always use a unified cache (mode-2) if ENABLE_MEMORY_MANAGEMENT + ** + ** * Use a unified cache in single-threaded applications that have + ** configured a start-time buffer for use as page-cache memory using + ** sqlite3_config(SQLITE_CONFIG_PAGECACHE, pBuf, sz, N) with non-NULL + ** pBuf argument. + ** + ** * Otherwise use separate caches (mode-1) + */ +#if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) + pcache1.separateCache = 0; +#elif SQLITE_THREADSAFE + pcache1.separateCache = sqlite3GlobalConfig.pPage==0 + || sqlite3GlobalConfig.bCoreMutex>0; +#else + pcache1.separateCache = sqlite3GlobalConfig.pPage==0; +#endif + +#if SQLITE_THREADSAFE + if( sqlite3GlobalConfig.bCoreMutex ){ + pcache1.grp.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_LRU); + pcache1.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PMEM); + } +#endif + if( pcache1.separateCache + && sqlite3GlobalConfig.nPage!=0 + && sqlite3GlobalConfig.pPage==0 + ){ + pcache1.nInitPage = sqlite3GlobalConfig.nPage; + }else{ + pcache1.nInitPage = 0; + } + pcache1.grp.mxPinned = 10; + pcache1.isInit = 1; + return SQLITE_OK; +} + +/* +** Implementation of the sqlite3_pcache.xShutdown method. +** Note that the static mutex allocated in xInit does +** not need to be freed. +*/ +static void pcache1Shutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + assert( pcache1.isInit!=0 ); + memset(&pcache1, 0, sizeof(pcache1)); +} + +/* forward declaration */ +static void pcache1Destroy(sqlite3_pcache *p); + +/* +** Implementation of the sqlite3_pcache.xCreate method. +** +** Allocate a new cache. +*/ +static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ + PCache1 *pCache; /* The newly created page cache */ + PGroup *pGroup; /* The group the new page cache will belong to */ + int sz; /* Bytes of memory required to allocate the new cache */ + + assert( (szPage & (szPage-1))==0 && szPage>=512 && szPage<=65536 ); + assert( szExtra < 300 ); + + sz = sizeof(PCache1) + sizeof(PGroup)*pcache1.separateCache; + pCache = (PCache1 *)sqlite3MallocZero(sz); + if( pCache ){ + if( pcache1.separateCache ){ + pGroup = (PGroup*)&pCache[1]; + pGroup->mxPinned = 10; + }else{ + pGroup = &pcache1.grp; + } + pcache1EnterMutex(pGroup); + if( pGroup->lru.isAnchor==0 ){ + pGroup->lru.isAnchor = 1; + pGroup->lru.pLruPrev = pGroup->lru.pLruNext = &pGroup->lru; + } + pCache->pGroup = pGroup; + pCache->szPage = szPage; + pCache->szExtra = szExtra; + pCache->szAlloc = szPage + szExtra + ROUND8(sizeof(PgHdr1)); + pCache->bPurgeable = (bPurgeable ? 1 : 0); + pcache1ResizeHash(pCache); + if( bPurgeable ){ + pCache->nMin = 10; + pGroup->nMinPage += pCache->nMin; + pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; + pCache->pnPurgeable = &pGroup->nPurgeable; + }else{ + pCache->pnPurgeable = &pCache->nPurgeableDummy; + } + pcache1LeaveMutex(pGroup); + if( pCache->nHash==0 ){ + pcache1Destroy((sqlite3_pcache*)pCache); + pCache = 0; + } + } + return (sqlite3_pcache *)pCache; +} + +/* +** Implementation of the sqlite3_pcache.xCachesize method. +** +** Configure the cache_size limit for a cache. +*/ +static void pcache1Cachesize(sqlite3_pcache *p, int nMax){ + PCache1 *pCache = (PCache1 *)p; + if( pCache->bPurgeable ){ + PGroup *pGroup = pCache->pGroup; + pcache1EnterMutex(pGroup); + pGroup->nMaxPage += (nMax - pCache->nMax); + pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; + pCache->nMax = nMax; + pCache->n90pct = pCache->nMax*9/10; + pcache1EnforceMaxPage(pCache); + pcache1LeaveMutex(pGroup); + } +} + +/* +** Implementation of the sqlite3_pcache.xShrink method. +** +** Free up as much memory as possible. +*/ +static void pcache1Shrink(sqlite3_pcache *p){ + PCache1 *pCache = (PCache1*)p; + if( pCache->bPurgeable ){ + PGroup *pGroup = pCache->pGroup; + int savedMaxPage; + pcache1EnterMutex(pGroup); + savedMaxPage = pGroup->nMaxPage; + pGroup->nMaxPage = 0; + pcache1EnforceMaxPage(pCache); + pGroup->nMaxPage = savedMaxPage; + pcache1LeaveMutex(pGroup); + } +} + +/* +** Implementation of the sqlite3_pcache.xPagecount method. +*/ +static int pcache1Pagecount(sqlite3_pcache *p){ + int n; + PCache1 *pCache = (PCache1*)p; + pcache1EnterMutex(pCache->pGroup); + n = pCache->nPage; + pcache1LeaveMutex(pCache->pGroup); + return n; +} + + +/* +** Implement steps 3, 4, and 5 of the pcache1Fetch() algorithm described +** in the header of the pcache1Fetch() procedure. +** +** This steps are broken out into a separate procedure because they are +** usually not needed, and by avoiding the stack initialization required +** for these steps, the main pcache1Fetch() procedure can run faster. +*/ +static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( + PCache1 *pCache, + unsigned int iKey, + int createFlag +){ + unsigned int nPinned; + PGroup *pGroup = pCache->pGroup; + PgHdr1 *pPage = 0; + + /* Step 3: Abort if createFlag is 1 but the cache is nearly full */ + assert( pCache->nPage >= pCache->nRecyclable ); + nPinned = pCache->nPage - pCache->nRecyclable; + assert( pGroup->mxPinned == pGroup->nMaxPage + 10 - pGroup->nMinPage ); + assert( pCache->n90pct == pCache->nMax*9/10 ); + if( createFlag==1 && ( + nPinned>=pGroup->mxPinned + || nPinned>=pCache->n90pct + || (pcache1UnderMemoryPressure(pCache) && pCache->nRecyclablenPage>=pCache->nHash ) pcache1ResizeHash(pCache); + assert( pCache->nHash>0 && pCache->apHash ); + + /* Step 4. Try to recycle a page. */ + if( pCache->bPurgeable + && !pGroup->lru.pLruPrev->isAnchor + && ((pCache->nPage+1>=pCache->nMax) || pcache1UnderMemoryPressure(pCache)) + ){ + PCache1 *pOther; + pPage = pGroup->lru.pLruPrev; + assert( PAGE_IS_UNPINNED(pPage) ); + pcache1RemoveFromHash(pPage, 0); + pcache1PinPage(pPage); + pOther = pPage->pCache; + if( pOther->szAlloc != pCache->szAlloc ){ + pcache1FreePage(pPage); + pPage = 0; + }else{ + pGroup->nPurgeable -= (pOther->bPurgeable - pCache->bPurgeable); + } + } + + /* Step 5. If a usable page buffer has still not been found, + ** attempt to allocate a new one. + */ + if( !pPage ){ + pPage = pcache1AllocPage(pCache, createFlag==1); + } + + if( pPage ){ + unsigned int h = iKey % pCache->nHash; + pCache->nPage++; + pPage->iKey = iKey; + pPage->pNext = pCache->apHash[h]; + pPage->pCache = pCache; + pPage->pLruNext = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev since it is not accessed when pLruNext==0 */ + *(void **)pPage->page.pExtra = 0; + pCache->apHash[h] = pPage; + if( iKey>pCache->iMaxKey ){ + pCache->iMaxKey = iKey; + } + } + return pPage; +} + +/* +** Implementation of the sqlite3_pcache.xFetch method. +** +** Fetch a page by key value. +** +** Whether or not a new page may be allocated by this function depends on +** the value of the createFlag argument. 0 means do not allocate a new +** page. 1 means allocate a new page if space is easily available. 2 +** means to try really hard to allocate a new page. +** +** For a non-purgeable cache (a cache used as the storage for an in-memory +** database) there is really no difference between createFlag 1 and 2. So +** the calling function (pcache.c) will never have a createFlag of 1 on +** a non-purgeable cache. +** +** There are three different approaches to obtaining space for a page, +** depending on the value of parameter createFlag (which may be 0, 1 or 2). +** +** 1. Regardless of the value of createFlag, the cache is searched for a +** copy of the requested page. If one is found, it is returned. +** +** 2. If createFlag==0 and the page is not already in the cache, NULL is +** returned. +** +** 3. If createFlag is 1, and the page is not already in the cache, then +** return NULL (do not allocate a new page) if any of the following +** conditions are true: +** +** (a) the number of pages pinned by the cache is greater than +** PCache1.nMax, or +** +** (b) the number of pages pinned by the cache is greater than +** the sum of nMax for all purgeable caches, less the sum of +** nMin for all other purgeable caches, or +** +** 4. If none of the first three conditions apply and the cache is marked +** as purgeable, and if one of the following is true: +** +** (a) The number of pages allocated for the cache is already +** PCache1.nMax, or +** +** (b) The number of pages allocated for all purgeable caches is +** already equal to or greater than the sum of nMax for all +** purgeable caches, +** +** (c) The system is under memory pressure and wants to avoid +** unnecessary pages cache entry allocations +** +** then attempt to recycle a page from the LRU list. If it is the right +** size, return the recycled buffer. Otherwise, free the buffer and +** proceed to step 5. +** +** 5. Otherwise, allocate and return a new page buffer. +** +** There are two versions of this routine. pcache1FetchWithMutex() is +** the general case. pcache1FetchNoMutex() is a faster implementation for +** the common case where pGroup->mutex is NULL. The pcache1Fetch() wrapper +** invokes the appropriate routine. +*/ +static PgHdr1 *pcache1FetchNoMutex( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage = 0; + + /* Step 1: Search the hash table for an existing entry. */ + pPage = pCache->apHash[iKey % pCache->nHash]; + while( pPage && pPage->iKey!=iKey ){ pPage = pPage->pNext; } + + /* Step 2: If the page was found in the hash table, then return it. + ** If the page was not in the hash table and createFlag is 0, abort. + ** Otherwise (page not in hash and createFlag!=0) continue with + ** subsequent steps to try to create the page. */ + if( pPage ){ + if( PAGE_IS_UNPINNED(pPage) ){ + return pcache1PinPage(pPage); + }else{ + return pPage; + } + }else if( createFlag ){ + /* Steps 3, 4, and 5 implemented by this subroutine */ + return pcache1FetchStage2(pCache, iKey, createFlag); + }else{ + return 0; + } +} +#if PCACHE1_MIGHT_USE_GROUP_MUTEX +static PgHdr1 *pcache1FetchWithMutex( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage; + + pcache1EnterMutex(pCache->pGroup); + pPage = pcache1FetchNoMutex(p, iKey, createFlag); + assert( pPage==0 || pCache->iMaxKey>=iKey ); + pcache1LeaveMutex(pCache->pGroup); + return pPage; +} +#endif +static sqlite3_pcache_page *pcache1Fetch( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ +#if PCACHE1_MIGHT_USE_GROUP_MUTEX || defined(SQLITE_DEBUG) + PCache1 *pCache = (PCache1 *)p; +#endif + + assert( offsetof(PgHdr1,page)==0 ); + assert( pCache->bPurgeable || createFlag!=1 ); + assert( pCache->bPurgeable || pCache->nMin==0 ); + assert( pCache->bPurgeable==0 || pCache->nMin==10 ); + assert( pCache->nMin==0 || pCache->bPurgeable ); + assert( pCache->nHash>0 ); +#if PCACHE1_MIGHT_USE_GROUP_MUTEX + if( pCache->pGroup->mutex ){ + return (sqlite3_pcache_page*)pcache1FetchWithMutex(p, iKey, createFlag); + }else +#endif + { + return (sqlite3_pcache_page*)pcache1FetchNoMutex(p, iKey, createFlag); + } +} + + +/* +** Implementation of the sqlite3_pcache.xUnpin method. +** +** Mark a page as unpinned (eligible for asynchronous recycling). +*/ +static void pcache1Unpin( + sqlite3_pcache *p, + sqlite3_pcache_page *pPg, + int reuseUnlikely +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage = (PgHdr1 *)pPg; + PGroup *pGroup = pCache->pGroup; + + assert( pPage->pCache==pCache ); + pcache1EnterMutex(pGroup); + + /* It is an error to call this function if the page is already + ** part of the PGroup LRU list. + */ + assert( pPage->pLruNext==0 ); + assert( PAGE_IS_PINNED(pPage) ); + + if( reuseUnlikely || pGroup->nPurgeable>pGroup->nMaxPage ){ + pcache1RemoveFromHash(pPage, 1); + }else{ + /* Add the page to the PGroup LRU list. */ + PgHdr1 **ppFirst = &pGroup->lru.pLruNext; + pPage->pLruPrev = &pGroup->lru; + (pPage->pLruNext = *ppFirst)->pLruPrev = pPage; + *ppFirst = pPage; + pCache->nRecyclable++; + } + + pcache1LeaveMutex(pCache->pGroup); +} + +/* +** Implementation of the sqlite3_pcache.xRekey method. +*/ +static void pcache1Rekey( + sqlite3_pcache *p, + sqlite3_pcache_page *pPg, + unsigned int iOld, + unsigned int iNew +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage = (PgHdr1 *)pPg; + PgHdr1 **pp; + unsigned int h; + assert( pPage->iKey==iOld ); + assert( pPage->pCache==pCache ); + + pcache1EnterMutex(pCache->pGroup); + + h = iOld%pCache->nHash; + pp = &pCache->apHash[h]; + while( (*pp)!=pPage ){ + pp = &(*pp)->pNext; + } + *pp = pPage->pNext; + + h = iNew%pCache->nHash; + pPage->iKey = iNew; + pPage->pNext = pCache->apHash[h]; + pCache->apHash[h] = pPage; + if( iNew>pCache->iMaxKey ){ + pCache->iMaxKey = iNew; + } + + pcache1LeaveMutex(pCache->pGroup); +} + +/* +** Implementation of the sqlite3_pcache.xTruncate method. +** +** Discard all unpinned pages in the cache with a page number equal to +** or greater than parameter iLimit. Any pinned pages with a page number +** equal to or greater than iLimit are implicitly unpinned. +*/ +static void pcache1Truncate(sqlite3_pcache *p, unsigned int iLimit){ + PCache1 *pCache = (PCache1 *)p; + pcache1EnterMutex(pCache->pGroup); + if( iLimit<=pCache->iMaxKey ){ + pcache1TruncateUnsafe(pCache, iLimit); + pCache->iMaxKey = iLimit-1; + } + pcache1LeaveMutex(pCache->pGroup); +} + +/* +** Implementation of the sqlite3_pcache.xDestroy method. +** +** Destroy a cache allocated using pcache1Create(). +*/ +static void pcache1Destroy(sqlite3_pcache *p){ + PCache1 *pCache = (PCache1 *)p; + PGroup *pGroup = pCache->pGroup; + assert( pCache->bPurgeable || (pCache->nMax==0 && pCache->nMin==0) ); + pcache1EnterMutex(pGroup); + if( pCache->nPage ) pcache1TruncateUnsafe(pCache, 0); + assert( pGroup->nMaxPage >= pCache->nMax ); + pGroup->nMaxPage -= pCache->nMax; + assert( pGroup->nMinPage >= pCache->nMin ); + pGroup->nMinPage -= pCache->nMin; + pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; + pcache1EnforceMaxPage(pCache); + pcache1LeaveMutex(pGroup); + sqlite3_free(pCache->pBulk); + sqlite3_free(pCache->apHash); + sqlite3_free(pCache); +} + +/* +** This function is called during initialization (sqlite3_initialize()) to +** install the default pluggable cache module, assuming the user has not +** already provided an alternative. +*/ +SQLITE_PRIVATE void sqlite3PCacheSetDefault(void){ + static const sqlite3_pcache_methods2 defaultMethods = { + 1, /* iVersion */ + 0, /* pArg */ + pcache1Init, /* xInit */ + pcache1Shutdown, /* xShutdown */ + pcache1Create, /* xCreate */ + pcache1Cachesize, /* xCachesize */ + pcache1Pagecount, /* xPagecount */ + pcache1Fetch, /* xFetch */ + pcache1Unpin, /* xUnpin */ + pcache1Rekey, /* xRekey */ + pcache1Truncate, /* xTruncate */ + pcache1Destroy, /* xDestroy */ + pcache1Shrink /* xShrink */ + }; + sqlite3_config(SQLITE_CONFIG_PCACHE2, &defaultMethods); +} + +/* +** Return the size of the header on each page of this PCACHE implementation. +*/ +SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void){ return ROUND8(sizeof(PgHdr1)); } + +/* +** Return the global mutex used by this PCACHE implementation. The +** sqlite3_status() routine needs access to this mutex. +*/ +SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void){ + return pcache1.mutex; +} + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +/* +** This function is called to free superfluous dynamically allocated memory +** held by the pager system. Memory in use by any SQLite pager allocated +** by the current thread may be sqlite3_free()ed. +** +** nReq is the number of bytes of memory required. Once this much has +** been released, the function returns. The return value is the total number +** of bytes of memory released. +*/ +SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){ + int nFree = 0; + assert( sqlite3_mutex_notheld(pcache1.grp.mutex) ); + assert( sqlite3_mutex_notheld(pcache1.mutex) ); + if( sqlite3GlobalConfig.pPage==0 ){ + PgHdr1 *p; + pcache1EnterMutex(&pcache1.grp); + while( (nReq<0 || nFreeisAnchor==0 + ){ + nFree += pcache1MemSize(p->page.pBuf); +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + nFree += sqlite3MemSize(p); +#endif + assert( PAGE_IS_UNPINNED(p) ); + pcache1PinPage(p); + pcache1RemoveFromHash(p, 1); + } + pcache1LeaveMutex(&pcache1.grp); + } + return nFree; +} +#endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */ + +#ifdef SQLITE_TEST +/* +** This function is used by test procedures to inspect the internal state +** of the global cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheStats( + int *pnCurrent, /* OUT: Total number of pages cached */ + int *pnMax, /* OUT: Global maximum cache size */ + int *pnMin, /* OUT: Sum of PCache1.nMin for purgeable caches */ + int *pnRecyclable /* OUT: Total number of pages available for recycling */ +){ + PgHdr1 *p; + int nRecyclable = 0; + for(p=pcache1.grp.lru.pLruNext; p && !p->isAnchor; p=p->pLruNext){ + assert( PAGE_IS_UNPINNED(p) ); + nRecyclable++; + } + *pnCurrent = pcache1.grp.nPurgeable; + *pnMax = (int)pcache1.grp.nMaxPage; + *pnMin = (int)pcache1.grp.nMinPage; + *pnRecyclable = nRecyclable; +} +#endif + +/************** End of pcache1.c *********************************************/ +/************** Begin file rowset.c ******************************************/ +/* +** 2008 December 3 +** +** 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 module implements an object we call a "RowSet". +** +** The RowSet object is a collection of rowids. Rowids +** are inserted into the RowSet in an arbitrary order. Inserts +** can be intermixed with tests to see if a given rowid has been +** previously inserted into the RowSet. +** +** After all inserts are finished, it is possible to extract the +** elements of the RowSet in sorted order. Once this extraction +** process has started, no new elements may be inserted. +** +** Hence, the primitive operations for a RowSet are: +** +** CREATE +** INSERT +** TEST +** SMALLEST +** DESTROY +** +** The CREATE and DESTROY primitives are the constructor and destructor, +** obviously. The INSERT primitive adds a new element to the RowSet. +** TEST checks to see if an element is already in the RowSet. SMALLEST +** extracts the least value from the RowSet. +** +** The INSERT primitive might allocate additional memory. Memory is +** allocated in chunks so most INSERTs do no allocation. There is an +** upper bound on the size of allocated memory. No memory is freed +** until DESTROY. +** +** The TEST primitive includes a "batch" number. The TEST primitive +** will only see elements that were inserted before the last change +** in the batch number. In other words, if an INSERT occurs between +** two TESTs where the TESTs have the same batch nubmer, then the +** value added by the INSERT will not be visible to the second TEST. +** The initial batch number is zero, so if the very first TEST contains +** a non-zero batch number, it will see all prior INSERTs. +** +** No INSERTs may occurs after a SMALLEST. An assertion will fail if +** that is attempted. +** +** The cost of an INSERT is roughly constant. (Sometimes new memory +** has to be allocated on an INSERT.) The cost of a TEST with a new +** batch number is O(NlogN) where N is the number of elements in the RowSet. +** The cost of a TEST using the same batch number is O(logN). The cost +** of the first SMALLEST is O(NlogN). Second and subsequent SMALLEST +** primitives are constant time. The cost of DESTROY is O(N). +** +** TEST and SMALLEST may not be used by the same RowSet. This used to +** be possible, but the feature was not used, so it was removed in order +** to simplify the code. +*/ +/* #include "sqliteInt.h" */ + + +/* +** Target size for allocation chunks. +*/ +#define ROWSET_ALLOCATION_SIZE 1024 + +/* +** The number of rowset entries per allocation chunk. +*/ +#define ROWSET_ENTRY_PER_CHUNK \ + ((ROWSET_ALLOCATION_SIZE-8)/sizeof(struct RowSetEntry)) + +/* +** Each entry in a RowSet is an instance of the following object. +** +** This same object is reused to store a linked list of trees of RowSetEntry +** objects. In that alternative use, pRight points to the next entry +** in the list, pLeft points to the tree, and v is unused. The +** RowSet.pForest value points to the head of this forest list. +*/ +struct RowSetEntry { + i64 v; /* ROWID value for this entry */ + struct RowSetEntry *pRight; /* Right subtree (larger entries) or list */ + struct RowSetEntry *pLeft; /* Left subtree (smaller entries) */ +}; + +/* +** RowSetEntry objects are allocated in large chunks (instances of the +** following structure) to reduce memory allocation overhead. The +** chunks are kept on a linked list so that they can be deallocated +** when the RowSet is destroyed. +*/ +struct RowSetChunk { + struct RowSetChunk *pNextChunk; /* Next chunk on list of them all */ + struct RowSetEntry aEntry[ROWSET_ENTRY_PER_CHUNK]; /* Allocated entries */ +}; + +/* +** A RowSet in an instance of the following structure. +** +** A typedef of this structure if found in sqliteInt.h. +*/ +struct RowSet { + struct RowSetChunk *pChunk; /* List of all chunk allocations */ + sqlite3 *db; /* The database connection */ + struct RowSetEntry *pEntry; /* List of entries using pRight */ + struct RowSetEntry *pLast; /* Last entry on the pEntry list */ + struct RowSetEntry *pFresh; /* Source of new entry objects */ + struct RowSetEntry *pForest; /* List of binary trees of entries */ + u16 nFresh; /* Number of objects on pFresh */ + u16 rsFlags; /* Various flags */ + int iBatch; /* Current insert batch */ +}; + +/* +** Allowed values for RowSet.rsFlags +*/ +#define ROWSET_SORTED 0x01 /* True if RowSet.pEntry is sorted */ +#define ROWSET_NEXT 0x02 /* True if sqlite3RowSetNext() has been called */ + +/* +** Allocate a RowSet object. Return NULL if a memory allocation +** error occurs. +*/ +SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3 *db){ + RowSet *p = sqlite3DbMallocRawNN(db, sizeof(*p)); + if( p ){ + int N = sqlite3DbMallocSize(db, p); + p->pChunk = 0; + p->db = db; + p->pEntry = 0; + p->pLast = 0; + p->pForest = 0; + p->pFresh = (struct RowSetEntry*)(ROUND8(sizeof(*p)) + (char*)p); + p->nFresh = (u16)((N - ROUND8(sizeof(*p)))/sizeof(struct RowSetEntry)); + p->rsFlags = ROWSET_SORTED; + p->iBatch = 0; + } + return p; +} + +/* +** Deallocate all chunks from a RowSet. This frees all memory that +** the RowSet has allocated over its lifetime. This routine is +** the destructor for the RowSet. +*/ +SQLITE_PRIVATE void sqlite3RowSetClear(void *pArg){ + RowSet *p = (RowSet*)pArg; + struct RowSetChunk *pChunk, *pNextChunk; + for(pChunk=p->pChunk; pChunk; pChunk = pNextChunk){ + pNextChunk = pChunk->pNextChunk; + sqlite3DbFree(p->db, pChunk); + } + p->pChunk = 0; + p->nFresh = 0; + p->pEntry = 0; + p->pLast = 0; + p->pForest = 0; + p->rsFlags = ROWSET_SORTED; +} + +/* +** Deallocate all chunks from a RowSet. This frees all memory that +** the RowSet has allocated over its lifetime. This routine is +** the destructor for the RowSet. +*/ +SQLITE_PRIVATE void sqlite3RowSetDelete(void *pArg){ + sqlite3RowSetClear(pArg); + sqlite3DbFree(((RowSet*)pArg)->db, pArg); +} + +/* +** Allocate a new RowSetEntry object that is associated with the +** given RowSet. Return a pointer to the new and completely uninitialized +** object. +** +** In an OOM situation, the RowSet.db->mallocFailed flag is set and this +** routine returns NULL. +*/ +static struct RowSetEntry *rowSetEntryAlloc(RowSet *p){ + assert( p!=0 ); + if( p->nFresh==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* We could allocate a fresh RowSetEntry each time one is needed, but it + ** is more efficient to pull a preallocated entry from the pool */ + struct RowSetChunk *pNew; + pNew = sqlite3DbMallocRawNN(p->db, sizeof(*pNew)); + if( pNew==0 ){ + return 0; + } + pNew->pNextChunk = p->pChunk; + p->pChunk = pNew; + p->pFresh = pNew->aEntry; + p->nFresh = ROWSET_ENTRY_PER_CHUNK; + } + p->nFresh--; + return p->pFresh++; +} + +/* +** Insert a new value into a RowSet. +** +** The mallocFailed flag of the database connection is set if a +** memory allocation fails. +*/ +SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet *p, i64 rowid){ + struct RowSetEntry *pEntry; /* The new entry */ + struct RowSetEntry *pLast; /* The last prior entry */ + + /* This routine is never called after sqlite3RowSetNext() */ + assert( p!=0 && (p->rsFlags & ROWSET_NEXT)==0 ); + + pEntry = rowSetEntryAlloc(p); + if( pEntry==0 ) return; + pEntry->v = rowid; + pEntry->pRight = 0; + pLast = p->pLast; + if( pLast ){ + if( rowid<=pLast->v ){ /*OPTIMIZATION-IF-FALSE*/ + /* Avoid unnecessary sorts by preserving the ROWSET_SORTED flags + ** where possible */ + p->rsFlags &= ~ROWSET_SORTED; + } + pLast->pRight = pEntry; + }else{ + p->pEntry = pEntry; + } + p->pLast = pEntry; +} + +/* +** Merge two lists of RowSetEntry objects. Remove duplicates. +** +** The input lists are connected via pRight pointers and are +** assumed to each already be in sorted order. +*/ +static struct RowSetEntry *rowSetEntryMerge( + struct RowSetEntry *pA, /* First sorted list to be merged */ + struct RowSetEntry *pB /* Second sorted list to be merged */ +){ + struct RowSetEntry head; + struct RowSetEntry *pTail; + + pTail = &head; + assert( pA!=0 && pB!=0 ); + for(;;){ + assert( pA->pRight==0 || pA->v<=pA->pRight->v ); + assert( pB->pRight==0 || pB->v<=pB->pRight->v ); + if( pA->v<=pB->v ){ + if( pA->vv ) pTail = pTail->pRight = pA; + pA = pA->pRight; + if( pA==0 ){ + pTail->pRight = pB; + break; + } + }else{ + pTail = pTail->pRight = pB; + pB = pB->pRight; + if( pB==0 ){ + pTail->pRight = pA; + break; + } + } + } + return head.pRight; +} + +/* +** Sort all elements on the list of RowSetEntry objects into order of +** increasing v. +*/ +static struct RowSetEntry *rowSetEntrySort(struct RowSetEntry *pIn){ + unsigned int i; + struct RowSetEntry *pNext, *aBucket[40]; + + memset(aBucket, 0, sizeof(aBucket)); + while( pIn ){ + pNext = pIn->pRight; + pIn->pRight = 0; + for(i=0; aBucket[i]; i++){ + pIn = rowSetEntryMerge(aBucket[i], pIn); + aBucket[i] = 0; + } + aBucket[i] = pIn; + pIn = pNext; + } + pIn = aBucket[0]; + for(i=1; ipLeft ){ + struct RowSetEntry *p; + rowSetTreeToList(pIn->pLeft, ppFirst, &p); + p->pRight = pIn; + }else{ + *ppFirst = pIn; + } + if( pIn->pRight ){ + rowSetTreeToList(pIn->pRight, &pIn->pRight, ppLast); + }else{ + *ppLast = pIn; + } + assert( (*ppLast)->pRight==0 ); +} + + +/* +** Convert a sorted list of elements (connected by pRight) into a binary +** tree with depth of iDepth. A depth of 1 means the tree contains a single +** node taken from the head of *ppList. A depth of 2 means a tree with +** three nodes. And so forth. +** +** Use as many entries from the input list as required and update the +** *ppList to point to the unused elements of the list. If the input +** list contains too few elements, then construct an incomplete tree +** and leave *ppList set to NULL. +** +** Return a pointer to the root of the constructed binary tree. +*/ +static struct RowSetEntry *rowSetNDeepTree( + struct RowSetEntry **ppList, + int iDepth +){ + struct RowSetEntry *p; /* Root of the new tree */ + struct RowSetEntry *pLeft; /* Left subtree */ + if( *ppList==0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Prevent unnecessary deep recursion when we run out of entries */ + return 0; + } + if( iDepth>1 ){ /*OPTIMIZATION-IF-TRUE*/ + /* This branch causes a *balanced* tree to be generated. A valid tree + ** is still generated without this branch, but the tree is wildly + ** unbalanced and inefficient. */ + pLeft = rowSetNDeepTree(ppList, iDepth-1); + p = *ppList; + if( p==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* It is safe to always return here, but the resulting tree + ** would be unbalanced */ + return pLeft; + } + p->pLeft = pLeft; + *ppList = p->pRight; + p->pRight = rowSetNDeepTree(ppList, iDepth-1); + }else{ + p = *ppList; + *ppList = p->pRight; + p->pLeft = p->pRight = 0; + } + return p; +} + +/* +** Convert a sorted list of elements into a binary tree. Make the tree +** as deep as it needs to be in order to contain the entire list. +*/ +static struct RowSetEntry *rowSetListToTree(struct RowSetEntry *pList){ + int iDepth; /* Depth of the tree so far */ + struct RowSetEntry *p; /* Current tree root */ + struct RowSetEntry *pLeft; /* Left subtree */ + + assert( pList!=0 ); + p = pList; + pList = p->pRight; + p->pLeft = p->pRight = 0; + for(iDepth=1; pList; iDepth++){ + pLeft = p; + p = pList; + pList = p->pRight; + p->pLeft = pLeft; + p->pRight = rowSetNDeepTree(&pList, iDepth); + } + return p; +} + +/* +** Extract the smallest element from the RowSet. +** Write the element into *pRowid. Return 1 on success. Return +** 0 if the RowSet is already empty. +** +** After this routine has been called, the sqlite3RowSetInsert() +** routine may not be called again. +** +** This routine may not be called after sqlite3RowSetTest() has +** been used. Older versions of RowSet allowed that, but as the +** capability was not used by the code generator, it was removed +** for code economy. +*/ +SQLITE_PRIVATE int sqlite3RowSetNext(RowSet *p, i64 *pRowid){ + assert( p!=0 ); + assert( p->pForest==0 ); /* Cannot be used with sqlite3RowSetText() */ + + /* Merge the forest into a single sorted list on first call */ + if( (p->rsFlags & ROWSET_NEXT)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + if( (p->rsFlags & ROWSET_SORTED)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + p->pEntry = rowSetEntrySort(p->pEntry); + } + p->rsFlags |= ROWSET_SORTED|ROWSET_NEXT; + } + + /* Return the next entry on the list */ + if( p->pEntry ){ + *pRowid = p->pEntry->v; + p->pEntry = p->pEntry->pRight; + if( p->pEntry==0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Free memory immediately, rather than waiting on sqlite3_finalize() */ + sqlite3RowSetClear(p); + } + return 1; + }else{ + return 0; + } +} + +/* +** Check to see if element iRowid was inserted into the rowset as +** part of any insert batch prior to iBatch. Return 1 or 0. +** +** If this is the first test of a new batch and if there exist entries +** on pRowSet->pEntry, then sort those entries into the forest at +** pRowSet->pForest so that they can be tested. +*/ +SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 iRowid){ + struct RowSetEntry *p, *pTree; + + /* This routine is never called after sqlite3RowSetNext() */ + assert( pRowSet!=0 && (pRowSet->rsFlags & ROWSET_NEXT)==0 ); + + /* Sort entries into the forest on the first test of a new batch. + ** To save unnecessary work, only do this when the batch number changes. + */ + if( iBatch!=pRowSet->iBatch ){ /*OPTIMIZATION-IF-FALSE*/ + p = pRowSet->pEntry; + if( p ){ + struct RowSetEntry **ppPrevTree = &pRowSet->pForest; + if( (pRowSet->rsFlags & ROWSET_SORTED)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* Only sort the current set of entries if they need it */ + p = rowSetEntrySort(p); + } + for(pTree = pRowSet->pForest; pTree; pTree=pTree->pRight){ + ppPrevTree = &pTree->pRight; + if( pTree->pLeft==0 ){ + pTree->pLeft = rowSetListToTree(p); + break; + }else{ + struct RowSetEntry *pAux, *pTail; + rowSetTreeToList(pTree->pLeft, &pAux, &pTail); + pTree->pLeft = 0; + p = rowSetEntryMerge(pAux, p); + } + } + if( pTree==0 ){ + *ppPrevTree = pTree = rowSetEntryAlloc(pRowSet); + if( pTree ){ + pTree->v = 0; + pTree->pRight = 0; + pTree->pLeft = rowSetListToTree(p); + } + } + pRowSet->pEntry = 0; + pRowSet->pLast = 0; + pRowSet->rsFlags |= ROWSET_SORTED; + } + pRowSet->iBatch = iBatch; + } + + /* Test to see if the iRowid value appears anywhere in the forest. + ** Return 1 if it does and 0 if not. + */ + for(pTree = pRowSet->pForest; pTree; pTree=pTree->pRight){ + p = pTree->pLeft; + while( p ){ + if( p->vpRight; + }else if( p->v>iRowid ){ + p = p->pLeft; + }else{ + return 1; + } + } + } + return 0; +} + +/************** End of rowset.c **********************************************/ +/************** Begin file pager.c *******************************************/ +/* +** 2001 September 15 +** +** 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 is the implementation of the page cache subsystem or "pager". +** +** The pager is used to access a database disk file. It implements +** atomic commit and rollback through the use of a journal file that +** is separate from the database file. The pager also implements file +** locking to prevent two processes from writing the same database +** file simultaneously, or one process from reading the database while +** another is writing. +*/ +#ifndef SQLITE_OMIT_DISKIO +/* #include "sqliteInt.h" */ +/************** Include wal.h in the middle of pager.c ***********************/ +/************** Begin file wal.h *********************************************/ +/* +** 2010 February 1 +** +** 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 header file defines the interface to the write-ahead logging +** system. Refer to the comments below and the header comment attached to +** the implementation of each function in log.c for further details. +*/ + +#ifndef SQLITE_WAL_H +#define SQLITE_WAL_H + +/* #include "sqliteInt.h" */ + +/* Macros for extracting appropriate sync flags for either transaction +** commits (WAL_SYNC_FLAGS(X)) or for checkpoint ops (CKPT_SYNC_FLAGS(X)): +*/ +#define WAL_SYNC_FLAGS(X) ((X)&0x03) +#define CKPT_SYNC_FLAGS(X) (((X)>>2)&0x03) + +#ifdef SQLITE_OMIT_WAL +# define sqlite3WalOpen(x,y,z) 0 +# define sqlite3WalLimit(x,y) +# define sqlite3WalClose(v,w,x,y,z) 0 +# define sqlite3WalBeginReadTransaction(y,z) 0 +# define sqlite3WalEndReadTransaction(z) +# define sqlite3WalDbsize(y) 0 +# define sqlite3WalBeginWriteTransaction(y) 0 +# define sqlite3WalEndWriteTransaction(x) 0 +# define sqlite3WalUndo(x,y,z) 0 +# define sqlite3WalSavepoint(y,z) +# define sqlite3WalSavepointUndo(y,z) 0 +# define sqlite3WalFrames(u,v,w,x,y,z) 0 +# define sqlite3WalCheckpoint(q,r,s,t,u,v,w,x,y,z) 0 +# define sqlite3WalCallback(z) 0 +# define sqlite3WalExclusiveMode(y,z) 0 +# define sqlite3WalHeapMemory(z) 0 +# define sqlite3WalFramesize(z) 0 +# define sqlite3WalFindFrame(x,y,z) 0 +# define sqlite3WalFile(x) 0 +#else + +#define WAL_SAVEPOINT_NDATA 4 + +/* Connection to a write-ahead log (WAL) file. +** There is one object of this type for each pager. +*/ +typedef struct Wal Wal; + +/* Open and close a connection to a write-ahead log. */ +SQLITE_PRIVATE int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *, int, i64, Wal**); +SQLITE_PRIVATE int sqlite3WalClose(Wal *pWal, sqlite3*, int sync_flags, int, u8 *); + +/* Set the limiting size of a WAL file. */ +SQLITE_PRIVATE void sqlite3WalLimit(Wal*, i64); + +/* Used by readers to open (lock) and close (unlock) a snapshot. A +** snapshot is like a read-transaction. It is the state of the database +** at an instant in time. sqlite3WalOpenSnapshot gets a read lock and +** preserves the current state even if the other threads or processes +** write to or checkpoint the WAL. sqlite3WalCloseSnapshot() closes the +** transaction and releases the lock. +*/ +SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *); +SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal); + +/* Read a page from the write-ahead log, if it is present. */ +SQLITE_PRIVATE int sqlite3WalFindFrame(Wal *, Pgno, u32 *); +SQLITE_PRIVATE int sqlite3WalReadFrame(Wal *, u32, int, u8 *); + +/* If the WAL is not empty, return the size of the database. */ +SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal); + +/* Obtain or release the WRITER lock. */ +SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal); +SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal); + +/* Undo any frames written (but not committed) to the log */ +SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx); + +/* Return an integer that records the current (uncommitted) write +** position in the WAL */ +SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData); + +/* Move the write position of the WAL back to iFrame. Called in +** response to a ROLLBACK TO command. */ +SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData); + +/* Write a frame or frames to the log. */ +SQLITE_PRIVATE int sqlite3WalFrames(Wal *pWal, int, PgHdr *, Pgno, int, int); + +/* Copy pages from the log to the database file */ +SQLITE_PRIVATE int sqlite3WalCheckpoint( + Wal *pWal, /* Write-ahead log connection */ + sqlite3 *db, /* Check this handle's interrupt flag */ + int eMode, /* One of PASSIVE, FULL and RESTART */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int sync_flags, /* Flags to sync db file with (or 0) */ + int nBuf, /* Size of buffer nBuf */ + u8 *zBuf, /* Temporary buffer to use */ + int *pnLog, /* OUT: Number of frames in WAL */ + int *pnCkpt /* OUT: Number of backfilled frames in WAL */ +); + +/* Return the value to pass to a sqlite3_wal_hook callback, the +** number of frames in the WAL at the point of the last commit since +** sqlite3WalCallback() was called. If no commits have occurred since +** the last call, then return 0. +*/ +SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal); + +/* Tell the wal layer that an EXCLUSIVE lock has been obtained (or released) +** by the pager layer on the database file. +*/ +SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op); + +/* Return true if the argument is non-NULL and the WAL module is using +** heap-memory for the wal-index. Otherwise, if the argument is NULL or the +** WAL module is using shared-memory, return false. +*/ +SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal); + +#ifdef SQLITE_ENABLE_SNAPSHOT +SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot); +SQLITE_PRIVATE void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot); +SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal); +SQLITE_PRIVATE int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot); +SQLITE_PRIVATE void sqlite3WalSnapshotUnlock(Wal *pWal); +#endif + +#ifdef SQLITE_ENABLE_ZIPVFS +/* If the WAL file is not empty, return the number of bytes of content +** stored in each frame (i.e. the db page-size when the WAL was created). +*/ +SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal); +#endif + +/* Return the sqlite3_file object for the WAL file */ +SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal); + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +SQLITE_PRIVATE int sqlite3WalWriteLock(Wal *pWal, int bLock); +SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db); +#endif + +#endif /* ifndef SQLITE_OMIT_WAL */ +#endif /* SQLITE_WAL_H */ + +/************** End of wal.h *************************************************/ +/************** Continuing where we left off in pager.c **********************/ + + +/******************* NOTES ON THE DESIGN OF THE PAGER ************************ +** +** This comment block describes invariants that hold when using a rollback +** journal. These invariants do not apply for journal_mode=WAL, +** journal_mode=MEMORY, or journal_mode=OFF. +** +** Within this comment block, a page is deemed to have been synced +** automatically as soon as it is written when PRAGMA synchronous=OFF. +** Otherwise, the page is not synced until the xSync method of the VFS +** is called successfully on the file containing the page. +** +** Definition: A page of the database file is said to be "overwriteable" if +** one or more of the following are true about the page: +** +** (a) The original content of the page as it was at the beginning of +** the transaction has been written into the rollback journal and +** synced. +** +** (b) The page was a freelist leaf page at the start of the transaction. +** +** (c) The page number is greater than the largest page that existed in +** the database file at the start of the transaction. +** +** (1) A page of the database file is never overwritten unless one of the +** following are true: +** +** (a) The page and all other pages on the same sector are overwriteable. +** +** (b) The atomic page write optimization is enabled, and the entire +** transaction other than the update of the transaction sequence +** number consists of a single page change. +** +** (2) The content of a page written into the rollback journal exactly matches +** both the content in the database when the rollback journal was written +** and the content in the database at the beginning of the current +** transaction. +** +** (3) Writes to the database file are an integer multiple of the page size +** in length and are aligned on a page boundary. +** +** (4) Reads from the database file are either aligned on a page boundary and +** an integer multiple of the page size in length or are taken from the +** first 100 bytes of the database file. +** +** (5) All writes to the database file are synced prior to the rollback journal +** being deleted, truncated, or zeroed. +** +** (6) If a master journal file is used, then all writes to the database file +** are synced prior to the master journal being deleted. +** +** Definition: Two databases (or the same database at two points it time) +** are said to be "logically equivalent" if they give the same answer to +** all queries. Note in particular the content of freelist leaf +** pages can be changed arbitrarily without affecting the logical equivalence +** of the database. +** +** (7) At any time, if any subset, including the empty set and the total set, +** of the unsynced changes to a rollback journal are removed and the +** journal is rolled back, the resulting database file will be logically +** equivalent to the database file at the beginning of the transaction. +** +** (8) When a transaction is rolled back, the xTruncate method of the VFS +** is called to restore the database file to the same size it was at +** the beginning of the transaction. (In some VFSes, the xTruncate +** method is a no-op, but that does not change the fact the SQLite will +** invoke it.) +** +** (9) Whenever the database file is modified, at least one bit in the range +** of bytes from 24 through 39 inclusive will be changed prior to releasing +** the EXCLUSIVE lock, thus signaling other connections on the same +** database to flush their caches. +** +** (10) The pattern of bits in bytes 24 through 39 shall not repeat in less +** than one billion transactions. +** +** (11) A database file is well-formed at the beginning and at the conclusion +** of every transaction. +** +** (12) An EXCLUSIVE lock is held on the database file when writing to +** the database file. +** +** (13) A SHARED lock is held on the database file while reading any +** content out of the database file. +** +******************************************************************************/ + +/* +** Macros for troubleshooting. Normally turned off +*/ +#if 0 +int sqlite3PagerTrace=1; /* True to enable tracing */ +#define sqlite3DebugPrintf printf +#define PAGERTRACE(X) if( sqlite3PagerTrace ){ sqlite3DebugPrintf X; } +#else +#define PAGERTRACE(X) +#endif + +/* +** The following two macros are used within the PAGERTRACE() macros above +** to print out file-descriptors. +** +** PAGERID() takes a pointer to a Pager struct as its argument. The +** associated file-descriptor is returned. FILEHANDLEID() takes an sqlite3_file +** struct as its argument. +*/ +#define PAGERID(p) (SQLITE_PTR_TO_INT(p->fd)) +#define FILEHANDLEID(fd) (SQLITE_PTR_TO_INT(fd)) + +/* +** The Pager.eState variable stores the current 'state' of a pager. A +** pager may be in any one of the seven states shown in the following +** state diagram. +** +** OPEN <------+------+ +** | | | +** V | | +** +---------> READER-------+ | +** | | | +** | V | +** |<-------WRITER_LOCKED------> ERROR +** | | ^ +** | V | +** |<------WRITER_CACHEMOD-------->| +** | | | +** | V | +** |<-------WRITER_DBMOD---------->| +** | | | +** | V | +** +<------WRITER_FINISHED-------->+ +** +** +** List of state transitions and the C [function] that performs each: +** +** OPEN -> READER [sqlite3PagerSharedLock] +** READER -> OPEN [pager_unlock] +** +** READER -> WRITER_LOCKED [sqlite3PagerBegin] +** WRITER_LOCKED -> WRITER_CACHEMOD [pager_open_journal] +** WRITER_CACHEMOD -> WRITER_DBMOD [syncJournal] +** WRITER_DBMOD -> WRITER_FINISHED [sqlite3PagerCommitPhaseOne] +** WRITER_*** -> READER [pager_end_transaction] +** +** WRITER_*** -> ERROR [pager_error] +** ERROR -> OPEN [pager_unlock] +** +** +** OPEN: +** +** The pager starts up in this state. Nothing is guaranteed in this +** state - the file may or may not be locked and the database size is +** unknown. The database may not be read or written. +** +** * No read or write transaction is active. +** * Any lock, or no lock at all, may be held on the database file. +** * The dbSize, dbOrigSize and dbFileSize variables may not be trusted. +** +** READER: +** +** In this state all the requirements for reading the database in +** rollback (non-WAL) mode are met. Unless the pager is (or recently +** was) in exclusive-locking mode, a user-level read transaction is +** open. The database size is known in this state. +** +** A connection running with locking_mode=normal enters this state when +** it opens a read-transaction on the database and returns to state +** OPEN after the read-transaction is completed. However a connection +** running in locking_mode=exclusive (including temp databases) remains in +** this state even after the read-transaction is closed. The only way +** a locking_mode=exclusive connection can transition from READER to OPEN +** is via the ERROR state (see below). +** +** * A read transaction may be active (but a write-transaction cannot). +** * A SHARED or greater lock is held on the database file. +** * The dbSize variable may be trusted (even if a user-level read +** transaction is not active). The dbOrigSize and dbFileSize variables +** may not be trusted at this point. +** * If the database is a WAL database, then the WAL connection is open. +** * Even if a read-transaction is not open, it is guaranteed that +** there is no hot-journal in the file-system. +** +** WRITER_LOCKED: +** +** The pager moves to this state from READER when a write-transaction +** is first opened on the database. In WRITER_LOCKED state, all locks +** required to start a write-transaction are held, but no actual +** modifications to the cache or database have taken place. +** +** In rollback mode, a RESERVED or (if the transaction was opened with +** BEGIN EXCLUSIVE) EXCLUSIVE lock is obtained on the database file when +** moving to this state, but the journal file is not written to or opened +** to in this state. If the transaction is committed or rolled back while +** in WRITER_LOCKED state, all that is required is to unlock the database +** file. +** +** IN WAL mode, WalBeginWriteTransaction() is called to lock the log file. +** If the connection is running with locking_mode=exclusive, an attempt +** is made to obtain an EXCLUSIVE lock on the database file. +** +** * A write transaction is active. +** * If the connection is open in rollback-mode, a RESERVED or greater +** lock is held on the database file. +** * If the connection is open in WAL-mode, a WAL write transaction +** is open (i.e. sqlite3WalBeginWriteTransaction() has been successfully +** called). +** * The dbSize, dbOrigSize and dbFileSize variables are all valid. +** * The contents of the pager cache have not been modified. +** * The journal file may or may not be open. +** * Nothing (not even the first header) has been written to the journal. +** +** WRITER_CACHEMOD: +** +** A pager moves from WRITER_LOCKED state to this state when a page is +** first modified by the upper layer. In rollback mode the journal file +** is opened (if it is not already open) and a header written to the +** start of it. The database file on disk has not been modified. +** +** * A write transaction is active. +** * A RESERVED or greater lock is held on the database file. +** * The journal file is open and the first header has been written +** to it, but the header has not been synced to disk. +** * The contents of the page cache have been modified. +** +** WRITER_DBMOD: +** +** The pager transitions from WRITER_CACHEMOD into WRITER_DBMOD state +** when it modifies the contents of the database file. WAL connections +** never enter this state (since they do not modify the database file, +** just the log file). +** +** * A write transaction is active. +** * An EXCLUSIVE or greater lock is held on the database file. +** * The journal file is open and the first header has been written +** and synced to disk. +** * The contents of the page cache have been modified (and possibly +** written to disk). +** +** WRITER_FINISHED: +** +** It is not possible for a WAL connection to enter this state. +** +** A rollback-mode pager changes to WRITER_FINISHED state from WRITER_DBMOD +** state after the entire transaction has been successfully written into the +** database file. In this state the transaction may be committed simply +** by finalizing the journal file. Once in WRITER_FINISHED state, it is +** not possible to modify the database further. At this point, the upper +** layer must either commit or rollback the transaction. +** +** * A write transaction is active. +** * An EXCLUSIVE or greater lock is held on the database file. +** * All writing and syncing of journal and database data has finished. +** If no error occurred, all that remains is to finalize the journal to +** commit the transaction. If an error did occur, the caller will need +** to rollback the transaction. +** +** ERROR: +** +** The ERROR state is entered when an IO or disk-full error (including +** SQLITE_IOERR_NOMEM) occurs at a point in the code that makes it +** difficult to be sure that the in-memory pager state (cache contents, +** db size etc.) are consistent with the contents of the file-system. +** +** Temporary pager files may enter the ERROR state, but in-memory pagers +** cannot. +** +** For example, if an IO error occurs while performing a rollback, +** the contents of the page-cache may be left in an inconsistent state. +** At this point it would be dangerous to change back to READER state +** (as usually happens after a rollback). Any subsequent readers might +** report database corruption (due to the inconsistent cache), and if +** they upgrade to writers, they may inadvertently corrupt the database +** file. To avoid this hazard, the pager switches into the ERROR state +** instead of READER following such an error. +** +** Once it has entered the ERROR state, any attempt to use the pager +** to read or write data returns an error. Eventually, once all +** outstanding transactions have been abandoned, the pager is able to +** transition back to OPEN state, discarding the contents of the +** page-cache and any other in-memory state at the same time. Everything +** is reloaded from disk (and, if necessary, hot-journal rollback peformed) +** when a read-transaction is next opened on the pager (transitioning +** the pager into READER state). At that point the system has recovered +** from the error. +** +** Specifically, the pager jumps into the ERROR state if: +** +** 1. An error occurs while attempting a rollback. This happens in +** function sqlite3PagerRollback(). +** +** 2. An error occurs while attempting to finalize a journal file +** following a commit in function sqlite3PagerCommitPhaseTwo(). +** +** 3. An error occurs while attempting to write to the journal or +** database file in function pagerStress() in order to free up +** memory. +** +** In other cases, the error is returned to the b-tree layer. The b-tree +** layer then attempts a rollback operation. If the error condition +** persists, the pager enters the ERROR state via condition (1) above. +** +** Condition (3) is necessary because it can be triggered by a read-only +** statement executed within a transaction. In this case, if the error +** code were simply returned to the user, the b-tree layer would not +** automatically attempt a rollback, as it assumes that an error in a +** read-only statement cannot leave the pager in an internally inconsistent +** state. +** +** * The Pager.errCode variable is set to something other than SQLITE_OK. +** * There are one or more outstanding references to pages (after the +** last reference is dropped the pager should move back to OPEN state). +** * The pager is not an in-memory pager. +** +** +** Notes: +** +** * A pager is never in WRITER_DBMOD or WRITER_FINISHED state if the +** connection is open in WAL mode. A WAL connection is always in one +** of the first four states. +** +** * Normally, a connection open in exclusive mode is never in PAGER_OPEN +** state. There are two exceptions: immediately after exclusive-mode has +** been turned on (and before any read or write transactions are +** executed), and when the pager is leaving the "error state". +** +** * See also: assert_pager_state(). +*/ +#define PAGER_OPEN 0 +#define PAGER_READER 1 +#define PAGER_WRITER_LOCKED 2 +#define PAGER_WRITER_CACHEMOD 3 +#define PAGER_WRITER_DBMOD 4 +#define PAGER_WRITER_FINISHED 5 +#define PAGER_ERROR 6 + +/* +** The Pager.eLock variable is almost always set to one of the +** following locking-states, according to the lock currently held on +** the database file: NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK. +** This variable is kept up to date as locks are taken and released by +** the pagerLockDb() and pagerUnlockDb() wrappers. +** +** If the VFS xLock() or xUnlock() returns an error other than SQLITE_BUSY +** (i.e. one of the SQLITE_IOERR subtypes), it is not clear whether or not +** the operation was successful. In these circumstances pagerLockDb() and +** pagerUnlockDb() take a conservative approach - eLock is always updated +** when unlocking the file, and only updated when locking the file if the +** VFS call is successful. This way, the Pager.eLock variable may be set +** to a less exclusive (lower) value than the lock that is actually held +** at the system level, but it is never set to a more exclusive value. +** +** This is usually safe. If an xUnlock fails or appears to fail, there may +** be a few redundant xLock() calls or a lock may be held for longer than +** required, but nothing really goes wrong. +** +** The exception is when the database file is unlocked as the pager moves +** from ERROR to OPEN state. At this point there may be a hot-journal file +** in the file-system that needs to be rolled back (as part of an OPEN->SHARED +** transition, by the same pager or any other). If the call to xUnlock() +** fails at this point and the pager is left holding an EXCLUSIVE lock, this +** can confuse the call to xCheckReservedLock() call made later as part +** of hot-journal detection. +** +** xCheckReservedLock() is defined as returning true "if there is a RESERVED +** lock held by this process or any others". So xCheckReservedLock may +** return true because the caller itself is holding an EXCLUSIVE lock (but +** doesn't know it because of a previous error in xUnlock). If this happens +** a hot-journal may be mistaken for a journal being created by an active +** transaction in another process, causing SQLite to read from the database +** without rolling it back. +** +** To work around this, if a call to xUnlock() fails when unlocking the +** database in the ERROR state, Pager.eLock is set to UNKNOWN_LOCK. It +** is only changed back to a real locking state after a successful call +** to xLock(EXCLUSIVE). Also, the code to do the OPEN->SHARED state transition +** omits the check for a hot-journal if Pager.eLock is set to UNKNOWN_LOCK +** lock. Instead, it assumes a hot-journal exists and obtains an EXCLUSIVE +** lock on the database file before attempting to roll it back. See function +** PagerSharedLock() for more detail. +** +** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in +** PAGER_OPEN state. +*/ +#define UNKNOWN_LOCK (EXCLUSIVE_LOCK+1) + +/* +** The maximum allowed sector size. 64KiB. If the xSectorsize() method +** returns a value larger than this, then MAX_SECTOR_SIZE is used instead. +** This could conceivably cause corruption following a power failure on +** such a system. This is currently an undocumented limit. +*/ +#define MAX_SECTOR_SIZE 0x10000 + + +/* +** An instance of the following structure is allocated for each active +** savepoint and statement transaction in the system. All such structures +** are stored in the Pager.aSavepoint[] array, which is allocated and +** resized using sqlite3Realloc(). +** +** When a savepoint is created, the PagerSavepoint.iHdrOffset field is +** set to 0. If a journal-header is written into the main journal while +** the savepoint is active, then iHdrOffset is set to the byte offset +** immediately following the last journal record written into the main +** journal before the journal-header. This is required during savepoint +** rollback (see pagerPlaybackSavepoint()). +*/ +typedef struct PagerSavepoint PagerSavepoint; +struct PagerSavepoint { + i64 iOffset; /* Starting offset in main journal */ + i64 iHdrOffset; /* See above */ + Bitvec *pInSavepoint; /* Set of pages in this savepoint */ + Pgno nOrig; /* Original number of pages in file */ + Pgno iSubRec; /* Index of first record in sub-journal */ +#ifndef SQLITE_OMIT_WAL + u32 aWalData[WAL_SAVEPOINT_NDATA]; /* WAL savepoint context */ +#endif +}; + +/* +** Bits of the Pager.doNotSpill flag. See further description below. +*/ +#define SPILLFLAG_OFF 0x01 /* Never spill cache. Set via pragma */ +#define SPILLFLAG_ROLLBACK 0x02 /* Current rolling back, so do not spill */ +#define SPILLFLAG_NOSYNC 0x04 /* Spill is ok, but do not sync */ + +/* +** An open page cache is an instance of struct Pager. A description of +** some of the more important member variables follows: +** +** eState +** +** The current 'state' of the pager object. See the comment and state +** diagram above for a description of the pager state. +** +** eLock +** +** For a real on-disk database, the current lock held on the database file - +** NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK. +** +** For a temporary or in-memory database (neither of which require any +** locks), this variable is always set to EXCLUSIVE_LOCK. Since such +** databases always have Pager.exclusiveMode==1, this tricks the pager +** logic into thinking that it already has all the locks it will ever +** need (and no reason to release them). +** +** In some (obscure) circumstances, this variable may also be set to +** UNKNOWN_LOCK. See the comment above the #define of UNKNOWN_LOCK for +** details. +** +** changeCountDone +** +** This boolean variable is used to make sure that the change-counter +** (the 4-byte header field at byte offset 24 of the database file) is +** not updated more often than necessary. +** +** It is set to true when the change-counter field is updated, which +** can only happen if an exclusive lock is held on the database file. +** It is cleared (set to false) whenever an exclusive lock is +** relinquished on the database file. Each time a transaction is committed, +** The changeCountDone flag is inspected. If it is true, the work of +** updating the change-counter is omitted for the current transaction. +** +** This mechanism means that when running in exclusive mode, a connection +** need only update the change-counter once, for the first transaction +** committed. +** +** setMaster +** +** When PagerCommitPhaseOne() is called to commit a transaction, it may +** (or may not) specify a master-journal name to be written into the +** journal file before it is synced to disk. +** +** Whether or not a journal file contains a master-journal pointer affects +** the way in which the journal file is finalized after the transaction is +** committed or rolled back when running in "journal_mode=PERSIST" mode. +** If a journal file does not contain a master-journal pointer, it is +** finalized by overwriting the first journal header with zeroes. If +** it does contain a master-journal pointer the journal file is finalized +** by truncating it to zero bytes, just as if the connection were +** running in "journal_mode=truncate" mode. +** +** Journal files that contain master journal pointers cannot be finalized +** simply by overwriting the first journal-header with zeroes, as the +** master journal pointer could interfere with hot-journal rollback of any +** subsequently interrupted transaction that reuses the journal file. +** +** The flag is cleared as soon as the journal file is finalized (either +** by PagerCommitPhaseTwo or PagerRollback). If an IO error prevents the +** journal file from being successfully finalized, the setMaster flag +** is cleared anyway (and the pager will move to ERROR state). +** +** doNotSpill +** +** This variables control the behavior of cache-spills (calls made by +** the pcache module to the pagerStress() routine to write cached data +** to the file-system in order to free up memory). +** +** When bits SPILLFLAG_OFF or SPILLFLAG_ROLLBACK of doNotSpill are set, +** writing to the database from pagerStress() is disabled altogether. +** The SPILLFLAG_ROLLBACK case is done in a very obscure case that +** comes up during savepoint rollback that requires the pcache module +** to allocate a new page to prevent the journal file from being written +** while it is being traversed by code in pager_playback(). The SPILLFLAG_OFF +** case is a user preference. +** +** If the SPILLFLAG_NOSYNC bit is set, writing to the database from +** pagerStress() is permitted, but syncing the journal file is not. +** This flag is set by sqlite3PagerWrite() when the file-system sector-size +** is larger than the database page-size in order to prevent a journal sync +** from happening in between the journalling of two pages on the same sector. +** +** subjInMemory +** +** This is a boolean variable. If true, then any required sub-journal +** is opened as an in-memory journal file. If false, then in-memory +** sub-journals are only used for in-memory pager files. +** +** This variable is updated by the upper layer each time a new +** write-transaction is opened. +** +** dbSize, dbOrigSize, dbFileSize +** +** Variable dbSize is set to the number of pages in the database file. +** It is valid in PAGER_READER and higher states (all states except for +** OPEN and ERROR). +** +** dbSize is set based on the size of the database file, which may be +** larger than the size of the database (the value stored at offset +** 28 of the database header by the btree). If the size of the file +** is not an integer multiple of the page-size, the value stored in +** dbSize is rounded down (i.e. a 5KB file with 2K page-size has dbSize==2). +** Except, any file that is greater than 0 bytes in size is considered +** to have at least one page. (i.e. a 1KB file with 2K page-size leads +** to dbSize==1). +** +** During a write-transaction, if pages with page-numbers greater than +** dbSize are modified in the cache, dbSize is updated accordingly. +** Similarly, if the database is truncated using PagerTruncateImage(), +** dbSize is updated. +** +** Variables dbOrigSize and dbFileSize are valid in states +** PAGER_WRITER_LOCKED and higher. dbOrigSize is a copy of the dbSize +** variable at the start of the transaction. It is used during rollback, +** and to determine whether or not pages need to be journalled before +** being modified. +** +** Throughout a write-transaction, dbFileSize contains the size of +** the file on disk in pages. It is set to a copy of dbSize when the +** write-transaction is first opened, and updated when VFS calls are made +** to write or truncate the database file on disk. +** +** The only reason the dbFileSize variable is required is to suppress +** unnecessary calls to xTruncate() after committing a transaction. If, +** when a transaction is committed, the dbFileSize variable indicates +** that the database file is larger than the database image (Pager.dbSize), +** pager_truncate() is called. The pager_truncate() call uses xFilesize() +** to measure the database file on disk, and then truncates it if required. +** dbFileSize is not used when rolling back a transaction. In this case +** pager_truncate() is called unconditionally (which means there may be +** a call to xFilesize() that is not strictly required). In either case, +** pager_truncate() may cause the file to become smaller or larger. +** +** dbHintSize +** +** The dbHintSize variable is used to limit the number of calls made to +** the VFS xFileControl(FCNTL_SIZE_HINT) method. +** +** dbHintSize is set to a copy of the dbSize variable when a +** write-transaction is opened (at the same time as dbFileSize and +** dbOrigSize). If the xFileControl(FCNTL_SIZE_HINT) method is called, +** dbHintSize is increased to the number of pages that correspond to the +** size-hint passed to the method call. See pager_write_pagelist() for +** details. +** +** errCode +** +** The Pager.errCode variable is only ever used in PAGER_ERROR state. It +** is set to zero in all other states. In PAGER_ERROR state, Pager.errCode +** is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX +** sub-codes. +** +** syncFlags, walSyncFlags +** +** syncFlags is either SQLITE_SYNC_NORMAL (0x02) or SQLITE_SYNC_FULL (0x03). +** syncFlags is used for rollback mode. walSyncFlags is used for WAL mode +** and contains the flags used to sync the checkpoint operations in the +** lower two bits, and sync flags used for transaction commits in the WAL +** file in bits 0x04 and 0x08. In other words, to get the correct sync flags +** for checkpoint operations, use (walSyncFlags&0x03) and to get the correct +** sync flags for transaction commit, use ((walSyncFlags>>2)&0x03). Note +** that with synchronous=NORMAL in WAL mode, transaction commit is not synced +** meaning that the 0x04 and 0x08 bits are both zero. +*/ +struct Pager { + sqlite3_vfs *pVfs; /* OS functions to use for IO */ + u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */ + u8 journalMode; /* One of the PAGER_JOURNALMODE_* values */ + u8 useJournal; /* Use a rollback journal on this file */ + u8 noSync; /* Do not sync the journal if true */ + u8 fullSync; /* Do extra syncs of the journal for robustness */ + u8 extraSync; /* sync directory after journal delete */ + u8 syncFlags; /* SYNC_NORMAL or SYNC_FULL otherwise */ + u8 walSyncFlags; /* See description above */ + u8 tempFile; /* zFilename is a temporary or immutable file */ + u8 noLock; /* Do not lock (except in WAL mode) */ + u8 readOnly; /* True for a read-only database */ + u8 memDb; /* True to inhibit all file I/O */ + + /************************************************************************** + ** The following block contains those class members that change during + ** routine operation. Class members not in this block are either fixed + ** when the pager is first created or else only change when there is a + ** significant mode change (such as changing the page_size, locking_mode, + ** or the journal_mode). From another view, these class members describe + ** the "state" of the pager, while other class members describe the + ** "configuration" of the pager. + */ + u8 eState; /* Pager state (OPEN, READER, WRITER_LOCKED..) */ + u8 eLock; /* Current lock held on database file */ + u8 changeCountDone; /* Set after incrementing the change-counter */ + u8 setMaster; /* True if a m-j name has been written to jrnl */ + u8 doNotSpill; /* Do not spill the cache when non-zero */ + u8 subjInMemory; /* True to use in-memory sub-journals */ + u8 bUseFetch; /* True to use xFetch() */ + u8 hasHeldSharedLock; /* True if a shared lock has ever been held */ + Pgno dbSize; /* Number of pages in the database */ + Pgno dbOrigSize; /* dbSize before the current transaction */ + Pgno dbFileSize; /* Number of pages in the database file */ + Pgno dbHintSize; /* Value passed to FCNTL_SIZE_HINT call */ + int errCode; /* One of several kinds of errors */ + int nRec; /* Pages journalled since last j-header written */ + u32 cksumInit; /* Quasi-random value added to every checksum */ + u32 nSubRec; /* Number of records written to sub-journal */ + Bitvec *pInJournal; /* One bit for each page in the database file */ + sqlite3_file *fd; /* File descriptor for database */ + sqlite3_file *jfd; /* File descriptor for main journal */ + sqlite3_file *sjfd; /* File descriptor for sub-journal */ + i64 journalOff; /* Current write offset in the journal file */ + i64 journalHdr; /* Byte offset to previous journal header */ + sqlite3_backup *pBackup; /* Pointer to list of ongoing backup processes */ + PagerSavepoint *aSavepoint; /* Array of active savepoints */ + int nSavepoint; /* Number of elements in aSavepoint[] */ + u32 iDataVersion; /* Changes whenever database content changes */ + char dbFileVers[16]; /* Changes whenever database file changes */ + + int nMmapOut; /* Number of mmap pages currently outstanding */ + sqlite3_int64 szMmap; /* Desired maximum mmap size */ + PgHdr *pMmapFreelist; /* List of free mmap page headers (pDirty) */ + /* + ** End of the routinely-changing class members + ***************************************************************************/ + + u16 nExtra; /* Add this many bytes to each in-memory page */ + i16 nReserve; /* Number of unused bytes at end of each page */ + u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */ + u32 sectorSize; /* Assumed sector size during rollback */ + int pageSize; /* Number of bytes in a page */ + Pgno mxPgno; /* Maximum allowed size of the database */ + i64 journalSizeLimit; /* Size limit for persistent journal files */ + char *zFilename; /* Name of the database file */ + char *zJournal; /* Name of the journal file */ + int (*xBusyHandler)(void*); /* Function to call when busy */ + void *pBusyHandlerArg; /* Context argument for xBusyHandler */ + int aStat[4]; /* Total cache hits, misses, writes, spills */ +#ifdef SQLITE_TEST + int nRead; /* Database pages read */ +#endif + void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */ + int (*xGet)(Pager*,Pgno,DbPage**,int); /* Routine to fetch a patch */ + char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */ + PCache *pPCache; /* Pointer to page cache object */ +#ifndef SQLITE_OMIT_WAL + Wal *pWal; /* Write-ahead log used by "journal_mode=wal" */ + char *zWal; /* File name for write-ahead log */ +#endif +}; + +/* +** Indexes for use with Pager.aStat[]. The Pager.aStat[] array contains +** the values accessed by passing SQLITE_DBSTATUS_CACHE_HIT, CACHE_MISS +** or CACHE_WRITE to sqlite3_db_status(). +*/ +#define PAGER_STAT_HIT 0 +#define PAGER_STAT_MISS 1 +#define PAGER_STAT_WRITE 2 +#define PAGER_STAT_SPILL 3 + +/* +** The following global variables hold counters used for +** testing purposes only. These variables do not exist in +** a non-testing build. These variables are not thread-safe. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_pager_readdb_count = 0; /* Number of full pages read from DB */ +SQLITE_API int sqlite3_pager_writedb_count = 0; /* Number of full pages written to DB */ +SQLITE_API int sqlite3_pager_writej_count = 0; /* Number of pages written to journal */ +# define PAGER_INCR(v) v++ +#else +# define PAGER_INCR(v) +#endif + + + +/* +** Journal files begin with the following magic string. The data +** was obtained from /dev/random. It is used only as a sanity check. +** +** Since version 2.8.0, the journal format contains additional sanity +** checking information. If the power fails while the journal is being +** written, semi-random garbage data might appear in the journal +** file after power is restored. If an attempt is then made +** to roll the journal back, the database could be corrupted. The additional +** sanity checking data is an attempt to discover the garbage in the +** journal and ignore it. +** +** The sanity checking information for the new journal format consists +** of a 32-bit checksum on each page of data. The checksum covers both +** the page number and the pPager->pageSize bytes of data for the page. +** This cksum is initialized to a 32-bit random value that appears in the +** journal file right after the header. The random initializer is important, +** because garbage data that appears at the end of a journal is likely +** data that was once in other files that have now been deleted. If the +** garbage data came from an obsolete journal file, the checksums might +** be correct. But by initializing the checksum to random value which +** is different for every journal, we minimize that risk. +*/ +static const unsigned char aJournalMagic[] = { + 0xd9, 0xd5, 0x05, 0xf9, 0x20, 0xa1, 0x63, 0xd7, +}; + +/* +** The size of the of each page record in the journal is given by +** the following macro. +*/ +#define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8) + +/* +** The journal header size for this pager. This is usually the same +** size as a single disk sector. See also setSectorSize(). +*/ +#define JOURNAL_HDR_SZ(pPager) (pPager->sectorSize) + +/* +** The macro MEMDB is true if we are dealing with an in-memory database. +** We do this as a macro so that if the SQLITE_OMIT_MEMORYDB macro is set, +** the value of MEMDB will be a constant and the compiler will optimize +** out code that would never execute. +*/ +#ifdef SQLITE_OMIT_MEMORYDB +# define MEMDB 0 +#else +# define MEMDB pPager->memDb +#endif + +/* +** The macro USEFETCH is true if we are allowed to use the xFetch and xUnfetch +** interfaces to access the database using memory-mapped I/O. +*/ +#if SQLITE_MAX_MMAP_SIZE>0 +# define USEFETCH(x) ((x)->bUseFetch) +#else +# define USEFETCH(x) 0 +#endif + +/* +** The maximum legal page number is (2^31 - 1). +*/ +#define PAGER_MAX_PGNO 2147483647 + +/* +** The argument to this macro is a file descriptor (type sqlite3_file*). +** Return 0 if it is not open, or non-zero (but not 1) if it is. +** +** This is so that expressions can be written as: +** +** if( isOpen(pPager->jfd) ){ ... +** +** instead of +** +** if( pPager->jfd->pMethods ){ ... +*/ +#define isOpen(pFd) ((pFd)->pMethods!=0) + +#ifdef SQLITE_DIRECT_OVERFLOW_READ +/* +** Return true if page pgno can be read directly from the database file +** by the b-tree layer. This is the case if: +** +** * the database file is open, +** * there are no dirty pages in the cache, and +** * the desired page is not currently in the wal file. +*/ +SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ + if( pPager->fd->pMethods==0 ) return 0; + if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; +#ifndef SQLITE_OMIT_WAL + if( pPager->pWal ){ + u32 iRead = 0; + int rc; + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); + return (rc==SQLITE_OK && iRead==0); + } +#endif + return 1; +} +#endif + +#ifndef SQLITE_OMIT_WAL +# define pagerUseWal(x) ((x)->pWal!=0) +#else +# define pagerUseWal(x) 0 +# define pagerRollbackWal(x) 0 +# define pagerWalFrames(v,w,x,y) 0 +# define pagerOpenWalIfPresent(z) SQLITE_OK +# define pagerBeginReadTransaction(z) SQLITE_OK +#endif + +#ifndef NDEBUG +/* +** Usage: +** +** assert( assert_pager_state(pPager) ); +** +** This function runs many asserts to try to find inconsistencies in +** the internal state of the Pager object. +*/ +static int assert_pager_state(Pager *p){ + Pager *pPager = p; + + /* State must be valid. */ + assert( p->eState==PAGER_OPEN + || p->eState==PAGER_READER + || p->eState==PAGER_WRITER_LOCKED + || p->eState==PAGER_WRITER_CACHEMOD + || p->eState==PAGER_WRITER_DBMOD + || p->eState==PAGER_WRITER_FINISHED + || p->eState==PAGER_ERROR + ); + + /* Regardless of the current state, a temp-file connection always behaves + ** as if it has an exclusive lock on the database file. It never updates + ** the change-counter field, so the changeCountDone flag is always set. + */ + assert( p->tempFile==0 || p->eLock==EXCLUSIVE_LOCK ); + assert( p->tempFile==0 || pPager->changeCountDone ); + + /* If the useJournal flag is clear, the journal-mode must be "OFF". + ** And if the journal-mode is "OFF", the journal file must not be open. + */ + assert( p->journalMode==PAGER_JOURNALMODE_OFF || p->useJournal ); + assert( p->journalMode!=PAGER_JOURNALMODE_OFF || !isOpen(p->jfd) ); + + /* Check that MEMDB implies noSync. And an in-memory journal. Since + ** this means an in-memory pager performs no IO at all, it cannot encounter + ** either SQLITE_IOERR or SQLITE_FULL during rollback or while finalizing + ** a journal file. (although the in-memory journal implementation may + ** return SQLITE_IOERR_NOMEM while the journal file is being written). It + ** is therefore not possible for an in-memory pager to enter the ERROR + ** state. + */ + if( MEMDB ){ + assert( !isOpen(p->fd) ); + assert( p->noSync ); + assert( p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_MEMORY + ); + assert( p->eState!=PAGER_ERROR && p->eState!=PAGER_OPEN ); + assert( pagerUseWal(p)==0 ); + } + + /* If changeCountDone is set, a RESERVED lock or greater must be held + ** on the file. + */ + assert( pPager->changeCountDone==0 || pPager->eLock>=RESERVED_LOCK ); + assert( p->eLock!=PENDING_LOCK ); + + switch( p->eState ){ + case PAGER_OPEN: + assert( !MEMDB ); + assert( pPager->errCode==SQLITE_OK ); + assert( sqlite3PcacheRefCount(pPager->pPCache)==0 || pPager->tempFile ); + break; + + case PAGER_READER: + assert( pPager->errCode==SQLITE_OK ); + assert( p->eLock!=UNKNOWN_LOCK ); + assert( p->eLock>=SHARED_LOCK ); + break; + + case PAGER_WRITER_LOCKED: + assert( p->eLock!=UNKNOWN_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + if( !pagerUseWal(pPager) ){ + assert( p->eLock>=RESERVED_LOCK ); + } + assert( pPager->dbSize==pPager->dbOrigSize ); + assert( pPager->dbOrigSize==pPager->dbFileSize ); + assert( pPager->dbOrigSize==pPager->dbHintSize ); + assert( pPager->setMaster==0 ); + break; + + case PAGER_WRITER_CACHEMOD: + assert( p->eLock!=UNKNOWN_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + if( !pagerUseWal(pPager) ){ + /* It is possible that if journal_mode=wal here that neither the + ** journal file nor the WAL file are open. This happens during + ** a rollback transaction that switches from journal_mode=off + ** to journal_mode=wal. + */ + assert( p->eLock>=RESERVED_LOCK ); + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL + ); + } + assert( pPager->dbOrigSize==pPager->dbFileSize ); + assert( pPager->dbOrigSize==pPager->dbHintSize ); + break; + + case PAGER_WRITER_DBMOD: + assert( p->eLock==EXCLUSIVE_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + assert( !pagerUseWal(pPager) ); + assert( p->eLock>=EXCLUSIVE_LOCK ); + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL + || (sqlite3OsDeviceCharacteristics(p->fd)&SQLITE_IOCAP_BATCH_ATOMIC) + ); + assert( pPager->dbOrigSize<=pPager->dbHintSize ); + break; + + case PAGER_WRITER_FINISHED: + assert( p->eLock==EXCLUSIVE_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + assert( !pagerUseWal(pPager) ); + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL + || (sqlite3OsDeviceCharacteristics(p->fd)&SQLITE_IOCAP_BATCH_ATOMIC) + ); + break; + + case PAGER_ERROR: + /* There must be at least one outstanding reference to the pager if + ** in ERROR state. Otherwise the pager should have already dropped + ** back to OPEN state. + */ + assert( pPager->errCode!=SQLITE_OK ); + assert( sqlite3PcacheRefCount(pPager->pPCache)>0 || pPager->tempFile ); + break; + } + + return 1; +} +#endif /* ifndef NDEBUG */ + +#ifdef SQLITE_DEBUG +/* +** Return a pointer to a human readable string in a static buffer +** containing the state of the Pager object passed as an argument. This +** is intended to be used within debuggers. For example, as an alternative +** to "print *pPager" in gdb: +** +** (gdb) printf "%s", print_pager_state(pPager) +** +** This routine has external linkage in order to suppress compiler warnings +** about an unused function. It is enclosed within SQLITE_DEBUG and so does +** not appear in normal builds. +*/ +char *print_pager_state(Pager *p){ + static char zRet[1024]; + + sqlite3_snprintf(1024, zRet, + "Filename: %s\n" + "State: %s errCode=%d\n" + "Lock: %s\n" + "Locking mode: locking_mode=%s\n" + "Journal mode: journal_mode=%s\n" + "Backing store: tempFile=%d memDb=%d useJournal=%d\n" + "Journal: journalOff=%lld journalHdr=%lld\n" + "Size: dbsize=%d dbOrigSize=%d dbFileSize=%d\n" + , p->zFilename + , p->eState==PAGER_OPEN ? "OPEN" : + p->eState==PAGER_READER ? "READER" : + p->eState==PAGER_WRITER_LOCKED ? "WRITER_LOCKED" : + p->eState==PAGER_WRITER_CACHEMOD ? "WRITER_CACHEMOD" : + p->eState==PAGER_WRITER_DBMOD ? "WRITER_DBMOD" : + p->eState==PAGER_WRITER_FINISHED ? "WRITER_FINISHED" : + p->eState==PAGER_ERROR ? "ERROR" : "?error?" + , (int)p->errCode + , p->eLock==NO_LOCK ? "NO_LOCK" : + p->eLock==RESERVED_LOCK ? "RESERVED" : + p->eLock==EXCLUSIVE_LOCK ? "EXCLUSIVE" : + p->eLock==SHARED_LOCK ? "SHARED" : + p->eLock==UNKNOWN_LOCK ? "UNKNOWN" : "?error?" + , p->exclusiveMode ? "exclusive" : "normal" + , p->journalMode==PAGER_JOURNALMODE_MEMORY ? "memory" : + p->journalMode==PAGER_JOURNALMODE_OFF ? "off" : + p->journalMode==PAGER_JOURNALMODE_DELETE ? "delete" : + p->journalMode==PAGER_JOURNALMODE_PERSIST ? "persist" : + p->journalMode==PAGER_JOURNALMODE_TRUNCATE ? "truncate" : + p->journalMode==PAGER_JOURNALMODE_WAL ? "wal" : "?error?" + , (int)p->tempFile, (int)p->memDb, (int)p->useJournal + , p->journalOff, p->journalHdr + , (int)p->dbSize, (int)p->dbOrigSize, (int)p->dbFileSize + ); + + return zRet; +} +#endif + +/* Forward references to the various page getters */ +static int getPageNormal(Pager*,Pgno,DbPage**,int); +static int getPageError(Pager*,Pgno,DbPage**,int); +#if SQLITE_MAX_MMAP_SIZE>0 +static int getPageMMap(Pager*,Pgno,DbPage**,int); +#endif + +/* +** Set the Pager.xGet method for the appropriate routine used to fetch +** content from the pager. +*/ +static void setGetterMethod(Pager *pPager){ + if( pPager->errCode ){ + pPager->xGet = getPageError; +#if SQLITE_MAX_MMAP_SIZE>0 + }else if( USEFETCH(pPager) ){ + pPager->xGet = getPageMMap; +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + }else{ + pPager->xGet = getPageNormal; + } +} + +/* +** Return true if it is necessary to write page *pPg into the sub-journal. +** A page needs to be written into the sub-journal if there exists one +** or more open savepoints for which: +** +** * The page-number is less than or equal to PagerSavepoint.nOrig, and +** * The bit corresponding to the page-number is not set in +** PagerSavepoint.pInSavepoint. +*/ +static int subjRequiresPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + PagerSavepoint *p; + Pgno pgno = pPg->pgno; + int i; + for(i=0; inSavepoint; i++){ + p = &pPager->aSavepoint[i]; + if( p->nOrig>=pgno && 0==sqlite3BitvecTestNotNull(p->pInSavepoint, pgno) ){ + return 1; + } + } + return 0; +} + +#ifdef SQLITE_DEBUG +/* +** Return true if the page is already in the journal file. +*/ +static int pageInJournal(Pager *pPager, PgHdr *pPg){ + return sqlite3BitvecTest(pPager->pInJournal, pPg->pgno); +} +#endif + +/* +** Read a 32-bit integer from the given file descriptor. Store the integer +** that is read in *pRes. Return SQLITE_OK if everything worked, or an +** error code is something goes wrong. +** +** All values are stored on disk as big-endian. +*/ +static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){ + unsigned char ac[4]; + int rc = sqlite3OsRead(fd, ac, sizeof(ac), offset); + if( rc==SQLITE_OK ){ + *pRes = sqlite3Get4byte(ac); + } + return rc; +} + +/* +** Write a 32-bit integer into a string buffer in big-endian byte order. +*/ +#define put32bits(A,B) sqlite3Put4byte((u8*)A,B) + + +/* +** Write a 32-bit integer into the given file descriptor. Return SQLITE_OK +** on success or an error code is something goes wrong. +*/ +static int write32bits(sqlite3_file *fd, i64 offset, u32 val){ + char ac[4]; + put32bits(ac, val); + return sqlite3OsWrite(fd, ac, 4, offset); +} + +/* +** Unlock the database file to level eLock, which must be either NO_LOCK +** or SHARED_LOCK. Regardless of whether or not the call to xUnlock() +** succeeds, set the Pager.eLock variable to match the (attempted) new lock. +** +** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is +** called, do not modify it. See the comment above the #define of +** UNKNOWN_LOCK for an explanation of this. +*/ +static int pagerUnlockDb(Pager *pPager, int eLock){ + int rc = SQLITE_OK; + + assert( !pPager->exclusiveMode || pPager->eLock==eLock ); + assert( eLock==NO_LOCK || eLock==SHARED_LOCK ); + assert( eLock!=NO_LOCK || pagerUseWal(pPager)==0 ); + if( isOpen(pPager->fd) ){ + assert( pPager->eLock>=eLock ); + rc = pPager->noLock ? SQLITE_OK : sqlite3OsUnlock(pPager->fd, eLock); + if( pPager->eLock!=UNKNOWN_LOCK ){ + pPager->eLock = (u8)eLock; + } + IOTRACE(("UNLOCK %p %d\n", pPager, eLock)) + } + pPager->changeCountDone = pPager->tempFile; /* ticket fb3b3024ea238d5c */ + return rc; +} + +/* +** Lock the database file to level eLock, which must be either SHARED_LOCK, +** RESERVED_LOCK or EXCLUSIVE_LOCK. If the caller is successful, set the +** Pager.eLock variable to the new locking state. +** +** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is +** called, do not modify it unless the new locking state is EXCLUSIVE_LOCK. +** See the comment above the #define of UNKNOWN_LOCK for an explanation +** of this. +*/ +static int pagerLockDb(Pager *pPager, int eLock){ + int rc = SQLITE_OK; + + assert( eLock==SHARED_LOCK || eLock==RESERVED_LOCK || eLock==EXCLUSIVE_LOCK ); + if( pPager->eLockeLock==UNKNOWN_LOCK ){ + rc = pPager->noLock ? SQLITE_OK : sqlite3OsLock(pPager->fd, eLock); + if( rc==SQLITE_OK && (pPager->eLock!=UNKNOWN_LOCK||eLock==EXCLUSIVE_LOCK) ){ + pPager->eLock = (u8)eLock; + IOTRACE(("LOCK %p %d\n", pPager, eLock)) + } + } + return rc; +} + +/* +** This function determines whether or not the atomic-write or +** atomic-batch-write optimizations can be used with this pager. The +** atomic-write optimization can be used if: +** +** (a) the value returned by OsDeviceCharacteristics() indicates that +** a database page may be written atomically, and +** (b) the value returned by OsSectorSize() is less than or equal +** to the page size. +** +** If it can be used, then the value returned is the size of the journal +** file when it contains rollback data for exactly one page. +** +** The atomic-batch-write optimization can be used if OsDeviceCharacteristics() +** returns a value with the SQLITE_IOCAP_BATCH_ATOMIC bit set. -1 is +** returned in this case. +** +** If neither optimization can be used, 0 is returned. +*/ +static int jrnlBufferSize(Pager *pPager){ + assert( !MEMDB ); + +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + int dc; /* Device characteristics */ + + assert( isOpen(pPager->fd) ); + dc = sqlite3OsDeviceCharacteristics(pPager->fd); +#else + UNUSED_PARAMETER(pPager); +#endif + +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( pPager->dbSize>0 && (dc&SQLITE_IOCAP_BATCH_ATOMIC) ){ + return -1; + } +#endif + +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + { + int nSector = pPager->sectorSize; + int szPage = pPager->pageSize; + + assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); + assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); + if( 0==(dc&(SQLITE_IOCAP_ATOMIC|(szPage>>8)) || nSector>szPage) ){ + return 0; + } + } + + return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager); +#endif + + return 0; +} + +/* +** If SQLITE_CHECK_PAGES is defined then we do some sanity checking +** on the cache using a hash function. This is used for testing +** and debugging only. +*/ +#ifdef SQLITE_CHECK_PAGES +/* +** Return a 32-bit hash of the page data for pPage. +*/ +static u32 pager_datahash(int nByte, unsigned char *pData){ + u32 hash = 0; + int i; + for(i=0; ipPager->pageSize, (unsigned char *)pPage->pData); +} +static void pager_set_pagehash(PgHdr *pPage){ + pPage->pageHash = pager_pagehash(pPage); +} + +/* +** The CHECK_PAGE macro takes a PgHdr* as an argument. If SQLITE_CHECK_PAGES +** is defined, and NDEBUG is not defined, an assert() statement checks +** that the page is either dirty or still matches the calculated page-hash. +*/ +#define CHECK_PAGE(x) checkPage(x) +static void checkPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + assert( pPager->eState!=PAGER_ERROR ); + assert( (pPg->flags&PGHDR_DIRTY) || pPg->pageHash==pager_pagehash(pPg) ); +} + +#else +#define pager_datahash(X,Y) 0 +#define pager_pagehash(X) 0 +#define pager_set_pagehash(X) +#define CHECK_PAGE(x) +#endif /* SQLITE_CHECK_PAGES */ + +/* +** When this is called the journal file for pager pPager must be open. +** This function attempts to read a master journal file name from the +** end of the file and, if successful, copies it into memory supplied +** by the caller. See comments above writeMasterJournal() for the format +** used to store a master journal file name at the end of a journal file. +** +** zMaster must point to a buffer of at least nMaster bytes allocated by +** the caller. This should be sqlite3_vfs.mxPathname+1 (to ensure there is +** enough space to write the master journal name). If the master journal +** name in the journal is longer than nMaster bytes (including a +** nul-terminator), then this is handled as if no master journal name +** were present in the journal. +** +** If a master journal file name is present at the end of the journal +** file, then it is copied into the buffer pointed to by zMaster. A +** nul-terminator byte is appended to the buffer following the master +** journal file name. +** +** If it is determined that no master journal file name is present +** zMaster[0] is set to 0 and SQLITE_OK returned. +** +** If an error occurs while reading from the journal file, an SQLite +** error code is returned. +*/ +static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){ + int rc; /* Return code */ + u32 len; /* Length in bytes of master journal name */ + i64 szJ; /* Total size in bytes of journal file pJrnl */ + u32 cksum; /* MJ checksum value read from journal */ + u32 u; /* Unsigned loop counter */ + unsigned char aMagic[8]; /* A buffer to hold the magic header */ + zMaster[0] = '\0'; + + if( SQLITE_OK!=(rc = sqlite3OsFileSize(pJrnl, &szJ)) + || szJ<16 + || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len)) + || len>=nMaster + || len>szJ-16 + || len==0 + || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum)) + || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8)) + || memcmp(aMagic, aJournalMagic, 8) + || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, zMaster, len, szJ-16-len)) + ){ + return rc; + } + + /* See if the checksum matches the master journal name */ + for(u=0; ujournalOff, assuming a sector +** size of pPager->sectorSize bytes. +** +** i.e for a sector size of 512: +** +** Pager.journalOff Return value +** --------------------------------------- +** 0 0 +** 512 512 +** 100 512 +** 2000 2048 +** +*/ +static i64 journalHdrOffset(Pager *pPager){ + i64 offset = 0; + i64 c = pPager->journalOff; + if( c ){ + offset = ((c-1)/JOURNAL_HDR_SZ(pPager) + 1) * JOURNAL_HDR_SZ(pPager); + } + assert( offset%JOURNAL_HDR_SZ(pPager)==0 ); + assert( offset>=c ); + assert( (offset-c)jfd) ); + assert( !sqlite3JournalIsInMemory(pPager->jfd) ); + if( pPager->journalOff ){ + const i64 iLimit = pPager->journalSizeLimit; /* Local cache of jsl */ + + IOTRACE(("JZEROHDR %p\n", pPager)) + if( doTruncate || iLimit==0 ){ + rc = sqlite3OsTruncate(pPager->jfd, 0); + }else{ + static const char zeroHdr[28] = {0}; + rc = sqlite3OsWrite(pPager->jfd, zeroHdr, sizeof(zeroHdr), 0); + } + if( rc==SQLITE_OK && !pPager->noSync ){ + rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_DATAONLY|pPager->syncFlags); + } + + /* At this point the transaction is committed but the write lock + ** is still held on the file. If there is a size limit configured for + ** the persistent journal and the journal file currently consumes more + ** space than that limit allows for, truncate it now. There is no need + ** to sync the file following this operation. + */ + if( rc==SQLITE_OK && iLimit>0 ){ + i64 sz; + rc = sqlite3OsFileSize(pPager->jfd, &sz); + if( rc==SQLITE_OK && sz>iLimit ){ + rc = sqlite3OsTruncate(pPager->jfd, iLimit); + } + } + } + return rc; +} + +/* +** The journal file must be open when this routine is called. A journal +** header (JOURNAL_HDR_SZ bytes) is written into the journal file at the +** current location. +** +** The format for the journal header is as follows: +** - 8 bytes: Magic identifying journal format. +** - 4 bytes: Number of records in journal, or -1 no-sync mode is on. +** - 4 bytes: Random number used for page hash. +** - 4 bytes: Initial database page count. +** - 4 bytes: Sector size used by the process that wrote this journal. +** - 4 bytes: Database page size. +** +** Followed by (JOURNAL_HDR_SZ - 28) bytes of unused space. +*/ +static int writeJournalHdr(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + char *zHeader = pPager->pTmpSpace; /* Temporary space used to build header */ + u32 nHeader = (u32)pPager->pageSize;/* Size of buffer pointed to by zHeader */ + u32 nWrite; /* Bytes of header sector written */ + int ii; /* Loop counter */ + + assert( isOpen(pPager->jfd) ); /* Journal file must be open. */ + + if( nHeader>JOURNAL_HDR_SZ(pPager) ){ + nHeader = JOURNAL_HDR_SZ(pPager); + } + + /* If there are active savepoints and any of them were created + ** since the most recent journal header was written, update the + ** PagerSavepoint.iHdrOffset fields now. + */ + for(ii=0; iinSavepoint; ii++){ + if( pPager->aSavepoint[ii].iHdrOffset==0 ){ + pPager->aSavepoint[ii].iHdrOffset = pPager->journalOff; + } + } + + pPager->journalHdr = pPager->journalOff = journalHdrOffset(pPager); + + /* + ** Write the nRec Field - the number of page records that follow this + ** journal header. Normally, zero is written to this value at this time. + ** After the records are added to the journal (and the journal synced, + ** if in full-sync mode), the zero is overwritten with the true number + ** of records (see syncJournal()). + ** + ** A faster alternative is to write 0xFFFFFFFF to the nRec field. When + ** reading the journal this value tells SQLite to assume that the + ** rest of the journal file contains valid page records. This assumption + ** is dangerous, as if a failure occurred whilst writing to the journal + ** file it may contain some garbage data. There are two scenarios + ** where this risk can be ignored: + ** + ** * When the pager is in no-sync mode. Corruption can follow a + ** power failure in this case anyway. + ** + ** * When the SQLITE_IOCAP_SAFE_APPEND flag is set. This guarantees + ** that garbage data is never appended to the journal file. + */ + assert( isOpen(pPager->fd) || pPager->noSync ); + if( pPager->noSync || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY) + || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) + ){ + memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); + put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff); + }else{ + memset(zHeader, 0, sizeof(aJournalMagic)+4); + } + + /* The random check-hash initializer */ + sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); + put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit); + /* The initial database size */ + put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize); + /* The assumed sector size for this process */ + put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize); + + /* The page size */ + put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize); + + /* Initializing the tail of the buffer is not necessary. Everything + ** works find if the following memset() is omitted. But initializing + ** the memory prevents valgrind from complaining, so we are willing to + ** take the performance hit. + */ + memset(&zHeader[sizeof(aJournalMagic)+20], 0, + nHeader-(sizeof(aJournalMagic)+20)); + + /* In theory, it is only necessary to write the 28 bytes that the + ** journal header consumes to the journal file here. Then increment the + ** Pager.journalOff variable by JOURNAL_HDR_SZ so that the next + ** record is written to the following sector (leaving a gap in the file + ** that will be implicitly filled in by the OS). + ** + ** However it has been discovered that on some systems this pattern can + ** be significantly slower than contiguously writing data to the file, + ** even if that means explicitly writing data to the block of + ** (JOURNAL_HDR_SZ - 28) bytes that will not be used. So that is what + ** is done. + ** + ** The loop is required here in case the sector-size is larger than the + ** database page size. Since the zHeader buffer is only Pager.pageSize + ** bytes in size, more than one call to sqlite3OsWrite() may be required + ** to populate the entire journal header sector. + */ + for(nWrite=0; rc==SQLITE_OK&&nWritejournalHdr, nHeader)) + rc = sqlite3OsWrite(pPager->jfd, zHeader, nHeader, pPager->journalOff); + assert( pPager->journalHdr <= pPager->journalOff ); + pPager->journalOff += nHeader; + } + + return rc; +} + +/* +** The journal file must be open when this is called. A journal header file +** (JOURNAL_HDR_SZ bytes) is read from the current location in the journal +** file. The current location in the journal file is given by +** pPager->journalOff. See comments above function writeJournalHdr() for +** a description of the journal header format. +** +** If the header is read successfully, *pNRec is set to the number of +** page records following this header and *pDbSize is set to the size of the +** database before the transaction began, in pages. Also, pPager->cksumInit +** is set to the value read from the journal header. SQLITE_OK is returned +** in this case. +** +** If the journal header file appears to be corrupted, SQLITE_DONE is +** returned and *pNRec and *PDbSize are undefined. If JOURNAL_HDR_SZ bytes +** cannot be read from the journal file an error code is returned. +*/ +static int readJournalHdr( + Pager *pPager, /* Pager object */ + int isHot, + i64 journalSize, /* Size of the open journal file in bytes */ + u32 *pNRec, /* OUT: Value read from the nRec field */ + u32 *pDbSize /* OUT: Value of original database size field */ +){ + int rc; /* Return code */ + unsigned char aMagic[8]; /* A buffer to hold the magic header */ + i64 iHdrOff; /* Offset of journal header being read */ + + assert( isOpen(pPager->jfd) ); /* Journal file must be open. */ + + /* Advance Pager.journalOff to the start of the next sector. If the + ** journal file is too small for there to be a header stored at this + ** point, return SQLITE_DONE. + */ + pPager->journalOff = journalHdrOffset(pPager); + if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){ + return SQLITE_DONE; + } + iHdrOff = pPager->journalOff; + + /* Read in the first 8 bytes of the journal header. If they do not match + ** the magic string found at the start of each journal header, return + ** SQLITE_DONE. If an IO error occurs, return an error code. Otherwise, + ** proceed. + */ + if( isHot || iHdrOff!=pPager->journalHdr ){ + rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), iHdrOff); + if( rc ){ + return rc; + } + if( memcmp(aMagic, aJournalMagic, sizeof(aMagic))!=0 ){ + return SQLITE_DONE; + } + } + + /* Read the first three 32-bit fields of the journal header: The nRec + ** field, the checksum-initializer and the database size at the start + ** of the transaction. Return an error code if anything goes wrong. + */ + if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+8, pNRec)) + || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+12, &pPager->cksumInit)) + || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+16, pDbSize)) + ){ + return rc; + } + + if( pPager->journalOff==0 ){ + u32 iPageSize; /* Page-size field of journal header */ + u32 iSectorSize; /* Sector-size field of journal header */ + + /* Read the page-size and sector-size journal header fields. */ + if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+20, &iSectorSize)) + || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+24, &iPageSize)) + ){ + return rc; + } + + /* Versions of SQLite prior to 3.5.8 set the page-size field of the + ** journal header to zero. In this case, assume that the Pager.pageSize + ** variable is already set to the correct page size. + */ + if( iPageSize==0 ){ + iPageSize = pPager->pageSize; + } + + /* Check that the values read from the page-size and sector-size fields + ** are within range. To be 'in range', both values need to be a power + ** of two greater than or equal to 512 or 32, and not greater than their + ** respective compile time maximum limits. + */ + if( iPageSize<512 || iSectorSize<32 + || iPageSize>SQLITE_MAX_PAGE_SIZE || iSectorSize>MAX_SECTOR_SIZE + || ((iPageSize-1)&iPageSize)!=0 || ((iSectorSize-1)&iSectorSize)!=0 + ){ + /* If the either the page-size or sector-size in the journal-header is + ** invalid, then the process that wrote the journal-header must have + ** crashed before the header was synced. In this case stop reading + ** the journal file here. + */ + return SQLITE_DONE; + } + + /* Update the page-size to match the value read from the journal. + ** Use a testcase() macro to make sure that malloc failure within + ** PagerSetPagesize() is tested. + */ + rc = sqlite3PagerSetPagesize(pPager, &iPageSize, -1); + testcase( rc!=SQLITE_OK ); + + /* Update the assumed sector-size to match the value used by + ** the process that created this journal. If this journal was + ** created by a process other than this one, then this routine + ** is being called from within pager_playback(). The local value + ** of Pager.sectorSize is restored at the end of that routine. + */ + pPager->sectorSize = iSectorSize; + } + + pPager->journalOff += JOURNAL_HDR_SZ(pPager); + return rc; +} + + +/* +** Write the supplied master journal name into the journal file for pager +** pPager at the current location. The master journal name must be the last +** thing written to a journal file. If the pager is in full-sync mode, the +** journal file descriptor is advanced to the next sector boundary before +** anything is written. The format is: +** +** + 4 bytes: PAGER_MJ_PGNO. +** + N bytes: Master journal filename in utf-8. +** + 4 bytes: N (length of master journal name in bytes, no nul-terminator). +** + 4 bytes: Master journal name checksum. +** + 8 bytes: aJournalMagic[]. +** +** The master journal page checksum is the sum of the bytes in the master +** journal name, where each byte is interpreted as a signed 8-bit integer. +** +** If zMaster is a NULL pointer (occurs for a single database transaction), +** this call is a no-op. +*/ +static int writeMasterJournal(Pager *pPager, const char *zMaster){ + int rc; /* Return code */ + int nMaster; /* Length of string zMaster */ + i64 iHdrOff; /* Offset of header in journal file */ + i64 jrnlSize; /* Size of journal file on disk */ + u32 cksum = 0; /* Checksum of string zMaster */ + + assert( pPager->setMaster==0 ); + assert( !pagerUseWal(pPager) ); + + if( !zMaster + || pPager->journalMode==PAGER_JOURNALMODE_MEMORY + || !isOpen(pPager->jfd) + ){ + return SQLITE_OK; + } + pPager->setMaster = 1; + assert( pPager->journalHdr <= pPager->journalOff ); + + /* Calculate the length in bytes and the checksum of zMaster */ + for(nMaster=0; zMaster[nMaster]; nMaster++){ + cksum += zMaster[nMaster]; + } + + /* If in full-sync mode, advance to the next disk sector before writing + ** the master journal name. This is in case the previous page written to + ** the journal has already been synced. + */ + if( pPager->fullSync ){ + pPager->journalOff = journalHdrOffset(pPager); + } + iHdrOff = pPager->journalOff; + + /* Write the master journal data to the end of the journal file. If + ** an error occurs, return the error code to the caller. + */ + if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_MJ_PGNO(pPager)))) + || (0 != (rc = sqlite3OsWrite(pPager->jfd, zMaster, nMaster, iHdrOff+4))) + || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster, nMaster))) + || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster+4, cksum))) + || (0 != (rc = sqlite3OsWrite(pPager->jfd, aJournalMagic, 8, + iHdrOff+4+nMaster+8))) + ){ + return rc; + } + pPager->journalOff += (nMaster+20); + + /* If the pager is in peristent-journal mode, then the physical + ** journal-file may extend past the end of the master-journal name + ** and 8 bytes of magic data just written to the file. This is + ** dangerous because the code to rollback a hot-journal file + ** will not be able to find the master-journal name to determine + ** whether or not the journal is hot. + ** + ** Easiest thing to do in this scenario is to truncate the journal + ** file to the required size. + */ + if( SQLITE_OK==(rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize)) + && jrnlSize>pPager->journalOff + ){ + rc = sqlite3OsTruncate(pPager->jfd, pPager->journalOff); + } + return rc; +} + +/* +** Discard the entire contents of the in-memory page-cache. +*/ +static void pager_reset(Pager *pPager){ + pPager->iDataVersion++; + sqlite3BackupRestart(pPager->pBackup); + sqlite3PcacheClear(pPager->pPCache); +} + +/* +** Return the pPager->iDataVersion value +*/ +SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager *pPager){ + return pPager->iDataVersion; +} + +/* +** Free all structures in the Pager.aSavepoint[] array and set both +** Pager.aSavepoint and Pager.nSavepoint to zero. Close the sub-journal +** if it is open and the pager is not in exclusive mode. +*/ +static void releaseAllSavepoints(Pager *pPager){ + int ii; /* Iterator for looping through Pager.aSavepoint */ + for(ii=0; iinSavepoint; ii++){ + sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint); + } + if( !pPager->exclusiveMode || sqlite3JournalIsInMemory(pPager->sjfd) ){ + sqlite3OsClose(pPager->sjfd); + } + sqlite3_free(pPager->aSavepoint); + pPager->aSavepoint = 0; + pPager->nSavepoint = 0; + pPager->nSubRec = 0; +} + +/* +** Set the bit number pgno in the PagerSavepoint.pInSavepoint +** bitvecs of all open savepoints. Return SQLITE_OK if successful +** or SQLITE_NOMEM if a malloc failure occurs. +*/ +static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ + int ii; /* Loop counter */ + int rc = SQLITE_OK; /* Result code */ + + for(ii=0; iinSavepoint; ii++){ + PagerSavepoint *p = &pPager->aSavepoint[ii]; + if( pgno<=p->nOrig ){ + rc |= sqlite3BitvecSet(p->pInSavepoint, pgno); + testcase( rc==SQLITE_NOMEM ); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + } + } + return rc; +} + +/* +** This function is a no-op if the pager is in exclusive mode and not +** in the ERROR state. Otherwise, it switches the pager to PAGER_OPEN +** state. +** +** If the pager is not in exclusive-access mode, the database file is +** completely unlocked. If the file is unlocked and the file-system does +** not exhibit the UNDELETABLE_WHEN_OPEN property, the journal file is +** closed (if it is open). +** +** If the pager is in ERROR state when this function is called, the +** contents of the pager cache are discarded before switching back to +** the OPEN state. Regardless of whether the pager is in exclusive-mode +** or not, any journal file left in the file-system will be treated +** as a hot-journal and rolled back the next time a read-transaction +** is opened (by this or by any other connection). +*/ +static void pager_unlock(Pager *pPager){ + + assert( pPager->eState==PAGER_READER + || pPager->eState==PAGER_OPEN + || pPager->eState==PAGER_ERROR + ); + + sqlite3BitvecDestroy(pPager->pInJournal); + pPager->pInJournal = 0; + releaseAllSavepoints(pPager); + + if( pagerUseWal(pPager) ){ + assert( !isOpen(pPager->jfd) ); + sqlite3WalEndReadTransaction(pPager->pWal); + pPager->eState = PAGER_OPEN; + }else if( !pPager->exclusiveMode ){ + int rc; /* Error code returned by pagerUnlockDb() */ + int iDc = isOpen(pPager->fd)?sqlite3OsDeviceCharacteristics(pPager->fd):0; + + /* If the operating system support deletion of open files, then + ** close the journal file when dropping the database lock. Otherwise + ** another connection with journal_mode=delete might delete the file + ** out from under us. + */ + assert( (PAGER_JOURNALMODE_MEMORY & 5)!=1 ); + assert( (PAGER_JOURNALMODE_OFF & 5)!=1 ); + assert( (PAGER_JOURNALMODE_WAL & 5)!=1 ); + assert( (PAGER_JOURNALMODE_DELETE & 5)!=1 ); + assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 ); + assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 ); + if( 0==(iDc & SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN) + || 1!=(pPager->journalMode & 5) + ){ + sqlite3OsClose(pPager->jfd); + } + + /* If the pager is in the ERROR state and the call to unlock the database + ** file fails, set the current lock to UNKNOWN_LOCK. See the comment + ** above the #define for UNKNOWN_LOCK for an explanation of why this + ** is necessary. + */ + rc = pagerUnlockDb(pPager, NO_LOCK); + if( rc!=SQLITE_OK && pPager->eState==PAGER_ERROR ){ + pPager->eLock = UNKNOWN_LOCK; + } + + /* The pager state may be changed from PAGER_ERROR to PAGER_OPEN here + ** without clearing the error code. This is intentional - the error + ** code is cleared and the cache reset in the block below. + */ + assert( pPager->errCode || pPager->eState!=PAGER_ERROR ); + pPager->eState = PAGER_OPEN; + } + + /* If Pager.errCode is set, the contents of the pager cache cannot be + ** trusted. Now that there are no outstanding references to the pager, + ** it can safely move back to PAGER_OPEN state. This happens in both + ** normal and exclusive-locking mode. + */ + assert( pPager->errCode==SQLITE_OK || !MEMDB ); + if( pPager->errCode ){ + if( pPager->tempFile==0 ){ + pager_reset(pPager); + pPager->changeCountDone = 0; + pPager->eState = PAGER_OPEN; + }else{ + pPager->eState = (isOpen(pPager->jfd) ? PAGER_OPEN : PAGER_READER); + } + if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); + pPager->errCode = SQLITE_OK; + setGetterMethod(pPager); + } + + pPager->journalOff = 0; + pPager->journalHdr = 0; + pPager->setMaster = 0; +} + +/* +** This function is called whenever an IOERR or FULL error that requires +** the pager to transition into the ERROR state may ahve occurred. +** The first argument is a pointer to the pager structure, the second +** the error-code about to be returned by a pager API function. The +** value returned is a copy of the second argument to this function. +** +** If the second argument is SQLITE_FULL, SQLITE_IOERR or one of the +** IOERR sub-codes, the pager enters the ERROR state and the error code +** is stored in Pager.errCode. While the pager remains in the ERROR state, +** all major API calls on the Pager will immediately return Pager.errCode. +** +** The ERROR state indicates that the contents of the pager-cache +** cannot be trusted. This state can be cleared by completely discarding +** the contents of the pager-cache. If a transaction was active when +** the persistent error occurred, then the rollback journal may need +** to be replayed to restore the contents of the database file (as if +** it were a hot-journal). +*/ +static int pager_error(Pager *pPager, int rc){ + int rc2 = rc & 0xff; + assert( rc==SQLITE_OK || !MEMDB ); + assert( + pPager->errCode==SQLITE_FULL || + pPager->errCode==SQLITE_OK || + (pPager->errCode & 0xff)==SQLITE_IOERR + ); + if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){ + pPager->errCode = rc; + pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); + } + return rc; +} + +static int pager_truncate(Pager *pPager, Pgno nPage); + +/* +** The write transaction open on pPager is being committed (bCommit==1) +** or rolled back (bCommit==0). +** +** Return TRUE if and only if all dirty pages should be flushed to disk. +** +** Rules: +** +** * For non-TEMP databases, always sync to disk. This is necessary +** for transactions to be durable. +** +** * Sync TEMP database only on a COMMIT (not a ROLLBACK) when the backing +** file has been created already (via a spill on pagerStress()) and +** when the number of dirty pages in memory exceeds 25% of the total +** cache size. +*/ +static int pagerFlushOnCommit(Pager *pPager, int bCommit){ + if( pPager->tempFile==0 ) return 1; + if( !bCommit ) return 0; + if( !isOpen(pPager->fd) ) return 0; + return (sqlite3PCachePercentDirty(pPager->pPCache)>=25); +} + +/* +** This routine ends a transaction. A transaction is usually ended by +** either a COMMIT or a ROLLBACK operation. This routine may be called +** after rollback of a hot-journal, or if an error occurs while opening +** the journal file or writing the very first journal-header of a +** database transaction. +** +** This routine is never called in PAGER_ERROR state. If it is called +** in PAGER_NONE or PAGER_SHARED state and the lock held is less +** exclusive than a RESERVED lock, it is a no-op. +** +** Otherwise, any active savepoints are released. +** +** If the journal file is open, then it is "finalized". Once a journal +** file has been finalized it is not possible to use it to roll back a +** transaction. Nor will it be considered to be a hot-journal by this +** or any other database connection. Exactly how a journal is finalized +** depends on whether or not the pager is running in exclusive mode and +** the current journal-mode (Pager.journalMode value), as follows: +** +** journalMode==MEMORY +** Journal file descriptor is simply closed. This destroys an +** in-memory journal. +** +** journalMode==TRUNCATE +** Journal file is truncated to zero bytes in size. +** +** journalMode==PERSIST +** The first 28 bytes of the journal file are zeroed. This invalidates +** the first journal header in the file, and hence the entire journal +** file. An invalid journal file cannot be rolled back. +** +** journalMode==DELETE +** The journal file is closed and deleted using sqlite3OsDelete(). +** +** If the pager is running in exclusive mode, this method of finalizing +** the journal file is never used. Instead, if the journalMode is +** DELETE and the pager is in exclusive mode, the method described under +** journalMode==PERSIST is used instead. +** +** After the journal is finalized, the pager moves to PAGER_READER state. +** If running in non-exclusive rollback mode, the lock on the file is +** downgraded to a SHARED_LOCK. +** +** SQLITE_OK is returned if no error occurs. If an error occurs during +** any of the IO operations to finalize the journal file or unlock the +** database then the IO error code is returned to the user. If the +** operation to finalize the journal file fails, then the code still +** tries to unlock the database file if not in exclusive mode. If the +** unlock operation fails as well, then the first error code related +** to the first error encountered (the journal finalization one) is +** returned. +*/ +static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ + int rc = SQLITE_OK; /* Error code from journal finalization operation */ + int rc2 = SQLITE_OK; /* Error code from db file unlock operation */ + + /* Do nothing if the pager does not have an open write transaction + ** or at least a RESERVED lock. This function may be called when there + ** is no write-transaction active but a RESERVED or greater lock is + ** held under two circumstances: + ** + ** 1. After a successful hot-journal rollback, it is called with + ** eState==PAGER_NONE and eLock==EXCLUSIVE_LOCK. + ** + ** 2. If a connection with locking_mode=exclusive holding an EXCLUSIVE + ** lock switches back to locking_mode=normal and then executes a + ** read-transaction, this function is called with eState==PAGER_READER + ** and eLock==EXCLUSIVE_LOCK when the read-transaction is closed. + */ + assert( assert_pager_state(pPager) ); + assert( pPager->eState!=PAGER_ERROR ); + if( pPager->eStateeLockjfd) || pPager->pInJournal==0 + || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_BATCH_ATOMIC) + ); + if( isOpen(pPager->jfd) ){ + assert( !pagerUseWal(pPager) ); + + /* Finalize the journal file. */ + if( sqlite3JournalIsInMemory(pPager->jfd) ){ + /* assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ); */ + sqlite3OsClose(pPager->jfd); + }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){ + if( pPager->journalOff==0 ){ + rc = SQLITE_OK; + }else{ + rc = sqlite3OsTruncate(pPager->jfd, 0); + if( rc==SQLITE_OK && pPager->fullSync ){ + /* Make sure the new file size is written into the inode right away. + ** Otherwise the journal might resurrect following a power loss and + ** cause the last transaction to roll back. See + ** https://bugzilla.mozilla.org/show_bug.cgi?id=1072773 + */ + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); + } + } + pPager->journalOff = 0; + }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST + || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL) + ){ + rc = zeroJournalHdr(pPager, hasMaster||pPager->tempFile); + pPager->journalOff = 0; + }else{ + /* This branch may be executed with Pager.journalMode==MEMORY if + ** a hot-journal was just rolled back. In this case the journal + ** file should be closed and deleted. If this connection writes to + ** the database file, it will do so using an in-memory journal. + */ + int bDelete = !pPager->tempFile; + assert( sqlite3JournalIsInMemory(pPager->jfd)==0 ); + assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE + || pPager->journalMode==PAGER_JOURNALMODE_MEMORY + || pPager->journalMode==PAGER_JOURNALMODE_WAL + ); + sqlite3OsClose(pPager->jfd); + if( bDelete ){ + rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, pPager->extraSync); + } + } + } + +#ifdef SQLITE_CHECK_PAGES + sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash); + if( pPager->dbSize==0 && sqlite3PcacheRefCount(pPager->pPCache)>0 ){ + PgHdr *p = sqlite3PagerLookup(pPager, 1); + if( p ){ + p->pageHash = 0; + sqlite3PagerUnrefNotNull(p); + } + } +#endif + + sqlite3BitvecDestroy(pPager->pInJournal); + pPager->pInJournal = 0; + pPager->nRec = 0; + if( rc==SQLITE_OK ){ + if( MEMDB || pagerFlushOnCommit(pPager, bCommit) ){ + sqlite3PcacheCleanAll(pPager->pPCache); + }else{ + sqlite3PcacheClearWritable(pPager->pPCache); + } + sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); + } + + if( pagerUseWal(pPager) ){ + /* Drop the WAL write-lock, if any. Also, if the connection was in + ** locking_mode=exclusive mode but is no longer, drop the EXCLUSIVE + ** lock held on the database file. + */ + rc2 = sqlite3WalEndWriteTransaction(pPager->pWal); + assert( rc2==SQLITE_OK ); + }else if( rc==SQLITE_OK && bCommit && pPager->dbFileSize>pPager->dbSize ){ + /* This branch is taken when committing a transaction in rollback-journal + ** mode if the database file on disk is larger than the database image. + ** At this point the journal has been finalized and the transaction + ** successfully committed, but the EXCLUSIVE lock is still held on the + ** file. So it is safe to truncate the database file to its minimum + ** required size. */ + assert( pPager->eLock==EXCLUSIVE_LOCK ); + rc = pager_truncate(pPager, pPager->dbSize); + } + + if( rc==SQLITE_OK && bCommit ){ + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + } + + if( !pPager->exclusiveMode + && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) + ){ + rc2 = pagerUnlockDb(pPager, SHARED_LOCK); + } + pPager->eState = PAGER_READER; + pPager->setMaster = 0; + + return (rc==SQLITE_OK?rc2:rc); +} + +/* +** Execute a rollback if a transaction is active and unlock the +** database file. +** +** If the pager has already entered the ERROR state, do not attempt +** the rollback at this time. Instead, pager_unlock() is called. The +** call to pager_unlock() will discard all in-memory pages, unlock +** the database file and move the pager back to OPEN state. If this +** means that there is a hot-journal left in the file-system, the next +** connection to obtain a shared lock on the pager (which may be this one) +** will roll it back. +** +** If the pager has not already entered the ERROR state, but an IO or +** malloc error occurs during a rollback, then this will itself cause +** the pager to enter the ERROR state. Which will be cleared by the +** call to pager_unlock(), as described above. +*/ +static void pagerUnlockAndRollback(Pager *pPager){ + if( pPager->eState!=PAGER_ERROR && pPager->eState!=PAGER_OPEN ){ + assert( assert_pager_state(pPager) ); + if( pPager->eState>=PAGER_WRITER_LOCKED ){ + sqlite3BeginBenignMalloc(); + sqlite3PagerRollback(pPager); + sqlite3EndBenignMalloc(); + }else if( !pPager->exclusiveMode ){ + assert( pPager->eState==PAGER_READER ); + pager_end_transaction(pPager, 0, 0); + } + } + pager_unlock(pPager); +} + +/* +** Parameter aData must point to a buffer of pPager->pageSize bytes +** of data. Compute and return a checksum based ont the contents of the +** page of data and the current value of pPager->cksumInit. +** +** This is not a real checksum. It is really just the sum of the +** random initial value (pPager->cksumInit) and every 200th byte +** of the page data, starting with byte offset (pPager->pageSize%200). +** Each byte is interpreted as an 8-bit unsigned integer. +** +** Changing the formula used to compute this checksum results in an +** incompatible journal file format. +** +** If journal corruption occurs due to a power failure, the most likely +** scenario is that one end or the other of the record will be changed. +** It is much less likely that the two ends of the journal record will be +** correct and the middle be corrupt. Thus, this "checksum" scheme, +** though fast and simple, catches the mostly likely kind of corruption. +*/ +static u32 pager_cksum(Pager *pPager, const u8 *aData){ + u32 cksum = pPager->cksumInit; /* Checksum value to return */ + int i = pPager->pageSize-200; /* Loop counter */ + while( i>0 ){ + cksum += aData[i]; + i -= 200; + } + return cksum; +} + +/* +** Read a single page from either the journal file (if isMainJrnl==1) or +** from the sub-journal (if isMainJrnl==0) and playback that page. +** The page begins at offset *pOffset into the file. The *pOffset +** value is increased to the start of the next page in the journal. +** +** The main rollback journal uses checksums - the statement journal does +** not. +** +** If the page number of the page record read from the (sub-)journal file +** is greater than the current value of Pager.dbSize, then playback is +** skipped and SQLITE_OK is returned. +** +** If pDone is not NULL, then it is a record of pages that have already +** been played back. If the page at *pOffset has already been played back +** (if the corresponding pDone bit is set) then skip the playback. +** Make sure the pDone bit corresponding to the *pOffset page is set +** prior to returning. +** +** If the page record is successfully read from the (sub-)journal file +** and played back, then SQLITE_OK is returned. If an IO error occurs +** while reading the record from the (sub-)journal file or while writing +** to the database file, then the IO error code is returned. If data +** is successfully read from the (sub-)journal file but appears to be +** corrupted, SQLITE_DONE is returned. Data is considered corrupted in +** two circumstances: +** +** * If the record page-number is illegal (0 or PAGER_MJ_PGNO), or +** * If the record is being rolled back from the main journal file +** and the checksum field does not match the record content. +** +** Neither of these two scenarios are possible during a savepoint rollback. +** +** If this is a savepoint rollback, then memory may have to be dynamically +** allocated by this function. If this is the case and an allocation fails, +** SQLITE_NOMEM is returned. +*/ +static int pager_playback_one_page( + Pager *pPager, /* The pager being played back */ + i64 *pOffset, /* Offset of record to playback */ + Bitvec *pDone, /* Bitvec of pages already played back */ + int isMainJrnl, /* 1 -> main journal. 0 -> sub-journal. */ + int isSavepnt /* True for a savepoint rollback */ +){ + int rc; + PgHdr *pPg; /* An existing page in the cache */ + Pgno pgno; /* The page number of a page in journal */ + u32 cksum; /* Checksum used for sanity checking */ + char *aData; /* Temporary storage for the page */ + sqlite3_file *jfd; /* The file descriptor for the journal file */ + int isSynced; /* True if journal page is synced */ + + assert( (isMainJrnl&~1)==0 ); /* isMainJrnl is 0 or 1 */ + assert( (isSavepnt&~1)==0 ); /* isSavepnt is 0 or 1 */ + assert( isMainJrnl || pDone ); /* pDone always used on sub-journals */ + assert( isSavepnt || pDone==0 ); /* pDone never used on non-savepoint */ + + aData = pPager->pTmpSpace; + assert( aData ); /* Temp storage must have already been allocated */ + assert( pagerUseWal(pPager)==0 || (!isMainJrnl && isSavepnt) ); + + /* Either the state is greater than PAGER_WRITER_CACHEMOD (a transaction + ** or savepoint rollback done at the request of the caller) or this is + ** a hot-journal rollback. If it is a hot-journal rollback, the pager + ** is in state OPEN and holds an EXCLUSIVE lock. Hot-journal rollback + ** only reads from the main journal, not the sub-journal. + */ + assert( pPager->eState>=PAGER_WRITER_CACHEMOD + || (pPager->eState==PAGER_OPEN && pPager->eLock==EXCLUSIVE_LOCK) + ); + assert( pPager->eState>=PAGER_WRITER_CACHEMOD || isMainJrnl ); + + /* Read the page number and page data from the journal or sub-journal + ** file. Return an error code to the caller if an IO error occurs. + */ + jfd = isMainJrnl ? pPager->jfd : pPager->sjfd; + rc = read32bits(jfd, *pOffset, &pgno); + if( rc!=SQLITE_OK ) return rc; + rc = sqlite3OsRead(jfd, (u8*)aData, pPager->pageSize, (*pOffset)+4); + if( rc!=SQLITE_OK ) return rc; + *pOffset += pPager->pageSize + 4 + isMainJrnl*4; + + /* Sanity checking on the page. This is more important that I originally + ** thought. If a power failure occurs while the journal is being written, + ** it could cause invalid data to be written into the journal. We need to + ** detect this invalid data (with high probability) and ignore it. + */ + if( pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){ + assert( !isSavepnt ); + return SQLITE_DONE; + } + if( pgno>(Pgno)pPager->dbSize || sqlite3BitvecTest(pDone, pgno) ){ + return SQLITE_OK; + } + if( isMainJrnl ){ + rc = read32bits(jfd, (*pOffset)-4, &cksum); + if( rc ) return rc; + if( !isSavepnt && pager_cksum(pPager, (u8*)aData)!=cksum ){ + return SQLITE_DONE; + } + } + + /* If this page has already been played back before during the current + ** rollback, then don't bother to play it back again. + */ + if( pDone && (rc = sqlite3BitvecSet(pDone, pgno))!=SQLITE_OK ){ + return rc; + } + + /* When playing back page 1, restore the nReserve setting + */ + if( pgno==1 && pPager->nReserve!=((u8*)aData)[20] ){ + pPager->nReserve = ((u8*)aData)[20]; + } + + /* If the pager is in CACHEMOD state, then there must be a copy of this + ** page in the pager cache. In this case just update the pager cache, + ** not the database file. The page is left marked dirty in this case. + ** + ** An exception to the above rule: If the database is in no-sync mode + ** and a page is moved during an incremental vacuum then the page may + ** not be in the pager cache. Later: if a malloc() or IO error occurs + ** during a Movepage() call, then the page may not be in the cache + ** either. So the condition described in the above paragraph is not + ** assert()able. + ** + ** If in WRITER_DBMOD, WRITER_FINISHED or OPEN state, then we update the + ** pager cache if it exists and the main file. The page is then marked + ** not dirty. Since this code is only executed in PAGER_OPEN state for + ** a hot-journal rollback, it is guaranteed that the page-cache is empty + ** if the pager is in OPEN state. + ** + ** Ticket #1171: The statement journal might contain page content that is + ** different from the page content at the start of the transaction. + ** This occurs when a page is changed prior to the start of a statement + ** then changed again within the statement. When rolling back such a + ** statement we must not write to the original database unless we know + ** for certain that original page contents are synced into the main rollback + ** journal. Otherwise, a power loss might leave modified data in the + ** database file without an entry in the rollback journal that can + ** restore the database to its original form. Two conditions must be + ** met before writing to the database files. (1) the database must be + ** locked. (2) we know that the original page content is fully synced + ** in the main journal either because the page is not in cache or else + ** the page is marked as needSync==0. + ** + ** 2008-04-14: When attempting to vacuum a corrupt database file, it + ** is possible to fail a statement on a database that does not yet exist. + ** Do not attempt to write if database file has never been opened. + */ + if( pagerUseWal(pPager) ){ + pPg = 0; + }else{ + pPg = sqlite3PagerLookup(pPager, pgno); + } + assert( pPg || !MEMDB ); + assert( pPager->eState!=PAGER_OPEN || pPg==0 || pPager->tempFile ); + PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n", + PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData), + (isMainJrnl?"main-journal":"sub-journal") + )); + if( isMainJrnl ){ + isSynced = pPager->noSync || (*pOffset <= pPager->journalHdr); + }else{ + isSynced = (pPg==0 || 0==(pPg->flags & PGHDR_NEED_SYNC)); + } + if( isOpen(pPager->fd) + && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) + && isSynced + ){ + i64 ofst = (pgno-1)*(i64)pPager->pageSize; + testcase( !isSavepnt && pPg!=0 && (pPg->flags&PGHDR_NEED_SYNC)!=0 ); + assert( !pagerUseWal(pPager) ); + + /* Write the data read from the journal back into the database file. + ** This is usually safe even for an encrypted database - as the data + ** was encrypted before it was written to the journal file. The exception + ** is if the data was just read from an in-memory sub-journal. In that + ** case it must be encrypted here before it is copied into the database + ** file. */ + rc = sqlite3OsWrite(pPager->fd, (u8 *)aData, pPager->pageSize, ofst); + + if( pgno>pPager->dbFileSize ){ + pPager->dbFileSize = pgno; + } + if( pPager->pBackup ){ + sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); + } + }else if( !isMainJrnl && pPg==0 ){ + /* If this is a rollback of a savepoint and data was not written to + ** the database and the page is not in-memory, there is a potential + ** problem. When the page is next fetched by the b-tree layer, it + ** will be read from the database file, which may or may not be + ** current. + ** + ** There are a couple of different ways this can happen. All are quite + ** obscure. When running in synchronous mode, this can only happen + ** if the page is on the free-list at the start of the transaction, then + ** populated, then moved using sqlite3PagerMovepage(). + ** + ** The solution is to add an in-memory page to the cache containing + ** the data just read from the sub-journal. Mark the page as dirty + ** and if the pager requires a journal-sync, then mark the page as + ** requiring a journal-sync before it is written. + */ + assert( isSavepnt ); + assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)==0 ); + pPager->doNotSpill |= SPILLFLAG_ROLLBACK; + rc = sqlite3PagerGet(pPager, pgno, &pPg, 1); + assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)!=0 ); + pPager->doNotSpill &= ~SPILLFLAG_ROLLBACK; + if( rc!=SQLITE_OK ) return rc; + sqlite3PcacheMakeDirty(pPg); + } + if( pPg ){ + /* No page should ever be explicitly rolled back that is in use, except + ** for page 1 which is held in use in order to keep the lock on the + ** database active. However such a page may be rolled back as a result + ** of an internal error resulting in an automatic call to + ** sqlite3PagerRollback(). + */ + void *pData; + pData = pPg->pData; + memcpy(pData, (u8*)aData, pPager->pageSize); + pPager->xReiniter(pPg); + /* It used to be that sqlite3PcacheMakeClean(pPg) was called here. But + ** that call was dangerous and had no detectable benefit since the cache + ** is normally cleaned by sqlite3PcacheCleanAll() after rollback and so + ** has been removed. */ + pager_set_pagehash(pPg); + + /* If this was page 1, then restore the value of Pager.dbFileVers. + ** Do this before any decoding. */ + if( pgno==1 ){ + memcpy(&pPager->dbFileVers, &((u8*)pData)[24],sizeof(pPager->dbFileVers)); + } + sqlite3PcacheRelease(pPg); + } + return rc; +} + +/* +** Parameter zMaster is the name of a master journal file. A single journal +** file that referred to the master journal file has just been rolled back. +** This routine checks if it is possible to delete the master journal file, +** and does so if it is. +** +** Argument zMaster may point to Pager.pTmpSpace. So that buffer is not +** available for use within this function. +** +** When a master journal file is created, it is populated with the names +** of all of its child journals, one after another, formatted as utf-8 +** encoded text. The end of each child journal file is marked with a +** nul-terminator byte (0x00). i.e. the entire contents of a master journal +** file for a transaction involving two databases might be: +** +** "/home/bill/a.db-journal\x00/home/bill/b.db-journal\x00" +** +** A master journal file may only be deleted once all of its child +** journals have been rolled back. +** +** This function reads the contents of the master-journal file into +** memory and loops through each of the child journal names. For +** each child journal, it checks if: +** +** * if the child journal exists, and if so +** * if the child journal contains a reference to master journal +** file zMaster +** +** If a child journal can be found that matches both of the criteria +** above, this function returns without doing anything. Otherwise, if +** no such child journal can be found, file zMaster is deleted from +** the file-system using sqlite3OsDelete(). +** +** If an IO error within this function, an error code is returned. This +** function allocates memory by calling sqlite3Malloc(). If an allocation +** fails, SQLITE_NOMEM is returned. Otherwise, if no IO or malloc errors +** occur, SQLITE_OK is returned. +** +** TODO: This function allocates a single block of memory to load +** the entire contents of the master journal file. This could be +** a couple of kilobytes or so - potentially larger than the page +** size. +*/ +static int pager_delmaster(Pager *pPager, const char *zMaster){ + sqlite3_vfs *pVfs = pPager->pVfs; + int rc; /* Return code */ + sqlite3_file *pMaster; /* Malloc'd master-journal file descriptor */ + sqlite3_file *pJournal; /* Malloc'd child-journal file descriptor */ + char *zMasterJournal = 0; /* Contents of master journal file */ + i64 nMasterJournal; /* Size of master journal file */ + char *zJournal; /* Pointer to one journal within MJ file */ + char *zMasterPtr; /* Space to hold MJ filename from a journal file */ + int nMasterPtr; /* Amount of space allocated to zMasterPtr[] */ + + /* Allocate space for both the pJournal and pMaster file descriptors. + ** If successful, open the master journal file for reading. + */ + pMaster = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile * 2); + pJournal = (sqlite3_file *)(((u8 *)pMaster) + pVfs->szOsFile); + if( !pMaster ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + const int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL); + rc = sqlite3OsOpen(pVfs, zMaster, pMaster, flags, 0); + } + if( rc!=SQLITE_OK ) goto delmaster_out; + + /* Load the entire master journal file into space obtained from + ** sqlite3_malloc() and pointed to by zMasterJournal. Also obtain + ** sufficient space (in zMasterPtr) to hold the names of master + ** journal files extracted from regular rollback-journals. + */ + rc = sqlite3OsFileSize(pMaster, &nMasterJournal); + if( rc!=SQLITE_OK ) goto delmaster_out; + nMasterPtr = pVfs->mxPathname+1; + zMasterJournal = sqlite3Malloc(nMasterJournal + nMasterPtr + 2); + if( !zMasterJournal ){ + rc = SQLITE_NOMEM_BKPT; + goto delmaster_out; + } + zMasterPtr = &zMasterJournal[nMasterJournal+2]; + rc = sqlite3OsRead(pMaster, zMasterJournal, (int)nMasterJournal, 0); + if( rc!=SQLITE_OK ) goto delmaster_out; + zMasterJournal[nMasterJournal] = 0; + zMasterJournal[nMasterJournal+1] = 0; + + zJournal = zMasterJournal; + while( (zJournal-zMasterJournal)pageSize bytes). +** If the file on disk is currently larger than nPage pages, then use the VFS +** xTruncate() method to truncate it. +** +** Or, it might be the case that the file on disk is smaller than +** nPage pages. Some operating system implementations can get confused if +** you try to truncate a file to some size that is larger than it +** currently is, so detect this case and write a single zero byte to +** the end of the new file instead. +** +** If successful, return SQLITE_OK. If an IO error occurs while modifying +** the database file, return the error code to the caller. +*/ +static int pager_truncate(Pager *pPager, Pgno nPage){ + int rc = SQLITE_OK; + assert( pPager->eState!=PAGER_ERROR ); + assert( pPager->eState!=PAGER_READER ); + + if( isOpen(pPager->fd) + && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) + ){ + i64 currentSize, newSize; + int szPage = pPager->pageSize; + assert( pPager->eLock==EXCLUSIVE_LOCK ); + /* TODO: Is it safe to use Pager.dbFileSize here? */ + rc = sqlite3OsFileSize(pPager->fd, ¤tSize); + newSize = szPage*(i64)nPage; + if( rc==SQLITE_OK && currentSize!=newSize ){ + if( currentSize>newSize ){ + rc = sqlite3OsTruncate(pPager->fd, newSize); + }else if( (currentSize+szPage)<=newSize ){ + char *pTmp = pPager->pTmpSpace; + memset(pTmp, 0, szPage); + testcase( (newSize-szPage) == currentSize ); + testcase( (newSize-szPage) > currentSize ); + rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage); + } + if( rc==SQLITE_OK ){ + pPager->dbFileSize = nPage; + } + } + } + return rc; +} + +/* +** Return a sanitized version of the sector-size of OS file pFile. The +** return value is guaranteed to lie between 32 and MAX_SECTOR_SIZE. +*/ +SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *pFile){ + int iRet = sqlite3OsSectorSize(pFile); + if( iRet<32 ){ + iRet = 512; + }else if( iRet>MAX_SECTOR_SIZE ){ + assert( MAX_SECTOR_SIZE>=512 ); + iRet = MAX_SECTOR_SIZE; + } + return iRet; +} + +/* +** Set the value of the Pager.sectorSize variable for the given +** pager based on the value returned by the xSectorSize method +** of the open database file. The sector size will be used +** to determine the size and alignment of journal header and +** master journal pointers within created journal files. +** +** For temporary files the effective sector size is always 512 bytes. +** +** Otherwise, for non-temporary files, the effective sector size is +** the value returned by the xSectorSize() method rounded up to 32 if +** it is less than 32, or rounded down to MAX_SECTOR_SIZE if it +** is greater than MAX_SECTOR_SIZE. +** +** If the file has the SQLITE_IOCAP_POWERSAFE_OVERWRITE property, then set +** the effective sector size to its minimum value (512). The purpose of +** pPager->sectorSize is to define the "blast radius" of bytes that +** might change if a crash occurs while writing to a single byte in +** that range. But with POWERSAFE_OVERWRITE, the blast radius is zero +** (that is what POWERSAFE_OVERWRITE means), so we minimize the sector +** size. For backwards compatibility of the rollback journal file format, +** we cannot reduce the effective sector size below 512. +*/ +static void setSectorSize(Pager *pPager){ + assert( isOpen(pPager->fd) || pPager->tempFile ); + + if( pPager->tempFile + || (sqlite3OsDeviceCharacteristics(pPager->fd) & + SQLITE_IOCAP_POWERSAFE_OVERWRITE)!=0 + ){ + /* Sector size doesn't matter for temporary files. Also, the file + ** may not have been opened yet, in which case the OsSectorSize() + ** call will segfault. */ + pPager->sectorSize = 512; + }else{ + pPager->sectorSize = sqlite3SectorSize(pPager->fd); + } +} + +/* +** Playback the journal and thus restore the database file to +** the state it was in before we started making changes. +** +** The journal file format is as follows: +** +** (1) 8 byte prefix. A copy of aJournalMagic[]. +** (2) 4 byte big-endian integer which is the number of valid page records +** in the journal. If this value is 0xffffffff, then compute the +** number of page records from the journal size. +** (3) 4 byte big-endian integer which is the initial value for the +** sanity checksum. +** (4) 4 byte integer which is the number of pages to truncate the +** database to during a rollback. +** (5) 4 byte big-endian integer which is the sector size. The header +** is this many bytes in size. +** (6) 4 byte big-endian integer which is the page size. +** (7) zero padding out to the next sector size. +** (8) Zero or more pages instances, each as follows: +** + 4 byte page number. +** + pPager->pageSize bytes of data. +** + 4 byte checksum +** +** When we speak of the journal header, we mean the first 7 items above. +** Each entry in the journal is an instance of the 8th item. +** +** Call the value from the second bullet "nRec". nRec is the number of +** valid page entries in the journal. In most cases, you can compute the +** value of nRec from the size of the journal file. But if a power +** failure occurred while the journal was being written, it could be the +** case that the size of the journal file had already been increased but +** the extra entries had not yet made it safely to disk. In such a case, +** the value of nRec computed from the file size would be too large. For +** that reason, we always use the nRec value in the header. +** +** If the nRec value is 0xffffffff it means that nRec should be computed +** from the file size. This value is used when the user selects the +** no-sync option for the journal. A power failure could lead to corruption +** in this case. But for things like temporary table (which will be +** deleted when the power is restored) we don't care. +** +** If the file opened as the journal file is not a well-formed +** journal file then all pages up to the first corrupted page are rolled +** back (or no pages if the journal header is corrupted). The journal file +** is then deleted and SQLITE_OK returned, just as if no corruption had +** been encountered. +** +** If an I/O or malloc() error occurs, the journal-file is not deleted +** and an error code is returned. +** +** The isHot parameter indicates that we are trying to rollback a journal +** that might be a hot journal. Or, it could be that the journal is +** preserved because of JOURNALMODE_PERSIST or JOURNALMODE_TRUNCATE. +** If the journal really is hot, reset the pager cache prior rolling +** back any content. If the journal is merely persistent, no reset is +** needed. +*/ +static int pager_playback(Pager *pPager, int isHot){ + sqlite3_vfs *pVfs = pPager->pVfs; + i64 szJ; /* Size of the journal file in bytes */ + u32 nRec; /* Number of Records in the journal */ + u32 u; /* Unsigned loop counter */ + Pgno mxPg = 0; /* Size of the original file in pages */ + int rc; /* Result code of a subroutine */ + int res = 1; /* Value returned by sqlite3OsAccess() */ + char *zMaster = 0; /* Name of master journal file if any */ + int needPagerReset; /* True to reset page prior to first page rollback */ + int nPlayback = 0; /* Total number of pages restored from journal */ + u32 savedPageSize = pPager->pageSize; + + /* Figure out how many records are in the journal. Abort early if + ** the journal is empty. + */ + assert( isOpen(pPager->jfd) ); + rc = sqlite3OsFileSize(pPager->jfd, &szJ); + if( rc!=SQLITE_OK ){ + goto end_playback; + } + + /* Read the master journal name from the journal, if it is present. + ** If a master journal file name is specified, but the file is not + ** present on disk, then the journal is not hot and does not need to be + ** played back. + ** + ** TODO: Technically the following is an error because it assumes that + ** buffer Pager.pTmpSpace is (mxPathname+1) bytes or larger. i.e. that + ** (pPager->pageSize >= pPager->pVfs->mxPathname+1). Using os_unix.c, + ** mxPathname is 512, which is the same as the minimum allowable value + ** for pageSize. + */ + zMaster = pPager->pTmpSpace; + rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1); + if( rc==SQLITE_OK && zMaster[0] ){ + rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res); + } + zMaster = 0; + if( rc!=SQLITE_OK || !res ){ + goto end_playback; + } + pPager->journalOff = 0; + needPagerReset = isHot; + + /* This loop terminates either when a readJournalHdr() or + ** pager_playback_one_page() call returns SQLITE_DONE or an IO error + ** occurs. + */ + while( 1 ){ + /* Read the next journal header from the journal file. If there are + ** not enough bytes left in the journal file for a complete header, or + ** it is corrupted, then a process must have failed while writing it. + ** This indicates nothing more needs to be rolled back. + */ + rc = readJournalHdr(pPager, isHot, szJ, &nRec, &mxPg); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + } + goto end_playback; + } + + /* If nRec is 0xffffffff, then this journal was created by a process + ** working in no-sync mode. This means that the rest of the journal + ** file consists of pages, there are no more journal headers. Compute + ** the value of nRec based on this assumption. + */ + if( nRec==0xffffffff ){ + assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ); + nRec = (int)((szJ - JOURNAL_HDR_SZ(pPager))/JOURNAL_PG_SZ(pPager)); + } + + /* If nRec is 0 and this rollback is of a transaction created by this + ** process and if this is the final header in the journal, then it means + ** that this part of the journal was being filled but has not yet been + ** synced to disk. Compute the number of pages based on the remaining + ** size of the file. + ** + ** The third term of the test was added to fix ticket #2565. + ** When rolling back a hot journal, nRec==0 always means that the next + ** chunk of the journal contains zero pages to be rolled back. But + ** when doing a ROLLBACK and the nRec==0 chunk is the last chunk in + ** the journal, it means that the journal might contain additional + ** pages that need to be rolled back and that the number of pages + ** should be computed based on the journal file size. + */ + if( nRec==0 && !isHot && + pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff ){ + nRec = (int)((szJ - pPager->journalOff) / JOURNAL_PG_SZ(pPager)); + } + + /* If this is the first header read from the journal, truncate the + ** database file back to its original size. + */ + if( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ){ + rc = pager_truncate(pPager, mxPg); + if( rc!=SQLITE_OK ){ + goto end_playback; + } + pPager->dbSize = mxPg; + } + + /* Copy original pages out of the journal and back into the + ** database file and/or page cache. + */ + for(u=0; ujournalOff,0,1,0); + if( rc==SQLITE_OK ){ + nPlayback++; + }else{ + if( rc==SQLITE_DONE ){ + pPager->journalOff = szJ; + break; + }else if( rc==SQLITE_IOERR_SHORT_READ ){ + /* If the journal has been truncated, simply stop reading and + ** processing the journal. This might happen if the journal was + ** not completely written and synced prior to a crash. In that + ** case, the database should have never been written in the + ** first place so it is OK to simply abandon the rollback. */ + rc = SQLITE_OK; + goto end_playback; + }else{ + /* If we are unable to rollback, quit and return the error + ** code. This will cause the pager to enter the error state + ** so that no further harm will be done. Perhaps the next + ** process to come along will be able to rollback the database. + */ + goto end_playback; + } + } + } + } + /*NOTREACHED*/ + assert( 0 ); + +end_playback: + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSetPagesize(pPager, &savedPageSize, -1); + } + /* Following a rollback, the database file should be back in its original + ** state prior to the start of the transaction, so invoke the + ** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the + ** assertion that the transaction counter was modified. + */ +#ifdef SQLITE_DEBUG + sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0); +#endif + + /* If this playback is happening automatically as a result of an IO or + ** malloc error that occurred after the change-counter was updated but + ** before the transaction was committed, then the change-counter + ** modification may just have been reverted. If this happens in exclusive + ** mode, then subsequent transactions performed by the connection will not + ** update the change-counter at all. This may lead to cache inconsistency + ** problems for other processes at some point in the future. So, just + ** in case this has happened, clear the changeCountDone flag now. + */ + pPager->changeCountDone = pPager->tempFile; + + if( rc==SQLITE_OK ){ + zMaster = pPager->pTmpSpace; + rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1); + testcase( rc!=SQLITE_OK ); + } + if( rc==SQLITE_OK + && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) + ){ + rc = sqlite3PagerSync(pPager, 0); + } + if( rc==SQLITE_OK ){ + rc = pager_end_transaction(pPager, zMaster[0]!='\0', 0); + testcase( rc!=SQLITE_OK ); + } + if( rc==SQLITE_OK && zMaster[0] && res ){ + /* If there was a master journal and this routine will return success, + ** see if it is possible to delete the master journal. + */ + rc = pager_delmaster(pPager, zMaster); + testcase( rc!=SQLITE_OK ); + } + if( isHot && nPlayback ){ + sqlite3_log(SQLITE_NOTICE_RECOVER_ROLLBACK, "recovered %d pages from %s", + nPlayback, pPager->zJournal); + } + + /* The Pager.sectorSize variable may have been updated while rolling + ** back a journal created by a process with a different sector size + ** value. Reset it to the correct value for this process. + */ + setSectorSize(pPager); + return rc; +} + + +/* +** Read the content for page pPg out of the database file (or out of +** the WAL if that is where the most recent copy if found) into +** pPg->pData. A shared lock or greater must be held on the database +** file before this function is called. +** +** If page 1 is read, then the value of Pager.dbFileVers[] is set to +** the value read from the database file. +** +** If an IO error occurs, then the IO error is returned to the caller. +** Otherwise, SQLITE_OK is returned. +*/ +static int readDbPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */ + int rc = SQLITE_OK; /* Return code */ + +#ifndef SQLITE_OMIT_WAL + u32 iFrame = 0; /* Frame of WAL containing pgno */ + + assert( pPager->eState>=PAGER_READER && !MEMDB ); + assert( isOpen(pPager->fd) ); + + if( pagerUseWal(pPager) ){ + rc = sqlite3WalFindFrame(pPager->pWal, pPg->pgno, &iFrame); + if( rc ) return rc; + } + if( iFrame ){ + rc = sqlite3WalReadFrame(pPager->pWal, iFrame,pPager->pageSize,pPg->pData); + }else +#endif + { + i64 iOffset = (pPg->pgno-1)*(i64)pPager->pageSize; + rc = sqlite3OsRead(pPager->fd, pPg->pData, pPager->pageSize, iOffset); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } + } + + if( pPg->pgno==1 ){ + if( rc ){ + /* If the read is unsuccessful, set the dbFileVers[] to something + ** that will never be a valid file version. dbFileVers[] is a copy + ** of bytes 24..39 of the database. Bytes 28..31 should always be + ** zero or the size of the database in page. Bytes 32..35 and 35..39 + ** should be page numbers which are never 0xffffffff. So filling + ** pPager->dbFileVers[] with all 0xff bytes should suffice. + ** + ** For an encrypted database, the situation is more complex: bytes + ** 24..39 of the database are white noise. But the probability of + ** white noise equaling 16 bytes of 0xff is vanishingly small so + ** we should still be ok. + */ + memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers)); + }else{ + u8 *dbFileVers = &((u8*)pPg->pData)[24]; + memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers)); + } + } + PAGER_INCR(sqlite3_pager_readdb_count); + PAGER_INCR(pPager->nRead); + IOTRACE(("PGIN %p %d\n", pPager, pPg->pgno)); + PAGERTRACE(("FETCH %d page %d hash(%08x)\n", + PAGERID(pPager), pPg->pgno, pager_pagehash(pPg))); + + return rc; +} + +/* +** Update the value of the change-counter at offsets 24 and 92 in +** the header and the sqlite version number at offset 96. +** +** This is an unconditional update. See also the pager_incr_changecounter() +** routine which only updates the change-counter if the update is actually +** needed, as determined by the pPager->changeCountDone state variable. +*/ +static void pager_write_changecounter(PgHdr *pPg){ + u32 change_counter; + + /* Increment the value just read and write it back to byte 24. */ + change_counter = sqlite3Get4byte((u8*)pPg->pPager->dbFileVers)+1; + put32bits(((char*)pPg->pData)+24, change_counter); + + /* Also store the SQLite version number in bytes 96..99 and in + ** bytes 92..95 store the change counter for which the version number + ** is valid. */ + put32bits(((char*)pPg->pData)+92, change_counter); + put32bits(((char*)pPg->pData)+96, SQLITE_VERSION_NUMBER); +} + +#ifndef SQLITE_OMIT_WAL +/* +** This function is invoked once for each page that has already been +** written into the log file when a WAL transaction is rolled back. +** Parameter iPg is the page number of said page. The pCtx argument +** is actually a pointer to the Pager structure. +** +** If page iPg is present in the cache, and has no outstanding references, +** it is discarded. Otherwise, if there are one or more outstanding +** references, the page content is reloaded from the database. If the +** attempt to reload content from the database is required and fails, +** return an SQLite error code. Otherwise, SQLITE_OK. +*/ +static int pagerUndoCallback(void *pCtx, Pgno iPg){ + int rc = SQLITE_OK; + Pager *pPager = (Pager *)pCtx; + PgHdr *pPg; + + assert( pagerUseWal(pPager) ); + pPg = sqlite3PagerLookup(pPager, iPg); + if( pPg ){ + if( sqlite3PcachePageRefcount(pPg)==1 ){ + sqlite3PcacheDrop(pPg); + }else{ + rc = readDbPage(pPg); + if( rc==SQLITE_OK ){ + pPager->xReiniter(pPg); + } + sqlite3PagerUnrefNotNull(pPg); + } + } + + /* Normally, if a transaction is rolled back, any backup processes are + ** updated as data is copied out of the rollback journal and into the + ** database. This is not generally possible with a WAL database, as + ** rollback involves simply truncating the log file. Therefore, if one + ** or more frames have already been written to the log (and therefore + ** also copied into the backup databases) as part of this transaction, + ** the backups must be restarted. + */ + sqlite3BackupRestart(pPager->pBackup); + + return rc; +} + +/* +** This function is called to rollback a transaction on a WAL database. +*/ +static int pagerRollbackWal(Pager *pPager){ + int rc; /* Return Code */ + PgHdr *pList; /* List of dirty pages to revert */ + + /* For all pages in the cache that are currently dirty or have already + ** been written (but not committed) to the log file, do one of the + ** following: + ** + ** + Discard the cached page (if refcount==0), or + ** + Reload page content from the database (if refcount>0). + */ + pPager->dbSize = pPager->dbOrigSize; + rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager); + pList = sqlite3PcacheDirtyList(pPager->pPCache); + while( pList && rc==SQLITE_OK ){ + PgHdr *pNext = pList->pDirty; + rc = pagerUndoCallback((void *)pPager, pList->pgno); + pList = pNext; + } + + return rc; +} + +/* +** This function is a wrapper around sqlite3WalFrames(). As well as logging +** the contents of the list of pages headed by pList (connected by pDirty), +** this function notifies any active backup processes that the pages have +** changed. +** +** The list of pages passed into this routine is always sorted by page number. +** Hence, if page 1 appears anywhere on the list, it will be the first page. +*/ +static int pagerWalFrames( + Pager *pPager, /* Pager object */ + PgHdr *pList, /* List of frames to log */ + Pgno nTruncate, /* Database size after this commit */ + int isCommit /* True if this is a commit */ +){ + int rc; /* Return code */ + int nList; /* Number of pages in pList */ + PgHdr *p; /* For looping over pages */ + + assert( pPager->pWal ); + assert( pList ); +#ifdef SQLITE_DEBUG + /* Verify that the page list is in accending order */ + for(p=pList; p && p->pDirty; p=p->pDirty){ + assert( p->pgno < p->pDirty->pgno ); + } +#endif + + assert( pList->pDirty==0 || isCommit ); + if( isCommit ){ + /* If a WAL transaction is being committed, there is no point in writing + ** any pages with page numbers greater than nTruncate into the WAL file. + ** They will never be read by any client. So remove them from the pDirty + ** list here. */ + PgHdr **ppNext = &pList; + nList = 0; + for(p=pList; (*ppNext = p)!=0; p=p->pDirty){ + if( p->pgno<=nTruncate ){ + ppNext = &p->pDirty; + nList++; + } + } + assert( pList ); + }else{ + nList = 1; + } + pPager->aStat[PAGER_STAT_WRITE] += nList; + + if( pList->pgno==1 ) pager_write_changecounter(pList); + rc = sqlite3WalFrames(pPager->pWal, + pPager->pageSize, pList, nTruncate, isCommit, pPager->walSyncFlags + ); + if( rc==SQLITE_OK && pPager->pBackup ){ + for(p=pList; p; p=p->pDirty){ + sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData); + } + } + +#ifdef SQLITE_CHECK_PAGES + pList = sqlite3PcacheDirtyList(pPager->pPCache); + for(p=pList; p; p=p->pDirty){ + pager_set_pagehash(p); + } +#endif + + return rc; +} + +/* +** Begin a read transaction on the WAL. +** +** This routine used to be called "pagerOpenSnapshot()" because it essentially +** makes a snapshot of the database at the current point in time and preserves +** that snapshot for use by the reader in spite of concurrently changes by +** other writers or checkpointers. +*/ +static int pagerBeginReadTransaction(Pager *pPager){ + int rc; /* Return code */ + int changed = 0; /* True if cache must be reset */ + + assert( pagerUseWal(pPager) ); + assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); + + /* sqlite3WalEndReadTransaction() was not called for the previous + ** transaction in locking_mode=EXCLUSIVE. So call it now. If we + ** are in locking_mode=NORMAL and EndRead() was previously called, + ** the duplicate call is harmless. + */ + sqlite3WalEndReadTransaction(pPager->pWal); + + rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed); + if( rc!=SQLITE_OK || changed ){ + pager_reset(pPager); + if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); + } + + return rc; +} +#endif + +/* +** This function is called as part of the transition from PAGER_OPEN +** to PAGER_READER state to determine the size of the database file +** in pages (assuming the page size currently stored in Pager.pageSize). +** +** If no error occurs, SQLITE_OK is returned and the size of the database +** in pages is stored in *pnPage. Otherwise, an error code (perhaps +** SQLITE_IOERR_FSTAT) is returned and *pnPage is left unmodified. +*/ +static int pagerPagecount(Pager *pPager, Pgno *pnPage){ + Pgno nPage; /* Value to return via *pnPage */ + + /* Query the WAL sub-system for the database size. The WalDbsize() + ** function returns zero if the WAL is not open (i.e. Pager.pWal==0), or + ** if the database size is not available. The database size is not + ** available from the WAL sub-system if the log file is empty or + ** contains no valid committed transactions. + */ + assert( pPager->eState==PAGER_OPEN ); + assert( pPager->eLock>=SHARED_LOCK ); + assert( isOpen(pPager->fd) ); + assert( pPager->tempFile==0 ); + nPage = sqlite3WalDbsize(pPager->pWal); + + /* If the number of pages in the database is not available from the + ** WAL sub-system, determine the page count based on the size of + ** the database file. If the size of the database file is not an + ** integer multiple of the page-size, round up the result. + */ + if( nPage==0 && ALWAYS(isOpen(pPager->fd)) ){ + i64 n = 0; /* Size of db file in bytes */ + int rc = sqlite3OsFileSize(pPager->fd, &n); + if( rc!=SQLITE_OK ){ + return rc; + } + nPage = (Pgno)((n+pPager->pageSize-1) / pPager->pageSize); + } + + /* If the current number of pages in the file is greater than the + ** configured maximum pager number, increase the allowed limit so + ** that the file can be read. + */ + if( nPage>pPager->mxPgno ){ + pPager->mxPgno = (Pgno)nPage; + } + + *pnPage = nPage; + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_WAL +/* +** Check if the *-wal file that corresponds to the database opened by pPager +** exists if the database is not empy, or verify that the *-wal file does +** not exist (by deleting it) if the database file is empty. +** +** If the database is not empty and the *-wal file exists, open the pager +** in WAL mode. If the database is empty or if no *-wal file exists and +** if no error occurs, make sure Pager.journalMode is not set to +** PAGER_JOURNALMODE_WAL. +** +** Return SQLITE_OK or an error code. +** +** The caller must hold a SHARED lock on the database file to call this +** function. Because an EXCLUSIVE lock on the db file is required to delete +** a WAL on a none-empty database, this ensures there is no race condition +** between the xAccess() below and an xDelete() being executed by some +** other connection. +*/ +static int pagerOpenWalIfPresent(Pager *pPager){ + int rc = SQLITE_OK; + assert( pPager->eState==PAGER_OPEN ); + assert( pPager->eLock>=SHARED_LOCK ); + + if( !pPager->tempFile ){ + int isWal; /* True if WAL file exists */ + rc = sqlite3OsAccess( + pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &isWal + ); + if( rc==SQLITE_OK ){ + if( isWal ){ + Pgno nPage; /* Size of the database file */ + + rc = pagerPagecount(pPager, &nPage); + if( rc ) return rc; + if( nPage==0 ){ + rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0); + }else{ + testcase( sqlite3PcachePagecount(pPager->pPCache)==0 ); + rc = sqlite3PagerOpenWal(pPager, 0); + } + }else if( pPager->journalMode==PAGER_JOURNALMODE_WAL ){ + pPager->journalMode = PAGER_JOURNALMODE_DELETE; + } + } + } + return rc; +} +#endif + +/* +** Playback savepoint pSavepoint. Or, if pSavepoint==NULL, then playback +** the entire master journal file. The case pSavepoint==NULL occurs when +** a ROLLBACK TO command is invoked on a SAVEPOINT that is a transaction +** savepoint. +** +** When pSavepoint is not NULL (meaning a non-transaction savepoint is +** being rolled back), then the rollback consists of up to three stages, +** performed in the order specified: +** +** * Pages are played back from the main journal starting at byte +** offset PagerSavepoint.iOffset and continuing to +** PagerSavepoint.iHdrOffset, or to the end of the main journal +** file if PagerSavepoint.iHdrOffset is zero. +** +** * If PagerSavepoint.iHdrOffset is not zero, then pages are played +** back starting from the journal header immediately following +** PagerSavepoint.iHdrOffset to the end of the main journal file. +** +** * Pages are then played back from the sub-journal file, starting +** with the PagerSavepoint.iSubRec and continuing to the end of +** the journal file. +** +** Throughout the rollback process, each time a page is rolled back, the +** corresponding bit is set in a bitvec structure (variable pDone in the +** implementation below). This is used to ensure that a page is only +** rolled back the first time it is encountered in either journal. +** +** If pSavepoint is NULL, then pages are only played back from the main +** journal file. There is no need for a bitvec in this case. +** +** In either case, before playback commences the Pager.dbSize variable +** is reset to the value that it held at the start of the savepoint +** (or transaction). No page with a page-number greater than this value +** is played back. If one is encountered it is simply skipped. +*/ +static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ + i64 szJ; /* Effective size of the main journal */ + i64 iHdrOff; /* End of first segment of main-journal records */ + int rc = SQLITE_OK; /* Return code */ + Bitvec *pDone = 0; /* Bitvec to ensure pages played back only once */ + + assert( pPager->eState!=PAGER_ERROR ); + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + + /* Allocate a bitvec to use to store the set of pages rolled back */ + if( pSavepoint ){ + pDone = sqlite3BitvecCreate(pSavepoint->nOrig); + if( !pDone ){ + return SQLITE_NOMEM_BKPT; + } + } + + /* Set the database size back to the value it was before the savepoint + ** being reverted was opened. + */ + pPager->dbSize = pSavepoint ? pSavepoint->nOrig : pPager->dbOrigSize; + pPager->changeCountDone = pPager->tempFile; + + if( !pSavepoint && pagerUseWal(pPager) ){ + return pagerRollbackWal(pPager); + } + + /* Use pPager->journalOff as the effective size of the main rollback + ** journal. The actual file might be larger than this in + ** PAGER_JOURNALMODE_TRUNCATE or PAGER_JOURNALMODE_PERSIST. But anything + ** past pPager->journalOff is off-limits to us. + */ + szJ = pPager->journalOff; + assert( pagerUseWal(pPager)==0 || szJ==0 ); + + /* Begin by rolling back records from the main journal starting at + ** PagerSavepoint.iOffset and continuing to the next journal header. + ** There might be records in the main journal that have a page number + ** greater than the current database size (pPager->dbSize) but those + ** will be skipped automatically. Pages are added to pDone as they + ** are played back. + */ + if( pSavepoint && !pagerUseWal(pPager) ){ + iHdrOff = pSavepoint->iHdrOffset ? pSavepoint->iHdrOffset : szJ; + pPager->journalOff = pSavepoint->iOffset; + while( rc==SQLITE_OK && pPager->journalOffjournalOff, pDone, 1, 1); + } + assert( rc!=SQLITE_DONE ); + }else{ + pPager->journalOff = 0; + } + + /* Continue rolling back records out of the main journal starting at + ** the first journal header seen and continuing until the effective end + ** of the main journal file. Continue to skip out-of-range pages and + ** continue adding pages rolled back to pDone. + */ + while( rc==SQLITE_OK && pPager->journalOffjournalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff" + ** test is related to ticket #2565. See the discussion in the + ** pager_playback() function for additional information. + */ + if( nJRec==0 + && pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff + ){ + nJRec = (u32)((szJ - pPager->journalOff)/JOURNAL_PG_SZ(pPager)); + } + for(ii=0; rc==SQLITE_OK && iijournalOffjournalOff, pDone, 1, 1); + } + assert( rc!=SQLITE_DONE ); + } + assert( rc!=SQLITE_OK || pPager->journalOff>=szJ ); + + /* Finally, rollback pages from the sub-journal. Page that were + ** previously rolled back out of the main journal (and are hence in pDone) + ** will be skipped. Out-of-range pages are also skipped. + */ + if( pSavepoint ){ + u32 ii; /* Loop counter */ + i64 offset = (i64)pSavepoint->iSubRec*(4+pPager->pageSize); + + if( pagerUseWal(pPager) ){ + rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData); + } + for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && iinSubRec; ii++){ + assert( offset==(i64)ii*(4+pPager->pageSize) ); + rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1); + } + assert( rc!=SQLITE_DONE ); + } + + sqlite3BitvecDestroy(pDone); + if( rc==SQLITE_OK ){ + pPager->journalOff = szJ; + } + + return rc; +} + +/* +** Change the maximum number of in-memory pages that are allowed +** before attempting to recycle clean and unused pages. +*/ +SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){ + sqlite3PcacheSetCachesize(pPager->pPCache, mxPage); +} + +/* +** Change the maximum number of in-memory pages that are allowed +** before attempting to spill pages to journal. +*/ +SQLITE_PRIVATE int sqlite3PagerSetSpillsize(Pager *pPager, int mxPage){ + return sqlite3PcacheSetSpillsize(pPager->pPCache, mxPage); +} + +/* +** Invoke SQLITE_FCNTL_MMAP_SIZE based on the current value of szMmap. +*/ +static void pagerFixMaplimit(Pager *pPager){ +#if SQLITE_MAX_MMAP_SIZE>0 + sqlite3_file *fd = pPager->fd; + if( isOpen(fd) && fd->pMethods->iVersion>=3 ){ + sqlite3_int64 sz; + sz = pPager->szMmap; + pPager->bUseFetch = (sz>0); + setGetterMethod(pPager); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_MMAP_SIZE, &sz); + } +#endif +} + +/* +** Change the maximum size of any memory mapping made of the database file. +*/ +SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *pPager, sqlite3_int64 szMmap){ + pPager->szMmap = szMmap; + pagerFixMaplimit(pPager); +} + +/* +** Free as much memory as possible from the pager. +*/ +SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){ + sqlite3PcacheShrink(pPager->pPCache); +} + +/* +** Adjust settings of the pager to those specified in the pgFlags parameter. +** +** The "level" in pgFlags & PAGER_SYNCHRONOUS_MASK sets the robustness +** of the database to damage due to OS crashes or power failures by +** changing the number of syncs()s when writing the journals. +** There are four levels: +** +** OFF sqlite3OsSync() is never called. This is the default +** for temporary and transient files. +** +** NORMAL The journal is synced once before writes begin on the +** database. This is normally adequate protection, but +** it is theoretically possible, though very unlikely, +** that an inopertune power failure could leave the journal +** in a state which would cause damage to the database +** when it is rolled back. +** +** FULL The journal is synced twice before writes begin on the +** database (with some additional information - the nRec field +** of the journal header - being written in between the two +** syncs). If we assume that writing a +** single disk sector is atomic, then this mode provides +** assurance that the journal will not be corrupted to the +** point of causing damage to the database during rollback. +** +** EXTRA This is like FULL except that is also syncs the directory +** that contains the rollback journal after the rollback +** journal is unlinked. +** +** The above is for a rollback-journal mode. For WAL mode, OFF continues +** to mean that no syncs ever occur. NORMAL means that the WAL is synced +** prior to the start of checkpoint and that the database file is synced +** at the conclusion of the checkpoint if the entire content of the WAL +** was written back into the database. But no sync operations occur for +** an ordinary commit in NORMAL mode with WAL. FULL means that the WAL +** file is synced following each commit operation, in addition to the +** syncs associated with NORMAL. There is no difference between FULL +** and EXTRA for WAL mode. +** +** Do not confuse synchronous=FULL with SQLITE_SYNC_FULL. The +** SQLITE_SYNC_FULL macro means to use the MacOSX-style full-fsync +** using fcntl(F_FULLFSYNC). SQLITE_SYNC_NORMAL means to do an +** ordinary fsync() call. There is no difference between SQLITE_SYNC_FULL +** and SQLITE_SYNC_NORMAL on platforms other than MacOSX. But the +** synchronous=FULL versus synchronous=NORMAL setting determines when +** the xSync primitive is called and is relevant to all platforms. +** +** Numeric values associated with these states are OFF==1, NORMAL=2, +** and FULL=3. +*/ +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +SQLITE_PRIVATE void sqlite3PagerSetFlags( + Pager *pPager, /* The pager to set safety level for */ + unsigned pgFlags /* Various flags */ +){ + unsigned level = pgFlags & PAGER_SYNCHRONOUS_MASK; + if( pPager->tempFile ){ + pPager->noSync = 1; + pPager->fullSync = 0; + pPager->extraSync = 0; + }else{ + pPager->noSync = level==PAGER_SYNCHRONOUS_OFF ?1:0; + pPager->fullSync = level>=PAGER_SYNCHRONOUS_FULL ?1:0; + pPager->extraSync = level==PAGER_SYNCHRONOUS_EXTRA ?1:0; + } + if( pPager->noSync ){ + pPager->syncFlags = 0; + }else if( pgFlags & PAGER_FULLFSYNC ){ + pPager->syncFlags = SQLITE_SYNC_FULL; + }else{ + pPager->syncFlags = SQLITE_SYNC_NORMAL; + } + pPager->walSyncFlags = (pPager->syncFlags<<2); + if( pPager->fullSync ){ + pPager->walSyncFlags |= pPager->syncFlags; + } + if( (pgFlags & PAGER_CKPT_FULLFSYNC) && !pPager->noSync ){ + pPager->walSyncFlags |= (SQLITE_SYNC_FULL<<2); + } + if( pgFlags & PAGER_CACHESPILL ){ + pPager->doNotSpill &= ~SPILLFLAG_OFF; + }else{ + pPager->doNotSpill |= SPILLFLAG_OFF; + } +} +#endif + +/* +** The following global variable is incremented whenever the library +** attempts to open a temporary file. This information is used for +** testing and analysis only. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_opentemp_count = 0; +#endif + +/* +** Open a temporary file. +** +** Write the file descriptor into *pFile. Return SQLITE_OK on success +** or some other error code if we fail. The OS will automatically +** delete the temporary file when it is closed. +** +** The flags passed to the VFS layer xOpen() call are those specified +** by parameter vfsFlags ORed with the following: +** +** SQLITE_OPEN_READWRITE +** SQLITE_OPEN_CREATE +** SQLITE_OPEN_EXCLUSIVE +** SQLITE_OPEN_DELETEONCLOSE +*/ +static int pagerOpentemp( + Pager *pPager, /* The pager object */ + sqlite3_file *pFile, /* Write the file descriptor here */ + int vfsFlags /* Flags passed through to the VFS */ +){ + int rc; /* Return code */ + +#ifdef SQLITE_TEST + sqlite3_opentemp_count++; /* Used for testing and analysis only */ +#endif + + vfsFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE; + rc = sqlite3OsOpen(pPager->pVfs, 0, pFile, vfsFlags, 0); + assert( rc!=SQLITE_OK || isOpen(pFile) ); + return rc; +} + +/* +** Set the busy handler function. +** +** The pager invokes the busy-handler if sqlite3OsLock() returns +** SQLITE_BUSY when trying to upgrade from no-lock to a SHARED lock, +** or when trying to upgrade from a RESERVED lock to an EXCLUSIVE +** lock. It does *not* invoke the busy handler when upgrading from +** SHARED to RESERVED, or when upgrading from SHARED to EXCLUSIVE +** (which occurs during hot-journal rollback). Summary: +** +** Transition | Invokes xBusyHandler +** -------------------------------------------------------- +** NO_LOCK -> SHARED_LOCK | Yes +** SHARED_LOCK -> RESERVED_LOCK | No +** SHARED_LOCK -> EXCLUSIVE_LOCK | No +** RESERVED_LOCK -> EXCLUSIVE_LOCK | Yes +** +** If the busy-handler callback returns non-zero, the lock is +** retried. If it returns zero, then the SQLITE_BUSY error is +** returned to the caller of the pager API function. +*/ +SQLITE_PRIVATE void sqlite3PagerSetBusyHandler( + Pager *pPager, /* Pager object */ + int (*xBusyHandler)(void *), /* Pointer to busy-handler function */ + void *pBusyHandlerArg /* Argument to pass to xBusyHandler */ +){ + void **ap; + pPager->xBusyHandler = xBusyHandler; + pPager->pBusyHandlerArg = pBusyHandlerArg; + ap = (void **)&pPager->xBusyHandler; + assert( ((int(*)(void *))(ap[0]))==xBusyHandler ); + assert( ap[1]==pBusyHandlerArg ); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap); +} + +/* +** Change the page size used by the Pager object. The new page size +** is passed in *pPageSize. +** +** If the pager is in the error state when this function is called, it +** is a no-op. The value returned is the error state error code (i.e. +** one of SQLITE_IOERR, an SQLITE_IOERR_xxx sub-code or SQLITE_FULL). +** +** Otherwise, if all of the following are true: +** +** * the new page size (value of *pPageSize) is valid (a power +** of two between 512 and SQLITE_MAX_PAGE_SIZE, inclusive), and +** +** * there are no outstanding page references, and +** +** * the database is either not an in-memory database or it is +** an in-memory database that currently consists of zero pages. +** +** then the pager object page size is set to *pPageSize. +** +** If the page size is changed, then this function uses sqlite3PagerMalloc() +** to obtain a new Pager.pTmpSpace buffer. If this allocation attempt +** fails, SQLITE_NOMEM is returned and the page size remains unchanged. +** In all other cases, SQLITE_OK is returned. +** +** If the page size is not changed, either because one of the enumerated +** conditions above is not true, the pager was in error state when this +** function was called, or because the memory allocation attempt failed, +** then *pPageSize is set to the old, retained page size before returning. +*/ +SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ + int rc = SQLITE_OK; + + /* It is not possible to do a full assert_pager_state() here, as this + ** function may be called from within PagerOpen(), before the state + ** of the Pager object is internally consistent. + ** + ** At one point this function returned an error if the pager was in + ** PAGER_ERROR state. But since PAGER_ERROR state guarantees that + ** there is at least one outstanding page reference, this function + ** is a no-op for that case anyhow. + */ + + u32 pageSize = *pPageSize; + assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) ); + if( (pPager->memDb==0 || pPager->dbSize==0) + && sqlite3PcacheRefCount(pPager->pPCache)==0 + && pageSize && pageSize!=(u32)pPager->pageSize + ){ + char *pNew = NULL; /* New temp space */ + i64 nByte = 0; + + if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){ + rc = sqlite3OsFileSize(pPager->fd, &nByte); + } + if( rc==SQLITE_OK ){ + /* 8 bytes of zeroed overrun space is sufficient so that the b-tree + * cell header parser will never run off the end of the allocation */ + pNew = (char *)sqlite3PageMalloc(pageSize+8); + if( !pNew ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + memset(pNew+pageSize, 0, 8); + } + } + + if( rc==SQLITE_OK ){ + pager_reset(pPager); + rc = sqlite3PcacheSetPageSize(pPager->pPCache, pageSize); + } + if( rc==SQLITE_OK ){ + sqlite3PageFree(pPager->pTmpSpace); + pPager->pTmpSpace = pNew; + pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize); + pPager->pageSize = pageSize; + }else{ + sqlite3PageFree(pNew); + } + } + + *pPageSize = pPager->pageSize; + if( rc==SQLITE_OK ){ + if( nReserve<0 ) nReserve = pPager->nReserve; + assert( nReserve>=0 && nReserve<1000 ); + pPager->nReserve = (i16)nReserve; + pagerFixMaplimit(pPager); + } + return rc; +} + +/* +** Return a pointer to the "temporary page" buffer held internally +** by the pager. This is a buffer that is big enough to hold the +** entire content of a database page. This buffer is used internally +** during rollback and will be overwritten whenever a rollback +** occurs. But other modules are free to use it too, as long as +** no rollbacks are happening. +*/ +SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager *pPager){ + return pPager->pTmpSpace; +} + +/* +** Attempt to set the maximum database page count if mxPage is positive. +** Make no changes if mxPage is zero or negative. And never reduce the +** maximum page count below the current size of the database. +** +** Regardless of mxPage, return the current maximum page count. +*/ +SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){ + if( mxPage>0 ){ + pPager->mxPgno = mxPage; + } + assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */ + /* assert( pPager->mxPgno>=pPager->dbSize ); */ + /* OP_MaxPgcnt ensures that the parameter passed to this function is not + ** less than the total number of valid pages in the database. But this + ** may be less than Pager.dbSize, and so the assert() above is not valid */ + return pPager->mxPgno; +} + +/* +** The following set of routines are used to disable the simulated +** I/O error mechanism. These routines are used to avoid simulated +** errors in places where we do not care about errors. +** +** Unless -DSQLITE_TEST=1 is used, these routines are all no-ops +** and generate no code. +*/ +#ifdef SQLITE_TEST +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_hit; +static int saved_cnt; +void disable_simulated_io_errors(void){ + saved_cnt = sqlite3_io_error_pending; + sqlite3_io_error_pending = -1; +} +void enable_simulated_io_errors(void){ + sqlite3_io_error_pending = saved_cnt; +} +#else +# define disable_simulated_io_errors() +# define enable_simulated_io_errors() +#endif + +/* +** Read the first N bytes from the beginning of the file into memory +** that pDest points to. +** +** If the pager was opened on a transient file (zFilename==""), or +** opened on a file less than N bytes in size, the output buffer is +** zeroed and SQLITE_OK returned. The rationale for this is that this +** function is used to read database headers, and a new transient or +** zero sized database has a header than consists entirely of zeroes. +** +** If any IO error apart from SQLITE_IOERR_SHORT_READ is encountered, +** the error code is returned to the caller and the contents of the +** output buffer undefined. +*/ +SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned char *pDest){ + int rc = SQLITE_OK; + memset(pDest, 0, N); + assert( isOpen(pPager->fd) || pPager->tempFile ); + + /* This routine is only called by btree immediately after creating + ** the Pager object. There has not been an opportunity to transition + ** to WAL mode yet. + */ + assert( !pagerUseWal(pPager) ); + + if( isOpen(pPager->fd) ){ + IOTRACE(("DBHDR %p 0 %d\n", pPager, N)) + rc = sqlite3OsRead(pPager->fd, pDest, N, 0); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } + } + return rc; +} + +/* +** This function may only be called when a read-transaction is open on +** the pager. It returns the total number of pages in the database. +** +** However, if the file is between 1 and bytes in size, then +** this is considered a 1 page file. +*/ +SQLITE_PRIVATE void sqlite3PagerPagecount(Pager *pPager, int *pnPage){ + assert( pPager->eState>=PAGER_READER ); + assert( pPager->eState!=PAGER_WRITER_FINISHED ); + *pnPage = (int)pPager->dbSize; +} + + +/* +** Try to obtain a lock of type locktype on the database file. If +** a similar or greater lock is already held, this function is a no-op +** (returning SQLITE_OK immediately). +** +** Otherwise, attempt to obtain the lock using sqlite3OsLock(). Invoke +** the busy callback if the lock is currently not available. Repeat +** until the busy callback returns false or until the attempt to +** obtain the lock succeeds. +** +** Return SQLITE_OK on success and an error code if we cannot obtain +** the lock. If the lock is obtained successfully, set the Pager.state +** variable to locktype before returning. +*/ +static int pager_wait_on_lock(Pager *pPager, int locktype){ + int rc; /* Return code */ + + /* Check that this is either a no-op (because the requested lock is + ** already held), or one of the transitions that the busy-handler + ** may be invoked during, according to the comment above + ** sqlite3PagerSetBusyhandler(). + */ + assert( (pPager->eLock>=locktype) + || (pPager->eLock==NO_LOCK && locktype==SHARED_LOCK) + || (pPager->eLock==RESERVED_LOCK && locktype==EXCLUSIVE_LOCK) + ); + + do { + rc = pagerLockDb(pPager, locktype); + }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) ); + return rc; +} + +/* +** Function assertTruncateConstraint(pPager) checks that one of the +** following is true for all dirty pages currently in the page-cache: +** +** a) The page number is less than or equal to the size of the +** current database image, in pages, OR +** +** b) if the page content were written at this time, it would not +** be necessary to write the current content out to the sub-journal +** (as determined by function subjRequiresPage()). +** +** If the condition asserted by this function were not true, and the +** dirty page were to be discarded from the cache via the pagerStress() +** routine, pagerStress() would not write the current page content to +** the database file. If a savepoint transaction were rolled back after +** this happened, the correct behavior would be to restore the current +** content of the page. However, since this content is not present in either +** the database file or the portion of the rollback journal and +** sub-journal rolled back the content could not be restored and the +** database image would become corrupt. It is therefore fortunate that +** this circumstance cannot arise. +*/ +#if defined(SQLITE_DEBUG) +static void assertTruncateConstraintCb(PgHdr *pPg){ + assert( pPg->flags&PGHDR_DIRTY ); + assert( !subjRequiresPage(pPg) || pPg->pgno<=pPg->pPager->dbSize ); +} +static void assertTruncateConstraint(Pager *pPager){ + sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb); +} +#else +# define assertTruncateConstraint(pPager) +#endif + +/* +** Truncate the in-memory database file image to nPage pages. This +** function does not actually modify the database file on disk. It +** just sets the internal state of the pager object so that the +** truncation will be done when the current transaction is committed. +** +** This function is only called right before committing a transaction. +** Once this function has been called, the transaction must either be +** rolled back or committed. It is not safe to call this function and +** then continue writing to the database. +*/ +SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ + assert( pPager->dbSize>=nPage ); + assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); + pPager->dbSize = nPage; + + /* At one point the code here called assertTruncateConstraint() to + ** ensure that all pages being truncated away by this operation are, + ** if one or more savepoints are open, present in the savepoint + ** journal so that they can be restored if the savepoint is rolled + ** back. This is no longer necessary as this function is now only + ** called right before committing a transaction. So although the + ** Pager object may still have open savepoints (Pager.nSavepoint!=0), + ** they cannot be rolled back. So the assertTruncateConstraint() call + ** is no longer correct. */ +} + + +/* +** This function is called before attempting a hot-journal rollback. It +** syncs the journal file to disk, then sets pPager->journalHdr to the +** size of the journal file so that the pager_playback() routine knows +** that the entire journal file has been synced. +** +** Syncing a hot-journal to disk before attempting to roll it back ensures +** that if a power-failure occurs during the rollback, the process that +** attempts rollback following system recovery sees the same journal +** content as this process. +** +** If everything goes as planned, SQLITE_OK is returned. Otherwise, +** an SQLite error code. +*/ +static int pagerSyncHotJournal(Pager *pPager){ + int rc = SQLITE_OK; + if( !pPager->noSync ){ + rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_NORMAL); + } + if( rc==SQLITE_OK ){ + rc = sqlite3OsFileSize(pPager->jfd, &pPager->journalHdr); + } + return rc; +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** Obtain a reference to a memory mapped page object for page number pgno. +** The new object will use the pointer pData, obtained from xFetch(). +** If successful, set *ppPage to point to the new page reference +** and return SQLITE_OK. Otherwise, return an SQLite error code and set +** *ppPage to zero. +** +** Page references obtained by calling this function should be released +** by calling pagerReleaseMapPage(). +*/ +static int pagerAcquireMapPage( + Pager *pPager, /* Pager object */ + Pgno pgno, /* Page number */ + void *pData, /* xFetch()'d data for this page */ + PgHdr **ppPage /* OUT: Acquired page object */ +){ + PgHdr *p; /* Memory mapped page to return */ + + if( pPager->pMmapFreelist ){ + *ppPage = p = pPager->pMmapFreelist; + pPager->pMmapFreelist = p->pDirty; + p->pDirty = 0; + assert( pPager->nExtra>=8 ); + memset(p->pExtra, 0, 8); + }else{ + *ppPage = p = (PgHdr *)sqlite3MallocZero(sizeof(PgHdr) + pPager->nExtra); + if( p==0 ){ + sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1) * pPager->pageSize, pData); + return SQLITE_NOMEM_BKPT; + } + p->pExtra = (void *)&p[1]; + p->flags = PGHDR_MMAP; + p->nRef = 1; + p->pPager = pPager; + } + + assert( p->pExtra==(void *)&p[1] ); + assert( p->pPage==0 ); + assert( p->flags==PGHDR_MMAP ); + assert( p->pPager==pPager ); + assert( p->nRef==1 ); + + p->pgno = pgno; + p->pData = pData; + pPager->nMmapOut++; + + return SQLITE_OK; +} +#endif + +/* +** Release a reference to page pPg. pPg must have been returned by an +** earlier call to pagerAcquireMapPage(). +*/ +static void pagerReleaseMapPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + pPager->nMmapOut--; + pPg->pDirty = pPager->pMmapFreelist; + pPager->pMmapFreelist = pPg; + + assert( pPager->fd->pMethods->iVersion>=3 ); + sqlite3OsUnfetch(pPager->fd, (i64)(pPg->pgno-1)*pPager->pageSize, pPg->pData); +} + +/* +** Free all PgHdr objects stored in the Pager.pMmapFreelist list. +*/ +static void pagerFreeMapHdrs(Pager *pPager){ + PgHdr *p; + PgHdr *pNext; + for(p=pPager->pMmapFreelist; p; p=pNext){ + pNext = p->pDirty; + sqlite3_free(p); + } +} + +/* Verify that the database file has not be deleted or renamed out from +** under the pager. Return SQLITE_OK if the database is still where it ought +** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error +** code from sqlite3OsAccess()) if the database has gone missing. +*/ +static int databaseIsUnmoved(Pager *pPager){ + int bHasMoved = 0; + int rc; + + if( pPager->tempFile ) return SQLITE_OK; + if( pPager->dbSize==0 ) return SQLITE_OK; + assert( pPager->zFilename && pPager->zFilename[0] ); + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved); + if( rc==SQLITE_NOTFOUND ){ + /* If the HAS_MOVED file-control is unimplemented, assume that the file + ** has not been moved. That is the historical behavior of SQLite: prior to + ** version 3.8.3, it never checked */ + rc = SQLITE_OK; + }else if( rc==SQLITE_OK && bHasMoved ){ + rc = SQLITE_READONLY_DBMOVED; + } + return rc; +} + + +/* +** Shutdown the page cache. Free all memory and close all files. +** +** If a transaction was in progress when this routine is called, that +** transaction is rolled back. All outstanding pages are invalidated +** and their memory is freed. Any attempt to use a page associated +** with this page cache after this function returns will likely +** result in a coredump. +** +** This function always succeeds. If a transaction is active an attempt +** is made to roll it back. If an error occurs during the rollback +** a hot journal may be left in the filesystem but no error is returned +** to the caller. +*/ +SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ + u8 *pTmp = (u8*)pPager->pTmpSpace; + assert( db || pagerUseWal(pPager)==0 ); + assert( assert_pager_state(pPager) ); + disable_simulated_io_errors(); + sqlite3BeginBenignMalloc(); + pagerFreeMapHdrs(pPager); + /* pPager->errCode = 0; */ + pPager->exclusiveMode = 0; +#ifndef SQLITE_OMIT_WAL + { + u8 *a = 0; + assert( db || pPager->pWal==0 ); + if( db && 0==(db->flags & SQLITE_NoCkptOnClose) + && SQLITE_OK==databaseIsUnmoved(pPager) + ){ + a = pTmp; + } + sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, pPager->pageSize,a); + pPager->pWal = 0; + } +#endif + pager_reset(pPager); + if( MEMDB ){ + pager_unlock(pPager); + }else{ + /* If it is open, sync the journal file before calling UnlockAndRollback. + ** If this is not done, then an unsynced portion of the open journal + ** file may be played back into the database. If a power failure occurs + ** while this is happening, the database could become corrupt. + ** + ** If an error occurs while trying to sync the journal, shift the pager + ** into the ERROR state. This causes UnlockAndRollback to unlock the + ** database and close the journal file without attempting to roll it + ** back or finalize it. The next database user will have to do hot-journal + ** rollback before accessing the database file. + */ + if( isOpen(pPager->jfd) ){ + pager_error(pPager, pagerSyncHotJournal(pPager)); + } + pagerUnlockAndRollback(pPager); + } + sqlite3EndBenignMalloc(); + enable_simulated_io_errors(); + PAGERTRACE(("CLOSE %d\n", PAGERID(pPager))); + IOTRACE(("CLOSE %p\n", pPager)) + sqlite3OsClose(pPager->jfd); + sqlite3OsClose(pPager->fd); + sqlite3PageFree(pTmp); + sqlite3PcacheClose(pPager->pPCache); + assert( !pPager->aSavepoint && !pPager->pInJournal ); + assert( !isOpen(pPager->jfd) && !isOpen(pPager->sjfd) ); + + sqlite3_free(pPager); + return SQLITE_OK; +} + +#if !defined(NDEBUG) || defined(SQLITE_TEST) +/* +** Return the page number for page pPg. +*/ +SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage *pPg){ + return pPg->pgno; +} +#endif + +/* +** Increment the reference count for page pPg. +*/ +SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){ + sqlite3PcacheRef(pPg); +} + +/* +** Sync the journal. In other words, make sure all the pages that have +** been written to the journal have actually reached the surface of the +** disk and can be restored in the event of a hot-journal rollback. +** +** If the Pager.noSync flag is set, then this function is a no-op. +** Otherwise, the actions required depend on the journal-mode and the +** device characteristics of the file-system, as follows: +** +** * If the journal file is an in-memory journal file, no action need +** be taken. +** +** * Otherwise, if the device does not support the SAFE_APPEND property, +** then the nRec field of the most recently written journal header +** is updated to contain the number of journal records that have +** been written following it. If the pager is operating in full-sync +** mode, then the journal file is synced before this field is updated. +** +** * If the device does not support the SEQUENTIAL property, then +** journal file is synced. +** +** Or, in pseudo-code: +** +** if( NOT ){ +** if( NOT SAFE_APPEND ){ +** if( ) xSync(); +** +** } +** if( NOT SEQUENTIAL ) xSync(); +** } +** +** If successful, this routine clears the PGHDR_NEED_SYNC flag of every +** page currently held in memory before returning SQLITE_OK. If an IO +** error is encountered, then the IO error code is returned to the caller. +*/ +static int syncJournal(Pager *pPager, int newHdr){ + int rc; /* Return code */ + + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + assert( !pagerUseWal(pPager) ); + + rc = sqlite3PagerExclusiveLock(pPager); + if( rc!=SQLITE_OK ) return rc; + + if( !pPager->noSync ){ + assert( !pPager->tempFile ); + if( isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){ + const int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); + assert( isOpen(pPager->jfd) ); + + if( 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ + /* This block deals with an obscure problem. If the last connection + ** that wrote to this database was operating in persistent-journal + ** mode, then the journal file may at this point actually be larger + ** than Pager.journalOff bytes. If the next thing in the journal + ** file happens to be a journal-header (written as part of the + ** previous connection's transaction), and a crash or power-failure + ** occurs after nRec is updated but before this connection writes + ** anything else to the journal file (or commits/rolls back its + ** transaction), then SQLite may become confused when doing the + ** hot-journal rollback following recovery. It may roll back all + ** of this connections data, then proceed to rolling back the old, + ** out-of-date data that follows it. Database corruption. + ** + ** To work around this, if the journal file does appear to contain + ** a valid header following Pager.journalOff, then write a 0x00 + ** byte to the start of it to prevent it from being recognized. + ** + ** Variable iNextHdrOffset is set to the offset at which this + ** problematic header will occur, if it exists. aMagic is used + ** as a temporary buffer to inspect the first couple of bytes of + ** the potential journal header. + */ + i64 iNextHdrOffset; + u8 aMagic[8]; + u8 zHeader[sizeof(aJournalMagic)+4]; + + memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); + put32bits(&zHeader[sizeof(aJournalMagic)], pPager->nRec); + + iNextHdrOffset = journalHdrOffset(pPager); + rc = sqlite3OsRead(pPager->jfd, aMagic, 8, iNextHdrOffset); + if( rc==SQLITE_OK && 0==memcmp(aMagic, aJournalMagic, 8) ){ + static const u8 zerobyte = 0; + rc = sqlite3OsWrite(pPager->jfd, &zerobyte, 1, iNextHdrOffset); + } + if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){ + return rc; + } + + /* Write the nRec value into the journal file header. If in + ** full-synchronous mode, sync the journal first. This ensures that + ** all data has really hit the disk before nRec is updated to mark + ** it as a candidate for rollback. + ** + ** This is not required if the persistent media supports the + ** SAFE_APPEND property. Because in this case it is not possible + ** for garbage data to be appended to the file, the nRec field + ** is populated with 0xFFFFFFFF when the journal header is written + ** and never needs to be updated. + */ + if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ + PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager))); + IOTRACE(("JSYNC %p\n", pPager)) + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); + if( rc!=SQLITE_OK ) return rc; + } + IOTRACE(("JHDR %p %lld\n", pPager, pPager->journalHdr)); + rc = sqlite3OsWrite( + pPager->jfd, zHeader, sizeof(zHeader), pPager->journalHdr + ); + if( rc!=SQLITE_OK ) return rc; + } + if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ + PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager))); + IOTRACE(("JSYNC %p\n", pPager)) + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags| + (pPager->syncFlags==SQLITE_SYNC_FULL?SQLITE_SYNC_DATAONLY:0) + ); + if( rc!=SQLITE_OK ) return rc; + } + + pPager->journalHdr = pPager->journalOff; + if( newHdr && 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ + pPager->nRec = 0; + rc = writeJournalHdr(pPager); + if( rc!=SQLITE_OK ) return rc; + } + }else{ + pPager->journalHdr = pPager->journalOff; + } + } + + /* Unless the pager is in noSync mode, the journal file was just + ** successfully synced. Either way, clear the PGHDR_NEED_SYNC flag on + ** all pages. + */ + sqlite3PcacheClearSyncFlags(pPager->pPCache); + pPager->eState = PAGER_WRITER_DBMOD; + assert( assert_pager_state(pPager) ); + return SQLITE_OK; +} + +/* +** The argument is the first in a linked list of dirty pages connected +** by the PgHdr.pDirty pointer. This function writes each one of the +** in-memory pages in the list to the database file. The argument may +** be NULL, representing an empty list. In this case this function is +** a no-op. +** +** The pager must hold at least a RESERVED lock when this function +** is called. Before writing anything to the database file, this lock +** is upgraded to an EXCLUSIVE lock. If the lock cannot be obtained, +** SQLITE_BUSY is returned and no data is written to the database file. +** +** If the pager is a temp-file pager and the actual file-system file +** is not yet open, it is created and opened before any data is +** written out. +** +** Once the lock has been upgraded and, if necessary, the file opened, +** the pages are written out to the database file in list order. Writing +** a page is skipped if it meets either of the following criteria: +** +** * The page number is greater than Pager.dbSize, or +** * The PGHDR_DONT_WRITE flag is set on the page. +** +** If writing out a page causes the database file to grow, Pager.dbFileSize +** is updated accordingly. If page 1 is written out, then the value cached +** in Pager.dbFileVers[] is updated to match the new value stored in +** the database file. +** +** If everything is successful, SQLITE_OK is returned. If an IO error +** occurs, an IO error code is returned. Or, if the EXCLUSIVE lock cannot +** be obtained, SQLITE_BUSY is returned. +*/ +static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ + int rc = SQLITE_OK; /* Return code */ + + /* This function is only called for rollback pagers in WRITER_DBMOD state. */ + assert( !pagerUseWal(pPager) ); + assert( pPager->tempFile || pPager->eState==PAGER_WRITER_DBMOD ); + assert( pPager->eLock==EXCLUSIVE_LOCK ); + assert( isOpen(pPager->fd) || pList->pDirty==0 ); + + /* If the file is a temp-file has not yet been opened, open it now. It + ** is not possible for rc to be other than SQLITE_OK if this branch + ** is taken, as pager_wait_on_lock() is a no-op for temp-files. + */ + if( !isOpen(pPager->fd) ){ + assert( pPager->tempFile && rc==SQLITE_OK ); + rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags); + } + + /* Before the first write, give the VFS a hint of what the final + ** file size will be. + */ + assert( rc!=SQLITE_OK || isOpen(pPager->fd) ); + if( rc==SQLITE_OK + && pPager->dbHintSizedbSize + && (pList->pDirty || pList->pgno>pPager->dbHintSize) + ){ + sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize; + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile); + pPager->dbHintSize = pPager->dbSize; + } + + while( rc==SQLITE_OK && pList ){ + Pgno pgno = pList->pgno; + + /* If there are dirty pages in the page cache with page numbers greater + ** than Pager.dbSize, this means sqlite3PagerTruncateImage() was called to + ** make the file smaller (presumably by auto-vacuum code). Do not write + ** any such pages to the file. + ** + ** Also, do not write out any page that has the PGHDR_DONT_WRITE flag + ** set (set by sqlite3PagerDontWrite()). + */ + if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){ + i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */ + char *pData; /* Data to write */ + + assert( (pList->flags&PGHDR_NEED_SYNC)==0 ); + if( pList->pgno==1 ) pager_write_changecounter(pList); + + pData = pList->pData; + + /* Write out the page data. */ + rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset); + + /* If page 1 was just written, update Pager.dbFileVers to match + ** the value now stored in the database file. If writing this + ** page caused the database file to grow, update dbFileSize. + */ + if( pgno==1 ){ + memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers)); + } + if( pgno>pPager->dbFileSize ){ + pPager->dbFileSize = pgno; + } + pPager->aStat[PAGER_STAT_WRITE]++; + + /* Update any backup objects copying the contents of this pager. */ + sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)pList->pData); + + PAGERTRACE(("STORE %d page %d hash(%08x)\n", + PAGERID(pPager), pgno, pager_pagehash(pList))); + IOTRACE(("PGOUT %p %d\n", pPager, pgno)); + PAGER_INCR(sqlite3_pager_writedb_count); + }else{ + PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno)); + } + pager_set_pagehash(pList); + pList = pList->pDirty; + } + + return rc; +} + +/* +** Ensure that the sub-journal file is open. If it is already open, this +** function is a no-op. +** +** SQLITE_OK is returned if everything goes according to plan. An +** SQLITE_IOERR_XXX error code is returned if a call to sqlite3OsOpen() +** fails. +*/ +static int openSubJournal(Pager *pPager){ + int rc = SQLITE_OK; + if( !isOpen(pPager->sjfd) ){ + const int flags = SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_READWRITE + | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE + | SQLITE_OPEN_DELETEONCLOSE; + int nStmtSpill = sqlite3Config.nStmtSpill; + if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){ + nStmtSpill = -1; + } + rc = sqlite3JournalOpen(pPager->pVfs, 0, pPager->sjfd, flags, nStmtSpill); + } + return rc; +} + +/* +** Append a record of the current state of page pPg to the sub-journal. +** +** If successful, set the bit corresponding to pPg->pgno in the bitvecs +** for all open savepoints before returning. +** +** This function returns SQLITE_OK if everything is successful, an IO +** error code if the attempt to write to the sub-journal fails, or +** SQLITE_NOMEM if a malloc fails while setting a bit in a savepoint +** bitvec. +*/ +static int subjournalPage(PgHdr *pPg){ + int rc = SQLITE_OK; + Pager *pPager = pPg->pPager; + if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ + + /* Open the sub-journal, if it has not already been opened */ + assert( pPager->useJournal ); + assert( isOpen(pPager->jfd) || pagerUseWal(pPager) ); + assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 ); + assert( pagerUseWal(pPager) + || pageInJournal(pPager, pPg) + || pPg->pgno>pPager->dbOrigSize + ); + rc = openSubJournal(pPager); + + /* If the sub-journal was opened successfully (or was already open), + ** write the journal record into the file. */ + if( rc==SQLITE_OK ){ + void *pData = pPg->pData; + i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); + char *pData2; + pData2 = pData; + PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); + rc = write32bits(pPager->sjfd, offset, pPg->pgno); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); + } + } + } + if( rc==SQLITE_OK ){ + pPager->nSubRec++; + assert( pPager->nSavepoint>0 ); + rc = addToSavepointBitvecs(pPager, pPg->pgno); + } + return rc; +} +static int subjournalPageIfRequired(PgHdr *pPg){ + if( subjRequiresPage(pPg) ){ + return subjournalPage(pPg); + }else{ + return SQLITE_OK; + } +} + +/* +** This function is called by the pcache layer when it has reached some +** soft memory limit. The first argument is a pointer to a Pager object +** (cast as a void*). The pager is always 'purgeable' (not an in-memory +** database). The second argument is a reference to a page that is +** currently dirty but has no outstanding references. The page +** is always associated with the Pager object passed as the first +** argument. +** +** The job of this function is to make pPg clean by writing its contents +** out to the database file, if possible. This may involve syncing the +** journal file. +** +** If successful, sqlite3PcacheMakeClean() is called on the page and +** SQLITE_OK returned. If an IO error occurs while trying to make the +** page clean, the IO error code is returned. If the page cannot be +** made clean for some other reason, but no error occurs, then SQLITE_OK +** is returned by sqlite3PcacheMakeClean() is not called. +*/ +static int pagerStress(void *p, PgHdr *pPg){ + Pager *pPager = (Pager *)p; + int rc = SQLITE_OK; + + assert( pPg->pPager==pPager ); + assert( pPg->flags&PGHDR_DIRTY ); + + /* The doNotSpill NOSYNC bit is set during times when doing a sync of + ** journal (and adding a new header) is not allowed. This occurs + ** during calls to sqlite3PagerWrite() while trying to journal multiple + ** pages belonging to the same sector. + ** + ** The doNotSpill ROLLBACK and OFF bits inhibits all cache spilling + ** regardless of whether or not a sync is required. This is set during + ** a rollback or by user request, respectively. + ** + ** Spilling is also prohibited when in an error state since that could + ** lead to database corruption. In the current implementation it + ** is impossible for sqlite3PcacheFetch() to be called with createFlag==3 + ** while in the error state, hence it is impossible for this routine to + ** be called in the error state. Nevertheless, we include a NEVER() + ** test for the error state as a safeguard against future changes. + */ + if( NEVER(pPager->errCode) ) return SQLITE_OK; + testcase( pPager->doNotSpill & SPILLFLAG_ROLLBACK ); + testcase( pPager->doNotSpill & SPILLFLAG_OFF ); + testcase( pPager->doNotSpill & SPILLFLAG_NOSYNC ); + if( pPager->doNotSpill + && ((pPager->doNotSpill & (SPILLFLAG_ROLLBACK|SPILLFLAG_OFF))!=0 + || (pPg->flags & PGHDR_NEED_SYNC)!=0) + ){ + return SQLITE_OK; + } + + pPager->aStat[PAGER_STAT_SPILL]++; + pPg->pDirty = 0; + if( pagerUseWal(pPager) ){ + /* Write a single frame for this page to the log. */ + rc = subjournalPageIfRequired(pPg); + if( rc==SQLITE_OK ){ + rc = pagerWalFrames(pPager, pPg, 0, 0); + } + }else{ + +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( pPager->tempFile==0 ){ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc!=SQLITE_OK ) return pager_error(pPager, rc); + } +#endif + + /* Sync the journal file if required. */ + if( pPg->flags&PGHDR_NEED_SYNC + || pPager->eState==PAGER_WRITER_CACHEMOD + ){ + rc = syncJournal(pPager, 1); + } + + /* Write the contents of the page out to the database file. */ + if( rc==SQLITE_OK ){ + assert( (pPg->flags&PGHDR_NEED_SYNC)==0 ); + rc = pager_write_pagelist(pPager, pPg); + } + } + + /* Mark the page as clean. */ + if( rc==SQLITE_OK ){ + PAGERTRACE(("STRESS %d page %d\n", PAGERID(pPager), pPg->pgno)); + sqlite3PcacheMakeClean(pPg); + } + + return pager_error(pPager, rc); +} + +/* +** Flush all unreferenced dirty pages to disk. +*/ +SQLITE_PRIVATE int sqlite3PagerFlush(Pager *pPager){ + int rc = pPager->errCode; + if( !MEMDB ){ + PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); + assert( assert_pager_state(pPager) ); + while( rc==SQLITE_OK && pList ){ + PgHdr *pNext = pList->pDirty; + if( pList->nRef==0 ){ + rc = pagerStress((void*)pPager, pList); + } + pList = pNext; + } + } + + return rc; +} + +/* +** Allocate and initialize a new Pager object and put a pointer to it +** in *ppPager. The pager should eventually be freed by passing it +** to sqlite3PagerClose(). +** +** The zFilename argument is the path to the database file to open. +** If zFilename is NULL then a randomly-named temporary file is created +** and used as the file to be cached. Temporary files are be deleted +** automatically when they are closed. If zFilename is ":memory:" then +** all information is held in cache. It is never written to disk. +** This can be used to implement an in-memory database. +** +** The nExtra parameter specifies the number of bytes of space allocated +** along with each page reference. This space is available to the user +** via the sqlite3PagerGetExtra() API. When a new page is allocated, the +** first 8 bytes of this space are zeroed but the remainder is uninitialized. +** (The extra space is used by btree as the MemPage object.) +** +** The flags argument is used to specify properties that affect the +** operation of the pager. It should be passed some bitwise combination +** of the PAGER_* flags. +** +** The vfsFlags parameter is a bitmask to pass to the flags parameter +** of the xOpen() method of the supplied VFS when opening files. +** +** If the pager object is allocated and the specified file opened +** successfully, SQLITE_OK is returned and *ppPager set to point to +** the new pager object. If an error occurs, *ppPager is set to NULL +** and error code returned. This function may return SQLITE_NOMEM +** (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or +** various SQLITE_IO_XXX errors. +*/ +SQLITE_PRIVATE int sqlite3PagerOpen( + sqlite3_vfs *pVfs, /* The virtual file system to use */ + Pager **ppPager, /* OUT: Return the Pager structure here */ + const char *zFilename, /* Name of the database file to open */ + int nExtra, /* Extra bytes append to each in-memory page */ + int flags, /* flags controlling this file */ + int vfsFlags, /* flags passed through to sqlite3_vfs.xOpen() */ + void (*xReinit)(DbPage*) /* Function to reinitialize pages */ +){ + u8 *pPtr; + Pager *pPager = 0; /* Pager object to allocate and return */ + int rc = SQLITE_OK; /* Return code */ + int tempFile = 0; /* True for temp files (incl. in-memory files) */ + int memDb = 0; /* True if this is an in-memory file */ +#ifdef SQLITE_ENABLE_DESERIALIZE + int memJM = 0; /* Memory journal mode */ +#else +# define memJM 0 +#endif + int readOnly = 0; /* True if this is a read-only file */ + int journalFileSize; /* Bytes to allocate for each journal fd */ + char *zPathname = 0; /* Full path to database file */ + int nPathname = 0; /* Number of bytes in zPathname */ + int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; /* False to omit journal */ + int pcacheSize = sqlite3PcacheSize(); /* Bytes to allocate for PCache */ + u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */ + const char *zUri = 0; /* URI args to copy */ + int nUriByte = 1; /* Number of bytes of URI args at *zUri */ + int nUri = 0; /* Number of URI parameters */ + + /* Figure out how much space is required for each journal file-handle + ** (there are two of them, the main journal and the sub-journal). */ + journalFileSize = ROUND8(sqlite3JournalSize(pVfs)); + + /* Set the output variable to NULL in case an error occurs. */ + *ppPager = 0; + +#ifndef SQLITE_OMIT_MEMORYDB + if( flags & PAGER_MEMORY ){ + memDb = 1; + if( zFilename && zFilename[0] ){ + zPathname = sqlite3DbStrDup(0, zFilename); + if( zPathname==0 ) return SQLITE_NOMEM_BKPT; + nPathname = sqlite3Strlen30(zPathname); + zFilename = 0; + } + } +#endif + + /* Compute and store the full pathname in an allocated buffer pointed + ** to by zPathname, length nPathname. Or, if this is a temporary file, + ** leave both nPathname and zPathname set to 0. + */ + if( zFilename && zFilename[0] ){ + const char *z; + nPathname = pVfs->mxPathname+1; + zPathname = sqlite3DbMallocRaw(0, nPathname*2); + if( zPathname==0 ){ + return SQLITE_NOMEM_BKPT; + } + zPathname[0] = 0; /* Make sure initialized even if FullPathname() fails */ + rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_OK_SYMLINK ){ + if( vfsFlags & SQLITE_OPEN_NOFOLLOW ){ + rc = SQLITE_CANTOPEN_SYMLINK; + }else{ + rc = SQLITE_OK; + } + } + } + nPathname = sqlite3Strlen30(zPathname); + z = zUri = &zFilename[sqlite3Strlen30(zFilename)+1]; + while( *z ){ + z += strlen(z)+1; + z += strlen(z)+1; + nUri++; + } + nUriByte = (int)(&z[1] - zUri); + assert( nUriByte>=1 ); + if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){ + /* This branch is taken when the journal path required by + ** the database being opened will be more than pVfs->mxPathname + ** bytes in length. This means the database cannot be opened, + ** as it will not be possible to open the journal file or even + ** check for a hot-journal before reading. + */ + rc = SQLITE_CANTOPEN_BKPT; + } + if( rc!=SQLITE_OK ){ + sqlite3DbFree(0, zPathname); + return rc; + } + } + + /* Allocate memory for the Pager structure, PCache object, the + ** three file descriptors, the database file name and the journal + ** file name. The layout in memory is as follows: + ** + ** Pager object (sizeof(Pager) bytes) + ** PCache object (sqlite3PcacheSize() bytes) + ** Database file handle (pVfs->szOsFile bytes) + ** Sub-journal file handle (journalFileSize bytes) + ** Main journal file handle (journalFileSize bytes) + ** Ptr back to the Pager (sizeof(Pager*) bytes) + ** \0\0\0\0 database prefix (4 bytes) + ** Database file name (nPathname+1 bytes) + ** URI query parameters (nUriByte bytes) + ** Journal filename (nPathname+8+1 bytes) + ** WAL filename (nPathname+4+1 bytes) + ** \0\0\0 terminator (3 bytes) + ** + ** Some 3rd-party software, over which we have no control, depends on + ** the specific order of the filenames and the \0 separators between them + ** so that it can (for example) find the database filename given the WAL + ** filename without using the sqlite3_filename_database() API. This is a + ** misuse of SQLite and a bug in the 3rd-party software, but the 3rd-party + ** software is in widespread use, so we try to avoid changing the filename + ** order and formatting if possible. In particular, the details of the + ** filename format expected by 3rd-party software should be as follows: + ** + ** - Main Database Path + ** - \0 + ** - Multiple URI components consisting of: + ** - Key + ** - \0 + ** - Value + ** - \0 + ** - \0 + ** - Journal Path + ** - \0 + ** - WAL Path (zWALName) + ** - \0 + ** + ** The sqlite3_create_filename() interface and the databaseFilename() utility + ** that is used by sqlite3_filename_database() and kin also depend on the + ** specific formatting and order of the various filenames, so if the format + ** changes here, be sure to change it there as well. + */ + pPtr = (u8 *)sqlite3MallocZero( + ROUND8(sizeof(*pPager)) + /* Pager structure */ + ROUND8(pcacheSize) + /* PCache object */ + ROUND8(pVfs->szOsFile) + /* The main db file */ + journalFileSize * 2 + /* The two journal files */ + sizeof(pPager) + /* Space to hold a pointer */ + 4 + /* Database prefix */ + nPathname + 1 + /* database filename */ + nUriByte + /* query parameters */ + nPathname + 8 + 1 + /* Journal filename */ +#ifndef SQLITE_OMIT_WAL + nPathname + 4 + 1 + /* WAL filename */ +#endif + 3 /* Terminator */ + ); + assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); + if( !pPtr ){ + sqlite3DbFree(0, zPathname); + return SQLITE_NOMEM_BKPT; + } + pPager = (Pager*)pPtr; pPtr += ROUND8(sizeof(*pPager)); + pPager->pPCache = (PCache*)pPtr; pPtr += ROUND8(pcacheSize); + pPager->fd = (sqlite3_file*)pPtr; pPtr += ROUND8(pVfs->szOsFile); + pPager->sjfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; + pPager->jfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; + assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); + memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); + + /* Fill in the Pager.zFilename and pPager.zQueryParam fields */ + pPtr += 4; /* Skip zero prefix */ + pPager->zFilename = (char*)pPtr; + if( nPathname>0 ){ + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname + 1; + if( zUri ){ + memcpy(pPtr, zUri, nUriByte); pPtr += nUriByte; + }else{ + pPtr++; + } + } + + + /* Fill in Pager.zJournal */ + if( nPathname>0 ){ + pPager->zJournal = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname; + memcpy(pPtr, "-journal",8); pPtr += 8 + 1; +#ifdef SQLITE_ENABLE_8_3_NAMES + sqlite3FileSuffix3(zFilename,pPager->zJournal); + pPtr = (u8*)(pPager->zJournal + sqlite3Strlen30(pPager->zJournal)+1); +#endif + }else{ + pPager->zJournal = 0; + } + +#ifndef SQLITE_OMIT_WAL + /* Fill in Pager.zWal */ + if( nPathname>0 ){ + pPager->zWal = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname; + memcpy(pPtr, "-wal", 4); pPtr += 4 + 1; +#ifdef SQLITE_ENABLE_8_3_NAMES + sqlite3FileSuffix3(zFilename, pPager->zWal); + pPtr = (u8*)(pPager->zWal + sqlite3Strlen30(pPager->zWal)+1); +#endif + }else{ + pPager->zWal = 0; + } +#endif + + if( nPathname ) sqlite3DbFree(0, zPathname); + pPager->pVfs = pVfs; + pPager->vfsFlags = vfsFlags; + + /* Open the pager file. + */ + if( zFilename && zFilename[0] ){ + int fout = 0; /* VFS flags returned by xOpen() */ + rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); + assert( !memDb ); +#ifdef SQLITE_ENABLE_DESERIALIZE + memJM = (fout&SQLITE_OPEN_MEMORY)!=0; +#endif + readOnly = (fout&SQLITE_OPEN_READONLY)!=0; + + /* If the file was successfully opened for read/write access, + ** choose a default page size in case we have to create the + ** database file. The default page size is the maximum of: + ** + ** + SQLITE_DEFAULT_PAGE_SIZE, + ** + The value returned by sqlite3OsSectorSize() + ** + The largest page size that can be written atomically. + */ + if( rc==SQLITE_OK ){ + int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); + if( !readOnly ){ + setSectorSize(pPager); + assert(SQLITE_DEFAULT_PAGE_SIZE<=SQLITE_MAX_DEFAULT_PAGE_SIZE); + if( szPageDfltsectorSize ){ + if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){ + szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE; + }else{ + szPageDflt = (u32)pPager->sectorSize; + } + } +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + { + int ii; + assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); + assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); + assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536); + for(ii=szPageDflt; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){ + if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ){ + szPageDflt = ii; + } + } + } +#endif + } + pPager->noLock = sqlite3_uri_boolean(pPager->zFilename, "nolock", 0); + if( (iDc & SQLITE_IOCAP_IMMUTABLE)!=0 + || sqlite3_uri_boolean(pPager->zFilename, "immutable", 0) ){ + vfsFlags |= SQLITE_OPEN_READONLY; + goto act_like_temp_file; + } + } + }else{ + /* If a temporary file is requested, it is not opened immediately. + ** In this case we accept the default page size and delay actually + ** opening the file until the first call to OsWrite(). + ** + ** This branch is also run for an in-memory database. An in-memory + ** database is the same as a temp-file that is never written out to + ** disk and uses an in-memory rollback journal. + ** + ** This branch also runs for files marked as immutable. + */ +act_like_temp_file: + tempFile = 1; + pPager->eState = PAGER_READER; /* Pretend we already have a lock */ + pPager->eLock = EXCLUSIVE_LOCK; /* Pretend we are in EXCLUSIVE mode */ + pPager->noLock = 1; /* Do no locking */ + readOnly = (vfsFlags&SQLITE_OPEN_READONLY); + } + + /* The following call to PagerSetPagesize() serves to set the value of + ** Pager.pageSize and to allocate the Pager.pTmpSpace buffer. + */ + if( rc==SQLITE_OK ){ + assert( pPager->memDb==0 ); + rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1); + testcase( rc!=SQLITE_OK ); + } + + /* Initialize the PCache object. */ + if( rc==SQLITE_OK ){ + nExtra = ROUND8(nExtra); + assert( nExtra>=8 && nExtra<1000 ); + rc = sqlite3PcacheOpen(szPageDflt, nExtra, !memDb, + !memDb?pagerStress:0, (void *)pPager, pPager->pPCache); + } + + /* If an error occurred above, free the Pager structure and close the file. + */ + if( rc!=SQLITE_OK ){ + sqlite3OsClose(pPager->fd); + sqlite3PageFree(pPager->pTmpSpace); + sqlite3_free(pPager); + return rc; + } + + PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename)); + IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename)) + + pPager->useJournal = (u8)useJournal; + /* pPager->stmtOpen = 0; */ + /* pPager->stmtInUse = 0; */ + /* pPager->nRef = 0; */ + /* pPager->stmtSize = 0; */ + /* pPager->stmtJSize = 0; */ + /* pPager->nPage = 0; */ + pPager->mxPgno = SQLITE_MAX_PAGE_COUNT; + /* pPager->state = PAGER_UNLOCK; */ + /* pPager->errMask = 0; */ + pPager->tempFile = (u8)tempFile; + assert( tempFile==PAGER_LOCKINGMODE_NORMAL + || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE ); + assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 ); + pPager->exclusiveMode = (u8)tempFile; + pPager->changeCountDone = pPager->tempFile; + pPager->memDb = (u8)memDb; + pPager->readOnly = (u8)readOnly; + assert( useJournal || pPager->tempFile ); + pPager->noSync = pPager->tempFile; + if( pPager->noSync ){ + assert( pPager->fullSync==0 ); + assert( pPager->extraSync==0 ); + assert( pPager->syncFlags==0 ); + assert( pPager->walSyncFlags==0 ); + }else{ + pPager->fullSync = 1; + pPager->extraSync = 0; + pPager->syncFlags = SQLITE_SYNC_NORMAL; + pPager->walSyncFlags = SQLITE_SYNC_NORMAL | (SQLITE_SYNC_NORMAL<<2); + } + /* pPager->pFirst = 0; */ + /* pPager->pFirstSynced = 0; */ + /* pPager->pLast = 0; */ + pPager->nExtra = (u16)nExtra; + pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT; + assert( isOpen(pPager->fd) || tempFile ); + setSectorSize(pPager); + if( !useJournal ){ + pPager->journalMode = PAGER_JOURNALMODE_OFF; + }else if( memDb || memJM ){ + pPager->journalMode = PAGER_JOURNALMODE_MEMORY; + } + /* pPager->xBusyHandler = 0; */ + /* pPager->pBusyHandlerArg = 0; */ + pPager->xReiniter = xReinit; + setGetterMethod(pPager); + /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ + /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */ + + *ppPager = pPager; + return SQLITE_OK; +} + +/* +** Return the sqlite3_file for the main database given the name +** of the corresonding WAL or Journal name as passed into +** xOpen. +*/ +SQLITE_API sqlite3_file *sqlite3_database_file_object(const char *zName){ + Pager *pPager; + while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){ + zName--; + } + pPager = *(Pager**)(zName - 4 - sizeof(Pager*)); + return pPager->fd; +} + + +/* +** This function is called after transitioning from PAGER_UNLOCK to +** PAGER_SHARED state. It tests if there is a hot journal present in +** the file-system for the given pager. A hot journal is one that +** needs to be played back. According to this function, a hot-journal +** file exists if the following criteria are met: +** +** * The journal file exists in the file system, and +** * No process holds a RESERVED or greater lock on the database file, and +** * The database file itself is greater than 0 bytes in size, and +** * The first byte of the journal file exists and is not 0x00. +** +** If the current size of the database file is 0 but a journal file +** exists, that is probably an old journal left over from a prior +** database with the same name. In this case the journal file is +** just deleted using OsDelete, *pExists is set to 0 and SQLITE_OK +** is returned. +** +** This routine does not check if there is a master journal filename +** at the end of the file. If there is, and that master journal file +** does not exist, then the journal file is not really hot. In this +** case this routine will return a false-positive. The pager_playback() +** routine will discover that the journal file is not really hot and +** will not roll it back. +** +** If a hot-journal file is found to exist, *pExists is set to 1 and +** SQLITE_OK returned. If no hot-journal file is present, *pExists is +** set to 0 and SQLITE_OK returned. If an IO error occurs while trying +** to determine whether or not a hot-journal file exists, the IO error +** code is returned and the value of *pExists is undefined. +*/ +static int hasHotJournal(Pager *pPager, int *pExists){ + sqlite3_vfs * const pVfs = pPager->pVfs; + int rc = SQLITE_OK; /* Return code */ + int exists = 1; /* True if a journal file is present */ + int jrnlOpen = !!isOpen(pPager->jfd); + + assert( pPager->useJournal ); + assert( isOpen(pPager->fd) ); + assert( pPager->eState==PAGER_OPEN ); + + assert( jrnlOpen==0 || ( sqlite3OsDeviceCharacteristics(pPager->jfd) & + SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN + )); + + *pExists = 0; + if( !jrnlOpen ){ + rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists); + } + if( rc==SQLITE_OK && exists ){ + int locked = 0; /* True if some process holds a RESERVED lock */ + + /* Race condition here: Another process might have been holding the + ** the RESERVED lock and have a journal open at the sqlite3OsAccess() + ** call above, but then delete the journal and drop the lock before + ** we get to the following sqlite3OsCheckReservedLock() call. If that + ** is the case, this routine might think there is a hot journal when + ** in fact there is none. This results in a false-positive which will + ** be dealt with by the playback routine. Ticket #3883. + */ + rc = sqlite3OsCheckReservedLock(pPager->fd, &locked); + if( rc==SQLITE_OK && !locked ){ + Pgno nPage; /* Number of pages in database file */ + + assert( pPager->tempFile==0 ); + rc = pagerPagecount(pPager, &nPage); + if( rc==SQLITE_OK ){ + /* If the database is zero pages in size, that means that either (1) the + ** journal is a remnant from a prior database with the same name where + ** the database file but not the journal was deleted, or (2) the initial + ** transaction that populates a new database is being rolled back. + ** In either case, the journal file can be deleted. However, take care + ** not to delete the journal file if it is already open due to + ** journal_mode=PERSIST. + */ + if( nPage==0 && !jrnlOpen ){ + sqlite3BeginBenignMalloc(); + if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){ + sqlite3OsDelete(pVfs, pPager->zJournal, 0); + if( !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); + } + sqlite3EndBenignMalloc(); + }else{ + /* The journal file exists and no other connection has a reserved + ** or greater lock on the database file. Now check that there is + ** at least one non-zero bytes at the start of the journal file. + ** If there is, then we consider this journal to be hot. If not, + ** it can be ignored. + */ + if( !jrnlOpen ){ + int f = SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL; + rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f); + } + if( rc==SQLITE_OK ){ + u8 first = 0; + rc = sqlite3OsRead(pPager->jfd, (void *)&first, 1, 0); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } + if( !jrnlOpen ){ + sqlite3OsClose(pPager->jfd); + } + *pExists = (first!=0); + }else if( rc==SQLITE_CANTOPEN ){ + /* If we cannot open the rollback journal file in order to see if + ** it has a zero header, that might be due to an I/O error, or + ** it might be due to the race condition described above and in + ** ticket #3883. Either way, assume that the journal is hot. + ** This might be a false positive. But if it is, then the + ** automatic journal playback and recovery mechanism will deal + ** with it under an EXCLUSIVE lock where we do not need to + ** worry so much with race conditions. + */ + *pExists = 1; + rc = SQLITE_OK; + } + } + } + } + } + + return rc; +} + +/* +** This function is called to obtain a shared lock on the database file. +** It is illegal to call sqlite3PagerGet() until after this function +** has been successfully called. If a shared-lock is already held when +** this function is called, it is a no-op. +** +** The following operations are also performed by this function. +** +** 1) If the pager is currently in PAGER_OPEN state (no lock held +** on the database file), then an attempt is made to obtain a +** SHARED lock on the database file. Immediately after obtaining +** the SHARED lock, the file-system is checked for a hot-journal, +** which is played back if present. Following any hot-journal +** rollback, the contents of the cache are validated by checking +** the 'change-counter' field of the database file header and +** discarded if they are found to be invalid. +** +** 2) If the pager is running in exclusive-mode, and there are currently +** no outstanding references to any pages, and is in the error state, +** then an attempt is made to clear the error state by discarding +** the contents of the page cache and rolling back any open journal +** file. +** +** If everything is successful, SQLITE_OK is returned. If an IO error +** occurs while locking the database, checking for a hot-journal file or +** rolling back a journal file, the IO error code is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + + /* This routine is only called from b-tree and only when there are no + ** outstanding pages. This implies that the pager state should either + ** be OPEN or READER. READER is only possible if the pager is or was in + ** exclusive access mode. */ + assert( sqlite3PcacheRefCount(pPager->pPCache)==0 ); + assert( assert_pager_state(pPager) ); + assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); + assert( pPager->errCode==SQLITE_OK ); + + if( !pagerUseWal(pPager) && pPager->eState==PAGER_OPEN ){ + int bHotJournal = 1; /* True if there exists a hot journal-file */ + + assert( !MEMDB ); + assert( pPager->tempFile==0 || pPager->eLock==EXCLUSIVE_LOCK ); + + rc = pager_wait_on_lock(pPager, SHARED_LOCK); + if( rc!=SQLITE_OK ){ + assert( pPager->eLock==NO_LOCK || pPager->eLock==UNKNOWN_LOCK ); + goto failed; + } + + /* If a journal file exists, and there is no RESERVED lock on the + ** database file, then it either needs to be played back or deleted. + */ + if( pPager->eLock<=SHARED_LOCK ){ + rc = hasHotJournal(pPager, &bHotJournal); + } + if( rc!=SQLITE_OK ){ + goto failed; + } + if( bHotJournal ){ + if( pPager->readOnly ){ + rc = SQLITE_READONLY_ROLLBACK; + goto failed; + } + + /* Get an EXCLUSIVE lock on the database file. At this point it is + ** important that a RESERVED lock is not obtained on the way to the + ** EXCLUSIVE lock. If it were, another process might open the + ** database file, detect the RESERVED lock, and conclude that the + ** database is safe to read while this process is still rolling the + ** hot-journal back. + ** + ** Because the intermediate RESERVED lock is not requested, any + ** other process attempting to access the database file will get to + ** this point in the code and fail to obtain its own EXCLUSIVE lock + ** on the database file. + ** + ** Unless the pager is in locking_mode=exclusive mode, the lock is + ** downgraded to SHARED_LOCK before this function returns. + */ + rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + goto failed; + } + + /* If it is not already open and the file exists on disk, open the + ** journal for read/write access. Write access is required because + ** in exclusive-access mode the file descriptor will be kept open + ** and possibly used for a transaction later on. Also, write-access + ** is usually required to finalize the journal in journal_mode=persist + ** mode (and also for journal_mode=truncate on some systems). + ** + ** If the journal does not exist, it usually means that some + ** other connection managed to get in and roll it back before + ** this connection obtained the exclusive lock above. Or, it + ** may mean that the pager was in the error-state when this + ** function was called and the journal file does not exist. + */ + if( !isOpen(pPager->jfd) ){ + sqlite3_vfs * const pVfs = pPager->pVfs; + int bExists; /* True if journal file exists */ + rc = sqlite3OsAccess( + pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &bExists); + if( rc==SQLITE_OK && bExists ){ + int fout = 0; + int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL; + assert( !pPager->tempFile ); + rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout); + assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); + if( rc==SQLITE_OK && fout&SQLITE_OPEN_READONLY ){ + rc = SQLITE_CANTOPEN_BKPT; + sqlite3OsClose(pPager->jfd); + } + } + } + + /* Playback and delete the journal. Drop the database write + ** lock and reacquire the read lock. Purge the cache before + ** playing back the hot-journal so that we don't end up with + ** an inconsistent cache. Sync the hot journal before playing + ** it back since the process that crashed and left the hot journal + ** probably did not sync it and we are required to always sync + ** the journal before playing it back. + */ + if( isOpen(pPager->jfd) ){ + assert( rc==SQLITE_OK ); + rc = pagerSyncHotJournal(pPager); + if( rc==SQLITE_OK ){ + rc = pager_playback(pPager, !pPager->tempFile); + pPager->eState = PAGER_OPEN; + } + }else if( !pPager->exclusiveMode ){ + pagerUnlockDb(pPager, SHARED_LOCK); + } + + if( rc!=SQLITE_OK ){ + /* This branch is taken if an error occurs while trying to open + ** or roll back a hot-journal while holding an EXCLUSIVE lock. The + ** pager_unlock() routine will be called before returning to unlock + ** the file. If the unlock attempt fails, then Pager.eLock must be + ** set to UNKNOWN_LOCK (see the comment above the #define for + ** UNKNOWN_LOCK above for an explanation). + ** + ** In order to get pager_unlock() to do this, set Pager.eState to + ** PAGER_ERROR now. This is not actually counted as a transition + ** to ERROR state in the state diagram at the top of this file, + ** since we know that the same call to pager_unlock() will very + ** shortly transition the pager object to the OPEN state. Calling + ** assert_pager_state() would fail now, as it should not be possible + ** to be in ERROR state when there are zero outstanding page + ** references. + */ + pager_error(pPager, rc); + goto failed; + } + + assert( pPager->eState==PAGER_OPEN ); + assert( (pPager->eLock==SHARED_LOCK) + || (pPager->exclusiveMode && pPager->eLock>SHARED_LOCK) + ); + } + + if( !pPager->tempFile && pPager->hasHeldSharedLock ){ + /* The shared-lock has just been acquired then check to + ** see if the database has been modified. If the database has changed, + ** flush the cache. The hasHeldSharedLock flag prevents this from + ** occurring on the very first access to a file, in order to save a + ** single unnecessary sqlite3OsRead() call at the start-up. + ** + ** Database changes are detected by looking at 15 bytes beginning + ** at offset 24 into the file. The first 4 of these 16 bytes are + ** a 32-bit counter that is incremented with each change. The + ** other bytes change randomly with each file change when + ** a codec is in use. + ** + ** There is a vanishingly small chance that a change will not be + ** detected. The chance of an undetected change is so small that + ** it can be neglected. + */ + char dbFileVers[sizeof(pPager->dbFileVers)]; + + IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers))); + rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24); + if( rc!=SQLITE_OK ){ + if( rc!=SQLITE_IOERR_SHORT_READ ){ + goto failed; + } + memset(dbFileVers, 0, sizeof(dbFileVers)); + } + + if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){ + pager_reset(pPager); + + /* Unmap the database file. It is possible that external processes + ** may have truncated the database file and then extended it back + ** to its original size while this process was not holding a lock. + ** In this case there may exist a Pager.pMap mapping that appears + ** to be the right size but is not actually valid. Avoid this + ** possibility by unmapping the db here. */ + if( USEFETCH(pPager) ){ + sqlite3OsUnfetch(pPager->fd, 0, 0); + } + } + } + + /* If there is a WAL file in the file-system, open this database in WAL + ** mode. Otherwise, the following function call is a no-op. + */ + rc = pagerOpenWalIfPresent(pPager); +#ifndef SQLITE_OMIT_WAL + assert( pPager->pWal==0 || rc==SQLITE_OK ); +#endif + } + + if( pagerUseWal(pPager) ){ + assert( rc==SQLITE_OK ); + rc = pagerBeginReadTransaction(pPager); + } + + if( pPager->tempFile==0 && pPager->eState==PAGER_OPEN && rc==SQLITE_OK ){ + rc = pagerPagecount(pPager, &pPager->dbSize); + } + + failed: + if( rc!=SQLITE_OK ){ + assert( !MEMDB ); + pager_unlock(pPager); + assert( pPager->eState==PAGER_OPEN ); + }else{ + pPager->eState = PAGER_READER; + pPager->hasHeldSharedLock = 1; + } + return rc; +} + +/* +** If the reference count has reached zero, rollback any active +** transaction and unlock the pager. +** +** Except, in locking_mode=EXCLUSIVE when there is nothing to in +** the rollback journal, the unlock is not performed and there is +** nothing to rollback, so this routine is a no-op. +*/ +static void pagerUnlockIfUnused(Pager *pPager){ + if( sqlite3PcacheRefCount(pPager->pPCache)==0 ){ + assert( pPager->nMmapOut==0 ); /* because page1 is never memory mapped */ + pagerUnlockAndRollback(pPager); + } +} + +/* +** The page getter methods each try to acquire a reference to a +** page with page number pgno. If the requested reference is +** successfully obtained, it is copied to *ppPage and SQLITE_OK returned. +** +** There are different implementations of the getter method depending +** on the current state of the pager. +** +** getPageNormal() -- The normal getter +** getPageError() -- Used if the pager is in an error state +** getPageMmap() -- Used if memory-mapped I/O is enabled +** +** If the requested page is already in the cache, it is returned. +** Otherwise, a new page object is allocated and populated with data +** read from the database file. In some cases, the pcache module may +** choose not to allocate a new page object and may reuse an existing +** object with no outstanding references. +** +** The extra data appended to a page is always initialized to zeros the +** first time a page is loaded into memory. If the page requested is +** already in the cache when this function is called, then the extra +** data is left as it was when the page object was last used. +** +** If the database image is smaller than the requested page or if +** the flags parameter contains the PAGER_GET_NOCONTENT bit and the +** requested page is not already stored in the cache, then no +** actual disk read occurs. In this case the memory image of the +** page is initialized to all zeros. +** +** If PAGER_GET_NOCONTENT is true, it means that we do not care about +** the contents of the page. This occurs in two scenarios: +** +** a) When reading a free-list leaf page from the database, and +** +** b) When a savepoint is being rolled back and we need to load +** a new page into the cache to be filled with the data read +** from the savepoint journal. +** +** If PAGER_GET_NOCONTENT is true, then the data returned is zeroed instead +** of being read from the database. Additionally, the bits corresponding +** to pgno in Pager.pInJournal (bitvec of pages already written to the +** journal file) and the PagerSavepoint.pInSavepoint bitvecs of any open +** savepoints are set. This means if the page is made writable at any +** point in the future, using a call to sqlite3PagerWrite(), its contents +** will not be journaled. This saves IO. +** +** The acquisition might fail for several reasons. In all cases, +** an appropriate error code is returned and *ppPage is set to NULL. +** +** See also sqlite3PagerLookup(). Both this routine and Lookup() attempt +** to find a page in the in-memory cache first. If the page is not already +** in memory, this routine goes to disk to read it in whereas Lookup() +** just returns 0. This routine acquires a read-lock the first time it +** has to go to disk, and could also playback an old journal if necessary. +** Since Lookup() never goes to disk, it never has to deal with locks +** or journal files. +*/ +static int getPageNormal( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + int rc = SQLITE_OK; + PgHdr *pPg; + u8 noContent; /* True if PAGER_GET_NOCONTENT is set */ + sqlite3_pcache_page *pBase; + + assert( pPager->errCode==SQLITE_OK ); + assert( pPager->eState>=PAGER_READER ); + assert( assert_pager_state(pPager) ); + assert( pPager->hasHeldSharedLock==1 ); + + if( pgno==0 ) return SQLITE_CORRUPT_BKPT; + pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); + if( pBase==0 ){ + pPg = 0; + rc = sqlite3PcacheFetchStress(pPager->pPCache, pgno, &pBase); + if( rc!=SQLITE_OK ) goto pager_acquire_err; + if( pBase==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto pager_acquire_err; + } + } + pPg = *ppPage = sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pBase); + assert( pPg==(*ppPage) ); + assert( pPg->pgno==pgno ); + assert( pPg->pPager==pPager || pPg->pPager==0 ); + + noContent = (flags & PAGER_GET_NOCONTENT)!=0; + if( pPg->pPager && !noContent ){ + /* In this case the pcache already contains an initialized copy of + ** the page. Return without further ado. */ + assert( pgno<=PAGER_MAX_PGNO && pgno!=PAGER_MJ_PGNO(pPager) ); + pPager->aStat[PAGER_STAT_HIT]++; + return SQLITE_OK; + + }else{ + /* The pager cache has created a new page. Its content needs to + ** be initialized. But first some error checks: + ** + ** (1) The maximum page number is 2^31 + ** (2) Never try to fetch the locking page + */ + if( pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){ + rc = SQLITE_CORRUPT_BKPT; + goto pager_acquire_err; + } + + pPg->pPager = pPager; + + assert( !isOpen(pPager->fd) || !MEMDB ); + if( !isOpen(pPager->fd) || pPager->dbSizepPager->mxPgno ){ + rc = SQLITE_FULL; + goto pager_acquire_err; + } + if( noContent ){ + /* Failure to set the bits in the InJournal bit-vectors is benign. + ** It merely means that we might do some extra work to journal a + ** page that does not need to be journaled. Nevertheless, be sure + ** to test the case where a malloc error occurs while trying to set + ** a bit in a bit vector. + */ + sqlite3BeginBenignMalloc(); + if( pgno<=pPager->dbOrigSize ){ + TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno); + testcase( rc==SQLITE_NOMEM ); + } + TESTONLY( rc = ) addToSavepointBitvecs(pPager, pgno); + testcase( rc==SQLITE_NOMEM ); + sqlite3EndBenignMalloc(); + } + memset(pPg->pData, 0, pPager->pageSize); + IOTRACE(("ZERO %p %d\n", pPager, pgno)); + }else{ + assert( pPg->pPager==pPager ); + pPager->aStat[PAGER_STAT_MISS]++; + rc = readDbPage(pPg); + if( rc!=SQLITE_OK ){ + goto pager_acquire_err; + } + } + pager_set_pagehash(pPg); + } + return SQLITE_OK; + +pager_acquire_err: + assert( rc!=SQLITE_OK ); + if( pPg ){ + sqlite3PcacheDrop(pPg); + } + pagerUnlockIfUnused(pPager); + *ppPage = 0; + return rc; +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* The page getter for when memory-mapped I/O is enabled */ +static int getPageMMap( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + int rc = SQLITE_OK; + PgHdr *pPg = 0; + u32 iFrame = 0; /* Frame to read from WAL file */ + + /* It is acceptable to use a read-only (mmap) page for any page except + ** page 1 if there is no write-transaction open or the ACQUIRE_READONLY + ** flag was specified by the caller. And so long as the db is not a + ** temporary or in-memory database. */ + const int bMmapOk = (pgno>1 + && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) + ); + + assert( USEFETCH(pPager) ); + + /* Optimization note: Adding the "pgno<=1" term before "pgno==0" here + ** allows the compiler optimizer to reuse the results of the "pgno>1" + ** test in the previous statement, and avoid testing pgno==0 in the + ** common case where pgno is large. */ + if( pgno<=1 && pgno==0 ){ + return SQLITE_CORRUPT_BKPT; + } + assert( pPager->eState>=PAGER_READER ); + assert( assert_pager_state(pPager) ); + assert( pPager->hasHeldSharedLock==1 ); + assert( pPager->errCode==SQLITE_OK ); + + if( bMmapOk && pagerUseWal(pPager) ){ + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); + if( rc!=SQLITE_OK ){ + *ppPage = 0; + return rc; + } + } + if( bMmapOk && iFrame==0 ){ + void *pData = 0; + rc = sqlite3OsFetch(pPager->fd, + (i64)(pgno-1) * pPager->pageSize, pPager->pageSize, &pData + ); + if( rc==SQLITE_OK && pData ){ + if( pPager->eState>PAGER_READER || pPager->tempFile ){ + pPg = sqlite3PagerLookup(pPager, pgno); + } + if( pPg==0 ){ + rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg); + }else{ + sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData); + } + if( pPg ){ + assert( rc==SQLITE_OK ); + *ppPage = pPg; + return SQLITE_OK; + } + } + if( rc!=SQLITE_OK ){ + *ppPage = 0; + return rc; + } + } + return getPageNormal(pPager, pgno, ppPage, flags); +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* The page getter method for when the pager is an error state */ +static int getPageError( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + UNUSED_PARAMETER(pgno); + UNUSED_PARAMETER(flags); + assert( pPager->errCode!=SQLITE_OK ); + *ppPage = 0; + return pPager->errCode; +} + + +/* Dispatch all page fetch requests to the appropriate getter method. +*/ +SQLITE_PRIVATE int sqlite3PagerGet( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + return pPager->xGet(pPager, pgno, ppPage, flags); +} + +/* +** Acquire a page if it is already in the in-memory cache. Do +** not read the page from disk. Return a pointer to the page, +** or 0 if the page is not in cache. +** +** See also sqlite3PagerGet(). The difference between this routine +** and sqlite3PagerGet() is that _get() will go to the disk and read +** in the page if the page is not already in cache. This routine +** returns NULL if the page is not in cache or if a disk I/O error +** has ever happened. +*/ +SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ + sqlite3_pcache_page *pPage; + assert( pPager!=0 ); + assert( pgno!=0 ); + assert( pPager->pPCache!=0 ); + pPage = sqlite3PcacheFetch(pPager->pPCache, pgno, 0); + assert( pPage==0 || pPager->hasHeldSharedLock ); + if( pPage==0 ) return 0; + return sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pPage); +} + +/* +** Release a page reference. +** +** The sqlite3PagerUnref() and sqlite3PagerUnrefNotNull() may only be +** used if we know that the page being released is not the last page. +** The btree layer always holds page1 open until the end, so these first +** to routines can be used to release any page other than BtShared.pPage1. +** +** Use sqlite3PagerUnrefPageOne() to release page1. This latter routine +** checks the total number of outstanding pages and if the number of +** pages reaches zero it drops the database lock. +*/ +SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage *pPg){ + TESTONLY( Pager *pPager = pPg->pPager; ) + assert( pPg!=0 ); + if( pPg->flags & PGHDR_MMAP ){ + assert( pPg->pgno!=1 ); /* Page1 is never memory mapped */ + pagerReleaseMapPage(pPg); + }else{ + sqlite3PcacheRelease(pPg); + } + /* Do not use this routine to release the last reference to page1 */ + assert( sqlite3PcacheRefCount(pPager->pPCache)>0 ); +} +SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){ + if( pPg ) sqlite3PagerUnrefNotNull(pPg); +} +SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage *pPg){ + Pager *pPager; + assert( pPg!=0 ); + assert( pPg->pgno==1 ); + assert( (pPg->flags & PGHDR_MMAP)==0 ); /* Page1 is never memory mapped */ + pPager = pPg->pPager; + sqlite3PcacheRelease(pPg); + pagerUnlockIfUnused(pPager); +} + +/* +** This function is called at the start of every write transaction. +** There must already be a RESERVED or EXCLUSIVE lock on the database +** file when this routine is called. +** +** Open the journal file for pager pPager and write a journal header +** to the start of it. If there are active savepoints, open the sub-journal +** as well. This function is only used when the journal file is being +** opened to write a rollback log for a transaction. It is not used +** when opening a hot journal file to roll it back. +** +** If the journal file is already open (as it may be in exclusive mode), +** then this function just writes a journal header to the start of the +** already open file. +** +** Whether or not the journal file is opened by this function, the +** Pager.pInJournal bitvec structure is allocated. +** +** Return SQLITE_OK if everything is successful. Otherwise, return +** SQLITE_NOMEM if the attempt to allocate Pager.pInJournal fails, or +** an IO error code if opening or writing the journal file fails. +*/ +static int pager_open_journal(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + sqlite3_vfs * const pVfs = pPager->pVfs; /* Local cache of vfs pointer */ + + assert( pPager->eState==PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + assert( pPager->pInJournal==0 ); + + /* If already in the error state, this function is a no-op. But on + ** the other hand, this routine is never called if we are already in + ** an error state. */ + if( NEVER(pPager->errCode) ) return pPager->errCode; + + if( !pagerUseWal(pPager) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ + pPager->pInJournal = sqlite3BitvecCreate(pPager->dbSize); + if( pPager->pInJournal==0 ){ + return SQLITE_NOMEM_BKPT; + } + + /* Open the journal file if it is not already open. */ + if( !isOpen(pPager->jfd) ){ + if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){ + sqlite3MemJournalOpen(pPager->jfd); + }else{ + int flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; + int nSpill; + + if( pPager->tempFile ){ + flags |= (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL); + nSpill = sqlite3Config.nStmtSpill; + }else{ + flags |= SQLITE_OPEN_MAIN_JOURNAL; + nSpill = jrnlBufferSize(pPager); + } + + /* Verify that the database still has the same name as it did when + ** it was originally opened. */ + rc = databaseIsUnmoved(pPager); + if( rc==SQLITE_OK ){ + rc = sqlite3JournalOpen ( + pVfs, pPager->zJournal, pPager->jfd, flags, nSpill + ); + } + } + assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); + } + + + /* Write the first journal header to the journal file and open + ** the sub-journal if necessary. + */ + if( rc==SQLITE_OK ){ + /* TODO: Check if all of these are really required. */ + pPager->nRec = 0; + pPager->journalOff = 0; + pPager->setMaster = 0; + pPager->journalHdr = 0; + rc = writeJournalHdr(pPager); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3BitvecDestroy(pPager->pInJournal); + pPager->pInJournal = 0; + }else{ + assert( pPager->eState==PAGER_WRITER_LOCKED ); + pPager->eState = PAGER_WRITER_CACHEMOD; + } + + return rc; +} + +/* +** Begin a write-transaction on the specified pager object. If a +** write-transaction has already been opened, this function is a no-op. +** +** If the exFlag argument is false, then acquire at least a RESERVED +** lock on the database file. If exFlag is true, then acquire at least +** an EXCLUSIVE lock. If such a lock is already held, no locking +** functions need be called. +** +** If the subjInMemory argument is non-zero, then any sub-journal opened +** within this transaction will be opened as an in-memory file. This +** has no effect if the sub-journal is already opened (as it may be when +** running in exclusive mode) or if the transaction does not require a +** sub-journal. If the subjInMemory argument is zero, then any required +** sub-journal is implemented in-memory if pPager is an in-memory database, +** or using a temporary file otherwise. +*/ +SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ + int rc = SQLITE_OK; + + if( pPager->errCode ) return pPager->errCode; + assert( pPager->eState>=PAGER_READER && pPager->eStatesubjInMemory = (u8)subjInMemory; + + if( ALWAYS(pPager->eState==PAGER_READER) ){ + assert( pPager->pInJournal==0 ); + + if( pagerUseWal(pPager) ){ + /* If the pager is configured to use locking_mode=exclusive, and an + ** exclusive lock on the database is not already held, obtain it now. + */ + if( pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, -1) ){ + rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + return rc; + } + (void)sqlite3WalExclusiveMode(pPager->pWal, 1); + } + + /* Grab the write lock on the log file. If successful, upgrade to + ** PAGER_RESERVED state. Otherwise, return an error code to the caller. + ** The busy-handler is not invoked if another connection already + ** holds the write-lock. If possible, the upper layer will call it. + */ + rc = sqlite3WalBeginWriteTransaction(pPager->pWal); + }else{ + /* Obtain a RESERVED lock on the database file. If the exFlag parameter + ** is true, then immediately upgrade this to an EXCLUSIVE lock. The + ** busy-handler callback can be used when upgrading to the EXCLUSIVE + ** lock, but not when obtaining the RESERVED lock. + */ + rc = pagerLockDb(pPager, RESERVED_LOCK); + if( rc==SQLITE_OK && exFlag ){ + rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + } + } + + if( rc==SQLITE_OK ){ + /* Change to WRITER_LOCKED state. + ** + ** WAL mode sets Pager.eState to PAGER_WRITER_LOCKED or CACHEMOD + ** when it has an open transaction, but never to DBMOD or FINISHED. + ** This is because in those states the code to roll back savepoint + ** transactions may copy data from the sub-journal into the database + ** file as well as into the page cache. Which would be incorrect in + ** WAL mode. + */ + pPager->eState = PAGER_WRITER_LOCKED; + pPager->dbHintSize = pPager->dbSize; + pPager->dbFileSize = pPager->dbSize; + pPager->dbOrigSize = pPager->dbSize; + pPager->journalOff = 0; + } + + assert( rc==SQLITE_OK || pPager->eState==PAGER_READER ); + assert( rc!=SQLITE_OK || pPager->eState==PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + } + + PAGERTRACE(("TRANSACTION %d\n", PAGERID(pPager))); + return rc; +} + +/* +** Write page pPg onto the end of the rollback journal. +*/ +static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + int rc; + u32 cksum; + char *pData2; + i64 iOff = pPager->journalOff; + + /* We should never write to the journal file the page that + ** contains the database locks. The following assert verifies + ** that we do not. */ + assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); + + assert( pPager->journalHdr<=pPager->journalOff ); + pData2 = pPg->pData; + cksum = pager_cksum(pPager, (u8*)pData2); + + /* Even if an IO or diskfull error occurs while journalling the + ** page in the block above, set the need-sync flag for the page. + ** Otherwise, when the transaction is rolled back, the logic in + ** playback_one_page() will think that the page needs to be restored + ** in the database file. And if an IO error occurs while doing so, + ** then corruption may follow. + */ + pPg->flags |= PGHDR_NEED_SYNC; + + rc = write32bits(pPager->jfd, iOff, pPg->pgno); + if( rc!=SQLITE_OK ) return rc; + rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, iOff+4); + if( rc!=SQLITE_OK ) return rc; + rc = write32bits(pPager->jfd, iOff+pPager->pageSize+4, cksum); + if( rc!=SQLITE_OK ) return rc; + + IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, + pPager->journalOff, pPager->pageSize)); + PAGER_INCR(sqlite3_pager_writej_count); + PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n", + PAGERID(pPager), pPg->pgno, + ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg))); + + pPager->journalOff += 8 + pPager->pageSize; + pPager->nRec++; + assert( pPager->pInJournal!=0 ); + rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno); + testcase( rc==SQLITE_NOMEM ); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + rc |= addToSavepointBitvecs(pPager, pPg->pgno); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + return rc; +} + +/* +** Mark a single data page as writeable. The page is written into the +** main journal or sub-journal as required. If the page is written into +** one of the journals, the corresponding bit is set in the +** Pager.pInJournal bitvec and the PagerSavepoint.pInSavepoint bitvecs +** of any open savepoints as appropriate. +*/ +static int pager_write(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + int rc = SQLITE_OK; + + /* This routine is not called unless a write-transaction has already + ** been started. The journal file may or may not be open at this point. + ** It is never called in the ERROR state. + */ + assert( pPager->eState==PAGER_WRITER_LOCKED + || pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + assert( pPager->errCode==0 ); + assert( pPager->readOnly==0 ); + CHECK_PAGE(pPg); + + /* The journal file needs to be opened. Higher level routines have already + ** obtained the necessary locks to begin the write-transaction, but the + ** rollback journal might not yet be open. Open it now if this is the case. + ** + ** This is done before calling sqlite3PcacheMakeDirty() on the page. + ** Otherwise, if it were done after calling sqlite3PcacheMakeDirty(), then + ** an error might occur and the pager would end up in WRITER_LOCKED state + ** with pages marked as dirty in the cache. + */ + if( pPager->eState==PAGER_WRITER_LOCKED ){ + rc = pager_open_journal(pPager); + if( rc!=SQLITE_OK ) return rc; + } + assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); + assert( assert_pager_state(pPager) ); + + /* Mark the page that is about to be modified as dirty. */ + sqlite3PcacheMakeDirty(pPg); + + /* If a rollback journal is in use, them make sure the page that is about + ** to change is in the rollback journal, or if the page is a new page off + ** then end of the file, make sure it is marked as PGHDR_NEED_SYNC. + */ + assert( (pPager->pInJournal!=0) == isOpen(pPager->jfd) ); + if( pPager->pInJournal!=0 + && sqlite3BitvecTestNotNull(pPager->pInJournal, pPg->pgno)==0 + ){ + assert( pagerUseWal(pPager)==0 ); + if( pPg->pgno<=pPager->dbOrigSize ){ + rc = pagerAddPageToRollbackJournal(pPg); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + if( pPager->eState!=PAGER_WRITER_DBMOD ){ + pPg->flags |= PGHDR_NEED_SYNC; + } + PAGERTRACE(("APPEND %d page %d needSync=%d\n", + PAGERID(pPager), pPg->pgno, + ((pPg->flags&PGHDR_NEED_SYNC)?1:0))); + } + } + + /* The PGHDR_DIRTY bit is set above when the page was added to the dirty-list + ** and before writing the page into the rollback journal. Wait until now, + ** after the page has been successfully journalled, before setting the + ** PGHDR_WRITEABLE bit that indicates that the page can be safely modified. + */ + pPg->flags |= PGHDR_WRITEABLE; + + /* If the statement journal is open and the page is not in it, + ** then write the page into the statement journal. + */ + if( pPager->nSavepoint>0 ){ + rc = subjournalPageIfRequired(pPg); + } + + /* Update the database size and return. */ + if( pPager->dbSizepgno ){ + pPager->dbSize = pPg->pgno; + } + return rc; +} + +/* +** This is a variant of sqlite3PagerWrite() that runs when the sector size +** is larger than the page size. SQLite makes the (reasonable) assumption that +** all bytes of a sector are written together by hardware. Hence, all bytes of +** a sector need to be journalled in case of a power loss in the middle of +** a write. +** +** Usually, the sector size is less than or equal to the page size, in which +** case pages can be individually written. This routine only runs in the +** exceptional case where the page size is smaller than the sector size. +*/ +static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ + int rc = SQLITE_OK; /* Return code */ + Pgno nPageCount; /* Total number of pages in database file */ + Pgno pg1; /* First page of the sector pPg is located on. */ + int nPage = 0; /* Number of pages starting at pg1 to journal */ + int ii; /* Loop counter */ + int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */ + Pager *pPager = pPg->pPager; /* The pager that owns pPg */ + Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); + + /* Set the doNotSpill NOSYNC bit to 1. This is because we cannot allow + ** a journal header to be written between the pages journaled by + ** this function. + */ + assert( !MEMDB ); + assert( (pPager->doNotSpill & SPILLFLAG_NOSYNC)==0 ); + pPager->doNotSpill |= SPILLFLAG_NOSYNC; + + /* This trick assumes that both the page-size and sector-size are + ** an integer power of 2. It sets variable pg1 to the identifier + ** of the first page of the sector pPg is located on. + */ + pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1; + + nPageCount = pPager->dbSize; + if( pPg->pgno>nPageCount ){ + nPage = (pPg->pgno - pg1)+1; + }else if( (pg1+nPagePerSector-1)>nPageCount ){ + nPage = nPageCount+1-pg1; + }else{ + nPage = nPagePerSector; + } + assert(nPage>0); + assert(pg1<=pPg->pgno); + assert((pg1+nPage)>pPg->pgno); + + for(ii=0; iipgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){ + if( pg!=PAGER_MJ_PGNO(pPager) ){ + rc = sqlite3PagerGet(pPager, pg, &pPage, 0); + if( rc==SQLITE_OK ){ + rc = pager_write(pPage); + if( pPage->flags&PGHDR_NEED_SYNC ){ + needSync = 1; + } + sqlite3PagerUnrefNotNull(pPage); + } + } + }else if( (pPage = sqlite3PagerLookup(pPager, pg))!=0 ){ + if( pPage->flags&PGHDR_NEED_SYNC ){ + needSync = 1; + } + sqlite3PagerUnrefNotNull(pPage); + } + } + + /* If the PGHDR_NEED_SYNC flag is set for any of the nPage pages + ** starting at pg1, then it needs to be set for all of them. Because + ** writing to any of these nPage pages may damage the others, the + ** journal file must contain sync()ed copies of all of them + ** before any of them can be written out to the database file. + */ + if( rc==SQLITE_OK && needSync ){ + assert( !MEMDB ); + for(ii=0; iiflags |= PGHDR_NEED_SYNC; + sqlite3PagerUnrefNotNull(pPage); + } + } + } + + assert( (pPager->doNotSpill & SPILLFLAG_NOSYNC)!=0 ); + pPager->doNotSpill &= ~SPILLFLAG_NOSYNC; + return rc; +} + +/* +** Mark a data page as writeable. This routine must be called before +** making changes to a page. The caller must check the return value +** of this function and be careful not to change any page data unless +** this routine returns SQLITE_OK. +** +** The difference between this function and pager_write() is that this +** function also deals with the special case where 2 or more pages +** fit on a single disk sector. In this case all co-resident pages +** must have been written to the journal file before returning. +** +** If an error occurs, SQLITE_NOMEM or an IO error code is returned +** as appropriate. Otherwise, SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3PagerWrite(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + assert( (pPg->flags & PGHDR_MMAP)==0 ); + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + if( (pPg->flags & PGHDR_WRITEABLE)!=0 && pPager->dbSize>=pPg->pgno ){ + if( pPager->nSavepoint ) return subjournalPageIfRequired(pPg); + return SQLITE_OK; + }else if( pPager->errCode ){ + return pPager->errCode; + }else if( pPager->sectorSize > (u32)pPager->pageSize ){ + assert( pPager->tempFile==0 ); + return pagerWriteLargeSector(pPg); + }else{ + return pager_write(pPg); + } +} + +/* +** Return TRUE if the page given in the argument was previously passed +** to sqlite3PagerWrite(). In other words, return TRUE if it is ok +** to change the content of the page. +*/ +#ifndef NDEBUG +SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){ + return pPg->flags & PGHDR_WRITEABLE; +} +#endif + +/* +** A call to this routine tells the pager that it is not necessary to +** write the information on page pPg back to the disk, even though +** that page might be marked as dirty. This happens, for example, when +** the page has been added as a leaf of the freelist and so its +** content no longer matters. +** +** The overlying software layer calls this routine when all of the data +** on the given page is unused. The pager marks the page as clean so +** that it does not get written to disk. +** +** Tests show that this optimization can quadruple the speed of large +** DELETE operations. +** +** This optimization cannot be used with a temp-file, as the page may +** have been dirty at the start of the transaction. In that case, if +** memory pressure forces page pPg out of the cache, the data does need +** to be written out to disk so that it may be read back in if the +** current transaction is rolled back. +*/ +SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + if( !pPager->tempFile && (pPg->flags&PGHDR_DIRTY) && pPager->nSavepoint==0 ){ + PAGERTRACE(("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager))); + IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno)) + pPg->flags |= PGHDR_DONT_WRITE; + pPg->flags &= ~PGHDR_WRITEABLE; + testcase( pPg->flags & PGHDR_NEED_SYNC ); + pager_set_pagehash(pPg); + } +} + +/* +** This routine is called to increment the value of the database file +** change-counter, stored as a 4-byte big-endian integer starting at +** byte offset 24 of the pager file. The secondary change counter at +** 92 is also updated, as is the SQLite version number at offset 96. +** +** But this only happens if the pPager->changeCountDone flag is false. +** To avoid excess churning of page 1, the update only happens once. +** See also the pager_write_changecounter() routine that does an +** unconditional update of the change counters. +** +** If the isDirectMode flag is zero, then this is done by calling +** sqlite3PagerWrite() on page 1, then modifying the contents of the +** page data. In this case the file will be updated when the current +** transaction is committed. +** +** The isDirectMode flag may only be non-zero if the library was compiled +** with the SQLITE_ENABLE_ATOMIC_WRITE macro defined. In this case, +** if isDirect is non-zero, then the database file is updated directly +** by writing an updated version of page 1 using a call to the +** sqlite3OsWrite() function. +*/ +static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ + int rc = SQLITE_OK; + + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + + /* Declare and initialize constant integer 'isDirect'. If the + ** atomic-write optimization is enabled in this build, then isDirect + ** is initialized to the value passed as the isDirectMode parameter + ** to this function. Otherwise, it is always set to zero. + ** + ** The idea is that if the atomic-write optimization is not + ** enabled at compile time, the compiler can omit the tests of + ** 'isDirect' below, as well as the block enclosed in the + ** "if( isDirect )" condition. + */ +#ifndef SQLITE_ENABLE_ATOMIC_WRITE +# define DIRECT_MODE 0 + assert( isDirectMode==0 ); + UNUSED_PARAMETER(isDirectMode); +#else +# define DIRECT_MODE isDirectMode +#endif + + if( !pPager->changeCountDone && ALWAYS(pPager->dbSize>0) ){ + PgHdr *pPgHdr; /* Reference to page 1 */ + + assert( !pPager->tempFile && isOpen(pPager->fd) ); + + /* Open page 1 of the file for writing. */ + rc = sqlite3PagerGet(pPager, 1, &pPgHdr, 0); + assert( pPgHdr==0 || rc==SQLITE_OK ); + + /* If page one was fetched successfully, and this function is not + ** operating in direct-mode, make page 1 writable. When not in + ** direct mode, page 1 is always held in cache and hence the PagerGet() + ** above is always successful - hence the ALWAYS on rc==SQLITE_OK. + */ + if( !DIRECT_MODE && ALWAYS(rc==SQLITE_OK) ){ + rc = sqlite3PagerWrite(pPgHdr); + } + + if( rc==SQLITE_OK ){ + /* Actually do the update of the change counter */ + pager_write_changecounter(pPgHdr); + + /* If running in direct mode, write the contents of page 1 to the file. */ + if( DIRECT_MODE ){ + const void *zBuf; + assert( pPager->dbFileSize>0 ); + zBuf = pPgHdr->pData; + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); + pPager->aStat[PAGER_STAT_WRITE]++; + } + if( rc==SQLITE_OK ){ + /* Update the pager's copy of the change-counter. Otherwise, the + ** next time a read transaction is opened the cache will be + ** flushed (as the change-counter values will not match). */ + const void *pCopy = (const void *)&((const char *)zBuf)[24]; + memcpy(&pPager->dbFileVers, pCopy, sizeof(pPager->dbFileVers)); + pPager->changeCountDone = 1; + } + }else{ + pPager->changeCountDone = 1; + } + } + + /* Release the page reference. */ + sqlite3PagerUnref(pPgHdr); + } + return rc; +} + +/* +** Sync the database file to disk. This is a no-op for in-memory databases +** or pages with the Pager.noSync flag set. +** +** If successful, or if called on a pager for which it is a no-op, this +** function returns SQLITE_OK. Otherwise, an IO error code is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster){ + int rc = SQLITE_OK; + void *pArg = (void*)zMaster; + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + if( rc==SQLITE_OK && !pPager->noSync ){ + assert( !MEMDB ); + rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); + } + return rc; +} + +/* +** This function may only be called while a write-transaction is active in +** rollback. If the connection is in WAL mode, this call is a no-op. +** Otherwise, if the connection does not already have an EXCLUSIVE lock on +** the database file, an attempt is made to obtain one. +** +** If the EXCLUSIVE lock is already held or the attempt to obtain it is +** successful, or the connection is in WAL mode, SQLITE_OK is returned. +** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is +** returned. +*/ +SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager *pPager){ + int rc = pPager->errCode; + assert( assert_pager_state(pPager) ); + if( rc==SQLITE_OK ){ + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + || pPager->eState==PAGER_WRITER_LOCKED + ); + assert( assert_pager_state(pPager) ); + if( 0==pagerUseWal(pPager) ){ + rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + } + } + return rc; +} + +/* +** Sync the database file for the pager pPager. zMaster points to the name +** of a master journal file that should be written into the individual +** journal file. zMaster may be NULL, which is interpreted as no master +** journal (a single database transaction). +** +** This routine ensures that: +** +** * The database file change-counter is updated, +** * the journal is synced (unless the atomic-write optimization is used), +** * all dirty pages are written to the database file, +** * the database file is truncated (if required), and +** * the database file synced. +** +** The only thing that remains to commit the transaction is to finalize +** (delete, truncate or zero the first part of) the journal file (or +** delete the master journal file if specified). +** +** Note that if zMaster==NULL, this does not overwrite a previous value +** passed to an sqlite3PagerCommitPhaseOne() call. +** +** If the final parameter - noSync - is true, then the database file itself +** is not synced. The caller must call sqlite3PagerSync() directly to +** sync the database file before calling CommitPhaseTwo() to delete the +** journal file in this case. +*/ +SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( + Pager *pPager, /* Pager object */ + const char *zMaster, /* If not NULL, the master journal name */ + int noSync /* True to omit the xSync on the db file */ +){ + int rc = SQLITE_OK; /* Return code */ + + assert( pPager->eState==PAGER_WRITER_LOCKED + || pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + || pPager->eState==PAGER_ERROR + ); + assert( assert_pager_state(pPager) ); + + /* If a prior error occurred, report that error again. */ + if( NEVER(pPager->errCode) ) return pPager->errCode; + + /* Provide the ability to easily simulate an I/O error during testing */ + if( sqlite3FaultSim(400) ) return SQLITE_IOERR; + + PAGERTRACE(("DATABASE SYNC: File=%s zMaster=%s nSize=%d\n", + pPager->zFilename, zMaster, pPager->dbSize)); + + /* If no database changes have been made, return early. */ + if( pPager->eStatetempFile ); + assert( isOpen(pPager->fd) || pPager->tempFile ); + if( 0==pagerFlushOnCommit(pPager, 1) ){ + /* If this is an in-memory db, or no pages have been written to, or this + ** function has already been called, it is mostly a no-op. However, any + ** backup in progress needs to be restarted. */ + sqlite3BackupRestart(pPager->pBackup); + }else{ + PgHdr *pList; + if( pagerUseWal(pPager) ){ + PgHdr *pPageOne = 0; + pList = sqlite3PcacheDirtyList(pPager->pPCache); + if( pList==0 ){ + /* Must have at least one page for the WAL commit flag. + ** Ticket [2d1a5c67dfc2363e44f29d9bbd57f] 2011-05-18 */ + rc = sqlite3PagerGet(pPager, 1, &pPageOne, 0); + pList = pPageOne; + pList->pDirty = 0; + } + assert( rc==SQLITE_OK ); + if( ALWAYS(pList) ){ + rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1); + } + sqlite3PagerUnref(pPageOne); + if( rc==SQLITE_OK ){ + sqlite3PcacheCleanAll(pPager->pPCache); + } + }else{ + /* The bBatch boolean is true if the batch-atomic-write commit method + ** should be used. No rollback journal is created if batch-atomic-write + ** is enabled. + */ +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + sqlite3_file *fd = pPager->fd; + int bBatch = zMaster==0 /* An SQLITE_IOCAP_BATCH_ATOMIC commit */ + && (sqlite3OsDeviceCharacteristics(fd) & SQLITE_IOCAP_BATCH_ATOMIC) + && !pPager->noSync + && sqlite3JournalIsInMemory(pPager->jfd); +#else +# define bBatch 0 +#endif + +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + /* The following block updates the change-counter. Exactly how it + ** does this depends on whether or not the atomic-update optimization + ** was enabled at compile time, and if this transaction meets the + ** runtime criteria to use the operation: + ** + ** * The file-system supports the atomic-write property for + ** blocks of size page-size, and + ** * This commit is not part of a multi-file transaction, and + ** * Exactly one page has been modified and store in the journal file. + ** + ** If the optimization was not enabled at compile time, then the + ** pager_incr_changecounter() function is called to update the change + ** counter in 'indirect-mode'. If the optimization is compiled in but + ** is not applicable to this transaction, call sqlite3JournalCreate() + ** to make sure the journal file has actually been created, then call + ** pager_incr_changecounter() to update the change-counter in indirect + ** mode. + ** + ** Otherwise, if the optimization is both enabled and applicable, + ** then call pager_incr_changecounter() to update the change-counter + ** in 'direct' mode. In this case the journal file will never be + ** created for this transaction. + */ + if( bBatch==0 ){ + PgHdr *pPg; + assert( isOpen(pPager->jfd) + || pPager->journalMode==PAGER_JOURNALMODE_OFF + || pPager->journalMode==PAGER_JOURNALMODE_WAL + ); + if( !zMaster && isOpen(pPager->jfd) + && pPager->journalOff==jrnlBufferSize(pPager) + && pPager->dbSize>=pPager->dbOrigSize + && (!(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty) + ){ + /* Update the db file change counter via the direct-write method. The + ** following call will modify the in-memory representation of page 1 + ** to include the updated change counter and then write page 1 + ** directly to the database file. Because of the atomic-write + ** property of the host file-system, this is safe. + */ + rc = pager_incr_changecounter(pPager, 1); + }else{ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc==SQLITE_OK ){ + rc = pager_incr_changecounter(pPager, 0); + } + } + } +#else /* SQLITE_ENABLE_ATOMIC_WRITE */ +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( zMaster ){ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + assert( bBatch==0 ); + } +#endif + rc = pager_incr_changecounter(pPager, 0); +#endif /* !SQLITE_ENABLE_ATOMIC_WRITE */ + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + + /* Write the master journal name into the journal file. If a master + ** journal file name has already been written to the journal file, + ** or if zMaster is NULL (no master journal), then this call is a no-op. + */ + rc = writeMasterJournal(pPager, zMaster); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + + /* Sync the journal file and write all dirty pages to the database. + ** If the atomic-update optimization is being used, this sync will not + ** create the journal file or perform any real IO. + ** + ** Because the change-counter page was just modified, unless the + ** atomic-update optimization is used it is almost certain that the + ** journal requires a sync here. However, in locking_mode=exclusive + ** on a system under memory pressure it is just possible that this is + ** not the case. In this case it is likely enough that the redundant + ** xSync() call will be changed to a no-op by the OS anyhow. + */ + rc = syncJournal(pPager, 0); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + + pList = sqlite3PcacheDirtyList(pPager->pPCache); +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( bBatch ){ + rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_BEGIN_ATOMIC_WRITE, 0); + if( rc==SQLITE_OK ){ + rc = pager_write_pagelist(pPager, pList); + if( rc==SQLITE_OK ){ + rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_COMMIT_ATOMIC_WRITE, 0); + } + if( rc!=SQLITE_OK ){ + sqlite3OsFileControlHint(fd, SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE, 0); + } + } + + if( (rc&0xFF)==SQLITE_IOERR && rc!=SQLITE_IOERR_NOMEM ){ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc!=SQLITE_OK ){ + sqlite3OsClose(pPager->jfd); + goto commit_phase_one_exit; + } + bBatch = 0; + }else{ + sqlite3OsClose(pPager->jfd); + } + } +#endif /* SQLITE_ENABLE_BATCH_ATOMIC_WRITE */ + + if( bBatch==0 ){ + rc = pager_write_pagelist(pPager, pList); + } + if( rc!=SQLITE_OK ){ + assert( rc!=SQLITE_IOERR_BLOCKED ); + goto commit_phase_one_exit; + } + sqlite3PcacheCleanAll(pPager->pPCache); + + /* If the file on disk is smaller than the database image, use + ** pager_truncate to grow the file here. This can happen if the database + ** image was extended as part of the current transaction and then the + ** last page in the db image moved to the free-list. In this case the + ** last page is never written out to disk, leaving the database file + ** undersized. Fix this now if it is the case. */ + if( pPager->dbSize>pPager->dbFileSize ){ + Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager)); + assert( pPager->eState==PAGER_WRITER_DBMOD ); + rc = pager_truncate(pPager, nNew); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + } + + /* Finally, sync the database file. */ + if( !noSync ){ + rc = sqlite3PagerSync(pPager, zMaster); + } + IOTRACE(("DBSYNC %p\n", pPager)) + } + } + +commit_phase_one_exit: + if( rc==SQLITE_OK && !pagerUseWal(pPager) ){ + pPager->eState = PAGER_WRITER_FINISHED; + } + return rc; +} + + +/* +** When this function is called, the database file has been completely +** updated to reflect the changes made by the current transaction and +** synced to disk. The journal file still exists in the file-system +** though, and if a failure occurs at this point it will eventually +** be used as a hot-journal and the current transaction rolled back. +** +** This function finalizes the journal file, either by deleting, +** truncating or partially zeroing it, so that it cannot be used +** for hot-journal rollback. Once this is done the transaction is +** irrevocably committed. +** +** If an error occurs, an IO error code is returned and the pager +** moves into the error state. Otherwise, SQLITE_OK is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + + /* This routine should not be called if a prior error has occurred. + ** But if (due to a coding error elsewhere in the system) it does get + ** called, just return the same error code without doing anything. */ + if( NEVER(pPager->errCode) ) return pPager->errCode; + pPager->iDataVersion++; + + assert( pPager->eState==PAGER_WRITER_LOCKED + || pPager->eState==PAGER_WRITER_FINISHED + || (pagerUseWal(pPager) && pPager->eState==PAGER_WRITER_CACHEMOD) + ); + assert( assert_pager_state(pPager) ); + + /* An optimization. If the database was not actually modified during + ** this transaction, the pager is running in exclusive-mode and is + ** using persistent journals, then this function is a no-op. + ** + ** The start of the journal file currently contains a single journal + ** header with the nRec field set to 0. If such a journal is used as + ** a hot-journal during hot-journal rollback, 0 changes will be made + ** to the database file. So there is no need to zero the journal + ** header. Since the pager is in exclusive mode, there is no need + ** to drop any locks either. + */ + if( pPager->eState==PAGER_WRITER_LOCKED + && pPager->exclusiveMode + && pPager->journalMode==PAGER_JOURNALMODE_PERSIST + ){ + assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) || !pPager->journalOff ); + pPager->eState = PAGER_READER; + return SQLITE_OK; + } + + PAGERTRACE(("COMMIT %d\n", PAGERID(pPager))); + rc = pager_end_transaction(pPager, pPager->setMaster, 1); + return pager_error(pPager, rc); +} + +/* +** If a write transaction is open, then all changes made within the +** transaction are reverted and the current write-transaction is closed. +** The pager falls back to PAGER_READER state if successful, or PAGER_ERROR +** state if an error occurs. +** +** If the pager is already in PAGER_ERROR state when this function is called, +** it returns Pager.errCode immediately. No work is performed in this case. +** +** Otherwise, in rollback mode, this function performs two functions: +** +** 1) It rolls back the journal file, restoring all database file and +** in-memory cache pages to the state they were in when the transaction +** was opened, and +** +** 2) It finalizes the journal file, so that it is not used for hot +** rollback at any point in the future. +** +** Finalization of the journal file (task 2) is only performed if the +** rollback is successful. +** +** In WAL mode, all cache-entries containing data modified within the +** current transaction are either expelled from the cache or reverted to +** their pre-transaction state by re-reading data from the database or +** WAL files. The WAL transaction is then closed. +*/ +SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + PAGERTRACE(("ROLLBACK %d\n", PAGERID(pPager))); + + /* PagerRollback() is a no-op if called in READER or OPEN state. If + ** the pager is already in the ERROR state, the rollback is not + ** attempted here. Instead, the error code is returned to the caller. + */ + assert( assert_pager_state(pPager) ); + if( pPager->eState==PAGER_ERROR ) return pPager->errCode; + if( pPager->eState<=PAGER_READER ) return SQLITE_OK; + + if( pagerUseWal(pPager) ){ + int rc2; + rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, -1); + rc2 = pager_end_transaction(pPager, pPager->setMaster, 0); + if( rc==SQLITE_OK ) rc = rc2; + }else if( !isOpen(pPager->jfd) || pPager->eState==PAGER_WRITER_LOCKED ){ + int eState = pPager->eState; + rc = pager_end_transaction(pPager, 0, 0); + if( !MEMDB && eState>PAGER_WRITER_LOCKED ){ + /* This can happen using journal_mode=off. Move the pager to the error + ** state to indicate that the contents of the cache may not be trusted. + ** Any active readers will get SQLITE_ABORT. + */ + pPager->errCode = SQLITE_ABORT; + pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); + return rc; + } + }else{ + rc = pager_playback(pPager, 0); + } + + assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK ); + assert( rc==SQLITE_OK || rc==SQLITE_FULL || rc==SQLITE_CORRUPT + || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR + || rc==SQLITE_CANTOPEN + ); + + /* If an error occurs during a ROLLBACK, we can no longer trust the pager + ** cache. So call pager_error() on the way out to make any error persistent. + */ + return pager_error(pPager, rc); +} + +/* +** Return TRUE if the database file is opened read-only. Return FALSE +** if the database is (in theory) writable. +*/ +SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager *pPager){ + return pPager->readOnly; +} + +#ifdef SQLITE_DEBUG +/* +** Return the sum of the reference counts for all pages held by pPager. +*/ +SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){ + return sqlite3PcacheRefCount(pPager->pPCache); +} +#endif + +/* +** Return the approximate number of bytes of memory currently +** used by the pager and its associated cache. +*/ +SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager *pPager){ + int perPageSize = pPager->pageSize + pPager->nExtra + sizeof(PgHdr) + + 5*sizeof(void*); + return perPageSize*sqlite3PcachePagecount(pPager->pPCache) + + sqlite3MallocSize(pPager) + + pPager->pageSize; +} + +/* +** Return the number of references to the specified page. +*/ +SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage *pPage){ + return sqlite3PcachePageRefcount(pPage); +} + +#ifdef SQLITE_TEST +/* +** This routine is used for testing and analysis only. +*/ +SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){ + static int a[11]; + a[0] = sqlite3PcacheRefCount(pPager->pPCache); + a[1] = sqlite3PcachePagecount(pPager->pPCache); + a[2] = sqlite3PcacheGetCachesize(pPager->pPCache); + a[3] = pPager->eState==PAGER_OPEN ? -1 : (int) pPager->dbSize; + a[4] = pPager->eState; + a[5] = pPager->errCode; + a[6] = pPager->aStat[PAGER_STAT_HIT]; + a[7] = pPager->aStat[PAGER_STAT_MISS]; + a[8] = 0; /* Used to be pPager->nOvfl */ + a[9] = pPager->nRead; + a[10] = pPager->aStat[PAGER_STAT_WRITE]; + return a; +} +#endif + +/* +** Parameter eStat must be one of SQLITE_DBSTATUS_CACHE_HIT, _MISS, _WRITE, +** or _WRITE+1. The SQLITE_DBSTATUS_CACHE_WRITE+1 case is a translation +** of SQLITE_DBSTATUS_CACHE_SPILL. The _SPILL case is not contiguous because +** it was added later. +** +** Before returning, *pnVal is incremented by the +** current cache hit or miss count, according to the value of eStat. If the +** reset parameter is non-zero, the cache hit or miss count is zeroed before +** returning. +*/ +SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){ + + assert( eStat==SQLITE_DBSTATUS_CACHE_HIT + || eStat==SQLITE_DBSTATUS_CACHE_MISS + || eStat==SQLITE_DBSTATUS_CACHE_WRITE + || eStat==SQLITE_DBSTATUS_CACHE_WRITE+1 + ); + + assert( SQLITE_DBSTATUS_CACHE_HIT+1==SQLITE_DBSTATUS_CACHE_MISS ); + assert( SQLITE_DBSTATUS_CACHE_HIT+2==SQLITE_DBSTATUS_CACHE_WRITE ); + assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1 + && PAGER_STAT_WRITE==2 && PAGER_STAT_SPILL==3 ); + + eStat -= SQLITE_DBSTATUS_CACHE_HIT; + *pnVal += pPager->aStat[eStat]; + if( reset ){ + pPager->aStat[eStat] = 0; + } +} + +/* +** Return true if this is an in-memory or temp-file backed pager. +*/ +SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){ + return pPager->tempFile; +} + +/* +** Check that there are at least nSavepoint savepoints open. If there are +** currently less than nSavepoints open, then open one or more savepoints +** to make up the difference. If the number of savepoints is already +** equal to nSavepoint, then this function is a no-op. +** +** If a memory allocation fails, SQLITE_NOMEM is returned. If an error +** occurs while opening the sub-journal file, then an IO error code is +** returned. Otherwise, SQLITE_OK. +*/ +static SQLITE_NOINLINE int pagerOpenSavepoint(Pager *pPager, int nSavepoint){ + int rc = SQLITE_OK; /* Return code */ + int nCurrent = pPager->nSavepoint; /* Current number of savepoints */ + int ii; /* Iterator variable */ + PagerSavepoint *aNew; /* New Pager.aSavepoint array */ + + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + assert( nSavepoint>nCurrent && pPager->useJournal ); + + /* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM + ** if the allocation fails. Otherwise, zero the new portion in case a + ** malloc failure occurs while populating it in the for(...) loop below. + */ + aNew = (PagerSavepoint *)sqlite3Realloc( + pPager->aSavepoint, sizeof(PagerSavepoint)*nSavepoint + ); + if( !aNew ){ + return SQLITE_NOMEM_BKPT; + } + memset(&aNew[nCurrent], 0, (nSavepoint-nCurrent) * sizeof(PagerSavepoint)); + pPager->aSavepoint = aNew; + + /* Populate the PagerSavepoint structures just allocated. */ + for(ii=nCurrent; iidbSize; + if( isOpen(pPager->jfd) && pPager->journalOff>0 ){ + aNew[ii].iOffset = pPager->journalOff; + }else{ + aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager); + } + aNew[ii].iSubRec = pPager->nSubRec; + aNew[ii].pInSavepoint = sqlite3BitvecCreate(pPager->dbSize); + if( !aNew[ii].pInSavepoint ){ + return SQLITE_NOMEM_BKPT; + } + if( pagerUseWal(pPager) ){ + sqlite3WalSavepoint(pPager->pWal, aNew[ii].aWalData); + } + pPager->nSavepoint = ii+1; + } + assert( pPager->nSavepoint==nSavepoint ); + assertTruncateConstraint(pPager); + return rc; +} +SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + + if( nSavepoint>pPager->nSavepoint && pPager->useJournal ){ + return pagerOpenSavepoint(pPager, nSavepoint); + }else{ + return SQLITE_OK; + } +} + + +/* +** This function is called to rollback or release (commit) a savepoint. +** The savepoint to release or rollback need not be the most recently +** created savepoint. +** +** Parameter op is always either SAVEPOINT_ROLLBACK or SAVEPOINT_RELEASE. +** If it is SAVEPOINT_RELEASE, then release and destroy the savepoint with +** index iSavepoint. If it is SAVEPOINT_ROLLBACK, then rollback all changes +** that have occurred since the specified savepoint was created. +** +** The savepoint to rollback or release is identified by parameter +** iSavepoint. A value of 0 means to operate on the outermost savepoint +** (the first created). A value of (Pager.nSavepoint-1) means operate +** on the most recently created savepoint. If iSavepoint is greater than +** (Pager.nSavepoint-1), then this function is a no-op. +** +** If a negative value is passed to this function, then the current +** transaction is rolled back. This is different to calling +** sqlite3PagerRollback() because this function does not terminate +** the transaction or unlock the database, it just restores the +** contents of the database to its original state. +** +** In any case, all savepoints with an index greater than iSavepoint +** are destroyed. If this is a release operation (op==SAVEPOINT_RELEASE), +** then savepoint iSavepoint is also destroyed. +** +** This function may return SQLITE_NOMEM if a memory allocation fails, +** or an IO error code if an IO error occurs while rolling back a +** savepoint. If no errors occur, SQLITE_OK is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ + int rc = pPager->errCode; + +#ifdef SQLITE_ENABLE_ZIPVFS + if( op==SAVEPOINT_RELEASE ) rc = SQLITE_OK; +#endif + + assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); + assert( iSavepoint>=0 || op==SAVEPOINT_ROLLBACK ); + + if( rc==SQLITE_OK && iSavepointnSavepoint ){ + int ii; /* Iterator variable */ + int nNew; /* Number of remaining savepoints after this op. */ + + /* Figure out how many savepoints will still be active after this + ** operation. Store this value in nNew. Then free resources associated + ** with any savepoints that are destroyed by this operation. + */ + nNew = iSavepoint + (( op==SAVEPOINT_RELEASE ) ? 0 : 1); + for(ii=nNew; iinSavepoint; ii++){ + sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint); + } + pPager->nSavepoint = nNew; + + /* If this is a release of the outermost savepoint, truncate + ** the sub-journal to zero bytes in size. */ + if( op==SAVEPOINT_RELEASE ){ + if( nNew==0 && isOpen(pPager->sjfd) ){ + /* Only truncate if it is an in-memory sub-journal. */ + if( sqlite3JournalIsInMemory(pPager->sjfd) ){ + rc = sqlite3OsTruncate(pPager->sjfd, 0); + assert( rc==SQLITE_OK ); + } + pPager->nSubRec = 0; + } + } + /* Else this is a rollback operation, playback the specified savepoint. + ** If this is a temp-file, it is possible that the journal file has + ** not yet been opened. In this case there have been no changes to + ** the database file, so the playback operation can be skipped. + */ + else if( pagerUseWal(pPager) || isOpen(pPager->jfd) ){ + PagerSavepoint *pSavepoint = (nNew==0)?0:&pPager->aSavepoint[nNew-1]; + rc = pagerPlaybackSavepoint(pPager, pSavepoint); + assert(rc!=SQLITE_DONE); + } + +#ifdef SQLITE_ENABLE_ZIPVFS + /* If the cache has been modified but the savepoint cannot be rolled + ** back journal_mode=off, put the pager in the error state. This way, + ** if the VFS used by this pager includes ZipVFS, the entire transaction + ** can be rolled back at the ZipVFS level. */ + else if( + pPager->journalMode==PAGER_JOURNALMODE_OFF + && pPager->eState>=PAGER_WRITER_CACHEMOD + ){ + pPager->errCode = SQLITE_ABORT; + pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); + } +#endif + } + + return rc; +} + +/* +** Return the full pathname of the database file. +** +** Except, if the pager is in-memory only, then return an empty string if +** nullIfMemDb is true. This routine is called with nullIfMemDb==1 when +** used to report the filename to the user, for compatibility with legacy +** behavior. But when the Btree needs to know the filename for matching to +** shared cache, it uses nullIfMemDb==0 so that in-memory databases can +** participate in shared-cache. +** +** The return value to this routine is always safe to use with +** sqlite3_uri_parameter() and sqlite3_filename_database() and friends. +*/ +SQLITE_PRIVATE const char *sqlite3PagerFilename(const Pager *pPager, int nullIfMemDb){ + static const char zFake[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + return (nullIfMemDb && pPager->memDb) ? &zFake[4] : pPager->zFilename; +} + +/* +** Return the VFS structure for the pager. +*/ +SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ + return pPager->pVfs; +} + +/* +** Return the file handle for the database file associated +** with the pager. This might return NULL if the file has +** not yet been opened. +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){ + return pPager->fd; +} + +/* +** Return the file handle for the journal file (if it exists). +** This will be either the rollback journal or the WAL file. +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager *pPager){ +#if SQLITE_OMIT_WAL + return pPager->jfd; +#else + return pPager->pWal ? sqlite3WalFile(pPager->pWal) : pPager->jfd; +#endif +} + +/* +** Return the full pathname of the journal file. +*/ +SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager *pPager){ + return pPager->zJournal; +} + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Move the page pPg to location pgno in the file. +** +** There must be no references to the page previously located at +** pgno (which we call pPgOld) though that page is allowed to be +** in cache. If the page previously located at pgno is not already +** in the rollback journal, it is not put there by by this routine. +** +** References to the page pPg remain valid. Updating any +** meta-data associated with pPg (i.e. data stored in the nExtra bytes +** allocated along with the page) is the responsibility of the caller. +** +** A transaction must be active when this routine is called. It used to be +** required that a statement transaction was not active, but this restriction +** has been removed (CREATE INDEX needs to move a page when a statement +** transaction is active). +** +** If the fourth argument, isCommit, is non-zero, then this page is being +** moved as part of a database reorganization just before the transaction +** is being committed. In this case, it is guaranteed that the database page +** pPg refers to will not be written to again within this transaction. +** +** This function may return SQLITE_NOMEM or an IO error code if an error +** occurs. Otherwise, it returns SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){ + PgHdr *pPgOld; /* The page being overwritten. */ + Pgno needSyncPgno = 0; /* Old value of pPg->pgno, if sync is required */ + int rc; /* Return code */ + Pgno origPgno; /* The original page number */ + + assert( pPg->nRef>0 ); + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + + /* In order to be able to rollback, an in-memory database must journal + ** the page we are moving from. + */ + assert( pPager->tempFile || !MEMDB ); + if( pPager->tempFile ){ + rc = sqlite3PagerWrite(pPg); + if( rc ) return rc; + } + + /* If the page being moved is dirty and has not been saved by the latest + ** savepoint, then save the current contents of the page into the + ** sub-journal now. This is required to handle the following scenario: + ** + ** BEGIN; + ** + ** SAVEPOINT one; + ** + ** ROLLBACK TO one; + ** + ** If page X were not written to the sub-journal here, it would not + ** be possible to restore its contents when the "ROLLBACK TO one" + ** statement were is processed. + ** + ** subjournalPage() may need to allocate space to store pPg->pgno into + ** one or more savepoint bitvecs. This is the reason this function + ** may return SQLITE_NOMEM. + */ + if( (pPg->flags & PGHDR_DIRTY)!=0 + && SQLITE_OK!=(rc = subjournalPageIfRequired(pPg)) + ){ + return rc; + } + + PAGERTRACE(("MOVE %d page %d (needSync=%d) moves to %d\n", + PAGERID(pPager), pPg->pgno, (pPg->flags&PGHDR_NEED_SYNC)?1:0, pgno)); + IOTRACE(("MOVE %p %d %d\n", pPager, pPg->pgno, pgno)) + + /* If the journal needs to be sync()ed before page pPg->pgno can + ** be written to, store pPg->pgno in local variable needSyncPgno. + ** + ** If the isCommit flag is set, there is no need to remember that + ** the journal needs to be sync()ed before database page pPg->pgno + ** can be written to. The caller has already promised not to write to it. + */ + if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){ + needSyncPgno = pPg->pgno; + assert( pPager->journalMode==PAGER_JOURNALMODE_OFF || + pageInJournal(pPager, pPg) || pPg->pgno>pPager->dbOrigSize ); + assert( pPg->flags&PGHDR_DIRTY ); + } + + /* If the cache contains a page with page-number pgno, remove it + ** from its hash chain. Also, if the PGHDR_NEED_SYNC flag was set for + ** page pgno before the 'move' operation, it needs to be retained + ** for the page moved there. + */ + pPg->flags &= ~PGHDR_NEED_SYNC; + pPgOld = sqlite3PagerLookup(pPager, pgno); + assert( !pPgOld || pPgOld->nRef==1 || CORRUPT_DB ); + if( pPgOld ){ + if( pPgOld->nRef>1 ){ + sqlite3PagerUnrefNotNull(pPgOld); + return SQLITE_CORRUPT_BKPT; + } + pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); + if( pPager->tempFile ){ + /* Do not discard pages from an in-memory database since we might + ** need to rollback later. Just move the page out of the way. */ + sqlite3PcacheMove(pPgOld, pPager->dbSize+1); + }else{ + sqlite3PcacheDrop(pPgOld); + } + } + + origPgno = pPg->pgno; + sqlite3PcacheMove(pPg, pgno); + sqlite3PcacheMakeDirty(pPg); + + /* For an in-memory database, make sure the original page continues + ** to exist, in case the transaction needs to roll back. Use pPgOld + ** as the original page since it has already been allocated. + */ + if( pPager->tempFile && pPgOld ){ + sqlite3PcacheMove(pPgOld, origPgno); + sqlite3PagerUnrefNotNull(pPgOld); + } + + if( needSyncPgno ){ + /* If needSyncPgno is non-zero, then the journal file needs to be + ** sync()ed before any data is written to database file page needSyncPgno. + ** Currently, no such page exists in the page-cache and the + ** "is journaled" bitvec flag has been set. This needs to be remedied by + ** loading the page into the pager-cache and setting the PGHDR_NEED_SYNC + ** flag. + ** + ** If the attempt to load the page into the page-cache fails, (due + ** to a malloc() or IO failure), clear the bit in the pInJournal[] + ** array. Otherwise, if the page is loaded and written again in + ** this transaction, it may be written to the database file before + ** it is synced into the journal file. This way, it may end up in + ** the journal file twice, but that is not a problem. + */ + PgHdr *pPgHdr; + rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr, 0); + if( rc!=SQLITE_OK ){ + if( needSyncPgno<=pPager->dbOrigSize ){ + assert( pPager->pTmpSpace!=0 ); + sqlite3BitvecClear(pPager->pInJournal, needSyncPgno, pPager->pTmpSpace); + } + return rc; + } + pPgHdr->flags |= PGHDR_NEED_SYNC; + sqlite3PcacheMakeDirty(pPgHdr); + sqlite3PagerUnrefNotNull(pPgHdr); + } + + return SQLITE_OK; +} +#endif + +/* +** The page handle passed as the first argument refers to a dirty page +** with a page number other than iNew. This function changes the page's +** page number to iNew and sets the value of the PgHdr.flags field to +** the value passed as the third parameter. +*/ +SQLITE_PRIVATE void sqlite3PagerRekey(DbPage *pPg, Pgno iNew, u16 flags){ + assert( pPg->pgno!=iNew ); + pPg->flags = flags; + sqlite3PcacheMove(pPg, iNew); +} + +/* +** Return a pointer to the data for the specified page. +*/ +SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *pPg){ + assert( pPg->nRef>0 || pPg->pPager->memDb ); + return pPg->pData; +} + +/* +** Return a pointer to the Pager.nExtra bytes of "extra" space +** allocated along with the specified page. +*/ +SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *pPg){ + return pPg->pExtra; +} + +/* +** Get/set the locking-mode for this pager. Parameter eMode must be one +** of PAGER_LOCKINGMODE_QUERY, PAGER_LOCKINGMODE_NORMAL or +** PAGER_LOCKINGMODE_EXCLUSIVE. If the parameter is not _QUERY, then +** the locking-mode is set to the value specified. +** +** The returned value is either PAGER_LOCKINGMODE_NORMAL or +** PAGER_LOCKINGMODE_EXCLUSIVE, indicating the current (possibly updated) +** locking-mode. +*/ +SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *pPager, int eMode){ + assert( eMode==PAGER_LOCKINGMODE_QUERY + || eMode==PAGER_LOCKINGMODE_NORMAL + || eMode==PAGER_LOCKINGMODE_EXCLUSIVE ); + assert( PAGER_LOCKINGMODE_QUERY<0 ); + assert( PAGER_LOCKINGMODE_NORMAL>=0 && PAGER_LOCKINGMODE_EXCLUSIVE>=0 ); + assert( pPager->exclusiveMode || 0==sqlite3WalHeapMemory(pPager->pWal) ); + if( eMode>=0 && !pPager->tempFile && !sqlite3WalHeapMemory(pPager->pWal) ){ + pPager->exclusiveMode = (u8)eMode; + } + return (int)pPager->exclusiveMode; +} + +/* +** Set the journal-mode for this pager. Parameter eMode must be one of: +** +** PAGER_JOURNALMODE_DELETE +** PAGER_JOURNALMODE_TRUNCATE +** PAGER_JOURNALMODE_PERSIST +** PAGER_JOURNALMODE_OFF +** PAGER_JOURNALMODE_MEMORY +** PAGER_JOURNALMODE_WAL +** +** The journalmode is set to the value specified if the change is allowed. +** The change may be disallowed for the following reasons: +** +** * An in-memory database can only have its journal_mode set to _OFF +** or _MEMORY. +** +** * Temporary databases cannot have _WAL journalmode. +** +** The returned indicate the current (possibly updated) journal-mode. +*/ +SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ + u8 eOld = pPager->journalMode; /* Prior journalmode */ + + /* The eMode parameter is always valid */ + assert( eMode==PAGER_JOURNALMODE_DELETE + || eMode==PAGER_JOURNALMODE_TRUNCATE + || eMode==PAGER_JOURNALMODE_PERSIST + || eMode==PAGER_JOURNALMODE_OFF + || eMode==PAGER_JOURNALMODE_WAL + || eMode==PAGER_JOURNALMODE_MEMORY ); + + /* This routine is only called from the OP_JournalMode opcode, and + ** the logic there will never allow a temporary file to be changed + ** to WAL mode. + */ + assert( pPager->tempFile==0 || eMode!=PAGER_JOURNALMODE_WAL ); + + /* Do allow the journalmode of an in-memory database to be set to + ** anything other than MEMORY or OFF + */ + if( MEMDB ){ + assert( eOld==PAGER_JOURNALMODE_MEMORY || eOld==PAGER_JOURNALMODE_OFF ); + if( eMode!=PAGER_JOURNALMODE_MEMORY && eMode!=PAGER_JOURNALMODE_OFF ){ + eMode = eOld; + } + } + + if( eMode!=eOld ){ + + /* Change the journal mode. */ + assert( pPager->eState!=PAGER_ERROR ); + pPager->journalMode = (u8)eMode; + + /* When transistioning from TRUNCATE or PERSIST to any other journal + ** mode except WAL, unless the pager is in locking_mode=exclusive mode, + ** delete the journal file. + */ + assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 ); + assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 ); + assert( (PAGER_JOURNALMODE_DELETE & 5)==0 ); + assert( (PAGER_JOURNALMODE_MEMORY & 5)==4 ); + assert( (PAGER_JOURNALMODE_OFF & 5)==0 ); + assert( (PAGER_JOURNALMODE_WAL & 5)==5 ); + + assert( isOpen(pPager->fd) || pPager->exclusiveMode ); + if( !pPager->exclusiveMode && (eOld & 5)==1 && (eMode & 1)==0 ){ + + /* In this case we would like to delete the journal file. If it is + ** not possible, then that is not a problem. Deleting the journal file + ** here is an optimization only. + ** + ** Before deleting the journal file, obtain a RESERVED lock on the + ** database file. This ensures that the journal file is not deleted + ** while it is in use by some other client. + */ + sqlite3OsClose(pPager->jfd); + if( pPager->eLock>=RESERVED_LOCK ){ + sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); + }else{ + int rc = SQLITE_OK; + int state = pPager->eState; + assert( state==PAGER_OPEN || state==PAGER_READER ); + if( state==PAGER_OPEN ){ + rc = sqlite3PagerSharedLock(pPager); + } + if( pPager->eState==PAGER_READER ){ + assert( rc==SQLITE_OK ); + rc = pagerLockDb(pPager, RESERVED_LOCK); + } + if( rc==SQLITE_OK ){ + sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); + } + if( rc==SQLITE_OK && state==PAGER_READER ){ + pagerUnlockDb(pPager, SHARED_LOCK); + }else if( state==PAGER_OPEN ){ + pager_unlock(pPager); + } + assert( state==pPager->eState ); + } + }else if( eMode==PAGER_JOURNALMODE_OFF ){ + sqlite3OsClose(pPager->jfd); + } + } + + /* Return the new journal mode */ + return (int)pPager->journalMode; +} + +/* +** Return the current journal mode. +*/ +SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){ + return (int)pPager->journalMode; +} + +/* +** Return TRUE if the pager is in a state where it is OK to change the +** journalmode. Journalmode changes can only happen when the database +** is unmodified. +*/ +SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager *pPager){ + assert( assert_pager_state(pPager) ); + if( pPager->eState>=PAGER_WRITER_CACHEMOD ) return 0; + if( NEVER(isOpen(pPager->jfd) && pPager->journalOff>0) ) return 0; + return 1; +} + +/* +** Get/set the size-limit used for persistent journal files. +** +** Setting the size limit to -1 means no limit is enforced. +** An attempt to set a limit smaller than -1 is a no-op. +*/ +SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){ + if( iLimit>=-1 ){ + pPager->journalSizeLimit = iLimit; + sqlite3WalLimit(pPager->pWal, iLimit); + } + return pPager->journalSizeLimit; +} + +/* +** Return a pointer to the pPager->pBackup variable. The backup module +** in backup.c maintains the content of this variable. This module +** uses it opaquely as an argument to sqlite3BackupRestart() and +** sqlite3BackupUpdate() only. +*/ +SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ + return &pPager->pBackup; +} + +#ifndef SQLITE_OMIT_VACUUM +/* +** Unless this is an in-memory or temporary database, clear the pager cache. +*/ +SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *pPager){ + assert( MEMDB==0 || pPager->tempFile ); + if( pPager->tempFile==0 ) pager_reset(pPager); +} +#endif + + +#ifndef SQLITE_OMIT_WAL +/* +** This function is called when the user invokes "PRAGMA wal_checkpoint", +** "PRAGMA wal_blocking_checkpoint" or calls the sqlite3_wal_checkpoint() +** or wal_blocking_checkpoint() API functions. +** +** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. +*/ +SQLITE_PRIVATE int sqlite3PagerCheckpoint( + Pager *pPager, /* Checkpoint on this pager */ + sqlite3 *db, /* Db handle used to check for interrupts */ + int eMode, /* Type of checkpoint */ + int *pnLog, /* OUT: Final number of frames in log */ + int *pnCkpt /* OUT: Final number of checkpointed frames */ +){ + int rc = SQLITE_OK; + if( pPager->pWal ){ + rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode, + (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), + pPager->pBusyHandlerArg, + pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, + pnLog, pnCkpt + ); + } + return rc; +} + +SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager){ + return sqlite3WalCallback(pPager->pWal); +} + +/* +** Return true if the underlying VFS for the given pager supports the +** primitives necessary for write-ahead logging. +*/ +SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager){ + const sqlite3_io_methods *pMethods = pPager->fd->pMethods; + if( pPager->noLock ) return 0; + return pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap); +} + +/* +** Attempt to take an exclusive lock on the database file. If a PENDING lock +** is obtained instead, immediately release it. +*/ +static int pagerExclusiveLock(Pager *pPager){ + int rc; /* Return code */ + + assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); + rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + /* If the attempt to grab the exclusive lock failed, release the + ** pending lock that may have been obtained instead. */ + pagerUnlockDb(pPager, SHARED_LOCK); + } + + return rc; +} + +/* +** Call sqlite3WalOpen() to open the WAL handle. If the pager is in +** exclusive-locking mode when this function is called, take an EXCLUSIVE +** lock on the database file and use heap-memory to store the wal-index +** in. Otherwise, use the normal shared-memory. +*/ +static int pagerOpenWal(Pager *pPager){ + int rc = SQLITE_OK; + + assert( pPager->pWal==0 && pPager->tempFile==0 ); + assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); + + /* If the pager is already in exclusive-mode, the WAL module will use + ** heap-memory for the wal-index instead of the VFS shared-memory + ** implementation. Take the exclusive lock now, before opening the WAL + ** file, to make sure this is safe. + */ + if( pPager->exclusiveMode ){ + rc = pagerExclusiveLock(pPager); + } + + /* Open the connection to the log file. If this operation fails, + ** (e.g. due to malloc() failure), return an error code. + */ + if( rc==SQLITE_OK ){ + rc = sqlite3WalOpen(pPager->pVfs, + pPager->fd, pPager->zWal, pPager->exclusiveMode, + pPager->journalSizeLimit, &pPager->pWal + ); + } + pagerFixMaplimit(pPager); + + return rc; +} + + +/* +** The caller must be holding a SHARED lock on the database file to call +** this function. +** +** If the pager passed as the first argument is open on a real database +** file (not a temp file or an in-memory database), and the WAL file +** is not already open, make an attempt to open it now. If successful, +** return SQLITE_OK. If an error occurs or the VFS used by the pager does +** not support the xShmXXX() methods, return an error code. *pbOpen is +** not modified in either case. +** +** If the pager is open on a temp-file (or in-memory database), or if +** the WAL file is already open, set *pbOpen to 1 and return SQLITE_OK +** without doing anything. +*/ +SQLITE_PRIVATE int sqlite3PagerOpenWal( + Pager *pPager, /* Pager object */ + int *pbOpen /* OUT: Set to true if call is a no-op */ +){ + int rc = SQLITE_OK; /* Return code */ + + assert( assert_pager_state(pPager) ); + assert( pPager->eState==PAGER_OPEN || pbOpen ); + assert( pPager->eState==PAGER_READER || !pbOpen ); + assert( pbOpen==0 || *pbOpen==0 ); + assert( pbOpen!=0 || (!pPager->tempFile && !pPager->pWal) ); + + if( !pPager->tempFile && !pPager->pWal ){ + if( !sqlite3PagerWalSupported(pPager) ) return SQLITE_CANTOPEN; + + /* Close any rollback journal previously open */ + sqlite3OsClose(pPager->jfd); + + rc = pagerOpenWal(pPager); + if( rc==SQLITE_OK ){ + pPager->journalMode = PAGER_JOURNALMODE_WAL; + pPager->eState = PAGER_OPEN; + } + }else{ + *pbOpen = 1; + } + + return rc; +} + +/* +** This function is called to close the connection to the log file prior +** to switching from WAL to rollback mode. +** +** Before closing the log file, this function attempts to take an +** EXCLUSIVE lock on the database file. If this cannot be obtained, an +** error (SQLITE_BUSY) is returned and the log connection is not closed. +** If successful, the EXCLUSIVE lock is not released before returning. +*/ +SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ + int rc = SQLITE_OK; + + assert( pPager->journalMode==PAGER_JOURNALMODE_WAL ); + + /* If the log file is not already open, but does exist in the file-system, + ** it may need to be checkpointed before the connection can switch to + ** rollback mode. Open it now so this can happen. + */ + if( !pPager->pWal ){ + int logexists = 0; + rc = pagerLockDb(pPager, SHARED_LOCK); + if( rc==SQLITE_OK ){ + rc = sqlite3OsAccess( + pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &logexists + ); + } + if( rc==SQLITE_OK && logexists ){ + rc = pagerOpenWal(pPager); + } + } + + /* Checkpoint and close the log. Because an EXCLUSIVE lock is held on + ** the database file, the log and log-summary files will be deleted. + */ + if( rc==SQLITE_OK && pPager->pWal ){ + rc = pagerExclusiveLock(pPager); + if( rc==SQLITE_OK ){ + rc = sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, + pPager->pageSize, (u8*)pPager->pTmpSpace); + pPager->pWal = 0; + pagerFixMaplimit(pPager); + if( rc && !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); + } + } + return rc; +} + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +/* +** If pager pPager is a wal-mode database not in exclusive locking mode, +** invoke the sqlite3WalWriteLock() function on the associated Wal object +** with the same db and bLock parameters as were passed to this function. +** Return an SQLite error code if an error occurs, or SQLITE_OK otherwise. +*/ +SQLITE_PRIVATE int sqlite3PagerWalWriteLock(Pager *pPager, int bLock){ + int rc = SQLITE_OK; + if( pagerUseWal(pPager) && pPager->exclusiveMode==0 ){ + rc = sqlite3WalWriteLock(pPager->pWal, bLock); + } + return rc; +} + +/* +** Set the database handle used by the wal layer to determine if +** blocking locks are required. +*/ +SQLITE_PRIVATE void sqlite3PagerWalDb(Pager *pPager, sqlite3 *db){ + if( pagerUseWal(pPager) ){ + sqlite3WalDb(pPager->pWal, db); + } +} +#endif + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** If this is a WAL database, obtain a snapshot handle for the snapshot +** currently open. Otherwise, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot){ + int rc = SQLITE_ERROR; + if( pPager->pWal ){ + rc = sqlite3WalSnapshotGet(pPager->pWal, ppSnapshot); + } + return rc; +} + +/* +** If this is a WAL database, store a pointer to pSnapshot. Next time a +** read transaction is opened, attempt to read from the snapshot it +** identifies. If this is not a WAL database, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotOpen( + Pager *pPager, + sqlite3_snapshot *pSnapshot +){ + int rc = SQLITE_OK; + if( pPager->pWal ){ + sqlite3WalSnapshotOpen(pPager->pWal, pSnapshot); + }else{ + rc = SQLITE_ERROR; + } + return rc; +} + +/* +** If this is a WAL database, call sqlite3WalSnapshotRecover(). If this +** is not a WAL database, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager){ + int rc; + if( pPager->pWal ){ + rc = sqlite3WalSnapshotRecover(pPager->pWal); + }else{ + rc = SQLITE_ERROR; + } + return rc; +} + +/* +** The caller currently has a read transaction open on the database. +** If this is not a WAL database, SQLITE_ERROR is returned. Otherwise, +** this function takes a SHARED lock on the CHECKPOINTER slot and then +** checks if the snapshot passed as the second argument is still +** available. If so, SQLITE_OK is returned. +** +** If the snapshot is not available, SQLITE_ERROR is returned. Or, if +** the CHECKPOINTER lock cannot be obtained, SQLITE_BUSY. If any error +** occurs (any value other than SQLITE_OK is returned), the CHECKPOINTER +** lock is released before returning. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot){ + int rc; + if( pPager->pWal ){ + rc = sqlite3WalSnapshotCheck(pPager->pWal, pSnapshot); + }else{ + rc = SQLITE_ERROR; + } + return rc; +} + +/* +** Release a lock obtained by an earlier successful call to +** sqlite3PagerSnapshotCheck(). +*/ +SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager){ + assert( pPager->pWal ); + sqlite3WalSnapshotUnlock(pPager->pWal); +} + +#endif /* SQLITE_ENABLE_SNAPSHOT */ +#endif /* !SQLITE_OMIT_WAL */ + +#ifdef SQLITE_ENABLE_ZIPVFS +/* +** A read-lock must be held on the pager when this function is called. If +** the pager is in WAL mode and the WAL file currently contains one or more +** frames, return the size in bytes of the page images stored within the +** WAL frames. Otherwise, if this is not a WAL database or the WAL file +** is empty, return 0. +*/ +SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ + assert( pPager->eState>=PAGER_READER ); + return sqlite3WalFramesize(pPager->pWal); +} +#endif + +#endif /* SQLITE_OMIT_DISKIO */ + +/************** End of pager.c ***********************************************/ +/************** Begin file wal.c *********************************************/ +/* +** 2010 February 1 +** +** 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 the implementation of a write-ahead log (WAL) used in +** "journal_mode=WAL" mode. +** +** WRITE-AHEAD LOG (WAL) FILE FORMAT +** +** A WAL file consists of a header followed by zero or more "frames". +** Each frame records the revised content of a single page from the +** database file. All changes to the database are recorded by writing +** frames into the WAL. Transactions commit when a frame is written that +** contains a commit marker. A single WAL can and usually does record +** multiple transactions. Periodically, the content of the WAL is +** transferred back into the database file in an operation called a +** "checkpoint". +** +** A single WAL file can be used multiple times. In other words, the +** WAL can fill up with frames and then be checkpointed and then new +** frames can overwrite the old ones. A WAL always grows from beginning +** toward the end. Checksums and counters attached to each frame are +** used to determine which frames within the WAL are valid and which +** are leftovers from prior checkpoints. +** +** The WAL header is 32 bytes in size and consists of the following eight +** big-endian 32-bit unsigned integer values: +** +** 0: Magic number. 0x377f0682 or 0x377f0683 +** 4: File format version. Currently 3007000 +** 8: Database page size. Example: 1024 +** 12: Checkpoint sequence number +** 16: Salt-1, random integer incremented with each checkpoint +** 20: Salt-2, a different random integer changing with each ckpt +** 24: Checksum-1 (first part of checksum for first 24 bytes of header). +** 28: Checksum-2 (second part of checksum for first 24 bytes of header). +** +** Immediately following the wal-header are zero or more frames. Each +** frame consists of a 24-byte frame-header followed by a bytes +** of page data. The frame-header is six big-endian 32-bit unsigned +** integer values, as follows: +** +** 0: Page number. +** 4: For commit records, the size of the database image in pages +** after the commit. For all other records, zero. +** 8: Salt-1 (copied from the header) +** 12: Salt-2 (copied from the header) +** 16: Checksum-1. +** 20: Checksum-2. +** +** A frame is considered valid if and only if the following conditions are +** true: +** +** (1) The salt-1 and salt-2 values in the frame-header match +** salt values in the wal-header +** +** (2) The checksum values in the final 8 bytes of the frame-header +** exactly match the checksum computed consecutively on the +** WAL header and the first 8 bytes and the content of all frames +** up to and including the current frame. +** +** The checksum is computed using 32-bit big-endian integers if the +** magic number in the first 4 bytes of the WAL is 0x377f0683 and it +** is computed using little-endian if the magic number is 0x377f0682. +** The checksum values are always stored in the frame header in a +** big-endian format regardless of which byte order is used to compute +** the checksum. The checksum is computed by interpreting the input as +** an even number of unsigned 32-bit integers: x[0] through x[N]. The +** algorithm used for the checksum is as follows: +** +** for i from 0 to n-1 step 2: +** s0 += x[i] + s1; +** s1 += x[i+1] + s0; +** endfor +** +** Note that s0 and s1 are both weighted checksums using fibonacci weights +** in reverse order (the largest fibonacci weight occurs on the first element +** of the sequence being summed.) The s1 value spans all 32-bit +** terms of the sequence whereas s0 omits the final term. +** +** On a checkpoint, the WAL is first VFS.xSync-ed, then valid content of the +** WAL is transferred into the database, then the database is VFS.xSync-ed. +** The VFS.xSync operations serve as write barriers - all writes launched +** before the xSync must complete before any write that launches after the +** xSync begins. +** +** After each checkpoint, the salt-1 value is incremented and the salt-2 +** value is randomized. This prevents old and new frames in the WAL from +** being considered valid at the same time and being checkpointing together +** following a crash. +** +** READER ALGORITHM +** +** To read a page from the database (call it page number P), a reader +** first checks the WAL to see if it contains page P. If so, then the +** last valid instance of page P that is a followed by a commit frame +** or is a commit frame itself becomes the value read. If the WAL +** contains no copies of page P that are valid and which are a commit +** frame or are followed by a commit frame, then page P is read from +** the database file. +** +** To start a read transaction, the reader records the index of the last +** valid frame in the WAL. The reader uses this recorded "mxFrame" value +** for all subsequent read operations. New transactions can be appended +** to the WAL, but as long as the reader uses its original mxFrame value +** and ignores the newly appended content, it will see a consistent snapshot +** of the database from a single point in time. This technique allows +** multiple concurrent readers to view different versions of the database +** content simultaneously. +** +** The reader algorithm in the previous paragraphs works correctly, but +** because frames for page P can appear anywhere within the WAL, the +** reader has to scan the entire WAL looking for page P frames. If the +** WAL is large (multiple megabytes is typical) that scan can be slow, +** and read performance suffers. To overcome this problem, a separate +** data structure called the wal-index is maintained to expedite the +** search for frames of a particular page. +** +** WAL-INDEX FORMAT +** +** Conceptually, the wal-index is shared memory, though VFS implementations +** might choose to implement the wal-index using a mmapped file. Because +** the wal-index is shared memory, SQLite does not support journal_mode=WAL +** on a network filesystem. All users of the database must be able to +** share memory. +** +** In the default unix and windows implementation, the wal-index is a mmapped +** file whose name is the database name with a "-shm" suffix added. For that +** reason, the wal-index is sometimes called the "shm" file. +** +** The wal-index is transient. After a crash, the wal-index can (and should +** be) reconstructed from the original WAL file. In fact, the VFS is required +** to either truncate or zero the header of the wal-index when the last +** connection to it closes. Because the wal-index is transient, it can +** use an architecture-specific format; it does not have to be cross-platform. +** Hence, unlike the database and WAL file formats which store all values +** as big endian, the wal-index can store multi-byte values in the native +** byte order of the host computer. +** +** The purpose of the wal-index is to answer this question quickly: Given +** a page number P and a maximum frame index M, return the index of the +** last frame in the wal before frame M for page P in the WAL, or return +** NULL if there are no frames for page P in the WAL prior to M. +** +** The wal-index consists of a header region, followed by an one or +** more index blocks. +** +** The wal-index header contains the total number of frames within the WAL +** in the mxFrame field. +** +** Each index block except for the first contains information on +** HASHTABLE_NPAGE frames. The first index block contains information on +** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and +** HASHTABLE_NPAGE are selected so that together the wal-index header and +** first index block are the same size as all other index blocks in the +** wal-index. +** +** Each index block contains two sections, a page-mapping that contains the +** database page number associated with each wal frame, and a hash-table +** that allows readers to query an index block for a specific page number. +** The page-mapping is an array of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE +** for the first index block) 32-bit page numbers. The first entry in the +** first index-block contains the database page number corresponding to the +** first frame in the WAL file. The first entry in the second index block +** in the WAL file corresponds to the (HASHTABLE_NPAGE_ONE+1)th frame in +** the log, and so on. +** +** The last index block in a wal-index usually contains less than the full +** complement of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE) page-numbers, +** depending on the contents of the WAL file. This does not change the +** allocated size of the page-mapping array - the page-mapping array merely +** contains unused entries. +** +** Even without using the hash table, the last frame for page P +** can be found by scanning the page-mapping sections of each index block +** starting with the last index block and moving toward the first, and +** within each index block, starting at the end and moving toward the +** beginning. The first entry that equals P corresponds to the frame +** holding the content for that page. +** +** The hash table consists of HASHTABLE_NSLOT 16-bit unsigned integers. +** HASHTABLE_NSLOT = 2*HASHTABLE_NPAGE, and there is one entry in the +** hash table for each page number in the mapping section, so the hash +** table is never more than half full. The expected number of collisions +** prior to finding a match is 1. Each entry of the hash table is an +** 1-based index of an entry in the mapping section of the same +** index block. Let K be the 1-based index of the largest entry in +** the mapping section. (For index blocks other than the last, K will +** always be exactly HASHTABLE_NPAGE (4096) and for the last index block +** K will be (mxFrame%HASHTABLE_NPAGE).) Unused slots of the hash table +** contain a value of 0. +** +** To look for page P in the hash table, first compute a hash iKey on +** P as follows: +** +** iKey = (P * 383) % HASHTABLE_NSLOT +** +** Then start scanning entries of the hash table, starting with iKey +** (wrapping around to the beginning when the end of the hash table is +** reached) until an unused hash slot is found. Let the first unused slot +** be at index iUnused. (iUnused might be less than iKey if there was +** wrap-around.) Because the hash table is never more than half full, +** the search is guaranteed to eventually hit an unused entry. Let +** iMax be the value between iKey and iUnused, closest to iUnused, +** where aHash[iMax]==P. If there is no iMax entry (if there exists +** no hash slot such that aHash[i]==p) then page P is not in the +** current index block. Otherwise the iMax-th mapping entry of the +** current index block corresponds to the last entry that references +** page P. +** +** A hash search begins with the last index block and moves toward the +** first index block, looking for entries corresponding to page P. On +** average, only two or three slots in each index block need to be +** examined in order to either find the last entry for page P, or to +** establish that no such entry exists in the block. Each index block +** holds over 4000 entries. So two or three index blocks are sufficient +** to cover a typical 10 megabyte WAL file, assuming 1K pages. 8 or 10 +** comparisons (on average) suffice to either locate a frame in the +** WAL or to establish that the frame does not exist in the WAL. This +** is much faster than scanning the entire 10MB WAL. +** +** Note that entries are added in order of increasing K. Hence, one +** reader might be using some value K0 and a second reader that started +** at a later time (after additional transactions were added to the WAL +** and to the wal-index) might be using a different value K1, where K1>K0. +** Both readers can use the same hash table and mapping section to get +** the correct result. There may be entries in the hash table with +** K>K0 but to the first reader, those entries will appear to be unused +** slots in the hash table and so the first reader will get an answer as +** if no values greater than K0 had ever been inserted into the hash table +** in the first place - which is what reader one wants. Meanwhile, the +** second reader using K1 will see additional values that were inserted +** later, which is exactly what reader two wants. +** +** When a rollback occurs, the value of K is decreased. Hash table entries +** that correspond to frames greater than the new K value are removed +** from the hash table at this point. +*/ +#ifndef SQLITE_OMIT_WAL + +/* #include "wal.h" */ + +/* +** Trace output macros +*/ +#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) +SQLITE_PRIVATE int sqlite3WalTrace = 0; +# define WALTRACE(X) if(sqlite3WalTrace) sqlite3DebugPrintf X +#else +# define WALTRACE(X) +#endif + +/* +** The maximum (and only) versions of the wal and wal-index formats +** that may be interpreted by this version of SQLite. +** +** If a client begins recovering a WAL file and finds that (a) the checksum +** values in the wal-header are correct and (b) the version field is not +** WAL_MAX_VERSION, recovery fails and SQLite returns SQLITE_CANTOPEN. +** +** Similarly, if a client successfully reads a wal-index header (i.e. the +** checksum test is successful) and finds that the version field is not +** WALINDEX_MAX_VERSION, then no read-transaction is opened and SQLite +** returns SQLITE_CANTOPEN. +*/ +#define WAL_MAX_VERSION 3007000 +#define WALINDEX_MAX_VERSION 3007000 + +/* +** Index numbers for various locking bytes. WAL_NREADER is the number +** of available reader locks and should be at least 3. The default +** is SQLITE_SHM_NLOCK==8 and WAL_NREADER==5. +** +** Technically, the various VFSes are free to implement these locks however +** they see fit. However, compatibility is encouraged so that VFSes can +** interoperate. The standard implemention used on both unix and windows +** is for the index number to indicate a byte offset into the +** WalCkptInfo.aLock[] array in the wal-index header. In other words, all +** locks are on the shm file. The WALINDEX_LOCK_OFFSET constant (which +** should be 120) is the location in the shm file for the first locking +** byte. +*/ +#define WAL_WRITE_LOCK 0 +#define WAL_ALL_BUT_WRITE 1 +#define WAL_CKPT_LOCK 1 +#define WAL_RECOVER_LOCK 2 +#define WAL_READ_LOCK(I) (3+(I)) +#define WAL_NREADER (SQLITE_SHM_NLOCK-3) + + +/* Object declarations */ +typedef struct WalIndexHdr WalIndexHdr; +typedef struct WalIterator WalIterator; +typedef struct WalCkptInfo WalCkptInfo; + + +/* +** The following object holds a copy of the wal-index header content. +** +** The actual header in the wal-index consists of two copies of this +** object followed by one instance of the WalCkptInfo object. +** For all versions of SQLite through 3.10.0 and probably beyond, +** the locking bytes (WalCkptInfo.aLock) start at offset 120 and +** the total header size is 136 bytes. +** +** The szPage value can be any power of 2 between 512 and 32768, inclusive. +** Or it can be 1 to represent a 65536-byte page. The latter case was +** added in 3.7.1 when support for 64K pages was added. +*/ +struct WalIndexHdr { + u32 iVersion; /* Wal-index version */ + u32 unused; /* Unused (padding) field */ + u32 iChange; /* Counter incremented each transaction */ + u8 isInit; /* 1 when initialized */ + u8 bigEndCksum; /* True if checksums in WAL are big-endian */ + u16 szPage; /* Database page size in bytes. 1==64K */ + u32 mxFrame; /* Index of last valid frame in the WAL */ + u32 nPage; /* Size of database in pages */ + u32 aFrameCksum[2]; /* Checksum of last frame in log */ + u32 aSalt[2]; /* Two salt values copied from WAL header */ + u32 aCksum[2]; /* Checksum over all prior fields */ +}; + +/* +** A copy of the following object occurs in the wal-index immediately +** following the second copy of the WalIndexHdr. This object stores +** information used by checkpoint. +** +** nBackfill is the number of frames in the WAL that have been written +** back into the database. (We call the act of moving content from WAL to +** database "backfilling".) The nBackfill number is never greater than +** WalIndexHdr.mxFrame. nBackfill can only be increased by threads +** holding the WAL_CKPT_LOCK lock (which includes a recovery thread). +** However, a WAL_WRITE_LOCK thread can move the value of nBackfill from +** mxFrame back to zero when the WAL is reset. +** +** nBackfillAttempted is the largest value of nBackfill that a checkpoint +** has attempted to achieve. Normally nBackfill==nBackfillAtempted, however +** the nBackfillAttempted is set before any backfilling is done and the +** nBackfill is only set after all backfilling completes. So if a checkpoint +** crashes, nBackfillAttempted might be larger than nBackfill. The +** WalIndexHdr.mxFrame must never be less than nBackfillAttempted. +** +** The aLock[] field is a set of bytes used for locking. These bytes should +** never be read or written. +** +** There is one entry in aReadMark[] for each reader lock. If a reader +** holds read-lock K, then the value in aReadMark[K] is no greater than +** the mxFrame for that reader. The value READMARK_NOT_USED (0xffffffff) +** for any aReadMark[] means that entry is unused. aReadMark[0] is +** a special case; its value is never used and it exists as a place-holder +** to avoid having to offset aReadMark[] indexs by one. Readers holding +** WAL_READ_LOCK(0) always ignore the entire WAL and read all content +** directly from the database. +** +** The value of aReadMark[K] may only be changed by a thread that +** is holding an exclusive lock on WAL_READ_LOCK(K). Thus, the value of +** aReadMark[K] cannot changed while there is a reader is using that mark +** since the reader will be holding a shared lock on WAL_READ_LOCK(K). +** +** The checkpointer may only transfer frames from WAL to database where +** the frame numbers are less than or equal to every aReadMark[] that is +** in use (that is, every aReadMark[j] for which there is a corresponding +** WAL_READ_LOCK(j)). New readers (usually) pick the aReadMark[] with the +** largest value and will increase an unused aReadMark[] to mxFrame if there +** is not already an aReadMark[] equal to mxFrame. The exception to the +** previous sentence is when nBackfill equals mxFrame (meaning that everything +** in the WAL has been backfilled into the database) then new readers +** will choose aReadMark[0] which has value 0 and hence such reader will +** get all their all content directly from the database file and ignore +** the WAL. +** +** Writers normally append new frames to the end of the WAL. However, +** if nBackfill equals mxFrame (meaning that all WAL content has been +** written back into the database) and if no readers are using the WAL +** (in other words, if there are no WAL_READ_LOCK(i) where i>0) then +** the writer will first "reset" the WAL back to the beginning and start +** writing new content beginning at frame 1. +** +** We assume that 32-bit loads are atomic and so no locks are needed in +** order to read from any aReadMark[] entries. +*/ +struct WalCkptInfo { + u32 nBackfill; /* Number of WAL frames backfilled into DB */ + u32 aReadMark[WAL_NREADER]; /* Reader marks */ + u8 aLock[SQLITE_SHM_NLOCK]; /* Reserved space for locks */ + u32 nBackfillAttempted; /* WAL frames perhaps written, or maybe not */ + u32 notUsed0; /* Available for future enhancements */ +}; +#define READMARK_NOT_USED 0xffffffff + + +/* A block of WALINDEX_LOCK_RESERVED bytes beginning at +** WALINDEX_LOCK_OFFSET is reserved for locks. Since some systems +** only support mandatory file-locks, we do not read or write data +** from the region of the file on which locks are applied. +*/ +#define WALINDEX_LOCK_OFFSET (sizeof(WalIndexHdr)*2+offsetof(WalCkptInfo,aLock)) +#define WALINDEX_HDR_SIZE (sizeof(WalIndexHdr)*2+sizeof(WalCkptInfo)) + +/* Size of header before each frame in wal */ +#define WAL_FRAME_HDRSIZE 24 + +/* Size of write ahead log header, including checksum. */ +#define WAL_HDRSIZE 32 + +/* WAL magic value. Either this value, or the same value with the least +** significant bit also set (WAL_MAGIC | 0x00000001) is stored in 32-bit +** big-endian format in the first 4 bytes of a WAL file. +** +** If the LSB is set, then the checksums for each frame within the WAL +** file are calculated by treating all data as an array of 32-bit +** big-endian words. Otherwise, they are calculated by interpreting +** all data as 32-bit little-endian words. +*/ +#define WAL_MAGIC 0x377f0682 + +/* +** Return the offset of frame iFrame in the write-ahead log file, +** assuming a database page size of szPage bytes. The offset returned +** is to the start of the write-ahead log frame-header. +*/ +#define walFrameOffset(iFrame, szPage) ( \ + WAL_HDRSIZE + ((iFrame)-1)*(i64)((szPage)+WAL_FRAME_HDRSIZE) \ +) + +/* +** An open write-ahead log file is represented by an instance of the +** following object. +*/ +struct Wal { + sqlite3_vfs *pVfs; /* The VFS used to create pDbFd */ + sqlite3_file *pDbFd; /* File handle for the database file */ + sqlite3_file *pWalFd; /* File handle for WAL file */ + u32 iCallback; /* Value to pass to log callback (or 0) */ + i64 mxWalSize; /* Truncate WAL to this size upon reset */ + int nWiData; /* Size of array apWiData */ + int szFirstBlock; /* Size of first block written to WAL file */ + volatile u32 **apWiData; /* Pointer to wal-index content in memory */ + u32 szPage; /* Database page size */ + i16 readLock; /* Which read lock is being held. -1 for none */ + u8 syncFlags; /* Flags to use to sync header writes */ + u8 exclusiveMode; /* Non-zero if connection is in exclusive mode */ + u8 writeLock; /* True if in a write transaction */ + u8 ckptLock; /* True if holding a checkpoint lock */ + u8 readOnly; /* WAL_RDWR, WAL_RDONLY, or WAL_SHM_RDONLY */ + u8 truncateOnCommit; /* True to truncate WAL file on commit */ + u8 syncHeader; /* Fsync the WAL header if true */ + u8 padToSectorBoundary; /* Pad transactions out to the next sector */ + u8 bShmUnreliable; /* SHM content is read-only and unreliable */ + WalIndexHdr hdr; /* Wal-index header for current transaction */ + u32 minFrame; /* Ignore wal frames before this one */ + u32 iReCksum; /* On commit, recalculate checksums from here */ + const char *zWalName; /* Name of WAL file */ + u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ +#ifdef SQLITE_DEBUG + u8 lockError; /* True if a locking error has occurred */ +#endif +#ifdef SQLITE_ENABLE_SNAPSHOT + WalIndexHdr *pSnapshot; /* Start transaction here if not NULL */ +#endif +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + sqlite3 *db; +#endif +}; + +/* +** Candidate values for Wal.exclusiveMode. +*/ +#define WAL_NORMAL_MODE 0 +#define WAL_EXCLUSIVE_MODE 1 +#define WAL_HEAPMEMORY_MODE 2 + +/* +** Possible values for WAL.readOnly +*/ +#define WAL_RDWR 0 /* Normal read/write connection */ +#define WAL_RDONLY 1 /* The WAL file is readonly */ +#define WAL_SHM_RDONLY 2 /* The SHM file is readonly */ + +/* +** Each page of the wal-index mapping contains a hash-table made up of +** an array of HASHTABLE_NSLOT elements of the following type. +*/ +typedef u16 ht_slot; + +/* +** This structure is used to implement an iterator that loops through +** all frames in the WAL in database page order. Where two or more frames +** correspond to the same database page, the iterator visits only the +** frame most recently written to the WAL (in other words, the frame with +** the largest index). +** +** The internals of this structure are only accessed by: +** +** walIteratorInit() - Create a new iterator, +** walIteratorNext() - Step an iterator, +** walIteratorFree() - Free an iterator. +** +** This functionality is used by the checkpoint code (see walCheckpoint()). +*/ +struct WalIterator { + int iPrior; /* Last result returned from the iterator */ + int nSegment; /* Number of entries in aSegment[] */ + struct WalSegment { + int iNext; /* Next slot in aIndex[] not yet returned */ + ht_slot *aIndex; /* i0, i1, i2... such that aPgno[iN] ascend */ + u32 *aPgno; /* Array of page numbers. */ + int nEntry; /* Nr. of entries in aPgno[] and aIndex[] */ + int iZero; /* Frame number associated with aPgno[0] */ + } aSegment[1]; /* One for every 32KB page in the wal-index */ +}; + +/* +** Define the parameters of the hash tables in the wal-index file. There +** is a hash-table following every HASHTABLE_NPAGE page numbers in the +** wal-index. +** +** Changing any of these constants will alter the wal-index format and +** create incompatibilities. +*/ +#define HASHTABLE_NPAGE 4096 /* Must be power of 2 */ +#define HASHTABLE_HASH_1 383 /* Should be prime */ +#define HASHTABLE_NSLOT (HASHTABLE_NPAGE*2) /* Must be a power of 2 */ + +/* +** The block of page numbers associated with the first hash-table in a +** wal-index is smaller than usual. This is so that there is a complete +** hash-table on each aligned 32KB page of the wal-index. +*/ +#define HASHTABLE_NPAGE_ONE (HASHTABLE_NPAGE - (WALINDEX_HDR_SIZE/sizeof(u32))) + +/* The wal-index is divided into pages of WALINDEX_PGSZ bytes each. */ +#define WALINDEX_PGSZ ( \ + sizeof(ht_slot)*HASHTABLE_NSLOT + HASHTABLE_NPAGE*sizeof(u32) \ +) + +/* +** Obtain a pointer to the iPage'th page of the wal-index. The wal-index +** is broken into pages of WALINDEX_PGSZ bytes. Wal-index pages are +** numbered from zero. +** +** If the wal-index is currently smaller the iPage pages then the size +** of the wal-index might be increased, but only if it is safe to do +** so. It is safe to enlarge the wal-index if pWal->writeLock is true +** or pWal->exclusiveMode==WAL_HEAPMEMORY_MODE. +** +** If this call is successful, *ppPage is set to point to the wal-index +** page and SQLITE_OK is returned. If an error (an OOM or VFS error) occurs, +** then an SQLite error code is returned and *ppPage is set to 0. +*/ +static SQLITE_NOINLINE int walIndexPageRealloc( + Wal *pWal, /* The WAL context */ + int iPage, /* The page we seek */ + volatile u32 **ppPage /* Write the page pointer here */ +){ + int rc = SQLITE_OK; + + /* Enlarge the pWal->apWiData[] array if required */ + if( pWal->nWiData<=iPage ){ + sqlite3_int64 nByte = sizeof(u32*)*(iPage+1); + volatile u32 **apNew; + apNew = (volatile u32 **)sqlite3Realloc((void *)pWal->apWiData, nByte); + if( !apNew ){ + *ppPage = 0; + return SQLITE_NOMEM_BKPT; + } + memset((void*)&apNew[pWal->nWiData], 0, + sizeof(u32*)*(iPage+1-pWal->nWiData)); + pWal->apWiData = apNew; + pWal->nWiData = iPage+1; + } + + /* Request a pointer to the required page from the VFS */ + assert( pWal->apWiData[iPage]==0 ); + if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){ + pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ); + if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM_BKPT; + }else{ + rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ, + pWal->writeLock, (void volatile **)&pWal->apWiData[iPage] + ); + assert( pWal->apWiData[iPage]!=0 || rc!=SQLITE_OK || pWal->writeLock==0 ); + testcase( pWal->apWiData[iPage]==0 && rc==SQLITE_OK ); + if( (rc&0xff)==SQLITE_READONLY ){ + pWal->readOnly |= WAL_SHM_RDONLY; + if( rc==SQLITE_READONLY ){ + rc = SQLITE_OK; + } + } + } + + *ppPage = pWal->apWiData[iPage]; + assert( iPage==0 || *ppPage || rc!=SQLITE_OK ); + return rc; +} +static int walIndexPage( + Wal *pWal, /* The WAL context */ + int iPage, /* The page we seek */ + volatile u32 **ppPage /* Write the page pointer here */ +){ + if( pWal->nWiData<=iPage || (*ppPage = pWal->apWiData[iPage])==0 ){ + return walIndexPageRealloc(pWal, iPage, ppPage); + } + return SQLITE_OK; +} + +/* +** Return a pointer to the WalCkptInfo structure in the wal-index. +*/ +static volatile WalCkptInfo *walCkptInfo(Wal *pWal){ + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + return (volatile WalCkptInfo*)&(pWal->apWiData[0][sizeof(WalIndexHdr)/2]); +} + +/* +** Return a pointer to the WalIndexHdr structure in the wal-index. +*/ +static volatile WalIndexHdr *walIndexHdr(Wal *pWal){ + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + return (volatile WalIndexHdr*)pWal->apWiData[0]; +} + +/* +** The argument to this macro must be of type u32. On a little-endian +** architecture, it returns the u32 value that results from interpreting +** the 4 bytes as a big-endian value. On a big-endian architecture, it +** returns the value that would be produced by interpreting the 4 bytes +** of the input value as a little-endian integer. +*/ +#define BYTESWAP32(x) ( \ + (((x)&0x000000FF)<<24) + (((x)&0x0000FF00)<<8) \ + + (((x)&0x00FF0000)>>8) + (((x)&0xFF000000)>>24) \ +) + +/* +** Generate or extend an 8 byte checksum based on the data in +** array aByte[] and the initial values of aIn[0] and aIn[1] (or +** initial values of 0 and 0 if aIn==NULL). +** +** The checksum is written back into aOut[] before returning. +** +** nByte must be a positive multiple of 8. +*/ +static void walChecksumBytes( + int nativeCksum, /* True for native byte-order, false for non-native */ + u8 *a, /* Content to be checksummed */ + int nByte, /* Bytes of content in a[]. Must be a multiple of 8. */ + const u32 *aIn, /* Initial checksum value input */ + u32 *aOut /* OUT: Final checksum value output */ +){ + u32 s1, s2; + u32 *aData = (u32 *)a; + u32 *aEnd = (u32 *)&a[nByte]; + + if( aIn ){ + s1 = aIn[0]; + s2 = aIn[1]; + }else{ + s1 = s2 = 0; + } + + assert( nByte>=8 ); + assert( (nByte&0x00000007)==0 ); + assert( nByte<=65536 ); + + if( nativeCksum ){ + do { + s1 += *aData++ + s2; + s2 += *aData++ + s1; + }while( aDataexclusiveMode!=WAL_HEAPMEMORY_MODE ){ + sqlite3OsShmBarrier(pWal->pDbFd); + } +} + +/* +** Add the SQLITE_NO_TSAN as part of the return-type of a function +** definition as a hint that the function contains constructs that +** might give false-positive TSAN warnings. +** +** See tag-20200519-1. +*/ +#if defined(__clang__) && !defined(SQLITE_NO_TSAN) +# define SQLITE_NO_TSAN __attribute__((no_sanitize_thread)) +#else +# define SQLITE_NO_TSAN +#endif + +/* +** Write the header information in pWal->hdr into the wal-index. +** +** The checksum on pWal->hdr is updated before it is written. +*/ +static SQLITE_NO_TSAN void walIndexWriteHdr(Wal *pWal){ + volatile WalIndexHdr *aHdr = walIndexHdr(pWal); + const int nCksum = offsetof(WalIndexHdr, aCksum); + + assert( pWal->writeLock ); + pWal->hdr.isInit = 1; + pWal->hdr.iVersion = WALINDEX_MAX_VERSION; + walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum); + /* Possible TSAN false-positive. See tag-20200519-1 */ + memcpy((void*)&aHdr[1], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); + walShmBarrier(pWal); + memcpy((void*)&aHdr[0], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); +} + +/* +** This function encodes a single frame header and writes it to a buffer +** supplied by the caller. A frame-header is made up of a series of +** 4-byte big-endian integers, as follows: +** +** 0: Page number. +** 4: For commit records, the size of the database image in pages +** after the commit. For all other records, zero. +** 8: Salt-1 (copied from the wal-header) +** 12: Salt-2 (copied from the wal-header) +** 16: Checksum-1. +** 20: Checksum-2. +*/ +static void walEncodeFrame( + Wal *pWal, /* The write-ahead log */ + u32 iPage, /* Database page number for frame */ + u32 nTruncate, /* New db size (or 0 for non-commit frames) */ + u8 *aData, /* Pointer to page data */ + u8 *aFrame /* OUT: Write encoded frame here */ +){ + int nativeCksum; /* True for native byte-order checksums */ + u32 *aCksum = pWal->hdr.aFrameCksum; + assert( WAL_FRAME_HDRSIZE==24 ); + sqlite3Put4byte(&aFrame[0], iPage); + sqlite3Put4byte(&aFrame[4], nTruncate); + if( pWal->iReCksum==0 ){ + memcpy(&aFrame[8], pWal->hdr.aSalt, 8); + + nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); + walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); + walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + + sqlite3Put4byte(&aFrame[16], aCksum[0]); + sqlite3Put4byte(&aFrame[20], aCksum[1]); + }else{ + memset(&aFrame[8], 0, 16); + } +} + +/* +** Check to see if the frame with header in aFrame[] and content +** in aData[] is valid. If it is a valid frame, fill *piPage and +** *pnTruncate and return true. Return if the frame is not valid. +*/ +static int walDecodeFrame( + Wal *pWal, /* The write-ahead log */ + u32 *piPage, /* OUT: Database page number for frame */ + u32 *pnTruncate, /* OUT: New db size (or 0 if not commit) */ + u8 *aData, /* Pointer to page data (for checksum) */ + u8 *aFrame /* Frame data */ +){ + int nativeCksum; /* True for native byte-order checksums */ + u32 *aCksum = pWal->hdr.aFrameCksum; + u32 pgno; /* Page number of the frame */ + assert( WAL_FRAME_HDRSIZE==24 ); + + /* A frame is only valid if the salt values in the frame-header + ** match the salt values in the wal-header. + */ + if( memcmp(&pWal->hdr.aSalt, &aFrame[8], 8)!=0 ){ + return 0; + } + + /* A frame is only valid if the page number is creater than zero. + */ + pgno = sqlite3Get4byte(&aFrame[0]); + if( pgno==0 ){ + return 0; + } + + /* A frame is only valid if a checksum of the WAL header, + ** all prior frams, the first 16 bytes of this frame-header, + ** and the frame-data matches the checksum in the last 8 + ** bytes of this frame-header. + */ + nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); + walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); + walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + if( aCksum[0]!=sqlite3Get4byte(&aFrame[16]) + || aCksum[1]!=sqlite3Get4byte(&aFrame[20]) + ){ + /* Checksum failed. */ + return 0; + } + + /* If we reach this point, the frame is valid. Return the page number + ** and the new database size. + */ + *piPage = pgno; + *pnTruncate = sqlite3Get4byte(&aFrame[4]); + return 1; +} + + +#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) +/* +** Names of locks. This routine is used to provide debugging output and is not +** a part of an ordinary build. +*/ +static const char *walLockName(int lockIdx){ + if( lockIdx==WAL_WRITE_LOCK ){ + return "WRITE-LOCK"; + }else if( lockIdx==WAL_CKPT_LOCK ){ + return "CKPT-LOCK"; + }else if( lockIdx==WAL_RECOVER_LOCK ){ + return "RECOVER-LOCK"; + }else{ + static char zName[15]; + sqlite3_snprintf(sizeof(zName), zName, "READ-LOCK[%d]", + lockIdx-WAL_READ_LOCK(0)); + return zName; + } +} +#endif /*defined(SQLITE_TEST) || defined(SQLITE_DEBUG) */ + + +/* +** Set or release locks on the WAL. Locks are either shared or exclusive. +** A lock cannot be moved directly between shared and exclusive - it must go +** through the unlocked state first. +** +** In locking_mode=EXCLUSIVE, all of these routines become no-ops. +*/ +static int walLockShared(Wal *pWal, int lockIdx){ + int rc; + if( pWal->exclusiveMode ) return SQLITE_OK; + rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, + SQLITE_SHM_LOCK | SQLITE_SHM_SHARED); + WALTRACE(("WAL%p: acquire SHARED-%s %s\n", pWal, + walLockName(lockIdx), rc ? "failed" : "ok")); + VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) + return rc; +} +static void walUnlockShared(Wal *pWal, int lockIdx){ + if( pWal->exclusiveMode ) return; + (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, + SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED); + WALTRACE(("WAL%p: release SHARED-%s\n", pWal, walLockName(lockIdx))); +} +static int walLockExclusive(Wal *pWal, int lockIdx, int n){ + int rc; + if( pWal->exclusiveMode ) return SQLITE_OK; + rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, + SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE); + WALTRACE(("WAL%p: acquire EXCLUSIVE-%s cnt=%d %s\n", pWal, + walLockName(lockIdx), n, rc ? "failed" : "ok")); + VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) + return rc; +} +static void walUnlockExclusive(Wal *pWal, int lockIdx, int n){ + if( pWal->exclusiveMode ) return; + (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, + SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE); + WALTRACE(("WAL%p: release EXCLUSIVE-%s cnt=%d\n", pWal, + walLockName(lockIdx), n)); +} + +/* +** Compute a hash on a page number. The resulting hash value must land +** between 0 and (HASHTABLE_NSLOT-1). The walHashNext() function advances +** the hash to the next value in the event of a collision. +*/ +static int walHash(u32 iPage){ + assert( iPage>0 ); + assert( (HASHTABLE_NSLOT & (HASHTABLE_NSLOT-1))==0 ); + return (iPage*HASHTABLE_HASH_1) & (HASHTABLE_NSLOT-1); +} +static int walNextHash(int iPriorHash){ + return (iPriorHash+1)&(HASHTABLE_NSLOT-1); +} + +/* +** An instance of the WalHashLoc object is used to describe the location +** of a page hash table in the wal-index. This becomes the return value +** from walHashGet(). +*/ +typedef struct WalHashLoc WalHashLoc; +struct WalHashLoc { + volatile ht_slot *aHash; /* Start of the wal-index hash table */ + volatile u32 *aPgno; /* aPgno[1] is the page of first frame indexed */ + u32 iZero; /* One less than the frame number of first indexed*/ +}; + +/* +** Return pointers to the hash table and page number array stored on +** page iHash of the wal-index. The wal-index is broken into 32KB pages +** numbered starting from 0. +** +** Set output variable pLoc->aHash to point to the start of the hash table +** in the wal-index file. Set pLoc->iZero to one less than the frame +** number of the first frame indexed by this hash table. If a +** slot in the hash table is set to N, it refers to frame number +** (pLoc->iZero+N) in the log. +** +** Finally, set pLoc->aPgno so that pLoc->aPgno[1] is the page number of the +** first frame indexed by the hash table, frame (pLoc->iZero+1). +*/ +static int walHashGet( + Wal *pWal, /* WAL handle */ + int iHash, /* Find the iHash'th table */ + WalHashLoc *pLoc /* OUT: Hash table location */ +){ + int rc; /* Return code */ + + rc = walIndexPage(pWal, iHash, &pLoc->aPgno); + assert( rc==SQLITE_OK || iHash>0 ); + + if( rc==SQLITE_OK ){ + pLoc->aHash = (volatile ht_slot *)&pLoc->aPgno[HASHTABLE_NPAGE]; + if( iHash==0 ){ + pLoc->aPgno = &pLoc->aPgno[WALINDEX_HDR_SIZE/sizeof(u32)]; + pLoc->iZero = 0; + }else{ + pLoc->iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE; + } + pLoc->aPgno = &pLoc->aPgno[-1]; + } + return rc; +} + +/* +** Return the number of the wal-index page that contains the hash-table +** and page-number array that contain entries corresponding to WAL frame +** iFrame. The wal-index is broken up into 32KB pages. Wal-index pages +** are numbered starting from 0. +*/ +static int walFramePage(u32 iFrame){ + int iHash = (iFrame+HASHTABLE_NPAGE-HASHTABLE_NPAGE_ONE-1) / HASHTABLE_NPAGE; + assert( (iHash==0 || iFrame>HASHTABLE_NPAGE_ONE) + && (iHash>=1 || iFrame<=HASHTABLE_NPAGE_ONE) + && (iHash<=1 || iFrame>(HASHTABLE_NPAGE_ONE+HASHTABLE_NPAGE)) + && (iHash>=2 || iFrame<=HASHTABLE_NPAGE_ONE+HASHTABLE_NPAGE) + && (iHash<=2 || iFrame>(HASHTABLE_NPAGE_ONE+2*HASHTABLE_NPAGE)) + ); + return iHash; +} + +/* +** Return the page number associated with frame iFrame in this WAL. +*/ +static u32 walFramePgno(Wal *pWal, u32 iFrame){ + int iHash = walFramePage(iFrame); + if( iHash==0 ){ + return pWal->apWiData[0][WALINDEX_HDR_SIZE/sizeof(u32) + iFrame - 1]; + } + return pWal->apWiData[iHash][(iFrame-1-HASHTABLE_NPAGE_ONE)%HASHTABLE_NPAGE]; +} + +/* +** Remove entries from the hash table that point to WAL slots greater +** than pWal->hdr.mxFrame. +** +** This function is called whenever pWal->hdr.mxFrame is decreased due +** to a rollback or savepoint. +** +** At most only the hash table containing pWal->hdr.mxFrame needs to be +** updated. Any later hash tables will be automatically cleared when +** pWal->hdr.mxFrame advances to the point where those hash tables are +** actually needed. +*/ +static void walCleanupHash(Wal *pWal){ + WalHashLoc sLoc; /* Hash table location */ + int iLimit = 0; /* Zero values greater than this */ + int nByte; /* Number of bytes to zero in aPgno[] */ + int i; /* Used to iterate through aHash[] */ + int rc; /* Return code form walHashGet() */ + + assert( pWal->writeLock ); + testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE-1 ); + testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE ); + testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE+1 ); + + if( pWal->hdr.mxFrame==0 ) return; + + /* Obtain pointers to the hash-table and page-number array containing + ** the entry that corresponds to frame pWal->hdr.mxFrame. It is guaranteed + ** that the page said hash-table and array reside on is already mapped.(1) + */ + assert( pWal->nWiData>walFramePage(pWal->hdr.mxFrame) ); + assert( pWal->apWiData[walFramePage(pWal->hdr.mxFrame)] ); + rc = walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &sLoc); + if( NEVER(rc) ) return; /* Defense-in-depth, in case (1) above is wrong */ + + /* Zero all hash-table entries that correspond to frame numbers greater + ** than pWal->hdr.mxFrame. + */ + iLimit = pWal->hdr.mxFrame - sLoc.iZero; + assert( iLimit>0 ); + for(i=0; iiLimit ){ + sLoc.aHash[i] = 0; + } + } + + /* Zero the entries in the aPgno array that correspond to frames with + ** frame numbers greater than pWal->hdr.mxFrame. + */ + nByte = (int)((char *)sLoc.aHash - (char *)&sLoc.aPgno[iLimit+1]); + memset((void *)&sLoc.aPgno[iLimit+1], 0, nByte); + +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT + /* Verify that the every entry in the mapping region is still reachable + ** via the hash table even after the cleanup. + */ + if( iLimit ){ + int j; /* Loop counter */ + int iKey; /* Hash key */ + for(j=1; j<=iLimit; j++){ + for(iKey=walHash(sLoc.aPgno[j]);sLoc.aHash[iKey];iKey=walNextHash(iKey)){ + if( sLoc.aHash[iKey]==j ) break; + } + assert( sLoc.aHash[iKey]==j ); + } + } +#endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */ +} + + +/* +** Set an entry in the wal-index that will map database page number +** pPage into WAL frame iFrame. +*/ +static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ + int rc; /* Return code */ + WalHashLoc sLoc; /* Wal-index hash table location */ + + rc = walHashGet(pWal, walFramePage(iFrame), &sLoc); + + /* Assuming the wal-index file was successfully mapped, populate the + ** page number array and hash table entry. + */ + if( rc==SQLITE_OK ){ + int iKey; /* Hash table key */ + int idx; /* Value to write to hash-table slot */ + int nCollide; /* Number of hash collisions */ + + idx = iFrame - sLoc.iZero; + assert( idx <= HASHTABLE_NSLOT/2 + 1 ); + + /* If this is the first entry to be added to this hash-table, zero the + ** entire hash table and aPgno[] array before proceeding. + */ + if( idx==1 ){ + int nByte = (int)((u8 *)&sLoc.aHash[HASHTABLE_NSLOT] + - (u8 *)&sLoc.aPgno[1]); + memset((void*)&sLoc.aPgno[1], 0, nByte); + } + + /* If the entry in aPgno[] is already set, then the previous writer + ** must have exited unexpectedly in the middle of a transaction (after + ** writing one or more dirty pages to the WAL to free up memory). + ** Remove the remnants of that writers uncommitted transaction from + ** the hash-table before writing any new entries. + */ + if( sLoc.aPgno[idx] ){ + walCleanupHash(pWal); + assert( !sLoc.aPgno[idx] ); + } + + /* Write the aPgno[] array entry and the hash-table slot. */ + nCollide = idx; + for(iKey=walHash(iPage); sLoc.aHash[iKey]; iKey=walNextHash(iKey)){ + if( (nCollide--)==0 ) return SQLITE_CORRUPT_BKPT; + } + sLoc.aPgno[idx] = iPage; + sLoc.aHash[iKey] = (ht_slot)idx; + +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT + /* Verify that the number of entries in the hash table exactly equals + ** the number of entries in the mapping region. + */ + { + int i; /* Loop counter */ + int nEntry = 0; /* Number of entries in the hash table */ + for(i=0; ickptLock==1 || pWal->ckptLock==0 ); + assert( WAL_ALL_BUT_WRITE==WAL_WRITE_LOCK+1 ); + assert( WAL_CKPT_LOCK==WAL_ALL_BUT_WRITE ); + assert( pWal->writeLock ); + iLock = WAL_ALL_BUT_WRITE + pWal->ckptLock; + rc = walLockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock); + if( rc==SQLITE_OK ){ + rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + if( rc!=SQLITE_OK ){ + walUnlockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock); + } + } + if( rc ){ + return rc; + } + + WALTRACE(("WAL%p: recovery begin...\n", pWal)); + + memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); + + rc = sqlite3OsFileSize(pWal->pWalFd, &nSize); + if( rc!=SQLITE_OK ){ + goto recovery_error; + } + + if( nSize>WAL_HDRSIZE ){ + u8 aBuf[WAL_HDRSIZE]; /* Buffer to load WAL header into */ + u8 *aFrame = 0; /* Malloc'd buffer to load entire frame */ + int szFrame; /* Number of bytes in buffer aFrame[] */ + u8 *aData; /* Pointer to data part of aFrame buffer */ + int iFrame; /* Index of last frame read */ + i64 iOffset; /* Next offset to read from log file */ + int szPage; /* Page size according to the log */ + u32 magic; /* Magic value read from WAL header */ + u32 version; /* Magic value read from WAL header */ + int isValid; /* True if this frame is valid */ + + /* Read in the WAL header. */ + rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0); + if( rc!=SQLITE_OK ){ + goto recovery_error; + } + + /* If the database page size is not a power of two, or is greater than + ** SQLITE_MAX_PAGE_SIZE, conclude that the WAL file contains no valid + ** data. Similarly, if the 'magic' value is invalid, ignore the whole + ** WAL file. + */ + magic = sqlite3Get4byte(&aBuf[0]); + szPage = sqlite3Get4byte(&aBuf[8]); + if( (magic&0xFFFFFFFE)!=WAL_MAGIC + || szPage&(szPage-1) + || szPage>SQLITE_MAX_PAGE_SIZE + || szPage<512 + ){ + goto finished; + } + pWal->hdr.bigEndCksum = (u8)(magic&0x00000001); + pWal->szPage = szPage; + pWal->nCkpt = sqlite3Get4byte(&aBuf[12]); + memcpy(&pWal->hdr.aSalt, &aBuf[16], 8); + + /* Verify that the WAL header checksum is correct */ + walChecksumBytes(pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN, + aBuf, WAL_HDRSIZE-2*4, 0, pWal->hdr.aFrameCksum + ); + if( pWal->hdr.aFrameCksum[0]!=sqlite3Get4byte(&aBuf[24]) + || pWal->hdr.aFrameCksum[1]!=sqlite3Get4byte(&aBuf[28]) + ){ + goto finished; + } + + /* Verify that the version number on the WAL format is one that + ** are able to understand */ + version = sqlite3Get4byte(&aBuf[4]); + if( version!=WAL_MAX_VERSION ){ + rc = SQLITE_CANTOPEN_BKPT; + goto finished; + } + + /* Malloc a buffer to read frames into. */ + szFrame = szPage + WAL_FRAME_HDRSIZE; + aFrame = (u8 *)sqlite3_malloc64(szFrame); + if( !aFrame ){ + rc = SQLITE_NOMEM_BKPT; + goto recovery_error; + } + aData = &aFrame[WAL_FRAME_HDRSIZE]; + + /* Read all frames from the log file. */ + iFrame = 0; + for(iOffset=WAL_HDRSIZE; (iOffset+szFrame)<=nSize; iOffset+=szFrame){ + u32 pgno; /* Database page number for frame */ + u32 nTruncate; /* dbsize field from frame header */ + + /* Read and decode the next log frame. */ + iFrame++; + rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset); + if( rc!=SQLITE_OK ) break; + isValid = walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame); + if( !isValid ) break; + rc = walIndexAppend(pWal, iFrame, pgno); + if( rc!=SQLITE_OK ) break; + + /* If nTruncate is non-zero, this is a commit record. */ + if( nTruncate ){ + pWal->hdr.mxFrame = iFrame; + pWal->hdr.nPage = nTruncate; + pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16)); + testcase( szPage<=32768 ); + testcase( szPage>=65536 ); + aFrameCksum[0] = pWal->hdr.aFrameCksum[0]; + aFrameCksum[1] = pWal->hdr.aFrameCksum[1]; + } + } + + sqlite3_free(aFrame); + } + +finished: + if( rc==SQLITE_OK ){ + volatile WalCkptInfo *pInfo; + int i; + pWal->hdr.aFrameCksum[0] = aFrameCksum[0]; + pWal->hdr.aFrameCksum[1] = aFrameCksum[1]; + walIndexWriteHdr(pWal); + + /* Reset the checkpoint-header. This is safe because this thread is + ** currently holding locks that exclude all other readers, writers and + ** checkpointers. + */ + pInfo = walCkptInfo(pWal); + pInfo->nBackfill = 0; + pInfo->nBackfillAttempted = pWal->hdr.mxFrame; + pInfo->aReadMark[0] = 0; + for(i=1; iaReadMark[i] = READMARK_NOT_USED; + if( pWal->hdr.mxFrame ) pInfo->aReadMark[1] = pWal->hdr.mxFrame; + + /* If more than one frame was recovered from the log file, report an + ** event via sqlite3_log(). This is to help with identifying performance + ** problems caused by applications routinely shutting down without + ** checkpointing the log file. + */ + if( pWal->hdr.nPage ){ + sqlite3_log(SQLITE_NOTICE_RECOVER_WAL, + "recovered %d frames from WAL file %s", + pWal->hdr.mxFrame, pWal->zWalName + ); + } + } + +recovery_error: + WALTRACE(("WAL%p: recovery %s\n", pWal, rc ? "failed" : "ok")); + walUnlockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock); + walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + return rc; +} + +/* +** Close an open wal-index. +*/ +static void walIndexClose(Wal *pWal, int isDelete){ + if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE || pWal->bShmUnreliable ){ + int i; + for(i=0; inWiData; i++){ + sqlite3_free((void *)pWal->apWiData[i]); + pWal->apWiData[i] = 0; + } + } + if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){ + sqlite3OsShmUnmap(pWal->pDbFd, isDelete); + } +} + +/* +** Open a connection to the WAL file zWalName. The database file must +** already be opened on connection pDbFd. The buffer that zWalName points +** to must remain valid for the lifetime of the returned Wal* handle. +** +** A SHARED lock should be held on the database file when this function +** is called. The purpose of this SHARED lock is to prevent any other +** client from unlinking the WAL or wal-index file. If another process +** were to do this just after this client opened one of these files, the +** system would be badly broken. +** +** If the log file is successfully opened, SQLITE_OK is returned and +** *ppWal is set to point to a new WAL handle. If an error occurs, +** an SQLite error code is returned and *ppWal is left unmodified. +*/ +SQLITE_PRIVATE int sqlite3WalOpen( + sqlite3_vfs *pVfs, /* vfs module to open wal and wal-index */ + sqlite3_file *pDbFd, /* The open database file */ + const char *zWalName, /* Name of the WAL file */ + int bNoShm, /* True to run in heap-memory mode */ + i64 mxWalSize, /* Truncate WAL to this size on reset */ + Wal **ppWal /* OUT: Allocated Wal handle */ +){ + int rc; /* Return Code */ + Wal *pRet; /* Object to allocate and return */ + int flags; /* Flags passed to OsOpen() */ + + assert( zWalName && zWalName[0] ); + assert( pDbFd ); + + /* In the amalgamation, the os_unix.c and os_win.c source files come before + ** this source file. Verify that the #defines of the locking byte offsets + ** in os_unix.c and os_win.c agree with the WALINDEX_LOCK_OFFSET value. + ** For that matter, if the lock offset ever changes from its initial design + ** value of 120, we need to know that so there is an assert() to check it. + */ + assert( 120==WALINDEX_LOCK_OFFSET ); + assert( 136==WALINDEX_HDR_SIZE ); +#ifdef WIN_SHM_BASE + assert( WIN_SHM_BASE==WALINDEX_LOCK_OFFSET ); +#endif +#ifdef UNIX_SHM_BASE + assert( UNIX_SHM_BASE==WALINDEX_LOCK_OFFSET ); +#endif + + + /* Allocate an instance of struct Wal to return. */ + *ppWal = 0; + pRet = (Wal*)sqlite3MallocZero(sizeof(Wal) + pVfs->szOsFile); + if( !pRet ){ + return SQLITE_NOMEM_BKPT; + } + + pRet->pVfs = pVfs; + pRet->pWalFd = (sqlite3_file *)&pRet[1]; + pRet->pDbFd = pDbFd; + pRet->readLock = -1; + pRet->mxWalSize = mxWalSize; + pRet->zWalName = zWalName; + pRet->syncHeader = 1; + pRet->padToSectorBoundary = 1; + pRet->exclusiveMode = (bNoShm ? WAL_HEAPMEMORY_MODE: WAL_NORMAL_MODE); + + /* Open file handle on the write-ahead log file. */ + flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_WAL); + rc = sqlite3OsOpen(pVfs, zWalName, pRet->pWalFd, flags, &flags); + if( rc==SQLITE_OK && flags&SQLITE_OPEN_READONLY ){ + pRet->readOnly = WAL_RDONLY; + } + + if( rc!=SQLITE_OK ){ + walIndexClose(pRet, 0); + sqlite3OsClose(pRet->pWalFd); + sqlite3_free(pRet); + }else{ + int iDC = sqlite3OsDeviceCharacteristics(pDbFd); + if( iDC & SQLITE_IOCAP_SEQUENTIAL ){ pRet->syncHeader = 0; } + if( iDC & SQLITE_IOCAP_POWERSAFE_OVERWRITE ){ + pRet->padToSectorBoundary = 0; + } + *ppWal = pRet; + WALTRACE(("WAL%d: opened\n", pRet)); + } + return rc; +} + +/* +** Change the size to which the WAL file is trucated on each reset. +*/ +SQLITE_PRIVATE void sqlite3WalLimit(Wal *pWal, i64 iLimit){ + if( pWal ) pWal->mxWalSize = iLimit; +} + +/* +** Find the smallest page number out of all pages held in the WAL that +** has not been returned by any prior invocation of this method on the +** same WalIterator object. Write into *piFrame the frame index where +** that page was last written into the WAL. Write into *piPage the page +** number. +** +** Return 0 on success. If there are no pages in the WAL with a page +** number larger than *piPage, then return 1. +*/ +static int walIteratorNext( + WalIterator *p, /* Iterator */ + u32 *piPage, /* OUT: The page number of the next page */ + u32 *piFrame /* OUT: Wal frame index of next page */ +){ + u32 iMin; /* Result pgno must be greater than iMin */ + u32 iRet = 0xFFFFFFFF; /* 0xffffffff is never a valid page number */ + int i; /* For looping through segments */ + + iMin = p->iPrior; + assert( iMin<0xffffffff ); + for(i=p->nSegment-1; i>=0; i--){ + struct WalSegment *pSegment = &p->aSegment[i]; + while( pSegment->iNextnEntry ){ + u32 iPg = pSegment->aPgno[pSegment->aIndex[pSegment->iNext]]; + if( iPg>iMin ){ + if( iPgiZero + pSegment->aIndex[pSegment->iNext]; + } + break; + } + pSegment->iNext++; + } + } + + *piPage = p->iPrior = iRet; + return (iRet==0xFFFFFFFF); +} + +/* +** This function merges two sorted lists into a single sorted list. +** +** aLeft[] and aRight[] are arrays of indices. The sort key is +** aContent[aLeft[]] and aContent[aRight[]]. Upon entry, the following +** is guaranteed for all J0 && nRight>0 ); + while( iRight=nRight || aContent[aLeft[iLeft]]=nLeft || aContent[aLeft[iLeft]]>dbpage ); + assert( iRight>=nRight || aContent[aRight[iRight]]>dbpage ); + } + + *paRight = aLeft; + *pnRight = iOut; + memcpy(aLeft, aTmp, sizeof(aTmp[0])*iOut); +} + +/* +** Sort the elements in list aList using aContent[] as the sort key. +** Remove elements with duplicate keys, preferring to keep the +** larger aList[] values. +** +** The aList[] entries are indices into aContent[]. The values in +** aList[] are to be sorted so that for all J0 ); + assert( HASHTABLE_NPAGE==(1<<(ArraySize(aSub)-1)) ); + + for(iList=0; iListaList && p->nList<=(1<aList==&aList[iList&~((2<aList, p->nList, &aMerge, &nMerge, aBuffer); + } + aSub[iSub].aList = aMerge; + aSub[iSub].nList = nMerge; + } + + for(iSub++; iSubnList<=(1<aList==&aList[nList&~((2<aList, p->nList, &aMerge, &nMerge, aBuffer); + } + } + assert( aMerge==aList ); + *pnList = nMerge; + +#ifdef SQLITE_DEBUG + { + int i; + for(i=1; i<*pnList; i++){ + assert( aContent[aList[i]] > aContent[aList[i-1]] ); + } + } +#endif +} + +/* +** Free an iterator allocated by walIteratorInit(). +*/ +static void walIteratorFree(WalIterator *p){ + sqlite3_free(p); +} + +/* +** Construct a WalInterator object that can be used to loop over all +** pages in the WAL following frame nBackfill in ascending order. Frames +** nBackfill or earlier may be included - excluding them is an optimization +** only. The caller must hold the checkpoint lock. +** +** On success, make *pp point to the newly allocated WalInterator object +** return SQLITE_OK. Otherwise, return an error code. If this routine +** returns an error, the value of *pp is undefined. +** +** The calling routine should invoke walIteratorFree() to destroy the +** WalIterator object when it has finished with it. +*/ +static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ + WalIterator *p; /* Return value */ + int nSegment; /* Number of segments to merge */ + u32 iLast; /* Last frame in log */ + sqlite3_int64 nByte; /* Number of bytes to allocate */ + int i; /* Iterator variable */ + ht_slot *aTmp; /* Temp space used by merge-sort */ + int rc = SQLITE_OK; /* Return Code */ + + /* This routine only runs while holding the checkpoint lock. And + ** it only runs if there is actually content in the log (mxFrame>0). + */ + assert( pWal->ckptLock && pWal->hdr.mxFrame>0 ); + iLast = pWal->hdr.mxFrame; + + /* Allocate space for the WalIterator object. */ + nSegment = walFramePage(iLast) + 1; + nByte = sizeof(WalIterator) + + (nSegment-1)*sizeof(struct WalSegment) + + iLast*sizeof(ht_slot); + p = (WalIterator *)sqlite3_malloc64(nByte); + if( !p ){ + return SQLITE_NOMEM_BKPT; + } + memset(p, 0, nByte); + p->nSegment = nSegment; + + /* Allocate temporary space used by the merge-sort routine. This block + ** of memory will be freed before this function returns. + */ + aTmp = (ht_slot *)sqlite3_malloc64( + sizeof(ht_slot) * (iLast>HASHTABLE_NPAGE?HASHTABLE_NPAGE:iLast) + ); + if( !aTmp ){ + rc = SQLITE_NOMEM_BKPT; + } + + for(i=walFramePage(nBackfill+1); rc==SQLITE_OK && iaSegment[p->nSegment])[sLoc.iZero]; + sLoc.iZero++; + + for(j=0; jaSegment[i].iZero = sLoc.iZero; + p->aSegment[i].nEntry = nEntry; + p->aSegment[i].aIndex = aIndex; + p->aSegment[i].aPgno = (u32 *)sLoc.aPgno; + } + } + sqlite3_free(aTmp); + + if( rc!=SQLITE_OK ){ + walIteratorFree(p); + p = 0; + } + *pp = p; + return rc; +} + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +/* +** Attempt to enable blocking locks. Blocking locks are enabled only if (a) +** they are supported by the VFS, and (b) the database handle is configured +** with a busy-timeout. Return 1 if blocking locks are successfully enabled, +** or 0 otherwise. +*/ +static int walEnableBlocking(Wal *pWal){ + int res = 0; + if( pWal->db ){ + int tmout = pWal->db->busyTimeout; + if( tmout ){ + int rc; + rc = sqlite3OsFileControl( + pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout + ); + res = (rc==SQLITE_OK); + } + } + return res; +} + +/* +** Disable blocking locks. +*/ +static void walDisableBlocking(Wal *pWal){ + int tmout = 0; + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); +} + +/* +** If parameter bLock is true, attempt to enable blocking locks, take +** the WRITER lock, and then disable blocking locks. If blocking locks +** cannot be enabled, no attempt to obtain the WRITER lock is made. Return +** an SQLite error code if an error occurs, or SQLITE_OK otherwise. It is not +** an error if blocking locks can not be enabled. +** +** If the bLock parameter is false and the WRITER lock is held, release it. +*/ +SQLITE_PRIVATE int sqlite3WalWriteLock(Wal *pWal, int bLock){ + int rc = SQLITE_OK; + assert( pWal->readLock<0 || bLock==0 ); + if( bLock ){ + assert( pWal->db ); + if( walEnableBlocking(pWal) ){ + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + } + walDisableBlocking(pWal); + } + }else if( pWal->writeLock ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + } + return rc; +} + +/* +** Set the database handle used to determine if blocking locks are required. +*/ +SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db){ + pWal->db = db; +} + +/* +** Take an exclusive WRITE lock. Blocking if so configured. +*/ +static int walLockWriter(Wal *pWal){ + int rc; + walEnableBlocking(pWal); + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + walDisableBlocking(pWal); + return rc; +} +#else +# define walEnableBlocking(x) 0 +# define walDisableBlocking(x) +# define walLockWriter(pWal) walLockExclusive((pWal), WAL_WRITE_LOCK, 1) +# define sqlite3WalDb(pWal, db) +#endif /* ifdef SQLITE_ENABLE_SETLK_TIMEOUT */ + + +/* +** Attempt to obtain the exclusive WAL lock defined by parameters lockIdx and +** n. If the attempt fails and parameter xBusy is not NULL, then it is a +** busy-handler function. Invoke it and retry the lock until either the +** lock is successfully obtained or the busy-handler returns 0. +*/ +static int walBusyLock( + Wal *pWal, /* WAL connection */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int lockIdx, /* Offset of first byte to lock */ + int n /* Number of bytes to lock */ +){ + int rc; + do { + rc = walLockExclusive(pWal, lockIdx, n); + }while( xBusy && rc==SQLITE_BUSY && xBusy(pBusyArg) ); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( rc==SQLITE_BUSY_TIMEOUT ){ + walDisableBlocking(pWal); + rc = SQLITE_BUSY; + } +#endif + return rc; +} + +/* +** The cache of the wal-index header must be valid to call this function. +** Return the page-size in bytes used by the database. +*/ +static int walPagesize(Wal *pWal){ + return (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16); +} + +/* +** The following is guaranteed when this function is called: +** +** a) the WRITER lock is held, +** b) the entire log file has been checkpointed, and +** c) any existing readers are reading exclusively from the database +** file - there are no readers that may attempt to read a frame from +** the log file. +** +** This function updates the shared-memory structures so that the next +** client to write to the database (which may be this one) does so by +** writing frames into the start of the log file. +** +** The value of parameter salt1 is used as the aSalt[1] value in the +** new wal-index header. It should be passed a pseudo-random value (i.e. +** one obtained from sqlite3_randomness()). +*/ +static void walRestartHdr(Wal *pWal, u32 salt1){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + int i; /* Loop counter */ + u32 *aSalt = pWal->hdr.aSalt; /* Big-endian salt values */ + pWal->nCkpt++; + pWal->hdr.mxFrame = 0; + sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0])); + memcpy(&pWal->hdr.aSalt[1], &salt1, 4); + walIndexWriteHdr(pWal); + AtomicStore(&pInfo->nBackfill, 0); + pInfo->nBackfillAttempted = 0; + pInfo->aReadMark[1] = 0; + for(i=2; iaReadMark[i] = READMARK_NOT_USED; + assert( pInfo->aReadMark[0]==0 ); +} + +/* +** Copy as much content as we can from the WAL back into the database file +** in response to an sqlite3_wal_checkpoint() request or the equivalent. +** +** The amount of information copies from WAL to database might be limited +** by active readers. This routine will never overwrite a database page +** that a concurrent reader might be using. +** +** All I/O barrier operations (a.k.a fsyncs) occur in this routine when +** SQLite is in WAL-mode in synchronous=NORMAL. That means that if +** checkpoints are always run by a background thread or background +** process, foreground threads will never block on a lengthy fsync call. +** +** Fsync is called on the WAL before writing content out of the WAL and +** into the database. This ensures that if the new content is persistent +** in the WAL and can be recovered following a power-loss or hard reset. +** +** Fsync is also called on the database file if (and only if) the entire +** WAL content is copied into the database file. This second fsync makes +** it safe to delete the WAL since the new content will persist in the +** database file. +** +** This routine uses and updates the nBackfill field of the wal-index header. +** This is the only routine that will increase the value of nBackfill. +** (A WAL reset or recovery will revert nBackfill to zero, but not increase +** its value.) +** +** The caller must be holding sufficient locks to ensure that no other +** checkpoint is running (in any other thread or process) at the same +** time. +*/ +static int walCheckpoint( + Wal *pWal, /* Wal connection */ + sqlite3 *db, /* Check for interrupts on this handle */ + int eMode, /* One of PASSIVE, FULL or RESTART */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int sync_flags, /* Flags for OsSync() (or 0) */ + u8 *zBuf /* Temporary buffer to use */ +){ + int rc = SQLITE_OK; /* Return code */ + int szPage; /* Database page-size */ + WalIterator *pIter = 0; /* Wal iterator context */ + u32 iDbpage = 0; /* Next database page to write */ + u32 iFrame = 0; /* Wal frame containing data for iDbpage */ + u32 mxSafeFrame; /* Max frame that can be backfilled */ + u32 mxPage; /* Max database page to write */ + int i; /* Loop counter */ + volatile WalCkptInfo *pInfo; /* The checkpoint status information */ + + szPage = walPagesize(pWal); + testcase( szPage<=32768 ); + testcase( szPage>=65536 ); + pInfo = walCkptInfo(pWal); + if( pInfo->nBackfillhdr.mxFrame ){ + + /* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked + ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ + assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); + + /* Compute in mxSafeFrame the index of the last frame of the WAL that is + ** safe to write into the database. Frames beyond mxSafeFrame might + ** overwrite database pages that are in use by active readers and thus + ** cannot be backfilled from the WAL. + */ + mxSafeFrame = pWal->hdr.mxFrame; + mxPage = pWal->hdr.nPage; + for(i=1; iaReadMark+i); + if( mxSafeFrame>y ){ + assert( y<=pWal->hdr.mxFrame ); + rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(i), 1); + if( rc==SQLITE_OK ){ + u32 iMark = (i==1 ? mxSafeFrame : READMARK_NOT_USED); + AtomicStore(pInfo->aReadMark+i, iMark); + walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); + }else if( rc==SQLITE_BUSY ){ + mxSafeFrame = y; + xBusy = 0; + }else{ + goto walcheckpoint_out; + } + } + } + + /* Allocate the iterator */ + if( pInfo->nBackfillnBackfill, &pIter); + assert( rc==SQLITE_OK || pIter==0 ); + } + + if( pIter + && (rc = walBusyLock(pWal,xBusy,pBusyArg,WAL_READ_LOCK(0),1))==SQLITE_OK + ){ + u32 nBackfill = pInfo->nBackfill; + + pInfo->nBackfillAttempted = mxSafeFrame; + + /* Sync the WAL to disk */ + rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); + + /* If the database may grow as a result of this checkpoint, hint + ** about the eventual size of the db file to the VFS layer. + */ + if( rc==SQLITE_OK ){ + i64 nReq = ((i64)mxPage * szPage); + i64 nSize; /* Current size of database file */ + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_START, 0); + rc = sqlite3OsFileSize(pWal->pDbFd, &nSize); + if( rc==SQLITE_OK && nSizepDbFd, SQLITE_FCNTL_SIZE_HINT, &nReq); + } + } + + + /* Iterate through the contents of the WAL, copying data to the db file */ + while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){ + i64 iOffset; + assert( walFramePgno(pWal, iFrame)==iDbpage ); + if( AtomicLoad(&db->u1.isInterrupted) ){ + rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; + break; + } + if( iFrame<=nBackfill || iFrame>mxSafeFrame || iDbpage>mxPage ){ + continue; + } + iOffset = walFrameOffset(iFrame, szPage) + WAL_FRAME_HDRSIZE; + /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL file */ + rc = sqlite3OsRead(pWal->pWalFd, zBuf, szPage, iOffset); + if( rc!=SQLITE_OK ) break; + iOffset = (iDbpage-1)*(i64)szPage; + testcase( IS_BIG_INT(iOffset) ); + rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, iOffset); + if( rc!=SQLITE_OK ) break; + } + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0); + + /* If work was actually accomplished... */ + if( rc==SQLITE_OK ){ + if( mxSafeFrame==walIndexHdr(pWal)->mxFrame ){ + i64 szDb = pWal->hdr.nPage*(i64)szPage; + testcase( IS_BIG_INT(szDb) ); + rc = sqlite3OsTruncate(pWal->pDbFd, szDb); + if( rc==SQLITE_OK ){ + rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags)); + } + } + if( rc==SQLITE_OK ){ + AtomicStore(&pInfo->nBackfill, mxSafeFrame); + } + } + + /* Release the reader lock held while backfilling */ + walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1); + } + + if( rc==SQLITE_BUSY ){ + /* Reset the return code so as not to report a checkpoint failure + ** just because there are active readers. */ + rc = SQLITE_OK; + } + } + + /* If this is an SQLITE_CHECKPOINT_RESTART or TRUNCATE operation, and the + ** entire wal file has been copied into the database file, then block + ** until all readers have finished using the wal file. This ensures that + ** the next process to write to the database restarts the wal file. + */ + if( rc==SQLITE_OK && eMode!=SQLITE_CHECKPOINT_PASSIVE ){ + assert( pWal->writeLock ); + if( pInfo->nBackfillhdr.mxFrame ){ + rc = SQLITE_BUSY; + }else if( eMode>=SQLITE_CHECKPOINT_RESTART ){ + u32 salt1; + sqlite3_randomness(4, &salt1); + assert( pInfo->nBackfill==pWal->hdr.mxFrame ); + rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(1), WAL_NREADER-1); + if( rc==SQLITE_OK ){ + if( eMode==SQLITE_CHECKPOINT_TRUNCATE ){ + /* IMPLEMENTATION-OF: R-44699-57140 This mode works the same way as + ** SQLITE_CHECKPOINT_RESTART with the addition that it also + ** truncates the log file to zero bytes just prior to a + ** successful return. + ** + ** In theory, it might be safe to do this without updating the + ** wal-index header in shared memory, as all subsequent reader or + ** writer clients should see that the entire log file has been + ** checkpointed and behave accordingly. This seems unsafe though, + ** as it would leave the system in a state where the contents of + ** the wal-index header do not match the contents of the + ** file-system. To avoid this, update the wal-index header to + ** indicate that the log file contains zero valid frames. */ + walRestartHdr(pWal, salt1); + rc = sqlite3OsTruncate(pWal->pWalFd, 0); + } + walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + } + } + } + + walcheckpoint_out: + walIteratorFree(pIter); + return rc; +} + +/* +** If the WAL file is currently larger than nMax bytes in size, truncate +** it to exactly nMax bytes. If an error occurs while doing so, ignore it. +*/ +static void walLimitSize(Wal *pWal, i64 nMax){ + i64 sz; + int rx; + sqlite3BeginBenignMalloc(); + rx = sqlite3OsFileSize(pWal->pWalFd, &sz); + if( rx==SQLITE_OK && (sz > nMax ) ){ + rx = sqlite3OsTruncate(pWal->pWalFd, nMax); + } + sqlite3EndBenignMalloc(); + if( rx ){ + sqlite3_log(rx, "cannot limit WAL size: %s", pWal->zWalName); + } +} + +/* +** Close a connection to a log file. +*/ +SQLITE_PRIVATE int sqlite3WalClose( + Wal *pWal, /* Wal to close */ + sqlite3 *db, /* For interrupt flag */ + int sync_flags, /* Flags to pass to OsSync() (or 0) */ + int nBuf, + u8 *zBuf /* Buffer of at least nBuf bytes */ +){ + int rc = SQLITE_OK; + if( pWal ){ + int isDelete = 0; /* True to unlink wal and wal-index files */ + + /* If an EXCLUSIVE lock can be obtained on the database file (using the + ** ordinary, rollback-mode locking methods, this guarantees that the + ** connection associated with this log file is the only connection to + ** the database. In this case checkpoint the database and unlink both + ** the wal and wal-index files. + ** + ** The EXCLUSIVE lock is not released before returning. + */ + if( zBuf!=0 + && SQLITE_OK==(rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE)) + ){ + if( pWal->exclusiveMode==WAL_NORMAL_MODE ){ + pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; + } + rc = sqlite3WalCheckpoint(pWal, db, + SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0 + ); + if( rc==SQLITE_OK ){ + int bPersist = -1; + sqlite3OsFileControlHint( + pWal->pDbFd, SQLITE_FCNTL_PERSIST_WAL, &bPersist + ); + if( bPersist!=1 ){ + /* Try to delete the WAL file if the checkpoint completed and + ** fsyned (rc==SQLITE_OK) and if we are not in persistent-wal + ** mode (!bPersist) */ + isDelete = 1; + }else if( pWal->mxWalSize>=0 ){ + /* Try to truncate the WAL file to zero bytes if the checkpoint + ** completed and fsynced (rc==SQLITE_OK) and we are in persistent + ** WAL mode (bPersist) and if the PRAGMA journal_size_limit is a + ** non-negative value (pWal->mxWalSize>=0). Note that we truncate + ** to zero bytes as truncating to the journal_size_limit might + ** leave a corrupt WAL file on disk. */ + walLimitSize(pWal, 0); + } + } + } + + walIndexClose(pWal, isDelete); + sqlite3OsClose(pWal->pWalFd); + if( isDelete ){ + sqlite3BeginBenignMalloc(); + sqlite3OsDelete(pWal->pVfs, pWal->zWalName, 0); + sqlite3EndBenignMalloc(); + } + WALTRACE(("WAL%p: closed\n", pWal)); + sqlite3_free((void *)pWal->apWiData); + sqlite3_free(pWal); + } + return rc; +} + +/* +** Try to read the wal-index header. Return 0 on success and 1 if +** there is a problem. +** +** The wal-index is in shared memory. Another thread or process might +** be writing the header at the same time this procedure is trying to +** read it, which might result in inconsistency. A dirty read is detected +** by verifying that both copies of the header are the same and also by +** a checksum on the header. +** +** If and only if the read is consistent and the header is different from +** pWal->hdr, then pWal->hdr is updated to the content of the new header +** and *pChanged is set to 1. +** +** If the checksum cannot be verified return non-zero. If the header +** is read successfully and the checksum verified, return zero. +*/ +static SQLITE_NO_TSAN int walIndexTryHdr(Wal *pWal, int *pChanged){ + u32 aCksum[2]; /* Checksum on the header content */ + WalIndexHdr h1, h2; /* Two copies of the header content */ + WalIndexHdr volatile *aHdr; /* Header in shared memory */ + + /* The first page of the wal-index must be mapped at this point. */ + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + + /* Read the header. This might happen concurrently with a write to the + ** same area of shared memory on a different CPU in a SMP, + ** meaning it is possible that an inconsistent snapshot is read + ** from the file. If this happens, return non-zero. + ** + ** tag-20200519-1: + ** There are two copies of the header at the beginning of the wal-index. + ** When reading, read [0] first then [1]. Writes are in the reverse order. + ** Memory barriers are used to prevent the compiler or the hardware from + ** reordering the reads and writes. TSAN and similar tools can sometimes + ** give false-positive warnings about these accesses because the tools do not + ** account for the double-read and the memory barrier. The use of mutexes + ** here would be problematic as the memory being accessed is potentially + ** shared among multiple processes and not all mutex implementions work + ** reliably in that environment. + */ + aHdr = walIndexHdr(pWal); + memcpy(&h1, (void *)&aHdr[0], sizeof(h1)); /* Possible TSAN false-positive */ + walShmBarrier(pWal); + memcpy(&h2, (void *)&aHdr[1], sizeof(h2)); + + if( memcmp(&h1, &h2, sizeof(h1))!=0 ){ + return 1; /* Dirty read */ + } + if( h1.isInit==0 ){ + return 1; /* Malformed header - probably all zeros */ + } + walChecksumBytes(1, (u8*)&h1, sizeof(h1)-sizeof(h1.aCksum), 0, aCksum); + if( aCksum[0]!=h1.aCksum[0] || aCksum[1]!=h1.aCksum[1] ){ + return 1; /* Checksum does not match */ + } + + if( memcmp(&pWal->hdr, &h1, sizeof(WalIndexHdr)) ){ + *pChanged = 1; + memcpy(&pWal->hdr, &h1, sizeof(WalIndexHdr)); + pWal->szPage = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16); + testcase( pWal->szPage<=32768 ); + testcase( pWal->szPage>=65536 ); + } + + /* The header was successfully read. Return zero. */ + return 0; +} + +/* +** This is the value that walTryBeginRead returns when it needs to +** be retried. +*/ +#define WAL_RETRY (-1) + +/* +** Read the wal-index header from the wal-index and into pWal->hdr. +** If the wal-header appears to be corrupt, try to reconstruct the +** wal-index from the WAL before returning. +** +** Set *pChanged to 1 if the wal-index header value in pWal->hdr is +** changed by this operation. If pWal->hdr is unchanged, set *pChanged +** to 0. +** +** If the wal-index header is successfully read, return SQLITE_OK. +** Otherwise an SQLite error code. +*/ +static int walIndexReadHdr(Wal *pWal, int *pChanged){ + int rc; /* Return code */ + int badHdr; /* True if a header read failed */ + volatile u32 *page0; /* Chunk of wal-index containing header */ + + /* Ensure that page 0 of the wal-index (the page that contains the + ** wal-index header) is mapped. Return early if an error occurs here. + */ + assert( pChanged ); + rc = walIndexPage(pWal, 0, &page0); + if( rc!=SQLITE_OK ){ + assert( rc!=SQLITE_READONLY ); /* READONLY changed to OK in walIndexPage */ + if( rc==SQLITE_READONLY_CANTINIT ){ + /* The SQLITE_READONLY_CANTINIT return means that the shared-memory + ** was openable but is not writable, and this thread is unable to + ** confirm that another write-capable connection has the shared-memory + ** open, and hence the content of the shared-memory is unreliable, + ** since the shared-memory might be inconsistent with the WAL file + ** and there is no writer on hand to fix it. */ + assert( page0==0 ); + assert( pWal->writeLock==0 ); + assert( pWal->readOnly & WAL_SHM_RDONLY ); + pWal->bShmUnreliable = 1; + pWal->exclusiveMode = WAL_HEAPMEMORY_MODE; + *pChanged = 1; + }else{ + return rc; /* Any other non-OK return is just an error */ + } + }else{ + /* page0 can be NULL if the SHM is zero bytes in size and pWal->writeLock + ** is zero, which prevents the SHM from growing */ + testcase( page0!=0 ); + } + assert( page0!=0 || pWal->writeLock==0 ); + + /* If the first page of the wal-index has been mapped, try to read the + ** wal-index header immediately, without holding any lock. This usually + ** works, but may fail if the wal-index header is corrupt or currently + ** being modified by another thread or process. + */ + badHdr = (page0 ? walIndexTryHdr(pWal, pChanged) : 1); + + /* If the first attempt failed, it might have been due to a race + ** with a writer. So get a WRITE lock and try again. + */ + if( badHdr ){ + if( pWal->bShmUnreliable==0 && (pWal->readOnly & WAL_SHM_RDONLY) ){ + if( SQLITE_OK==(rc = walLockShared(pWal, WAL_WRITE_LOCK)) ){ + walUnlockShared(pWal, WAL_WRITE_LOCK); + rc = SQLITE_READONLY_RECOVERY; + } + }else{ + int bWriteLock = pWal->writeLock; + if( bWriteLock || SQLITE_OK==(rc = walLockWriter(pWal)) ){ + pWal->writeLock = 1; + if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){ + badHdr = walIndexTryHdr(pWal, pChanged); + if( badHdr ){ + /* If the wal-index header is still malformed even while holding + ** a WRITE lock, it can only mean that the header is corrupted and + ** needs to be reconstructed. So run recovery to do exactly that. + */ + rc = walIndexRecover(pWal); + *pChanged = 1; + } + } + if( bWriteLock==0 ){ + pWal->writeLock = 0; + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + } + } + } + } + + /* If the header is read successfully, check the version number to make + ** sure the wal-index was not constructed with some future format that + ** this version of SQLite cannot understand. + */ + if( badHdr==0 && pWal->hdr.iVersion!=WALINDEX_MAX_VERSION ){ + rc = SQLITE_CANTOPEN_BKPT; + } + if( pWal->bShmUnreliable ){ + if( rc!=SQLITE_OK ){ + walIndexClose(pWal, 0); + pWal->bShmUnreliable = 0; + assert( pWal->nWiData>0 && pWal->apWiData[0]==0 ); + /* walIndexRecover() might have returned SHORT_READ if a concurrent + ** writer truncated the WAL out from under it. If that happens, it + ** indicates that a writer has fixed the SHM file for us, so retry */ + if( rc==SQLITE_IOERR_SHORT_READ ) rc = WAL_RETRY; + } + pWal->exclusiveMode = WAL_NORMAL_MODE; + } + + return rc; +} + +/* +** Open a transaction in a connection where the shared-memory is read-only +** and where we cannot verify that there is a separate write-capable connection +** on hand to keep the shared-memory up-to-date with the WAL file. +** +** This can happen, for example, when the shared-memory is implemented by +** memory-mapping a *-shm file, where a prior writer has shut down and +** left the *-shm file on disk, and now the present connection is trying +** to use that database but lacks write permission on the *-shm file. +** Other scenarios are also possible, depending on the VFS implementation. +** +** Precondition: +** +** The *-wal file has been read and an appropriate wal-index has been +** constructed in pWal->apWiData[] using heap memory instead of shared +** memory. +** +** If this function returns SQLITE_OK, then the read transaction has +** been successfully opened. In this case output variable (*pChanged) +** is set to true before returning if the caller should discard the +** contents of the page cache before proceeding. Or, if it returns +** WAL_RETRY, then the heap memory wal-index has been discarded and +** the caller should retry opening the read transaction from the +** beginning (including attempting to map the *-shm file). +** +** If an error occurs, an SQLite error code is returned. +*/ +static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ + i64 szWal; /* Size of wal file on disk in bytes */ + i64 iOffset; /* Current offset when reading wal file */ + u8 aBuf[WAL_HDRSIZE]; /* Buffer to load WAL header into */ + u8 *aFrame = 0; /* Malloc'd buffer to load entire frame */ + int szFrame; /* Number of bytes in buffer aFrame[] */ + u8 *aData; /* Pointer to data part of aFrame buffer */ + volatile void *pDummy; /* Dummy argument for xShmMap */ + int rc; /* Return code */ + u32 aSaveCksum[2]; /* Saved copy of pWal->hdr.aFrameCksum */ + + assert( pWal->bShmUnreliable ); + assert( pWal->readOnly & WAL_SHM_RDONLY ); + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + + /* Take WAL_READ_LOCK(0). This has the effect of preventing any + ** writers from running a checkpoint, but does not stop them + ** from running recovery. */ + rc = walLockShared(pWal, WAL_READ_LOCK(0)); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_BUSY ) rc = WAL_RETRY; + goto begin_unreliable_shm_out; + } + pWal->readLock = 0; + + /* Check to see if a separate writer has attached to the shared-memory area, + ** thus making the shared-memory "reliable" again. Do this by invoking + ** the xShmMap() routine of the VFS and looking to see if the return + ** is SQLITE_READONLY instead of SQLITE_READONLY_CANTINIT. + ** + ** If the shared-memory is now "reliable" return WAL_RETRY, which will + ** cause the heap-memory WAL-index to be discarded and the actual + ** shared memory to be used in its place. + ** + ** This step is important because, even though this connection is holding + ** the WAL_READ_LOCK(0) which prevents a checkpoint, a writer might + ** have already checkpointed the WAL file and, while the current + ** is active, wrap the WAL and start overwriting frames that this + ** process wants to use. + ** + ** Once sqlite3OsShmMap() has been called for an sqlite3_file and has + ** returned any SQLITE_READONLY value, it must return only SQLITE_READONLY + ** or SQLITE_READONLY_CANTINIT or some error for all subsequent invocations, + ** even if some external agent does a "chmod" to make the shared-memory + ** writable by us, until sqlite3OsShmUnmap() has been called. + ** This is a requirement on the VFS implementation. + */ + rc = sqlite3OsShmMap(pWal->pDbFd, 0, WALINDEX_PGSZ, 0, &pDummy); + assert( rc!=SQLITE_OK ); /* SQLITE_OK not possible for read-only connection */ + if( rc!=SQLITE_READONLY_CANTINIT ){ + rc = (rc==SQLITE_READONLY ? WAL_RETRY : rc); + goto begin_unreliable_shm_out; + } + + /* We reach this point only if the real shared-memory is still unreliable. + ** Assume the in-memory WAL-index substitute is correct and load it + ** into pWal->hdr. + */ + memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); + + /* Make sure some writer hasn't come in and changed the WAL file out + ** from under us, then disconnected, while we were not looking. + */ + rc = sqlite3OsFileSize(pWal->pWalFd, &szWal); + if( rc!=SQLITE_OK ){ + goto begin_unreliable_shm_out; + } + if( szWalhdr.mxFrame==0 ? SQLITE_OK : WAL_RETRY); + goto begin_unreliable_shm_out; + } + + /* Check the salt keys at the start of the wal file still match. */ + rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0); + if( rc!=SQLITE_OK ){ + goto begin_unreliable_shm_out; + } + if( memcmp(&pWal->hdr.aSalt, &aBuf[16], 8) ){ + /* Some writer has wrapped the WAL file while we were not looking. + ** Return WAL_RETRY which will cause the in-memory WAL-index to be + ** rebuilt. */ + rc = WAL_RETRY; + goto begin_unreliable_shm_out; + } + + /* Allocate a buffer to read frames into */ + szFrame = pWal->hdr.szPage + WAL_FRAME_HDRSIZE; + aFrame = (u8 *)sqlite3_malloc64(szFrame); + if( aFrame==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto begin_unreliable_shm_out; + } + aData = &aFrame[WAL_FRAME_HDRSIZE]; + + /* Check to see if a complete transaction has been appended to the + ** wal file since the heap-memory wal-index was created. If so, the + ** heap-memory wal-index is discarded and WAL_RETRY returned to + ** the caller. */ + aSaveCksum[0] = pWal->hdr.aFrameCksum[0]; + aSaveCksum[1] = pWal->hdr.aFrameCksum[1]; + for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->hdr.szPage); + iOffset+szFrame<=szWal; + iOffset+=szFrame + ){ + u32 pgno; /* Database page number for frame */ + u32 nTruncate; /* dbsize field from frame header */ + + /* Read and decode the next log frame. */ + rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset); + if( rc!=SQLITE_OK ) break; + if( !walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame) ) break; + + /* If nTruncate is non-zero, then a complete transaction has been + ** appended to this wal file. Set rc to WAL_RETRY and break out of + ** the loop. */ + if( nTruncate ){ + rc = WAL_RETRY; + break; + } + } + pWal->hdr.aFrameCksum[0] = aSaveCksum[0]; + pWal->hdr.aFrameCksum[1] = aSaveCksum[1]; + + begin_unreliable_shm_out: + sqlite3_free(aFrame); + if( rc!=SQLITE_OK ){ + int i; + for(i=0; inWiData; i++){ + sqlite3_free((void*)pWal->apWiData[i]); + pWal->apWiData[i] = 0; + } + pWal->bShmUnreliable = 0; + sqlite3WalEndReadTransaction(pWal); + *pChanged = 1; + } + return rc; +} + +/* +** Attempt to start a read transaction. This might fail due to a race or +** other transient condition. When that happens, it returns WAL_RETRY to +** indicate to the caller that it is safe to retry immediately. +** +** On success return SQLITE_OK. On a permanent failure (such an +** I/O error or an SQLITE_BUSY because another process is running +** recovery) return a positive error code. +** +** The useWal parameter is true to force the use of the WAL and disable +** the case where the WAL is bypassed because it has been completely +** checkpointed. If useWal==0 then this routine calls walIndexReadHdr() +** to make a copy of the wal-index header into pWal->hdr. If the +** wal-index header has changed, *pChanged is set to 1 (as an indication +** to the caller that the local page cache is obsolete and needs to be +** flushed.) When useWal==1, the wal-index header is assumed to already +** be loaded and the pChanged parameter is unused. +** +** The caller must set the cnt parameter to the number of prior calls to +** this routine during the current read attempt that returned WAL_RETRY. +** This routine will start taking more aggressive measures to clear the +** race conditions after multiple WAL_RETRY returns, and after an excessive +** number of errors will ultimately return SQLITE_PROTOCOL. The +** SQLITE_PROTOCOL return indicates that some other process has gone rogue +** and is not honoring the locking protocol. There is a vanishingly small +** chance that SQLITE_PROTOCOL could be returned because of a run of really +** bad luck when there is lots of contention for the wal-index, but that +** possibility is so small that it can be safely neglected, we believe. +** +** On success, this routine obtains a read lock on +** WAL_READ_LOCK(pWal->readLock). The pWal->readLock integer is +** in the range 0 <= pWal->readLock < WAL_NREADER. If pWal->readLock==(-1) +** that means the Wal does not hold any read lock. The reader must not +** access any database page that is modified by a WAL frame up to and +** including frame number aReadMark[pWal->readLock]. The reader will +** use WAL frames up to and including pWal->hdr.mxFrame if pWal->readLock>0 +** Or if pWal->readLock==0, then the reader will ignore the WAL +** completely and get all content directly from the database file. +** If the useWal parameter is 1 then the WAL will never be ignored and +** this routine will always set pWal->readLock>0 on success. +** When the read transaction is completed, the caller must release the +** lock on WAL_READ_LOCK(pWal->readLock) and set pWal->readLock to -1. +** +** This routine uses the nBackfill and aReadMark[] fields of the header +** to select a particular WAL_READ_LOCK() that strives to let the +** checkpoint process do as much work as possible. This routine might +** update values of the aReadMark[] array in the header, but if it does +** so it takes care to hold an exclusive lock on the corresponding +** WAL_READ_LOCK() while changing values. +*/ +static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ + volatile WalCkptInfo *pInfo; /* Checkpoint information in wal-index */ + u32 mxReadMark; /* Largest aReadMark[] value */ + int mxI; /* Index of largest aReadMark[] value */ + int i; /* Loop counter */ + int rc = SQLITE_OK; /* Return code */ + u32 mxFrame; /* Wal frame to lock to */ + + assert( pWal->readLock<0 ); /* Not currently locked */ + + /* useWal may only be set for read/write connections */ + assert( (pWal->readOnly & WAL_SHM_RDONLY)==0 || useWal==0 ); + + /* Take steps to avoid spinning forever if there is a protocol error. + ** + ** Circumstances that cause a RETRY should only last for the briefest + ** instances of time. No I/O or other system calls are done while the + ** locks are held, so the locks should not be held for very long. But + ** if we are unlucky, another process that is holding a lock might get + ** paged out or take a page-fault that is time-consuming to resolve, + ** during the few nanoseconds that it is holding the lock. In that case, + ** it might take longer than normal for the lock to free. + ** + ** After 5 RETRYs, we begin calling sqlite3OsSleep(). The first few + ** calls to sqlite3OsSleep() have a delay of 1 microsecond. Really this + ** is more of a scheduler yield than an actual delay. But on the 10th + ** an subsequent retries, the delays start becoming longer and longer, + ** so that on the 100th (and last) RETRY we delay for 323 milliseconds. + ** The total delay time before giving up is less than 10 seconds. + */ + if( cnt>5 ){ + int nDelay = 1; /* Pause time in microseconds */ + if( cnt>100 ){ + VVA_ONLY( pWal->lockError = 1; ) + return SQLITE_PROTOCOL; + } + if( cnt>=10 ) nDelay = (cnt-9)*(cnt-9)*39; + sqlite3OsSleep(pWal->pVfs, nDelay); + } + + if( !useWal ){ + assert( rc==SQLITE_OK ); + if( pWal->bShmUnreliable==0 ){ + rc = walIndexReadHdr(pWal, pChanged); + } + if( rc==SQLITE_BUSY ){ + /* If there is not a recovery running in another thread or process + ** then convert BUSY errors to WAL_RETRY. If recovery is known to + ** be running, convert BUSY to BUSY_RECOVERY. There is a race here + ** which might cause WAL_RETRY to be returned even if BUSY_RECOVERY + ** would be technically correct. But the race is benign since with + ** WAL_RETRY this routine will be called again and will probably be + ** right on the second iteration. + */ + if( pWal->apWiData[0]==0 ){ + /* This branch is taken when the xShmMap() method returns SQLITE_BUSY. + ** We assume this is a transient condition, so return WAL_RETRY. The + ** xShmMap() implementation used by the default unix and win32 VFS + ** modules may return SQLITE_BUSY due to a race condition in the + ** code that determines whether or not the shared-memory region + ** must be zeroed before the requested page is returned. + */ + rc = WAL_RETRY; + }else if( SQLITE_OK==(rc = walLockShared(pWal, WAL_RECOVER_LOCK)) ){ + walUnlockShared(pWal, WAL_RECOVER_LOCK); + rc = WAL_RETRY; + }else if( rc==SQLITE_BUSY ){ + rc = SQLITE_BUSY_RECOVERY; + } + } + if( rc!=SQLITE_OK ){ + return rc; + } + else if( pWal->bShmUnreliable ){ + return walBeginShmUnreliable(pWal, pChanged); + } + } + + assert( pWal->nWiData>0 ); + assert( pWal->apWiData[0]!=0 ); + pInfo = walCkptInfo(pWal); + if( !useWal && AtomicLoad(&pInfo->nBackfill)==pWal->hdr.mxFrame +#ifdef SQLITE_ENABLE_SNAPSHOT + && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0) +#endif + ){ + /* The WAL has been completely backfilled (or it is empty). + ** and can be safely ignored. + */ + rc = walLockShared(pWal, WAL_READ_LOCK(0)); + walShmBarrier(pWal); + if( rc==SQLITE_OK ){ + if( memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) ){ + /* It is not safe to allow the reader to continue here if frames + ** may have been appended to the log before READ_LOCK(0) was obtained. + ** When holding READ_LOCK(0), the reader ignores the entire log file, + ** which implies that the database file contains a trustworthy + ** snapshot. Since holding READ_LOCK(0) prevents a checkpoint from + ** happening, this is usually correct. + ** + ** However, if frames have been appended to the log (or if the log + ** is wrapped and written for that matter) before the READ_LOCK(0) + ** is obtained, that is not necessarily true. A checkpointer may + ** have started to backfill the appended frames but crashed before + ** it finished. Leaving a corrupt image in the database file. + */ + walUnlockShared(pWal, WAL_READ_LOCK(0)); + return WAL_RETRY; + } + pWal->readLock = 0; + return SQLITE_OK; + }else if( rc!=SQLITE_BUSY ){ + return rc; + } + } + + /* If we get this far, it means that the reader will want to use + ** the WAL to get at content from recent commits. The job now is + ** to select one of the aReadMark[] entries that is closest to + ** but not exceeding pWal->hdr.mxFrame and lock that entry. + */ + mxReadMark = 0; + mxI = 0; + mxFrame = pWal->hdr.mxFrame; +#ifdef SQLITE_ENABLE_SNAPSHOT + if( pWal->pSnapshot && pWal->pSnapshot->mxFramepSnapshot->mxFrame; + } +#endif + for(i=1; iaReadMark+i); + if( mxReadMark<=thisMark && thisMark<=mxFrame ){ + assert( thisMark!=READMARK_NOT_USED ); + mxReadMark = thisMark; + mxI = i; + } + } + if( (pWal->readOnly & WAL_SHM_RDONLY)==0 + && (mxReadMarkaReadMark+i,mxFrame); + mxReadMark = mxFrame; + mxI = i; + walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); + break; + }else if( rc!=SQLITE_BUSY ){ + return rc; + } + } + } + if( mxI==0 ){ + assert( rc==SQLITE_BUSY || (pWal->readOnly & WAL_SHM_RDONLY)!=0 ); + return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTINIT; + } + + rc = walLockShared(pWal, WAL_READ_LOCK(mxI)); + if( rc ){ + return rc==SQLITE_BUSY ? WAL_RETRY : rc; + } + /* Now that the read-lock has been obtained, check that neither the + ** value in the aReadMark[] array or the contents of the wal-index + ** header have changed. + ** + ** It is necessary to check that the wal-index header did not change + ** between the time it was read and when the shared-lock was obtained + ** on WAL_READ_LOCK(mxI) was obtained to account for the possibility + ** that the log file may have been wrapped by a writer, or that frames + ** that occur later in the log than pWal->hdr.mxFrame may have been + ** copied into the database by a checkpointer. If either of these things + ** happened, then reading the database with the current value of + ** pWal->hdr.mxFrame risks reading a corrupted snapshot. So, retry + ** instead. + ** + ** Before checking that the live wal-index header has not changed + ** since it was read, set Wal.minFrame to the first frame in the wal + ** file that has not yet been checkpointed. This client will not need + ** to read any frames earlier than minFrame from the wal file - they + ** can be safely read directly from the database file. + ** + ** Because a ShmBarrier() call is made between taking the copy of + ** nBackfill and checking that the wal-header in shared-memory still + ** matches the one cached in pWal->hdr, it is guaranteed that the + ** checkpointer that set nBackfill was not working with a wal-index + ** header newer than that cached in pWal->hdr. If it were, that could + ** cause a problem. The checkpointer could omit to checkpoint + ** a version of page X that lies before pWal->minFrame (call that version + ** A) on the basis that there is a newer version (version B) of the same + ** page later in the wal file. But if version B happens to like past + ** frame pWal->hdr.mxFrame - then the client would incorrectly assume + ** that it can read version A from the database file. However, since + ** we can guarantee that the checkpointer that set nBackfill could not + ** see any pages past pWal->hdr.mxFrame, this problem does not come up. + */ + pWal->minFrame = AtomicLoad(&pInfo->nBackfill)+1; + walShmBarrier(pWal); + if( AtomicLoad(pInfo->aReadMark+mxI)!=mxReadMark + || memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) + ){ + walUnlockShared(pWal, WAL_READ_LOCK(mxI)); + return WAL_RETRY; + }else{ + assert( mxReadMark<=pWal->hdr.mxFrame ); + pWal->readLock = (i16)mxI; + } + return rc; +} + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Attempt to reduce the value of the WalCkptInfo.nBackfillAttempted +** variable so that older snapshots can be accessed. To do this, loop +** through all wal frames from nBackfillAttempted to (nBackfill+1), +** comparing their content to the corresponding page with the database +** file, if any. Set nBackfillAttempted to the frame number of the +** first frame for which the wal file content matches the db file. +** +** This is only really safe if the file-system is such that any page +** writes made by earlier checkpointers were atomic operations, which +** is not always true. It is also possible that nBackfillAttempted +** may be left set to a value larger than expected, if a wal frame +** contains content that duplicate of an earlier version of the same +** page. +** +** SQLITE_OK is returned if successful, or an SQLite error code if an +** error occurs. It is not an error if nBackfillAttempted cannot be +** decreased at all. +*/ +SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal){ + int rc; + + assert( pWal->readLock>=0 ); + rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); + if( rc==SQLITE_OK ){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + int szPage = (int)pWal->szPage; + i64 szDb; /* Size of db file in bytes */ + + rc = sqlite3OsFileSize(pWal->pDbFd, &szDb); + if( rc==SQLITE_OK ){ + void *pBuf1 = sqlite3_malloc(szPage); + void *pBuf2 = sqlite3_malloc(szPage); + if( pBuf1==0 || pBuf2==0 ){ + rc = SQLITE_NOMEM; + }else{ + u32 i = pInfo->nBackfillAttempted; + for(i=pInfo->nBackfillAttempted; i>AtomicLoad(&pInfo->nBackfill); i--){ + WalHashLoc sLoc; /* Hash table location */ + u32 pgno; /* Page number in db file */ + i64 iDbOff; /* Offset of db file entry */ + i64 iWalOff; /* Offset of wal file entry */ + + rc = walHashGet(pWal, walFramePage(i), &sLoc); + if( rc!=SQLITE_OK ) break; + pgno = sLoc.aPgno[i-sLoc.iZero]; + iDbOff = (i64)(pgno-1) * szPage; + + if( iDbOff+szPage<=szDb ){ + iWalOff = walFrameOffset(i, szPage) + WAL_FRAME_HDRSIZE; + rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff); + + if( rc==SQLITE_OK ){ + rc = sqlite3OsRead(pWal->pDbFd, pBuf2, szPage, iDbOff); + } + + if( rc!=SQLITE_OK || 0==memcmp(pBuf1, pBuf2, szPage) ){ + break; + } + } + + pInfo->nBackfillAttempted = i-1; + } + } + + sqlite3_free(pBuf1); + sqlite3_free(pBuf2); + } + walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); + } + + return rc; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +/* +** Begin a read transaction on the database. +** +** This routine used to be called sqlite3OpenSnapshot() and with good reason: +** it takes a snapshot of the state of the WAL and wal-index for the current +** instant in time. The current thread will continue to use this snapshot. +** Other threads might append new content to the WAL and wal-index but +** that extra content is ignored by the current thread. +** +** If the database contents have changes since the previous read +** transaction, then *pChanged is set to 1 before returning. The +** Pager layer will use this to know that its cache is stale and +** needs to be flushed. +*/ +SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ + int rc; /* Return code */ + int cnt = 0; /* Number of TryBeginRead attempts */ +#ifdef SQLITE_ENABLE_SNAPSHOT + int bChanged = 0; + WalIndexHdr *pSnapshot = pWal->pSnapshot; +#endif + + assert( pWal->ckptLock==0 ); + +#ifdef SQLITE_ENABLE_SNAPSHOT + if( pSnapshot ){ + if( memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ + bChanged = 1; + } + + /* It is possible that there is a checkpointer thread running + ** concurrent with this code. If this is the case, it may be that the + ** checkpointer has already determined that it will checkpoint + ** snapshot X, where X is later in the wal file than pSnapshot, but + ** has not yet set the pInfo->nBackfillAttempted variable to indicate + ** its intent. To avoid the race condition this leads to, ensure that + ** there is no checkpointer process by taking a shared CKPT lock + ** before checking pInfo->nBackfillAttempted. */ + (void)walEnableBlocking(pWal); + rc = walLockShared(pWal, WAL_CKPT_LOCK); + walDisableBlocking(pWal); + + if( rc!=SQLITE_OK ){ + return rc; + } + pWal->ckptLock = 1; + } +#endif + + do{ + rc = walTryBeginRead(pWal, pChanged, 0, ++cnt); + }while( rc==WAL_RETRY ); + testcase( (rc&0xff)==SQLITE_BUSY ); + testcase( (rc&0xff)==SQLITE_IOERR ); + testcase( rc==SQLITE_PROTOCOL ); + testcase( rc==SQLITE_OK ); + +#ifdef SQLITE_ENABLE_SNAPSHOT + if( rc==SQLITE_OK ){ + if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ + /* At this point the client has a lock on an aReadMark[] slot holding + ** a value equal to or smaller than pSnapshot->mxFrame, but pWal->hdr + ** is populated with the wal-index header corresponding to the head + ** of the wal file. Verify that pSnapshot is still valid before + ** continuing. Reasons why pSnapshot might no longer be valid: + ** + ** (1) The WAL file has been reset since the snapshot was taken. + ** In this case, the salt will have changed. + ** + ** (2) A checkpoint as been attempted that wrote frames past + ** pSnapshot->mxFrame into the database file. Note that the + ** checkpoint need not have completed for this to cause problems. + */ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + + assert( pWal->readLock>0 || pWal->hdr.mxFrame==0 ); + assert( pInfo->aReadMark[pWal->readLock]<=pSnapshot->mxFrame ); + + /* Check that the wal file has not been wrapped. Assuming that it has + ** not, also check that no checkpointer has attempted to checkpoint any + ** frames beyond pSnapshot->mxFrame. If either of these conditions are + ** true, return SQLITE_ERROR_SNAPSHOT. Otherwise, overwrite pWal->hdr + ** with *pSnapshot and set *pChanged as appropriate for opening the + ** snapshot. */ + if( !memcmp(pSnapshot->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) + && pSnapshot->mxFrame>=pInfo->nBackfillAttempted + ){ + assert( pWal->readLock>0 ); + memcpy(&pWal->hdr, pSnapshot, sizeof(WalIndexHdr)); + *pChanged = bChanged; + }else{ + rc = SQLITE_ERROR_SNAPSHOT; + } + + /* A client using a non-current snapshot may not ignore any frames + ** from the start of the wal file. This is because, for a system + ** where (minFrame < iSnapshot < maxFrame), a checkpointer may + ** have omitted to checkpoint a frame earlier than minFrame in + ** the file because there exists a frame after iSnapshot that + ** is the same database page. */ + pWal->minFrame = 1; + + if( rc!=SQLITE_OK ){ + sqlite3WalEndReadTransaction(pWal); + } + } + } + + /* Release the shared CKPT lock obtained above. */ + if( pWal->ckptLock ){ + assert( pSnapshot ); + walUnlockShared(pWal, WAL_CKPT_LOCK); + pWal->ckptLock = 0; + } +#endif + return rc; +} + +/* +** Finish with a read transaction. All this does is release the +** read-lock. +*/ +SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal){ + sqlite3WalEndWriteTransaction(pWal); + if( pWal->readLock>=0 ){ + walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); + pWal->readLock = -1; + } +} + +/* +** Search the wal file for page pgno. If found, set *piRead to the frame that +** contains the page. Otherwise, if pgno is not in the wal file, set *piRead +** to zero. +** +** Return SQLITE_OK if successful, or an error code if an error occurs. If an +** error does occur, the final value of *piRead is undefined. +*/ +SQLITE_PRIVATE int sqlite3WalFindFrame( + Wal *pWal, /* WAL handle */ + Pgno pgno, /* Database page number to read data for */ + u32 *piRead /* OUT: Frame number (or zero) */ +){ + u32 iRead = 0; /* If !=0, WAL frame to return data from */ + u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */ + int iHash; /* Used to loop through N hash tables */ + int iMinHash; + + /* This routine is only be called from within a read transaction. */ + assert( pWal->readLock>=0 || pWal->lockError ); + + /* If the "last page" field of the wal-index header snapshot is 0, then + ** no data will be read from the wal under any circumstances. Return early + ** in this case as an optimization. Likewise, if pWal->readLock==0, + ** then the WAL is ignored by the reader so return early, as if the + ** WAL were empty. + */ + if( iLast==0 || (pWal->readLock==0 && pWal->bShmUnreliable==0) ){ + *piRead = 0; + return SQLITE_OK; + } + + /* Search the hash table or tables for an entry matching page number + ** pgno. Each iteration of the following for() loop searches one + ** hash table (each hash table indexes up to HASHTABLE_NPAGE frames). + ** + ** This code might run concurrently to the code in walIndexAppend() + ** that adds entries to the wal-index (and possibly to this hash + ** table). This means the value just read from the hash + ** slot (aHash[iKey]) may have been added before or after the + ** current read transaction was opened. Values added after the + ** read transaction was opened may have been written incorrectly - + ** i.e. these slots may contain garbage data. However, we assume + ** that any slots written before the current read transaction was + ** opened remain unmodified. + ** + ** For the reasons above, the if(...) condition featured in the inner + ** loop of the following block is more stringent that would be required + ** if we had exclusive access to the hash-table: + ** + ** (aPgno[iFrame]==pgno): + ** This condition filters out normal hash-table collisions. + ** + ** (iFrame<=iLast): + ** This condition filters out entries that were added to the hash + ** table after the current read-transaction had started. + */ + iMinHash = walFramePage(pWal->minFrame); + for(iHash=walFramePage(iLast); iHash>=iMinHash; iHash--){ + WalHashLoc sLoc; /* Hash table location */ + int iKey; /* Hash slot index */ + int nCollide; /* Number of hash collisions remaining */ + int rc; /* Error code */ + u32 iH; + + rc = walHashGet(pWal, iHash, &sLoc); + if( rc!=SQLITE_OK ){ + return rc; + } + nCollide = HASHTABLE_NSLOT; + iKey = walHash(pgno); + while( (iH = AtomicLoad(&sLoc.aHash[iKey]))!=0 ){ + u32 iFrame = iH + sLoc.iZero; + if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH]==pgno ){ + assert( iFrame>iRead || CORRUPT_DB ); + iRead = iFrame; + } + if( (nCollide--)==0 ){ + return SQLITE_CORRUPT_BKPT; + } + iKey = walNextHash(iKey); + } + if( iRead ) break; + } + +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT + /* If expensive assert() statements are available, do a linear search + ** of the wal-index file content. Make sure the results agree with the + ** result obtained using the hash indexes above. */ + { + u32 iRead2 = 0; + u32 iTest; + assert( pWal->bShmUnreliable || pWal->minFrame>0 ); + for(iTest=iLast; iTest>=pWal->minFrame && iTest>0; iTest--){ + if( walFramePgno(pWal, iTest)==pgno ){ + iRead2 = iTest; + break; + } + } + assert( iRead==iRead2 ); + } +#endif + + *piRead = iRead; + return SQLITE_OK; +} + +/* +** Read the contents of frame iRead from the wal file into buffer pOut +** (which is nOut bytes in size). Return SQLITE_OK if successful, or an +** error code otherwise. +*/ +SQLITE_PRIVATE int sqlite3WalReadFrame( + Wal *pWal, /* WAL handle */ + u32 iRead, /* Frame to read */ + int nOut, /* Size of buffer pOut in bytes */ + u8 *pOut /* Buffer to write page data to */ +){ + int sz; + i64 iOffset; + sz = pWal->hdr.szPage; + sz = (sz&0xfe00) + ((sz&0x0001)<<16); + testcase( sz<=32768 ); + testcase( sz>=65536 ); + iOffset = walFrameOffset(iRead, sz) + WAL_FRAME_HDRSIZE; + /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL */ + return sqlite3OsRead(pWal->pWalFd, pOut, (nOut>sz ? sz : nOut), iOffset); +} + +/* +** Return the size of the database in pages (or zero, if unknown). +*/ +SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal){ + if( pWal && ALWAYS(pWal->readLock>=0) ){ + return pWal->hdr.nPage; + } + return 0; +} + + +/* +** This function starts a write transaction on the WAL. +** +** A read transaction must have already been started by a prior call +** to sqlite3WalBeginReadTransaction(). +** +** If another thread or process has written into the database since +** the read transaction was started, then it is not possible for this +** thread to write as doing so would cause a fork. So this routine +** returns SQLITE_BUSY in that case and no write transaction is started. +** +** There can only be a single writer active at a time. +*/ +SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ + int rc; + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + /* If the write-lock is already held, then it was obtained before the + ** read-transaction was even opened, making this call a no-op. + ** Return early. */ + if( pWal->writeLock ){ + assert( !memcmp(&pWal->hdr,(void *)walIndexHdr(pWal),sizeof(WalIndexHdr)) ); + return SQLITE_OK; + } +#endif + + /* Cannot start a write transaction without first holding a read + ** transaction. */ + assert( pWal->readLock>=0 ); + assert( pWal->writeLock==0 && pWal->iReCksum==0 ); + + if( pWal->readOnly ){ + return SQLITE_READONLY; + } + + /* Only one writer allowed at a time. Get the write lock. Return + ** SQLITE_BUSY if unable. + */ + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + if( rc ){ + return rc; + } + pWal->writeLock = 1; + + /* If another connection has written to the database file since the + ** time the read transaction on this connection was started, then + ** the write is disallowed. + */ + if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + rc = SQLITE_BUSY_SNAPSHOT; + } + + return rc; +} + +/* +** End a write transaction. The commit has already been done. This +** routine merely releases the lock. +*/ +SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal){ + if( pWal->writeLock ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + pWal->iReCksum = 0; + pWal->truncateOnCommit = 0; + } + return SQLITE_OK; +} + +/* +** If any data has been written (but not committed) to the log file, this +** function moves the write-pointer back to the start of the transaction. +** +** Additionally, the callback function is invoked for each frame written +** to the WAL since the start of the transaction. If the callback returns +** other than SQLITE_OK, it is not invoked again and the error code is +** returned to the caller. +** +** Otherwise, if the callback function does not return an error, this +** function returns SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ + int rc = SQLITE_OK; + if( ALWAYS(pWal->writeLock) ){ + Pgno iMax = pWal->hdr.mxFrame; + Pgno iFrame; + + /* Restore the clients cache of the wal-index header to the state it + ** was in before the client began writing to the database. + */ + memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr)); + + for(iFrame=pWal->hdr.mxFrame+1; + ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; + iFrame++ + ){ + /* This call cannot fail. Unless the page for which the page number + ** is passed as the second argument is (a) in the cache and + ** (b) has an outstanding reference, then xUndo is either a no-op + ** (if (a) is false) or simply expels the page from the cache (if (b) + ** is false). + ** + ** If the upper layer is doing a rollback, it is guaranteed that there + ** are no outstanding references to any page other than page 1. And + ** page 1 is never written to the log until the transaction is + ** committed. As a result, the call to xUndo may not fail. + */ + assert( walFramePgno(pWal, iFrame)!=1 ); + rc = xUndo(pUndoCtx, walFramePgno(pWal, iFrame)); + } + if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal); + } + return rc; +} + +/* +** Argument aWalData must point to an array of WAL_SAVEPOINT_NDATA u32 +** values. This function populates the array with values required to +** "rollback" the write position of the WAL handle back to the current +** point in the event of a savepoint rollback (via WalSavepointUndo()). +*/ +SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){ + assert( pWal->writeLock ); + aWalData[0] = pWal->hdr.mxFrame; + aWalData[1] = pWal->hdr.aFrameCksum[0]; + aWalData[2] = pWal->hdr.aFrameCksum[1]; + aWalData[3] = pWal->nCkpt; +} + +/* +** Move the write position of the WAL back to the point identified by +** the values in the aWalData[] array. aWalData must point to an array +** of WAL_SAVEPOINT_NDATA u32 values that has been previously populated +** by a call to WalSavepoint(). +*/ +SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ + int rc = SQLITE_OK; + + assert( pWal->writeLock ); + assert( aWalData[3]!=pWal->nCkpt || aWalData[0]<=pWal->hdr.mxFrame ); + + if( aWalData[3]!=pWal->nCkpt ){ + /* This savepoint was opened immediately after the write-transaction + ** was started. Right after that, the writer decided to wrap around + ** to the start of the log. Update the savepoint values to match. + */ + aWalData[0] = 0; + aWalData[3] = pWal->nCkpt; + } + + if( aWalData[0]hdr.mxFrame ){ + pWal->hdr.mxFrame = aWalData[0]; + pWal->hdr.aFrameCksum[0] = aWalData[1]; + pWal->hdr.aFrameCksum[1] = aWalData[2]; + walCleanupHash(pWal); + } + + return rc; +} + +/* +** This function is called just before writing a set of frames to the log +** file (see sqlite3WalFrames()). It checks to see if, instead of appending +** to the current log file, it is possible to overwrite the start of the +** existing log file with the new frames (i.e. "reset" the log). If so, +** it sets pWal->hdr.mxFrame to 0. Otherwise, pWal->hdr.mxFrame is left +** unchanged. +** +** SQLITE_OK is returned if no error is encountered (regardless of whether +** or not pWal->hdr.mxFrame is modified). An SQLite error code is returned +** if an error occurs. +*/ +static int walRestartLog(Wal *pWal){ + int rc = SQLITE_OK; + int cnt; + + if( pWal->readLock==0 ){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + assert( pInfo->nBackfill==pWal->hdr.mxFrame ); + if( pInfo->nBackfill>0 ){ + u32 salt1; + sqlite3_randomness(4, &salt1); + rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + if( rc==SQLITE_OK ){ + /* If all readers are using WAL_READ_LOCK(0) (in other words if no + ** readers are currently using the WAL), then the transactions + ** frames will overwrite the start of the existing log. Update the + ** wal-index header to reflect this. + ** + ** In theory it would be Ok to update the cache of the header only + ** at this point. But updating the actual wal-index header is also + ** safe and means there is no special case for sqlite3WalUndo() + ** to handle if this transaction is rolled back. */ + walRestartHdr(pWal, salt1); + walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + }else if( rc!=SQLITE_BUSY ){ + return rc; + } + } + walUnlockShared(pWal, WAL_READ_LOCK(0)); + pWal->readLock = -1; + cnt = 0; + do{ + int notUsed; + rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt); + }while( rc==WAL_RETRY ); + assert( (rc&0xff)!=SQLITE_BUSY ); /* BUSY not possible when useWal==1 */ + testcase( (rc&0xff)==SQLITE_IOERR ); + testcase( rc==SQLITE_PROTOCOL ); + testcase( rc==SQLITE_OK ); + } + return rc; +} + +/* +** Information about the current state of the WAL file and where +** the next fsync should occur - passed from sqlite3WalFrames() into +** walWriteToLog(). +*/ +typedef struct WalWriter { + Wal *pWal; /* The complete WAL information */ + sqlite3_file *pFd; /* The WAL file to which we write */ + sqlite3_int64 iSyncPoint; /* Fsync at this offset */ + int syncFlags; /* Flags for the fsync */ + int szPage; /* Size of one page */ +} WalWriter; + +/* +** Write iAmt bytes of content into the WAL file beginning at iOffset. +** Do a sync when crossing the p->iSyncPoint boundary. +** +** In other words, if iSyncPoint is in between iOffset and iOffset+iAmt, +** first write the part before iSyncPoint, then sync, then write the +** rest. +*/ +static int walWriteToLog( + WalWriter *p, /* WAL to write to */ + void *pContent, /* Content to be written */ + int iAmt, /* Number of bytes to write */ + sqlite3_int64 iOffset /* Start writing at this offset */ +){ + int rc; + if( iOffsetiSyncPoint && iOffset+iAmt>=p->iSyncPoint ){ + int iFirstAmt = (int)(p->iSyncPoint - iOffset); + rc = sqlite3OsWrite(p->pFd, pContent, iFirstAmt, iOffset); + if( rc ) return rc; + iOffset += iFirstAmt; + iAmt -= iFirstAmt; + pContent = (void*)(iFirstAmt + (char*)pContent); + assert( WAL_SYNC_FLAGS(p->syncFlags)!=0 ); + rc = sqlite3OsSync(p->pFd, WAL_SYNC_FLAGS(p->syncFlags)); + if( iAmt==0 || rc ) return rc; + } + rc = sqlite3OsWrite(p->pFd, pContent, iAmt, iOffset); + return rc; +} + +/* +** Write out a single frame of the WAL +*/ +static int walWriteOneFrame( + WalWriter *p, /* Where to write the frame */ + PgHdr *pPage, /* The page of the frame to be written */ + int nTruncate, /* The commit flag. Usually 0. >0 for commit */ + sqlite3_int64 iOffset /* Byte offset at which to write */ +){ + int rc; /* Result code from subfunctions */ + void *pData; /* Data actually written */ + u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */ + pData = pPage->pData; + walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame); + rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset); + if( rc ) return rc; + /* Write the page data */ + rc = walWriteToLog(p, pData, p->szPage, iOffset+sizeof(aFrame)); + return rc; +} + +/* +** This function is called as part of committing a transaction within which +** one or more frames have been overwritten. It updates the checksums for +** all frames written to the wal file by the current transaction starting +** with the earliest to have been overwritten. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int walRewriteChecksums(Wal *pWal, u32 iLast){ + const int szPage = pWal->szPage;/* Database page size */ + int rc = SQLITE_OK; /* Return code */ + u8 *aBuf; /* Buffer to load data from wal file into */ + u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-headers in */ + u32 iRead; /* Next frame to read from wal file */ + i64 iCksumOff; + + aBuf = sqlite3_malloc(szPage + WAL_FRAME_HDRSIZE); + if( aBuf==0 ) return SQLITE_NOMEM_BKPT; + + /* Find the checksum values to use as input for the recalculating the + ** first checksum. If the first frame is frame 1 (implying that the current + ** transaction restarted the wal file), these values must be read from the + ** wal-file header. Otherwise, read them from the frame header of the + ** previous frame. */ + assert( pWal->iReCksum>0 ); + if( pWal->iReCksum==1 ){ + iCksumOff = 24; + }else{ + iCksumOff = walFrameOffset(pWal->iReCksum-1, szPage) + 16; + } + rc = sqlite3OsRead(pWal->pWalFd, aBuf, sizeof(u32)*2, iCksumOff); + pWal->hdr.aFrameCksum[0] = sqlite3Get4byte(aBuf); + pWal->hdr.aFrameCksum[1] = sqlite3Get4byte(&aBuf[sizeof(u32)]); + + iRead = pWal->iReCksum; + pWal->iReCksum = 0; + for(; rc==SQLITE_OK && iRead<=iLast; iRead++){ + i64 iOff = walFrameOffset(iRead, szPage); + rc = sqlite3OsRead(pWal->pWalFd, aBuf, szPage+WAL_FRAME_HDRSIZE, iOff); + if( rc==SQLITE_OK ){ + u32 iPgno, nDbSize; + iPgno = sqlite3Get4byte(aBuf); + nDbSize = sqlite3Get4byte(&aBuf[4]); + + walEncodeFrame(pWal, iPgno, nDbSize, &aBuf[WAL_FRAME_HDRSIZE], aFrame); + rc = sqlite3OsWrite(pWal->pWalFd, aFrame, sizeof(aFrame), iOff); + } + } + + sqlite3_free(aBuf); + return rc; +} + +/* +** Write a set of frames to the log. The caller must hold the write-lock +** on the log file (obtained using sqlite3WalBeginWriteTransaction()). +*/ +SQLITE_PRIVATE int sqlite3WalFrames( + Wal *pWal, /* Wal handle to write to */ + int szPage, /* Database page-size in bytes */ + PgHdr *pList, /* List of dirty pages to write */ + Pgno nTruncate, /* Database size after this commit */ + int isCommit, /* True if this is a commit */ + int sync_flags /* Flags to pass to OsSync() (or 0) */ +){ + int rc; /* Used to catch return codes */ + u32 iFrame; /* Next frame address */ + PgHdr *p; /* Iterator to run through pList with. */ + PgHdr *pLast = 0; /* Last frame in list */ + int nExtra = 0; /* Number of extra copies of last page */ + int szFrame; /* The size of a single frame */ + i64 iOffset; /* Next byte to write in WAL file */ + WalWriter w; /* The writer */ + u32 iFirst = 0; /* First frame that may be overwritten */ + WalIndexHdr *pLive; /* Pointer to shared header */ + + assert( pList ); + assert( pWal->writeLock ); + + /* If this frame set completes a transaction, then nTruncate>0. If + ** nTruncate==0 then this frame set does not complete the transaction. */ + assert( (isCommit!=0)==(nTruncate!=0) ); + +#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) + { int cnt; for(cnt=0, p=pList; p; p=p->pDirty, cnt++){} + WALTRACE(("WAL%p: frame write begin. %d frames. mxFrame=%d. %s\n", + pWal, cnt, pWal->hdr.mxFrame, isCommit ? "Commit" : "Spill")); + } +#endif + + pLive = (WalIndexHdr*)walIndexHdr(pWal); + if( memcmp(&pWal->hdr, (void *)pLive, sizeof(WalIndexHdr))!=0 ){ + iFirst = pLive->mxFrame+1; + } + + /* See if it is possible to write these frames into the start of the + ** log file, instead of appending to it at pWal->hdr.mxFrame. + */ + if( SQLITE_OK!=(rc = walRestartLog(pWal)) ){ + return rc; + } + + /* If this is the first frame written into the log, write the WAL + ** header to the start of the WAL file. See comments at the top of + ** this source file for a description of the WAL header format. + */ + iFrame = pWal->hdr.mxFrame; + if( iFrame==0 ){ + u8 aWalHdr[WAL_HDRSIZE]; /* Buffer to assemble wal-header in */ + u32 aCksum[2]; /* Checksum for wal-header */ + + sqlite3Put4byte(&aWalHdr[0], (WAL_MAGIC | SQLITE_BIGENDIAN)); + sqlite3Put4byte(&aWalHdr[4], WAL_MAX_VERSION); + sqlite3Put4byte(&aWalHdr[8], szPage); + sqlite3Put4byte(&aWalHdr[12], pWal->nCkpt); + if( pWal->nCkpt==0 ) sqlite3_randomness(8, pWal->hdr.aSalt); + memcpy(&aWalHdr[16], pWal->hdr.aSalt, 8); + walChecksumBytes(1, aWalHdr, WAL_HDRSIZE-2*4, 0, aCksum); + sqlite3Put4byte(&aWalHdr[24], aCksum[0]); + sqlite3Put4byte(&aWalHdr[28], aCksum[1]); + + pWal->szPage = szPage; + pWal->hdr.bigEndCksum = SQLITE_BIGENDIAN; + pWal->hdr.aFrameCksum[0] = aCksum[0]; + pWal->hdr.aFrameCksum[1] = aCksum[1]; + pWal->truncateOnCommit = 1; + + rc = sqlite3OsWrite(pWal->pWalFd, aWalHdr, sizeof(aWalHdr), 0); + WALTRACE(("WAL%p: wal-header write %s\n", pWal, rc ? "failed" : "ok")); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Sync the header (unless SQLITE_IOCAP_SEQUENTIAL is true or unless + ** all syncing is turned off by PRAGMA synchronous=OFF). Otherwise + ** an out-of-order write following a WAL restart could result in + ** database corruption. See the ticket: + ** + ** https://sqlite.org/src/info/ff5be73dee + */ + if( pWal->syncHeader ){ + rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); + if( rc ) return rc; + } + } + assert( (int)pWal->szPage==szPage ); + + /* Setup information needed to write frames into the WAL */ + w.pWal = pWal; + w.pFd = pWal->pWalFd; + w.iSyncPoint = 0; + w.syncFlags = sync_flags; + w.szPage = szPage; + iOffset = walFrameOffset(iFrame+1, szPage); + szFrame = szPage + WAL_FRAME_HDRSIZE; + + /* Write all frames into the log file exactly once */ + for(p=pList; p; p=p->pDirty){ + int nDbSize; /* 0 normally. Positive == commit flag */ + + /* Check if this page has already been written into the wal file by + ** the current transaction. If so, overwrite the existing frame and + ** set Wal.writeLock to WAL_WRITELOCK_RECKSUM - indicating that + ** checksums must be recomputed when the transaction is committed. */ + if( iFirst && (p->pDirty || isCommit==0) ){ + u32 iWrite = 0; + VVA_ONLY(rc =) sqlite3WalFindFrame(pWal, p->pgno, &iWrite); + assert( rc==SQLITE_OK || iWrite==0 ); + if( iWrite>=iFirst ){ + i64 iOff = walFrameOffset(iWrite, szPage) + WAL_FRAME_HDRSIZE; + void *pData; + if( pWal->iReCksum==0 || iWriteiReCksum ){ + pWal->iReCksum = iWrite; + } + pData = p->pData; + rc = sqlite3OsWrite(pWal->pWalFd, pData, szPage, iOff); + if( rc ) return rc; + p->flags &= ~PGHDR_WAL_APPEND; + continue; + } + } + + iFrame++; + assert( iOffset==walFrameOffset(iFrame, szPage) ); + nDbSize = (isCommit && p->pDirty==0) ? nTruncate : 0; + rc = walWriteOneFrame(&w, p, nDbSize, iOffset); + if( rc ) return rc; + pLast = p; + iOffset += szFrame; + p->flags |= PGHDR_WAL_APPEND; + } + + /* Recalculate checksums within the wal file if required. */ + if( isCommit && pWal->iReCksum ){ + rc = walRewriteChecksums(pWal, iFrame); + if( rc ) return rc; + } + + /* If this is the end of a transaction, then we might need to pad + ** the transaction and/or sync the WAL file. + ** + ** Padding and syncing only occur if this set of frames complete a + ** transaction and if PRAGMA synchronous=FULL. If synchronous==NORMAL + ** or synchronous==OFF, then no padding or syncing are needed. + ** + ** If SQLITE_IOCAP_POWERSAFE_OVERWRITE is defined, then padding is not + ** needed and only the sync is done. If padding is needed, then the + ** final frame is repeated (with its commit mark) until the next sector + ** boundary is crossed. Only the part of the WAL prior to the last + ** sector boundary is synced; the part of the last frame that extends + ** past the sector boundary is written after the sync. + */ + if( isCommit && WAL_SYNC_FLAGS(sync_flags)!=0 ){ + int bSync = 1; + if( pWal->padToSectorBoundary ){ + int sectorSize = sqlite3SectorSize(pWal->pWalFd); + w.iSyncPoint = ((iOffset+sectorSize-1)/sectorSize)*sectorSize; + bSync = (w.iSyncPoint==iOffset); + testcase( bSync ); + while( iOffsettruncateOnCommit && pWal->mxWalSize>=0 ){ + i64 sz = pWal->mxWalSize; + if( walFrameOffset(iFrame+nExtra+1, szPage)>pWal->mxWalSize ){ + sz = walFrameOffset(iFrame+nExtra+1, szPage); + } + walLimitSize(pWal, sz); + pWal->truncateOnCommit = 0; + } + + /* Append data to the wal-index. It is not necessary to lock the + ** wal-index to do this as the SQLITE_SHM_WRITE lock held on the wal-index + ** guarantees that there are no other writers, and no data that may + ** be in use by existing readers is being overwritten. + */ + iFrame = pWal->hdr.mxFrame; + for(p=pList; p && rc==SQLITE_OK; p=p->pDirty){ + if( (p->flags & PGHDR_WAL_APPEND)==0 ) continue; + iFrame++; + rc = walIndexAppend(pWal, iFrame, p->pgno); + } + assert( pLast!=0 || nExtra==0 ); + while( rc==SQLITE_OK && nExtra>0 ){ + iFrame++; + nExtra--; + rc = walIndexAppend(pWal, iFrame, pLast->pgno); + } + + if( rc==SQLITE_OK ){ + /* Update the private copy of the header. */ + pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16)); + testcase( szPage<=32768 ); + testcase( szPage>=65536 ); + pWal->hdr.mxFrame = iFrame; + if( isCommit ){ + pWal->hdr.iChange++; + pWal->hdr.nPage = nTruncate; + } + /* If this is a commit, update the wal-index header too. */ + if( isCommit ){ + walIndexWriteHdr(pWal); + pWal->iCallback = iFrame; + } + } + + WALTRACE(("WAL%p: frame write %s\n", pWal, rc ? "failed" : "ok")); + return rc; +} + +/* +** This routine is called to implement sqlite3_wal_checkpoint() and +** related interfaces. +** +** Obtain a CHECKPOINT lock and then backfill as much information as +** we can from WAL into the database. +** +** If parameter xBusy is not NULL, it is a pointer to a busy-handler +** callback. In this case this function runs a blocking checkpoint. +*/ +SQLITE_PRIVATE int sqlite3WalCheckpoint( + Wal *pWal, /* Wal connection */ + sqlite3 *db, /* Check this handle's interrupt flag */ + int eMode, /* PASSIVE, FULL, RESTART, or TRUNCATE */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int sync_flags, /* Flags to sync db file with (or 0) */ + int nBuf, /* Size of temporary buffer */ + u8 *zBuf, /* Temporary buffer to use */ + int *pnLog, /* OUT: Number of frames in WAL */ + int *pnCkpt /* OUT: Number of backfilled frames in WAL */ +){ + int rc; /* Return code */ + int isChanged = 0; /* True if a new wal-index header is loaded */ + int eMode2 = eMode; /* Mode to pass to walCheckpoint() */ + int (*xBusy2)(void*) = xBusy; /* Busy handler for eMode2 */ + + assert( pWal->ckptLock==0 ); + assert( pWal->writeLock==0 ); + + /* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked + ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ + assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); + + if( pWal->readOnly ) return SQLITE_READONLY; + WALTRACE(("WAL%p: checkpoint begins\n", pWal)); + + /* Enable blocking locks, if possible. If blocking locks are successfully + ** enabled, set xBusy2=0 so that the busy-handler is never invoked. */ + sqlite3WalDb(pWal, db); + (void)walEnableBlocking(pWal); + + /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive + ** "checkpoint" lock on the database file. + ** EVIDENCE-OF: R-10421-19736 If any other process is running a + ** checkpoint operation at the same time, the lock cannot be obtained and + ** SQLITE_BUSY is returned. + ** EVIDENCE-OF: R-53820-33897 Even if there is a busy-handler configured, + ** it will not be invoked in this case. + */ + rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); + testcase( rc==SQLITE_BUSY ); + testcase( rc!=SQLITE_OK && xBusy2!=0 ); + if( rc==SQLITE_OK ){ + pWal->ckptLock = 1; + + /* IMPLEMENTATION-OF: R-59782-36818 The SQLITE_CHECKPOINT_FULL, RESTART and + ** TRUNCATE modes also obtain the exclusive "writer" lock on the database + ** file. + ** + ** EVIDENCE-OF: R-60642-04082 If the writer lock cannot be obtained + ** immediately, and a busy-handler is configured, it is invoked and the + ** writer lock retried until either the busy-handler returns 0 or the + ** lock is successfully obtained. + */ + if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){ + rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + }else if( rc==SQLITE_BUSY ){ + eMode2 = SQLITE_CHECKPOINT_PASSIVE; + xBusy2 = 0; + rc = SQLITE_OK; + } + } + } + + + /* Read the wal-index header. */ + if( rc==SQLITE_OK ){ + walDisableBlocking(pWal); + rc = walIndexReadHdr(pWal, &isChanged); + (void)walEnableBlocking(pWal); + if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ + sqlite3OsUnfetch(pWal->pDbFd, 0, 0); + } + } + + /* Copy data from the log to the database file. */ + if( rc==SQLITE_OK ){ + + if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); + } + + /* If no error occurred, set the output variables. */ + if( rc==SQLITE_OK || rc==SQLITE_BUSY ){ + if( pnLog ) *pnLog = (int)pWal->hdr.mxFrame; + if( pnCkpt ) *pnCkpt = (int)(walCkptInfo(pWal)->nBackfill); + } + } + + if( isChanged ){ + /* If a new wal-index header was loaded before the checkpoint was + ** performed, then the pager-cache associated with pWal is now + ** out of date. So zero the cached wal-index header to ensure that + ** next time the pager opens a snapshot on this database it knows that + ** the cache needs to be reset. + */ + memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); + } + + walDisableBlocking(pWal); + sqlite3WalDb(pWal, 0); + + /* Release the locks. */ + sqlite3WalEndWriteTransaction(pWal); + if( pWal->ckptLock ){ + walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); + pWal->ckptLock = 0; + } + WALTRACE(("WAL%p: checkpoint %s\n", pWal, rc ? "failed" : "ok")); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( rc==SQLITE_BUSY_TIMEOUT ) rc = SQLITE_BUSY; +#endif + return (rc==SQLITE_OK && eMode!=eMode2 ? SQLITE_BUSY : rc); +} + +/* Return the value to pass to a sqlite3_wal_hook callback, the +** number of frames in the WAL at the point of the last commit since +** sqlite3WalCallback() was called. If no commits have occurred since +** the last call, then return 0. +*/ +SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal){ + u32 ret = 0; + if( pWal ){ + ret = pWal->iCallback; + pWal->iCallback = 0; + } + return (int)ret; +} + +/* +** This function is called to change the WAL subsystem into or out +** of locking_mode=EXCLUSIVE. +** +** If op is zero, then attempt to change from locking_mode=EXCLUSIVE +** into locking_mode=NORMAL. This means that we must acquire a lock +** on the pWal->readLock byte. If the WAL is already in locking_mode=NORMAL +** or if the acquisition of the lock fails, then return 0. If the +** transition out of exclusive-mode is successful, return 1. This +** operation must occur while the pager is still holding the exclusive +** lock on the main database file. +** +** If op is one, then change from locking_mode=NORMAL into +** locking_mode=EXCLUSIVE. This means that the pWal->readLock must +** be released. Return 1 if the transition is made and 0 if the +** WAL is already in exclusive-locking mode - meaning that this +** routine is a no-op. The pager must already hold the exclusive lock +** on the main database file before invoking this operation. +** +** If op is negative, then do a dry-run of the op==1 case but do +** not actually change anything. The pager uses this to see if it +** should acquire the database exclusive lock prior to invoking +** the op==1 case. +*/ +SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){ + int rc; + assert( pWal->writeLock==0 ); + assert( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE || op==-1 ); + + /* pWal->readLock is usually set, but might be -1 if there was a + ** prior error while attempting to acquire are read-lock. This cannot + ** happen if the connection is actually in exclusive mode (as no xShmLock + ** locks are taken in this case). Nor should the pager attempt to + ** upgrade to exclusive-mode following such an error. + */ + assert( pWal->readLock>=0 || pWal->lockError ); + assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) ); + + if( op==0 ){ + if( pWal->exclusiveMode!=WAL_NORMAL_MODE ){ + pWal->exclusiveMode = WAL_NORMAL_MODE; + if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){ + pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; + } + rc = pWal->exclusiveMode==WAL_NORMAL_MODE; + }else{ + /* Already in locking_mode=NORMAL */ + rc = 0; + } + }else if( op>0 ){ + assert( pWal->exclusiveMode==WAL_NORMAL_MODE ); + assert( pWal->readLock>=0 ); + walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); + pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; + rc = 1; + }else{ + rc = pWal->exclusiveMode==WAL_NORMAL_MODE; + } + return rc; +} + +/* +** Return true if the argument is non-NULL and the WAL module is using +** heap-memory for the wal-index. Otherwise, if the argument is NULL or the +** WAL module is using shared-memory, return false. +*/ +SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal){ + return (pWal && pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ); +} + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* Create a snapshot object. The content of a snapshot is opaque to +** every other subsystem, so the WAL module can put whatever it needs +** in the object. +*/ +SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot){ + int rc = SQLITE_OK; + WalIndexHdr *pRet; + static const u32 aZero[4] = { 0, 0, 0, 0 }; + + assert( pWal->readLock>=0 && pWal->writeLock==0 ); + + if( memcmp(&pWal->hdr.aFrameCksum[0],aZero,16)==0 ){ + *ppSnapshot = 0; + return SQLITE_ERROR; + } + pRet = (WalIndexHdr*)sqlite3_malloc(sizeof(WalIndexHdr)); + if( pRet==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + memcpy(pRet, &pWal->hdr, sizeof(WalIndexHdr)); + *ppSnapshot = (sqlite3_snapshot*)pRet; + } + + return rc; +} + +/* Try to open on pSnapshot when the next read-transaction starts +*/ +SQLITE_PRIVATE void sqlite3WalSnapshotOpen( + Wal *pWal, + sqlite3_snapshot *pSnapshot +){ + pWal->pSnapshot = (WalIndexHdr*)pSnapshot; +} + +/* +** Return a +ve value if snapshot p1 is newer than p2. A -ve value if +** p1 is older than p2 and zero if p1 and p2 are the same snapshot. +*/ +SQLITE_API int sqlite3_snapshot_cmp(sqlite3_snapshot *p1, sqlite3_snapshot *p2){ + WalIndexHdr *pHdr1 = (WalIndexHdr*)p1; + WalIndexHdr *pHdr2 = (WalIndexHdr*)p2; + + /* aSalt[0] is a copy of the value stored in the wal file header. It + ** is incremented each time the wal file is restarted. */ + if( pHdr1->aSalt[0]aSalt[0] ) return -1; + if( pHdr1->aSalt[0]>pHdr2->aSalt[0] ) return +1; + if( pHdr1->mxFramemxFrame ) return -1; + if( pHdr1->mxFrame>pHdr2->mxFrame ) return +1; + return 0; +} + +/* +** The caller currently has a read transaction open on the database. +** This function takes a SHARED lock on the CHECKPOINTER slot and then +** checks if the snapshot passed as the second argument is still +** available. If so, SQLITE_OK is returned. +** +** If the snapshot is not available, SQLITE_ERROR is returned. Or, if +** the CHECKPOINTER lock cannot be obtained, SQLITE_BUSY. If any error +** occurs (any value other than SQLITE_OK is returned), the CHECKPOINTER +** lock is released before returning. +*/ +SQLITE_PRIVATE int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot){ + int rc; + rc = walLockShared(pWal, WAL_CKPT_LOCK); + if( rc==SQLITE_OK ){ + WalIndexHdr *pNew = (WalIndexHdr*)pSnapshot; + if( memcmp(pNew->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) + || pNew->mxFramenBackfillAttempted + ){ + rc = SQLITE_ERROR_SNAPSHOT; + walUnlockShared(pWal, WAL_CKPT_LOCK); + } + } + return rc; +} + +/* +** Release a lock obtained by an earlier successful call to +** sqlite3WalSnapshotCheck(). +*/ +SQLITE_PRIVATE void sqlite3WalSnapshotUnlock(Wal *pWal){ + assert( pWal ); + walUnlockShared(pWal, WAL_CKPT_LOCK); +} + + +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +#ifdef SQLITE_ENABLE_ZIPVFS +/* +** If the argument is not NULL, it points to a Wal object that holds a +** read-lock. This function returns the database page-size if it is known, +** or zero if it is not (or if pWal is NULL). +*/ +SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal){ + assert( pWal==0 || pWal->readLock>=0 ); + return (pWal ? pWal->szPage : 0); +} +#endif + +/* Return the sqlite3_file object for the WAL file +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){ + return pWal->pWalFd; +} + +#endif /* #ifndef SQLITE_OMIT_WAL */ + +/************** End of wal.c *************************************************/ +/************** Begin file btmutex.c *****************************************/ +/* +** 2007 August 27 +** +** 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 code used to implement mutexes on Btree objects. +** This code really belongs in btree.c. But btree.c is getting too +** big and we want to break it down some. This packaged seemed like +** a good breakout. +*/ +/************** Include btreeInt.h in the middle of btmutex.c ****************/ +/************** Begin file btreeInt.h ****************************************/ +/* +** 2004 April 6 +** +** 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 implements an external (disk-based) database using BTrees. +** For a detailed discussion of BTrees, refer to +** +** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3: +** "Sorting And Searching", pages 473-480. Addison-Wesley +** Publishing Company, Reading, Massachusetts. +** +** The basic idea is that each page of the file contains N database +** entries and N+1 pointers to subpages. +** +** ---------------------------------------------------------------- +** | Ptr(0) | Key(0) | Ptr(1) | Key(1) | ... | Key(N-1) | Ptr(N) | +** ---------------------------------------------------------------- +** +** All of the keys on the page that Ptr(0) points to have values less +** than Key(0). All of the keys on page Ptr(1) and its subpages have +** values greater than Key(0) and less than Key(1). All of the keys +** on Ptr(N) and its subpages have values greater than Key(N-1). And +** so forth. +** +** Finding a particular key requires reading O(log(M)) pages from the +** disk where M is the number of entries in the tree. +** +** In this implementation, a single file can hold one or more separate +** BTrees. Each BTree is identified by the index of its root page. The +** key and data for any entry are combined to form the "payload". A +** fixed amount of payload can be carried directly on the database +** page. If the payload is larger than the preset amount then surplus +** bytes are stored on overflow pages. The payload for an entry +** and the preceding pointer are combined to form a "Cell". Each +** page has a small header which contains the Ptr(N) pointer and other +** information such as the size of key and data. +** +** FORMAT DETAILS +** +** The file is divided into pages. The first page is called page 1, +** the second is page 2, and so forth. A page number of zero indicates +** "no such page". The page size can be any power of 2 between 512 and 65536. +** Each page can be either a btree page, a freelist page, an overflow +** page, or a pointer-map page. +** +** The first page is always a btree page. The first 100 bytes of the first +** page contain a special header (the "file header") that describes the file. +** The format of the file header is as follows: +** +** OFFSET SIZE DESCRIPTION +** 0 16 Header string: "SQLite format 3\000" +** 16 2 Page size in bytes. (1 means 65536) +** 18 1 File format write version +** 19 1 File format read version +** 20 1 Bytes of unused space at the end of each page +** 21 1 Max embedded payload fraction (must be 64) +** 22 1 Min embedded payload fraction (must be 32) +** 23 1 Min leaf payload fraction (must be 32) +** 24 4 File change counter +** 28 4 Reserved for future use +** 32 4 First freelist page +** 36 4 Number of freelist pages in the file +** 40 60 15 4-byte meta values passed to higher layers +** +** 40 4 Schema cookie +** 44 4 File format of schema layer +** 48 4 Size of page cache +** 52 4 Largest root-page (auto/incr_vacuum) +** 56 4 1=UTF-8 2=UTF16le 3=UTF16be +** 60 4 User version +** 64 4 Incremental vacuum mode +** 68 4 Application-ID +** 72 20 unused +** 92 4 The version-valid-for number +** 96 4 SQLITE_VERSION_NUMBER +** +** All of the integer values are big-endian (most significant byte first). +** +** The file change counter is incremented when the database is changed +** This counter allows other processes to know when the file has changed +** and thus when they need to flush their cache. +** +** The max embedded payload fraction is the amount of the total usable +** space in a page that can be consumed by a single cell for standard +** B-tree (non-LEAFDATA) tables. A value of 255 means 100%. The default +** is to limit the maximum cell size so that at least 4 cells will fit +** on one page. Thus the default max embedded payload fraction is 64. +** +** If the payload for a cell is larger than the max payload, then extra +** payload is spilled to overflow pages. Once an overflow page is allocated, +** as many bytes as possible are moved into the overflow pages without letting +** the cell size drop below the min embedded payload fraction. +** +** The min leaf payload fraction is like the min embedded payload fraction +** except that it applies to leaf nodes in a LEAFDATA tree. The maximum +** payload fraction for a LEAFDATA tree is always 100% (or 255) and it +** not specified in the header. +** +** Each btree pages is divided into three sections: The header, the +** cell pointer array, and the cell content area. Page 1 also has a 100-byte +** file header that occurs before the page header. +** +** |----------------| +** | file header | 100 bytes. Page 1 only. +** |----------------| +** | page header | 8 bytes for leaves. 12 bytes for interior nodes +** |----------------| +** | cell pointer | | 2 bytes per cell. Sorted order. +** | array | | Grows downward +** | | v +** |----------------| +** | unallocated | +** | space | +** |----------------| ^ Grows upwards +** | cell content | | Arbitrary order interspersed with freeblocks. +** | area | | and free space fragments. +** |----------------| +** +** The page headers looks like this: +** +** OFFSET SIZE DESCRIPTION +** 0 1 Flags. 1: intkey, 2: zerodata, 4: leafdata, 8: leaf +** 1 2 byte offset to the first freeblock +** 3 2 number of cells on this page +** 5 2 first byte of the cell content area +** 7 1 number of fragmented free bytes +** 8 4 Right child (the Ptr(N) value). Omitted on leaves. +** +** The flags define the format of this btree page. The leaf flag means that +** this page has no children. The zerodata flag means that this page carries +** only keys and no data. The intkey flag means that the key is an integer +** which is stored in the key size entry of the cell header rather than in +** the payload area. +** +** The cell pointer array begins on the first byte after the page header. +** The cell pointer array contains zero or more 2-byte numbers which are +** offsets from the beginning of the page to the cell content in the cell +** content area. The cell pointers occur in sorted order. The system strives +** to keep free space after the last cell pointer so that new cells can +** be easily added without having to defragment the page. +** +** Cell content is stored at the very end of the page and grows toward the +** beginning of the page. +** +** Unused space within the cell content area is collected into a linked list of +** freeblocks. Each freeblock is at least 4 bytes in size. The byte offset +** to the first freeblock is given in the header. Freeblocks occur in +** increasing order. Because a freeblock must be at least 4 bytes in size, +** any group of 3 or fewer unused bytes in the cell content area cannot +** exist on the freeblock chain. A group of 3 or fewer free bytes is called +** a fragment. The total number of bytes in all fragments is recorded. +** in the page header at offset 7. +** +** SIZE DESCRIPTION +** 2 Byte offset of the next freeblock +** 2 Bytes in this freeblock +** +** Cells are of variable length. Cells are stored in the cell content area at +** the end of the page. Pointers to the cells are in the cell pointer array +** that immediately follows the page header. Cells is not necessarily +** contiguous or in order, but cell pointers are contiguous and in order. +** +** Cell content makes use of variable length integers. A variable +** length integer is 1 to 9 bytes where the lower 7 bits of each +** byte are used. The integer consists of all bytes that have bit 8 set and +** the first byte with bit 8 clear. The most significant byte of the integer +** appears first. A variable-length integer may not be more than 9 bytes long. +** As a special case, all 8 bytes of the 9th byte are used as data. This +** allows a 64-bit integer to be encoded in 9 bytes. +** +** 0x00 becomes 0x00000000 +** 0x7f becomes 0x0000007f +** 0x81 0x00 becomes 0x00000080 +** 0x82 0x00 becomes 0x00000100 +** 0x80 0x7f becomes 0x0000007f +** 0x8a 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 +** bytes of key and data in a btree cell. +** +** The content of a cell looks like this: +** +** SIZE DESCRIPTION +** 4 Page number of the left child. Omitted if leaf flag is set. +** var Number of bytes of data. Omitted if the zerodata flag is set. +** var Number of bytes of key. Or the key itself if intkey flag is set. +** * Payload +** 4 First page of the overflow chain. Omitted if no overflow +** +** Overflow pages form a linked list. Each page except the last is completely +** filled with data (pagesize - 4 bytes). The last page can have as little +** as 1 byte of data. +** +** SIZE DESCRIPTION +** 4 Page number of next overflow page +** * Data +** +** Freelist pages come in two subtypes: trunk pages and leaf pages. The +** file header points to the first in a linked list of trunk page. Each trunk +** page points to multiple leaf pages. The content of a leaf page is +** unspecified. A trunk page looks like this: +** +** SIZE DESCRIPTION +** 4 Page number of next trunk page +** 4 Number of leaf pointers on this page +** * zero or more pages numbers of leaves +*/ +/* #include "sqliteInt.h" */ + + +/* The following value is the maximum cell size assuming a maximum page +** size give above. +*/ +#define MX_CELL_SIZE(pBt) ((int)(pBt->pageSize-8)) + +/* The maximum number of cells on a single page of the database. This +** assumes a minimum cell size of 6 bytes (4 bytes for the cell itself +** plus 2 bytes for the index to the cell in the page header). Such +** small cells will be rare, but they are possible. +*/ +#define MX_CELL(pBt) ((pBt->pageSize-8)/6) + +/* Forward declarations */ +typedef struct MemPage MemPage; +typedef struct BtLock BtLock; +typedef struct CellInfo CellInfo; + +/* +** This is a magic string that appears at the beginning of every +** SQLite database in order to identify the file as a real database. +** +** You can change this value at compile-time by specifying a +** -DSQLITE_FILE_HEADER="..." on the compiler command-line. The +** header must be exactly 16 bytes including the zero-terminator so +** the string itself should be 15 characters long. If you change +** the header, then your custom library will not be able to read +** databases generated by the standard tools and the standard tools +** will not be able to read databases created by your custom library. +*/ +#ifndef SQLITE_FILE_HEADER /* 123456789 123456 */ +# define SQLITE_FILE_HEADER "SQLite format 3" +#endif + +/* +** Page type flags. An ORed combination of these flags appear as the +** first byte of on-disk image of every BTree page. +*/ +#define PTF_INTKEY 0x01 +#define PTF_ZERODATA 0x02 +#define PTF_LEAFDATA 0x04 +#define PTF_LEAF 0x08 + +/* +** An instance of this object stores information about each a single database +** page that has been loaded into memory. The information in this object +** is derived from the raw on-disk page content. +** +** As each database page is loaded into memory, the pager allocats an +** instance of this object and zeros the first 8 bytes. (This is the +** "extra" information associated with each page of the pager.) +** +** Access to all fields of this structure is controlled by the mutex +** stored in MemPage.pBt->mutex. +*/ +struct MemPage { + u8 isInit; /* True if previously initialized. MUST BE FIRST! */ + u8 bBusy; /* Prevent endless loops on corrupt database files */ + u8 intKey; /* True if table b-trees. False for index b-trees */ + u8 intKeyLeaf; /* True if the leaf of an intKey table */ + Pgno pgno; /* Page number for this page */ + /* Only the first 8 bytes (above) are zeroed by pager.c when a new page + ** is allocated. All fields that follow must be initialized before use */ + u8 leaf; /* True if a leaf page */ + u8 hdrOffset; /* 100 for page 1. 0 otherwise */ + u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */ + u8 max1bytePayload; /* min(maxLocal,127) */ + u8 nOverflow; /* Number of overflow cell bodies in aCell[] */ + u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ + u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ + u16 cellOffset; /* Index in aData of first cell pointer */ + int nFree; /* Number of free bytes on the page. -1 for unknown */ + u16 nCell; /* Number of cells on this page, local and ovfl */ + u16 maskPage; /* Mask for page offset */ + u16 aiOvfl[4]; /* Insert the i-th overflow cell before the aiOvfl-th + ** non-overflow cell */ + u8 *apOvfl[4]; /* Pointers to the body of overflow cells */ + BtShared *pBt; /* Pointer to BtShared that this page is part of */ + u8 *aData; /* Pointer to disk image of the page data */ + u8 *aDataEnd; /* One byte past the end of usable data */ + u8 *aCellIdx; /* The cell index area */ + u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */ + DbPage *pDbPage; /* Pager page handle */ + u16 (*xCellSize)(MemPage*,u8*); /* cellSizePtr method */ + void (*xParseCell)(MemPage*,u8*,CellInfo*); /* btreeParseCell method */ +}; + +/* +** A linked list of the following structures is stored at BtShared.pLock. +** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor +** is opened on the table with root page BtShared.iTable. Locks are removed +** from this list when a transaction is committed or rolled back, or when +** a btree handle is closed. +*/ +struct BtLock { + Btree *pBtree; /* Btree handle holding this lock */ + Pgno iTable; /* Root page of table */ + u8 eLock; /* READ_LOCK or WRITE_LOCK */ + BtLock *pNext; /* Next in BtShared.pLock list */ +}; + +/* Candidate values for BtLock.eLock */ +#define READ_LOCK 1 +#define WRITE_LOCK 2 + +/* A Btree handle +** +** A database connection contains a pointer to an instance of +** this object for every database file that it has open. This structure +** is opaque to the database connection. The database connection cannot +** see the internals of this structure and only deals with pointers to +** this structure. +** +** For some database files, the same underlying database cache might be +** shared between multiple connections. In that case, each connection +** has it own instance of this object. But each instance of this object +** points to the same BtShared object. The database cache and the +** schema associated with the database file are all contained within +** the BtShared object. +** +** All fields in this structure are accessed under sqlite3.mutex. +** The pBt pointer itself may not be changed while there exists cursors +** in the referenced BtShared that point back to this Btree since those +** cursors have to go through this Btree to find their BtShared and +** they often do so without holding sqlite3.mutex. +*/ +struct Btree { + sqlite3 *db; /* The database connection holding this btree */ + BtShared *pBt; /* Sharable content of this btree */ + u8 inTrans; /* TRANS_NONE, TRANS_READ or TRANS_WRITE */ + u8 sharable; /* True if we can share pBt with another db */ + u8 locked; /* True if db currently has pBt locked */ + u8 hasIncrblobCur; /* True if there are one or more Incrblob cursors */ + int wantToLock; /* Number of nested calls to sqlite3BtreeEnter() */ + int nBackup; /* Number of backup operations reading this btree */ + u32 iDataVersion; /* Combines with pBt->pPager->iDataVersion */ + Btree *pNext; /* List of other sharable Btrees from the same db */ + Btree *pPrev; /* Back pointer of the same list */ +#ifndef SQLITE_OMIT_SHARED_CACHE + BtLock lock; /* Object used to lock page 1 */ +#endif +}; + +/* +** Btree.inTrans may take one of the following values. +** +** If the shared-data extension is enabled, there may be multiple users +** of the Btree structure. At most one of these may open a write transaction, +** but any number may have active read transactions. +*/ +#define TRANS_NONE 0 +#define TRANS_READ 1 +#define TRANS_WRITE 2 + +/* +** An instance of this object represents a single database file. +** +** A single database file can be in use at the same time by two +** or more database connections. When two or more connections are +** sharing the same database file, each connection has it own +** private Btree object for the file and each of those Btrees points +** to this one BtShared object. BtShared.nRef is the number of +** connections currently sharing this database file. +** +** Fields in this structure are accessed under the BtShared.mutex +** mutex, except for nRef and pNext which are accessed under the +** global SQLITE_MUTEX_STATIC_MASTER mutex. The pPager field +** may not be modified once it is initially set as long as nRef>0. +** The pSchema field may be set once under BtShared.mutex and +** thereafter is unchanged as long as nRef>0. +** +** isPending: +** +** If a BtShared client fails to obtain a write-lock on a database +** table (because there exists one or more read-locks on the table), +** the shared-cache enters 'pending-lock' state and isPending is +** set to true. +** +** The shared-cache leaves the 'pending lock' state when either of +** the following occur: +** +** 1) The current writer (BtShared.pWriter) concludes its transaction, OR +** 2) The number of locks held by other connections drops to zero. +** +** while in the 'pending-lock' state, no connection may start a new +** transaction. +** +** This feature is included to help prevent writer-starvation. +*/ +struct BtShared { + Pager *pPager; /* The page cache */ + sqlite3 *db; /* Database connection currently using this Btree */ + BtCursor *pCursor; /* A list of all open cursors */ + MemPage *pPage1; /* First page of the database */ + u8 openFlags; /* Flags to sqlite3BtreeOpen() */ +#ifndef SQLITE_OMIT_AUTOVACUUM + u8 autoVacuum; /* True if auto-vacuum is enabled */ + u8 incrVacuum; /* True if incr-vacuum is enabled */ + u8 bDoTruncate; /* True to truncate db on commit */ +#endif + u8 inTransaction; /* Transaction state */ + u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */ + u8 nReserveWanted; /* Desired number of extra bytes per page */ + u16 btsFlags; /* Boolean parameters. See BTS_* macros below */ + u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */ + u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */ + u16 maxLeaf; /* Maximum local payload in a LEAFDATA table */ + u16 minLeaf; /* Minimum local payload in a LEAFDATA table */ + u32 pageSize; /* Total number of bytes on a page */ + u32 usableSize; /* Number of usable bytes on each page */ + int nTransaction; /* Number of open transactions (read + write) */ + u32 nPage; /* Number of pages in the database */ + void *pSchema; /* Pointer to space allocated by sqlite3BtreeSchema() */ + void (*xFreeSchema)(void*); /* Destructor for BtShared.pSchema */ + sqlite3_mutex *mutex; /* Non-recursive mutex required to access this object */ + Bitvec *pHasContent; /* Set of pages moved to free-list this transaction */ +#ifndef SQLITE_OMIT_SHARED_CACHE + int nRef; /* Number of references to this structure */ + BtShared *pNext; /* Next on a list of sharable BtShared structs */ + BtLock *pLock; /* List of locks held on this shared-btree struct */ + Btree *pWriter; /* Btree with currently open write transaction */ +#endif + u8 *pTmpSpace; /* Temp space sufficient to hold a single cell */ +}; + +/* +** Allowed values for BtShared.btsFlags +*/ +#define BTS_READ_ONLY 0x0001 /* Underlying file is readonly */ +#define BTS_PAGESIZE_FIXED 0x0002 /* Page size can no longer be changed */ +#define BTS_SECURE_DELETE 0x0004 /* PRAGMA secure_delete is enabled */ +#define BTS_OVERWRITE 0x0008 /* Overwrite deleted content with zeros */ +#define BTS_FAST_SECURE 0x000c /* Combination of the previous two */ +#define BTS_INITIALLY_EMPTY 0x0010 /* Database was empty at trans start */ +#define BTS_NO_WAL 0x0020 /* Do not open write-ahead-log files */ +#define BTS_EXCLUSIVE 0x0040 /* pWriter has an exclusive lock */ +#define BTS_PENDING 0x0080 /* Waiting for read-locks to clear */ + +/* +** An instance of the following structure is used to hold information +** about a cell. The parseCellPtr() function fills in this structure +** based on information extract from the raw disk page. +*/ +struct CellInfo { + i64 nKey; /* The key for INTKEY tables, or nPayload otherwise */ + u8 *pPayload; /* Pointer to the start of payload */ + u32 nPayload; /* Bytes of payload */ + u16 nLocal; /* Amount of payload held locally, not on overflow */ + u16 nSize; /* Size of the cell content on the main b-tree page */ +}; + +/* +** Maximum depth of an SQLite B-Tree structure. Any B-Tree deeper than +** this will be declared corrupt. This value is calculated based on a +** maximum database size of 2^31 pages a minimum fanout of 2 for a +** root-node and 3 for all other internal nodes. +** +** If a tree that appears to be taller than this is encountered, it is +** assumed that the database is corrupt. +*/ +#define BTCURSOR_MAX_DEPTH 20 + +/* +** A cursor is a pointer to a particular entry within a particular +** b-tree within a database file. +** +** The entry is identified by its MemPage and the index in +** MemPage.aCell[] of the entry. +** +** A single database file can be shared by two more database connections, +** but cursors cannot be shared. Each cursor is associated with a +** particular database connection identified BtCursor.pBtree.db. +** +** Fields in this structure are accessed under the BtShared.mutex +** found at self->pBt->mutex. +** +** skipNext meaning: +** The meaning of skipNext depends on the value of eState: +** +** eState Meaning of skipNext +** VALID skipNext is meaningless and is ignored +** INVALID skipNext is meaningless and is ignored +** SKIPNEXT sqlite3BtreeNext() is a no-op if skipNext>0 and +** sqlite3BtreePrevious() is no-op if skipNext<0. +** REQUIRESEEK restoreCursorPosition() restores the cursor to +** eState=SKIPNEXT if skipNext!=0 +** FAULT skipNext holds the cursor fault error code. +*/ +struct BtCursor { + u8 eState; /* One of the CURSOR_XXX constants (see below) */ + u8 curFlags; /* zero or more BTCF_* flags defined below */ + u8 curPagerFlags; /* Flags to send to sqlite3PagerGet() */ + u8 hints; /* As configured by CursorSetHints() */ + int skipNext; /* Prev() is noop if negative. Next() is noop if positive. + ** Error code if eState==CURSOR_FAULT */ + Btree *pBtree; /* The Btree to which this cursor belongs */ + Pgno *aOverflow; /* Cache of overflow page locations */ + void *pKey; /* Saved key that was cursor last known position */ + /* All fields above are zeroed when the cursor is allocated. See + ** sqlite3BtreeCursorZero(). Fields that follow must be manually + ** initialized. */ +#define BTCURSOR_FIRST_UNINIT pBt /* Name of first uninitialized field */ + BtShared *pBt; /* The BtShared this cursor points to */ + BtCursor *pNext; /* Forms a linked list of all cursors */ + CellInfo info; /* A parse of the cell we are pointing at */ + i64 nKey; /* Size of pKey, or last integer key */ + Pgno pgnoRoot; /* The root page of this tree */ + i8 iPage; /* Index of current page in apPage */ + u8 curIntKey; /* Value of apPage[0]->intKey */ + u16 ix; /* Current index for apPage[iPage] */ + u16 aiIdx[BTCURSOR_MAX_DEPTH-1]; /* Current index in apPage[i] */ + struct KeyInfo *pKeyInfo; /* Arg passed to comparison function */ + MemPage *pPage; /* Current page */ + MemPage *apPage[BTCURSOR_MAX_DEPTH-1]; /* Stack of parents of current page */ +}; + +/* +** Legal values for BtCursor.curFlags +*/ +#define BTCF_WriteFlag 0x01 /* True if a write cursor */ +#define BTCF_ValidNKey 0x02 /* True if info.nKey is valid */ +#define BTCF_ValidOvfl 0x04 /* True if aOverflow is valid */ +#define BTCF_AtLast 0x08 /* Cursor is pointing ot the last entry */ +#define BTCF_Incrblob 0x10 /* True if an incremental I/O handle */ +#define BTCF_Multiple 0x20 /* Maybe another cursor on the same btree */ +#define BTCF_Pinned 0x40 /* Cursor is busy and cannot be moved */ + +/* +** Potential values for BtCursor.eState. +** +** CURSOR_INVALID: +** Cursor does not point to a valid entry. This can happen (for example) +** because the table is empty or because BtreeCursorFirst() has not been +** called. +** +** CURSOR_VALID: +** Cursor points to a valid entry. getPayload() etc. may be called. +** +** CURSOR_SKIPNEXT: +** Cursor is valid except that the Cursor.skipNext field is non-zero +** indicating that the next sqlite3BtreeNext() or sqlite3BtreePrevious() +** operation should be a no-op. +** +** CURSOR_REQUIRESEEK: +** The table that this cursor was opened on still exists, but has been +** modified since the cursor was last used. The cursor position is saved +** in variables BtCursor.pKey and BtCursor.nKey. When a cursor is in +** this state, restoreCursorPosition() can be called to attempt to +** seek the cursor to the saved position. +** +** CURSOR_FAULT: +** An unrecoverable error (an I/O error or a malloc failure) has occurred +** on a different connection that shares the BtShared cache with this +** cursor. The error has left the cache in an inconsistent state. +** Do nothing else with this cursor. Any attempt to use the cursor +** should return the error code stored in BtCursor.skipNext +*/ +#define CURSOR_VALID 0 +#define CURSOR_INVALID 1 +#define CURSOR_SKIPNEXT 2 +#define CURSOR_REQUIRESEEK 3 +#define CURSOR_FAULT 4 + +/* +** The database page the PENDING_BYTE occupies. This page is never used. +*/ +# define PENDING_BYTE_PAGE(pBt) PAGER_MJ_PGNO(pBt) + +/* +** These macros define the location of the pointer-map entry for a +** database page. The first argument to each is the number of usable +** bytes on each page of the database (often 1024). The second is the +** page number to look up in the pointer map. +** +** PTRMAP_PAGENO returns the database page number of the pointer-map +** page that stores the required pointer. PTRMAP_PTROFFSET returns +** the offset of the requested map entry. +** +** If the pgno argument passed to PTRMAP_PAGENO is a pointer-map page, +** then pgno is returned. So (pgno==PTRMAP_PAGENO(pgsz, pgno)) can be +** used to test if pgno is a pointer-map page. PTRMAP_ISPAGE implements +** this test. +*/ +#define PTRMAP_PAGENO(pBt, pgno) ptrmapPageno(pBt, pgno) +#define PTRMAP_PTROFFSET(pgptrmap, pgno) (5*(pgno-pgptrmap-1)) +#define PTRMAP_ISPAGE(pBt, pgno) (PTRMAP_PAGENO((pBt),(pgno))==(pgno)) + +/* +** The pointer map is a lookup table that identifies the parent page for +** each child page in the database file. The parent page is the page that +** contains a pointer to the child. Every page in the database contains +** 0 or 1 parent pages. (In this context 'database page' refers +** to any page that is not part of the pointer map itself.) Each pointer map +** entry consists of a single byte 'type' and a 4 byte parent page number. +** The PTRMAP_XXX identifiers below are the valid types. +** +** The purpose of the pointer map is to facility moving pages from one +** position in the file to another as part of autovacuum. When a page +** is moved, the pointer in its parent must be updated to point to the +** new location. The pointer map is used to locate the parent page quickly. +** +** PTRMAP_ROOTPAGE: The database page is a root-page. The page-number is not +** used in this case. +** +** PTRMAP_FREEPAGE: The database page is an unused (free) page. The page-number +** is not used in this case. +** +** PTRMAP_OVERFLOW1: The database page is the first page in a list of +** overflow pages. The page number identifies the page that +** contains the cell with a pointer to this overflow page. +** +** PTRMAP_OVERFLOW2: The database page is the second or later page in a list of +** overflow pages. The page-number identifies the previous +** page in the overflow page list. +** +** PTRMAP_BTREE: The database page is a non-root btree page. The page number +** identifies the parent page in the btree. +*/ +#define PTRMAP_ROOTPAGE 1 +#define PTRMAP_FREEPAGE 2 +#define PTRMAP_OVERFLOW1 3 +#define PTRMAP_OVERFLOW2 4 +#define PTRMAP_BTREE 5 + +/* A bunch of assert() statements to check the transaction state variables +** of handle p (type Btree*) are internally consistent. +*/ +#define btreeIntegrity(p) \ + assert( p->pBt->inTransaction!=TRANS_NONE || p->pBt->nTransaction==0 ); \ + assert( p->pBt->inTransaction>=p->inTrans ); + + +/* +** The ISAUTOVACUUM macro is used within balance_nonroot() to determine +** if the database supports auto-vacuum or not. Because it is used +** within an expression that is an argument to another macro +** (sqliteMallocRaw), it is not possible to use conditional compilation. +** So, this macro is defined instead. +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +#define ISAUTOVACUUM (pBt->autoVacuum) +#else +#define ISAUTOVACUUM 0 +#endif + + +/* +** This structure is passed around through all the sanity checking routines +** in order to keep track of some global state information. +** +** The aRef[] array is allocated so that there is 1 bit for each page in +** the database. As the integrity-check proceeds, for each page used in +** the database the corresponding bit is set. This allows integrity-check to +** detect pages that are used twice and orphaned pages (both of which +** indicate corruption). +*/ +typedef struct IntegrityCk IntegrityCk; +struct IntegrityCk { + BtShared *pBt; /* The tree being checked out */ + Pager *pPager; /* The associated pager. Also accessible by pBt->pPager */ + u8 *aPgRef; /* 1 bit per page in the db (see above) */ + Pgno nPage; /* Number of pages in the database */ + int mxErr; /* Stop accumulating errors when this reaches zero */ + int nErr; /* Number of messages written to zErrMsg so far */ + int mallocFailed; /* A memory allocation error has occurred */ + const char *zPfx; /* Error message prefix */ + int v1, v2; /* Values for up to two %d fields in zPfx */ + StrAccum errMsg; /* Accumulate the error message text here */ + u32 *heap; /* Min-heap used for analyzing cell coverage */ + sqlite3 *db; /* Database connection running the check */ +}; + +/* +** Routines to read or write a two- and four-byte big-endian integer values. +*/ +#define get2byte(x) ((x)[0]<<8 | (x)[1]) +#define put2byte(p,v) ((p)[0] = (u8)((v)>>8), (p)[1] = (u8)(v)) +#define get4byte sqlite3Get4byte +#define put4byte sqlite3Put4byte + +/* +** get2byteAligned(), unlike get2byte(), requires that its argument point to a +** two-byte aligned address. get2bytea() is only used for accessing the +** cell addresses in a btree header. +*/ +#if SQLITE_BYTEORDER==4321 +# define get2byteAligned(x) (*(u16*)(x)) +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4008000 +# define get2byteAligned(x) __builtin_bswap16(*(u16*)(x)) +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 +# define get2byteAligned(x) _byteswap_ushort(*(u16*)(x)) +#else +# define get2byteAligned(x) ((x)[0]<<8 | (x)[1]) +#endif + +/************** End of btreeInt.h ********************************************/ +/************** Continuing where we left off in btmutex.c ********************/ +#ifndef SQLITE_OMIT_SHARED_CACHE +#if SQLITE_THREADSAFE + +/* +** Obtain the BtShared mutex associated with B-Tree handle p. Also, +** set BtShared.db to the database handle associated with p and the +** p->locked boolean to true. +*/ +static void lockBtreeMutex(Btree *p){ + assert( p->locked==0 ); + assert( sqlite3_mutex_notheld(p->pBt->mutex) ); + assert( sqlite3_mutex_held(p->db->mutex) ); + + sqlite3_mutex_enter(p->pBt->mutex); + p->pBt->db = p->db; + p->locked = 1; +} + +/* +** Release the BtShared mutex associated with B-Tree handle p and +** clear the p->locked boolean. +*/ +static void SQLITE_NOINLINE unlockBtreeMutex(Btree *p){ + BtShared *pBt = p->pBt; + assert( p->locked==1 ); + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( sqlite3_mutex_held(p->db->mutex) ); + assert( p->db==pBt->db ); + + sqlite3_mutex_leave(pBt->mutex); + p->locked = 0; +} + +/* Forward reference */ +static void SQLITE_NOINLINE btreeLockCarefully(Btree *p); + +/* +** Enter a mutex on the given BTree object. +** +** If the object is not sharable, then no mutex is ever required +** and this routine is a no-op. The underlying mutex is non-recursive. +** But we keep a reference count in Btree.wantToLock so the behavior +** of this interface is recursive. +** +** To avoid deadlocks, multiple Btrees are locked in the same order +** by all database connections. The p->pNext is a list of other +** Btrees belonging to the same database connection as the p Btree +** which need to be locked after p. If we cannot get a lock on +** p, then first unlock all of the others on p->pNext, then wait +** for the lock to become available on p, then relock all of the +** subsequent Btrees that desire a lock. +*/ +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){ + /* Some basic sanity checking on the Btree. The list of Btrees + ** connected by pNext and pPrev should be in sorted order by + ** Btree.pBt value. All elements of the list should belong to + ** the same connection. Only shared Btrees are on the list. */ + assert( p->pNext==0 || p->pNext->pBt>p->pBt ); + assert( p->pPrev==0 || p->pPrev->pBtpBt ); + assert( p->pNext==0 || p->pNext->db==p->db ); + assert( p->pPrev==0 || p->pPrev->db==p->db ); + assert( p->sharable || (p->pNext==0 && p->pPrev==0) ); + + /* Check for locking consistency */ + assert( !p->locked || p->wantToLock>0 ); + assert( p->sharable || p->wantToLock==0 ); + + /* We should already hold a lock on the database connection */ + assert( sqlite3_mutex_held(p->db->mutex) ); + + /* Unless the database is sharable and unlocked, then BtShared.db + ** should already be set correctly. */ + assert( (p->locked==0 && p->sharable) || p->pBt->db==p->db ); + + if( !p->sharable ) return; + p->wantToLock++; + if( p->locked ) return; + btreeLockCarefully(p); +} + +/* This is a helper function for sqlite3BtreeLock(). By moving +** complex, but seldom used logic, out of sqlite3BtreeLock() and +** into this routine, we avoid unnecessary stack pointer changes +** and thus help the sqlite3BtreeLock() routine to run much faster +** in the common case. +*/ +static void SQLITE_NOINLINE btreeLockCarefully(Btree *p){ + Btree *pLater; + + /* In most cases, we should be able to acquire the lock we + ** want without having to go through the ascending lock + ** procedure that follows. Just be sure not to block. + */ + if( sqlite3_mutex_try(p->pBt->mutex)==SQLITE_OK ){ + p->pBt->db = p->db; + p->locked = 1; + return; + } + + /* To avoid deadlock, first release all locks with a larger + ** BtShared address. Then acquire our lock. Then reacquire + ** the other BtShared locks that we used to hold in ascending + ** order. + */ + for(pLater=p->pNext; pLater; pLater=pLater->pNext){ + assert( pLater->sharable ); + assert( pLater->pNext==0 || pLater->pNext->pBt>pLater->pBt ); + assert( !pLater->locked || pLater->wantToLock>0 ); + if( pLater->locked ){ + unlockBtreeMutex(pLater); + } + } + lockBtreeMutex(p); + for(pLater=p->pNext; pLater; pLater=pLater->pNext){ + if( pLater->wantToLock ){ + lockBtreeMutex(pLater); + } + } +} + + +/* +** Exit the recursive mutex on a Btree. +*/ +SQLITE_PRIVATE void sqlite3BtreeLeave(Btree *p){ + assert( sqlite3_mutex_held(p->db->mutex) ); + if( p->sharable ){ + assert( p->wantToLock>0 ); + p->wantToLock--; + if( p->wantToLock==0 ){ + unlockBtreeMutex(p); + } + } +} + +#ifndef NDEBUG +/* +** Return true if the BtShared mutex is held on the btree, or if the +** B-Tree is not marked as sharable. +** +** This routine is used only from within assert() statements. +*/ +SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree *p){ + assert( p->sharable==0 || p->locked==0 || p->wantToLock>0 ); + assert( p->sharable==0 || p->locked==0 || p->db==p->pBt->db ); + assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->pBt->mutex) ); + assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->db->mutex) ); + + return (p->sharable==0 || p->locked); +} +#endif + + +/* +** Enter the mutex on every Btree associated with a database +** connection. This is needed (for example) prior to parsing +** a statement since we will be comparing table and column names +** against all schemas and we do not want those schemas being +** reset out from under us. +** +** There is a corresponding leave-all procedures. +** +** Enter the mutexes in accending order by BtShared pointer address +** to avoid the possibility of deadlock when two threads with +** two or more btrees in common both try to lock all their btrees +** at the same instant. +*/ +static void SQLITE_NOINLINE btreeEnterAll(sqlite3 *db){ + int i; + int skipOk = 1; + Btree *p; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inDb; i++){ + p = db->aDb[i].pBt; + if( p && p->sharable ){ + sqlite3BtreeEnter(p); + skipOk = 0; + } + } + db->noSharedCache = skipOk; +} +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ + if( db->noSharedCache==0 ) btreeEnterAll(db); +} +static void SQLITE_NOINLINE btreeLeaveAll(sqlite3 *db){ + int i; + Btree *p; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inDb; i++){ + p = db->aDb[i].pBt; + if( p ) sqlite3BtreeLeave(p); + } +} +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){ + if( db->noSharedCache==0 ) btreeLeaveAll(db); +} + +#ifndef NDEBUG +/* +** Return true if the current thread holds the database connection +** mutex and all required BtShared mutexes. +** +** This routine is used inside assert() statements only. +*/ +SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){ + int i; + if( !sqlite3_mutex_held(db->mutex) ){ + return 0; + } + for(i=0; inDb; i++){ + Btree *p; + p = db->aDb[i].pBt; + if( p && p->sharable && + (p->wantToLock==0 || !sqlite3_mutex_held(p->pBt->mutex)) ){ + return 0; + } + } + return 1; +} +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* +** Return true if the correct mutexes are held for accessing the +** db->aDb[iDb].pSchema structure. The mutexes required for schema +** access are: +** +** (1) The mutex on db +** (2) if iDb!=1, then the mutex on db->aDb[iDb].pBt. +** +** If pSchema is not NULL, then iDb is computed from pSchema and +** db using sqlite3SchemaToIndex(). +*/ +SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3 *db, int iDb, Schema *pSchema){ + Btree *p; + assert( db!=0 ); + if( pSchema ) iDb = sqlite3SchemaToIndex(db, pSchema); + assert( iDb>=0 && iDbnDb ); + if( !sqlite3_mutex_held(db->mutex) ) return 0; + if( iDb==1 ) return 1; + p = db->aDb[iDb].pBt; + assert( p!=0 ); + return p->sharable==0 || p->locked==1; +} +#endif /* NDEBUG */ + +#else /* SQLITE_THREADSAFE>0 above. SQLITE_THREADSAFE==0 below */ +/* +** The following are special cases for mutex enter routines for use +** in single threaded applications that use shared cache. Except for +** these two routines, all mutex operations are no-ops in that case and +** are null #defines in btree.h. +** +** If shared cache is disabled, then all btree mutex routines, including +** the ones below, are no-ops and are null #defines in btree.h. +*/ + +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){ + p->pBt->db = p->db; +} +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ + int i; + for(i=0; inDb; i++){ + Btree *p = db->aDb[i].pBt; + if( p ){ + p->pBt->db = p->db; + } + } +} +#endif /* if SQLITE_THREADSAFE */ + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** Enter a mutex on a Btree given a cursor owned by that Btree. +** +** These entry points are used by incremental I/O only. Enter() is required +** any time OMIT_SHARED_CACHE is not defined, regardless of whether or not +** the build is threadsafe. Leave() is only required by threadsafe builds. +*/ +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor *pCur){ + sqlite3BtreeEnter(pCur->pBtree); +} +# if SQLITE_THREADSAFE +SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor *pCur){ + sqlite3BtreeLeave(pCur->pBtree); +} +# endif +#endif /* ifndef SQLITE_OMIT_INCRBLOB */ + +#endif /* ifndef SQLITE_OMIT_SHARED_CACHE */ + +/************** End of btmutex.c *********************************************/ +/************** Begin file btree.c *******************************************/ +/* +** 2004 April 6 +** +** 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 implements an external (disk-based) database using BTrees. +** See the header comment on "btreeInt.h" for additional information. +** Including a description of file format and an overview of operation. +*/ +/* #include "btreeInt.h" */ + +/* +** The header string that appears at the beginning of every +** SQLite database. +*/ +static const char zMagicHeader[] = SQLITE_FILE_HEADER; + +/* +** Set this global variable to 1 to enable tracing using the TRACE +** macro. +*/ +#if 0 +int sqlite3BtreeTrace=1; /* True to enable tracing */ +# define TRACE(X) if(sqlite3BtreeTrace){printf X;fflush(stdout);} +#else +# define TRACE(X) +#endif + +/* +** Extract a 2-byte big-endian integer from an array of unsigned bytes. +** But if the value is zero, make it 65536. +** +** This routine is used to extract the "offset to cell content area" value +** from the header of a btree page. If the page size is 65536 and the page +** is empty, the offset should be 65536, but the 2-byte value stores zero. +** This routine makes the necessary adjustment to 65536. +*/ +#define get2byteNotZero(X) (((((int)get2byte(X))-1)&0xffff)+1) + +/* +** Values passed as the 5th argument to allocateBtreePage() +*/ +#define BTALLOC_ANY 0 /* Allocate any page */ +#define BTALLOC_EXACT 1 /* Allocate exact page if possible */ +#define BTALLOC_LE 2 /* Allocate any page <= the parameter */ + +/* +** Macro IfNotOmitAV(x) returns (x) if SQLITE_OMIT_AUTOVACUUM is not +** defined, or 0 if it is. For example: +** +** bIncrVacuum = IfNotOmitAV(pBtShared->incrVacuum); +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +#define IfNotOmitAV(expr) (expr) +#else +#define IfNotOmitAV(expr) 0 +#endif + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** A list of BtShared objects that are eligible for participation +** in shared cache. This variable has file scope during normal builds, +** but the test harness needs to access it so we make it global for +** test builds. +** +** Access to this variable is protected by SQLITE_MUTEX_STATIC_MASTER. +*/ +#ifdef SQLITE_TEST +SQLITE_PRIVATE BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; +#else +static BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; +#endif +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Enable or disable the shared pager and schema features. +** +** This routine has no effect on existing database connections. +** The shared cache setting effects only future calls to +** sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2(). +*/ +SQLITE_API int sqlite3_enable_shared_cache(int enable){ + sqlite3GlobalConfig.sharedCacheEnabled = enable; + return SQLITE_OK; +} +#endif + + + +#ifdef SQLITE_OMIT_SHARED_CACHE + /* + ** The functions querySharedCacheTableLock(), setSharedCacheTableLock(), + ** and clearAllSharedCacheTableLocks() + ** manipulate entries in the BtShared.pLock linked list used to store + ** shared-cache table level locks. If the library is compiled with the + ** shared-cache feature disabled, then there is only ever one user + ** of each BtShared structure and so this locking is not necessary. + ** So define the lock related functions as no-ops. + */ + #define querySharedCacheTableLock(a,b,c) SQLITE_OK + #define setSharedCacheTableLock(a,b,c) SQLITE_OK + #define clearAllSharedCacheTableLocks(a) + #define downgradeAllSharedCacheTableLocks(a) + #define hasSharedCacheTableLock(a,b,c,d) 1 + #define hasReadConflicts(a, b) 0 +#endif + +/* +** Implementation of the SQLITE_CORRUPT_PAGE() macro. Takes a single +** (MemPage*) as an argument. The (MemPage*) must not be NULL. +** +** If SQLITE_DEBUG is not defined, then this macro is equivalent to +** SQLITE_CORRUPT_BKPT. Or, if SQLITE_DEBUG is set, then the log message +** normally produced as a side-effect of SQLITE_CORRUPT_BKPT is augmented +** with the page number and filename associated with the (MemPage*). +*/ +#ifdef SQLITE_DEBUG +int corruptPageError(int lineno, MemPage *p){ + char *zMsg; + sqlite3BeginBenignMalloc(); + zMsg = sqlite3_mprintf("database corruption page %d of %s", + (int)p->pgno, sqlite3PagerFilename(p->pBt->pPager, 0) + ); + sqlite3EndBenignMalloc(); + if( zMsg ){ + sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg); + } + sqlite3_free(zMsg); + return SQLITE_CORRUPT_BKPT; +} +# define SQLITE_CORRUPT_PAGE(pMemPage) corruptPageError(__LINE__, pMemPage) +#else +# define SQLITE_CORRUPT_PAGE(pMemPage) SQLITE_CORRUPT_PGNO(pMemPage->pgno) +#endif + +#ifndef SQLITE_OMIT_SHARED_CACHE + +#ifdef SQLITE_DEBUG +/* +**** This function is only used as part of an assert() statement. *** +** +** Check to see if pBtree holds the required locks to read or write to the +** table with root page iRoot. Return 1 if it does and 0 if not. +** +** For example, when writing to a table with root-page iRoot via +** Btree connection pBtree: +** +** assert( hasSharedCacheTableLock(pBtree, iRoot, 0, WRITE_LOCK) ); +** +** When writing to an index that resides in a sharable database, the +** caller should have first obtained a lock specifying the root page of +** the corresponding table. This makes things a bit more complicated, +** as this module treats each table as a separate structure. To determine +** the table corresponding to the index being written, this +** function has to search through the database schema. +** +** Instead of a lock on the table/index rooted at page iRoot, the caller may +** hold a write-lock on the schema table (root page 1). This is also +** acceptable. +*/ +static int hasSharedCacheTableLock( + Btree *pBtree, /* Handle that must hold lock */ + Pgno iRoot, /* Root page of b-tree */ + int isIndex, /* True if iRoot is the root of an index b-tree */ + int eLockType /* Required lock type (READ_LOCK or WRITE_LOCK) */ +){ + Schema *pSchema = (Schema *)pBtree->pBt->pSchema; + Pgno iTab = 0; + BtLock *pLock; + + /* If this database is not shareable, or if the client is reading + ** and has the read-uncommitted flag set, then no lock is required. + ** Return true immediately. + */ + if( (pBtree->sharable==0) + || (eLockType==READ_LOCK && (pBtree->db->flags & SQLITE_ReadUncommit)) + ){ + return 1; + } + + /* If the client is reading or writing an index and the schema is + ** not loaded, then it is too difficult to actually check to see if + ** the correct locks are held. So do not bother - just return true. + ** This case does not come up very often anyhow. + */ + if( isIndex && (!pSchema || (pSchema->schemaFlags&DB_SchemaLoaded)==0) ){ + return 1; + } + + /* Figure out the root-page that the lock should be held on. For table + ** b-trees, this is just the root page of the b-tree being read or + ** written. For index b-trees, it is the root page of the associated + ** table. */ + if( isIndex ){ + HashElem *p; + int bSeen = 0; + for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){ + Index *pIdx = (Index *)sqliteHashData(p); + if( pIdx->tnum==(int)iRoot ){ + if( bSeen ){ + /* Two or more indexes share the same root page. There must + ** be imposter tables. So just return true. The assert is not + ** useful in that case. */ + return 1; + } + iTab = pIdx->pTable->tnum; + bSeen = 1; + } + } + }else{ + iTab = iRoot; + } + + /* Search for the required lock. Either a write-lock on root-page iTab, a + ** write-lock on the schema table, or (if the client is reading) a + ** read-lock on iTab will suffice. Return 1 if any of these are found. */ + for(pLock=pBtree->pBt->pLock; pLock; pLock=pLock->pNext){ + if( pLock->pBtree==pBtree + && (pLock->iTable==iTab || (pLock->eLock==WRITE_LOCK && pLock->iTable==1)) + && pLock->eLock>=eLockType + ){ + return 1; + } + } + + /* Failed to find the required lock. */ + return 0; +} +#endif /* SQLITE_DEBUG */ + +#ifdef SQLITE_DEBUG +/* +**** This function may be used as part of assert() statements only. **** +** +** Return true if it would be illegal for pBtree to write into the +** table or index rooted at iRoot because other shared connections are +** simultaneously reading that same table or index. +** +** It is illegal for pBtree to write if some other Btree object that +** shares the same BtShared object is currently reading or writing +** the iRoot table. Except, if the other Btree object has the +** read-uncommitted flag set, then it is OK for the other object to +** have a read cursor. +** +** For example, before writing to any part of the table or index +** rooted at page iRoot, one should call: +** +** assert( !hasReadConflicts(pBtree, iRoot) ); +*/ +static int hasReadConflicts(Btree *pBtree, Pgno iRoot){ + BtCursor *p; + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + if( p->pgnoRoot==iRoot + && p->pBtree!=pBtree + && 0==(p->pBtree->db->flags & SQLITE_ReadUncommit) + ){ + return 1; + } + } + return 0; +} +#endif /* #ifdef SQLITE_DEBUG */ + +/* +** Query to see if Btree handle p may obtain a lock of type eLock +** (READ_LOCK or WRITE_LOCK) on the table with root-page iTab. Return +** SQLITE_OK if the lock may be obtained (by calling +** setSharedCacheTableLock()), or SQLITE_LOCKED if not. +*/ +static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ + BtShared *pBt = p->pBt; + BtLock *pIter; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( eLock==READ_LOCK || eLock==WRITE_LOCK ); + assert( p->db!=0 ); + assert( !(p->db->flags&SQLITE_ReadUncommit)||eLock==WRITE_LOCK||iTab==1 ); + + /* If requesting a write-lock, then the Btree must have an open write + ** transaction on this file. And, obviously, for this to be so there + ** must be an open write transaction on the file itself. + */ + assert( eLock==READ_LOCK || (p==pBt->pWriter && p->inTrans==TRANS_WRITE) ); + assert( eLock==READ_LOCK || pBt->inTransaction==TRANS_WRITE ); + + /* This routine is a no-op if the shared-cache is not enabled */ + if( !p->sharable ){ + return SQLITE_OK; + } + + /* If some other connection is holding an exclusive lock, the + ** requested lock may not be obtained. + */ + if( pBt->pWriter!=p && (pBt->btsFlags & BTS_EXCLUSIVE)!=0 ){ + sqlite3ConnectionBlocked(p->db, pBt->pWriter->db); + return SQLITE_LOCKED_SHAREDCACHE; + } + + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + /* The condition (pIter->eLock!=eLock) in the following if(...) + ** statement is a simplification of: + ** + ** (eLock==WRITE_LOCK || pIter->eLock==WRITE_LOCK) + ** + ** since we know that if eLock==WRITE_LOCK, then no other connection + ** may hold a WRITE_LOCK on any table in this file (since there can + ** only be a single writer). + */ + assert( pIter->eLock==READ_LOCK || pIter->eLock==WRITE_LOCK ); + assert( eLock==READ_LOCK || pIter->pBtree==p || pIter->eLock==READ_LOCK); + if( pIter->pBtree!=p && pIter->iTable==iTab && pIter->eLock!=eLock ){ + sqlite3ConnectionBlocked(p->db, pIter->pBtree->db); + if( eLock==WRITE_LOCK ){ + assert( p==pBt->pWriter ); + pBt->btsFlags |= BTS_PENDING; + } + return SQLITE_LOCKED_SHAREDCACHE; + } + } + return SQLITE_OK; +} +#endif /* !SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Add a lock on the table with root-page iTable to the shared-btree used +** by Btree handle p. Parameter eLock must be either READ_LOCK or +** WRITE_LOCK. +** +** This function assumes the following: +** +** (a) The specified Btree object p is connected to a sharable +** database (one with the BtShared.sharable flag set), and +** +** (b) No other Btree objects hold a lock that conflicts +** with the requested lock (i.e. querySharedCacheTableLock() has +** already been called and returned SQLITE_OK). +** +** SQLITE_OK is returned if the lock is added successfully. SQLITE_NOMEM +** is returned if a malloc attempt fails. +*/ +static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ + BtShared *pBt = p->pBt; + BtLock *pLock = 0; + BtLock *pIter; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( eLock==READ_LOCK || eLock==WRITE_LOCK ); + assert( p->db!=0 ); + + /* A connection with the read-uncommitted flag set will never try to + ** obtain a read-lock using this function. The only read-lock obtained + ** by a connection in read-uncommitted mode is on the sqlite_master + ** table, and that lock is obtained in BtreeBeginTrans(). */ + assert( 0==(p->db->flags&SQLITE_ReadUncommit) || eLock==WRITE_LOCK ); + + /* This function should only be called on a sharable b-tree after it + ** has been determined that no other b-tree holds a conflicting lock. */ + assert( p->sharable ); + assert( SQLITE_OK==querySharedCacheTableLock(p, iTable, eLock) ); + + /* First search the list for an existing lock on this table. */ + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + if( pIter->iTable==iTable && pIter->pBtree==p ){ + pLock = pIter; + break; + } + } + + /* If the above search did not find a BtLock struct associating Btree p + ** with table iTable, allocate one and link it into the list. + */ + if( !pLock ){ + pLock = (BtLock *)sqlite3MallocZero(sizeof(BtLock)); + if( !pLock ){ + return SQLITE_NOMEM_BKPT; + } + pLock->iTable = iTable; + pLock->pBtree = p; + pLock->pNext = pBt->pLock; + pBt->pLock = pLock; + } + + /* Set the BtLock.eLock variable to the maximum of the current lock + ** and the requested lock. This means if a write-lock was already held + ** and a read-lock requested, we don't incorrectly downgrade the lock. + */ + assert( WRITE_LOCK>READ_LOCK ); + if( eLock>pLock->eLock ){ + pLock->eLock = eLock; + } + + return SQLITE_OK; +} +#endif /* !SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Release all the table locks (locks obtained via calls to +** the setSharedCacheTableLock() procedure) held by Btree object p. +** +** This function assumes that Btree p has an open read or write +** transaction. If it does not, then the BTS_PENDING flag +** may be incorrectly cleared. +*/ +static void clearAllSharedCacheTableLocks(Btree *p){ + BtShared *pBt = p->pBt; + BtLock **ppIter = &pBt->pLock; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( p->sharable || 0==*ppIter ); + assert( p->inTrans>0 ); + + while( *ppIter ){ + BtLock *pLock = *ppIter; + assert( (pBt->btsFlags & BTS_EXCLUSIVE)==0 || pBt->pWriter==pLock->pBtree ); + assert( pLock->pBtree->inTrans>=pLock->eLock ); + if( pLock->pBtree==p ){ + *ppIter = pLock->pNext; + assert( pLock->iTable!=1 || pLock==&p->lock ); + if( pLock->iTable!=1 ){ + sqlite3_free(pLock); + } + }else{ + ppIter = &pLock->pNext; + } + } + + assert( (pBt->btsFlags & BTS_PENDING)==0 || pBt->pWriter ); + if( pBt->pWriter==p ){ + pBt->pWriter = 0; + pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING); + }else if( pBt->nTransaction==2 ){ + /* This function is called when Btree p is concluding its + ** transaction. If there currently exists a writer, and p is not + ** that writer, then the number of locks held by connections other + ** than the writer must be about to drop to zero. In this case + ** set the BTS_PENDING flag to 0. + ** + ** If there is not currently a writer, then BTS_PENDING must + ** be zero already. So this next line is harmless in that case. + */ + pBt->btsFlags &= ~BTS_PENDING; + } +} + +/* +** This function changes all write-locks held by Btree p into read-locks. +*/ +static void downgradeAllSharedCacheTableLocks(Btree *p){ + BtShared *pBt = p->pBt; + if( pBt->pWriter==p ){ + BtLock *pLock; + pBt->pWriter = 0; + pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING); + for(pLock=pBt->pLock; pLock; pLock=pLock->pNext){ + assert( pLock->eLock==READ_LOCK || pLock->pBtree==p ); + pLock->eLock = READ_LOCK; + } + } +} + +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +static void releasePage(MemPage *pPage); /* Forward reference */ +static void releasePageOne(MemPage *pPage); /* Forward reference */ +static void releasePageNotNull(MemPage *pPage); /* Forward reference */ + +/* +***** This routine is used inside of assert() only **** +** +** Verify that the cursor holds the mutex on its BtShared +*/ +#ifdef SQLITE_DEBUG +static int cursorHoldsMutex(BtCursor *p){ + return sqlite3_mutex_held(p->pBt->mutex); +} + +/* Verify that the cursor and the BtShared agree about what is the current +** database connetion. This is important in shared-cache mode. If the database +** connection pointers get out-of-sync, it is possible for routines like +** btreeInitPage() to reference an stale connection pointer that references a +** a connection that has already closed. This routine is used inside assert() +** statements only and for the purpose of double-checking that the btree code +** does keep the database connection pointers up-to-date. +*/ +static int cursorOwnsBtShared(BtCursor *p){ + assert( cursorHoldsMutex(p) ); + return (p->pBtree->db==p->pBt->db); +} +#endif + +/* +** Invalidate the overflow cache of the cursor passed as the first argument. +** on the shared btree structure pBt. +*/ +#define invalidateOverflowCache(pCur) (pCur->curFlags &= ~BTCF_ValidOvfl) + +/* +** Invalidate the overflow page-list cache for all cursors opened +** on the shared btree structure pBt. +*/ +static void invalidateAllOverflowCache(BtShared *pBt){ + BtCursor *p; + assert( sqlite3_mutex_held(pBt->mutex) ); + for(p=pBt->pCursor; p; p=p->pNext){ + invalidateOverflowCache(p); + } +} + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** This function is called before modifying the contents of a table +** to invalidate any incrblob cursors that are open on the +** row or one of the rows being modified. +** +** If argument isClearTable is true, then the entire contents of the +** table is about to be deleted. In this case invalidate all incrblob +** cursors open on any row within the table with root-page pgnoRoot. +** +** Otherwise, if argument isClearTable is false, then the row with +** rowid iRow is being replaced or deleted. In this case invalidate +** only those incrblob cursors open on that specific row. +*/ +static void invalidateIncrblobCursors( + Btree *pBtree, /* The database file to check */ + Pgno pgnoRoot, /* The table that might be changing */ + i64 iRow, /* The rowid that might be changing */ + int isClearTable /* True if all rows are being deleted */ +){ + BtCursor *p; + if( pBtree->hasIncrblobCur==0 ) return; + assert( sqlite3BtreeHoldsMutex(pBtree) ); + pBtree->hasIncrblobCur = 0; + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + if( (p->curFlags & BTCF_Incrblob)!=0 ){ + pBtree->hasIncrblobCur = 1; + if( p->pgnoRoot==pgnoRoot && (isClearTable || p->info.nKey==iRow) ){ + p->eState = CURSOR_INVALID; + } + } + } +} + +#else + /* Stub function when INCRBLOB is omitted */ + #define invalidateIncrblobCursors(w,x,y,z) +#endif /* SQLITE_OMIT_INCRBLOB */ + +/* +** Set bit pgno of the BtShared.pHasContent bitvec. This is called +** when a page that previously contained data becomes a free-list leaf +** page. +** +** The BtShared.pHasContent bitvec exists to work around an obscure +** bug caused by the interaction of two useful IO optimizations surrounding +** free-list leaf pages: +** +** 1) When all data is deleted from a page and the page becomes +** a free-list leaf page, the page is not written to the database +** (as free-list leaf pages contain no meaningful data). Sometimes +** such a page is not even journalled (as it will not be modified, +** why bother journalling it?). +** +** 2) When a free-list leaf page is reused, its content is not read +** from the database or written to the journal file (why should it +** be, if it is not at all meaningful?). +** +** By themselves, these optimizations work fine and provide a handy +** performance boost to bulk delete or insert operations. However, if +** a page is moved to the free-list and then reused within the same +** transaction, a problem comes up. If the page is not journalled when +** it is moved to the free-list and it is also not journalled when it +** is extracted from the free-list and reused, then the original data +** may be lost. In the event of a rollback, it may not be possible +** to restore the database to its original configuration. +** +** The solution is the BtShared.pHasContent bitvec. Whenever a page is +** moved to become a free-list leaf page, the corresponding bit is +** set in the bitvec. Whenever a leaf page is extracted from the free-list, +** optimization 2 above is omitted if the corresponding bit is already +** set in BtShared.pHasContent. The contents of the bitvec are cleared +** at the end of every transaction. +*/ +static int btreeSetHasContent(BtShared *pBt, Pgno pgno){ + int rc = SQLITE_OK; + if( !pBt->pHasContent ){ + assert( pgno<=pBt->nPage ); + pBt->pHasContent = sqlite3BitvecCreate(pBt->nPage); + if( !pBt->pHasContent ){ + rc = SQLITE_NOMEM_BKPT; + } + } + if( rc==SQLITE_OK && pgno<=sqlite3BitvecSize(pBt->pHasContent) ){ + rc = sqlite3BitvecSet(pBt->pHasContent, pgno); + } + return rc; +} + +/* +** Query the BtShared.pHasContent vector. +** +** This function is called when a free-list leaf page is removed from the +** free-list for reuse. It returns false if it is safe to retrieve the +** page from the pager layer with the 'no-content' flag set. True otherwise. +*/ +static int btreeGetHasContent(BtShared *pBt, Pgno pgno){ + Bitvec *p = pBt->pHasContent; + return p && (pgno>sqlite3BitvecSize(p) || sqlite3BitvecTestNotNull(p, pgno)); +} + +/* +** Clear (destroy) the BtShared.pHasContent bitvec. This should be +** invoked at the conclusion of each write-transaction. +*/ +static void btreeClearHasContent(BtShared *pBt){ + sqlite3BitvecDestroy(pBt->pHasContent); + pBt->pHasContent = 0; +} + +/* +** Release all of the apPage[] pages for a cursor. +*/ +static void btreeReleaseAllCursorPages(BtCursor *pCur){ + int i; + if( pCur->iPage>=0 ){ + for(i=0; iiPage; i++){ + releasePageNotNull(pCur->apPage[i]); + } + releasePageNotNull(pCur->pPage); + pCur->iPage = -1; + } +} + +/* +** The cursor passed as the only argument must point to a valid entry +** when this function is called (i.e. have eState==CURSOR_VALID). This +** function saves the current cursor key in variables pCur->nKey and +** pCur->pKey. SQLITE_OK is returned if successful or an SQLite error +** code otherwise. +** +** If the cursor is open on an intkey table, then the integer key +** (the rowid) is stored in pCur->nKey and pCur->pKey is left set to +** NULL. If the cursor is open on a non-intkey table, then pCur->pKey is +** set to point to a malloced buffer pCur->nKey bytes in size containing +** the key. +*/ +static int saveCursorKey(BtCursor *pCur){ + int rc = SQLITE_OK; + assert( CURSOR_VALID==pCur->eState ); + assert( 0==pCur->pKey ); + assert( cursorHoldsMutex(pCur) ); + + if( pCur->curIntKey ){ + /* Only the rowid is required for a table btree */ + pCur->nKey = sqlite3BtreeIntegerKey(pCur); + }else{ + /* For an index btree, save the complete key content. It is possible + ** that the current key is corrupt. In that case, it is possible that + ** the sqlite3VdbeRecordUnpack() function may overread the buffer by + ** up to the size of 1 varint plus 1 8-byte value when the cursor + ** position is restored. Hence the 17 bytes of padding allocated + ** below. */ + void *pKey; + pCur->nKey = sqlite3BtreePayloadSize(pCur); + pKey = sqlite3Malloc( pCur->nKey + 9 + 8 ); + if( pKey ){ + rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey); + if( rc==SQLITE_OK ){ + memset(((u8*)pKey)+pCur->nKey, 0, 9+8); + pCur->pKey = pKey; + }else{ + sqlite3_free(pKey); + } + }else{ + rc = SQLITE_NOMEM_BKPT; + } + } + assert( !pCur->curIntKey || !pCur->pKey ); + return rc; +} + +/* +** Save the current cursor position in the variables BtCursor.nKey +** and BtCursor.pKey. The cursor's state is set to CURSOR_REQUIRESEEK. +** +** The caller must ensure that the cursor is valid (has eState==CURSOR_VALID) +** prior to calling this routine. +*/ +static int saveCursorPosition(BtCursor *pCur){ + int rc; + + assert( CURSOR_VALID==pCur->eState || CURSOR_SKIPNEXT==pCur->eState ); + assert( 0==pCur->pKey ); + assert( cursorHoldsMutex(pCur) ); + + if( pCur->curFlags & BTCF_Pinned ){ + return SQLITE_CONSTRAINT_PINNED; + } + if( pCur->eState==CURSOR_SKIPNEXT ){ + pCur->eState = CURSOR_VALID; + }else{ + pCur->skipNext = 0; + } + + rc = saveCursorKey(pCur); + if( rc==SQLITE_OK ){ + btreeReleaseAllCursorPages(pCur); + pCur->eState = CURSOR_REQUIRESEEK; + } + + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl|BTCF_AtLast); + return rc; +} + +/* Forward reference */ +static int SQLITE_NOINLINE saveCursorsOnList(BtCursor*,Pgno,BtCursor*); + +/* +** Save the positions of all cursors (except pExcept) that are open on +** the table with root-page iRoot. "Saving the cursor position" means that +** the location in the btree is remembered in such a way that it can be +** moved back to the same spot after the btree has been modified. This +** routine is called just before cursor pExcept is used to modify the +** table, for example in BtreeDelete() or BtreeInsert(). +** +** If there are two or more cursors on the same btree, then all such +** cursors should have their BTCF_Multiple flag set. The btreeCursor() +** routine enforces that rule. This routine only needs to be called in +** the uncommon case when pExpect has the BTCF_Multiple flag set. +** +** If pExpect!=NULL and if no other cursors are found on the same root-page, +** then the BTCF_Multiple flag on pExpect is cleared, to avoid another +** pointless call to this routine. +** +** Implementation note: This routine merely checks to see if any cursors +** need to be saved. It calls out to saveCursorsOnList() in the (unusual) +** event that cursors are in need to being saved. +*/ +static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){ + BtCursor *p; + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pExcept==0 || pExcept->pBt==pBt ); + for(p=pBt->pCursor; p; p=p->pNext){ + if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) ) break; + } + if( p ) return saveCursorsOnList(p, iRoot, pExcept); + if( pExcept ) pExcept->curFlags &= ~BTCF_Multiple; + return SQLITE_OK; +} + +/* This helper routine to saveAllCursors does the actual work of saving +** the cursors if and when a cursor is found that actually requires saving. +** The common case is that no cursors need to be saved, so this routine is +** broken out from its caller to avoid unnecessary stack pointer movement. +*/ +static int SQLITE_NOINLINE saveCursorsOnList( + BtCursor *p, /* The first cursor that needs saving */ + Pgno iRoot, /* Only save cursor with this iRoot. Save all if zero */ + BtCursor *pExcept /* Do not save this cursor */ +){ + do{ + if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) ){ + if( p->eState==CURSOR_VALID || p->eState==CURSOR_SKIPNEXT ){ + int rc = saveCursorPosition(p); + if( SQLITE_OK!=rc ){ + return rc; + } + }else{ + testcase( p->iPage>=0 ); + btreeReleaseAllCursorPages(p); + } + } + p = p->pNext; + }while( p ); + return SQLITE_OK; +} + +/* +** Clear the current cursor position. +*/ +SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + sqlite3_free(pCur->pKey); + pCur->pKey = 0; + pCur->eState = CURSOR_INVALID; +} + +/* +** In this version of BtreeMoveto, pKey is a packed index record +** such as is generated by the OP_MakeRecord opcode. Unpack the +** record and then call BtreeMovetoUnpacked() to do the work. +*/ +static int btreeMoveto( + BtCursor *pCur, /* Cursor open on the btree to be searched */ + const void *pKey, /* Packed key if the btree is an index */ + i64 nKey, /* Integer key for tables. Size of pKey for indices */ + int bias, /* Bias search to the high end */ + int *pRes /* Write search results here */ +){ + int rc; /* Status code */ + UnpackedRecord *pIdxKey; /* Unpacked index key */ + + if( pKey ){ + KeyInfo *pKeyInfo = pCur->pKeyInfo; + assert( nKey==(i64)(int)nKey ); + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); + if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; + sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey); + if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){ + rc = SQLITE_CORRUPT_BKPT; + goto moveto_done; + } + }else{ + pIdxKey = 0; + } + rc = sqlite3BtreeMovetoUnpacked(pCur, pIdxKey, nKey, bias, pRes); +moveto_done: + if( pIdxKey ){ + sqlite3DbFree(pCur->pKeyInfo->db, pIdxKey); + } + return rc; +} + +/* +** Restore the cursor to the position it was in (or as close to as possible) +** when saveCursorPosition() was called. Note that this call deletes the +** saved position info stored by saveCursorPosition(), so there can be +** at most one effective restoreCursorPosition() call after each +** saveCursorPosition(). +*/ +static int btreeRestoreCursorPosition(BtCursor *pCur){ + int rc; + int skipNext = 0; + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState>=CURSOR_REQUIRESEEK ); + if( pCur->eState==CURSOR_FAULT ){ + return pCur->skipNext; + } + pCur->eState = CURSOR_INVALID; + if( sqlite3FaultSim(410) ){ + rc = SQLITE_IOERR; + }else{ + rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &skipNext); + } + if( rc==SQLITE_OK ){ + sqlite3_free(pCur->pKey); + pCur->pKey = 0; + assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); + if( skipNext ) pCur->skipNext = skipNext; + if( pCur->skipNext && pCur->eState==CURSOR_VALID ){ + pCur->eState = CURSOR_SKIPNEXT; + } + } + return rc; +} + +#define restoreCursorPosition(p) \ + (p->eState>=CURSOR_REQUIRESEEK ? \ + btreeRestoreCursorPosition(p) : \ + SQLITE_OK) + +/* +** Determine whether or not a cursor has moved from the position where +** it was last placed, or has been invalidated for any other reason. +** Cursors can move when the row they are pointing at is deleted out +** from under them, for example. Cursor might also move if a btree +** is rebalanced. +** +** Calling this routine with a NULL cursor pointer returns false. +** +** Use the separate sqlite3BtreeCursorRestore() routine to restore a cursor +** back to where it ought to be if this routine returns true. +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur){ + assert( EIGHT_BYTE_ALIGNMENT(pCur) + || pCur==sqlite3BtreeFakeValidCursor() ); + assert( offsetof(BtCursor, eState)==0 ); + assert( sizeof(pCur->eState)==1 ); + return CURSOR_VALID != *(u8*)pCur; +} + +/* +** Return a pointer to a fake BtCursor object that will always answer +** false to the sqlite3BtreeCursorHasMoved() routine above. The fake +** cursor returned must not be used with any other Btree interface. +*/ +SQLITE_PRIVATE BtCursor *sqlite3BtreeFakeValidCursor(void){ + static u8 fakeCursor = CURSOR_VALID; + assert( offsetof(BtCursor, eState)==0 ); + return (BtCursor*)&fakeCursor; +} + +/* +** This routine restores a cursor back to its original position after it +** has been moved by some outside activity (such as a btree rebalance or +** a row having been deleted out from under the cursor). +** +** On success, the *pDifferentRow parameter is false if the cursor is left +** pointing at exactly the same row. *pDifferntRow is the row the cursor +** was pointing to has been deleted, forcing the cursor to point to some +** nearby row. +** +** This routine should only be called for a cursor that just returned +** TRUE from sqlite3BtreeCursorHasMoved(). +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow){ + int rc; + + assert( pCur!=0 ); + assert( pCur->eState!=CURSOR_VALID ); + rc = restoreCursorPosition(pCur); + if( rc ){ + *pDifferentRow = 1; + return rc; + } + if( pCur->eState!=CURSOR_VALID ){ + *pDifferentRow = 1; + }else{ + *pDifferentRow = 0; + } + return SQLITE_OK; +} + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Provide hints to the cursor. The particular hint given (and the type +** and number of the varargs parameters) is determined by the eHintType +** parameter. See the definitions of the BTREE_HINT_* macros for details. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor *pCur, int eHintType, ...){ + /* Used only by system that substitute their own storage engine */ +} +#endif + +/* +** Provide flag hints to the cursor. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor *pCur, unsigned x){ + assert( x==BTREE_SEEK_EQ || x==BTREE_BULKLOAD || x==0 ); + pCur->hints = x; +} + + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Given a page number of a regular database page, return the page +** number for the pointer-map page that contains the entry for the +** input page number. +** +** Return 0 (not a valid page) for pgno==1 since there is +** no pointer map associated with page 1. The integrity_check logic +** requires that ptrmapPageno(*,1)!=1. +*/ +static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){ + int nPagesPerMapPage; + Pgno iPtrMap, ret; + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pgno<2 ) return 0; + nPagesPerMapPage = (pBt->usableSize/5)+1; + iPtrMap = (pgno-2)/nPagesPerMapPage; + ret = (iPtrMap*nPagesPerMapPage) + 2; + if( ret==PENDING_BYTE_PAGE(pBt) ){ + ret++; + } + return ret; +} + +/* +** Write an entry into the pointer map. +** +** This routine updates the pointer map entry for page number 'key' +** so that it maps to type 'eType' and parent page number 'pgno'. +** +** If *pRC is initially non-zero (non-SQLITE_OK) then this routine is +** a no-op. If an error occurs, the appropriate error code is written +** into *pRC. +*/ +static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ + DbPage *pDbPage; /* The pointer map page */ + u8 *pPtrmap; /* The pointer map data */ + Pgno iPtrmap; /* The pointer map page number */ + int offset; /* Offset in pointer map page */ + int rc; /* Return code from subfunctions */ + + if( *pRC ) return; + + assert( sqlite3_mutex_held(pBt->mutex) ); + /* The master-journal page number must never be used as a pointer map page */ + assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); + + assert( pBt->autoVacuum ); + if( key==0 ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + iPtrmap = PTRMAP_PAGENO(pBt, key); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage, 0); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } + if( ((char*)sqlite3PagerGetExtra(pDbPage))[0]!=0 ){ + /* The first byte of the extra data is the MemPage.isInit byte. + ** If that byte is set, it means this page is also being used + ** as a btree page. */ + *pRC = SQLITE_CORRUPT_BKPT; + goto ptrmap_exit; + } + offset = PTRMAP_PTROFFSET(iPtrmap, key); + if( offset<0 ){ + *pRC = SQLITE_CORRUPT_BKPT; + goto ptrmap_exit; + } + assert( offset <= (int)pBt->usableSize-5 ); + pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + + if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ + TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent)); + *pRC= rc = sqlite3PagerWrite(pDbPage); + if( rc==SQLITE_OK ){ + pPtrmap[offset] = eType; + put4byte(&pPtrmap[offset+1], parent); + } + } + +ptrmap_exit: + sqlite3PagerUnref(pDbPage); +} + +/* +** Read an entry from the pointer map. +** +** This routine retrieves the pointer map entry for page 'key', writing +** the type and parent page number to *pEType and *pPgno respectively. +** An error code is returned if something goes wrong, otherwise SQLITE_OK. +*/ +static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ + DbPage *pDbPage; /* The pointer map page */ + int iPtrmap; /* Pointer map page index */ + u8 *pPtrmap; /* Pointer map page data */ + int offset; /* Offset of entry in pointer map */ + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + + iPtrmap = PTRMAP_PAGENO(pBt, key); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage, 0); + if( rc!=0 ){ + return rc; + } + pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + + offset = PTRMAP_PTROFFSET(iPtrmap, key); + if( offset<0 ){ + sqlite3PagerUnref(pDbPage); + return SQLITE_CORRUPT_BKPT; + } + assert( offset <= (int)pBt->usableSize-5 ); + assert( pEType!=0 ); + *pEType = pPtrmap[offset]; + if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]); + + sqlite3PagerUnref(pDbPage); + if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_PGNO(iPtrmap); + return SQLITE_OK; +} + +#else /* if defined SQLITE_OMIT_AUTOVACUUM */ + #define ptrmapPut(w,x,y,z,rc) + #define ptrmapGet(w,x,y,z) SQLITE_OK + #define ptrmapPutOvflPtr(x, y, z, rc) +#endif + +/* +** Given a btree page and a cell index (0 means the first cell on +** the page, 1 means the second cell, and so forth) return a pointer +** to the cell content. +** +** findCellPastPtr() does the same except it skips past the initial +** 4-byte child pointer found on interior pages, if there is one. +** +** This routine works only for pages that do not contain overflow cells. +*/ +#define findCell(P,I) \ + ((P)->aData + ((P)->maskPage & get2byteAligned(&(P)->aCellIdx[2*(I)]))) +#define findCellPastPtr(P,I) \ + ((P)->aDataOfst + ((P)->maskPage & get2byteAligned(&(P)->aCellIdx[2*(I)]))) + + +/* +** This is common tail processing for btreeParseCellPtr() and +** btreeParseCellPtrIndex() for the case when the cell does not fit entirely +** on a single B-tree page. Make necessary adjustments to the CellInfo +** structure. +*/ +static SQLITE_NOINLINE void btreeParseCellAdjustSizeForOverflow( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + /* If the payload will not fit completely on the local page, we have + ** to decide how much to store locally and how much to spill onto + ** overflow pages. The strategy is to minimize the amount of unused + ** space on overflow pages while keeping the amount of local storage + ** in between minLocal and maxLocal. + ** + ** Warning: changing the way overflow payload is distributed in any + ** way will result in an incompatible file format. + */ + int minLocal; /* Minimum amount of payload held locally */ + int maxLocal; /* Maximum amount of payload held locally */ + int surplus; /* Overflow payload available for local storage */ + + minLocal = pPage->minLocal; + maxLocal = pPage->maxLocal; + surplus = minLocal + (pInfo->nPayload - minLocal)%(pPage->pBt->usableSize-4); + testcase( surplus==maxLocal ); + testcase( surplus==maxLocal+1 ); + if( surplus <= maxLocal ){ + pInfo->nLocal = (u16)surplus; + }else{ + pInfo->nLocal = (u16)minLocal; + } + pInfo->nSize = (u16)(&pInfo->pPayload[pInfo->nLocal] - pCell) + 4; +} + +/* +** The following routines are implementations of the MemPage.xParseCell() +** method. +** +** Parse a cell content block and fill in the CellInfo structure. +** +** btreeParseCellPtr() => table btree leaf nodes +** btreeParseCellNoPayload() => table btree internal nodes +** btreeParseCellPtrIndex() => index btree nodes +** +** There is also a wrapper function btreeParseCell() that works for +** all MemPage types and that references the cell by index rather than +** by pointer. +*/ +static void btreeParseCellPtrNoPayload( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 ); + assert( pPage->childPtrSize==4 ); +#ifndef SQLITE_DEBUG + UNUSED_PARAMETER(pPage); +#endif + pInfo->nSize = 4 + getVarint(&pCell[4], (u64*)&pInfo->nKey); + pInfo->nPayload = 0; + pInfo->nLocal = 0; + pInfo->pPayload = 0; + return; +} +static void btreeParseCellPtr( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + u8 *pIter; /* For scanning through pCell */ + u32 nPayload; /* Number of bytes of cell payload */ + u64 iKey; /* Extracted Key value */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 || pPage->leaf==1 ); + assert( pPage->intKeyLeaf ); + assert( pPage->childPtrSize==0 ); + pIter = pCell; + + /* The next block of code is equivalent to: + ** + ** pIter += getVarint32(pIter, nPayload); + ** + ** The code is inlined to avoid a function call. + */ + nPayload = *pIter; + if( nPayload>=0x80 ){ + u8 *pEnd = &pIter[8]; + nPayload &= 0x7f; + do{ + nPayload = (nPayload<<7) | (*++pIter & 0x7f); + }while( (*pIter)>=0x80 && pIternKey); + ** + ** The code is inlined to avoid a function call. + */ + iKey = *pIter; + if( iKey>=0x80 ){ + u8 *pEnd = &pIter[7]; + iKey &= 0x7f; + while(1){ + iKey = (iKey<<7) | (*++pIter & 0x7f); + if( (*pIter)<0x80 ) break; + if( pIter>=pEnd ){ + iKey = (iKey<<8) | *++pIter; + break; + } + } + } + pIter++; + + pInfo->nKey = *(i64*)&iKey; + pInfo->nPayload = nPayload; + pInfo->pPayload = pIter; + testcase( nPayload==pPage->maxLocal ); + testcase( nPayload==pPage->maxLocal+1 ); + if( nPayload<=pPage->maxLocal ){ + /* This is the (easy) common case where the entire payload fits + ** on the local page. No overflow is required. + */ + pInfo->nSize = nPayload + (u16)(pIter - pCell); + if( pInfo->nSize<4 ) pInfo->nSize = 4; + pInfo->nLocal = (u16)nPayload; + }else{ + btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); + } +} +static void btreeParseCellPtrIndex( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + u8 *pIter; /* For scanning through pCell */ + u32 nPayload; /* Number of bytes of cell payload */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 || pPage->leaf==1 ); + assert( pPage->intKeyLeaf==0 ); + pIter = pCell + pPage->childPtrSize; + nPayload = *pIter; + if( nPayload>=0x80 ){ + u8 *pEnd = &pIter[8]; + nPayload &= 0x7f; + do{ + nPayload = (nPayload<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pIternKey = nPayload; + pInfo->nPayload = nPayload; + pInfo->pPayload = pIter; + testcase( nPayload==pPage->maxLocal ); + testcase( nPayload==pPage->maxLocal+1 ); + if( nPayload<=pPage->maxLocal ){ + /* This is the (easy) common case where the entire payload fits + ** on the local page. No overflow is required. + */ + pInfo->nSize = nPayload + (u16)(pIter - pCell); + if( pInfo->nSize<4 ) pInfo->nSize = 4; + pInfo->nLocal = (u16)nPayload; + }else{ + btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); + } +} +static void btreeParseCell( + MemPage *pPage, /* Page containing the cell */ + int iCell, /* The cell index. First cell is 0 */ + CellInfo *pInfo /* Fill in this structure */ +){ + pPage->xParseCell(pPage, findCell(pPage, iCell), pInfo); +} + +/* +** The following routines are implementations of the MemPage.xCellSize +** method. +** +** Compute the total number of bytes that a Cell needs in the cell +** data area of the btree-page. The return number includes the cell +** data header and the local payload, but not any overflow page or +** the space used by the cell pointer. +** +** cellSizePtrNoPayload() => table internal nodes +** cellSizePtr() => all index nodes & table leaf nodes +*/ +static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + u32 nSize; /* Size value to return */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + pPage->xParseCell(pPage, pCell, &debuginfo); +#endif + + nSize = *pIter; + if( nSize>=0x80 ){ + pEnd = &pIter[8]; + nSize &= 0x7f; + do{ + nSize = (nSize<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pIterintKey ){ + /* pIter now points at the 64-bit integer key value, a variable length + ** integer. The following block moves pIter to point at the first byte + ** past the end of the key value. */ + pEnd = &pIter[9]; + while( (*pIter++)&0x80 && pItermaxLocal ); + testcase( nSize==pPage->maxLocal+1 ); + if( nSize<=pPage->maxLocal ){ + nSize += (u32)(pIter - pCell); + if( nSize<4 ) nSize = 4; + }else{ + int minLocal = pPage->minLocal; + nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4); + testcase( nSize==pPage->maxLocal ); + testcase( nSize==pPage->maxLocal+1 ); + if( nSize>pPage->maxLocal ){ + nSize = minLocal; + } + nSize += 4 + (u16)(pIter - pCell); + } + assert( nSize==debuginfo.nSize || CORRUPT_DB ); + return (u16)nSize; +} +static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell + 4; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + pPage->xParseCell(pPage, pCell, &debuginfo); +#else + UNUSED_PARAMETER(pPage); +#endif + + assert( pPage->childPtrSize==4 ); + pEnd = pIter + 9; + while( (*pIter++)&0x80 && pIterxCellSize(pPage, findCell(pPage, iCell)); +} +#endif + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** The cell pCell is currently part of page pSrc but will ultimately be part +** of pPage. (pSrc and pPager are often the same.) If pCell contains a +** pointer to an overflow page, insert an entry into the pointer-map for +** the overflow page that will be valid after pCell has been moved to pPage. +*/ +static void ptrmapPutOvflPtr(MemPage *pPage, MemPage *pSrc, u8 *pCell,int *pRC){ + CellInfo info; + if( *pRC ) return; + assert( pCell!=0 ); + pPage->xParseCell(pPage, pCell, &info); + if( info.nLocalaDataEnd, pCell, pCell+info.nLocal) ){ + testcase( pSrc!=pPage ); + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + ovfl = get4byte(&pCell[info.nSize-4]); + ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); + } +} +#endif + + +/* +** Defragment the page given. This routine reorganizes cells within the +** page so that there are no free-blocks on the free-block list. +** +** Parameter nMaxFrag is the maximum amount of fragmented space that may be +** present in the page after this routine returns. +** +** EVIDENCE-OF: R-44582-60138 SQLite may from time to time reorganize a +** b-tree page so that there are no freeblocks or fragment bytes, all +** unused bytes are contained in the unallocated space region, and all +** cells are packed tightly at the end of the page. +*/ +static int defragmentPage(MemPage *pPage, int nMaxFrag){ + int i; /* Loop counter */ + int pc; /* Address of the i-th cell */ + int hdr; /* Offset to the page header */ + int size; /* Size of a cell */ + int usableSize; /* Number of usable bytes on a page */ + int cellOffset; /* Offset to the cell pointer array */ + int cbrk; /* Offset to the cell content area */ + int nCell; /* Number of cells on the page */ + unsigned char *data; /* The page data */ + unsigned char *temp; /* Temp area for cell content */ + unsigned char *src; /* Source of content */ + int iCellFirst; /* First allowable cell index */ + int iCellLast; /* Last possible cell index */ + + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( pPage->pBt!=0 ); + assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE ); + assert( pPage->nOverflow==0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + temp = 0; + src = data = pPage->aData; + hdr = pPage->hdrOffset; + cellOffset = pPage->cellOffset; + nCell = pPage->nCell; + assert( nCell==get2byte(&data[hdr+3]) || CORRUPT_DB ); + iCellFirst = cellOffset + 2*nCell; + usableSize = pPage->pBt->usableSize; + + /* This block handles pages with two or fewer free blocks and nMaxFrag + ** or fewer fragmented bytes. In this case it is faster to move the + ** two (or one) blocks of cells using memmove() and add the required + ** offsets to each pointer in the cell-pointer array than it is to + ** reconstruct the entire page. */ + if( (int)data[hdr+7]<=nMaxFrag ){ + int iFree = get2byte(&data[hdr+1]); + if( iFree>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); + if( iFree ){ + int iFree2 = get2byte(&data[iFree]); + if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); + if( 0==iFree2 || (data[iFree2]==0 && data[iFree2+1]==0) ){ + u8 *pEnd = &data[cellOffset + nCell*2]; + u8 *pAddr; + int sz2 = 0; + int sz = get2byte(&data[iFree+2]); + int top = get2byte(&data[hdr+5]); + if( top>=iFree ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + if( iFree2 ){ + if( iFree+sz>iFree2 ) return SQLITE_CORRUPT_PAGE(pPage); + sz2 = get2byte(&data[iFree2+2]); + if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); + memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); + sz += sz2; + }else if( NEVER(iFree+sz>usableSize) ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + + cbrk = top+sz; + assert( cbrk+(iFree-top) <= usableSize ); + memmove(&data[cbrk], &data[top], iFree-top); + for(pAddr=&data[cellOffset]; pAddriCellLast ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( pc>=iCellFirst && pc<=iCellLast ); + size = pPage->xCellSize(pPage, &src[pc]); + cbrk -= size; + if( cbrkusableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( cbrk+size<=usableSize && cbrk>=iCellFirst ); + testcase( cbrk+size==usableSize ); + testcase( pc+size==usableSize ); + put2byte(pAddr, cbrk); + if( temp==0 ){ + int x; + if( cbrk==pc ) continue; + temp = sqlite3PagerTempSpace(pPage->pBt->pPager); + x = get2byte(&data[hdr+5]); + memcpy(&temp[x], &data[x], (cbrk+size) - x); + src = temp; + } + memcpy(&data[cbrk], &src[pc], size); + } + data[hdr+7] = 0; + + defragment_out: + assert( pPage->nFree>=0 ); + if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( cbrk>=iCellFirst ); + put2byte(&data[hdr+5], cbrk); + data[hdr+1] = 0; + data[hdr+2] = 0; + memset(&data[iCellFirst], 0, cbrk-iCellFirst); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + return SQLITE_OK; +} + +/* +** Search the free-list on page pPg for space to store a cell nByte bytes in +** size. If one can be found, return a pointer to the space and remove it +** from the free-list. +** +** If no suitable space can be found on the free-list, return NULL. +** +** This function may detect corruption within pPg. If corruption is +** detected then *pRc is set to SQLITE_CORRUPT and NULL is returned. +** +** Slots on the free list that are between 1 and 3 bytes larger than nByte +** will be ignored if adding the extra space to the fragmentation count +** causes the fragmentation count to exceed 60. +*/ +static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ + const int hdr = pPg->hdrOffset; /* Offset to page header */ + u8 * const aData = pPg->aData; /* Page data */ + int iAddr = hdr + 1; /* Address of ptr to pc */ + int pc = get2byte(&aData[iAddr]); /* Address of a free slot */ + int x; /* Excess size of the slot */ + int maxPC = pPg->pBt->usableSize - nByte; /* Max address for a usable slot */ + int size; /* Size of the free slot */ + + assert( pc>0 ); + while( pc<=maxPC ){ + /* EVIDENCE-OF: R-22710-53328 The third and fourth bytes of each + ** freeblock form a big-endian integer which is the size of the freeblock + ** in bytes, including the 4-byte header. */ + size = get2byte(&aData[pc+2]); + if( (x = size - nByte)>=0 ){ + testcase( x==4 ); + testcase( x==3 ); + if( x<4 ){ + /* EVIDENCE-OF: R-11498-58022 In a well-formed b-tree page, the total + ** number of bytes in fragments may not exceed 60. */ + if( aData[hdr+7]>57 ) return 0; + + /* Remove the slot from the free-list. Update the number of + ** fragmented bytes within the page. */ + memcpy(&aData[iAddr], &aData[pc], 2); + aData[hdr+7] += (u8)x; + }else if( x+pc > maxPC ){ + /* This slot extends off the end of the usable part of the page */ + *pRc = SQLITE_CORRUPT_PAGE(pPg); + return 0; + }else{ + /* The slot remains on the free-list. Reduce its size to account + ** for the portion used by the new allocation. */ + put2byte(&aData[pc+2], x); + } + return &aData[pc + x]; + } + iAddr = pc; + pc = get2byte(&aData[pc]); + if( pc<=iAddr+size ){ + if( pc ){ + /* The next slot in the chain is not past the end of the current slot */ + *pRc = SQLITE_CORRUPT_PAGE(pPg); + } + return 0; + } + } + if( pc>maxPC+nByte-4 ){ + /* The free slot chain extends off the end of the page */ + *pRc = SQLITE_CORRUPT_PAGE(pPg); + } + return 0; +} + +/* +** Allocate nByte bytes of space from within the B-Tree page passed +** as the first argument. Write into *pIdx the index into pPage->aData[] +** of the first byte of allocated space. Return either SQLITE_OK or +** an error code (usually SQLITE_CORRUPT). +** +** The caller guarantees that there is sufficient space to make the +** allocation. This routine might need to defragment in order to bring +** all the space together, however. This routine will avoid using +** the first two bytes past the cell pointer area since presumably this +** allocation is being made in order to insert a new cell, so we will +** also end up needing a new cell pointer. +*/ +static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ + const int hdr = pPage->hdrOffset; /* Local cache of pPage->hdrOffset */ + u8 * const data = pPage->aData; /* Local cache of pPage->aData */ + int top; /* First byte of cell content area */ + int rc = SQLITE_OK; /* Integer return code */ + int gap; /* First byte of gap between cell pointers and cell content */ + + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( pPage->pBt ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( nByte>=0 ); /* Minimum cell size is 4 */ + assert( pPage->nFree>=nByte ); + assert( pPage->nOverflow==0 ); + assert( nByte < (int)(pPage->pBt->usableSize-8) ); + + assert( pPage->cellOffset == hdr + 12 - 4*pPage->leaf ); + gap = pPage->cellOffset + 2*pPage->nCell; + assert( gap<=65536 ); + /* EVIDENCE-OF: R-29356-02391 If the database uses a 65536-byte page size + ** and the reserved space is zero (the usual value for reserved space) + ** then the cell content offset of an empty page wants to be 65536. + ** However, that integer is too large to be stored in a 2-byte unsigned + ** integer, so a value of 0 is used in its place. */ + top = get2byte(&data[hdr+5]); + assert( top<=(int)pPage->pBt->usableSize ); /* by btreeComputeFreeSpace() */ + if( gap>top ){ + if( top==0 && pPage->pBt->usableSize==65536 ){ + top = 65536; + }else{ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + + /* If there is enough space between gap and top for one more cell pointer, + ** and if the freelist is not empty, then search the + ** freelist looking for a slot big enough to satisfy the request. + */ + testcase( gap+2==top ); + testcase( gap+1==top ); + testcase( gap==top ); + if( (data[hdr+2] || data[hdr+1]) && gap+2<=top ){ + u8 *pSpace = pageFindSlot(pPage, nByte, &rc); + if( pSpace ){ + int g2; + assert( pSpace+nByte<=data+pPage->pBt->usableSize ); + *pIdx = g2 = (int)(pSpace-data); + if( NEVER(g2<=gap) ){ + return SQLITE_CORRUPT_PAGE(pPage); + }else{ + return SQLITE_OK; + } + }else if( rc ){ + return rc; + } + } + + /* The request could not be fulfilled using a freelist slot. Check + ** to see if defragmentation is necessary. + */ + testcase( gap+2+nByte==top ); + if( gap+2+nByte>top ){ + assert( pPage->nCell>0 || CORRUPT_DB ); + assert( pPage->nFree>=0 ); + rc = defragmentPage(pPage, MIN(4, pPage->nFree - (2+nByte))); + if( rc ) return rc; + top = get2byteNotZero(&data[hdr+5]); + assert( gap+2+nByte<=top ); + } + + + /* Allocate memory from the gap in between the cell pointer array + ** and the cell content area. The btreeComputeFreeSpace() call has already + ** validated the freelist. Given that the freelist is valid, there + ** is no way that the allocation can extend off the end of the page. + ** The assert() below verifies the previous sentence. + */ + top -= nByte; + put2byte(&data[hdr+5], top); + assert( top+nByte <= (int)pPage->pBt->usableSize ); + *pIdx = top; + return SQLITE_OK; +} + +/* +** Return a section of the pPage->aData to the freelist. +** The first byte of the new free block is pPage->aData[iStart] +** and the size of the block is iSize bytes. +** +** Adjacent freeblocks are coalesced. +** +** Even though the freeblock list was checked by btreeComputeFreeSpace(), +** that routine will not detect overlap between cells or freeblocks. Nor +** does it detect cells or freeblocks that encrouch into the reserved bytes +** at the end of the page. So do additional corruption checks inside this +** routine and return SQLITE_CORRUPT if any problems are found. +*/ +static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ + u16 iPtr; /* Address of ptr to next freeblock */ + u16 iFreeBlk; /* Address of the next freeblock */ + u8 hdr; /* Page header size. 0 or 100 */ + u8 nFrag = 0; /* Reduction in fragmentation */ + u16 iOrigSize = iSize; /* Original value of iSize */ + u16 x; /* Offset to cell content area */ + u32 iEnd = iStart + iSize; /* First byte past the iStart buffer */ + unsigned char *data = pPage->aData; /* Page content */ + + assert( pPage->pBt!=0 ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( CORRUPT_DB || iStart>=pPage->hdrOffset+6+pPage->childPtrSize ); + assert( CORRUPT_DB || iEnd <= pPage->pBt->usableSize ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( iSize>=4 ); /* Minimum cell size is 4 */ + assert( iStart<=pPage->pBt->usableSize-4 ); + + /* The list of freeblocks must be in ascending order. Find the + ** spot on the list where iStart should be inserted. + */ + hdr = pPage->hdrOffset; + iPtr = hdr + 1; + if( data[iPtr+1]==0 && data[iPtr]==0 ){ + iFreeBlk = 0; /* Shortcut for the case when the freelist is empty */ + }else{ + while( (iFreeBlk = get2byte(&data[iPtr]))pPage->pBt->usableSize-4 ){ /* TH3: corrupt081.100 */ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( iFreeBlk>iPtr || iFreeBlk==0 ); + + /* At this point: + ** iFreeBlk: First freeblock after iStart, or zero if none + ** iPtr: The address of a pointer to iFreeBlk + ** + ** Check to see if iFreeBlk should be coalesced onto the end of iStart. + */ + if( iFreeBlk && iEnd+3>=iFreeBlk ){ + nFrag = iFreeBlk - iEnd; + if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PAGE(pPage); + iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]); + if( iEnd > pPage->pBt->usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + iSize = iEnd - iStart; + iFreeBlk = get2byte(&data[iFreeBlk]); + } + + /* If iPtr is another freeblock (that is, if iPtr is not the freelist + ** pointer in the page header) then check to see if iStart should be + ** coalesced onto the end of iPtr. + */ + if( iPtr>hdr+1 ){ + int iPtrEnd = iPtr + get2byte(&data[iPtr+2]); + if( iPtrEnd+3>=iStart ){ + if( iPtrEnd>iStart ) return SQLITE_CORRUPT_PAGE(pPage); + nFrag += iStart - iPtrEnd; + iSize = iEnd - iPtr; + iStart = iPtr; + } + } + if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PAGE(pPage); + data[hdr+7] -= nFrag; + } + x = get2byte(&data[hdr+5]); + if( iStart<=x ){ + /* The new freeblock is at the beginning of the cell content area, + ** so just extend the cell content area rather than create another + ** freelist entry */ + if( iStartpBt->btsFlags & BTS_FAST_SECURE ){ + /* Overwrite deleted information with zeros when the secure_delete + ** option is enabled */ + memset(&data[iStart], 0, iSize); + } + put2byte(&data[iStart], iFreeBlk); + put2byte(&data[iStart+2], iSize); + pPage->nFree += iOrigSize; + return SQLITE_OK; +} + +/* +** Decode the flags byte (the first byte of the header) for a page +** and initialize fields of the MemPage structure accordingly. +** +** Only the following combinations are supported. Anything different +** indicates a corrupt database files: +** +** PTF_ZERODATA +** PTF_ZERODATA | PTF_LEAF +** PTF_LEAFDATA | PTF_INTKEY +** PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF +*/ +static int decodeFlags(MemPage *pPage, int flagByte){ + BtShared *pBt; /* A copy of pPage->pBt */ + + assert( pPage->hdrOffset==(pPage->pgno==1 ? 100 : 0) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 ); + flagByte &= ~PTF_LEAF; + pPage->childPtrSize = 4-4*pPage->leaf; + pPage->xCellSize = cellSizePtr; + pBt = pPage->pBt; + if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){ + /* EVIDENCE-OF: R-07291-35328 A value of 5 (0x05) means the page is an + ** interior table b-tree page. */ + assert( (PTF_LEAFDATA|PTF_INTKEY)==5 ); + /* EVIDENCE-OF: R-26900-09176 A value of 13 (0x0d) means the page is a + ** leaf table b-tree page. */ + assert( (PTF_LEAFDATA|PTF_INTKEY|PTF_LEAF)==13 ); + pPage->intKey = 1; + if( pPage->leaf ){ + pPage->intKeyLeaf = 1; + pPage->xParseCell = btreeParseCellPtr; + }else{ + pPage->intKeyLeaf = 0; + pPage->xCellSize = cellSizePtrNoPayload; + pPage->xParseCell = btreeParseCellPtrNoPayload; + } + pPage->maxLocal = pBt->maxLeaf; + pPage->minLocal = pBt->minLeaf; + }else if( flagByte==PTF_ZERODATA ){ + /* EVIDENCE-OF: R-43316-37308 A value of 2 (0x02) means the page is an + ** interior index b-tree page. */ + assert( (PTF_ZERODATA)==2 ); + /* EVIDENCE-OF: R-59615-42828 A value of 10 (0x0a) means the page is a + ** leaf index b-tree page. */ + assert( (PTF_ZERODATA|PTF_LEAF)==10 ); + pPage->intKey = 0; + pPage->intKeyLeaf = 0; + pPage->xParseCell = btreeParseCellPtrIndex; + pPage->maxLocal = pBt->maxLocal; + pPage->minLocal = pBt->minLocal; + }else{ + /* EVIDENCE-OF: R-47608-56469 Any other value for the b-tree page type is + ** an error. */ + return SQLITE_CORRUPT_PAGE(pPage); + } + pPage->max1bytePayload = pBt->max1bytePayload; + return SQLITE_OK; +} + +/* +** Compute the amount of freespace on the page. In other words, fill +** in the pPage->nFree field. +*/ +static int btreeComputeFreeSpace(MemPage *pPage){ + int pc; /* Address of a freeblock within pPage->aData[] */ + u8 hdr; /* Offset to beginning of page header */ + u8 *data; /* Equal to pPage->aData */ + int usableSize; /* Amount of usable space on each page */ + int nFree; /* Number of unused bytes on the page */ + int top; /* First byte of the cell content area */ + int iCellFirst; /* First allowable cell or freeblock offset */ + int iCellLast; /* Last possible cell or freeblock offset */ + + assert( pPage->pBt!=0 ); + assert( pPage->pBt->db!=0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); + assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); + assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); + assert( pPage->isInit==1 ); + assert( pPage->nFree<0 ); + + usableSize = pPage->pBt->usableSize; + hdr = pPage->hdrOffset; + data = pPage->aData; + /* EVIDENCE-OF: R-58015-48175 The two-byte integer at offset 5 designates + ** the start of the cell content area. A zero value for this integer is + ** interpreted as 65536. */ + top = get2byteNotZero(&data[hdr+5]); + iCellFirst = hdr + 8 + pPage->childPtrSize + 2*pPage->nCell; + iCellLast = usableSize - 4; + + /* Compute the total free space on the page + ** EVIDENCE-OF: R-23588-34450 The two-byte integer at offset 1 gives the + ** start of the first freeblock on the page, or is zero if there are no + ** freeblocks. */ + pc = get2byte(&data[hdr+1]); + nFree = data[hdr+7] + top; /* Init nFree to non-freeblock free space */ + if( pc>0 ){ + u32 next, size; + if( pciCellLast ){ + /* Freeblock off the end of the page */ + return SQLITE_CORRUPT_PAGE(pPage); + } + next = get2byte(&data[pc]); + size = get2byte(&data[pc+2]); + nFree = nFree + size; + if( next<=pc+size+3 ) break; + pc = next; + } + if( next>0 ){ + /* Freeblock not in ascending order */ + return SQLITE_CORRUPT_PAGE(pPage); + } + if( pc+size>(unsigned int)usableSize ){ + /* Last freeblock extends past page end */ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + + /* At this point, nFree contains the sum of the offset to the start + ** of the cell-content area plus the number of free bytes within + ** the cell-content area. If this is greater than the usable-size + ** of the page, then the page must be corrupted. This check also + ** serves to verify that the offset to the start of the cell-content + ** area, according to the page header, lies within the page. + */ + if( nFree>usableSize || nFreenFree = (u16)(nFree - iCellFirst); + return SQLITE_OK; +} + +/* +** Do additional sanity check after btreeInitPage() if +** PRAGMA cell_size_check=ON +*/ +static SQLITE_NOINLINE int btreeCellSizeCheck(MemPage *pPage){ + int iCellFirst; /* First allowable cell or freeblock offset */ + int iCellLast; /* Last possible cell or freeblock offset */ + int i; /* Index into the cell pointer array */ + int sz; /* Size of a cell */ + int pc; /* Address of a freeblock within pPage->aData[] */ + u8 *data; /* Equal to pPage->aData */ + int usableSize; /* Maximum usable space on the page */ + int cellOffset; /* Start of cell content area */ + + iCellFirst = pPage->cellOffset + 2*pPage->nCell; + usableSize = pPage->pBt->usableSize; + iCellLast = usableSize - 4; + data = pPage->aData; + cellOffset = pPage->cellOffset; + if( !pPage->leaf ) iCellLast--; + for(i=0; inCell; i++){ + pc = get2byteAligned(&data[cellOffset+i*2]); + testcase( pc==iCellFirst ); + testcase( pc==iCellLast ); + if( pciCellLast ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + sz = pPage->xCellSize(pPage, &data[pc]); + testcase( pc+sz==usableSize ); + if( pc+sz>usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + return SQLITE_OK; +} + +/* +** Initialize the auxiliary information for a disk block. +** +** Return SQLITE_OK on success. If we see that the page does +** not contain a well-formed database page, then return +** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not +** guarantee that the page is well-formed. It only shows that +** we failed to detect any corruption. +*/ +static int btreeInitPage(MemPage *pPage){ + u8 *data; /* Equal to pPage->aData */ + BtShared *pBt; /* The main btree structure */ + + assert( pPage->pBt!=0 ); + assert( pPage->pBt->db!=0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); + assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); + assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); + assert( pPage->isInit==0 ); + + pBt = pPage->pBt; + data = pPage->aData + pPage->hdrOffset; + /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating + ** the b-tree page type. */ + if( decodeFlags(pPage, data[0]) ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + pPage->maskPage = (u16)(pBt->pageSize - 1); + pPage->nOverflow = 0; + pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize; + pPage->aCellIdx = data + pPage->childPtrSize + 8; + pPage->aDataEnd = pPage->aData + pBt->usableSize; + pPage->aDataOfst = pPage->aData + pPage->childPtrSize; + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + pPage->nCell = get2byte(&data[3]); + if( pPage->nCell>MX_CELL(pBt) ){ + /* To many cells for a single page. The page must be corrupt */ + return SQLITE_CORRUPT_PAGE(pPage); + } + testcase( pPage->nCell==MX_CELL(pBt) ); + /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only + ** possible for a root page of a table that contains no rows) then the + ** offset to the cell content area will equal the page size minus the + ** bytes of reserved space. */ + assert( pPage->nCell>0 + || get2byteNotZero(&data[5])==(int)pBt->usableSize + || CORRUPT_DB ); + pPage->nFree = -1; /* Indicate that this value is yet uncomputed */ + pPage->isInit = 1; + if( pBt->db->flags & SQLITE_CellSizeCk ){ + return btreeCellSizeCheck(pPage); + } + return SQLITE_OK; +} + +/* +** Set up a raw page so that it looks like a database page holding +** no entries. +*/ +static void zeroPage(MemPage *pPage, int flags){ + unsigned char *data = pPage->aData; + BtShared *pBt = pPage->pBt; + u8 hdr = pPage->hdrOffset; + u16 first; + + assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage) == data ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pBt->btsFlags & BTS_FAST_SECURE ){ + memset(&data[hdr], 0, pBt->usableSize - hdr); + } + data[hdr] = (char)flags; + first = hdr + ((flags&PTF_LEAF)==0 ? 12 : 8); + memset(&data[hdr+1], 0, 4); + data[hdr+7] = 0; + put2byte(&data[hdr+5], pBt->usableSize); + pPage->nFree = (u16)(pBt->usableSize - first); + decodeFlags(pPage, flags); + pPage->cellOffset = first; + pPage->aDataEnd = &data[pBt->usableSize]; + pPage->aCellIdx = &data[first]; + pPage->aDataOfst = &data[pPage->childPtrSize]; + pPage->nOverflow = 0; + assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + pPage->maskPage = (u16)(pBt->pageSize - 1); + pPage->nCell = 0; + pPage->isInit = 1; +} + + +/* +** Convert a DbPage obtained from the pager into a MemPage used by +** the btree layer. +*/ +static MemPage *btreePageFromDbPage(DbPage *pDbPage, Pgno pgno, BtShared *pBt){ + MemPage *pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); + if( pgno!=pPage->pgno ){ + pPage->aData = sqlite3PagerGetData(pDbPage); + pPage->pDbPage = pDbPage; + pPage->pBt = pBt; + pPage->pgno = pgno; + pPage->hdrOffset = pgno==1 ? 100 : 0; + } + assert( pPage->aData==sqlite3PagerGetData(pDbPage) ); + return pPage; +} + +/* +** Get a page from the pager. Initialize the MemPage.pBt and +** MemPage.aData elements if needed. See also: btreeGetUnusedPage(). +** +** If the PAGER_GET_NOCONTENT flag is set, it means that we do not care +** about the content of the page at this time. So do not go to the disk +** to fetch the content. Just fill in the content with zeros for now. +** If in the future we call sqlite3PagerWrite() on this page, that +** means we have started to be concerned about content and the disk +** read should occur at that point. +*/ +static int btreeGetPage( + BtShared *pBt, /* The btree */ + Pgno pgno, /* Number of the page to fetch */ + MemPage **ppPage, /* Return the page in this parameter */ + int flags /* PAGER_GET_NOCONTENT or PAGER_GET_READONLY */ +){ + int rc; + DbPage *pDbPage; + + assert( flags==0 || flags==PAGER_GET_NOCONTENT || flags==PAGER_GET_READONLY ); + assert( sqlite3_mutex_held(pBt->mutex) ); + rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, flags); + if( rc ) return rc; + *ppPage = btreePageFromDbPage(pDbPage, pgno, pBt); + return SQLITE_OK; +} + +/* +** Retrieve a page from the pager cache. If the requested page is not +** already in the pager cache return NULL. Initialize the MemPage.pBt and +** MemPage.aData elements if needed. +*/ +static MemPage *btreePageLookup(BtShared *pBt, Pgno pgno){ + DbPage *pDbPage; + assert( sqlite3_mutex_held(pBt->mutex) ); + pDbPage = sqlite3PagerLookup(pBt->pPager, pgno); + if( pDbPage ){ + return btreePageFromDbPage(pDbPage, pgno, pBt); + } + return 0; +} + +/* +** Return the size of the database file in pages. If there is any kind of +** error, return ((unsigned int)-1). +*/ +static Pgno btreePagecount(BtShared *pBt){ + assert( (pBt->nPage & 0x80000000)==0 || CORRUPT_DB ); + return pBt->nPage; +} +SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree *p){ + assert( sqlite3BtreeHoldsMutex(p) ); + return btreePagecount(p->pBt) & 0x7fffffff; +} + +/* +** Get a page from the pager and initialize it. +** +** If pCur!=0 then the page is being fetched as part of a moveToChild() +** call. Do additional sanity checking on the page in this case. +** And if the fetch fails, this routine must decrement pCur->iPage. +** +** The page is fetched as read-write unless pCur is not NULL and is +** a read-only cursor. +** +** If an error occurs, then *ppPage is undefined. It +** may remain unchanged, or it may be set to an invalid value. +*/ +static int getAndInitPage( + BtShared *pBt, /* The database file */ + Pgno pgno, /* Number of the page to get */ + MemPage **ppPage, /* Write the page pointer here */ + BtCursor *pCur, /* Cursor to receive the page, or NULL */ + int bReadOnly /* True for a read-only page */ +){ + int rc; + DbPage *pDbPage; + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pCur==0 || ppPage==&pCur->pPage ); + assert( pCur==0 || bReadOnly==pCur->curPagerFlags ); + assert( pCur==0 || pCur->iPage>0 ); + + if( pgno>btreePagecount(pBt) ){ + rc = SQLITE_CORRUPT_BKPT; + goto getAndInitPage_error1; + } + rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, bReadOnly); + if( rc ){ + goto getAndInitPage_error1; + } + *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); + if( (*ppPage)->isInit==0 ){ + btreePageFromDbPage(pDbPage, pgno, pBt); + rc = btreeInitPage(*ppPage); + if( rc!=SQLITE_OK ){ + goto getAndInitPage_error2; + } + } + assert( (*ppPage)->pgno==pgno ); + assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) ); + + /* If obtaining a child page for a cursor, we must verify that the page is + ** compatible with the root page. */ + if( pCur && ((*ppPage)->nCell<1 || (*ppPage)->intKey!=pCur->curIntKey) ){ + rc = SQLITE_CORRUPT_PGNO(pgno); + goto getAndInitPage_error2; + } + return SQLITE_OK; + +getAndInitPage_error2: + releasePage(*ppPage); +getAndInitPage_error1: + if( pCur ){ + pCur->iPage--; + pCur->pPage = pCur->apPage[pCur->iPage]; + } + testcase( pgno==0 ); + assert( pgno!=0 || rc==SQLITE_CORRUPT ); + return rc; +} + +/* +** Release a MemPage. This should be called once for each prior +** call to btreeGetPage. +** +** Page1 is a special case and must be released using releasePageOne(). +*/ +static void releasePageNotNull(MemPage *pPage){ + assert( pPage->aData ); + assert( pPage->pBt ); + assert( pPage->pDbPage!=0 ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + sqlite3PagerUnrefNotNull(pPage->pDbPage); +} +static void releasePage(MemPage *pPage){ + if( pPage ) releasePageNotNull(pPage); +} +static void releasePageOne(MemPage *pPage){ + assert( pPage!=0 ); + assert( pPage->aData ); + assert( pPage->pBt ); + assert( pPage->pDbPage!=0 ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + sqlite3PagerUnrefPageOne(pPage->pDbPage); +} + +/* +** Get an unused page. +** +** This works just like btreeGetPage() with the addition: +** +** * If the page is already in use for some other purpose, immediately +** release it and return an SQLITE_CURRUPT error. +** * Make sure the isInit flag is clear +*/ +static int btreeGetUnusedPage( + BtShared *pBt, /* The btree */ + Pgno pgno, /* Number of the page to fetch */ + MemPage **ppPage, /* Return the page in this parameter */ + int flags /* PAGER_GET_NOCONTENT or PAGER_GET_READONLY */ +){ + int rc = btreeGetPage(pBt, pgno, ppPage, flags); + if( rc==SQLITE_OK ){ + if( sqlite3PagerPageRefcount((*ppPage)->pDbPage)>1 ){ + releasePage(*ppPage); + *ppPage = 0; + return SQLITE_CORRUPT_BKPT; + } + (*ppPage)->isInit = 0; + }else{ + *ppPage = 0; + } + return rc; +} + + +/* +** During a rollback, when the pager reloads information into the cache +** so that the cache is restored to its original state at the start of +** the transaction, for each page restored this routine is called. +** +** This routine needs to reset the extra data section at the end of the +** page to agree with the restored data. +*/ +static void pageReinit(DbPage *pData){ + MemPage *pPage; + pPage = (MemPage *)sqlite3PagerGetExtra(pData); + assert( sqlite3PagerPageRefcount(pData)>0 ); + if( pPage->isInit ){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pPage->isInit = 0; + if( sqlite3PagerPageRefcount(pData)>1 ){ + /* pPage might not be a btree page; it might be an overflow page + ** or ptrmap page or a free page. In those cases, the following + ** call to btreeInitPage() will likely return SQLITE_CORRUPT. + ** But no harm is done by this. And it is very important that + ** btreeInitPage() be called on every btree page so we make + ** the call for every page that comes in for re-initing. */ + btreeInitPage(pPage); + } + } +} + +/* +** Invoke the busy handler for a btree. +*/ +static int btreeInvokeBusyHandler(void *pArg){ + BtShared *pBt = (BtShared*)pArg; + assert( pBt->db ); + assert( sqlite3_mutex_held(pBt->db->mutex) ); + return sqlite3InvokeBusyHandler(&pBt->db->busyHandler); +} + +/* +** Open a database file. +** +** zFilename is the name of the database file. If zFilename is NULL +** then an ephemeral database is created. The ephemeral database might +** be exclusively in memory, or it might use a disk-based memory cache. +** Either way, the ephemeral database will be automatically deleted +** when sqlite3BtreeClose() is called. +** +** If zFilename is ":memory:" then an in-memory database is created +** that is automatically destroyed when it is closed. +** +** The "flags" parameter is a bitmask that might contain bits like +** BTREE_OMIT_JOURNAL and/or BTREE_MEMORY. +** +** If the database is already opened in the same database connection +** and we are in shared cache mode, then the open will fail with an +** SQLITE_CONSTRAINT error. We cannot allow two or more BtShared +** objects in the same database connection since doing so will lead +** to problems with locking. +*/ +SQLITE_PRIVATE int sqlite3BtreeOpen( + sqlite3_vfs *pVfs, /* VFS to use for this b-tree */ + const char *zFilename, /* Name of the file containing the BTree database */ + sqlite3 *db, /* Associated database handle */ + Btree **ppBtree, /* Pointer to new Btree object written here */ + int flags, /* Options */ + int vfsFlags /* Flags passed through to sqlite3_vfs.xOpen() */ +){ + BtShared *pBt = 0; /* Shared part of btree structure */ + Btree *p; /* Handle to return */ + sqlite3_mutex *mutexOpen = 0; /* Prevents a race condition. Ticket #3537 */ + int rc = SQLITE_OK; /* Result code from this function */ + u8 nReserve; /* Byte of unused space on each page */ + unsigned char zDbHeader[100]; /* Database header content */ + + /* True if opening an ephemeral, temporary database */ + const int isTempDb = zFilename==0 || zFilename[0]==0; + + /* Set the variable isMemdb to true for an in-memory database, or + ** false for a file-based database. + */ +#ifdef SQLITE_OMIT_MEMORYDB + const int isMemdb = 0; +#else + const int isMemdb = (zFilename && strcmp(zFilename, ":memory:")==0) + || (isTempDb && sqlite3TempInMemory(db)) + || (vfsFlags & SQLITE_OPEN_MEMORY)!=0; +#endif + + assert( db!=0 ); + assert( pVfs!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( (flags&0xff)==flags ); /* flags fit in 8 bits */ + + /* Only a BTREE_SINGLE database can be BTREE_UNORDERED */ + assert( (flags & BTREE_UNORDERED)==0 || (flags & BTREE_SINGLE)!=0 ); + + /* A BTREE_SINGLE database is always a temporary and/or ephemeral */ + assert( (flags & BTREE_SINGLE)==0 || isTempDb ); + + if( isMemdb ){ + flags |= BTREE_MEMORY; + } + if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (isMemdb || isTempDb) ){ + vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB; + } + p = sqlite3MallocZero(sizeof(Btree)); + if( !p ){ + return SQLITE_NOMEM_BKPT; + } + p->inTrans = TRANS_NONE; + p->db = db; +#ifndef SQLITE_OMIT_SHARED_CACHE + p->lock.pBtree = p; + p->lock.iTable = 1; +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* + ** If this Btree is a candidate for shared cache, try to find an + ** existing BtShared object that we can share with + */ + if( isTempDb==0 && (isMemdb==0 || (vfsFlags&SQLITE_OPEN_URI)!=0) ){ + if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){ + int nFilename = sqlite3Strlen30(zFilename)+1; + int nFullPathname = pVfs->mxPathname+1; + char *zFullPathname = sqlite3Malloc(MAX(nFullPathname,nFilename)); + MUTEX_LOGIC( sqlite3_mutex *mutexShared; ) + + p->sharable = 1; + if( !zFullPathname ){ + sqlite3_free(p); + return SQLITE_NOMEM_BKPT; + } + if( isMemdb ){ + memcpy(zFullPathname, zFilename, nFilename); + }else{ + rc = sqlite3OsFullPathname(pVfs, zFilename, + nFullPathname, zFullPathname); + if( rc ){ + if( rc==SQLITE_OK_SYMLINK ){ + rc = SQLITE_OK; + }else{ + sqlite3_free(zFullPathname); + sqlite3_free(p); + return rc; + } + } + } +#if SQLITE_THREADSAFE + mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN); + sqlite3_mutex_enter(mutexOpen); + mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex_enter(mutexShared); +#endif + for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){ + assert( pBt->nRef>0 ); + if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager, 0)) + && sqlite3PagerVfs(pBt->pPager)==pVfs ){ + int iDb; + for(iDb=db->nDb-1; iDb>=0; iDb--){ + Btree *pExisting = db->aDb[iDb].pBt; + if( pExisting && pExisting->pBt==pBt ){ + sqlite3_mutex_leave(mutexShared); + sqlite3_mutex_leave(mutexOpen); + sqlite3_free(zFullPathname); + sqlite3_free(p); + return SQLITE_CONSTRAINT; + } + } + p->pBt = pBt; + pBt->nRef++; + break; + } + } + sqlite3_mutex_leave(mutexShared); + sqlite3_free(zFullPathname); + } +#ifdef SQLITE_DEBUG + else{ + /* In debug mode, we mark all persistent databases as sharable + ** even when they are not. This exercises the locking code and + ** gives more opportunity for asserts(sqlite3_mutex_held()) + ** statements to find locking problems. + */ + p->sharable = 1; + } +#endif + } +#endif + if( pBt==0 ){ + /* + ** The following asserts make sure that structures used by the btree are + ** the right size. This is to guard against size changes that result + ** when compiling on a different architecture. + */ + assert( sizeof(i64)==8 ); + assert( sizeof(u64)==8 ); + assert( sizeof(u32)==4 ); + assert( sizeof(u16)==2 ); + assert( sizeof(Pgno)==4 ); + + pBt = sqlite3MallocZero( sizeof(*pBt) ); + if( pBt==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto btree_open_out; + } + rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename, + sizeof(MemPage), flags, vfsFlags, pageReinit); + if( rc==SQLITE_OK ){ + sqlite3PagerSetMmapLimit(pBt->pPager, db->szMmap); + rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader); + } + if( rc!=SQLITE_OK ){ + goto btree_open_out; + } + pBt->openFlags = (u8)flags; + pBt->db = db; + sqlite3PagerSetBusyHandler(pBt->pPager, btreeInvokeBusyHandler, pBt); + p->pBt = pBt; + + pBt->pCursor = 0; + pBt->pPage1 = 0; + if( sqlite3PagerIsreadonly(pBt->pPager) ) pBt->btsFlags |= BTS_READ_ONLY; +#if defined(SQLITE_SECURE_DELETE) + pBt->btsFlags |= BTS_SECURE_DELETE; +#elif defined(SQLITE_FAST_SECURE_DELETE) + pBt->btsFlags |= BTS_OVERWRITE; +#endif + /* EVIDENCE-OF: R-51873-39618 The page size for a database file is + ** determined by the 2-byte integer located at an offset of 16 bytes from + ** the beginning of the database file. */ + pBt->pageSize = (zDbHeader[16]<<8) | (zDbHeader[17]<<16); + if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE + || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){ + pBt->pageSize = 0; +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If the magic name ":memory:" will create an in-memory database, then + ** leave the autoVacuum mode at 0 (do not auto-vacuum), even if + ** SQLITE_DEFAULT_AUTOVACUUM is true. On the other hand, if + ** SQLITE_OMIT_MEMORYDB has been defined, then ":memory:" is just a + ** regular file-name. In this case the auto-vacuum applies as per normal. + */ + if( zFilename && !isMemdb ){ + pBt->autoVacuum = (SQLITE_DEFAULT_AUTOVACUUM ? 1 : 0); + pBt->incrVacuum = (SQLITE_DEFAULT_AUTOVACUUM==2 ? 1 : 0); + } +#endif + nReserve = 0; + }else{ + /* EVIDENCE-OF: R-37497-42412 The size of the reserved region is + ** determined by the one-byte unsigned integer found at an offset of 20 + ** into the database file header. */ + nReserve = zDbHeader[20]; + pBt->btsFlags |= BTS_PAGESIZE_FIXED; +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->autoVacuum = (get4byte(&zDbHeader[36 + 4*4])?1:0); + pBt->incrVacuum = (get4byte(&zDbHeader[36 + 7*4])?1:0); +#endif + } + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve); + if( rc ) goto btree_open_out; + pBt->usableSize = pBt->pageSize - nReserve; + assert( (pBt->pageSize & 7)==0 ); /* 8-byte alignment of pageSize */ + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* Add the new BtShared object to the linked list sharable BtShareds. + */ + pBt->nRef = 1; + if( p->sharable ){ + MUTEX_LOGIC( sqlite3_mutex *mutexShared; ) + MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);) + if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){ + pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST); + if( pBt->mutex==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto btree_open_out; + } + } + sqlite3_mutex_enter(mutexShared); + pBt->pNext = GLOBAL(BtShared*,sqlite3SharedCacheList); + GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt; + sqlite3_mutex_leave(mutexShared); + } +#endif + } + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* If the new Btree uses a sharable pBtShared, then link the new + ** Btree into the list of all sharable Btrees for the same connection. + ** The list is kept in ascending order by pBt address. + */ + if( p->sharable ){ + int i; + Btree *pSib; + for(i=0; inDb; i++){ + if( (pSib = db->aDb[i].pBt)!=0 && pSib->sharable ){ + while( pSib->pPrev ){ pSib = pSib->pPrev; } + if( (uptr)p->pBt<(uptr)pSib->pBt ){ + p->pNext = pSib; + p->pPrev = 0; + pSib->pPrev = p; + }else{ + while( pSib->pNext && (uptr)pSib->pNext->pBt<(uptr)p->pBt ){ + pSib = pSib->pNext; + } + p->pNext = pSib->pNext; + p->pPrev = pSib; + if( p->pNext ){ + p->pNext->pPrev = p; + } + pSib->pNext = p; + } + break; + } + } + } +#endif + *ppBtree = p; + +btree_open_out: + if( rc!=SQLITE_OK ){ + if( pBt && pBt->pPager ){ + sqlite3PagerClose(pBt->pPager, 0); + } + sqlite3_free(pBt); + sqlite3_free(p); + *ppBtree = 0; + }else{ + sqlite3_file *pFile; + + /* If the B-Tree was successfully opened, set the pager-cache size to the + ** default value. Except, when opening on an existing shared pager-cache, + ** do not change the pager-cache size. + */ + if( sqlite3BtreeSchema(p, 0, 0)==0 ){ + sqlite3PagerSetCachesize(p->pBt->pPager, SQLITE_DEFAULT_CACHE_SIZE); + } + + pFile = sqlite3PagerFile(pBt->pPager); + if( pFile->pMethods ){ + sqlite3OsFileControlHint(pFile, SQLITE_FCNTL_PDB, (void*)&pBt->db); + } + } + if( mutexOpen ){ + assert( sqlite3_mutex_held(mutexOpen) ); + sqlite3_mutex_leave(mutexOpen); + } + assert( rc!=SQLITE_OK || sqlite3BtreeConnectionCount(*ppBtree)>0 ); + return rc; +} + +/* +** Decrement the BtShared.nRef counter. When it reaches zero, +** remove the BtShared structure from the sharing list. Return +** true if the BtShared.nRef counter reaches zero and return +** false if it is still positive. +*/ +static int removeFromSharingList(BtShared *pBt){ +#ifndef SQLITE_OMIT_SHARED_CACHE + MUTEX_LOGIC( sqlite3_mutex *pMaster; ) + BtShared *pList; + int removed = 0; + + assert( sqlite3_mutex_notheld(pBt->mutex) ); + MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + sqlite3_mutex_enter(pMaster); + pBt->nRef--; + if( pBt->nRef<=0 ){ + if( GLOBAL(BtShared*,sqlite3SharedCacheList)==pBt ){ + GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt->pNext; + }else{ + pList = GLOBAL(BtShared*,sqlite3SharedCacheList); + while( ALWAYS(pList) && pList->pNext!=pBt ){ + pList=pList->pNext; + } + if( ALWAYS(pList) ){ + pList->pNext = pBt->pNext; + } + } + if( SQLITE_THREADSAFE ){ + sqlite3_mutex_free(pBt->mutex); + } + removed = 1; + } + sqlite3_mutex_leave(pMaster); + return removed; +#else + return 1; +#endif +} + +/* +** Make sure pBt->pTmpSpace points to an allocation of +** MX_CELL_SIZE(pBt) bytes with a 4-byte prefix for a left-child +** pointer. +*/ +static void allocateTempSpace(BtShared *pBt){ + if( !pBt->pTmpSpace ){ + pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize ); + + /* One of the uses of pBt->pTmpSpace is to format cells before + ** inserting them into a leaf page (function fillInCell()). If + ** a cell is less than 4 bytes in size, it is rounded up to 4 bytes + ** by the various routines that manipulate binary cells. Which + ** can mean that fillInCell() only initializes the first 2 or 3 + ** bytes of pTmpSpace, but that the first 4 bytes are copied from + ** it into a database page. This is not actually a problem, but it + ** does cause a valgrind error when the 1 or 2 bytes of unitialized + ** data is passed to system call write(). So to avoid this error, + ** zero the first 4 bytes of temp space here. + ** + ** Also: Provide four bytes of initialized space before the + ** beginning of pTmpSpace as an area available to prepend the + ** left-child pointer to the beginning of a cell. + */ + if( pBt->pTmpSpace ){ + memset(pBt->pTmpSpace, 0, 8); + pBt->pTmpSpace += 4; + } + } +} + +/* +** Free the pBt->pTmpSpace allocation +*/ +static void freeTempSpace(BtShared *pBt){ + if( pBt->pTmpSpace ){ + pBt->pTmpSpace -= 4; + sqlite3PageFree(pBt->pTmpSpace); + pBt->pTmpSpace = 0; + } +} + +/* +** Close an open database and invalidate all cursors. +*/ +SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){ + BtShared *pBt = p->pBt; + BtCursor *pCur; + + /* Close all cursors opened via this handle. */ + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + pCur = pBt->pCursor; + while( pCur ){ + BtCursor *pTmp = pCur; + pCur = pCur->pNext; + if( pTmp->pBtree==p ){ + sqlite3BtreeCloseCursor(pTmp); + } + } + + /* Rollback any active transaction and free the handle structure. + ** The call to sqlite3BtreeRollback() drops any table-locks held by + ** this handle. + */ + sqlite3BtreeRollback(p, SQLITE_OK, 0); + sqlite3BtreeLeave(p); + + /* If there are still other outstanding references to the shared-btree + ** structure, return now. The remainder of this procedure cleans + ** up the shared-btree. + */ + assert( p->wantToLock==0 && p->locked==0 ); + if( !p->sharable || removeFromSharingList(pBt) ){ + /* The pBt is no longer on the sharing list, so we can access + ** it without having to hold the mutex. + ** + ** Clean out and delete the BtShared object. + */ + assert( !pBt->pCursor ); + sqlite3PagerClose(pBt->pPager, p->db); + if( pBt->xFreeSchema && pBt->pSchema ){ + pBt->xFreeSchema(pBt->pSchema); + } + sqlite3DbFree(0, pBt->pSchema); + freeTempSpace(pBt); + sqlite3_free(pBt); + } + +#ifndef SQLITE_OMIT_SHARED_CACHE + assert( p->wantToLock==0 ); + assert( p->locked==0 ); + if( p->pPrev ) p->pPrev->pNext = p->pNext; + if( p->pNext ) p->pNext->pPrev = p->pPrev; +#endif + + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Change the "soft" limit on the number of pages in the cache. +** Unused and unmodified pages will be recycled when the number of +** pages in the cache exceeds this soft limit. But the size of the +** cache is allowed to grow larger than this limit if it contains +** dirty pages or pages still in active use. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetCachesize(pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} + +/* +** Change the "spill" limit on the number of pages in the cache. +** If the number of pages exceeds this limit during a write transaction, +** the pager might attempt to "spill" pages to the journal early in +** order to free up memory. +** +** The value returned is the current spill size. If zero is passed +** as an argument, no changes are made to the spill size setting, so +** using mxPage of 0 is a way to query the current spill size. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetSpillSize(Btree *p, int mxPage){ + BtShared *pBt = p->pBt; + int res; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + res = sqlite3PagerSetSpillsize(pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return res; +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** Change the limit on the amount of the database file that may be +** memory mapped. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetMmapLimit(Btree *p, sqlite3_int64 szMmap){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetMmapLimit(pBt->pPager, szMmap); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* +** Change the way data is synced to disk in order to increase or decrease +** how well the database resists damage due to OS crashes and power +** failures. Level 1 is the same as asynchronous (no syncs() occur and +** there is a high probability of damage) Level 2 is the default. There +** is a very low but non-zero probability of damage. Level 3 reduces the +** probability of damage to near zero but with a write performance reduction. +*/ +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags( + Btree *p, /* The btree to set the safety level on */ + unsigned pgFlags /* Various PAGER_* flags */ +){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetFlags(pBt->pPager, pgFlags); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} +#endif + +/* +** Change the default pages size and the number of reserved bytes per page. +** Or, if the page size has already been fixed, return SQLITE_READONLY +** without changing anything. +** +** The page size must be a power of 2 between 512 and 65536. If the page +** size supplied does not meet this constraint then the page size is not +** changed. +** +** Page sizes are constrained to be a power of two so that the region +** of the database file used for locking (beginning at PENDING_BYTE, +** the first byte past the 1GB boundary, 0x40000000) needs to occur +** at the beginning of a page. +** +** If parameter nReserve is less than zero, then the number of reserved +** bytes per page is left unchanged. +** +** If the iFix!=0 then the BTS_PAGESIZE_FIXED flag is set so that the page size +** and autovacuum mode can no longer be changed. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){ + int rc = SQLITE_OK; + int x; + BtShared *pBt = p->pBt; + assert( nReserve>=0 && nReserve<=255 ); + sqlite3BtreeEnter(p); + pBt->nReserveWanted = nReserve; + x = pBt->pageSize - pBt->usableSize; + if( nReservebtsFlags & BTS_PAGESIZE_FIXED ){ + sqlite3BtreeLeave(p); + return SQLITE_READONLY; + } + assert( nReserve>=0 && nReserve<=255 ); + if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE && + ((pageSize-1)&pageSize)==0 ){ + assert( (pageSize & 7)==0 ); + assert( !pBt->pCursor ); + pBt->pageSize = (u32)pageSize; + freeTempSpace(pBt); + } + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve); + pBt->usableSize = pBt->pageSize - (u16)nReserve; + if( iFix ) pBt->btsFlags |= BTS_PAGESIZE_FIXED; + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Return the currently defined page size +*/ +SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree *p){ + return p->pBt->pageSize; +} + +/* +** This function is similar to sqlite3BtreeGetReserve(), except that it +** may only be called if it is guaranteed that the b-tree mutex is already +** held. +** +** This is useful in one special case in the backup API code where it is +** known that the shared b-tree mutex is held, but the mutex on the +** database handle that owns *p is not. In this case if sqlite3BtreeEnter() +** were to be called, it might collide with some other operation on the +** database handle that owns *p, causing undefined behavior. +*/ +SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p){ + int n; + assert( sqlite3_mutex_held(p->pBt->mutex) ); + n = p->pBt->pageSize - p->pBt->usableSize; + return n; +} + +/* +** Return the number of bytes of space at the end of every page that +** are intentually left unused. This is the "reserved" space that is +** sometimes used by extensions. +** +** The value returned is the larger of the current reserve size and +** the latest reserve size requested by SQLITE_FILECTRL_RESERVE_BYTES. +** The amount of reserve can only grow - never shrink. +*/ +SQLITE_PRIVATE int sqlite3BtreeGetRequestedReserve(Btree *p){ + int n1, n2; + sqlite3BtreeEnter(p); + n1 = (int)p->pBt->nReserveWanted; + n2 = sqlite3BtreeGetReserveNoMutex(p); + sqlite3BtreeLeave(p); + return n1>n2 ? n1 : n2; +} + + +/* +** Set the maximum page count for a database if mxPage is positive. +** No changes are made if mxPage is 0 or negative. +** Regardless of the value of mxPage, return the maximum page count. +*/ +SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree *p, int mxPage){ + int n; + sqlite3BtreeEnter(p); + n = sqlite3PagerMaxPageCount(p->pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return n; +} + +/* +** Change the values for the BTS_SECURE_DELETE and BTS_OVERWRITE flags: +** +** newFlag==0 Both BTS_SECURE_DELETE and BTS_OVERWRITE are cleared +** newFlag==1 BTS_SECURE_DELETE set and BTS_OVERWRITE is cleared +** newFlag==2 BTS_SECURE_DELETE cleared and BTS_OVERWRITE is set +** newFlag==(-1) No changes +** +** This routine acts as a query if newFlag is less than zero +** +** With BTS_OVERWRITE set, deleted content is overwritten by zeros, but +** freelist leaf pages are not written back to the database. Thus in-page +** deleted content is cleared, but freelist deleted content is not. +** +** With BTS_SECURE_DELETE, operation is like BTS_OVERWRITE with the addition +** that freelist leaf pages are written back into the database, increasing +** the amount of disk I/O. +*/ +SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree *p, int newFlag){ + int b; + if( p==0 ) return 0; + sqlite3BtreeEnter(p); + assert( BTS_OVERWRITE==BTS_SECURE_DELETE*2 ); + assert( BTS_FAST_SECURE==(BTS_OVERWRITE|BTS_SECURE_DELETE) ); + if( newFlag>=0 ){ + p->pBt->btsFlags &= ~BTS_FAST_SECURE; + p->pBt->btsFlags |= BTS_SECURE_DELETE*newFlag; + } + b = (p->pBt->btsFlags & BTS_FAST_SECURE)/BTS_SECURE_DELETE; + sqlite3BtreeLeave(p); + return b; +} + +/* +** Change the 'auto-vacuum' property of the database. If the 'autoVacuum' +** parameter is non-zero, then auto-vacuum mode is enabled. If zero, it +** is disabled. The default value for the auto-vacuum property is +** determined by the SQLITE_DEFAULT_AUTOVACUUM macro. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){ +#ifdef SQLITE_OMIT_AUTOVACUUM + return SQLITE_READONLY; +#else + BtShared *pBt = p->pBt; + int rc = SQLITE_OK; + u8 av = (u8)autoVacuum; + + sqlite3BtreeEnter(p); + if( (pBt->btsFlags & BTS_PAGESIZE_FIXED)!=0 && (av ?1:0)!=pBt->autoVacuum ){ + rc = SQLITE_READONLY; + }else{ + pBt->autoVacuum = av ?1:0; + pBt->incrVacuum = av==2 ?1:0; + } + sqlite3BtreeLeave(p); + return rc; +#endif +} + +/* +** Return the value of the 'auto-vacuum' property. If auto-vacuum is +** enabled 1 is returned. Otherwise 0. +*/ +SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *p){ +#ifdef SQLITE_OMIT_AUTOVACUUM + return BTREE_AUTOVACUUM_NONE; +#else + int rc; + sqlite3BtreeEnter(p); + rc = ( + (!p->pBt->autoVacuum)?BTREE_AUTOVACUUM_NONE: + (!p->pBt->incrVacuum)?BTREE_AUTOVACUUM_FULL: + BTREE_AUTOVACUUM_INCR + ); + sqlite3BtreeLeave(p); + return rc; +#endif +} + +/* +** If the user has not set the safety-level for this database connection +** using "PRAGMA synchronous", and if the safety-level is not already +** set to the value passed to this function as the second parameter, +** set it so. +*/ +#if SQLITE_DEFAULT_SYNCHRONOUS!=SQLITE_DEFAULT_WAL_SYNCHRONOUS \ + && !defined(SQLITE_OMIT_WAL) +static void setDefaultSyncFlag(BtShared *pBt, u8 safety_level){ + sqlite3 *db; + Db *pDb; + if( (db=pBt->db)!=0 && (pDb=db->aDb)!=0 ){ + while( pDb->pBt==0 || pDb->pBt->pBt!=pBt ){ pDb++; } + if( pDb->bSyncSet==0 + && pDb->safety_level!=safety_level + && pDb!=&db->aDb[1] + ){ + pDb->safety_level = safety_level; + sqlite3PagerSetFlags(pBt->pPager, + pDb->safety_level | (db->flags & PAGER_FLAGS_MASK)); + } + } +} +#else +# define setDefaultSyncFlag(pBt,safety_level) +#endif + +/* Forward declaration */ +static int newDatabase(BtShared*); + + +/* +** Get a reference to pPage1 of the database file. This will +** also acquire a readlock on that file. +** +** SQLITE_OK is returned on success. If the file is not a +** well-formed database file, then SQLITE_CORRUPT is returned. +** SQLITE_BUSY is returned if the database is locked. SQLITE_NOMEM +** is returned if we run out of memory. +*/ +static int lockBtree(BtShared *pBt){ + int rc; /* Result code from subfunctions */ + MemPage *pPage1; /* Page 1 of the database file */ + u32 nPage; /* Number of pages in the database */ + u32 nPageFile = 0; /* Number of pages in the database file */ + u32 nPageHeader; /* Number of pages in the database according to hdr */ + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pBt->pPage1==0 ); + rc = sqlite3PagerSharedLock(pBt->pPager); + if( rc!=SQLITE_OK ) return rc; + rc = btreeGetPage(pBt, 1, &pPage1, 0); + if( rc!=SQLITE_OK ) return rc; + + /* Do some checking to help insure the file we opened really is + ** a valid database file. + */ + nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData); + sqlite3PagerPagecount(pBt->pPager, (int*)&nPageFile); + if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ + nPage = nPageFile; + } + if( (pBt->db->flags & SQLITE_ResetDatabase)!=0 ){ + nPage = 0; + } + if( nPage>0 ){ + u32 pageSize; + u32 usableSize; + u8 *page1 = pPage1->aData; + rc = SQLITE_NOTADB; + /* EVIDENCE-OF: R-43737-39999 Every valid SQLite database file begins + ** with the following 16 bytes (in hex): 53 51 4c 69 74 65 20 66 6f 72 6d + ** 61 74 20 33 00. */ + if( memcmp(page1, zMagicHeader, 16)!=0 ){ + goto page1_init_failed; + } + +#ifdef SQLITE_OMIT_WAL + if( page1[18]>1 ){ + pBt->btsFlags |= BTS_READ_ONLY; + } + if( page1[19]>1 ){ + goto page1_init_failed; + } +#else + if( page1[18]>2 ){ + pBt->btsFlags |= BTS_READ_ONLY; + } + if( page1[19]>2 ){ + goto page1_init_failed; + } + + /* If the write version is set to 2, this database should be accessed + ** in WAL mode. If the log is not already open, open it now. Then + ** return SQLITE_OK and return without populating BtShared.pPage1. + ** The caller detects this and calls this function again. This is + ** required as the version of page 1 currently in the page1 buffer + ** may not be the latest version - there may be a newer one in the log + ** file. + */ + if( page1[19]==2 && (pBt->btsFlags & BTS_NO_WAL)==0 ){ + int isOpen = 0; + rc = sqlite3PagerOpenWal(pBt->pPager, &isOpen); + if( rc!=SQLITE_OK ){ + goto page1_init_failed; + }else{ + setDefaultSyncFlag(pBt, SQLITE_DEFAULT_WAL_SYNCHRONOUS+1); + if( isOpen==0 ){ + releasePageOne(pPage1); + return SQLITE_OK; + } + } + rc = SQLITE_NOTADB; + }else{ + setDefaultSyncFlag(pBt, SQLITE_DEFAULT_SYNCHRONOUS+1); + } +#endif + + /* EVIDENCE-OF: R-15465-20813 The maximum and minimum embedded payload + ** fractions and the leaf payload fraction values must be 64, 32, and 32. + ** + ** The original design allowed these amounts to vary, but as of + ** version 3.6.0, we require them to be fixed. + */ + if( memcmp(&page1[21], "\100\040\040",3)!=0 ){ + goto page1_init_failed; + } + /* EVIDENCE-OF: R-51873-39618 The page size for a database file is + ** determined by the 2-byte integer located at an offset of 16 bytes from + ** the beginning of the database file. */ + pageSize = (page1[16]<<8) | (page1[17]<<16); + /* EVIDENCE-OF: R-25008-21688 The size of a page is a power of two + ** between 512 and 65536 inclusive. */ + if( ((pageSize-1)&pageSize)!=0 + || pageSize>SQLITE_MAX_PAGE_SIZE + || pageSize<=256 + ){ + goto page1_init_failed; + } + pBt->btsFlags |= BTS_PAGESIZE_FIXED; + assert( (pageSize & 7)==0 ); + /* EVIDENCE-OF: R-59310-51205 The "reserved space" size in the 1-byte + ** integer at offset 20 is the number of bytes of space at the end of + ** each page to reserve for extensions. + ** + ** EVIDENCE-OF: R-37497-42412 The size of the reserved region is + ** determined by the one-byte unsigned integer found at an offset of 20 + ** into the database file header. */ + usableSize = pageSize - page1[20]; + if( (u32)pageSize!=pBt->pageSize ){ + /* After reading the first page of the database assuming a page size + ** of BtShared.pageSize, we have discovered that the page-size is + ** actually pageSize. Unlock the database, leave pBt->pPage1 at + ** zero and return SQLITE_OK. The caller will call this function + ** again with the correct page-size. + */ + releasePageOne(pPage1); + pBt->usableSize = usableSize; + pBt->pageSize = pageSize; + freeTempSpace(pBt); + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, + pageSize-usableSize); + return rc; + } + if( sqlite3WritableSchema(pBt->db)==0 && nPage>nPageFile ){ + rc = SQLITE_CORRUPT_BKPT; + goto page1_init_failed; + } + /* EVIDENCE-OF: R-28312-64704 However, the usable size is not allowed to + ** be less than 480. In other words, if the page size is 512, then the + ** reserved space size cannot exceed 32. */ + if( usableSize<480 ){ + goto page1_init_failed; + } + pBt->pageSize = pageSize; + pBt->usableSize = usableSize; +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->autoVacuum = (get4byte(&page1[36 + 4*4])?1:0); + pBt->incrVacuum = (get4byte(&page1[36 + 7*4])?1:0); +#endif + } + + /* maxLocal is the maximum amount of payload to store locally for + ** a cell. Make sure it is small enough so that at least minFanout + ** cells can will fit on one page. We assume a 10-byte page header. + ** Besides the payload, the cell must store: + ** 2-byte pointer to the cell + ** 4-byte child pointer + ** 9-byte nKey value + ** 4-byte nData value + ** 4-byte overflow page pointer + ** So a cell consists of a 2-byte pointer, a header which is as much as + ** 17 bytes long, 0 to N bytes of payload, and an optional 4 byte overflow + ** page pointer. + */ + pBt->maxLocal = (u16)((pBt->usableSize-12)*64/255 - 23); + pBt->minLocal = (u16)((pBt->usableSize-12)*32/255 - 23); + pBt->maxLeaf = (u16)(pBt->usableSize - 35); + pBt->minLeaf = (u16)((pBt->usableSize-12)*32/255 - 23); + if( pBt->maxLocal>127 ){ + pBt->max1bytePayload = 127; + }else{ + pBt->max1bytePayload = (u8)pBt->maxLocal; + } + assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) ); + pBt->pPage1 = pPage1; + pBt->nPage = nPage; + return SQLITE_OK; + +page1_init_failed: + releasePageOne(pPage1); + pBt->pPage1 = 0; + return rc; +} + +#ifndef NDEBUG +/* +** Return the number of cursors open on pBt. This is for use +** in assert() expressions, so it is only compiled if NDEBUG is not +** defined. +** +** Only write cursors are counted if wrOnly is true. If wrOnly is +** false then all cursors are counted. +** +** For the purposes of this routine, a cursor is any cursor that +** is capable of reading or writing to the database. Cursors that +** have been tripped into the CURSOR_FAULT state are not counted. +*/ +static int countValidCursors(BtShared *pBt, int wrOnly){ + BtCursor *pCur; + int r = 0; + for(pCur=pBt->pCursor; pCur; pCur=pCur->pNext){ + if( (wrOnly==0 || (pCur->curFlags & BTCF_WriteFlag)!=0) + && pCur->eState!=CURSOR_FAULT ) r++; + } + return r; +} +#endif + +/* +** If there are no outstanding cursors and we are not in the middle +** of a transaction but there is a read lock on the database, then +** this routine unrefs the first page of the database file which +** has the effect of releasing the read lock. +** +** If there is a transaction in progress, this routine is a no-op. +*/ +static void unlockBtreeIfUnused(BtShared *pBt){ + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( countValidCursors(pBt,0)==0 || pBt->inTransaction>TRANS_NONE ); + if( pBt->inTransaction==TRANS_NONE && pBt->pPage1!=0 ){ + MemPage *pPage1 = pBt->pPage1; + assert( pPage1->aData ); + assert( sqlite3PagerRefcount(pBt->pPager)==1 ); + pBt->pPage1 = 0; + releasePageOne(pPage1); + } +} + +/* +** If pBt points to an empty file then convert that empty file +** into a new empty database by initializing the first page of +** the database. +*/ +static int newDatabase(BtShared *pBt){ + MemPage *pP1; + unsigned char *data; + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pBt->nPage>0 ){ + return SQLITE_OK; + } + pP1 = pBt->pPage1; + assert( pP1!=0 ); + data = pP1->aData; + rc = sqlite3PagerWrite(pP1->pDbPage); + if( rc ) return rc; + memcpy(data, zMagicHeader, sizeof(zMagicHeader)); + assert( sizeof(zMagicHeader)==16 ); + data[16] = (u8)((pBt->pageSize>>8)&0xff); + data[17] = (u8)((pBt->pageSize>>16)&0xff); + data[18] = 1; + data[19] = 1; + assert( pBt->usableSize<=pBt->pageSize && pBt->usableSize+255>=pBt->pageSize); + data[20] = (u8)(pBt->pageSize - pBt->usableSize); + data[21] = 64; + data[22] = 32; + data[23] = 32; + memset(&data[24], 0, 100-24); + zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA ); + pBt->btsFlags |= BTS_PAGESIZE_FIXED; +#ifndef SQLITE_OMIT_AUTOVACUUM + assert( pBt->autoVacuum==1 || pBt->autoVacuum==0 ); + assert( pBt->incrVacuum==1 || pBt->incrVacuum==0 ); + put4byte(&data[36 + 4*4], pBt->autoVacuum); + put4byte(&data[36 + 7*4], pBt->incrVacuum); +#endif + pBt->nPage = 1; + data[31] = 1; + return SQLITE_OK; +} + +/* +** Initialize the first page of the database file (creating a database +** consisting of a single page and no schema objects). Return SQLITE_OK +** if successful, or an SQLite error code otherwise. +*/ +SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p){ + int rc; + sqlite3BtreeEnter(p); + p->pBt->nPage = 0; + rc = newDatabase(p->pBt); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Attempt to start a new transaction. A write-transaction +** is started if the second argument is nonzero, otherwise a read- +** transaction. If the second argument is 2 or more and exclusive +** transaction is started, meaning that no other process is allowed +** to access the database. A preexisting transaction may not be +** upgraded to exclusive by calling this routine a second time - the +** exclusivity flag only works for a new transaction. +** +** A write-transaction must be started before attempting any +** changes to the database. None of the following routines +** will work unless a transaction is started first: +** +** sqlite3BtreeCreateTable() +** sqlite3BtreeCreateIndex() +** sqlite3BtreeClearTable() +** sqlite3BtreeDropTable() +** sqlite3BtreeInsert() +** sqlite3BtreeDelete() +** sqlite3BtreeUpdateMeta() +** +** If an initial attempt to acquire the lock fails because of lock contention +** and the database was previously unlocked, then invoke the busy handler +** if there is one. But if there was previously a read-lock, do not +** invoke the busy handler - just return SQLITE_BUSY. SQLITE_BUSY is +** returned when there is already a read-lock in order to avoid a deadlock. +** +** Suppose there are two processes A and B. A has a read lock and B has +** a reserved lock. B tries to promote to exclusive but is blocked because +** of A's read lock. A tries to promote to reserved but is blocked by B. +** One or the other of the two processes must give way or there can be +** no progress. By returning SQLITE_BUSY and not invoking the busy callback +** when A already has a read lock, we encourage A to give up and let B +** proceed. +*/ +SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ + BtShared *pBt = p->pBt; + Pager *pPager = pBt->pPager; + int rc = SQLITE_OK; + + sqlite3BtreeEnter(p); + btreeIntegrity(p); + + /* If the btree is already in a write-transaction, or it + ** is already in a read-transaction and a read-transaction + ** is requested, this is a no-op. + */ + if( p->inTrans==TRANS_WRITE || (p->inTrans==TRANS_READ && !wrflag) ){ + goto trans_begun; + } + assert( pBt->inTransaction==TRANS_WRITE || IfNotOmitAV(pBt->bDoTruncate)==0 ); + + if( (p->db->flags & SQLITE_ResetDatabase) + && sqlite3PagerIsreadonly(pPager)==0 + ){ + pBt->btsFlags &= ~BTS_READ_ONLY; + } + + /* Write transactions are not possible on a read-only database */ + if( (pBt->btsFlags & BTS_READ_ONLY)!=0 && wrflag ){ + rc = SQLITE_READONLY; + goto trans_begun; + } + +#ifndef SQLITE_OMIT_SHARED_CACHE + { + sqlite3 *pBlock = 0; + /* If another database handle has already opened a write transaction + ** on this shared-btree structure and a second write transaction is + ** requested, return SQLITE_LOCKED. + */ + if( (wrflag && pBt->inTransaction==TRANS_WRITE) + || (pBt->btsFlags & BTS_PENDING)!=0 + ){ + pBlock = pBt->pWriter->db; + }else if( wrflag>1 ){ + BtLock *pIter; + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + if( pIter->pBtree!=p ){ + pBlock = pIter->pBtree->db; + break; + } + } + } + if( pBlock ){ + sqlite3ConnectionBlocked(p->db, pBlock); + rc = SQLITE_LOCKED_SHAREDCACHE; + goto trans_begun; + } + } +#endif + + /* Any read-only or read-write transaction implies a read-lock on + ** page 1. So if some other shared-cache client already has a write-lock + ** on page 1, the transaction cannot be opened. */ + rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); + if( SQLITE_OK!=rc ) goto trans_begun; + + pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; + if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY; + do { + sqlite3PagerWalDb(pPager, p->db); + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + /* If transitioning from no transaction directly to a write transaction, + ** block for the WRITER lock first if possible. */ + if( pBt->pPage1==0 && wrflag ){ + assert( pBt->inTransaction==TRANS_NONE ); + rc = sqlite3PagerWalWriteLock(pPager, 1); + if( rc!=SQLITE_BUSY && rc!=SQLITE_OK ) break; + } +#endif + + /* Call lockBtree() until either pBt->pPage1 is populated or + ** lockBtree() returns something other than SQLITE_OK. lockBtree() + ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after + ** reading page 1 it discovers that the page-size of the database + ** file is not pBt->pageSize. In this case lockBtree() will update + ** pBt->pageSize to the page-size of the file on disk. + */ + while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) ); + + if( rc==SQLITE_OK && wrflag ){ + if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ + rc = SQLITE_READONLY; + }else{ + rc = sqlite3PagerBegin(pPager, wrflag>1, sqlite3TempInMemory(p->db)); + if( rc==SQLITE_OK ){ + rc = newDatabase(pBt); + }else if( rc==SQLITE_BUSY_SNAPSHOT && pBt->inTransaction==TRANS_NONE ){ + /* if there was no transaction opened when this function was + ** called and SQLITE_BUSY_SNAPSHOT is returned, change the error + ** code to SQLITE_BUSY. */ + rc = SQLITE_BUSY; + } + } + } + + if( rc!=SQLITE_OK ){ + (void)sqlite3PagerWalWriteLock(pPager, 0); + unlockBtreeIfUnused(pBt); + } + }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && + btreeInvokeBusyHandler(pBt) ); + sqlite3PagerWalDb(pPager, 0); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( rc==SQLITE_BUSY_TIMEOUT ) rc = SQLITE_BUSY; +#endif + + if( rc==SQLITE_OK ){ + if( p->inTrans==TRANS_NONE ){ + pBt->nTransaction++; +#ifndef SQLITE_OMIT_SHARED_CACHE + if( p->sharable ){ + assert( p->lock.pBtree==p && p->lock.iTable==1 ); + p->lock.eLock = READ_LOCK; + p->lock.pNext = pBt->pLock; + pBt->pLock = &p->lock; + } +#endif + } + p->inTrans = (wrflag?TRANS_WRITE:TRANS_READ); + if( p->inTrans>pBt->inTransaction ){ + pBt->inTransaction = p->inTrans; + } + if( wrflag ){ + MemPage *pPage1 = pBt->pPage1; +#ifndef SQLITE_OMIT_SHARED_CACHE + assert( !pBt->pWriter ); + pBt->pWriter = p; + pBt->btsFlags &= ~BTS_EXCLUSIVE; + if( wrflag>1 ) pBt->btsFlags |= BTS_EXCLUSIVE; +#endif + + /* If the db-size header field is incorrect (as it may be if an old + ** client has been writing the database file), update it now. Doing + ** this sooner rather than later means the database size can safely + ** re-read the database size from page 1 if a savepoint or transaction + ** rollback occurs within the transaction. + */ + if( pBt->nPage!=get4byte(&pPage1->aData[28]) ){ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pPage1->aData[28], pBt->nPage); + } + } + } + } + +trans_begun: + if( rc==SQLITE_OK ){ + if( pSchemaVersion ){ + *pSchemaVersion = get4byte(&pBt->pPage1->aData[40]); + } + if( wrflag ){ + /* This call makes sure that the pager has the correct number of + ** open savepoints. If the second parameter is greater than 0 and + ** the sub-journal is not already open, then it will be opened here. + */ + rc = sqlite3PagerOpenSavepoint(pPager, p->db->nSavepoint); + } + } + + btreeIntegrity(p); + sqlite3BtreeLeave(p); + return rc; +} + +#ifndef SQLITE_OMIT_AUTOVACUUM + +/* +** Set the pointer-map entries for all children of page pPage. Also, if +** pPage contains cells that point to overflow pages, set the pointer +** map entries for the overflow pages as well. +*/ +static int setChildPtrmaps(MemPage *pPage){ + int i; /* Counter variable */ + int nCell; /* Number of cells in page pPage */ + int rc; /* Return code */ + BtShared *pBt = pPage->pBt; + Pgno pgno = pPage->pgno; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + rc = pPage->isInit ? SQLITE_OK : btreeInitPage(pPage); + if( rc!=SQLITE_OK ) return rc; + nCell = pPage->nCell; + + for(i=0; ileaf ){ + Pgno childPgno = get4byte(pCell); + ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc); + } + } + + if( !pPage->leaf ){ + Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc); + } + + return rc; +} + +/* +** Somewhere on pPage is a pointer to page iFrom. Modify this pointer so +** that it points to iTo. Parameter eType describes the type of pointer to +** be modified, as follows: +** +** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child +** page of pPage. +** +** PTRMAP_OVERFLOW1: pPage is a btree-page. The pointer points at an overflow +** page pointed to by one of the cells on pPage. +** +** PTRMAP_OVERFLOW2: pPage is an overflow-page. The pointer points at the next +** overflow page in the list. +*/ +static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + if( eType==PTRMAP_OVERFLOW2 ){ + /* The pointer is always the first 4 bytes of the page in this case. */ + if( get4byte(pPage->aData)!=iFrom ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + put4byte(pPage->aData, iTo); + }else{ + int i; + int nCell; + int rc; + + rc = pPage->isInit ? SQLITE_OK : btreeInitPage(pPage); + if( rc ) return rc; + nCell = pPage->nCell; + + for(i=0; ixParseCell(pPage, pCell, &info); + if( info.nLocal pPage->aData+pPage->pBt->usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + if( iFrom==get4byte(pCell+info.nSize-4) ){ + put4byte(pCell+info.nSize-4, iTo); + break; + } + } + }else{ + if( get4byte(pCell)==iFrom ){ + put4byte(pCell, iTo); + break; + } + } + } + + if( i==nCell ){ + if( eType!=PTRMAP_BTREE || + get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + put4byte(&pPage->aData[pPage->hdrOffset+8], iTo); + } + } + return SQLITE_OK; +} + + +/* +** Move the open database page pDbPage to location iFreePage in the +** database. The pDbPage reference remains valid. +** +** The isCommit flag indicates that there is no need to remember that +** the journal needs to be sync()ed before database page pDbPage->pgno +** can be written to. The caller has already promised not to write to that +** page. +*/ +static int relocatePage( + BtShared *pBt, /* Btree */ + MemPage *pDbPage, /* Open page to move */ + u8 eType, /* Pointer map 'type' entry for pDbPage */ + Pgno iPtrPage, /* Pointer map 'page-no' entry for pDbPage */ + Pgno iFreePage, /* The location to move pDbPage to */ + int isCommit /* isCommit flag passed to sqlite3PagerMovepage */ +){ + MemPage *pPtrPage; /* The page that contains a pointer to pDbPage */ + Pgno iDbPage = pDbPage->pgno; + Pager *pPager = pBt->pPager; + int rc; + + assert( eType==PTRMAP_OVERFLOW2 || eType==PTRMAP_OVERFLOW1 || + eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ); + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pDbPage->pBt==pBt ); + if( iDbPage<3 ) return SQLITE_CORRUPT_BKPT; + + /* Move page iDbPage from its current location to page number iFreePage */ + TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n", + iDbPage, iFreePage, iPtrPage, eType)); + rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage, isCommit); + if( rc!=SQLITE_OK ){ + return rc; + } + pDbPage->pgno = iFreePage; + + /* If pDbPage was a btree-page, then it may have child pages and/or cells + ** that point to overflow pages. The pointer map entries for all these + ** pages need to be changed. + ** + ** If pDbPage is an overflow page, then the first 4 bytes may store a + ** pointer to a subsequent overflow page. If this is the case, then + ** the pointer map needs to be updated for the subsequent overflow page. + */ + if( eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ){ + rc = setChildPtrmaps(pDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + Pgno nextOvfl = get4byte(pDbPage->aData); + if( nextOvfl!=0 ){ + ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage, &rc); + if( rc!=SQLITE_OK ){ + return rc; + } + } + } + + /* Fix the database pointer on page iPtrPage that pointed at iDbPage so + ** that it points at iFreePage. Also fix the pointer map entry for + ** iPtrPage. + */ + if( eType!=PTRMAP_ROOTPAGE ){ + rc = btreeGetPage(pBt, iPtrPage, &pPtrPage, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = sqlite3PagerWrite(pPtrPage->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pPtrPage); + return rc; + } + rc = modifyPagePointer(pPtrPage, iDbPage, iFreePage, eType); + releasePage(pPtrPage); + if( rc==SQLITE_OK ){ + ptrmapPut(pBt, iFreePage, eType, iPtrPage, &rc); + } + } + return rc; +} + +/* Forward declaration required by incrVacuumStep(). */ +static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8); + +/* +** Perform a single step of an incremental-vacuum. If successful, return +** SQLITE_OK. If there is no work to do (and therefore no point in +** calling this function again), return SQLITE_DONE. Or, if an error +** occurs, return some other error code. +** +** More specifically, this function attempts to re-organize the database so +** that the last page of the file currently in use is no longer in use. +** +** Parameter nFin is the number of pages that this database would contain +** were this function called until it returns SQLITE_DONE. +** +** If the bCommit parameter is non-zero, this function assumes that the +** caller will keep calling incrVacuumStep() until it returns SQLITE_DONE +** or an error. bCommit is passed true for an auto-vacuum-on-commit +** operation, or false for an incremental vacuum. +*/ +static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){ + Pgno nFreeList; /* Number of pages still on the free-list */ + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( iLastPg>nFin ); + + if( !PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg!=PENDING_BYTE_PAGE(pBt) ){ + u8 eType; + Pgno iPtrPage; + + nFreeList = get4byte(&pBt->pPage1->aData[36]); + if( nFreeList==0 ){ + return SQLITE_DONE; + } + + rc = ptrmapGet(pBt, iLastPg, &eType, &iPtrPage); + if( rc!=SQLITE_OK ){ + return rc; + } + if( eType==PTRMAP_ROOTPAGE ){ + return SQLITE_CORRUPT_BKPT; + } + + if( eType==PTRMAP_FREEPAGE ){ + if( bCommit==0 ){ + /* Remove the page from the files free-list. This is not required + ** if bCommit is non-zero. In that case, the free-list will be + ** truncated to zero after this function returns, so it doesn't + ** matter if it still contains some garbage entries. + */ + Pgno iFreePg; + MemPage *pFreePg; + rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iLastPg, BTALLOC_EXACT); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( iFreePg==iLastPg ); + releasePage(pFreePg); + } + } else { + Pgno iFreePg; /* Index of free page to move pLastPg to */ + MemPage *pLastPg; + u8 eMode = BTALLOC_ANY; /* Mode parameter for allocateBtreePage() */ + Pgno iNear = 0; /* nearby parameter for allocateBtreePage() */ + + rc = btreeGetPage(pBt, iLastPg, &pLastPg, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* If bCommit is zero, this loop runs exactly once and page pLastPg + ** is swapped with the first free page pulled off the free list. + ** + ** On the other hand, if bCommit is greater than zero, then keep + ** looping until a free-page located within the first nFin pages + ** of the file is found. + */ + if( bCommit==0 ){ + eMode = BTALLOC_LE; + iNear = nFin; + } + do { + MemPage *pFreePg; + rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iNear, eMode); + if( rc!=SQLITE_OK ){ + releasePage(pLastPg); + return rc; + } + releasePage(pFreePg); + }while( bCommit && iFreePg>nFin ); + assert( iFreePgbDoTruncate = 1; + pBt->nPage = iLastPg; + } + return SQLITE_OK; +} + +/* +** The database opened by the first argument is an auto-vacuum database +** nOrig pages in size containing nFree free pages. Return the expected +** size of the database in pages following an auto-vacuum operation. +*/ +static Pgno finalDbSize(BtShared *pBt, Pgno nOrig, Pgno nFree){ + int nEntry; /* Number of entries on one ptrmap page */ + Pgno nPtrmap; /* Number of PtrMap pages to be freed */ + Pgno nFin; /* Return value */ + + nEntry = pBt->usableSize/5; + nPtrmap = (nFree-nOrig+PTRMAP_PAGENO(pBt, nOrig)+nEntry)/nEntry; + nFin = nOrig - nFree - nPtrmap; + if( nOrig>PENDING_BYTE_PAGE(pBt) && nFinpBt; + + sqlite3BtreeEnter(p); + assert( pBt->inTransaction==TRANS_WRITE && p->inTrans==TRANS_WRITE ); + if( !pBt->autoVacuum ){ + rc = SQLITE_DONE; + }else{ + Pgno nOrig = btreePagecount(pBt); + Pgno nFree = get4byte(&pBt->pPage1->aData[36]); + Pgno nFin = finalDbSize(pBt, nOrig, nFree); + + if( nOrig0 ){ + rc = saveAllCursors(pBt, 0, 0); + if( rc==SQLITE_OK ){ + invalidateAllOverflowCache(pBt); + rc = incrVacuumStep(pBt, nFin, nOrig, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + put4byte(&pBt->pPage1->aData[28], pBt->nPage); + } + }else{ + rc = SQLITE_DONE; + } + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** This routine is called prior to sqlite3PagerCommit when a transaction +** is committed for an auto-vacuum database. +** +** If SQLITE_OK is returned, then *pnTrunc is set to the number of pages +** the database file should be truncated to during the commit process. +** i.e. the database has been reorganized so that only the first *pnTrunc +** pages are in use. +*/ +static int autoVacuumCommit(BtShared *pBt){ + int rc = SQLITE_OK; + Pager *pPager = pBt->pPager; + VVA_ONLY( int nRef = sqlite3PagerRefcount(pPager); ) + + assert( sqlite3_mutex_held(pBt->mutex) ); + invalidateAllOverflowCache(pBt); + assert(pBt->autoVacuum); + if( !pBt->incrVacuum ){ + Pgno nFin; /* Number of pages in database after autovacuuming */ + Pgno nFree; /* Number of pages on the freelist initially */ + Pgno iFree; /* The next page to be freed */ + Pgno nOrig; /* Database size before freeing */ + + nOrig = btreePagecount(pBt); + if( PTRMAP_ISPAGE(pBt, nOrig) || nOrig==PENDING_BYTE_PAGE(pBt) ){ + /* It is not possible to create a database for which the final page + ** is either a pointer-map page or the pending-byte page. If one + ** is encountered, this indicates corruption. + */ + return SQLITE_CORRUPT_BKPT; + } + + nFree = get4byte(&pBt->pPage1->aData[36]); + nFin = finalDbSize(pBt, nOrig, nFree); + if( nFin>nOrig ) return SQLITE_CORRUPT_BKPT; + if( nFinnFin && rc==SQLITE_OK; iFree--){ + rc = incrVacuumStep(pBt, nFin, iFree, 1); + } + if( (rc==SQLITE_DONE || rc==SQLITE_OK) && nFree>0 ){ + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + put4byte(&pBt->pPage1->aData[32], 0); + put4byte(&pBt->pPage1->aData[36], 0); + put4byte(&pBt->pPage1->aData[28], nFin); + pBt->bDoTruncate = 1; + pBt->nPage = nFin; + } + if( rc!=SQLITE_OK ){ + sqlite3PagerRollback(pPager); + } + } + + assert( nRef>=sqlite3PagerRefcount(pPager) ); + return rc; +} + +#else /* ifndef SQLITE_OMIT_AUTOVACUUM */ +# define setChildPtrmaps(x) SQLITE_OK +#endif + +/* +** This routine does the first phase of a two-phase commit. This routine +** causes a rollback journal to be created (if it does not already exist) +** and populated with enough information so that if a power loss occurs +** the database can be restored to its original state by playing back +** the journal. Then the contents of the journal are flushed out to +** the disk. After the journal is safely on oxide, the changes to the +** database are written into the database file and flushed to oxide. +** At the end of this call, the rollback journal still exists on the +** disk and we are still holding all locks, so the transaction has not +** committed. See sqlite3BtreeCommitPhaseTwo() for the second phase of the +** commit process. +** +** This call is a no-op if no write-transaction is currently active on pBt. +** +** Otherwise, sync the database file for the btree pBt. zMaster points to +** the name of a master journal file that should be written into the +** individual journal file, or is NULL, indicating no master journal file +** (single database transaction). +** +** When this is called, the master journal should already have been +** created, populated with this journal pointer and synced to disk. +** +** Once this is routine has returned, the only thing required to commit +** the write-transaction for this database file is to delete the journal. +*/ +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ + int rc = SQLITE_OK; + if( p->inTrans==TRANS_WRITE ){ + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + rc = autoVacuumCommit(pBt); + if( rc!=SQLITE_OK ){ + sqlite3BtreeLeave(p); + return rc; + } + } + if( pBt->bDoTruncate ){ + sqlite3PagerTruncateImage(pBt->pPager, pBt->nPage); + } +#endif + rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, 0); + sqlite3BtreeLeave(p); + } + return rc; +} + +/* +** This function is called from both BtreeCommitPhaseTwo() and BtreeRollback() +** at the conclusion of a transaction. +*/ +static void btreeEndTransaction(Btree *p){ + BtShared *pBt = p->pBt; + sqlite3 *db = p->db; + assert( sqlite3BtreeHoldsMutex(p) ); + +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->bDoTruncate = 0; +#endif + if( p->inTrans>TRANS_NONE && db->nVdbeRead>1 ){ + /* If there are other active statements that belong to this database + ** handle, downgrade to a read-only transaction. The other statements + ** may still be reading from the database. */ + downgradeAllSharedCacheTableLocks(p); + p->inTrans = TRANS_READ; + }else{ + /* If the handle had any kind of transaction open, decrement the + ** transaction count of the shared btree. If the transaction count + ** reaches 0, set the shared state to TRANS_NONE. The unlockBtreeIfUnused() + ** call below will unlock the pager. */ + if( p->inTrans!=TRANS_NONE ){ + clearAllSharedCacheTableLocks(p); + pBt->nTransaction--; + if( 0==pBt->nTransaction ){ + pBt->inTransaction = TRANS_NONE; + } + } + + /* Set the current transaction state to TRANS_NONE and unlock the + ** pager if this call closed the only read or write transaction. */ + p->inTrans = TRANS_NONE; + unlockBtreeIfUnused(pBt); + } + + btreeIntegrity(p); +} + +/* +** Commit the transaction currently in progress. +** +** This routine implements the second phase of a 2-phase commit. The +** sqlite3BtreeCommitPhaseOne() routine does the first phase and should +** be invoked prior to calling this routine. The sqlite3BtreeCommitPhaseOne() +** routine did all the work of writing information out to disk and flushing the +** contents so that they are written onto the disk platter. All this +** routine has to do is delete or truncate or zero the header in the +** the rollback journal (which causes the transaction to commit) and +** drop locks. +** +** Normally, if an error occurs while the pager layer is attempting to +** finalize the underlying journal file, this function returns an error and +** the upper layer will attempt a rollback. However, if the second argument +** is non-zero then this b-tree transaction is part of a multi-file +** transaction. In this case, the transaction has already been committed +** (by deleting a master journal file) and the caller will ignore this +** functions return code. So, even if an error occurs in the pager layer, +** reset the b-tree objects internal state to indicate that the write +** transaction has been closed. This is quite safe, as the pager will have +** transitioned to the error state. +** +** This will release the write lock on the database file. If there +** are no active cursors, it also releases the read lock. +*/ +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree *p, int bCleanup){ + + if( p->inTrans==TRANS_NONE ) return SQLITE_OK; + sqlite3BtreeEnter(p); + btreeIntegrity(p); + + /* If the handle has a write-transaction open, commit the shared-btrees + ** transaction and set the shared state to TRANS_READ. + */ + if( p->inTrans==TRANS_WRITE ){ + int rc; + BtShared *pBt = p->pBt; + assert( pBt->inTransaction==TRANS_WRITE ); + assert( pBt->nTransaction>0 ); + rc = sqlite3PagerCommitPhaseTwo(pBt->pPager); + if( rc!=SQLITE_OK && bCleanup==0 ){ + sqlite3BtreeLeave(p); + return rc; + } + p->iDataVersion--; /* Compensate for pPager->iDataVersion++; */ + pBt->inTransaction = TRANS_READ; + btreeClearHasContent(pBt); + } + + btreeEndTransaction(p); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} + +/* +** Do both phases of a commit. +*/ +SQLITE_PRIVATE int sqlite3BtreeCommit(Btree *p){ + int rc; + sqlite3BtreeEnter(p); + rc = sqlite3BtreeCommitPhaseOne(p, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeCommitPhaseTwo(p, 0); + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** This routine sets the state to CURSOR_FAULT and the error +** code to errCode for every cursor on any BtShared that pBtree +** references. Or if the writeOnly flag is set to 1, then only +** trip write cursors and leave read cursors unchanged. +** +** Every cursor is a candidate to be tripped, including cursors +** that belong to other database connections that happen to be +** sharing the cache with pBtree. +** +** This routine gets called when a rollback occurs. If the writeOnly +** flag is true, then only write-cursors need be tripped - read-only +** cursors save their current positions so that they may continue +** following the rollback. Or, if writeOnly is false, all cursors are +** tripped. In general, writeOnly is false if the transaction being +** rolled back modified the database schema. In this case b-tree root +** pages may be moved or deleted from the database altogether, making +** it unsafe for read cursors to continue. +** +** If the writeOnly flag is true and an error is encountered while +** saving the current position of a read-only cursor, all cursors, +** including all read-cursors are tripped. +** +** SQLITE_OK is returned if successful, or if an error occurs while +** saving a cursor position, an SQLite error code. +*/ +SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode, int writeOnly){ + BtCursor *p; + int rc = SQLITE_OK; + + assert( (writeOnly==0 || writeOnly==1) && BTCF_WriteFlag==1 ); + if( pBtree ){ + sqlite3BtreeEnter(pBtree); + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + if( writeOnly && (p->curFlags & BTCF_WriteFlag)==0 ){ + if( p->eState==CURSOR_VALID || p->eState==CURSOR_SKIPNEXT ){ + rc = saveCursorPosition(p); + if( rc!=SQLITE_OK ){ + (void)sqlite3BtreeTripAllCursors(pBtree, rc, 0); + break; + } + } + }else{ + sqlite3BtreeClearCursor(p); + p->eState = CURSOR_FAULT; + p->skipNext = errCode; + } + btreeReleaseAllCursorPages(p); + } + sqlite3BtreeLeave(pBtree); + } + return rc; +} + +/* +** Set the pBt->nPage field correctly, according to the current +** state of the database. Assume pBt->pPage1 is valid. +*/ +static void btreeSetNPage(BtShared *pBt, MemPage *pPage1){ + int nPage = get4byte(&pPage1->aData[28]); + testcase( nPage==0 ); + if( nPage==0 ) sqlite3PagerPagecount(pBt->pPager, &nPage); + testcase( pBt->nPage!=nPage ); + pBt->nPage = nPage; +} + +/* +** Rollback the transaction in progress. +** +** If tripCode is not SQLITE_OK then cursors will be invalidated (tripped). +** Only write cursors are tripped if writeOnly is true but all cursors are +** tripped if writeOnly is false. Any attempt to use +** a tripped cursor will result in an error. +** +** This will release the write lock on the database file. If there +** are no active cursors, it also releases the read lock. +*/ +SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p, int tripCode, int writeOnly){ + int rc; + BtShared *pBt = p->pBt; + MemPage *pPage1; + + assert( writeOnly==1 || writeOnly==0 ); + assert( tripCode==SQLITE_ABORT_ROLLBACK || tripCode==SQLITE_OK ); + sqlite3BtreeEnter(p); + if( tripCode==SQLITE_OK ){ + rc = tripCode = saveAllCursors(pBt, 0, 0); + if( rc ) writeOnly = 0; + }else{ + rc = SQLITE_OK; + } + if( tripCode ){ + int rc2 = sqlite3BtreeTripAllCursors(p, tripCode, writeOnly); + assert( rc==SQLITE_OK || (writeOnly==0 && rc2==SQLITE_OK) ); + if( rc2!=SQLITE_OK ) rc = rc2; + } + btreeIntegrity(p); + + if( p->inTrans==TRANS_WRITE ){ + int rc2; + + assert( TRANS_WRITE==pBt->inTransaction ); + rc2 = sqlite3PagerRollback(pBt->pPager); + if( rc2!=SQLITE_OK ){ + rc = rc2; + } + + /* The rollback may have destroyed the pPage1->aData value. So + ** call btreeGetPage() on page 1 again to make + ** sure pPage1->aData is set correctly. */ + if( btreeGetPage(pBt, 1, &pPage1, 0)==SQLITE_OK ){ + btreeSetNPage(pBt, pPage1); + releasePageOne(pPage1); + } + assert( countValidCursors(pBt, 1)==0 ); + pBt->inTransaction = TRANS_READ; + btreeClearHasContent(pBt); + } + + btreeEndTransaction(p); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Start a statement subtransaction. The subtransaction can be rolled +** back independently of the main transaction. You must start a transaction +** before starting a subtransaction. The subtransaction is ended automatically +** if the main transaction commits or rolls back. +** +** Statement subtransactions are used around individual SQL statements +** that are contained within a BEGIN...COMMIT block. If a constraint +** error occurs within the statement, the effect of that one statement +** can be rolled back without having to rollback the entire transaction. +** +** A statement sub-transaction is implemented as an anonymous savepoint. The +** value passed as the second parameter is the total number of savepoints, +** including the new anonymous savepoint, open on the B-Tree. i.e. if there +** are no active savepoints and no other statement-transactions open, +** iStatement is 1. This anonymous savepoint can be released or rolled back +** using the sqlite3BtreeSavepoint() function. +*/ +SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree *p, int iStatement){ + int rc; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + assert( p->inTrans==TRANS_WRITE ); + assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); + assert( iStatement>0 ); + assert( iStatement>p->db->nSavepoint ); + assert( pBt->inTransaction==TRANS_WRITE ); + /* At the pager level, a statement transaction is a savepoint with + ** an index greater than all savepoints created explicitly using + ** SQL statements. It is illegal to open, release or rollback any + ** such savepoints while the statement transaction savepoint is active. + */ + rc = sqlite3PagerOpenSavepoint(pBt->pPager, iStatement); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** The second argument to this function, op, is always SAVEPOINT_ROLLBACK +** or SAVEPOINT_RELEASE. This function either releases or rolls back the +** savepoint identified by parameter iSavepoint, depending on the value +** of op. +** +** Normally, iSavepoint is greater than or equal to zero. However, if op is +** SAVEPOINT_ROLLBACK, then iSavepoint may also be -1. In this case the +** contents of the entire transaction are rolled back. This is different +** from a normal transaction rollback, as no locks are released and the +** transaction remains open. +*/ +SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ + int rc = SQLITE_OK; + if( p && p->inTrans==TRANS_WRITE ){ + BtShared *pBt = p->pBt; + assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); + assert( iSavepoint>=0 || (iSavepoint==-1 && op==SAVEPOINT_ROLLBACK) ); + sqlite3BtreeEnter(p); + if( op==SAVEPOINT_ROLLBACK ){ + rc = saveAllCursors(pBt, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint); + } + if( rc==SQLITE_OK ){ + if( iSavepoint<0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY)!=0 ){ + pBt->nPage = 0; + } + rc = newDatabase(pBt); + btreeSetNPage(pBt, pBt->pPage1); + + /* pBt->nPage might be zero if the database was corrupt when + ** the transaction was started. Otherwise, it must be at least 1. */ + assert( CORRUPT_DB || pBt->nPage>0 ); + } + sqlite3BtreeLeave(p); + } + return rc; +} + +/* +** Create a new cursor for the BTree whose root is on the page +** iTable. If a read-only cursor is requested, it is assumed that +** the caller already has at least a read-only transaction open +** on the database already. If a write-cursor is requested, then +** the caller is assumed to have an open write transaction. +** +** If the BTREE_WRCSR bit of wrFlag is clear, then the cursor can only +** be used for reading. If the BTREE_WRCSR bit is set, then the cursor +** can be used for reading or for writing if other conditions for writing +** are also met. These are the conditions that must be met in order +** for writing to be allowed: +** +** 1: The cursor must have been opened with wrFlag containing BTREE_WRCSR +** +** 2: Other database connections that share the same pager cache +** but which are not in the READ_UNCOMMITTED state may not have +** cursors open with wrFlag==0 on the same table. Otherwise +** the changes made by this write cursor would be visible to +** the read cursors in the other database connection. +** +** 3: The database must be writable (not on read-only media) +** +** 4: There must be an active transaction. +** +** The BTREE_FORDELETE bit of wrFlag may optionally be set if BTREE_WRCSR +** is set. If FORDELETE is set, that is a hint to the implementation that +** this cursor will only be used to seek to and delete entries of an index +** as part of a larger DELETE statement. The FORDELETE hint is not used by +** this implementation. But in a hypothetical alternative storage engine +** in which index entries are automatically deleted when corresponding table +** rows are deleted, the FORDELETE flag is a hint that all SEEK and DELETE +** operations on this cursor can be no-ops and all READ operations can +** return a null row (2-bytes: 0x01 0x00). +** +** No checking is done to make sure that page iTable really is the +** root page of a b-tree. If it is not, then the cursor acquired +** will not work correctly. +** +** It is assumed that the sqlite3BtreeCursorZero() has been called +** on pCur to initialize the memory space prior to invoking this routine. +*/ +static int btreeCursor( + Btree *p, /* The btree */ + int iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + struct KeyInfo *pKeyInfo, /* First arg to comparison function */ + BtCursor *pCur /* Space for new cursor */ +){ + BtShared *pBt = p->pBt; /* Shared b-tree handle */ + BtCursor *pX; /* Looping over other all cursors */ + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( wrFlag==0 + || wrFlag==BTREE_WRCSR + || wrFlag==(BTREE_WRCSR|BTREE_FORDELETE) + ); + + /* The following assert statements verify that if this is a sharable + ** b-tree database, the connection is holding the required table locks, + ** and that no other connection has any open cursor that conflicts with + ** this lock. The iTable<1 term disables the check for corrupt schemas. */ + assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, (wrFlag?2:1)) + || iTable<1 ); + assert( wrFlag==0 || !hasReadConflicts(p, iTable) ); + + /* Assert that the caller has opened the required transaction. */ + assert( p->inTrans>TRANS_NONE ); + assert( wrFlag==0 || p->inTrans==TRANS_WRITE ); + assert( pBt->pPage1 && pBt->pPage1->aData ); + assert( wrFlag==0 || (pBt->btsFlags & BTS_READ_ONLY)==0 ); + + if( wrFlag ){ + allocateTempSpace(pBt); + if( pBt->pTmpSpace==0 ) return SQLITE_NOMEM_BKPT; + } + if( iTable<=1 ){ + if( iTable<1 ){ + return SQLITE_CORRUPT_BKPT; + }else if( btreePagecount(pBt)==0 ){ + assert( wrFlag==0 ); + iTable = 0; + } + } + + /* Now that no other errors can occur, finish filling in the BtCursor + ** variables and link the cursor into the BtShared list. */ + pCur->pgnoRoot = (Pgno)iTable; + pCur->iPage = -1; + pCur->pKeyInfo = pKeyInfo; + pCur->pBtree = p; + pCur->pBt = pBt; + pCur->curFlags = wrFlag ? BTCF_WriteFlag : 0; + pCur->curPagerFlags = wrFlag ? 0 : PAGER_GET_READONLY; + /* If there are two or more cursors on the same btree, then all such + ** cursors *must* have the BTCF_Multiple flag set. */ + for(pX=pBt->pCursor; pX; pX=pX->pNext){ + if( pX->pgnoRoot==(Pgno)iTable ){ + pX->curFlags |= BTCF_Multiple; + pCur->curFlags |= BTCF_Multiple; + } + } + pCur->pNext = pBt->pCursor; + pBt->pCursor = pCur; + pCur->eState = CURSOR_INVALID; + return SQLITE_OK; +} +static int btreeCursorWithLock( + Btree *p, /* The btree */ + int iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + struct KeyInfo *pKeyInfo, /* First arg to comparison function */ + BtCursor *pCur /* Space for new cursor */ +){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); + sqlite3BtreeLeave(p); + return rc; +} +SQLITE_PRIVATE int sqlite3BtreeCursor( + Btree *p, /* The btree */ + int iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + struct KeyInfo *pKeyInfo, /* First arg to xCompare() */ + BtCursor *pCur /* Write new cursor here */ +){ + if( p->sharable ){ + return btreeCursorWithLock(p, iTable, wrFlag, pKeyInfo, pCur); + }else{ + return btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); + } +} + +/* +** Return the size of a BtCursor object in bytes. +** +** This interfaces is needed so that users of cursors can preallocate +** sufficient storage to hold a cursor. The BtCursor object is opaque +** to users so they cannot do the sizeof() themselves - they must call +** this routine. +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){ + return ROUND8(sizeof(BtCursor)); +} + +/* +** Initialize memory that will be converted into a BtCursor object. +** +** The simple approach here would be to memset() the entire object +** to zero. But it turns out that the apPage[] and aiIdx[] arrays +** do not need to be zeroed and they are large, so we can save a lot +** of run-time by skipping the initialization of those elements. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor *p){ + memset(p, 0, offsetof(BtCursor, BTCURSOR_FIRST_UNINIT)); +} + +/* +** Close a cursor. The read lock on the database file is released +** when the last cursor is closed. +*/ +SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){ + Btree *pBtree = pCur->pBtree; + if( pBtree ){ + BtShared *pBt = pCur->pBt; + sqlite3BtreeEnter(pBtree); + assert( pBt->pCursor!=0 ); + if( pBt->pCursor==pCur ){ + pBt->pCursor = pCur->pNext; + }else{ + BtCursor *pPrev = pBt->pCursor; + do{ + if( pPrev->pNext==pCur ){ + pPrev->pNext = pCur->pNext; + break; + } + pPrev = pPrev->pNext; + }while( ALWAYS(pPrev) ); + } + btreeReleaseAllCursorPages(pCur); + unlockBtreeIfUnused(pBt); + sqlite3_free(pCur->aOverflow); + sqlite3_free(pCur->pKey); + sqlite3BtreeLeave(pBtree); + pCur->pBtree = 0; + } + return SQLITE_OK; +} + +/* +** Make sure the BtCursor* given in the argument has a valid +** BtCursor.info structure. If it is not already valid, call +** btreeParseCell() to fill it in. +** +** BtCursor.info is a cache of the information in the current cell. +** Using this cache reduces the number of calls to btreeParseCell(). +*/ +#ifndef NDEBUG + static int cellInfoEqual(CellInfo *a, CellInfo *b){ + if( a->nKey!=b->nKey ) return 0; + if( a->pPayload!=b->pPayload ) return 0; + if( a->nPayload!=b->nPayload ) return 0; + if( a->nLocal!=b->nLocal ) return 0; + if( a->nSize!=b->nSize ) return 0; + return 1; + } + static void assertCellInfo(BtCursor *pCur){ + CellInfo info; + memset(&info, 0, sizeof(info)); + btreeParseCell(pCur->pPage, pCur->ix, &info); + assert( CORRUPT_DB || cellInfoEqual(&info, &pCur->info) ); + } +#else + #define assertCellInfo(x) +#endif +static SQLITE_NOINLINE void getCellInfo(BtCursor *pCur){ + if( pCur->info.nSize==0 ){ + pCur->curFlags |= BTCF_ValidNKey; + btreeParseCell(pCur->pPage,pCur->ix,&pCur->info); + }else{ + assertCellInfo(pCur); + } +} + +#ifndef NDEBUG /* The next routine used only within assert() statements */ +/* +** Return true if the given BtCursor is valid. A valid cursor is one +** that is currently pointing to a row in a (non-empty) table. +** This is a verification routine is used only within assert() statements. +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor *pCur){ + return pCur && pCur->eState==CURSOR_VALID; +} +#endif /* NDEBUG */ +SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor *pCur){ + assert( pCur!=0 ); + return pCur->eState==CURSOR_VALID; +} + +/* +** Return the value of the integer key or "rowid" for a table btree. +** This routine is only valid for a cursor that is pointing into a +** ordinary table btree. If the cursor points to an index btree or +** is invalid, the result of this routine is undefined. +*/ +SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->curIntKey ); + getCellInfo(pCur); + return pCur->info.nKey; +} + +/* +** Pin or unpin a cursor. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorPin(BtCursor *pCur){ + assert( (pCur->curFlags & BTCF_Pinned)==0 ); + pCur->curFlags |= BTCF_Pinned; +} +SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor *pCur){ + assert( (pCur->curFlags & BTCF_Pinned)!=0 ); + pCur->curFlags &= ~BTCF_Pinned; +} + +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC +/* +** Return the offset into the database file for the start of the +** payload to which the cursor is pointing. +*/ +SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + getCellInfo(pCur); + return (i64)pCur->pBt->pageSize*((i64)pCur->pPage->pgno - 1) + + (i64)(pCur->info.pPayload - pCur->pPage->aData); +} +#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ + +/* +** Return the number of bytes of payload for the entry that pCur is +** currently pointing to. For table btrees, this will be the amount +** of data. For index btrees, this will be the size of the key. +** +** The caller must guarantee that the cursor is pointing to a non-NULL +** valid entry. In other words, the calling procedure must guarantee +** that the cursor has Cursor.eState==CURSOR_VALID. +*/ +SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + getCellInfo(pCur); + return pCur->info.nPayload; +} + +/* +** Return an upper bound on the size of any record for the table +** that the cursor is pointing into. +** +** This is an optimization. Everything will still work if this +** routine always returns 2147483647 (which is the largest record +** that SQLite can handle) or more. But returning a smaller value might +** prevent large memory allocations when trying to interpret a +** corrupt datrabase. +** +** The current implementation merely returns the size of the underlying +** database file. +*/ +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + return pCur->pBt->pageSize * (sqlite3_int64)pCur->pBt->nPage; +} + +/* +** Given the page number of an overflow page in the database (parameter +** ovfl), this function finds the page number of the next page in the +** linked list of overflow pages. If possible, it uses the auto-vacuum +** pointer-map data instead of reading the content of page ovfl to do so. +** +** If an error occurs an SQLite error code is returned. Otherwise: +** +** The page number of the next overflow page in the linked list is +** written to *pPgnoNext. If page ovfl is the last page in its linked +** list, *pPgnoNext is set to zero. +** +** If ppPage is not NULL, and a reference to the MemPage object corresponding +** to page number pOvfl was obtained, then *ppPage is set to point to that +** reference. It is the responsibility of the caller to call releasePage() +** on *ppPage to free the reference. In no reference was obtained (because +** the pointer-map was used to obtain the value for *pPgnoNext), then +** *ppPage is set to zero. +*/ +static int getOverflowPage( + BtShared *pBt, /* The database file */ + Pgno ovfl, /* Current overflow page number */ + MemPage **ppPage, /* OUT: MemPage handle (may be NULL) */ + Pgno *pPgnoNext /* OUT: Next overflow page number */ +){ + Pgno next = 0; + MemPage *pPage = 0; + int rc = SQLITE_OK; + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert(pPgnoNext); + +#ifndef SQLITE_OMIT_AUTOVACUUM + /* Try to find the next page in the overflow list using the + ** autovacuum pointer-map pages. Guess that the next page in + ** the overflow list is page number (ovfl+1). If that guess turns + ** out to be wrong, fall back to loading the data of page + ** number ovfl to determine the next page number. + */ + if( pBt->autoVacuum ){ + Pgno pgno; + Pgno iGuess = ovfl+1; + u8 eType; + + while( PTRMAP_ISPAGE(pBt, iGuess) || iGuess==PENDING_BYTE_PAGE(pBt) ){ + iGuess++; + } + + if( iGuess<=btreePagecount(pBt) ){ + rc = ptrmapGet(pBt, iGuess, &eType, &pgno); + if( rc==SQLITE_OK && eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){ + next = iGuess; + rc = SQLITE_DONE; + } + } + } +#endif + + assert( next==0 || rc==SQLITE_DONE ); + if( rc==SQLITE_OK ){ + rc = btreeGetPage(pBt, ovfl, &pPage, (ppPage==0) ? PAGER_GET_READONLY : 0); + assert( rc==SQLITE_OK || pPage==0 ); + if( rc==SQLITE_OK ){ + next = get4byte(pPage->aData); + } + } + + *pPgnoNext = next; + if( ppPage ){ + *ppPage = pPage; + }else{ + releasePage(pPage); + } + return (rc==SQLITE_DONE ? SQLITE_OK : rc); +} + +/* +** Copy data from a buffer to a page, or from a page to a buffer. +** +** pPayload is a pointer to data stored on database page pDbPage. +** If argument eOp is false, then nByte bytes of data are copied +** from pPayload to the buffer pointed at by pBuf. If eOp is true, +** then sqlite3PagerWrite() is called on pDbPage and nByte bytes +** of data are copied from the buffer pBuf to pPayload. +** +** SQLITE_OK is returned on success, otherwise an error code. +*/ +static int copyPayload( + void *pPayload, /* Pointer to page data */ + void *pBuf, /* Pointer to buffer */ + int nByte, /* Number of bytes to copy */ + int eOp, /* 0 -> copy from page, 1 -> copy to page */ + DbPage *pDbPage /* Page containing pPayload */ +){ + if( eOp ){ + /* Copy data from buffer to page (a write operation) */ + int rc = sqlite3PagerWrite(pDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + memcpy(pPayload, pBuf, nByte); + }else{ + /* Copy data from page to buffer (a read operation) */ + memcpy(pBuf, pPayload, nByte); + } + return SQLITE_OK; +} + +/* +** This function is used to read or overwrite payload information +** for the entry that the pCur cursor is pointing to. The eOp +** argument is interpreted as follows: +** +** 0: The operation is a read. Populate the overflow cache. +** 1: The operation is a write. Populate the overflow cache. +** +** A total of "amt" bytes are read or written beginning at "offset". +** Data is read to or from the buffer pBuf. +** +** The content being read or written might appear on the main page +** or be scattered out on multiple overflow pages. +** +** If the current cursor entry uses one or more overflow pages +** this function may allocate space for and lazily populate +** the overflow page-list cache array (BtCursor.aOverflow). +** Subsequent calls use this cache to make seeking to the supplied offset +** more efficient. +** +** Once an overflow page-list cache has been allocated, it must be +** invalidated if some other cursor writes to the same table, or if +** the cursor is moved to a different row. Additionally, in auto-vacuum +** mode, the following events may invalidate an overflow page-list cache. +** +** * An incremental vacuum, +** * A commit in auto_vacuum="full" mode, +** * Creating a table (may require moving an overflow page). +*/ +static int accessPayload( + BtCursor *pCur, /* Cursor pointing to entry to read from */ + u32 offset, /* Begin reading this far into payload */ + u32 amt, /* Read this many bytes */ + unsigned char *pBuf, /* Write the bytes into this buffer */ + int eOp /* zero to read. non-zero to write. */ +){ + unsigned char *aPayload; + int rc = SQLITE_OK; + int iIdx = 0; + MemPage *pPage = pCur->pPage; /* Btree page of current entry */ + BtShared *pBt = pCur->pBt; /* Btree this cursor belongs to */ +#ifdef SQLITE_DIRECT_OVERFLOW_READ + unsigned char * const pBufStart = pBuf; /* Start of original out buffer */ +#endif + + assert( pPage ); + assert( eOp==0 || eOp==1 ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->ixnCell ); + assert( cursorHoldsMutex(pCur) ); + + getCellInfo(pCur); + aPayload = pCur->info.pPayload; + assert( offset+amt <= pCur->info.nPayload ); + + assert( aPayload > pPage->aData ); + if( (uptr)(aPayload - pPage->aData) > (pBt->usableSize - pCur->info.nLocal) ){ + /* Trying to read or write past the end of the data is an error. The + ** conditional above is really: + ** &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize] + ** but is recast into its current form to avoid integer overflow problems + */ + return SQLITE_CORRUPT_PAGE(pPage); + } + + /* Check if data must be read/written to/from the btree page itself. */ + if( offsetinfo.nLocal ){ + int a = amt; + if( a+offset>pCur->info.nLocal ){ + a = pCur->info.nLocal - offset; + } + rc = copyPayload(&aPayload[offset], pBuf, a, eOp, pPage->pDbPage); + offset = 0; + pBuf += a; + amt -= a; + }else{ + offset -= pCur->info.nLocal; + } + + + if( rc==SQLITE_OK && amt>0 ){ + const u32 ovflSize = pBt->usableSize - 4; /* Bytes content per ovfl page */ + Pgno nextPage; + + nextPage = get4byte(&aPayload[pCur->info.nLocal]); + + /* If the BtCursor.aOverflow[] has not been allocated, allocate it now. + ** + ** The aOverflow[] array is sized at one entry for each overflow page + ** in the overflow chain. The page number of the first overflow page is + ** stored in aOverflow[0], etc. A value of 0 in the aOverflow[] array + ** means "not yet known" (the cache is lazily populated). + */ + if( (pCur->curFlags & BTCF_ValidOvfl)==0 ){ + int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize; + if( pCur->aOverflow==0 + || nOvfl*(int)sizeof(Pgno) > sqlite3MallocSize(pCur->aOverflow) + ){ + Pgno *aNew = (Pgno*)sqlite3Realloc( + pCur->aOverflow, nOvfl*2*sizeof(Pgno) + ); + if( aNew==0 ){ + return SQLITE_NOMEM_BKPT; + }else{ + pCur->aOverflow = aNew; + } + } + memset(pCur->aOverflow, 0, nOvfl*sizeof(Pgno)); + pCur->curFlags |= BTCF_ValidOvfl; + }else{ + /* If the overflow page-list cache has been allocated and the + ** entry for the first required overflow page is valid, skip + ** directly to it. + */ + if( pCur->aOverflow[offset/ovflSize] ){ + iIdx = (offset/ovflSize); + nextPage = pCur->aOverflow[iIdx]; + offset = (offset%ovflSize); + } + } + + assert( rc==SQLITE_OK && amt>0 ); + while( nextPage ){ + /* If required, populate the overflow page-list cache. */ + assert( pCur->aOverflow[iIdx]==0 + || pCur->aOverflow[iIdx]==nextPage + || CORRUPT_DB ); + pCur->aOverflow[iIdx] = nextPage; + + if( offset>=ovflSize ){ + /* The only reason to read this page is to obtain the page + ** number for the next page in the overflow chain. The page + ** data is not required. So first try to lookup the overflow + ** page-list cache, if any, then fall back to the getOverflowPage() + ** function. + */ + assert( pCur->curFlags & BTCF_ValidOvfl ); + assert( pCur->pBtree->db==pBt->db ); + if( pCur->aOverflow[iIdx+1] ){ + nextPage = pCur->aOverflow[iIdx+1]; + }else{ + rc = getOverflowPage(pBt, nextPage, 0, &nextPage); + } + offset -= ovflSize; + }else{ + /* Need to read this page properly. It contains some of the + ** range of data that is being read (eOp==0) or written (eOp!=0). + */ + int a = amt; + if( a + offset > ovflSize ){ + a = ovflSize - offset; + } + +#ifdef SQLITE_DIRECT_OVERFLOW_READ + /* If all the following are true: + ** + ** 1) this is a read operation, and + ** 2) data is required from the start of this overflow page, and + ** 3) there are no dirty pages in the page-cache + ** 4) the database is file-backed, and + ** 5) the page is not in the WAL file + ** 6) at least 4 bytes have already been read into the output buffer + ** + ** then data can be read directly from the database file into the + ** output buffer, bypassing the page-cache altogether. This speeds + ** up loading large records that span many overflow pages. + */ + if( eOp==0 /* (1) */ + && offset==0 /* (2) */ + && sqlite3PagerDirectReadOk(pBt->pPager, nextPage) /* (3,4,5) */ + && &pBuf[-4]>=pBufStart /* (6) */ + ){ + sqlite3_file *fd = sqlite3PagerFile(pBt->pPager); + u8 aSave[4]; + u8 *aWrite = &pBuf[-4]; + assert( aWrite>=pBufStart ); /* due to (6) */ + memcpy(aSave, aWrite, 4); + rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); + if( rc && nextPage>pBt->nPage ) rc = SQLITE_CORRUPT_BKPT; + nextPage = get4byte(aWrite); + memcpy(aWrite, aSave, 4); + }else +#endif + + { + DbPage *pDbPage; + rc = sqlite3PagerGet(pBt->pPager, nextPage, &pDbPage, + (eOp==0 ? PAGER_GET_READONLY : 0) + ); + if( rc==SQLITE_OK ){ + aPayload = sqlite3PagerGetData(pDbPage); + nextPage = get4byte(aPayload); + rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage); + sqlite3PagerUnref(pDbPage); + offset = 0; + } + } + amt -= a; + if( amt==0 ) return rc; + pBuf += a; + } + if( rc ) break; + iIdx++; + } + } + + if( rc==SQLITE_OK && amt>0 ){ + /* Overflow chain ends prematurely */ + return SQLITE_CORRUPT_PAGE(pPage); + } + return rc; +} + +/* +** Read part of the payload for the row at which that cursor pCur is currently +** pointing. "amt" bytes will be transferred into pBuf[]. The transfer +** begins at "offset". +** +** pCur can be pointing to either a table or an index b-tree. +** If pointing to a table btree, then the content section is read. If +** pCur is pointing to an index b-tree then the key section is read. +** +** For sqlite3BtreePayload(), the caller must ensure that pCur is pointing +** to a valid row in the table. For sqlite3BtreePayloadChecked(), the +** cursor might be invalid or might need to be restored before being read. +** +** Return SQLITE_OK on success or an error code if anything goes +** wrong. An error is returned if "offset+amt" is larger than +** the available payload. +*/ +SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->iPage>=0 && pCur->pPage ); + assert( pCur->ixpPage->nCell ); + return accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0); +} + +/* +** This variant of sqlite3BtreePayload() works even if the cursor has not +** in the CURSOR_VALID state. It is only used by the sqlite3_blob_read() +** interface. +*/ +#ifndef SQLITE_OMIT_INCRBLOB +static SQLITE_NOINLINE int accessPayloadChecked( + BtCursor *pCur, + u32 offset, + u32 amt, + void *pBuf +){ + int rc; + if ( pCur->eState==CURSOR_INVALID ){ + return SQLITE_ABORT; + } + assert( cursorOwnsBtShared(pCur) ); + rc = btreeRestoreCursorPosition(pCur); + return rc ? rc : accessPayload(pCur, offset, amt, pBuf, 0); +} +SQLITE_PRIVATE int sqlite3BtreePayloadChecked(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ + if( pCur->eState==CURSOR_VALID ){ + assert( cursorOwnsBtShared(pCur) ); + return accessPayload(pCur, offset, amt, pBuf, 0); + }else{ + return accessPayloadChecked(pCur, offset, amt, pBuf); + } +} +#endif /* SQLITE_OMIT_INCRBLOB */ + +/* +** Return a pointer to payload information from the entry that the +** pCur cursor is pointing to. The pointer is to the beginning of +** the key if index btrees (pPage->intKey==0) and is the data for +** table btrees (pPage->intKey==1). The number of bytes of available +** key/data is written into *pAmt. If *pAmt==0, then the value +** returned will not be a valid pointer. +** +** This routine is an optimization. It is common for the entire key +** and data to fit on the local page and for there to be no overflow +** pages. When that is so, this routine can be used to access the +** key and data without making a copy. If the key and/or data spills +** onto overflow pages, then accessPayload() must be used to reassemble +** the key/data and copy it into a preallocated buffer. +** +** The pointer returned by this routine looks directly into the cached +** page of the database. The data might change or move the next time +** any btree routine is called. +*/ +static const void *fetchPayload( + BtCursor *pCur, /* Cursor pointing to entry to read from */ + u32 *pAmt /* Write the number of available bytes here */ +){ + int amt; + assert( pCur!=0 && pCur->iPage>=0 && pCur->pPage); + assert( pCur->eState==CURSOR_VALID ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->ixpPage->nCell ); + assert( pCur->info.nSize>0 ); + assert( pCur->info.pPayload>pCur->pPage->aData || CORRUPT_DB ); + assert( pCur->info.pPayloadpPage->aDataEnd ||CORRUPT_DB); + amt = pCur->info.nLocal; + if( amt>(int)(pCur->pPage->aDataEnd - pCur->info.pPayload) ){ + /* There is too little space on the page for the expected amount + ** of local content. Database must be corrupt. */ + assert( CORRUPT_DB ); + amt = MAX(0, (int)(pCur->pPage->aDataEnd - pCur->info.pPayload)); + } + *pAmt = (u32)amt; + return (void*)pCur->info.pPayload; +} + + +/* +** For the entry that cursor pCur is point to, return as +** many bytes of the key or data as are available on the local +** b-tree page. Write the number of available bytes into *pAmt. +** +** The pointer returned is ephemeral. The key/data may move +** or be destroyed on the next call to any Btree routine, +** including calls from other threads against the same cache. +** Hence, a mutex on the BtShared should be held prior to calling +** this routine. +** +** These routines is used to get quick access to key and data +** in the common case where no overflow pages are used. +*/ +SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor *pCur, u32 *pAmt){ + return fetchPayload(pCur, pAmt); +} + + +/* +** Move the cursor down to a new child page. The newPgno argument is the +** page number of the child page to move to. +** +** This function returns SQLITE_CORRUPT if the page-header flags field of +** the new child page does not match the flags field of the parent (i.e. +** if an intkey page appears to be the parent of a non-intkey page, or +** vice-versa). +*/ +static int moveToChild(BtCursor *pCur, u32 newPgno){ + BtShared *pBt = pCur->pBt; + + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->iPageiPage>=0 ); + if( pCur->iPage>=(BTCURSOR_MAX_DEPTH-1) ){ + return SQLITE_CORRUPT_BKPT; + } + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + pCur->aiIdx[pCur->iPage] = pCur->ix; + pCur->apPage[pCur->iPage] = pCur->pPage; + pCur->ix = 0; + pCur->iPage++; + return getAndInitPage(pBt, newPgno, &pCur->pPage, pCur, pCur->curPagerFlags); +} + +#ifdef SQLITE_DEBUG +/* +** Page pParent is an internal (non-leaf) tree page. This function +** asserts that page number iChild is the left-child if the iIdx'th +** cell in page pParent. Or, if iIdx is equal to the total number of +** cells in pParent, that page number iChild is the right-child of +** the page. +*/ +static void assertParentIndex(MemPage *pParent, int iIdx, Pgno iChild){ + if( CORRUPT_DB ) return; /* The conditions tested below might not be true + ** in a corrupt database */ + assert( iIdx<=pParent->nCell ); + if( iIdx==pParent->nCell ){ + assert( get4byte(&pParent->aData[pParent->hdrOffset+8])==iChild ); + }else{ + assert( get4byte(findCell(pParent, iIdx))==iChild ); + } +} +#else +# define assertParentIndex(x,y,z) +#endif + +/* +** Move the cursor up to the parent page. +** +** pCur->idx is set to the cell index that contains the pointer +** to the page we are coming from. If we are coming from the +** right-most child page then pCur->idx is set to one more than +** the largest cell index. +*/ +static void moveToParent(BtCursor *pCur){ + MemPage *pLeaf; + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->iPage>0 ); + assert( pCur->pPage ); + assertParentIndex( + pCur->apPage[pCur->iPage-1], + pCur->aiIdx[pCur->iPage-1], + pCur->pPage->pgno + ); + testcase( pCur->aiIdx[pCur->iPage-1] > pCur->apPage[pCur->iPage-1]->nCell ); + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + pCur->ix = pCur->aiIdx[pCur->iPage-1]; + pLeaf = pCur->pPage; + pCur->pPage = pCur->apPage[--pCur->iPage]; + releasePageNotNull(pLeaf); +} + +/* +** Move the cursor to point to the root page of its b-tree structure. +** +** If the table has a virtual root page, then the cursor is moved to point +** to the virtual root page instead of the actual root page. A table has a +** virtual root page when the actual root page contains no cells and a +** single child page. This can only happen with the table rooted at page 1. +** +** If the b-tree structure is empty, the cursor state is set to +** CURSOR_INVALID and this routine returns SQLITE_EMPTY. Otherwise, +** the cursor is set to point to the first cell located on the root +** (or virtual root) page and the cursor state is set to CURSOR_VALID. +** +** If this function returns successfully, it may be assumed that the +** page-header flags indicate that the [virtual] root-page is the expected +** kind of b-tree page (i.e. if when opening the cursor the caller did not +** specify a KeyInfo structure the flags byte is set to 0x05 or 0x0D, +** indicating a table b-tree, or if the caller did specify a KeyInfo +** structure the flags byte is set to 0x02 or 0x0A, indicating an index +** b-tree). +*/ +static int moveToRoot(BtCursor *pCur){ + MemPage *pRoot; + int rc = SQLITE_OK; + + assert( cursorOwnsBtShared(pCur) ); + assert( CURSOR_INVALID < CURSOR_REQUIRESEEK ); + assert( CURSOR_VALID < CURSOR_REQUIRESEEK ); + assert( CURSOR_FAULT > CURSOR_REQUIRESEEK ); + assert( pCur->eState < CURSOR_REQUIRESEEK || pCur->iPage<0 ); + assert( pCur->pgnoRoot>0 || pCur->iPage<0 ); + + if( pCur->iPage>=0 ){ + if( pCur->iPage ){ + releasePageNotNull(pCur->pPage); + while( --pCur->iPage ){ + releasePageNotNull(pCur->apPage[pCur->iPage]); + } + pCur->pPage = pCur->apPage[0]; + goto skip_init; + } + }else if( pCur->pgnoRoot==0 ){ + pCur->eState = CURSOR_INVALID; + return SQLITE_EMPTY; + }else{ + assert( pCur->iPage==(-1) ); + if( pCur->eState>=CURSOR_REQUIRESEEK ){ + if( pCur->eState==CURSOR_FAULT ){ + assert( pCur->skipNext!=SQLITE_OK ); + return pCur->skipNext; + } + sqlite3BtreeClearCursor(pCur); + } + rc = getAndInitPage(pCur->pBtree->pBt, pCur->pgnoRoot, &pCur->pPage, + 0, pCur->curPagerFlags); + if( rc!=SQLITE_OK ){ + pCur->eState = CURSOR_INVALID; + return rc; + } + pCur->iPage = 0; + pCur->curIntKey = pCur->pPage->intKey; + } + pRoot = pCur->pPage; + assert( pRoot->pgno==pCur->pgnoRoot ); + + /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor + ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is + ** NULL, the caller expects a table b-tree. If this is not the case, + ** return an SQLITE_CORRUPT error. + ** + ** Earlier versions of SQLite assumed that this test could not fail + ** if the root page was already loaded when this function was called (i.e. + ** if pCur->iPage>=0). But this is not so if the database is corrupted + ** in such a way that page pRoot is linked into a second b-tree table + ** (or the freelist). */ + assert( pRoot->intKey==1 || pRoot->intKey==0 ); + if( pRoot->isInit==0 || (pCur->pKeyInfo==0)!=pRoot->intKey ){ + return SQLITE_CORRUPT_PAGE(pCur->pPage); + } + +skip_init: + pCur->ix = 0; + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidNKey|BTCF_ValidOvfl); + + pRoot = pCur->pPage; + if( pRoot->nCell>0 ){ + pCur->eState = CURSOR_VALID; + }else if( !pRoot->leaf ){ + Pgno subpage; + if( pRoot->pgno!=1 ) return SQLITE_CORRUPT_BKPT; + subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]); + pCur->eState = CURSOR_VALID; + rc = moveToChild(pCur, subpage); + }else{ + pCur->eState = CURSOR_INVALID; + rc = SQLITE_EMPTY; + } + return rc; +} + +/* +** Move the cursor down to the left-most leaf entry beneath the +** entry to which it is currently pointing. +** +** The left-most leaf is the one with the smallest key - the first +** in ascending order. +*/ +static int moveToLeftmost(BtCursor *pCur){ + Pgno pgno; + int rc = SQLITE_OK; + MemPage *pPage; + + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){ + assert( pCur->ixnCell ); + pgno = get4byte(findCell(pPage, pCur->ix)); + rc = moveToChild(pCur, pgno); + } + return rc; +} + +/* +** Move the cursor down to the right-most leaf entry beneath the +** page to which it is currently pointing. Notice the difference +** between moveToLeftmost() and moveToRightmost(). moveToLeftmost() +** finds the left-most entry beneath the *entry* whereas moveToRightmost() +** finds the right-most entry beneath the *page*. +** +** The right-most entry is the one with the largest key - the last +** key in ascending order. +*/ +static int moveToRightmost(BtCursor *pCur){ + Pgno pgno; + int rc = SQLITE_OK; + MemPage *pPage = 0; + + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + while( !(pPage = pCur->pPage)->leaf ){ + pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + pCur->ix = pPage->nCell; + rc = moveToChild(pCur, pgno); + if( rc ) return rc; + } + pCur->ix = pPage->nCell-1; + assert( pCur->info.nSize==0 ); + assert( (pCur->curFlags & BTCF_ValidNKey)==0 ); + return SQLITE_OK; +} + +/* Move the cursor to the first entry in the table. Return SQLITE_OK +** on success. Set *pRes to 0 if the cursor actually points to something +** or set *pRes to 1 if the table is empty. +*/ +SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ + int rc; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + rc = moveToRoot(pCur); + if( rc==SQLITE_OK ){ + assert( pCur->pPage->nCell>0 ); + *pRes = 0; + rc = moveToLeftmost(pCur); + }else if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = 1; + rc = SQLITE_OK; + } + return rc; +} + +/* Move the cursor to the last entry in the table. Return SQLITE_OK +** on success. Set *pRes to 0 if the cursor actually points to something +** or set *pRes to 1 if the table is empty. +*/ +SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ + int rc; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + + /* If the cursor already points to the last entry, this is a no-op. */ + if( CURSOR_VALID==pCur->eState && (pCur->curFlags & BTCF_AtLast)!=0 ){ +#ifdef SQLITE_DEBUG + /* This block serves to assert() that the cursor really does point + ** to the last entry in the b-tree. */ + int ii; + for(ii=0; iiiPage; ii++){ + assert( pCur->aiIdx[ii]==pCur->apPage[ii]->nCell ); + } + assert( pCur->ix==pCur->pPage->nCell-1 ); + assert( pCur->pPage->leaf ); +#endif + *pRes = 0; + return SQLITE_OK; + } + + rc = moveToRoot(pCur); + if( rc==SQLITE_OK ){ + assert( pCur->eState==CURSOR_VALID ); + *pRes = 0; + rc = moveToRightmost(pCur); + if( rc==SQLITE_OK ){ + pCur->curFlags |= BTCF_AtLast; + }else{ + pCur->curFlags &= ~BTCF_AtLast; + } + }else if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = 1; + rc = SQLITE_OK; + } + return rc; +} + +/* Move the cursor so that it points to an entry near the key +** specified by pIdxKey or intKey. Return a success code. +** +** For INTKEY tables, the intKey parameter is used. pIdxKey +** must be NULL. For index tables, pIdxKey is used and intKey +** is ignored. +** +** If an exact match is not found, then the cursor is always +** left pointing at a leaf page which would hold the entry if it +** were present. The cursor might point to an entry that comes +** before or after the key. +** +** An integer is written into *pRes which is the result of +** comparing the key with the entry to which the cursor is +** pointing. The meaning of the integer written into +** *pRes is as follows: +** +** *pRes<0 The cursor is left pointing at an entry that +** is smaller than intKey/pIdxKey or if the table is empty +** and the cursor is therefore left point to nothing. +** +** *pRes==0 The cursor is left pointing at an entry that +** exactly matches intKey/pIdxKey. +** +** *pRes>0 The cursor is left pointing at an entry that +** is larger than intKey/pIdxKey. +** +** For index tables, the pIdxKey->eqSeen field is set to 1 if there +** exists an entry in the table that exactly matches pIdxKey. +*/ +SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( + BtCursor *pCur, /* The cursor to be moved */ + UnpackedRecord *pIdxKey, /* Unpacked index key */ + i64 intKey, /* The table key */ + int biasRight, /* If true, bias the search to the high end */ + int *pRes /* Write search results here */ +){ + int rc; + RecordCompare xRecordCompare; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + assert( pRes ); + assert( (pIdxKey==0)==(pCur->pKeyInfo==0) ); + assert( pCur->eState!=CURSOR_VALID || (pIdxKey==0)==(pCur->curIntKey!=0) ); + + /* If the cursor is already positioned at the point we are trying + ** to move to, then just return without doing any work */ + if( pIdxKey==0 + && pCur->eState==CURSOR_VALID && (pCur->curFlags & BTCF_ValidNKey)!=0 + ){ + if( pCur->info.nKey==intKey ){ + *pRes = 0; + return SQLITE_OK; + } + if( pCur->info.nKeycurFlags & BTCF_AtLast)!=0 ){ + *pRes = -1; + return SQLITE_OK; + } + /* If the requested key is one more than the previous key, then + ** try to get there using sqlite3BtreeNext() rather than a full + ** binary search. This is an optimization only. The correct answer + ** is still obtained without this case, only a little more slowely */ + if( pCur->info.nKey+1==intKey ){ + *pRes = 0; + rc = sqlite3BtreeNext(pCur, 0); + if( rc==SQLITE_OK ){ + getCellInfo(pCur); + if( pCur->info.nKey==intKey ){ + return SQLITE_OK; + } + }else if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + }else{ + return rc; + } + } + } + } + + if( pIdxKey ){ + xRecordCompare = sqlite3VdbeFindCompare(pIdxKey); + pIdxKey->errCode = 0; + assert( pIdxKey->default_rc==1 + || pIdxKey->default_rc==0 + || pIdxKey->default_rc==-1 + ); + }else{ + xRecordCompare = 0; /* All keys are integers */ + } + + rc = moveToRoot(pCur); + if( rc ){ + if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = -1; + return SQLITE_OK; + } + return rc; + } + assert( pCur->pPage ); + assert( pCur->pPage->isInit ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->pPage->nCell > 0 ); + assert( pCur->iPage==0 || pCur->apPage[0]->intKey==pCur->curIntKey ); + assert( pCur->curIntKey || pIdxKey ); + for(;;){ + int lwr, upr, idx, c; + Pgno chldPg; + MemPage *pPage = pCur->pPage; + u8 *pCell; /* Pointer to current cell in pPage */ + + /* pPage->nCell must be greater than zero. If this is the root-page + ** the cursor would have been INVALID above and this for(;;) loop + ** not run. If this is not the root-page, then the moveToChild() routine + ** would have already detected db corruption. Similarly, pPage must + ** be the right kind (index or table) of b-tree page. Otherwise + ** a moveToChild() or moveToRoot() call would have detected corruption. */ + assert( pPage->nCell>0 ); + assert( pPage->intKey==(pIdxKey==0) ); + lwr = 0; + upr = pPage->nCell-1; + assert( biasRight==0 || biasRight==1 ); + idx = upr>>(1-biasRight); /* idx = biasRight ? upr : (lwr+upr)/2; */ + pCur->ix = (u16)idx; + if( xRecordCompare==0 ){ + for(;;){ + i64 nCellKey; + pCell = findCellPastPtr(pPage, idx); + if( pPage->intKeyLeaf ){ + while( 0x80 <= *(pCell++) ){ + if( pCell>=pPage->aDataEnd ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + } + getVarint(pCell, (u64*)&nCellKey); + if( nCellKeyupr ){ c = -1; break; } + }else if( nCellKey>intKey ){ + upr = idx-1; + if( lwr>upr ){ c = +1; break; } + }else{ + assert( nCellKey==intKey ); + pCur->ix = (u16)idx; + if( !pPage->leaf ){ + lwr = idx; + goto moveto_next_layer; + }else{ + pCur->curFlags |= BTCF_ValidNKey; + pCur->info.nKey = nCellKey; + pCur->info.nSize = 0; + *pRes = 0; + return SQLITE_OK; + } + } + assert( lwr+upr>=0 ); + idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2; */ + } + }else{ + for(;;){ + int nCell; /* Size of the pCell cell in bytes */ + pCell = findCellPastPtr(pPage, idx); + + /* The maximum supported page-size is 65536 bytes. This means that + ** the maximum number of record bytes stored on an index B-Tree + ** page is less than 16384 bytes and may be stored as a 2-byte + ** varint. This information is used to attempt to avoid parsing + ** the entire cell by checking for the cases where the record is + ** stored entirely within the b-tree page by inspecting the first + ** 2 bytes of the cell. + */ + nCell = pCell[0]; + if( nCell<=pPage->max1bytePayload ){ + /* This branch runs if the record-size field of the cell is a + ** single byte varint and the record fits entirely on the main + ** b-tree page. */ + testcase( pCell+nCell+1==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey); + }else if( !(pCell[1] & 0x80) + && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal + ){ + /* The record-size field is a 2 byte varint and the record + ** fits entirely on the main b-tree page. */ + testcase( pCell+nCell+2==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); + }else{ + /* The record flows over onto one or more overflow pages. In + ** this case the whole cell needs to be parsed, a buffer allocated + ** and accessPayload() used to retrieve the record into the + ** buffer before VdbeRecordCompare() can be called. + ** + ** If the record is corrupt, the xRecordCompare routine may read + ** up to two varints past the end of the buffer. An extra 18 + ** bytes of padding is allocated at the end of the buffer in + ** case this happens. */ + void *pCellKey; + u8 * const pCellBody = pCell - pPage->childPtrSize; + const int nOverrun = 18; /* Size of the overrun padding */ + pPage->xParseCell(pPage, pCellBody, &pCur->info); + nCell = (int)pCur->info.nKey; + testcase( nCell<0 ); /* True if key size is 2^32 or more */ + testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ + testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ + testcase( nCell==2 ); /* Minimum legal index key size */ + if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){ + rc = SQLITE_CORRUPT_PAGE(pPage); + goto moveto_finish; + } + pCellKey = sqlite3Malloc( nCell+nOverrun ); + if( pCellKey==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto moveto_finish; + } + pCur->ix = (u16)idx; + rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0); + memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */ + pCur->curFlags &= ~BTCF_ValidOvfl; + if( rc ){ + sqlite3_free(pCellKey); + goto moveto_finish; + } + c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey); + sqlite3_free(pCellKey); + } + assert( + (pIdxKey->errCode!=SQLITE_CORRUPT || c==0) + && (pIdxKey->errCode!=SQLITE_NOMEM || pCur->pBtree->db->mallocFailed) + ); + if( c<0 ){ + lwr = idx+1; + }else if( c>0 ){ + upr = idx-1; + }else{ + assert( c==0 ); + *pRes = 0; + rc = SQLITE_OK; + pCur->ix = (u16)idx; + if( pIdxKey->errCode ) rc = SQLITE_CORRUPT_BKPT; + goto moveto_finish; + } + if( lwr>upr ) break; + assert( lwr+upr>=0 ); + idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2 */ + } + } + assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) ); + assert( pPage->isInit ); + if( pPage->leaf ){ + assert( pCur->ixpPage->nCell ); + pCur->ix = (u16)idx; + *pRes = c; + rc = SQLITE_OK; + goto moveto_finish; + } +moveto_next_layer: + if( lwr>=pPage->nCell ){ + chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]); + }else{ + chldPg = get4byte(findCell(pPage, lwr)); + } + pCur->ix = (u16)lwr; + rc = moveToChild(pCur, chldPg); + if( rc ) break; + } +moveto_finish: + pCur->info.nSize = 0; + assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); + return rc; +} + + +/* +** Return TRUE if the cursor is not pointing at an entry of the table. +** +** TRUE will be returned after a call to sqlite3BtreeNext() moves +** past the last entry in the table or sqlite3BtreePrev() moves past +** the first entry. TRUE is also returned if the table is empty. +*/ +SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor *pCur){ + /* TODO: What if the cursor is in CURSOR_REQUIRESEEK but all table entries + ** have been deleted? This API will need to change to return an error code + ** as well as the boolean result value. + */ + return (CURSOR_VALID!=pCur->eState); +} + +/* +** Return an estimate for the number of rows in the table that pCur is +** pointing to. Return a negative number if no estimate is currently +** available. +*/ +SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ + i64 n; + u8 i; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + + /* Currently this interface is only called by the OP_IfSmaller + ** opcode, and it that case the cursor will always be valid and + ** will always point to a leaf node. */ + if( NEVER(pCur->eState!=CURSOR_VALID) ) return -1; + if( NEVER(pCur->pPage->leaf==0) ) return -1; + + n = pCur->pPage->nCell; + for(i=0; iiPage; i++){ + n *= pCur->apPage[i]->nCell; + } + return n; +} + +/* +** Advance the cursor to the next entry in the database. +** Return value: +** +** SQLITE_OK success +** SQLITE_DONE cursor is already pointing at the last element +** otherwise some kind of error occurred +** +** The main entry point is sqlite3BtreeNext(). That routine is optimized +** for the common case of merely incrementing the cell counter BtCursor.aiIdx +** to the next cell on the current page. The (slower) btreeNext() helper +** routine is called when it is necessary to move to a different page or +** to restore the cursor. +** +** If bit 0x01 of the F argument in sqlite3BtreeNext(C,F) is 1, then the +** cursor corresponds to an SQL index and this routine could have been +** skipped if the SQL index had been a unique index. The F argument +** is a hint to the implement. SQLite btree implementation does not use +** this hint, but COMDB2 does. +*/ +static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ + int rc; + int idx; + MemPage *pPage; + + assert( cursorOwnsBtShared(pCur) ); + if( pCur->eState!=CURSOR_VALID ){ + assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); + rc = restoreCursorPosition(pCur); + if( rc!=SQLITE_OK ){ + return rc; + } + if( CURSOR_INVALID==pCur->eState ){ + return SQLITE_DONE; + } + if( pCur->eState==CURSOR_SKIPNEXT ){ + pCur->eState = CURSOR_VALID; + if( pCur->skipNext>0 ) return SQLITE_OK; + } + } + + pPage = pCur->pPage; + idx = ++pCur->ix; + if( !pPage->isInit ){ + /* The only known way for this to happen is for there to be a + ** recursive SQL function that does a DELETE operation as part of a + ** SELECT which deletes content out from under an active cursor + ** in a corrupt database file where the table being DELETE-ed from + ** has pages in common with the table being queried. See TH3 + ** module cov1/btree78.test testcase 220 (2018-06-08) for an + ** example. */ + return SQLITE_CORRUPT_BKPT; + } + + /* If the database file is corrupt, it is possible for the value of idx + ** to be invalid here. This can only occur if a second cursor modifies + ** the page while cursor pCur is holding a reference to it. Which can + ** only happen if the database is corrupt in such a way as to link the + ** page into more than one b-tree structure. + ** + ** Update 2019-12-23: appears to long longer be possible after the + ** addition of anotherValidCursor() condition on balance_deeper(). */ + harmless( idx>pPage->nCell ); + + if( idx>=pPage->nCell ){ + if( !pPage->leaf ){ + rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); + if( rc ) return rc; + return moveToLeftmost(pCur); + } + do{ + if( pCur->iPage==0 ){ + pCur->eState = CURSOR_INVALID; + return SQLITE_DONE; + } + moveToParent(pCur); + pPage = pCur->pPage; + }while( pCur->ix>=pPage->nCell ); + if( pPage->intKey ){ + return sqlite3BtreeNext(pCur, 0); + }else{ + return SQLITE_OK; + } + } + if( pPage->leaf ){ + return SQLITE_OK; + }else{ + return moveToLeftmost(pCur); + } +} +SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int flags){ + MemPage *pPage; + UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ + assert( cursorOwnsBtShared(pCur) ); + assert( flags==0 || flags==1 ); + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + if( pCur->eState!=CURSOR_VALID ) return btreeNext(pCur); + pPage = pCur->pPage; + if( (++pCur->ix)>=pPage->nCell ){ + pCur->ix--; + return btreeNext(pCur); + } + if( pPage->leaf ){ + return SQLITE_OK; + }else{ + return moveToLeftmost(pCur); + } +} + +/* +** Step the cursor to the back to the previous entry in the database. +** Return values: +** +** SQLITE_OK success +** SQLITE_DONE the cursor is already on the first element of the table +** otherwise some kind of error occurred +** +** The main entry point is sqlite3BtreePrevious(). That routine is optimized +** for the common case of merely decrementing the cell counter BtCursor.aiIdx +** to the previous cell on the current page. The (slower) btreePrevious() +** helper routine is called when it is necessary to move to a different page +** or to restore the cursor. +** +** If bit 0x01 of the F argument to sqlite3BtreePrevious(C,F) is 1, then +** the cursor corresponds to an SQL index and this routine could have been +** skipped if the SQL index had been a unique index. The F argument is a +** hint to the implement. The native SQLite btree implementation does not +** use this hint, but COMDB2 does. +*/ +static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ + int rc; + MemPage *pPage; + + assert( cursorOwnsBtShared(pCur) ); + assert( (pCur->curFlags & (BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey))==0 ); + assert( pCur->info.nSize==0 ); + if( pCur->eState!=CURSOR_VALID ){ + rc = restoreCursorPosition(pCur); + if( rc!=SQLITE_OK ){ + return rc; + } + if( CURSOR_INVALID==pCur->eState ){ + return SQLITE_DONE; + } + if( CURSOR_SKIPNEXT==pCur->eState ){ + pCur->eState = CURSOR_VALID; + if( pCur->skipNext<0 ) return SQLITE_OK; + } + } + + pPage = pCur->pPage; + assert( pPage->isInit ); + if( !pPage->leaf ){ + int idx = pCur->ix; + rc = moveToChild(pCur, get4byte(findCell(pPage, idx))); + if( rc ) return rc; + rc = moveToRightmost(pCur); + }else{ + while( pCur->ix==0 ){ + if( pCur->iPage==0 ){ + pCur->eState = CURSOR_INVALID; + return SQLITE_DONE; + } + moveToParent(pCur); + } + assert( pCur->info.nSize==0 ); + assert( (pCur->curFlags & (BTCF_ValidOvfl))==0 ); + + pCur->ix--; + pPage = pCur->pPage; + if( pPage->intKey && !pPage->leaf ){ + rc = sqlite3BtreePrevious(pCur, 0); + }else{ + rc = SQLITE_OK; + } + } + return rc; +} +SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int flags){ + assert( cursorOwnsBtShared(pCur) ); + assert( flags==0 || flags==1 ); + UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ + pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey); + pCur->info.nSize = 0; + if( pCur->eState!=CURSOR_VALID + || pCur->ix==0 + || pCur->pPage->leaf==0 + ){ + return btreePrevious(pCur); + } + pCur->ix--; + return SQLITE_OK; +} + +/* +** Allocate a new page from the database file. +** +** The new page is marked as dirty. (In other words, sqlite3PagerWrite() +** has already been called on the new page.) The new page has also +** been referenced and the calling routine is responsible for calling +** sqlite3PagerUnref() on the new page when it is done. +** +** SQLITE_OK is returned on success. Any other return value indicates +** an error. *ppPage is set to NULL in the event of an error. +** +** If the "nearby" parameter is not 0, then an effort is made to +** locate a page close to the page number "nearby". This can be used in an +** attempt to keep related pages close to each other in the database file, +** which in turn can make database access faster. +** +** If the eMode parameter is BTALLOC_EXACT and the nearby page exists +** anywhere on the free-list, then it is guaranteed to be returned. If +** eMode is BTALLOC_LT then the page returned will be less than or equal +** to nearby if any such page exists. If eMode is BTALLOC_ANY then there +** are no restrictions on which page is returned. +*/ +static int allocateBtreePage( + BtShared *pBt, /* The btree */ + MemPage **ppPage, /* Store pointer to the allocated page here */ + Pgno *pPgno, /* Store the page number here */ + Pgno nearby, /* Search for a page near this one */ + u8 eMode /* BTALLOC_EXACT, BTALLOC_LT, or BTALLOC_ANY */ +){ + MemPage *pPage1; + int rc; + u32 n; /* Number of pages on the freelist */ + u32 k; /* Number of leaves on the trunk of the freelist */ + MemPage *pTrunk = 0; + MemPage *pPrevTrunk = 0; + Pgno mxPage; /* Total size of the database file */ + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( eMode==BTALLOC_ANY || (nearby>0 && IfNotOmitAV(pBt->autoVacuum)) ); + pPage1 = pBt->pPage1; + mxPage = btreePagecount(pBt); + /* EVIDENCE-OF: R-05119-02637 The 4-byte big-endian integer at offset 36 + ** stores stores the total number of pages on the freelist. */ + n = get4byte(&pPage1->aData[36]); + testcase( n==mxPage-1 ); + if( n>=mxPage ){ + return SQLITE_CORRUPT_BKPT; + } + if( n>0 ){ + /* There are pages on the freelist. Reuse one of those pages. */ + Pgno iTrunk; + u8 searchList = 0; /* If the free-list must be searched for 'nearby' */ + u32 nSearch = 0; /* Count of the number of search attempts */ + + /* If eMode==BTALLOC_EXACT and a query of the pointer-map + ** shows that the page 'nearby' is somewhere on the free-list, then + ** the entire-list will be searched for that page. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + if( eMode==BTALLOC_EXACT ){ + if( nearby<=mxPage ){ + u8 eType; + assert( nearby>0 ); + assert( pBt->autoVacuum ); + rc = ptrmapGet(pBt, nearby, &eType, 0); + if( rc ) return rc; + if( eType==PTRMAP_FREEPAGE ){ + searchList = 1; + } + } + }else if( eMode==BTALLOC_LE ){ + searchList = 1; + } +#endif + + /* Decrement the free-list count by 1. Set iTrunk to the index of the + ** first free-list trunk page. iPrevTrunk is initially 1. + */ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc ) return rc; + put4byte(&pPage1->aData[36], n-1); + + /* The code within this loop is run only once if the 'searchList' variable + ** is not true. Otherwise, it runs once for each trunk-page on the + ** free-list until the page 'nearby' is located (eMode==BTALLOC_EXACT) + ** or until a page less than 'nearby' is located (eMode==BTALLOC_LT) + */ + do { + pPrevTrunk = pTrunk; + if( pPrevTrunk ){ + /* EVIDENCE-OF: R-01506-11053 The first integer on a freelist trunk page + ** is the page number of the next freelist trunk page in the list or + ** zero if this is the last freelist trunk page. */ + iTrunk = get4byte(&pPrevTrunk->aData[0]); + }else{ + /* EVIDENCE-OF: R-59841-13798 The 4-byte big-endian integer at offset 32 + ** stores the page number of the first page of the freelist, or zero if + ** the freelist is empty. */ + iTrunk = get4byte(&pPage1->aData[32]); + } + testcase( iTrunk==mxPage ); + if( iTrunk>mxPage || nSearch++ > n ){ + rc = SQLITE_CORRUPT_PGNO(pPrevTrunk ? pPrevTrunk->pgno : 1); + }else{ + rc = btreeGetUnusedPage(pBt, iTrunk, &pTrunk, 0); + } + if( rc ){ + pTrunk = 0; + goto end_allocate_page; + } + assert( pTrunk!=0 ); + assert( pTrunk->aData!=0 ); + /* EVIDENCE-OF: R-13523-04394 The second integer on a freelist trunk page + ** is the number of leaf page pointers to follow. */ + k = get4byte(&pTrunk->aData[4]); + if( k==0 && !searchList ){ + /* The trunk has no leaves and the list is not being searched. + ** So extract the trunk page itself and use it as the newly + ** allocated page */ + assert( pPrevTrunk==0 ); + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc ){ + goto end_allocate_page; + } + *pPgno = iTrunk; + memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); + *ppPage = pTrunk; + pTrunk = 0; + TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); + }else if( k>(u32)(pBt->usableSize/4 - 2) ){ + /* Value of k is out of range. Database corruption */ + rc = SQLITE_CORRUPT_PGNO(iTrunk); + goto end_allocate_page; +#ifndef SQLITE_OMIT_AUTOVACUUM + }else if( searchList + && (nearby==iTrunk || (iTrunkpDbPage); + if( rc ){ + goto end_allocate_page; + } + if( k==0 ){ + if( !pPrevTrunk ){ + memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); + }else{ + rc = sqlite3PagerWrite(pPrevTrunk->pDbPage); + if( rc!=SQLITE_OK ){ + goto end_allocate_page; + } + memcpy(&pPrevTrunk->aData[0], &pTrunk->aData[0], 4); + } + }else{ + /* The trunk page is required by the caller but it contains + ** pointers to free-list leaves. The first leaf becomes a trunk + ** page in this case. + */ + MemPage *pNewTrunk; + Pgno iNewTrunk = get4byte(&pTrunk->aData[8]); + if( iNewTrunk>mxPage ){ + rc = SQLITE_CORRUPT_PGNO(iTrunk); + goto end_allocate_page; + } + testcase( iNewTrunk==mxPage ); + rc = btreeGetUnusedPage(pBt, iNewTrunk, &pNewTrunk, 0); + if( rc!=SQLITE_OK ){ + goto end_allocate_page; + } + rc = sqlite3PagerWrite(pNewTrunk->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pNewTrunk); + goto end_allocate_page; + } + memcpy(&pNewTrunk->aData[0], &pTrunk->aData[0], 4); + put4byte(&pNewTrunk->aData[4], k-1); + memcpy(&pNewTrunk->aData[8], &pTrunk->aData[12], (k-1)*4); + releasePage(pNewTrunk); + if( !pPrevTrunk ){ + assert( sqlite3PagerIswriteable(pPage1->pDbPage) ); + put4byte(&pPage1->aData[32], iNewTrunk); + }else{ + rc = sqlite3PagerWrite(pPrevTrunk->pDbPage); + if( rc ){ + goto end_allocate_page; + } + put4byte(&pPrevTrunk->aData[0], iNewTrunk); + } + } + pTrunk = 0; + TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); +#endif + }else if( k>0 ){ + /* Extract a leaf from the trunk */ + u32 closest; + Pgno iPage; + unsigned char *aData = pTrunk->aData; + if( nearby>0 ){ + u32 i; + closest = 0; + if( eMode==BTALLOC_LE ){ + for(i=0; imxPage ){ + rc = SQLITE_CORRUPT_PGNO(iTrunk); + goto end_allocate_page; + } + testcase( iPage==mxPage ); + if( !searchList + || (iPage==nearby || (iPagepgno, n-1)); + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc ) goto end_allocate_page; + if( closestpDbPage); + if( rc!=SQLITE_OK ){ + releasePage(*ppPage); + *ppPage = 0; + } + } + searchList = 0; + } + } + releasePage(pPrevTrunk); + pPrevTrunk = 0; + }while( searchList ); + }else{ + /* There are no pages on the freelist, so append a new page to the + ** database image. + ** + ** Normally, new pages allocated by this block can be requested from the + ** pager layer with the 'no-content' flag set. This prevents the pager + ** from trying to read the pages content from disk. However, if the + ** current transaction has already run one or more incremental-vacuum + ** steps, then the page we are about to allocate may contain content + ** that is required in the event of a rollback. In this case, do + ** not set the no-content flag. This causes the pager to load and journal + ** the current page content before overwriting it. + ** + ** Note that the pager will not actually attempt to load or journal + ** content for any page that really does lie past the end of the database + ** file on disk. So the effects of disabling the no-content optimization + ** here are confined to those pages that lie between the end of the + ** database image and the end of the database file. + */ + int bNoContent = (0==IfNotOmitAV(pBt->bDoTruncate))? PAGER_GET_NOCONTENT:0; + + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( rc ) return rc; + pBt->nPage++; + if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ) pBt->nPage++; + +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum && PTRMAP_ISPAGE(pBt, pBt->nPage) ){ + /* If *pPgno refers to a pointer-map page, allocate two new pages + ** at the end of the file instead of one. The first allocated page + ** becomes a new pointer-map page, the second is used by the caller. + */ + MemPage *pPg = 0; + TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", pBt->nPage)); + assert( pBt->nPage!=PENDING_BYTE_PAGE(pBt) ); + rc = btreeGetUnusedPage(pBt, pBt->nPage, &pPg, bNoContent); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pPg->pDbPage); + releasePage(pPg); + } + if( rc ) return rc; + pBt->nPage++; + if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ){ pBt->nPage++; } + } +#endif + put4byte(28 + (u8*)pBt->pPage1->aData, pBt->nPage); + *pPgno = pBt->nPage; + + assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + rc = btreeGetUnusedPage(pBt, *pPgno, ppPage, bNoContent); + if( rc ) return rc; + rc = sqlite3PagerWrite((*ppPage)->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(*ppPage); + *ppPage = 0; + } + TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); + } + + assert( CORRUPT_DB || *pPgno!=PENDING_BYTE_PAGE(pBt) ); + +end_allocate_page: + releasePage(pTrunk); + releasePage(pPrevTrunk); + assert( rc!=SQLITE_OK || sqlite3PagerPageRefcount((*ppPage)->pDbPage)<=1 ); + assert( rc!=SQLITE_OK || (*ppPage)->isInit==0 ); + return rc; +} + +/* +** This function is used to add page iPage to the database file free-list. +** It is assumed that the page is not already a part of the free-list. +** +** The value passed as the second argument to this function is optional. +** If the caller happens to have a pointer to the MemPage object +** corresponding to page iPage handy, it may pass it as the second value. +** Otherwise, it may pass NULL. +** +** If a pointer to a MemPage object is passed as the second argument, +** its reference count is not altered by this function. +*/ +static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ + MemPage *pTrunk = 0; /* Free-list trunk page */ + Pgno iTrunk = 0; /* Page number of free-list trunk page */ + MemPage *pPage1 = pBt->pPage1; /* Local reference to page 1 */ + MemPage *pPage; /* Page being freed. May be NULL. */ + int rc; /* Return Code */ + u32 nFree; /* Initial number of pages on free-list */ + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( CORRUPT_DB || iPage>1 ); + assert( !pMemPage || pMemPage->pgno==iPage ); + + if( iPage<2 || iPage>pBt->nPage ){ + return SQLITE_CORRUPT_BKPT; + } + if( pMemPage ){ + pPage = pMemPage; + sqlite3PagerRef(pPage->pDbPage); + }else{ + pPage = btreePageLookup(pBt, iPage); + } + + /* Increment the free page count on pPage1 */ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc ) goto freepage_out; + nFree = get4byte(&pPage1->aData[36]); + put4byte(&pPage1->aData[36], nFree+1); + + if( pBt->btsFlags & BTS_SECURE_DELETE ){ + /* If the secure_delete option is enabled, then + ** always fully overwrite deleted information with zeros. + */ + if( (!pPage && ((rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0) ) + || ((rc = sqlite3PagerWrite(pPage->pDbPage))!=0) + ){ + goto freepage_out; + } + memset(pPage->aData, 0, pPage->pBt->pageSize); + } + + /* If the database supports auto-vacuum, write an entry in the pointer-map + ** to indicate that the page is free. + */ + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, iPage, PTRMAP_FREEPAGE, 0, &rc); + if( rc ) goto freepage_out; + } + + /* Now manipulate the actual database free-list structure. There are two + ** possibilities. If the free-list is currently empty, or if the first + ** trunk page in the free-list is full, then this page will become a + ** new free-list trunk page. Otherwise, it will become a leaf of the + ** first trunk page in the current free-list. This block tests if it + ** is possible to add the page as a new free-list leaf. + */ + if( nFree!=0 ){ + u32 nLeaf; /* Initial number of leaf cells on trunk page */ + + iTrunk = get4byte(&pPage1->aData[32]); + rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0); + if( rc!=SQLITE_OK ){ + goto freepage_out; + } + + nLeaf = get4byte(&pTrunk->aData[4]); + assert( pBt->usableSize>32 ); + if( nLeaf > (u32)pBt->usableSize/4 - 2 ){ + rc = SQLITE_CORRUPT_BKPT; + goto freepage_out; + } + if( nLeaf < (u32)pBt->usableSize/4 - 8 ){ + /* In this case there is room on the trunk page to insert the page + ** being freed as a new leaf. + ** + ** Note that the trunk page is not really full until it contains + ** usableSize/4 - 2 entries, not usableSize/4 - 8 entries as we have + ** coded. But due to a coding error in versions of SQLite prior to + ** 3.6.0, databases with freelist trunk pages holding more than + ** usableSize/4 - 8 entries will be reported as corrupt. In order + ** to maintain backwards compatibility with older versions of SQLite, + ** we will continue to restrict the number of entries to usableSize/4 - 8 + ** for now. At some point in the future (once everyone has upgraded + ** to 3.6.0 or later) we should consider fixing the conditional above + ** to read "usableSize/4-2" instead of "usableSize/4-8". + ** + ** EVIDENCE-OF: R-19920-11576 However, newer versions of SQLite still + ** avoid using the last six entries in the freelist trunk page array in + ** order that database files created by newer versions of SQLite can be + ** read by older versions of SQLite. + */ + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pTrunk->aData[4], nLeaf+1); + put4byte(&pTrunk->aData[8+nLeaf*4], iPage); + if( pPage && (pBt->btsFlags & BTS_SECURE_DELETE)==0 ){ + sqlite3PagerDontWrite(pPage->pDbPage); + } + rc = btreeSetHasContent(pBt, iPage); + } + TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno)); + goto freepage_out; + } + } + + /* If control flows to this point, then it was not possible to add the + ** the page being freed as a leaf page of the first trunk in the free-list. + ** Possibly because the free-list is empty, or possibly because the + ** first trunk in the free-list is full. Either way, the page being freed + ** will become the new first trunk page in the free-list. + */ + if( pPage==0 && SQLITE_OK!=(rc = btreeGetPage(pBt, iPage, &pPage, 0)) ){ + goto freepage_out; + } + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc!=SQLITE_OK ){ + goto freepage_out; + } + put4byte(pPage->aData, iTrunk); + put4byte(&pPage->aData[4], 0); + put4byte(&pPage1->aData[32], iPage); + TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", pPage->pgno, iTrunk)); + +freepage_out: + if( pPage ){ + pPage->isInit = 0; + } + releasePage(pPage); + releasePage(pTrunk); + return rc; +} +static void freePage(MemPage *pPage, int *pRC){ + if( (*pRC)==SQLITE_OK ){ + *pRC = freePage2(pPage->pBt, pPage, pPage->pgno); + } +} + +/* +** Free any overflow pages associated with the given Cell. Store +** size information about the cell in pInfo. +*/ +static int clearCell( + MemPage *pPage, /* The page that contains the Cell */ + unsigned char *pCell, /* First byte of the Cell */ + CellInfo *pInfo /* Size information about the cell */ +){ + BtShared *pBt; + Pgno ovflPgno; + int rc; + int nOvfl; + u32 ovflPageSize; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pPage->xParseCell(pPage, pCell, pInfo); + if( pInfo->nLocal==pInfo->nPayload ){ + return SQLITE_OK; /* No overflow pages. Return without doing anything */ + } + testcase( pCell + pInfo->nSize == pPage->aDataEnd ); + testcase( pCell + (pInfo->nSize-1) == pPage->aDataEnd ); + if( pCell + pInfo->nSize > pPage->aDataEnd ){ + /* Cell extends past end of page */ + return SQLITE_CORRUPT_PAGE(pPage); + } + ovflPgno = get4byte(pCell + pInfo->nSize - 4); + pBt = pPage->pBt; + assert( pBt->usableSize > 4 ); + ovflPageSize = pBt->usableSize - 4; + nOvfl = (pInfo->nPayload - pInfo->nLocal + ovflPageSize - 1)/ovflPageSize; + assert( nOvfl>0 || + (CORRUPT_DB && (pInfo->nPayload + ovflPageSize)btreePagecount(pBt) ){ + /* 0 is not a legal page number and page 1 cannot be an + ** overflow page. Therefore if ovflPgno<2 or past the end of the + ** file the database must be corrupt. */ + return SQLITE_CORRUPT_BKPT; + } + if( nOvfl ){ + rc = getOverflowPage(pBt, ovflPgno, &pOvfl, &iNext); + if( rc ) return rc; + } + + if( ( pOvfl || ((pOvfl = btreePageLookup(pBt, ovflPgno))!=0) ) + && sqlite3PagerPageRefcount(pOvfl->pDbPage)!=1 + ){ + /* There is no reason any cursor should have an outstanding reference + ** to an overflow page belonging to a cell that is being deleted/updated. + ** So if there exists more than one reference to this page, then it + ** must not really be an overflow page and the database must be corrupt. + ** It is helpful to detect this before calling freePage2(), as + ** freePage2() may zero the page contents if secure-delete mode is + ** enabled. If this 'overflow' page happens to be a page that the + ** caller is iterating through or using in some other way, this + ** can be problematic. + */ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = freePage2(pBt, pOvfl, ovflPgno); + } + + if( pOvfl ){ + sqlite3PagerUnref(pOvfl->pDbPage); + } + if( rc ) return rc; + ovflPgno = iNext; + } + return SQLITE_OK; +} + +/* +** Create the byte sequence used to represent a cell on page pPage +** and write that byte sequence into pCell[]. Overflow pages are +** allocated and filled in as necessary. The calling procedure +** is responsible for making sure sufficient space has been allocated +** for pCell[]. +** +** Note that pCell does not necessary need to point to the pPage->aData +** area. pCell might point to some temporary storage. The cell will +** be constructed in this temporary area then copied into pPage->aData +** later. +*/ +static int fillInCell( + MemPage *pPage, /* The page that contains the cell */ + unsigned char *pCell, /* Complete text of the cell */ + const BtreePayload *pX, /* Payload with which to construct the cell */ + int *pnSize /* Write cell size here */ +){ + int nPayload; + const u8 *pSrc; + int nSrc, n, rc, mn; + int spaceLeft; + MemPage *pToRelease; + unsigned char *pPrior; + unsigned char *pPayload; + BtShared *pBt; + Pgno pgnoOvfl; + int nHeader; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + + /* pPage is not necessarily writeable since pCell might be auxiliary + ** buffer space that is separate from the pPage buffer area */ + assert( pCellaData || pCell>=&pPage->aData[pPage->pBt->pageSize] + || sqlite3PagerIswriteable(pPage->pDbPage) ); + + /* Fill in the header. */ + nHeader = pPage->childPtrSize; + if( pPage->intKey ){ + nPayload = pX->nData + pX->nZero; + pSrc = pX->pData; + nSrc = pX->nData; + assert( pPage->intKeyLeaf ); /* fillInCell() only called for leaves */ + nHeader += putVarint32(&pCell[nHeader], nPayload); + nHeader += putVarint(&pCell[nHeader], *(u64*)&pX->nKey); + }else{ + assert( pX->nKey<=0x7fffffff && pX->pKey!=0 ); + nSrc = nPayload = (int)pX->nKey; + pSrc = pX->pKey; + nHeader += putVarint32(&pCell[nHeader], nPayload); + } + + /* Fill in the payload */ + pPayload = &pCell[nHeader]; + if( nPayload<=pPage->maxLocal ){ + /* This is the common case where everything fits on the btree page + ** and no overflow pages are required. */ + n = nHeader + nPayload; + testcase( n==3 ); + testcase( n==4 ); + if( n<4 ) n = 4; + *pnSize = n; + assert( nSrc<=nPayload ); + testcase( nSrcminLocal; + n = mn + (nPayload - mn) % (pPage->pBt->usableSize - 4); + testcase( n==pPage->maxLocal ); + testcase( n==pPage->maxLocal+1 ); + if( n > pPage->maxLocal ) n = mn; + spaceLeft = n; + *pnSize = n + nHeader + 4; + pPrior = &pCell[nHeader+n]; + pToRelease = 0; + pgnoOvfl = 0; + pBt = pPage->pBt; + + /* At this point variables should be set as follows: + ** + ** nPayload Total payload size in bytes + ** pPayload Begin writing payload here + ** spaceLeft Space available at pPayload. If nPayload>spaceLeft, + ** that means content must spill into overflow pages. + ** *pnSize Size of the local cell (not counting overflow pages) + ** pPrior Where to write the pgno of the first overflow page + ** + ** Use a call to btreeParseCellPtr() to verify that the values above + ** were computed correctly. + */ +#ifdef SQLITE_DEBUG + { + CellInfo info; + pPage->xParseCell(pPage, pCell, &info); + assert( nHeader==(int)(info.pPayload - pCell) ); + assert( info.nKey==pX->nKey ); + assert( *pnSize == info.nSize ); + assert( spaceLeft == info.nLocal ); + } +#endif + + /* Write the payload into the local Cell and any extra into overflow pages */ + while( 1 ){ + n = nPayload; + if( n>spaceLeft ) n = spaceLeft; + + /* If pToRelease is not zero than pPayload points into the data area + ** of pToRelease. Make sure pToRelease is still writeable. */ + assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) ); + + /* If pPayload is part of the data area of pPage, then make sure pPage + ** is still writeable */ + assert( pPayloadaData || pPayload>=&pPage->aData[pBt->pageSize] + || sqlite3PagerIswriteable(pPage->pDbPage) ); + + if( nSrc>=n ){ + memcpy(pPayload, pSrc, n); + }else if( nSrc>0 ){ + n = nSrc; + memcpy(pPayload, pSrc, n); + }else{ + memset(pPayload, 0, n); + } + nPayload -= n; + if( nPayload<=0 ) break; + pPayload += n; + pSrc += n; + nSrc -= n; + spaceLeft -= n; + if( spaceLeft==0 ){ + MemPage *pOvfl = 0; +#ifndef SQLITE_OMIT_AUTOVACUUM + Pgno pgnoPtrmap = pgnoOvfl; /* Overflow page pointer-map entry page */ + if( pBt->autoVacuum ){ + do{ + pgnoOvfl++; + } while( + PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt) + ); + } +#endif + rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, 0); +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If the database supports auto-vacuum, and the second or subsequent + ** overflow page is being allocated, add an entry to the pointer-map + ** for that page now. + ** + ** If this is the first overflow page, then write a partial entry + ** to the pointer-map. If we write nothing to this pointer-map slot, + ** then the optimistic overflow chain processing in clearCell() + ** may misinterpret the uninitialized values and delete the + ** wrong pages from the database. + */ + if( pBt->autoVacuum && rc==SQLITE_OK ){ + u8 eType = (pgnoPtrmap?PTRMAP_OVERFLOW2:PTRMAP_OVERFLOW1); + ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap, &rc); + if( rc ){ + releasePage(pOvfl); + } + } +#endif + if( rc ){ + releasePage(pToRelease); + return rc; + } + + /* If pToRelease is not zero than pPrior points into the data area + ** of pToRelease. Make sure pToRelease is still writeable. */ + assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) ); + + /* If pPrior is part of the data area of pPage, then make sure pPage + ** is still writeable */ + assert( pPrioraData || pPrior>=&pPage->aData[pBt->pageSize] + || sqlite3PagerIswriteable(pPage->pDbPage) ); + + put4byte(pPrior, pgnoOvfl); + releasePage(pToRelease); + pToRelease = pOvfl; + pPrior = pOvfl->aData; + put4byte(pPrior, 0); + pPayload = &pOvfl->aData[4]; + spaceLeft = pBt->usableSize - 4; + } + } + releasePage(pToRelease); + return SQLITE_OK; +} + +/* +** Remove the i-th cell from pPage. This routine effects pPage only. +** The cell content is not freed or deallocated. It is assumed that +** the cell content has been copied someplace else. This routine just +** removes the reference to the cell from pPage. +** +** "sz" must be the number of bytes in the cell. +*/ +static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ + u32 pc; /* Offset to cell content of cell being deleted */ + u8 *data; /* pPage->aData */ + u8 *ptr; /* Used to move bytes around within data[] */ + int rc; /* The return code */ + int hdr; /* Beginning of the header. 0 most pages. 100 page 1 */ + + if( *pRC ) return; + assert( idx>=0 && idxnCell ); + assert( CORRUPT_DB || sz==cellSize(pPage, idx) ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->nFree>=0 ); + data = pPage->aData; + ptr = &pPage->aCellIdx[2*idx]; + pc = get2byte(ptr); + hdr = pPage->hdrOffset; + testcase( pc==get2byte(&data[hdr+5]) ); + testcase( pc+sz==pPage->pBt->usableSize ); + if( pc+sz > pPage->pBt->usableSize ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + rc = freeSpace(pPage, pc, sz); + if( rc ){ + *pRC = rc; + return; + } + pPage->nCell--; + if( pPage->nCell==0 ){ + memset(&data[hdr+1], 0, 4); + data[hdr+7] = 0; + put2byte(&data[hdr+5], pPage->pBt->usableSize); + pPage->nFree = pPage->pBt->usableSize - pPage->hdrOffset + - pPage->childPtrSize - 8; + }else{ + memmove(ptr, ptr+2, 2*(pPage->nCell - idx)); + put2byte(&data[hdr+3], pPage->nCell); + pPage->nFree += 2; + } +} + +/* +** Insert a new cell on pPage at cell index "i". pCell points to the +** content of the cell. +** +** If the cell content will fit on the page, then put it there. If it +** will not fit, then make a copy of the cell content into pTemp if +** pTemp is not null. Regardless of pTemp, allocate a new entry +** in pPage->apOvfl[] and make it point to the cell content (either +** in pTemp or the original pCell) and also record its index. +** Allocating a new entry in pPage->aCell[] implies that +** pPage->nOverflow is incremented. +** +** *pRC must be SQLITE_OK when this routine is called. +*/ +static void insertCell( + MemPage *pPage, /* Page into which we are copying */ + int i, /* New cell becomes the i-th cell of the page */ + u8 *pCell, /* Content of the new cell */ + int sz, /* Bytes of content in pCell */ + u8 *pTemp, /* Temp storage space for pCell, if needed */ + Pgno iChild, /* If non-zero, replace first 4 bytes with this value */ + int *pRC /* Read and write return code from here */ +){ + int idx = 0; /* Where to write new cell content in data[] */ + int j; /* Loop counter */ + u8 *data; /* The content of the whole page */ + u8 *pIns; /* The point in pPage->aCellIdx[] where no cell inserted */ + + assert( *pRC==SQLITE_OK ); + assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); + assert( MX_CELL(pPage->pBt)<=10921 ); + assert( pPage->nCell<=MX_CELL(pPage->pBt) || CORRUPT_DB ); + assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) ); + assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB ); + assert( pPage->nFree>=0 ); + if( pPage->nOverflow || sz+2>pPage->nFree ){ + if( pTemp ){ + memcpy(pTemp, pCell, sz); + pCell = pTemp; + } + if( iChild ){ + put4byte(pCell, iChild); + } + j = pPage->nOverflow++; + /* Comparison against ArraySize-1 since we hold back one extra slot + ** as a contingency. In other words, never need more than 3 overflow + ** slots but 4 are allocated, just to be safe. */ + assert( j < ArraySize(pPage->apOvfl)-1 ); + pPage->apOvfl[j] = pCell; + pPage->aiOvfl[j] = (u16)i; + + /* When multiple overflows occur, they are always sequential and in + ** sorted order. This invariants arise because multiple overflows can + ** only occur when inserting divider cells into the parent page during + ** balancing, and the dividers are adjacent and sorted. + */ + assert( j==0 || pPage->aiOvfl[j-1]<(u16)i ); /* Overflows in sorted order */ + assert( j==0 || i==pPage->aiOvfl[j-1]+1 ); /* Overflows are sequential */ + }else{ + int rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + data = pPage->aData; + assert( &data[pPage->cellOffset]==pPage->aCellIdx ); + rc = allocateSpace(pPage, sz, &idx); + if( rc ){ *pRC = rc; return; } + /* The allocateSpace() routine guarantees the following properties + ** if it returns successfully */ + assert( idx >= 0 ); + assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); + assert( idx+sz <= (int)pPage->pBt->usableSize ); + pPage->nFree -= (u16)(2 + sz); + if( iChild ){ + /* In a corrupt database where an entry in the cell index section of + ** a btree page has a value of 3 or less, the pCell value might point + ** as many as 4 bytes in front of the start of the aData buffer for + ** the source page. Make sure this does not cause problems by not + ** reading the first 4 bytes */ + memcpy(&data[idx+4], pCell+4, sz-4); + put4byte(&data[idx], iChild); + }else{ + memcpy(&data[idx], pCell, sz); + } + pIns = pPage->aCellIdx + i*2; + memmove(pIns+2, pIns, 2*(pPage->nCell - i)); + put2byte(pIns, idx); + pPage->nCell++; + /* increment the cell count */ + if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; + assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB ); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pPage->pBt->autoVacuum ){ + /* The cell may contain a pointer to an overflow page. If so, write + ** the entry for the overflow page into the pointer map. + */ + ptrmapPutOvflPtr(pPage, pPage, pCell, pRC); + } +#endif + } +} + +/* +** The following parameters determine how many adjacent pages get involved +** in a balancing operation. NN is the number of neighbors on either side +** of the page that participate in the balancing operation. NB is the +** total number of pages that participate, including the target page and +** NN neighbors on either side. +** +** The minimum value of NN is 1 (of course). Increasing NN above 1 +** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance +** in exchange for a larger degradation in INSERT and UPDATE performance. +** The value of NN appears to give the best results overall. +** +** (Later:) The description above makes it seem as if these values are +** tunable - as if you could change them and recompile and it would all work. +** But that is unlikely. NB has been 3 since the inception of SQLite and +** we have never tested any other value. +*/ +#define NN 1 /* Number of neighbors on either side of pPage */ +#define NB 3 /* (NN*2+1): Total pages involved in the balance */ + +/* +** A CellArray object contains a cache of pointers and sizes for a +** consecutive sequence of cells that might be held on multiple pages. +** +** The cells in this array are the divider cell or cells from the pParent +** page plus up to three child pages. There are a total of nCell cells. +** +** pRef is a pointer to one of the pages that contributes cells. This is +** used to access information such as MemPage.intKey and MemPage.pBt->pageSize +** which should be common to all pages that contribute cells to this array. +** +** apCell[] and szCell[] hold, respectively, pointers to the start of each +** cell and the size of each cell. Some of the apCell[] pointers might refer +** to overflow cells. In other words, some apCel[] pointers might not point +** to content area of the pages. +** +** A szCell[] of zero means the size of that cell has not yet been computed. +** +** The cells come from as many as four different pages: +** +** ----------- +** | Parent | +** ----------- +** / | \ +** / | \ +** --------- --------- --------- +** |Child-1| |Child-2| |Child-3| +** --------- --------- --------- +** +** The order of cells is in the array is for an index btree is: +** +** 1. All cells from Child-1 in order +** 2. The first divider cell from Parent +** 3. All cells from Child-2 in order +** 4. The second divider cell from Parent +** 5. All cells from Child-3 in order +** +** For a table-btree (with rowids) the items 2 and 4 are empty because +** content exists only in leaves and there are no divider cells. +** +** For an index btree, the apEnd[] array holds pointer to the end of page +** for Child-1, the Parent, Child-2, the Parent (again), and Child-3, +** respectively. The ixNx[] array holds the number of cells contained in +** each of these 5 stages, and all stages to the left. Hence: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 plus 1 for first divider. +** ixNx[2] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. +** ixNx[3] = Number of cells in Child-1 and Child-2 + both divider cells +** ixNx[4] = Total number of cells. +** +** For a table-btree, the concept is similar, except only apEnd[0]..apEnd[2] +** are used and they point to the leaf pages only, and the ixNx value are: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 and Child-2. +** ixNx[2] = Total number of cells. +** +** Sometimes when deleting, a child page can have zero cells. In those +** cases, ixNx[] entries with higher indexes, and the corresponding apEnd[] +** entries, shift down. The end result is that each ixNx[] entry should +** be larger than the previous +*/ +typedef struct CellArray CellArray; +struct CellArray { + int nCell; /* Number of cells in apCell[] */ + MemPage *pRef; /* Reference page */ + u8 **apCell; /* All cells begin balanced */ + u16 *szCell; /* Local size of all cells in apCell[] */ + u8 *apEnd[NB*2]; /* MemPage.aDataEnd values */ + int ixNx[NB*2]; /* Index of at which we move to the next apEnd[] */ +}; + +/* +** Make sure the cell sizes at idx, idx+1, ..., idx+N-1 have been +** computed. +*/ +static void populateCellCache(CellArray *p, int idx, int N){ + assert( idx>=0 && idx+N<=p->nCell ); + while( N>0 ){ + assert( p->apCell[idx]!=0 ); + if( p->szCell[idx]==0 ){ + p->szCell[idx] = p->pRef->xCellSize(p->pRef, p->apCell[idx]); + }else{ + assert( CORRUPT_DB || + p->szCell[idx]==p->pRef->xCellSize(p->pRef, p->apCell[idx]) ); + } + idx++; + N--; + } +} + +/* +** Return the size of the Nth element of the cell array +*/ +static SQLITE_NOINLINE u16 computeCellSize(CellArray *p, int N){ + assert( N>=0 && NnCell ); + assert( p->szCell[N]==0 ); + p->szCell[N] = p->pRef->xCellSize(p->pRef, p->apCell[N]); + return p->szCell[N]; +} +static u16 cachedCellSize(CellArray *p, int N){ + assert( N>=0 && NnCell ); + if( p->szCell[N] ) return p->szCell[N]; + return computeCellSize(p, N); +} + +/* +** Array apCell[] contains pointers to nCell b-tree page cells. The +** szCell[] array contains the size in bytes of each cell. This function +** replaces the current contents of page pPg with the contents of the cell +** array. +** +** Some of the cells in apCell[] may currently be stored in pPg. This +** function works around problems caused by this by making a copy of any +** such cells before overwriting the page data. +** +** The MemPage.nFree field is invalidated by this function. It is the +** responsibility of the caller to set it correctly. +*/ +static int rebuildPage( + CellArray *pCArray, /* Content to be added to page pPg */ + int iFirst, /* First cell in pCArray to use */ + int nCell, /* Final number of cells on page */ + MemPage *pPg /* The page to be reconstructed */ +){ + const int hdr = pPg->hdrOffset; /* Offset of header on pPg */ + u8 * const aData = pPg->aData; /* Pointer to data for pPg */ + const int usableSize = pPg->pBt->usableSize; + u8 * const pEnd = &aData[usableSize]; + int i = iFirst; /* Which cell to copy from pCArray*/ + u32 j; /* Start of cell content area */ + int iEnd = i+nCell; /* Loop terminator */ + u8 *pCellptr = pPg->aCellIdx; + u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); + u8 *pData; + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pSrcEnd; /* Current pCArray->apEnd[k] value */ + + assert( i(u32)usableSize) ){ j = 0; } + memcpy(&pTmp[j], &aData[j], usableSize - j); + + for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kapEnd[k]; + + pData = pEnd; + while( 1/*exit by break*/ ){ + u8 *pCell = pCArray->apCell[i]; + u16 sz = pCArray->szCell[i]; + assert( sz>0 ); + if( SQLITE_WITHIN(pCell,aData,pEnd) ){ + if( ((uptr)(pCell+sz))>(uptr)pEnd ) return SQLITE_CORRUPT_BKPT; + pCell = &pTmp[pCell - aData]; + }else if( (uptr)(pCell+sz)>(uptr)pSrcEnd + && (uptr)(pCell)<(uptr)pSrcEnd + ){ + return SQLITE_CORRUPT_BKPT; + } + + pData -= sz; + put2byte(pCellptr, (pData - aData)); + pCellptr += 2; + if( pData < pCellptr ) return SQLITE_CORRUPT_BKPT; + memcpy(pData, pCell, sz); + assert( sz==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); + testcase( sz!=pPg->xCellSize(pPg,pCell) ) + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pSrcEnd = pCArray->apEnd[k]; + } + } + + /* The pPg->nFree field is now set incorrectly. The caller will fix it. */ + pPg->nCell = nCell; + pPg->nOverflow = 0; + + put2byte(&aData[hdr+1], 0); + put2byte(&aData[hdr+3], pPg->nCell); + put2byte(&aData[hdr+5], pData - aData); + aData[hdr+7] = 0x00; + return SQLITE_OK; +} + +/* +** The pCArray objects contains pointers to b-tree cells and the cell sizes. +** This function attempts to add the cells stored in the array to page pPg. +** If it cannot (because the page needs to be defragmented before the cells +** will fit), non-zero is returned. Otherwise, if the cells are added +** successfully, zero is returned. +** +** Argument pCellptr points to the first entry in the cell-pointer array +** (part of page pPg) to populate. After cell apCell[0] is written to the +** page body, a 16-bit offset is written to pCellptr. And so on, for each +** cell in the array. It is the responsibility of the caller to ensure +** that it is safe to overwrite this part of the cell-pointer array. +** +** When this function is called, *ppData points to the start of the +** content area on page pPg. If the size of the content area is extended, +** *ppData is updated to point to the new start of the content area +** before returning. +** +** Finally, argument pBegin points to the byte immediately following the +** end of the space required by this page for the cell-pointer area (for +** all cells - not just those inserted by the current call). If the content +** area must be extended to before this point in order to accomodate all +** cells in apCell[], then the cells do not fit and non-zero is returned. +*/ +static int pageInsertArray( + MemPage *pPg, /* Page to add cells to */ + u8 *pBegin, /* End of cell-pointer array */ + u8 **ppData, /* IN/OUT: Page content-area pointer */ + u8 *pCellptr, /* Pointer to cell-pointer area */ + int iFirst, /* Index of first cell to add */ + int nCell, /* Number of cells to add to pPg */ + CellArray *pCArray /* Array of cells */ +){ + int i = iFirst; /* Loop counter - cell index to insert */ + u8 *aData = pPg->aData; /* Complete page */ + u8 *pData = *ppData; /* Content area. A subset of aData[] */ + int iEnd = iFirst + nCell; /* End of loop. One past last cell to ins */ + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pEnd; /* Maximum extent of cell data */ + assert( CORRUPT_DB || pPg->hdrOffset==0 ); /* Never called on page 1 */ + if( iEnd<=iFirst ) return 0; + for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kapEnd[k]; + while( 1 /*Exit by break*/ ){ + int sz, rc; + u8 *pSlot; + assert( pCArray->szCell[i]!=0 ); + sz = pCArray->szCell[i]; + if( (aData[1]==0 && aData[2]==0) || (pSlot = pageFindSlot(pPg,sz,&rc))==0 ){ + if( (pData - pBegin)apCell[i] will never overlap on a well-formed + ** database. But they might for a corrupt database. Hence use memmove() + ** since memcpy() sends SIGABORT with overlapping buffers on OpenBSD */ + assert( (pSlot+sz)<=pCArray->apCell[i] + || pSlot>=(pCArray->apCell[i]+sz) + || CORRUPT_DB ); + if( (uptr)(pCArray->apCell[i]+sz)>(uptr)pEnd + && (uptr)(pCArray->apCell[i])<(uptr)pEnd + ){ + assert( CORRUPT_DB ); + (void)SQLITE_CORRUPT_BKPT; + return 1; + } + memmove(pSlot, pCArray->apCell[i], sz); + put2byte(pCellptr, (pSlot - aData)); + pCellptr += 2; + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pEnd = pCArray->apEnd[k]; + } + } + *ppData = pData; + return 0; +} + +/* +** The pCArray object contains pointers to b-tree cells and their sizes. +** +** This function adds the space associated with each cell in the array +** that is currently stored within the body of pPg to the pPg free-list. +** The cell-pointers and other fields of the page are not updated. +** +** This function returns the total number of cells added to the free-list. +*/ +static int pageFreeArray( + MemPage *pPg, /* Page to edit */ + int iFirst, /* First cell to delete */ + int nCell, /* Cells to delete */ + CellArray *pCArray /* Array of cells */ +){ + u8 * const aData = pPg->aData; + u8 * const pEnd = &aData[pPg->pBt->usableSize]; + u8 * const pStart = &aData[pPg->hdrOffset + 8 + pPg->childPtrSize]; + int nRet = 0; + int i; + int iEnd = iFirst + nCell; + u8 *pFree = 0; + int szFree = 0; + + for(i=iFirst; iapCell[i]; + if( SQLITE_WITHIN(pCell, pStart, pEnd) ){ + int sz; + /* No need to use cachedCellSize() here. The sizes of all cells that + ** are to be freed have already been computing while deciding which + ** cells need freeing */ + sz = pCArray->szCell[i]; assert( sz>0 ); + if( pFree!=(pCell + sz) ){ + if( pFree ){ + assert( pFree>aData && (pFree - aData)<65536 ); + freeSpace(pPg, (u16)(pFree - aData), szFree); + } + pFree = pCell; + szFree = sz; + if( pFree+sz>pEnd ) return 0; + }else{ + pFree = pCell; + szFree += sz; + } + nRet++; + } + } + if( pFree ){ + assert( pFree>aData && (pFree - aData)<65536 ); + freeSpace(pPg, (u16)(pFree - aData), szFree); + } + return nRet; +} + +/* +** pCArray contains pointers to and sizes of all cells in the page being +** balanced. The current page, pPg, has pPg->nCell cells starting with +** pCArray->apCell[iOld]. After balancing, this page should hold nNew cells +** starting at apCell[iNew]. +** +** This routine makes the necessary adjustments to pPg so that it contains +** the correct cells after being balanced. +** +** The pPg->nFree field is invalid when this function returns. It is the +** responsibility of the caller to set it correctly. +*/ +static int editPage( + MemPage *pPg, /* Edit this page */ + int iOld, /* Index of first cell currently on page */ + int iNew, /* Index of new first cell on page */ + int nNew, /* Final number of cells on page */ + CellArray *pCArray /* Array of cells and sizes */ +){ + u8 * const aData = pPg->aData; + const int hdr = pPg->hdrOffset; + u8 *pBegin = &pPg->aCellIdx[nNew * 2]; + int nCell = pPg->nCell; /* Cells stored on pPg */ + u8 *pData; + u8 *pCellptr; + int i; + int iOldEnd = iOld + pPg->nCell + pPg->nOverflow; + int iNewEnd = iNew + nNew; + +#ifdef SQLITE_DEBUG + u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); + memcpy(pTmp, aData, pPg->pBt->usableSize); +#endif + + /* Remove cells from the start and end of the page */ + assert( nCell>=0 ); + if( iOldnCell) ) return SQLITE_CORRUPT_BKPT; + memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); + nCell -= nShift; + } + if( iNewEnd < iOldEnd ){ + int nTail = pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + assert( nCell>=nTail ); + nCell -= nTail; + } + + pData = &aData[get2byteNotZero(&aData[hdr+5])]; + if( pData=0 ); + pCellptr = pPg->aCellIdx; + memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); + if( pageInsertArray( + pPg, pBegin, &pData, pCellptr, + iNew, nAdd, pCArray + ) ) goto editpage_fail; + nCell += nAdd; + } + + /* Add any overflow cells */ + for(i=0; inOverflow; i++){ + int iCell = (iOld + pPg->aiOvfl[i]) - iNew; + if( iCell>=0 && iCellaCellIdx[iCell * 2]; + if( nCell>iCell ){ + memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); + } + nCell++; + cachedCellSize(pCArray, iCell+iNew); + if( pageInsertArray( + pPg, pBegin, &pData, pCellptr, + iCell+iNew, 1, pCArray + ) ) goto editpage_fail; + } + } + + /* Append cells to the end of the page */ + assert( nCell>=0 ); + pCellptr = &pPg->aCellIdx[nCell*2]; + if( pageInsertArray( + pPg, pBegin, &pData, pCellptr, + iNew+nCell, nNew-nCell, pCArray + ) ) goto editpage_fail; + + pPg->nCell = nNew; + pPg->nOverflow = 0; + + put2byte(&aData[hdr+3], pPg->nCell); + put2byte(&aData[hdr+5], pData - aData); + +#ifdef SQLITE_DEBUG + for(i=0; iapCell[i+iNew]; + int iOff = get2byteAligned(&pPg->aCellIdx[i*2]); + if( SQLITE_WITHIN(pCell, aData, &aData[pPg->pBt->usableSize]) ){ + pCell = &pTmp[pCell - aData]; + } + assert( 0==memcmp(pCell, &aData[iOff], + pCArray->pRef->xCellSize(pCArray->pRef, pCArray->apCell[i+iNew])) ); + } +#endif + + return SQLITE_OK; + editpage_fail: + /* Unable to edit this page. Rebuild it from scratch instead. */ + populateCellCache(pCArray, iNew, nNew); + return rebuildPage(pCArray, iNew, nNew, pPg); +} + + +#ifndef SQLITE_OMIT_QUICKBALANCE +/* +** This version of balance() handles the common special case where +** a new entry is being inserted on the extreme right-end of the +** tree, in other words, when the new entry will become the largest +** entry in the tree. +** +** Instead of trying to balance the 3 right-most leaf pages, just add +** a new page to the right-hand side and put the one new entry in +** that page. This leaves the right side of the tree somewhat +** unbalanced. But odds are that we will be inserting new entries +** at the end soon afterwards so the nearly empty page will quickly +** fill up. On average. +** +** pPage is the leaf page which is the right-most page in the tree. +** pParent is its parent. pPage must have a single overflow entry +** which is also the right-most entry on the page. +** +** The pSpace buffer is used to store a temporary copy of the divider +** cell that will be inserted into pParent. Such a cell consists of a 4 +** byte page number followed by a variable length integer. In other +** words, at most 13 bytes. Hence the pSpace buffer must be at +** least 13 bytes in size. +*/ +static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ + BtShared *const pBt = pPage->pBt; /* B-Tree Database */ + MemPage *pNew; /* Newly allocated page */ + int rc; /* Return Code */ + Pgno pgnoNew; /* Page number of pNew */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + assert( pPage->nOverflow==1 ); + + if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT; /* dbfuzz001.test */ + assert( pPage->nFree>=0 ); + assert( pParent->nFree>=0 ); + + /* Allocate a new page. This page will become the right-sibling of + ** pPage. Make the parent page writable, so that the new divider cell + ** may be inserted. If both these operations are successful, proceed. + */ + rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0); + + if( rc==SQLITE_OK ){ + + u8 *pOut = &pSpace[4]; + u8 *pCell = pPage->apOvfl[0]; + u16 szCell = pPage->xCellSize(pPage, pCell); + u8 *pStop; + CellArray b; + + assert( sqlite3PagerIswriteable(pNew->pDbPage) ); + assert( CORRUPT_DB || pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); + zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF); + b.nCell = 1; + b.pRef = pPage; + b.apCell = &pCell; + b.szCell = &szCell; + b.apEnd[0] = pPage->aDataEnd; + b.ixNx[0] = 2; + rc = rebuildPage(&b, 0, 1, pNew); + if( NEVER(rc) ){ + releasePage(pNew); + return rc; + } + pNew->nFree = pBt->usableSize - pNew->cellOffset - 2 - szCell; + + /* If this is an auto-vacuum database, update the pointer map + ** with entries for the new page, and any pointer from the + ** cell on the page to an overflow page. If either of these + ** operations fails, the return code is set, but the contents + ** of the parent page are still manipulated by thh code below. + ** That is Ok, at this point the parent page is guaranteed to + ** be marked as dirty. Returning an error code will cause a + ** rollback, undoing any changes made to the parent page. + */ + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc); + if( szCell>pNew->minLocal ){ + ptrmapPutOvflPtr(pNew, pNew, pCell, &rc); + } + } + + /* Create a divider cell to insert into pParent. The divider cell + ** consists of a 4-byte page number (the page number of pPage) and + ** a variable length key value (which must be the same value as the + ** largest key on pPage). + ** + ** To find the largest key value on pPage, first find the right-most + ** cell on pPage. The first two fields of this cell are the + ** record-length (a variable length integer at most 32-bits in size) + ** and the key value (a variable length integer, may have any value). + ** The first of the while(...) loops below skips over the record-length + ** field. The second while(...) loop copies the key value from the + ** cell on pPage into the pSpace buffer. + */ + pCell = findCell(pPage, pPage->nCell-1); + pStop = &pCell[9]; + while( (*(pCell++)&0x80) && pCellnCell, pSpace, (int)(pOut-pSpace), + 0, pPage->pgno, &rc); + } + + /* Set the right-child pointer of pParent to point to the new page. */ + put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew); + + /* Release the reference to the new page. */ + releasePage(pNew); + } + + return rc; +} +#endif /* SQLITE_OMIT_QUICKBALANCE */ + +#if 0 +/* +** This function does not contribute anything to the operation of SQLite. +** it is sometimes activated temporarily while debugging code responsible +** for setting pointer-map entries. +*/ +static int ptrmapCheckPages(MemPage **apPage, int nPage){ + int i, j; + for(i=0; ipBt; + assert( pPage->isInit ); + + for(j=0; jnCell; j++){ + CellInfo info; + u8 *z; + + z = findCell(pPage, j); + pPage->xParseCell(pPage, z, &info); + if( info.nLocalpgno && e==PTRMAP_OVERFLOW1 ); + } + if( !pPage->leaf ){ + Pgno child = get4byte(z); + ptrmapGet(pBt, child, &e, &n); + assert( n==pPage->pgno && e==PTRMAP_BTREE ); + } + } + if( !pPage->leaf ){ + Pgno child = get4byte(&pPage->aData[pPage->hdrOffset+8]); + ptrmapGet(pBt, child, &e, &n); + assert( n==pPage->pgno && e==PTRMAP_BTREE ); + } + } + return 1; +} +#endif + +/* +** This function is used to copy the contents of the b-tree node stored +** on page pFrom to page pTo. If page pFrom was not a leaf page, then +** the pointer-map entries for each child page are updated so that the +** parent page stored in the pointer map is page pTo. If pFrom contained +** any cells with overflow page pointers, then the corresponding pointer +** map entries are also updated so that the parent page is page pTo. +** +** If pFrom is currently carrying any overflow cells (entries in the +** MemPage.apOvfl[] array), they are not copied to pTo. +** +** Before returning, page pTo is reinitialized using btreeInitPage(). +** +** The performance of this function is not critical. It is only used by +** the balance_shallower() and balance_deeper() procedures, neither of +** which are called often under normal circumstances. +*/ +static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ + if( (*pRC)==SQLITE_OK ){ + BtShared * const pBt = pFrom->pBt; + u8 * const aFrom = pFrom->aData; + u8 * const aTo = pTo->aData; + int const iFromHdr = pFrom->hdrOffset; + int const iToHdr = ((pTo->pgno==1) ? 100 : 0); + int rc; + int iData; + + + assert( pFrom->isInit ); + assert( pFrom->nFree>=iToHdr ); + assert( get2byte(&aFrom[iFromHdr+5]) <= (int)pBt->usableSize ); + + /* Copy the b-tree node content from page pFrom to page pTo. */ + iData = get2byte(&aFrom[iFromHdr+5]); + memcpy(&aTo[iData], &aFrom[iData], pBt->usableSize-iData); + memcpy(&aTo[iToHdr], &aFrom[iFromHdr], pFrom->cellOffset + 2*pFrom->nCell); + + /* Reinitialize page pTo so that the contents of the MemPage structure + ** match the new data. The initialization of pTo can actually fail under + ** fairly obscure circumstances, even though it is a copy of initialized + ** page pFrom. + */ + pTo->isInit = 0; + rc = btreeInitPage(pTo); + if( rc==SQLITE_OK ) rc = btreeComputeFreeSpace(pTo); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } + + /* If this is an auto-vacuum database, update the pointer-map entries + ** for any b-tree or overflow pages that pTo now contains the pointers to. + */ + if( ISAUTOVACUUM ){ + *pRC = setChildPtrmaps(pTo); + } + } +} + +/* +** This routine redistributes cells on the iParentIdx'th child of pParent +** (hereafter "the page") and up to 2 siblings so that all pages have about the +** same amount of free space. Usually a single sibling on either side of the +** page are used in the balancing, though both siblings might come from one +** side if the page is the first or last child of its parent. If the page +** has fewer than 2 siblings (something which can only happen if the page +** is a root page or a child of a root page) then all available siblings +** participate in the balancing. +** +** The number of siblings of the page might be increased or decreased by +** one or two in an effort to keep pages nearly full but not over full. +** +** Note that when this routine is called, some of the cells on the page +** might not actually be stored in MemPage.aData[]. This can happen +** if the page is overfull. This routine ensures that all cells allocated +** to the page and its siblings fit into MemPage.aData[] before returning. +** +** In the course of balancing the page and its siblings, cells may be +** inserted into or removed from the parent page (pParent). Doing so +** may cause the parent page to become overfull or underfull. If this +** happens, it is the responsibility of the caller to invoke the correct +** balancing routine to fix this problem (see the balance() routine). +** +** If this routine fails for any reason, it might leave the database +** in a corrupted state. So if this routine fails, the database should +** be rolled back. +** +** The third argument to this function, aOvflSpace, is a pointer to a +** buffer big enough to hold one page. If while inserting cells into the parent +** page (pParent) the parent page becomes overfull, this buffer is +** used to store the parent's overflow cells. Because this function inserts +** a maximum of four divider cells into the parent page, and the maximum +** size of a cell stored within an internal node is always less than 1/4 +** of the page-size, the aOvflSpace[] buffer is guaranteed to be large +** enough for all overflow cells. +** +** If aOvflSpace is set to a null pointer, this function returns +** SQLITE_NOMEM. +*/ +static int balance_nonroot( + MemPage *pParent, /* Parent page of siblings being balanced */ + int iParentIdx, /* Index of "the page" in pParent */ + u8 *aOvflSpace, /* page-size bytes of space for parent ovfl */ + int isRoot, /* True if pParent is a root-page */ + int bBulk /* True if this call is part of a bulk load */ +){ + BtShared *pBt; /* The whole database */ + int nMaxCells = 0; /* Allocated size of apCell, szCell, aFrom. */ + int nNew = 0; /* Number of pages in apNew[] */ + int nOld; /* Number of pages in apOld[] */ + int i, j, k; /* Loop counters */ + int nxDiv; /* Next divider slot in pParent->aCell[] */ + int rc = SQLITE_OK; /* The return code */ + u16 leafCorrection; /* 4 if pPage is a leaf. 0 if not */ + int leafData; /* True if pPage is a leaf of a LEAFDATA tree */ + int usableSpace; /* Bytes in pPage beyond the header */ + int pageFlags; /* Value of pPage->aData[0] */ + int iSpace1 = 0; /* First unused byte of aSpace1[] */ + int iOvflSpace = 0; /* First unused byte of aOvflSpace[] */ + int szScratch; /* Size of scratch memory requested */ + MemPage *apOld[NB]; /* pPage and up to two siblings */ + MemPage *apNew[NB+2]; /* pPage and up to NB siblings after balancing */ + u8 *pRight; /* Location in parent of right-sibling pointer */ + u8 *apDiv[NB-1]; /* Divider cells in pParent */ + int cntNew[NB+2]; /* Index in b.paCell[] of cell after i-th page */ + int cntOld[NB+2]; /* Old index in b.apCell[] */ + int szNew[NB+2]; /* Combined size of cells placed on i-th page */ + u8 *aSpace1; /* Space for copies of dividers cells */ + Pgno pgno; /* Temp var to store a page number in */ + u8 abDone[NB+2]; /* True after i'th new page is populated */ + Pgno aPgno[NB+2]; /* Page numbers of new pages before shuffling */ + Pgno aPgOrder[NB+2]; /* Copy of aPgno[] used for sorting pages */ + u16 aPgFlags[NB+2]; /* flags field of new pages before shuffling */ + CellArray b; /* Parsed information on cells being balanced */ + + memset(abDone, 0, sizeof(abDone)); + b.nCell = 0; + b.apCell = 0; + pBt = pParent->pBt; + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + + /* At this point pParent may have at most one overflow cell. And if + ** this overflow cell is present, it must be the cell with + ** index iParentIdx. This scenario comes about when this function + ** is called (indirectly) from sqlite3BtreeDelete(). + */ + assert( pParent->nOverflow==0 || pParent->nOverflow==1 ); + assert( pParent->nOverflow==0 || pParent->aiOvfl[0]==iParentIdx ); + + if( !aOvflSpace ){ + return SQLITE_NOMEM_BKPT; + } + assert( pParent->nFree>=0 ); + + /* Find the sibling pages to balance. Also locate the cells in pParent + ** that divide the siblings. An attempt is made to find NN siblings on + ** either side of pPage. More siblings are taken from one side, however, + ** if there are fewer than NN siblings on the other side. If pParent + ** has NB or fewer children then all children of pParent are taken. + ** + ** This loop also drops the divider cells from the parent page. This + ** way, the remainder of the function does not have to deal with any + ** overflow cells in the parent page, since if any existed they will + ** have already been removed. + */ + i = pParent->nOverflow + pParent->nCell; + if( i<2 ){ + nxDiv = 0; + }else{ + assert( bBulk==0 || bBulk==1 ); + if( iParentIdx==0 ){ + nxDiv = 0; + }else if( iParentIdx==i ){ + nxDiv = i-2+bBulk; + }else{ + nxDiv = iParentIdx-1; + } + i = 2-bBulk; + } + nOld = i+1; + if( (i+nxDiv-pParent->nOverflow)==pParent->nCell ){ + pRight = &pParent->aData[pParent->hdrOffset+8]; + }else{ + pRight = findCell(pParent, i+nxDiv-pParent->nOverflow); + } + pgno = get4byte(pRight); + while( 1 ){ + rc = getAndInitPage(pBt, pgno, &apOld[i], 0, 0); + if( rc ){ + memset(apOld, 0, (i+1)*sizeof(MemPage*)); + goto balance_cleanup; + } + if( apOld[i]->nFree<0 ){ + rc = btreeComputeFreeSpace(apOld[i]); + if( rc ){ + memset(apOld, 0, (i)*sizeof(MemPage*)); + goto balance_cleanup; + } + } + if( (i--)==0 ) break; + + if( pParent->nOverflow && i+nxDiv==pParent->aiOvfl[0] ){ + apDiv[i] = pParent->apOvfl[0]; + pgno = get4byte(apDiv[i]); + szNew[i] = pParent->xCellSize(pParent, apDiv[i]); + pParent->nOverflow = 0; + }else{ + apDiv[i] = findCell(pParent, i+nxDiv-pParent->nOverflow); + pgno = get4byte(apDiv[i]); + szNew[i] = pParent->xCellSize(pParent, apDiv[i]); + + /* Drop the cell from the parent page. apDiv[i] still points to + ** the cell within the parent, even though it has been dropped. + ** This is safe because dropping a cell only overwrites the first + ** four bytes of it, and this function does not need the first + ** four bytes of the divider cell. So the pointer is safe to use + ** later on. + ** + ** But not if we are in secure-delete mode. In secure-delete mode, + ** the dropCell() routine will overwrite the entire cell with zeroes. + ** In this case, temporarily copy the cell into the aOvflSpace[] + ** buffer. It will be copied out again as soon as the aSpace[] buffer + ** is allocated. */ + if( pBt->btsFlags & BTS_FAST_SECURE ){ + int iOff; + + iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData); + if( (iOff+szNew[i])>(int)pBt->usableSize ){ + rc = SQLITE_CORRUPT_BKPT; + memset(apOld, 0, (i+1)*sizeof(MemPage*)); + goto balance_cleanup; + }else{ + memcpy(&aOvflSpace[iOff], apDiv[i], szNew[i]); + apDiv[i] = &aOvflSpace[apDiv[i]-pParent->aData]; + } + } + dropCell(pParent, i+nxDiv-pParent->nOverflow, szNew[i], &rc); + } + } + + /* Make nMaxCells a multiple of 4 in order to preserve 8-byte + ** alignment */ + nMaxCells = nOld*(MX_CELL(pBt) + ArraySize(pParent->apOvfl)); + nMaxCells = (nMaxCells + 3)&~3; + + /* + ** Allocate space for memory structures + */ + szScratch = + nMaxCells*sizeof(u8*) /* b.apCell */ + + nMaxCells*sizeof(u16) /* b.szCell */ + + pBt->pageSize; /* aSpace1 */ + + assert( szScratch<=7*(int)pBt->pageSize ); + b.apCell = sqlite3StackAllocRaw(0, szScratch ); + if( b.apCell==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto balance_cleanup; + } + b.szCell = (u16*)&b.apCell[nMaxCells]; + aSpace1 = (u8*)&b.szCell[nMaxCells]; + assert( EIGHT_BYTE_ALIGNMENT(aSpace1) ); + + /* + ** Load pointers to all cells on sibling pages and the divider cells + ** into the local b.apCell[] array. Make copies of the divider cells + ** into space obtained from aSpace1[]. The divider cells have already + ** been removed from pParent. + ** + ** If the siblings are on leaf pages, then the child pointers of the + ** divider cells are stripped from the cells before they are copied + ** into aSpace1[]. In this way, all cells in b.apCell[] are without + ** child pointers. If siblings are not leaves, then all cell in + ** b.apCell[] include child pointers. Either way, all cells in b.apCell[] + ** are alike. + ** + ** leafCorrection: 4 if pPage is a leaf. 0 if pPage is not a leaf. + ** leafData: 1 if pPage holds key+data and pParent holds only keys. + */ + b.pRef = apOld[0]; + leafCorrection = b.pRef->leaf*4; + leafData = b.pRef->intKeyLeaf; + for(i=0; inCell; + u8 *aData = pOld->aData; + u16 maskPage = pOld->maskPage; + u8 *piCell = aData + pOld->cellOffset; + u8 *piEnd; + VVA_ONLY( int nCellAtStart = b.nCell; ) + + /* Verify that all sibling pages are of the same "type" (table-leaf, + ** table-interior, index-leaf, or index-interior). + */ + if( pOld->aData[0]!=apOld[0]->aData[0] ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + + /* Load b.apCell[] with pointers to all cells in pOld. If pOld + ** contains overflow cells, include them in the b.apCell[] array + ** in the correct spot. + ** + ** Note that when there are multiple overflow cells, it is always the + ** case that they are sequential and adjacent. This invariant arises + ** because multiple overflows can only occurs when inserting divider + ** cells into a parent on a prior balance, and divider cells are always + ** adjacent and are inserted in order. There is an assert() tagged + ** with "NOTE 1" in the overflow cell insertion loop to prove this + ** invariant. + ** + ** This must be done in advance. Once the balance starts, the cell + ** offset section of the btree page will be overwritten and we will no + ** long be able to find the cells if a pointer to each cell is not saved + ** first. + */ + memset(&b.szCell[b.nCell], 0, sizeof(b.szCell[0])*(limit+pOld->nOverflow)); + if( pOld->nOverflow>0 ){ + if( NEVER(limitaiOvfl[0]) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + limit = pOld->aiOvfl[0]; + for(j=0; jnOverflow; k++){ + assert( k==0 || pOld->aiOvfl[k-1]+1==pOld->aiOvfl[k] );/* NOTE 1 */ + b.apCell[b.nCell] = pOld->apOvfl[k]; + b.nCell++; + } + } + piEnd = aData + pOld->cellOffset + 2*pOld->nCell; + while( piCellnCell+pOld->nOverflow) ); + + cntOld[i] = b.nCell; + if( imaxLocal+23 ); + assert( iSpace1 <= (int)pBt->pageSize ); + memcpy(pTemp, apDiv[i], sz); + b.apCell[b.nCell] = pTemp+leafCorrection; + assert( leafCorrection==0 || leafCorrection==4 ); + b.szCell[b.nCell] = b.szCell[b.nCell] - leafCorrection; + if( !pOld->leaf ){ + assert( leafCorrection==0 ); + assert( pOld->hdrOffset==0 ); + /* The right pointer of the child page pOld becomes the left + ** pointer of the divider cell */ + memcpy(b.apCell[b.nCell], &pOld->aData[8], 4); + }else{ + assert( leafCorrection==4 ); + while( b.szCell[b.nCell]<4 ){ + /* Do not allow any cells smaller than 4 bytes. If a smaller cell + ** does exist, pad it with 0x00 bytes. */ + assert( b.szCell[b.nCell]==3 || CORRUPT_DB ); + assert( b.apCell[b.nCell]==&aSpace1[iSpace1-3] || CORRUPT_DB ); + aSpace1[iSpace1++] = 0x00; + b.szCell[b.nCell]++; + } + } + b.nCell++; + } + } + + /* + ** Figure out the number of pages needed to hold all b.nCell cells. + ** Store this number in "k". Also compute szNew[] which is the total + ** size of all cells on the i-th page and cntNew[] which is the index + ** in b.apCell[] of the cell that divides page i from page i+1. + ** cntNew[k] should equal b.nCell. + ** + ** Values computed by this block: + ** + ** k: The total number of sibling pages + ** szNew[i]: Spaced used on the i-th sibling page. + ** cntNew[i]: Index in b.apCell[] and b.szCell[] for the first cell to + ** the right of the i-th sibling page. + ** usableSpace: Number of bytes of space available on each sibling. + ** + */ + usableSpace = pBt->usableSize - 12 + leafCorrection; + for(i=k=0; iaDataEnd; + b.ixNx[k] = cntOld[i]; + if( k && b.ixNx[k]==b.ixNx[k-1] ){ + k--; /* Omit b.ixNx[] entry for child pages with no cells */ + } + if( !leafData ){ + k++; + b.apEnd[k] = pParent->aDataEnd; + b.ixNx[k] = cntOld[i]+1; + } + assert( p->nFree>=0 ); + szNew[i] = usableSpace - p->nFree; + for(j=0; jnOverflow; j++){ + szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); + } + cntNew[i] = cntOld[i]; + } + k = nOld; + for(i=0; iusableSpace ){ + if( i+1>=k ){ + k = i+2; + if( k>NB+2 ){ rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } + szNew[k-1] = 0; + cntNew[k-1] = b.nCell; + } + sz = 2 + cachedCellSize(&b, cntNew[i]-1); + szNew[i] -= sz; + if( !leafData ){ + if( cntNew[i]usableSpace ) break; + szNew[i] += sz; + cntNew[i]++; + if( !leafData ){ + if( cntNew[i]=b.nCell ){ + k = i+1; + }else if( cntNew[i] <= (i>0 ? cntNew[i-1] : 0) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + } + + /* + ** The packing computed by the previous block is biased toward the siblings + ** on the left side (siblings with smaller keys). The left siblings are + ** always nearly full, while the right-most sibling might be nearly empty. + ** The next block of code attempts to adjust the packing of siblings to + ** get a better balance. + ** + ** This adjustment is more than an optimization. The packing above might + ** be so out of balance as to be illegal. For example, the right-most + ** sibling might be completely empty. This adjustment is not optional. + */ + for(i=k-1; i>0; i--){ + int szRight = szNew[i]; /* Size of sibling on the right */ + int szLeft = szNew[i-1]; /* Size of sibling on the left */ + int r; /* Index of right-most cell in left sibling */ + int d; /* Index of first cell to the left of right sibling */ + + r = cntNew[i-1] - 1; + d = r + 1 - leafData; + (void)cachedCellSize(&b, d); + do{ + assert( d szLeft-(b.szCell[r]+(i==k-1?0:2)))){ + break; + } + szRight += b.szCell[d] + 2; + szLeft -= b.szCell[r] + 2; + cntNew[i-1] = r; + r--; + d--; + }while( r>=0 ); + szNew[i] = szRight; + szNew[i-1] = szLeft; + if( cntNew[i-1] <= (i>1 ? cntNew[i-2] : 0) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + } + + /* Sanity check: For a non-corrupt database file one of the follwing + ** must be true: + ** (1) We found one or more cells (cntNew[0])>0), or + ** (2) pPage is a virtual root page. A virtual root page is when + ** the real root page is page 1 and we are the only child of + ** that page. + */ + assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) || CORRUPT_DB); + TRACE(("BALANCE: old: %d(nc=%d) %d(nc=%d) %d(nc=%d)\n", + apOld[0]->pgno, apOld[0]->nCell, + nOld>=2 ? apOld[1]->pgno : 0, nOld>=2 ? apOld[1]->nCell : 0, + nOld>=3 ? apOld[2]->pgno : 0, nOld>=3 ? apOld[2]->nCell : 0 + )); + + /* + ** Allocate k new pages. Reuse old pages where possible. + */ + pageFlags = apOld[0]->aData[0]; + for(i=0; ipDbPage); + nNew++; + if( rc ) goto balance_cleanup; + }else{ + assert( i>0 ); + rc = allocateBtreePage(pBt, &pNew, &pgno, (bBulk ? 1 : pgno), 0); + if( rc ) goto balance_cleanup; + zeroPage(pNew, pageFlags); + apNew[i] = pNew; + nNew++; + cntOld[i] = b.nCell; + + /* Set the pointer-map entry for the new sibling page. */ + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, pNew->pgno, PTRMAP_BTREE, pParent->pgno, &rc); + if( rc!=SQLITE_OK ){ + goto balance_cleanup; + } + } + } + } + + /* + ** Reassign page numbers so that the new pages are in ascending order. + ** This helps to keep entries in the disk file in order so that a scan + ** of the table is closer to a linear scan through the file. That in turn + ** helps the operating system to deliver pages from the disk more rapidly. + ** + ** An O(n^2) insertion sort algorithm is used, but since n is never more + ** than (NB+2) (a small constant), that should not be a problem. + ** + ** When NB==3, this one optimization makes the database about 25% faster + ** for large insertions and deletions. + */ + for(i=0; ipgno; + aPgFlags[i] = apNew[i]->pDbPage->flags; + for(j=0; ji ){ + sqlite3PagerRekey(apNew[iBest]->pDbPage, pBt->nPage+iBest+1, 0); + } + sqlite3PagerRekey(apNew[i]->pDbPage, pgno, aPgFlags[iBest]); + apNew[i]->pgno = pgno; + } + } + + TRACE(("BALANCE: new: %d(%d nc=%d) %d(%d nc=%d) %d(%d nc=%d) " + "%d(%d nc=%d) %d(%d nc=%d)\n", + apNew[0]->pgno, szNew[0], cntNew[0], + nNew>=2 ? apNew[1]->pgno : 0, nNew>=2 ? szNew[1] : 0, + nNew>=2 ? cntNew[1] - cntNew[0] - !leafData : 0, + nNew>=3 ? apNew[2]->pgno : 0, nNew>=3 ? szNew[2] : 0, + nNew>=3 ? cntNew[2] - cntNew[1] - !leafData : 0, + nNew>=4 ? apNew[3]->pgno : 0, nNew>=4 ? szNew[3] : 0, + nNew>=4 ? cntNew[3] - cntNew[2] - !leafData : 0, + nNew>=5 ? apNew[4]->pgno : 0, nNew>=5 ? szNew[4] : 0, + nNew>=5 ? cntNew[4] - cntNew[3] - !leafData : 0 + )); + + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + assert( nNew>=1 && nNew<=ArraySize(apNew) ); + assert( apNew[nNew-1]!=0 ); + put4byte(pRight, apNew[nNew-1]->pgno); + + /* If the sibling pages are not leaves, ensure that the right-child pointer + ** of the right-most new sibling page is set to the value that was + ** originally in the same field of the right-most old sibling page. */ + if( (pageFlags & PTF_LEAF)==0 && nOld!=nNew ){ + MemPage *pOld = (nNew>nOld ? apNew : apOld)[nOld-1]; + memcpy(&apNew[nNew-1]->aData[8], &pOld->aData[8], 4); + } + + /* Make any required updates to pointer map entries associated with + ** cells stored on sibling pages following the balance operation. Pointer + ** map entries associated with divider cells are set by the insertCell() + ** routine. The associated pointer map entries are: + ** + ** a) if the cell contains a reference to an overflow chain, the + ** entry associated with the first page in the overflow chain, and + ** + ** b) if the sibling pages are not leaves, the child page associated + ** with the cell. + ** + ** If the sibling pages are not leaves, then the pointer map entry + ** associated with the right-child of each sibling may also need to be + ** updated. This happens below, after the sibling pages have been + ** populated, not here. + */ + if( ISAUTOVACUUM ){ + MemPage *pOld; + MemPage *pNew = pOld = apNew[0]; + int cntOldNext = pNew->nCell + pNew->nOverflow; + int iNew = 0; + int iOld = 0; + + for(i=0; i=0 && iOldnCell + pOld->nOverflow + !leafData; + } + if( i==cntNew[iNew] ){ + pNew = apNew[++iNew]; + if( !leafData ) continue; + } + + /* Cell pCell is destined for new sibling page pNew. Originally, it + ** was either part of sibling page iOld (possibly an overflow cell), + ** or else the divider cell to the left of sibling page iOld. So, + ** if sibling page iOld had the same page number as pNew, and if + ** pCell really was a part of sibling page iOld (not a divider or + ** overflow cell), we can skip updating the pointer map entries. */ + if( iOld>=nNew + || pNew->pgno!=aPgno[iOld] + || !SQLITE_WITHIN(pCell,pOld->aData,pOld->aDataEnd) + ){ + if( !leafCorrection ){ + ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); + } + if( cachedCellSize(&b,i)>pNew->minLocal ){ + ptrmapPutOvflPtr(pNew, pOld, pCell, &rc); + } + if( rc ) goto balance_cleanup; + } + } + } + + /* Insert new divider cells into pParent. */ + for(i=0; ileaf ){ + memcpy(&pNew->aData[8], pCell, 4); + }else if( leafData ){ + /* If the tree is a leaf-data tree, and the siblings are leaves, + ** then there is no divider cell in b.apCell[]. Instead, the divider + ** cell consists of the integer key for the right-most cell of + ** the sibling-page assembled above only. + */ + CellInfo info; + j--; + pNew->xParseCell(pNew, b.apCell[j], &info); + pCell = pTemp; + sz = 4 + putVarint(&pCell[4], info.nKey); + pTemp = 0; + }else{ + pCell -= 4; + /* Obscure case for non-leaf-data trees: If the cell at pCell was + ** previously stored on a leaf node, and its reported size was 4 + ** bytes, then it may actually be smaller than this + ** (see btreeParseCellPtr(), 4 bytes is the minimum size of + ** any cell). But it is important to pass the correct size to + ** insertCell(), so reparse the cell now. + ** + ** This can only happen for b-trees used to evaluate "IN (SELECT ...)" + ** and WITHOUT ROWID tables with exactly one column which is the + ** primary key. + */ + if( b.szCell[j]==4 ){ + assert(leafCorrection==4); + sz = pParent->xCellSize(pParent, pCell); + } + } + iOvflSpace += sz; + assert( sz<=pBt->maxLocal+23 ); + assert( iOvflSpace <= (int)pBt->pageSize ); + insertCell(pParent, nxDiv+i, pCell, sz, pTemp, pNew->pgno, &rc); + if( rc!=SQLITE_OK ) goto balance_cleanup; + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + } + + /* Now update the actual sibling pages. The order in which they are updated + ** is important, as this code needs to avoid disrupting any page from which + ** cells may still to be read. In practice, this means: + ** + ** (1) If cells are moving left (from apNew[iPg] to apNew[iPg-1]) + ** then it is not safe to update page apNew[iPg] until after + ** the left-hand sibling apNew[iPg-1] has been updated. + ** + ** (2) If cells are moving right (from apNew[iPg] to apNew[iPg+1]) + ** then it is not safe to update page apNew[iPg] until after + ** the right-hand sibling apNew[iPg+1] has been updated. + ** + ** If neither of the above apply, the page is safe to update. + ** + ** The iPg value in the following loop starts at nNew-1 goes down + ** to 0, then back up to nNew-1 again, thus making two passes over + ** the pages. On the initial downward pass, only condition (1) above + ** needs to be tested because (2) will always be true from the previous + ** step. On the upward pass, both conditions are always true, so the + ** upwards pass simply processes pages that were missed on the downward + ** pass. + */ + for(i=1-nNew; i=0 && iPg=0 /* On the upwards pass, or... */ + || cntOld[iPg-1]>=cntNew[iPg-1] /* Condition (1) is true */ + ){ + int iNew; + int iOld; + int nNewCell; + + /* Verify condition (1): If cells are moving left, update iPg + ** only after iPg-1 has already been updated. */ + assert( iPg==0 || cntOld[iPg-1]>=cntNew[iPg-1] || abDone[iPg-1] ); + + /* Verify condition (2): If cells are moving right, update iPg + ** only after iPg+1 has already been updated. */ + assert( cntNew[iPg]>=cntOld[iPg] || abDone[iPg+1] ); + + if( iPg==0 ){ + iNew = iOld = 0; + nNewCell = cntNew[0]; + }else{ + iOld = iPgnFree = usableSpace-szNew[iPg]; + assert( apNew[iPg]->nOverflow==0 ); + assert( apNew[iPg]->nCell==nNewCell ); + } + } + + /* All pages have been processed exactly once */ + assert( memcmp(abDone, "\01\01\01\01\01", nNew)==0 ); + + assert( nOld>0 ); + assert( nNew>0 ); + + if( isRoot && pParent->nCell==0 && pParent->hdrOffset<=apNew[0]->nFree ){ + /* The root page of the b-tree now contains no cells. The only sibling + ** page is the right-child of the parent. Copy the contents of the + ** child page into the parent, decreasing the overall height of the + ** b-tree structure by one. This is described as the "balance-shallower" + ** sub-algorithm in some documentation. + ** + ** If this is an auto-vacuum database, the call to copyNodeContent() + ** sets all pointer-map entries corresponding to database image pages + ** for which the pointer is stored within the content being copied. + ** + ** It is critical that the child page be defragmented before being + ** copied into the parent, because if the parent is page 1 then it will + ** by smaller than the child due to the database header, and so all the + ** free space needs to be up front. + */ + assert( nNew==1 || CORRUPT_DB ); + rc = defragmentPage(apNew[0], -1); + testcase( rc!=SQLITE_OK ); + assert( apNew[0]->nFree == + (get2byteNotZero(&apNew[0]->aData[5]) - apNew[0]->cellOffset + - apNew[0]->nCell*2) + || rc!=SQLITE_OK + ); + copyNodeContent(apNew[0], pParent, &rc); + freePage(apNew[0], &rc); + }else if( ISAUTOVACUUM && !leafCorrection ){ + /* Fix the pointer map entries associated with the right-child of each + ** sibling page. All other pointer map entries have already been taken + ** care of. */ + for(i=0; iaData[8]); + ptrmapPut(pBt, key, PTRMAP_BTREE, apNew[i]->pgno, &rc); + } + } + + assert( pParent->isInit ); + TRACE(("BALANCE: finished: old=%d new=%d cells=%d\n", + nOld, nNew, b.nCell)); + + /* Free any old pages that were not reused as new pages. + */ + for(i=nNew; iisInit ){ + /* The ptrmapCheckPages() contains assert() statements that verify that + ** all pointer map pages are set correctly. This is helpful while + ** debugging. This is usually disabled because a corrupt database may + ** cause an assert() statement to fail. */ + ptrmapCheckPages(apNew, nNew); + ptrmapCheckPages(&pParent, 1); + } +#endif + + /* + ** Cleanup before returning. + */ +balance_cleanup: + sqlite3StackFree(0, b.apCell); + for(i=0; ipBt; /* The BTree */ + + assert( pRoot->nOverflow>0 ); + assert( sqlite3_mutex_held(pBt->mutex) ); + + /* Make pRoot, the root page of the b-tree, writable. Allocate a new + ** page that will become the new right-child of pPage. Copy the contents + ** of the node stored on pRoot into the new child page. + */ + rc = sqlite3PagerWrite(pRoot->pDbPage); + if( rc==SQLITE_OK ){ + rc = allocateBtreePage(pBt,&pChild,&pgnoChild,pRoot->pgno,0); + copyNodeContent(pRoot, pChild, &rc); + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, pgnoChild, PTRMAP_BTREE, pRoot->pgno, &rc); + } + } + if( rc ){ + *ppChild = 0; + releasePage(pChild); + return rc; + } + assert( sqlite3PagerIswriteable(pChild->pDbPage) ); + assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); + assert( pChild->nCell==pRoot->nCell || CORRUPT_DB ); + + TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno)); + + /* Copy the overflow cells from pRoot to pChild */ + memcpy(pChild->aiOvfl, pRoot->aiOvfl, + pRoot->nOverflow*sizeof(pRoot->aiOvfl[0])); + memcpy(pChild->apOvfl, pRoot->apOvfl, + pRoot->nOverflow*sizeof(pRoot->apOvfl[0])); + pChild->nOverflow = pRoot->nOverflow; + + /* Zero the contents of pRoot. Then install pChild as the right-child. */ + zeroPage(pRoot, pChild->aData[0] & ~PTF_LEAF); + put4byte(&pRoot->aData[pRoot->hdrOffset+8], pgnoChild); + + *ppChild = pChild; + return SQLITE_OK; +} + +/* +** Return SQLITE_CORRUPT if any cursor other than pCur is currently valid +** on the same B-tree as pCur. +** +** This can if a database is corrupt with two or more SQL tables +** pointing to the same b-tree. If an insert occurs on one SQL table +** and causes a BEFORE TRIGGER to do a secondary insert on the other SQL +** table linked to the same b-tree. If the secondary insert causes a +** rebalance, that can change content out from under the cursor on the +** first SQL table, violating invariants on the first insert. +*/ +static int anotherValidCursor(BtCursor *pCur){ + BtCursor *pOther; + for(pOther=pCur->pBt->pCursor; pOther; pOther=pOther->pNext){ + if( pOther!=pCur + && pOther->eState==CURSOR_VALID + && pOther->pPage==pCur->pPage + ){ + return SQLITE_CORRUPT_BKPT; + } + } + return SQLITE_OK; +} + +/* +** The page that pCur currently points to has just been modified in +** some way. This function figures out if this modification means the +** tree needs to be balanced, and if so calls the appropriate balancing +** routine. Balancing routines are: +** +** balance_quick() +** balance_deeper() +** balance_nonroot() +*/ +static int balance(BtCursor *pCur){ + int rc = SQLITE_OK; + const int nMin = pCur->pBt->usableSize * 2 / 3; + u8 aBalanceQuickSpace[13]; + u8 *pFree = 0; + + VVA_ONLY( int balance_quick_called = 0 ); + VVA_ONLY( int balance_deeper_called = 0 ); + + do { + int iPage; + MemPage *pPage = pCur->pPage; + + if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; + if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ + break; + }else if( (iPage = pCur->iPage)==0 ){ + if( pPage->nOverflow && (rc = anotherValidCursor(pCur))==SQLITE_OK ){ + /* The root page of the b-tree is overfull. In this case call the + ** balance_deeper() function to create a new child for the root-page + ** and copy the current contents of the root-page to it. The + ** next iteration of the do-loop will balance the child page. + */ + assert( balance_deeper_called==0 ); + VVA_ONLY( balance_deeper_called++ ); + rc = balance_deeper(pPage, &pCur->apPage[1]); + if( rc==SQLITE_OK ){ + pCur->iPage = 1; + pCur->ix = 0; + pCur->aiIdx[0] = 0; + pCur->apPage[0] = pPage; + pCur->pPage = pCur->apPage[1]; + assert( pCur->pPage->nOverflow ); + } + }else{ + break; + } + }else{ + MemPage * const pParent = pCur->apPage[iPage-1]; + int const iIdx = pCur->aiIdx[iPage-1]; + + rc = sqlite3PagerWrite(pParent->pDbPage); + if( rc==SQLITE_OK && pParent->nFree<0 ){ + rc = btreeComputeFreeSpace(pParent); + } + if( rc==SQLITE_OK ){ +#ifndef SQLITE_OMIT_QUICKBALANCE + if( pPage->intKeyLeaf + && pPage->nOverflow==1 + && pPage->aiOvfl[0]==pPage->nCell + && pParent->pgno!=1 + && pParent->nCell==iIdx + ){ + /* Call balance_quick() to create a new sibling of pPage on which + ** to store the overflow cell. balance_quick() inserts a new cell + ** into pParent, which may cause pParent overflow. If this + ** happens, the next iteration of the do-loop will balance pParent + ** use either balance_nonroot() or balance_deeper(). Until this + ** happens, the overflow cell is stored in the aBalanceQuickSpace[] + ** buffer. + ** + ** The purpose of the following assert() is to check that only a + ** single call to balance_quick() is made for each call to this + ** function. If this were not verified, a subtle bug involving reuse + ** of the aBalanceQuickSpace[] might sneak in. + */ + assert( balance_quick_called==0 ); + VVA_ONLY( balance_quick_called++ ); + rc = balance_quick(pParent, pPage, aBalanceQuickSpace); + }else +#endif + { + /* In this case, call balance_nonroot() to redistribute cells + ** between pPage and up to 2 of its sibling pages. This involves + ** modifying the contents of pParent, which may cause pParent to + ** become overfull or underfull. The next iteration of the do-loop + ** will balance the parent page to correct this. + ** + ** If the parent page becomes overfull, the overflow cell or cells + ** are stored in the pSpace buffer allocated immediately below. + ** A subsequent iteration of the do-loop will deal with this by + ** calling balance_nonroot() (balance_deeper() may be called first, + ** but it doesn't deal with overflow cells - just moves them to a + ** different page). Once this subsequent call to balance_nonroot() + ** has completed, it is safe to release the pSpace buffer used by + ** the previous call, as the overflow cell data will have been + ** copied either into the body of a database page or into the new + ** pSpace buffer passed to the latter call to balance_nonroot(). + */ + u8 *pSpace = sqlite3PageMalloc(pCur->pBt->pageSize); + rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1, + pCur->hints&BTREE_BULKLOAD); + if( pFree ){ + /* If pFree is not NULL, it points to the pSpace buffer used + ** by a previous call to balance_nonroot(). Its contents are + ** now stored either on real database pages or within the + ** new pSpace buffer, so it may be safely freed here. */ + sqlite3PageFree(pFree); + } + + /* The pSpace buffer will be freed after the next call to + ** balance_nonroot(), or just before this function returns, whichever + ** comes first. */ + pFree = pSpace; + } + } + + pPage->nOverflow = 0; + + /* The next iteration of the do-loop balances the parent page. */ + releasePage(pPage); + pCur->iPage--; + assert( pCur->iPage>=0 ); + pCur->pPage = pCur->apPage[pCur->iPage]; + } + }while( rc==SQLITE_OK ); + + if( pFree ){ + sqlite3PageFree(pFree); + } + return rc; +} + +/* Overwrite content from pX into pDest. Only do the write if the +** content is different from what is already there. +*/ +static int btreeOverwriteContent( + MemPage *pPage, /* MemPage on which writing will occur */ + u8 *pDest, /* Pointer to the place to start writing */ + const BtreePayload *pX, /* Source of data to write */ + int iOffset, /* Offset of first byte to write */ + int iAmt /* Number of bytes to be written */ +){ + int nData = pX->nData - iOffset; + if( nData<=0 ){ + /* Overwritting with zeros */ + int i; + for(i=0; ipDbPage); + if( rc ) return rc; + memset(pDest + i, 0, iAmt - i); + } + }else{ + if( nDatapData) + iOffset, iAmt)!=0 ){ + int rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ) return rc; + /* In a corrupt database, it is possible for the source and destination + ** buffers to overlap. This is harmless since the database is already + ** corrupt but it does cause valgrind and ASAN warnings. So use + ** memmove(). */ + memmove(pDest, ((u8*)pX->pData) + iOffset, iAmt); + } + } + return SQLITE_OK; +} + +/* +** Overwrite the cell that cursor pCur is pointing to with fresh content +** contained in pX. +*/ +static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){ + int iOffset; /* Next byte of pX->pData to write */ + int nTotal = pX->nData + pX->nZero; /* Total bytes of to write */ + int rc; /* Return code */ + MemPage *pPage = pCur->pPage; /* Page being written */ + BtShared *pBt; /* Btree */ + Pgno ovflPgno; /* Next overflow page to write */ + u32 ovflPageSize; /* Size to write on overflow page */ + + if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd + || pCur->info.pPayload < pPage->aData + pPage->cellOffset + ){ + return SQLITE_CORRUPT_BKPT; + } + /* Overwrite the local portion first */ + rc = btreeOverwriteContent(pPage, pCur->info.pPayload, pX, + 0, pCur->info.nLocal); + if( rc ) return rc; + if( pCur->info.nLocal==nTotal ) return SQLITE_OK; + + /* Now overwrite the overflow pages */ + iOffset = pCur->info.nLocal; + assert( nTotal>=0 ); + assert( iOffset>=0 ); + ovflPgno = get4byte(pCur->info.pPayload + iOffset); + pBt = pPage->pBt; + ovflPageSize = pBt->usableSize - 4; + do{ + rc = btreeGetPage(pBt, ovflPgno, &pPage, 0); + if( rc ) return rc; + if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + if( iOffset+ovflPageSize<(u32)nTotal ){ + ovflPgno = get4byte(pPage->aData); + }else{ + ovflPageSize = nTotal - iOffset; + } + rc = btreeOverwriteContent(pPage, pPage->aData+4, pX, + iOffset, ovflPageSize); + } + sqlite3PagerUnref(pPage->pDbPage); + if( rc ) return rc; + iOffset += ovflPageSize; + }while( iOffset0 then pCur points to a cell +** that is larger than (pKey,nKey). +** +** If seekResult==0, that means pCur is pointing at some unknown location. +** In that case, this routine must seek the cursor to the correct insertion +** point for (pKey,nKey) before doing the insertion. For index btrees, +** if pX->nMem is non-zero, then pX->aMem contains pointers to the unpacked +** key values and pX->aMem can be used instead of pX->pKey to avoid having +** to decode the key. +*/ +SQLITE_PRIVATE int sqlite3BtreeInsert( + BtCursor *pCur, /* Insert data into the table of this cursor */ + const BtreePayload *pX, /* Content of the row to be inserted */ + int flags, /* True if this is likely an append */ + int seekResult /* Result of prior MovetoUnpacked() call */ +){ + int rc; + int loc = seekResult; /* -1: before desired location +1: after */ + int szNew = 0; + int idx; + MemPage *pPage; + Btree *p = pCur->pBtree; + BtShared *pBt = p->pBt; + unsigned char *oldCell; + unsigned char *newCell = 0; + + assert( (flags & (BTREE_SAVEPOSITION|BTREE_APPEND))==flags ); + + if( pCur->eState==CURSOR_FAULT ){ + assert( pCur->skipNext!=SQLITE_OK ); + return pCur->skipNext; + } + + assert( cursorOwnsBtShared(pCur) ); + assert( (pCur->curFlags & BTCF_WriteFlag)!=0 + && pBt->inTransaction==TRANS_WRITE + && (pBt->btsFlags & BTS_READ_ONLY)==0 ); + assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); + + /* Assert that the caller has been consistent. If this cursor was opened + ** expecting an index b-tree, then the caller should be inserting blob + ** keys with no associated data. If the cursor was opened expecting an + ** intkey table, the caller should be inserting integer keys with a + ** blob of associated data. */ + assert( (pX->pKey==0)==(pCur->pKeyInfo==0) ); + + /* Save the positions of any other cursors open on this table. + ** + ** In some cases, the call to btreeMoveto() below is a no-op. For + ** example, when inserting data into a table with auto-generated integer + ** keys, the VDBE layer invokes sqlite3BtreeLast() to figure out the + ** integer key to use. It then calls this function to actually insert the + ** data into the intkey B-Tree. In this case btreeMoveto() recognizes + ** that the cursor is already where it needs to be and returns without + ** doing any work. To avoid thwarting these optimizations, it is important + ** not to clear the cursor here. + */ + if( pCur->curFlags & BTCF_Multiple ){ + rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); + if( rc ) return rc; + } + + if( pCur->pKeyInfo==0 ){ + assert( pX->pKey==0 ); + /* If this is an insert into a table b-tree, invalidate any incrblob + ** cursors open on the row being replaced */ + invalidateIncrblobCursors(p, pCur->pgnoRoot, pX->nKey, 0); + + /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing + ** to a row with the same key as the new entry being inserted. + */ +#ifdef SQLITE_DEBUG + if( flags & BTREE_SAVEPOSITION ){ + assert( pCur->curFlags & BTCF_ValidNKey ); + assert( pX->nKey==pCur->info.nKey ); + assert( loc==0 ); + } +#endif + + /* On the other hand, BTREE_SAVEPOSITION==0 does not imply + ** that the cursor is not pointing to a row to be overwritten. + ** So do a complete check. + */ + if( (pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey==pCur->info.nKey ){ + /* The cursor is pointing to the entry that is to be + ** overwritten */ + assert( pX->nData>=0 && pX->nZero>=0 ); + if( pCur->info.nSize!=0 + && pCur->info.nPayload==(u32)pX->nData+pX->nZero + ){ + /* New entry is the same size as the old. Do an overwrite */ + return btreeOverwriteCell(pCur, pX); + } + assert( loc==0 ); + }else if( loc==0 ){ + /* The cursor is *not* pointing to the cell to be overwritten, nor + ** to an adjacent cell. Move the cursor so that it is pointing either + ** to the cell to be overwritten or an adjacent cell. + */ + rc = sqlite3BtreeMovetoUnpacked(pCur, 0, pX->nKey, flags!=0, &loc); + if( rc ) return rc; + } + }else{ + /* This is an index or a WITHOUT ROWID table */ + + /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing + ** to a row with the same key as the new entry being inserted. + */ + assert( (flags & BTREE_SAVEPOSITION)==0 || loc==0 ); + + /* If the cursor is not already pointing either to the cell to be + ** overwritten, or if a new cell is being inserted, if the cursor is + ** not pointing to an immediately adjacent cell, then move the cursor + ** so that it does. + */ + if( loc==0 && (flags & BTREE_SAVEPOSITION)==0 ){ + if( pX->nMem ){ + UnpackedRecord r; + r.pKeyInfo = pCur->pKeyInfo; + r.aMem = pX->aMem; + r.nField = pX->nMem; + r.default_rc = 0; + r.errCode = 0; + r.r1 = 0; + r.r2 = 0; + r.eqSeen = 0; + rc = sqlite3BtreeMovetoUnpacked(pCur, &r, 0, flags!=0, &loc); + }else{ + rc = btreeMoveto(pCur, pX->pKey, pX->nKey, flags!=0, &loc); + } + if( rc ) return rc; + } + + /* If the cursor is currently pointing to an entry to be overwritten + ** and the new content is the same as as the old, then use the + ** overwrite optimization. + */ + if( loc==0 ){ + getCellInfo(pCur); + if( pCur->info.nKey==pX->nKey ){ + BtreePayload x2; + x2.pData = pX->pKey; + x2.nData = pX->nKey; + x2.nZero = 0; + return btreeOverwriteCell(pCur, &x2); + } + } + + } + assert( pCur->eState==CURSOR_VALID + || (pCur->eState==CURSOR_INVALID && loc) + || CORRUPT_DB ); + + pPage = pCur->pPage; + assert( pPage->intKey || pX->nKey>=0 ); + assert( pPage->leaf || !pPage->intKey ); + if( pPage->nFree<0 ){ + rc = btreeComputeFreeSpace(pPage); + if( rc ) return rc; + } + + TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", + pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, + loc==0 ? "overwrite" : "new entry")); + assert( pPage->isInit ); + newCell = pBt->pTmpSpace; + assert( newCell!=0 ); + rc = fillInCell(pPage, newCell, pX, &szNew); + if( rc ) goto end_insert; + assert( szNew==pPage->xCellSize(pPage, newCell) ); + assert( szNew <= MX_CELL_SIZE(pBt) ); + idx = pCur->ix; + if( loc==0 ){ + CellInfo info; + assert( idxnCell ); + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ){ + goto end_insert; + } + oldCell = findCell(pPage, idx); + if( !pPage->leaf ){ + memcpy(newCell, oldCell, 4); + } + rc = clearCell(pPage, oldCell, &info); + testcase( pCur->curFlags & BTCF_ValidOvfl ); + invalidateOverflowCache(pCur); + if( info.nSize==szNew && info.nLocal==info.nPayload + && (!ISAUTOVACUUM || szNewminLocal) + ){ + /* Overwrite the old cell with the new if they are the same size. + ** We could also try to do this if the old cell is smaller, then add + ** the leftover space to the free list. But experiments show that + ** doing that is no faster then skipping this optimization and just + ** calling dropCell() and insertCell(). + ** + ** This optimization cannot be used on an autovacuum database if the + ** new entry uses overflow pages, as the insertCell() call below is + ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry. */ + assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */ + if( oldCell < pPage->aData+pPage->hdrOffset+10 ){ + return SQLITE_CORRUPT_BKPT; + } + if( oldCell+szNew > pPage->aDataEnd ){ + return SQLITE_CORRUPT_BKPT; + } + memcpy(oldCell, newCell, szNew); + return SQLITE_OK; + } + dropCell(pPage, idx, info.nSize, &rc); + if( rc ) goto end_insert; + }else if( loc<0 && pPage->nCell>0 ){ + assert( pPage->leaf ); + idx = ++pCur->ix; + pCur->curFlags &= ~BTCF_ValidNKey; + }else{ + assert( pPage->leaf ); + } + insertCell(pPage, idx, newCell, szNew, 0, 0, &rc); + assert( pPage->nOverflow==0 || rc==SQLITE_OK ); + assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 ); + + /* If no error has occurred and pPage has an overflow cell, call balance() + ** to redistribute the cells within the tree. Since balance() may move + ** the cursor, zero the BtCursor.info.nSize and BTCF_ValidNKey + ** variables. + ** + ** Previous versions of SQLite called moveToRoot() to move the cursor + ** back to the root page as balance() used to invalidate the contents + ** of BtCursor.apPage[] and BtCursor.aiIdx[]. Instead of doing that, + ** set the cursor state to "invalid". This makes common insert operations + ** slightly faster. + ** + ** There is a subtle but important optimization here too. When inserting + ** multiple records into an intkey b-tree using a single cursor (as can + ** happen while processing an "INSERT INTO ... SELECT" statement), it + ** is advantageous to leave the cursor pointing to the last entry in + ** the b-tree if possible. If the cursor is left pointing to the last + ** entry in the table, and the next row inserted has an integer key + ** larger than the largest existing key, it is possible to insert the + ** row without seeking the cursor. This can be a big performance boost. + */ + pCur->info.nSize = 0; + if( pPage->nOverflow ){ + assert( rc==SQLITE_OK ); + pCur->curFlags &= ~(BTCF_ValidNKey); + rc = balance(pCur); + + /* Must make sure nOverflow is reset to zero even if the balance() + ** fails. Internal data structure corruption will result otherwise. + ** Also, set the cursor state to invalid. This stops saveCursorPosition() + ** from trying to save the current position of the cursor. */ + pCur->pPage->nOverflow = 0; + pCur->eState = CURSOR_INVALID; + if( (flags & BTREE_SAVEPOSITION) && rc==SQLITE_OK ){ + btreeReleaseAllCursorPages(pCur); + if( pCur->pKeyInfo ){ + assert( pCur->pKey==0 ); + pCur->pKey = sqlite3Malloc( pX->nKey ); + if( pCur->pKey==0 ){ + rc = SQLITE_NOMEM; + }else{ + memcpy(pCur->pKey, pX->pKey, pX->nKey); + } + } + pCur->eState = CURSOR_REQUIRESEEK; + pCur->nKey = pX->nKey; + } + } + assert( pCur->iPage<0 || pCur->pPage->nOverflow==0 ); + +end_insert: + return rc; +} + +/* +** Delete the entry that the cursor is pointing to. +** +** If the BTREE_SAVEPOSITION bit of the flags parameter is zero, then +** the cursor is left pointing at an arbitrary location after the delete. +** But if that bit is set, then the cursor is left in a state such that +** the next call to BtreeNext() or BtreePrev() moves it to the same row +** as it would have been on if the call to BtreeDelete() had been omitted. +** +** The BTREE_AUXDELETE bit of flags indicates that is one of several deletes +** associated with a single table entry and its indexes. Only one of those +** deletes is considered the "primary" delete. The primary delete occurs +** on a cursor that is not a BTREE_FORDELETE cursor. All but one delete +** operation on non-FORDELETE cursors is tagged with the AUXDELETE flag. +** The BTREE_AUXDELETE bit is a hint that is not used by this implementation, +** but which might be used by alternative storage engines. +*/ +SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ + Btree *p = pCur->pBtree; + BtShared *pBt = p->pBt; + int rc; /* Return code */ + MemPage *pPage; /* Page to delete cell from */ + unsigned char *pCell; /* Pointer to cell to delete */ + int iCellIdx; /* Index of cell to delete */ + int iCellDepth; /* Depth of node containing pCell */ + CellInfo info; /* Size of the cell being deleted */ + int bSkipnext = 0; /* Leaf cursor in SKIPNEXT state */ + u8 bPreserve = flags & BTREE_SAVEPOSITION; /* Keep cursor valid */ + + assert( cursorOwnsBtShared(pCur) ); + assert( pBt->inTransaction==TRANS_WRITE ); + assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); + assert( pCur->curFlags & BTCF_WriteFlag ); + assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); + assert( !hasReadConflicts(p, pCur->pgnoRoot) ); + assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 ); + if( pCur->eState==CURSOR_REQUIRESEEK ){ + rc = btreeRestoreCursorPosition(pCur); + if( rc ) return rc; + } + assert( pCur->eState==CURSOR_VALID ); + + iCellDepth = pCur->iPage; + iCellIdx = pCur->ix; + pPage = pCur->pPage; + pCell = findCell(pPage, iCellIdx); + if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ) return SQLITE_CORRUPT; + + /* If the bPreserve flag is set to true, then the cursor position must + ** be preserved following this delete operation. If the current delete + ** will cause a b-tree rebalance, then this is done by saving the cursor + ** key and leaving the cursor in CURSOR_REQUIRESEEK state before + ** returning. + ** + ** Or, if the current delete will not cause a rebalance, then the cursor + ** will be left in CURSOR_SKIPNEXT state pointing to the entry immediately + ** before or after the deleted entry. In this case set bSkipnext to true. */ + if( bPreserve ){ + if( !pPage->leaf + || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) + || pPage->nCell==1 /* See dbfuzz001.test for a test case */ + ){ + /* A b-tree rebalance will be required after deleting this entry. + ** Save the cursor key. */ + rc = saveCursorKey(pCur); + if( rc ) return rc; + }else{ + bSkipnext = 1; + } + } + + /* If the page containing the entry to delete is not a leaf page, move + ** the cursor to the largest entry in the tree that is smaller than + ** the entry being deleted. This cell will replace the cell being deleted + ** from the internal node. The 'previous' entry is used for this instead + ** of the 'next' entry, as the previous entry is always a part of the + ** sub-tree headed by the child page of the cell being deleted. This makes + ** balancing the tree following the delete operation easier. */ + if( !pPage->leaf ){ + rc = sqlite3BtreePrevious(pCur, 0); + assert( rc!=SQLITE_DONE ); + if( rc ) return rc; + } + + /* Save the positions of any other cursors open on this table before + ** making any modifications. */ + if( pCur->curFlags & BTCF_Multiple ){ + rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); + if( rc ) return rc; + } + + /* If this is a delete operation to remove a row from a table b-tree, + ** invalidate any incrblob cursors open on the row being deleted. */ + if( pCur->pKeyInfo==0 ){ + invalidateIncrblobCursors(p, pCur->pgnoRoot, pCur->info.nKey, 0); + } + + /* Make the page containing the entry to be deleted writable. Then free any + ** overflow pages associated with the entry and finally remove the cell + ** itself from within the page. */ + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ) return rc; + rc = clearCell(pPage, pCell, &info); + dropCell(pPage, iCellIdx, info.nSize, &rc); + if( rc ) return rc; + + /* If the cell deleted was not located on a leaf page, then the cursor + ** is currently pointing to the largest entry in the sub-tree headed + ** by the child-page of the cell that was just deleted from an internal + ** node. The cell from the leaf node needs to be moved to the internal + ** node to replace the deleted cell. */ + if( !pPage->leaf ){ + MemPage *pLeaf = pCur->pPage; + int nCell; + Pgno n; + unsigned char *pTmp; + + if( pLeaf->nFree<0 ){ + rc = btreeComputeFreeSpace(pLeaf); + if( rc ) return rc; + } + if( iCellDepthiPage-1 ){ + n = pCur->apPage[iCellDepth+1]->pgno; + }else{ + n = pCur->pPage->pgno; + } + pCell = findCell(pLeaf, pLeaf->nCell-1); + if( pCell<&pLeaf->aData[4] ) return SQLITE_CORRUPT_BKPT; + nCell = pLeaf->xCellSize(pLeaf, pCell); + assert( MX_CELL_SIZE(pBt) >= nCell ); + pTmp = pBt->pTmpSpace; + assert( pTmp!=0 ); + rc = sqlite3PagerWrite(pLeaf->pDbPage); + if( rc==SQLITE_OK ){ + insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc); + } + dropCell(pLeaf, pLeaf->nCell-1, nCell, &rc); + if( rc ) return rc; + } + + /* Balance the tree. If the entry deleted was located on a leaf page, + ** then the cursor still points to that page. In this case the first + ** call to balance() repairs the tree, and the if(...) condition is + ** never true. + ** + ** Otherwise, if the entry deleted was on an internal node page, then + ** pCur is pointing to the leaf page from which a cell was removed to + ** replace the cell deleted from the internal node. This is slightly + ** tricky as the leaf node may be underfull, and the internal node may + ** be either under or overfull. In this case run the balancing algorithm + ** on the leaf node first. If the balance proceeds far enough up the + ** tree that we can be sure that any problem in the internal node has + ** been corrected, so be it. Otherwise, after balancing the leaf node, + ** walk the cursor up the tree to the internal node and balance it as + ** well. */ + rc = balance(pCur); + if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){ + releasePageNotNull(pCur->pPage); + pCur->iPage--; + while( pCur->iPage>iCellDepth ){ + releasePage(pCur->apPage[pCur->iPage--]); + } + pCur->pPage = pCur->apPage[pCur->iPage]; + rc = balance(pCur); + } + + if( rc==SQLITE_OK ){ + if( bSkipnext ){ + assert( bPreserve && (pCur->iPage==iCellDepth || CORRUPT_DB) ); + assert( pPage==pCur->pPage || CORRUPT_DB ); + assert( (pPage->nCell>0 || CORRUPT_DB) && iCellIdx<=pPage->nCell ); + pCur->eState = CURSOR_SKIPNEXT; + if( iCellIdx>=pPage->nCell ){ + pCur->skipNext = -1; + pCur->ix = pPage->nCell-1; + }else{ + pCur->skipNext = 1; + } + }else{ + rc = moveToRoot(pCur); + if( bPreserve ){ + btreeReleaseAllCursorPages(pCur); + pCur->eState = CURSOR_REQUIRESEEK; + } + if( rc==SQLITE_EMPTY ) rc = SQLITE_OK; + } + } + return rc; +} + +/* +** Create a new BTree table. Write into *piTable the page +** number for the root page of the new table. +** +** The type of type is determined by the flags parameter. Only the +** following values of flags are currently in use. Other values for +** flags might not work: +** +** BTREE_INTKEY|BTREE_LEAFDATA Used for SQL tables with rowid keys +** BTREE_ZERODATA Used for SQL indices +*/ +static int btreeCreateTable(Btree *p, int *piTable, int createTabFlags){ + BtShared *pBt = p->pBt; + MemPage *pRoot; + Pgno pgnoRoot; + int rc; + int ptfFlags; /* Page-type flage for the root page of new table */ + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( pBt->inTransaction==TRANS_WRITE ); + assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); + +#ifdef SQLITE_OMIT_AUTOVACUUM + rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); + if( rc ){ + return rc; + } +#else + if( pBt->autoVacuum ){ + Pgno pgnoMove; /* Move a page here to make room for the root-page */ + MemPage *pPageMove; /* The page to move to. */ + + /* Creating a new table may probably require moving an existing database + ** to make room for the new tables root page. In case this page turns + ** out to be an overflow page, delete all overflow page-map caches + ** held by open cursors. + */ + invalidateAllOverflowCache(pBt); + + /* Read the value of meta[3] from the database to determine where the + ** root page of the new table should go. meta[3] is the largest root-page + ** created so far, so the new root-page is (meta[3]+1). + */ + sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &pgnoRoot); + pgnoRoot++; + + /* The new root-page may not be allocated on a pointer-map page, or the + ** PENDING_BYTE page. + */ + while( pgnoRoot==PTRMAP_PAGENO(pBt, pgnoRoot) || + pgnoRoot==PENDING_BYTE_PAGE(pBt) ){ + pgnoRoot++; + } + assert( pgnoRoot>=3 || CORRUPT_DB ); + testcase( pgnoRoot<3 ); + + /* Allocate a page. The page that currently resides at pgnoRoot will + ** be moved to the allocated page (unless the allocated page happens + ** to reside at pgnoRoot). + */ + rc = allocateBtreePage(pBt, &pPageMove, &pgnoMove, pgnoRoot, BTALLOC_EXACT); + if( rc!=SQLITE_OK ){ + return rc; + } + + if( pgnoMove!=pgnoRoot ){ + /* pgnoRoot is the page that will be used for the root-page of + ** the new table (assuming an error did not occur). But we were + ** allocated pgnoMove. If required (i.e. if it was not allocated + ** by extending the file), the current page at position pgnoMove + ** is already journaled. + */ + u8 eType = 0; + Pgno iPtrPage = 0; + + /* Save the positions of any open cursors. This is required in + ** case they are holding a reference to an xFetch reference + ** corresponding to page pgnoRoot. */ + rc = saveAllCursors(pBt, 0, 0); + releasePage(pPageMove); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Move the page currently at pgnoRoot to pgnoMove. */ + rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = ptrmapGet(pBt, pgnoRoot, &eType, &iPtrPage); + if( eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){ + rc = SQLITE_CORRUPT_BKPT; + } + if( rc!=SQLITE_OK ){ + releasePage(pRoot); + return rc; + } + assert( eType!=PTRMAP_ROOTPAGE ); + assert( eType!=PTRMAP_FREEPAGE ); + rc = relocatePage(pBt, pRoot, eType, iPtrPage, pgnoMove, 0); + releasePage(pRoot); + + /* Obtain the page at pgnoRoot */ + if( rc!=SQLITE_OK ){ + return rc; + } + rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = sqlite3PagerWrite(pRoot->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pRoot); + return rc; + } + }else{ + pRoot = pPageMove; + } + + /* Update the pointer-map and meta-data with the new root-page number. */ + ptrmapPut(pBt, pgnoRoot, PTRMAP_ROOTPAGE, 0, &rc); + if( rc ){ + releasePage(pRoot); + return rc; + } + + /* When the new root page was allocated, page 1 was made writable in + ** order either to increase the database filesize, or to decrement the + ** freelist count. Hence, the sqlite3BtreeUpdateMeta() call cannot fail. + */ + assert( sqlite3PagerIswriteable(pBt->pPage1->pDbPage) ); + rc = sqlite3BtreeUpdateMeta(p, 4, pgnoRoot); + if( NEVER(rc) ){ + releasePage(pRoot); + return rc; + } + + }else{ + rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); + if( rc ) return rc; + } +#endif + assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); + if( createTabFlags & BTREE_INTKEY ){ + ptfFlags = PTF_INTKEY | PTF_LEAFDATA | PTF_LEAF; + }else{ + ptfFlags = PTF_ZERODATA | PTF_LEAF; + } + zeroPage(pRoot, ptfFlags); + sqlite3PagerUnref(pRoot->pDbPage); + assert( (pBt->openFlags & BTREE_SINGLE)==0 || pgnoRoot==2 ); + *piTable = (int)pgnoRoot; + return SQLITE_OK; +} +SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree *p, int *piTable, int flags){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeCreateTable(p, piTable, flags); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Erase the given database page and all its children. Return +** the page to the freelist. +*/ +static int clearDatabasePage( + BtShared *pBt, /* The BTree that contains the table */ + Pgno pgno, /* Page number to clear */ + int freePageFlag, /* Deallocate page if true */ + int *pnChange /* Add number of Cells freed to this counter */ +){ + MemPage *pPage; + int rc; + unsigned char *pCell; + int i; + int hdr; + CellInfo info; + + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pgno>btreePagecount(pBt) ){ + return SQLITE_CORRUPT_BKPT; + } + rc = getAndInitPage(pBt, pgno, &pPage, 0, 0); + if( rc ) return rc; + if( pPage->bBusy ){ + rc = SQLITE_CORRUPT_BKPT; + goto cleardatabasepage_out; + } + pPage->bBusy = 1; + hdr = pPage->hdrOffset; + for(i=0; inCell; i++){ + pCell = findCell(pPage, i); + if( !pPage->leaf ){ + rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange); + if( rc ) goto cleardatabasepage_out; + } + rc = clearCell(pPage, pCell, &info); + if( rc ) goto cleardatabasepage_out; + } + if( !pPage->leaf ){ + rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange); + if( rc ) goto cleardatabasepage_out; + }else if( pnChange ){ + assert( pPage->intKey || CORRUPT_DB ); + testcase( !pPage->intKey ); + *pnChange += pPage->nCell; + } + if( freePageFlag ){ + freePage(pPage, &rc); + }else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){ + zeroPage(pPage, pPage->aData[hdr] | PTF_LEAF); + } + +cleardatabasepage_out: + pPage->bBusy = 0; + releasePage(pPage); + return rc; +} + +/* +** Delete all information from a single table in the database. iTable is +** the page number of the root of the table. After this routine returns, +** the root page is empty, but still exists. +** +** This routine will fail with SQLITE_LOCKED if there are any open +** read cursors on the table. Open write cursors are moved to the +** root of the table. +** +** If pnChange is not NULL, then table iTable must be an intkey table. The +** integer value pointed to by pnChange is incremented by the number of +** entries in the table. +*/ +SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){ + int rc; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + assert( p->inTrans==TRANS_WRITE ); + + rc = saveAllCursors(pBt, (Pgno)iTable, 0); + + if( SQLITE_OK==rc ){ + /* Invalidate all incrblob cursors open on table iTable (assuming iTable + ** is the root of a table b-tree - if it is not, the following call is + ** a no-op). */ + invalidateIncrblobCursors(p, (Pgno)iTable, 0, 1); + rc = clearDatabasePage(pBt, (Pgno)iTable, 0, pnChange); + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Delete all information from the single table that pCur is open on. +** +** This routine only work for pCur on an ephemeral table. +*/ +SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor *pCur){ + return sqlite3BtreeClearTable(pCur->pBtree, pCur->pgnoRoot, 0); +} + +/* +** Erase all information in a table and add the root of the table to +** the freelist. Except, the root of the principle table (the one on +** page 1) is never added to the freelist. +** +** This routine will fail with SQLITE_LOCKED if there are any open +** cursors on the table. +** +** If AUTOVACUUM is enabled and the page at iTable is not the last +** root page in the database file, then the last root page +** in the database file is moved into the slot formerly occupied by +** iTable and that last slot formerly occupied by the last root page +** is added to the freelist instead of iTable. In this say, all +** root pages are kept at the beginning of the database file, which +** is necessary for AUTOVACUUM to work right. *piMoved is set to the +** page number that used to be the last root page in the file before +** the move. If no page gets moved, *piMoved is set to 0. +** The last root page is recorded in meta[3] and the value of +** meta[3] is updated by this procedure. +*/ +static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ + int rc; + MemPage *pPage = 0; + BtShared *pBt = p->pBt; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( p->inTrans==TRANS_WRITE ); + assert( iTable>=2 ); + if( iTable>btreePagecount(pBt) ){ + return SQLITE_CORRUPT_BKPT; + } + + rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0); + if( rc ) return rc; + rc = sqlite3BtreeClearTable(p, iTable, 0); + if( rc ){ + releasePage(pPage); + return rc; + } + + *piMoved = 0; + +#ifdef SQLITE_OMIT_AUTOVACUUM + freePage(pPage, &rc); + releasePage(pPage); +#else + if( pBt->autoVacuum ){ + Pgno maxRootPgno; + sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &maxRootPgno); + + if( iTable==maxRootPgno ){ + /* If the table being dropped is the table with the largest root-page + ** number in the database, put the root page on the free list. + */ + freePage(pPage, &rc); + releasePage(pPage); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + /* The table being dropped does not have the largest root-page + ** number in the database. So move the page that does into the + ** gap left by the deleted root-page. + */ + MemPage *pMove; + releasePage(pPage); + rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable, 0); + releasePage(pMove); + if( rc!=SQLITE_OK ){ + return rc; + } + pMove = 0; + rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); + freePage(pMove, &rc); + releasePage(pMove); + if( rc!=SQLITE_OK ){ + return rc; + } + *piMoved = maxRootPgno; + } + + /* Set the new 'max-root-page' value in the database header. This + ** is the old value less one, less one more if that happens to + ** be a root-page number, less one again if that is the + ** PENDING_BYTE_PAGE. + */ + maxRootPgno--; + while( maxRootPgno==PENDING_BYTE_PAGE(pBt) + || PTRMAP_ISPAGE(pBt, maxRootPgno) ){ + maxRootPgno--; + } + assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) ); + + rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno); + }else{ + freePage(pPage, &rc); + releasePage(pPage); + } +#endif + return rc; +} +SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeDropTable(p, iTable, piMoved); + sqlite3BtreeLeave(p); + return rc; +} + + +/* +** This function may only be called if the b-tree connection already +** has a read or write transaction open on the database. +** +** Read the meta-information out of a database file. Meta[0] +** is the number of free pages currently in the database. Meta[1] +** through meta[15] are available for use by higher layers. Meta[0] +** is read-only, the others are read/write. +** +** The schema layer numbers meta values differently. At the schema +** layer (and the SetCookie and ReadCookie opcodes) the number of +** free pages is not visible. So Cookie[0] is the same as Meta[1]. +** +** This routine treats Meta[BTREE_DATA_VERSION] as a special case. Instead +** of reading the value out of the header, it instead loads the "DataVersion" +** from the pager. The BTREE_DATA_VERSION value is not actually stored in the +** database file. It is a number computed by the pager. But its access +** pattern is the same as header meta values, and so it is convenient to +** read it from this routine. +*/ +SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){ + BtShared *pBt = p->pBt; + + sqlite3BtreeEnter(p); + assert( p->inTrans>TRANS_NONE ); + assert( SQLITE_OK==querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK) ); + assert( pBt->pPage1 ); + assert( idx>=0 && idx<=15 ); + + if( idx==BTREE_DATA_VERSION ){ + *pMeta = sqlite3PagerDataVersion(pBt->pPager) + p->iDataVersion; + }else{ + *pMeta = get4byte(&pBt->pPage1->aData[36 + idx*4]); + } + + /* If auto-vacuum is disabled in this build and this is an auto-vacuum + ** database, mark the database as read-only. */ +#ifdef SQLITE_OMIT_AUTOVACUUM + if( idx==BTREE_LARGEST_ROOT_PAGE && *pMeta>0 ){ + pBt->btsFlags |= BTS_READ_ONLY; + } +#endif + + sqlite3BtreeLeave(p); +} + +/* +** Write meta-information back into the database. Meta[0] is +** read-only and may not be written. +*/ +SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){ + BtShared *pBt = p->pBt; + unsigned char *pP1; + int rc; + assert( idx>=1 && idx<=15 ); + sqlite3BtreeEnter(p); + assert( p->inTrans==TRANS_WRITE ); + assert( pBt->pPage1!=0 ); + pP1 = pBt->pPage1->aData; + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pP1[36 + idx*4], iMeta); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( idx==BTREE_INCR_VACUUM ){ + assert( pBt->autoVacuum || iMeta==0 ); + assert( iMeta==0 || iMeta==1 ); + pBt->incrVacuum = (u8)iMeta; + } +#endif + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** The first argument, pCur, is a cursor opened on some b-tree. Count the +** number of entries in the b-tree and write the result to *pnEntry. +** +** SQLITE_OK is returned if the operation is successfully executed. +** Otherwise, if an error is encountered (i.e. an IO error or database +** corruption) an SQLite error code is returned. +*/ +SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3 *db, BtCursor *pCur, i64 *pnEntry){ + i64 nEntry = 0; /* Value to return in *pnEntry */ + int rc; /* Return code */ + + rc = moveToRoot(pCur); + if( rc==SQLITE_EMPTY ){ + *pnEntry = 0; + return SQLITE_OK; + } + + /* Unless an error occurs, the following loop runs one iteration for each + ** page in the B-Tree structure (not including overflow pages). + */ + while( rc==SQLITE_OK && !AtomicLoad(&db->u1.isInterrupted) ){ + int iIdx; /* Index of child node in parent */ + MemPage *pPage; /* Current page of the b-tree */ + + /* If this is a leaf page or the tree is not an int-key tree, then + ** this page contains countable entries. Increment the entry counter + ** accordingly. + */ + pPage = pCur->pPage; + if( pPage->leaf || !pPage->intKey ){ + nEntry += pPage->nCell; + } + + /* pPage is a leaf node. This loop navigates the cursor so that it + ** points to the first interior cell that it points to the parent of + ** the next page in the tree that has not yet been visited. The + ** pCur->aiIdx[pCur->iPage] value is set to the index of the parent cell + ** of the page, or to the number of cells in the page if the next page + ** to visit is the right-child of its parent. + ** + ** If all pages in the tree have been visited, return SQLITE_OK to the + ** caller. + */ + if( pPage->leaf ){ + do { + if( pCur->iPage==0 ){ + /* All pages of the b-tree have been visited. Return successfully. */ + *pnEntry = nEntry; + return moveToRoot(pCur); + } + moveToParent(pCur); + }while ( pCur->ix>=pCur->pPage->nCell ); + + pCur->ix++; + pPage = pCur->pPage; + } + + /* Descend to the child node of the cell that the cursor currently + ** points at. This is the right-child if (iIdx==pPage->nCell). + */ + iIdx = pCur->ix; + if( iIdx==pPage->nCell ){ + rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); + }else{ + rc = moveToChild(pCur, get4byte(findCell(pPage, iIdx))); + } + } + + /* An error has occurred. Return an error code. */ + return rc; +} + +/* +** Return the pager associated with a BTree. This routine is used for +** testing and debugging only. +*/ +SQLITE_PRIVATE Pager *sqlite3BtreePager(Btree *p){ + return p->pBt->pPager; +} + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* +** Append a message to the error message string. +*/ +static void checkAppendMsg( + IntegrityCk *pCheck, + const char *zFormat, + ... +){ + va_list ap; + if( !pCheck->mxErr ) return; + pCheck->mxErr--; + pCheck->nErr++; + va_start(ap, zFormat); + if( pCheck->errMsg.nChar ){ + sqlite3_str_append(&pCheck->errMsg, "\n", 1); + } + if( pCheck->zPfx ){ + sqlite3_str_appendf(&pCheck->errMsg, pCheck->zPfx, pCheck->v1, pCheck->v2); + } + sqlite3_str_vappendf(&pCheck->errMsg, zFormat, ap); + va_end(ap); + if( pCheck->errMsg.accError==SQLITE_NOMEM ){ + pCheck->mallocFailed = 1; + } +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK + +/* +** Return non-zero if the bit in the IntegrityCk.aPgRef[] array that +** corresponds to page iPg is already set. +*/ +static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){ + assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 ); + return (pCheck->aPgRef[iPg/8] & (1 << (iPg & 0x07))); +} + +/* +** Set the bit in the IntegrityCk.aPgRef[] array that corresponds to page iPg. +*/ +static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){ + assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 ); + pCheck->aPgRef[iPg/8] |= (1 << (iPg & 0x07)); +} + + +/* +** Add 1 to the reference count for page iPage. If this is the second +** reference to the page, add an error message to pCheck->zErrMsg. +** Return 1 if there are 2 or more references to the page and 0 if +** if this is the first reference to the page. +** +** Also check that the page number is in bounds. +*/ +static int checkRef(IntegrityCk *pCheck, Pgno iPage){ + if( iPage>pCheck->nPage || iPage==0 ){ + checkAppendMsg(pCheck, "invalid page number %d", iPage); + return 1; + } + if( getPageReferenced(pCheck, iPage) ){ + checkAppendMsg(pCheck, "2nd reference to page %d", iPage); + return 1; + } + if( AtomicLoad(&pCheck->db->u1.isInterrupted) ) return 1; + setPageReferenced(pCheck, iPage); + return 0; +} + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Check that the entry in the pointer-map for page iChild maps to +** page iParent, pointer type ptrType. If not, append an error message +** to pCheck. +*/ +static void checkPtrmap( + IntegrityCk *pCheck, /* Integrity check context */ + Pgno iChild, /* Child page number */ + u8 eType, /* Expected pointer map type */ + Pgno iParent /* Expected pointer map parent page number */ +){ + int rc; + u8 ePtrmapType; + Pgno iPtrmapParent; + + rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) pCheck->mallocFailed = 1; + checkAppendMsg(pCheck, "Failed to read ptrmap key=%d", iChild); + return; + } + + if( ePtrmapType!=eType || iPtrmapParent!=iParent ){ + checkAppendMsg(pCheck, + "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)", + iChild, eType, iParent, ePtrmapType, iPtrmapParent); + } +} +#endif + +/* +** Check the integrity of the freelist or of an overflow page list. +** Verify that the number of pages on the list is N. +*/ +static void checkList( + IntegrityCk *pCheck, /* Integrity checking context */ + int isFreeList, /* True for a freelist. False for overflow page list */ + int iPage, /* Page number for first page in the list */ + u32 N /* Expected number of pages in the list */ +){ + int i; + u32 expected = N; + int nErrAtStart = pCheck->nErr; + while( iPage!=0 && pCheck->mxErr ){ + DbPage *pOvflPage; + unsigned char *pOvflData; + if( checkRef(pCheck, iPage) ) break; + N--; + if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){ + checkAppendMsg(pCheck, "failed to get page %d", iPage); + break; + } + pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); + if( isFreeList ){ + u32 n = (u32)get4byte(&pOvflData[4]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pCheck->pBt->autoVacuum ){ + checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0); + } +#endif + if( n>pCheck->pBt->usableSize/4-2 ){ + checkAppendMsg(pCheck, + "freelist leaf count too big on page %d", iPage); + N--; + }else{ + for(i=0; i<(int)n; i++){ + Pgno iFreePage = get4byte(&pOvflData[8+i*4]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pCheck->pBt->autoVacuum ){ + checkPtrmap(pCheck, iFreePage, PTRMAP_FREEPAGE, 0); + } +#endif + checkRef(pCheck, iFreePage); + } + N -= n; + } + } +#ifndef SQLITE_OMIT_AUTOVACUUM + else{ + /* If this database supports auto-vacuum and iPage is not the last + ** page in this overflow list, check that the pointer-map entry for + ** the following page matches iPage. + */ + if( pCheck->pBt->autoVacuum && N>0 ){ + i = get4byte(pOvflData); + checkPtrmap(pCheck, i, PTRMAP_OVERFLOW2, iPage); + } + } +#endif + iPage = get4byte(pOvflData); + sqlite3PagerUnref(pOvflPage); + } + if( N && nErrAtStart==pCheck->nErr ){ + checkAppendMsg(pCheck, + "%s is %d but should be %d", + isFreeList ? "size" : "overflow list length", + expected-N, expected); + } +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +/* +** An implementation of a min-heap. +** +** aHeap[0] is the number of elements on the heap. aHeap[1] is the +** root element. The daughter nodes of aHeap[N] are aHeap[N*2] +** and aHeap[N*2+1]. +** +** The heap property is this: Every node is less than or equal to both +** of its daughter nodes. A consequence of the heap property is that the +** root node aHeap[1] is always the minimum value currently in the heap. +** +** The btreeHeapInsert() routine inserts an unsigned 32-bit number onto +** the heap, preserving the heap property. The btreeHeapPull() routine +** removes the root element from the heap (the minimum value in the heap) +** and then moves other nodes around as necessary to preserve the heap +** property. +** +** This heap is used for cell overlap and coverage testing. Each u32 +** entry represents the span of a cell or freeblock on a btree page. +** The upper 16 bits are the index of the first byte of a range and the +** lower 16 bits are the index of the last byte of that range. +*/ +static void btreeHeapInsert(u32 *aHeap, u32 x){ + u32 j, i = ++aHeap[0]; + aHeap[i] = x; + while( (j = i/2)>0 && aHeap[j]>aHeap[i] ){ + x = aHeap[j]; + aHeap[j] = aHeap[i]; + aHeap[i] = x; + i = j; + } +} +static int btreeHeapPull(u32 *aHeap, u32 *pOut){ + u32 j, i, x; + if( (x = aHeap[0])==0 ) return 0; + *pOut = aHeap[1]; + aHeap[1] = aHeap[x]; + aHeap[x] = 0xffffffff; + aHeap[0]--; + i = 1; + while( (j = i*2)<=aHeap[0] ){ + if( aHeap[j]>aHeap[j+1] ) j++; + if( aHeap[i]zPfx; + int saved_v1 = pCheck->v1; + int saved_v2 = pCheck->v2; + u8 savedIsInit = 0; + + /* Check that the page exists + */ + pBt = pCheck->pBt; + usableSize = pBt->usableSize; + if( iPage==0 ) return 0; + if( checkRef(pCheck, iPage) ) return 0; + pCheck->zPfx = "Page %d: "; + pCheck->v1 = iPage; + if( (rc = btreeGetPage(pBt, (Pgno)iPage, &pPage, 0))!=0 ){ + checkAppendMsg(pCheck, + "unable to get the page. error code=%d", rc); + goto end_of_check; + } + + /* Clear MemPage.isInit to make sure the corruption detection code in + ** btreeInitPage() is executed. */ + savedIsInit = pPage->isInit; + pPage->isInit = 0; + if( (rc = btreeInitPage(pPage))!=0 ){ + assert( rc==SQLITE_CORRUPT ); /* The only possible error from InitPage */ + checkAppendMsg(pCheck, + "btreeInitPage() returns error code %d", rc); + goto end_of_check; + } + if( (rc = btreeComputeFreeSpace(pPage))!=0 ){ + assert( rc==SQLITE_CORRUPT ); + checkAppendMsg(pCheck, "free space corruption", rc); + goto end_of_check; + } + data = pPage->aData; + hdr = pPage->hdrOffset; + + /* Set up for cell analysis */ + pCheck->zPfx = "On tree page %d cell %d: "; + contentOffset = get2byteNotZero(&data[hdr+5]); + assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */ + + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + nCell = get2byte(&data[hdr+3]); + assert( pPage->nCell==nCell ); + + /* EVIDENCE-OF: R-23882-45353 The cell pointer array of a b-tree page + ** immediately follows the b-tree page header. */ + cellStart = hdr + 12 - 4*pPage->leaf; + assert( pPage->aCellIdx==&data[cellStart] ); + pCellIdx = &data[cellStart + 2*(nCell-1)]; + + if( !pPage->leaf ){ + /* Analyze the right-child page of internal pages */ + pgno = get4byte(&data[hdr+8]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + pCheck->zPfx = "On page %d at right child: "; + checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); + } +#endif + depth = checkTreePage(pCheck, pgno, &maxKey, maxKey); + keyCanBeEqual = 0; + }else{ + /* For leaf pages, the coverage check will occur in the same loop + ** as the other cell checks, so initialize the heap. */ + heap = pCheck->heap; + heap[0] = 0; + } + + /* EVIDENCE-OF: R-02776-14802 The cell pointer array consists of K 2-byte + ** integer offsets to the cell contents. */ + for(i=nCell-1; i>=0 && pCheck->mxErr; i--){ + CellInfo info; + + /* Check cell size */ + pCheck->v2 = i; + assert( pCellIdx==&data[cellStart + i*2] ); + pc = get2byteAligned(pCellIdx); + pCellIdx -= 2; + if( pcusableSize-4 ){ + checkAppendMsg(pCheck, "Offset %d out of range %d..%d", + pc, contentOffset, usableSize-4); + doCoverageCheck = 0; + continue; + } + pCell = &data[pc]; + pPage->xParseCell(pPage, pCell, &info); + if( pc+info.nSize>usableSize ){ + checkAppendMsg(pCheck, "Extends off end of page"); + doCoverageCheck = 0; + continue; + } + + /* Check for integer primary key out of range */ + if( pPage->intKey ){ + if( keyCanBeEqual ? (info.nKey > maxKey) : (info.nKey >= maxKey) ){ + checkAppendMsg(pCheck, "Rowid %lld out of order", info.nKey); + } + maxKey = info.nKey; + keyCanBeEqual = 0; /* Only the first key on the page may ==maxKey */ + } + + /* Check the content overflow list */ + if( info.nPayload>info.nLocal ){ + u32 nPage; /* Number of pages on the overflow chain */ + Pgno pgnoOvfl; /* First page of the overflow chain */ + assert( pc + info.nSize - 4 <= usableSize ); + nPage = (info.nPayload - info.nLocal + usableSize - 5)/(usableSize - 4); + pgnoOvfl = get4byte(&pCell[info.nSize - 4]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + checkPtrmap(pCheck, pgnoOvfl, PTRMAP_OVERFLOW1, iPage); + } +#endif + checkList(pCheck, 0, pgnoOvfl, nPage); + } + + if( !pPage->leaf ){ + /* Check sanity of left child page for internal pages */ + pgno = get4byte(pCell); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); + } +#endif + d2 = checkTreePage(pCheck, pgno, &maxKey, maxKey); + keyCanBeEqual = 0; + if( d2!=depth ){ + checkAppendMsg(pCheck, "Child page depth differs"); + depth = d2; + } + }else{ + /* Populate the coverage-checking heap for leaf pages */ + btreeHeapInsert(heap, (pc<<16)|(pc+info.nSize-1)); + } + } + *piMinKey = maxKey; + + /* Check for complete coverage of the page + */ + pCheck->zPfx = 0; + if( doCoverageCheck && pCheck->mxErr>0 ){ + /* For leaf pages, the min-heap has already been initialized and the + ** cells have already been inserted. But for internal pages, that has + ** not yet been done, so do it now */ + if( !pPage->leaf ){ + heap = pCheck->heap; + heap[0] = 0; + for(i=nCell-1; i>=0; i--){ + u32 size; + pc = get2byteAligned(&data[cellStart+i*2]); + size = pPage->xCellSize(pPage, &data[pc]); + btreeHeapInsert(heap, (pc<<16)|(pc+size-1)); + } + } + /* Add the freeblocks to the min-heap + ** + ** EVIDENCE-OF: R-20690-50594 The second field of the b-tree page header + ** is the offset of the first freeblock, or zero if there are no + ** freeblocks on the page. + */ + i = get2byte(&data[hdr+1]); + while( i>0 ){ + int size, j; + assert( (u32)i<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ + size = get2byte(&data[i+2]); + assert( (u32)(i+size)<=usableSize ); /* due to btreeComputeFreeSpace() */ + btreeHeapInsert(heap, (((u32)i)<<16)|(i+size-1)); + /* EVIDENCE-OF: R-58208-19414 The first 2 bytes of a freeblock are a + ** big-endian integer which is the offset in the b-tree page of the next + ** freeblock in the chain, or zero if the freeblock is the last on the + ** chain. */ + j = get2byte(&data[i]); + /* EVIDENCE-OF: R-06866-39125 Freeblocks are always connected in order of + ** increasing offset. */ + assert( j==0 || j>i+size ); /* Enforced by btreeComputeFreeSpace() */ + assert( (u32)j<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ + i = j; + } + /* Analyze the min-heap looking for overlap between cells and/or + ** freeblocks, and counting the number of untracked bytes in nFrag. + ** + ** Each min-heap entry is of the form: (start_address<<16)|end_address. + ** There is an implied first entry the covers the page header, the cell + ** pointer index, and the gap between the cell pointer index and the start + ** of cell content. + ** + ** The loop below pulls entries from the min-heap in order and compares + ** the start_address against the previous end_address. If there is an + ** overlap, that means bytes are used multiple times. If there is a gap, + ** that gap is added to the fragmentation count. + */ + nFrag = 0; + prev = contentOffset - 1; /* Implied first min-heap entry */ + while( btreeHeapPull(heap,&x) ){ + if( (prev&0xffff)>=(x>>16) ){ + checkAppendMsg(pCheck, + "Multiple uses for byte %u of page %d", x>>16, iPage); + break; + }else{ + nFrag += (x>>16) - (prev&0xffff) - 1; + prev = x; + } + } + nFrag += usableSize - (prev&0xffff) - 1; + /* EVIDENCE-OF: R-43263-13491 The total number of bytes in all fragments + ** is stored in the fifth field of the b-tree page header. + ** EVIDENCE-OF: R-07161-27322 The one-byte integer at offset 7 gives the + ** number of fragmented free bytes within the cell content area. + */ + if( heap[0]==0 && nFrag!=data[hdr+7] ){ + checkAppendMsg(pCheck, + "Fragmentation of %d bytes reported as %d on page %d", + nFrag, data[hdr+7], iPage); + } + } + +end_of_check: + if( !doCoverageCheck ) pPage->isInit = savedIsInit; + releasePage(pPage); + pCheck->zPfx = saved_zPfx; + pCheck->v1 = saved_v1; + pCheck->v2 = saved_v2; + return depth+1; +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* +** This routine does a complete check of the given BTree file. aRoot[] is +** an array of pages numbers were each page number is the root page of +** a table. nRoot is the number of entries in aRoot. +** +** A read-only or read-write transaction must be opened before calling +** this function. +** +** Write the number of error seen in *pnErr. Except for some memory +** allocation errors, an error message held in memory obtained from +** malloc is returned if *pnErr is non-zero. If *pnErr==0 then NULL is +** returned. If a memory allocation error occurs, NULL is returned. +*/ +SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( + sqlite3 *db, /* Database connection that is running the check */ + Btree *p, /* The btree to be checked */ + int *aRoot, /* An array of root pages numbers for individual trees */ + int nRoot, /* Number of entries in aRoot[] */ + int mxErr, /* Stop reporting errors after this many */ + int *pnErr /* Write number of errors seen to this variable */ +){ + Pgno i; + IntegrityCk sCheck; + BtShared *pBt = p->pBt; + u64 savedDbFlags = pBt->db->flags; + char zErr[100]; + VVA_ONLY( int nRef ); + + sqlite3BtreeEnter(p); + assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE ); + VVA_ONLY( nRef = sqlite3PagerRefcount(pBt->pPager) ); + assert( nRef>=0 ); + sCheck.db = db; + sCheck.pBt = pBt; + sCheck.pPager = pBt->pPager; + sCheck.nPage = btreePagecount(sCheck.pBt); + sCheck.mxErr = mxErr; + sCheck.nErr = 0; + sCheck.mallocFailed = 0; + sCheck.zPfx = 0; + sCheck.v1 = 0; + sCheck.v2 = 0; + sCheck.aPgRef = 0; + sCheck.heap = 0; + sqlite3StrAccumInit(&sCheck.errMsg, 0, zErr, sizeof(zErr), SQLITE_MAX_LENGTH); + sCheck.errMsg.printfFlags = SQLITE_PRINTF_INTERNAL; + if( sCheck.nPage==0 ){ + goto integrity_ck_cleanup; + } + + sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1); + if( !sCheck.aPgRef ){ + sCheck.mallocFailed = 1; + goto integrity_ck_cleanup; + } + sCheck.heap = (u32*)sqlite3PageMalloc( pBt->pageSize ); + if( sCheck.heap==0 ){ + sCheck.mallocFailed = 1; + goto integrity_ck_cleanup; + } + + i = PENDING_BYTE_PAGE(pBt); + if( i<=sCheck.nPage ) setPageReferenced(&sCheck, i); + + /* Check the integrity of the freelist + */ + sCheck.zPfx = "Main freelist: "; + checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]), + get4byte(&pBt->pPage1->aData[36])); + sCheck.zPfx = 0; + + /* Check all the tables. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + int mx = 0; + int mxInHdr; + for(i=0; (int)ipPage1->aData[52]); + if( mx!=mxInHdr ){ + checkAppendMsg(&sCheck, + "max rootpage (%d) disagrees with header (%d)", + mx, mxInHdr + ); + } + }else if( get4byte(&pBt->pPage1->aData[64])!=0 ){ + checkAppendMsg(&sCheck, + "incremental_vacuum enabled with a max rootpage of zero" + ); + } +#endif + testcase( pBt->db->flags & SQLITE_CellSizeCk ); + pBt->db->flags &= ~(u64)SQLITE_CellSizeCk; + for(i=0; (int)iautoVacuum && aRoot[i]>1 ){ + checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0); + } +#endif + checkTreePage(&sCheck, aRoot[i], ¬Used, LARGEST_INT64); + } + pBt->db->flags = savedDbFlags; + + /* Make sure every page in the file is referenced + */ + for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){ +#ifdef SQLITE_OMIT_AUTOVACUUM + if( getPageReferenced(&sCheck, i)==0 ){ + checkAppendMsg(&sCheck, "Page %d is never used", i); + } +#else + /* If the database supports auto-vacuum, make sure no tables contain + ** references to pointer-map pages. + */ + if( getPageReferenced(&sCheck, i)==0 && + (PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){ + checkAppendMsg(&sCheck, "Page %d is never used", i); + } + if( getPageReferenced(&sCheck, i)!=0 && + (PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){ + checkAppendMsg(&sCheck, "Pointer map page %d is referenced", i); + } +#endif + } + + /* Clean up and report errors. + */ +integrity_ck_cleanup: + sqlite3PageFree(sCheck.heap); + sqlite3_free(sCheck.aPgRef); + if( sCheck.mallocFailed ){ + sqlite3_str_reset(&sCheck.errMsg); + sCheck.nErr++; + } + *pnErr = sCheck.nErr; + if( sCheck.nErr==0 ) sqlite3_str_reset(&sCheck.errMsg); + /* Make sure this analysis did not leave any unref() pages. */ + assert( nRef==sqlite3PagerRefcount(pBt->pPager) ); + sqlite3BtreeLeave(p); + return sqlite3StrAccumFinish(&sCheck.errMsg); +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +/* +** Return the full pathname of the underlying database file. Return +** an empty string if the database is in-memory or a TEMP database. +** +** The pager filename is invariant as long as the pager is +** open so it is safe to access without the BtShared mutex. +*/ +SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *p){ + assert( p->pBt->pPager!=0 ); + return sqlite3PagerFilename(p->pBt->pPager, 1); +} + +/* +** Return the pathname of the journal file for this database. The return +** value of this routine is the same regardless of whether the journal file +** has been created or not. +** +** The pager journal filename is invariant as long as the pager is +** open so it is safe to access without the BtShared mutex. +*/ +SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *p){ + assert( p->pBt->pPager!=0 ); + return sqlite3PagerJournalname(p->pBt->pPager); +} + +/* +** Return non-zero if a transaction is active. +*/ +SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree *p){ + assert( p==0 || sqlite3_mutex_held(p->db->mutex) ); + return (p && (p->inTrans==TRANS_WRITE)); +} + +#ifndef SQLITE_OMIT_WAL +/* +** Run a checkpoint on the Btree passed as the first argument. +** +** Return SQLITE_LOCKED if this or any other connection has an open +** transaction on the shared-cache the argument Btree is connected to. +** +** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. +*/ +SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree *p, int eMode, int *pnLog, int *pnCkpt){ + int rc = SQLITE_OK; + if( p ){ + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( pBt->inTransaction!=TRANS_NONE ){ + rc = SQLITE_LOCKED; + }else{ + rc = sqlite3PagerCheckpoint(pBt->pPager, p->db, eMode, pnLog, pnCkpt); + } + sqlite3BtreeLeave(p); + } + return rc; +} +#endif + +/* +** Return non-zero if a read (or write) transaction is active. +*/ +SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree *p){ + assert( p ); + assert( sqlite3_mutex_held(p->db->mutex) ); + return p->inTrans!=TRANS_NONE; +} + +SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree *p){ + assert( p ); + assert( sqlite3_mutex_held(p->db->mutex) ); + return p->nBackup!=0; +} + +/* +** This function returns a pointer to a blob of memory associated with +** a single shared-btree. The memory is used by client code for its own +** purposes (for example, to store a high-level schema associated with +** the shared-btree). The btree layer manages reference counting issues. +** +** The first time this is called on a shared-btree, nBytes bytes of memory +** are allocated, zeroed, and returned to the caller. For each subsequent +** call the nBytes parameter is ignored and a pointer to the same blob +** of memory returned. +** +** If the nBytes parameter is 0 and the blob of memory has not yet been +** allocated, a null pointer is returned. If the blob has already been +** allocated, it is returned as normal. +** +** Just before the shared-btree is closed, the function passed as the +** xFree argument when the memory allocation was made is invoked on the +** blob of allocated memory. The xFree function should not call sqlite3_free() +** on the memory, the btree layer does that. +*/ +SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void *)){ + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( !pBt->pSchema && nBytes ){ + pBt->pSchema = sqlite3DbMallocZero(0, nBytes); + pBt->xFreeSchema = xFree; + } + sqlite3BtreeLeave(p); + return pBt->pSchema; +} + +/* +** Return SQLITE_LOCKED_SHAREDCACHE if another user of the same shared +** btree as the argument handle holds an exclusive lock on the +** sqlite_master table. Otherwise SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *p){ + int rc; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); + assert( rc==SQLITE_OK || rc==SQLITE_LOCKED_SHAREDCACHE ); + sqlite3BtreeLeave(p); + return rc; +} + + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Obtain a lock on the table whose root page is iTab. The +** lock is a write lock if isWritelock is true or a read lock +** if it is false. +*/ +SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){ + int rc = SQLITE_OK; + assert( p->inTrans!=TRANS_NONE ); + if( p->sharable ){ + u8 lockType = READ_LOCK + isWriteLock; + assert( READ_LOCK+1==WRITE_LOCK ); + assert( isWriteLock==0 || isWriteLock==1 ); + + sqlite3BtreeEnter(p); + rc = querySharedCacheTableLock(p, iTab, lockType); + if( rc==SQLITE_OK ){ + rc = setSharedCacheTableLock(p, iTab, lockType); + } + sqlite3BtreeLeave(p); + } + return rc; +} +#endif + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** Argument pCsr must be a cursor opened for writing on an +** INTKEY table currently pointing at a valid table entry. +** This function modifies the data stored as part of that entry. +** +** Only the data content may only be modified, it is not possible to +** change the length of the data stored. If this function is called with +** parameters that attempt to write past the end of the existing data, +** no modifications are made and SQLITE_CORRUPT is returned. +*/ +SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void *z){ + int rc; + assert( cursorOwnsBtShared(pCsr) ); + assert( sqlite3_mutex_held(pCsr->pBtree->db->mutex) ); + assert( pCsr->curFlags & BTCF_Incrblob ); + + rc = restoreCursorPosition(pCsr); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( pCsr->eState!=CURSOR_REQUIRESEEK ); + if( pCsr->eState!=CURSOR_VALID ){ + return SQLITE_ABORT; + } + + /* Save the positions of all other cursors open on this table. This is + ** required in case any of them are holding references to an xFetch + ** version of the b-tree page modified by the accessPayload call below. + ** + ** Note that pCsr must be open on a INTKEY table and saveCursorPosition() + ** and hence saveAllCursors() cannot fail on a BTREE_INTKEY table, hence + ** saveAllCursors can only return SQLITE_OK. + */ + VVA_ONLY(rc =) saveAllCursors(pCsr->pBt, pCsr->pgnoRoot, pCsr); + assert( rc==SQLITE_OK ); + + /* Check some assumptions: + ** (a) the cursor is open for writing, + ** (b) there is a read/write transaction open, + ** (c) the connection holds a write-lock on the table (if required), + ** (d) there are no conflicting read-locks, and + ** (e) the cursor points at a valid row of an intKey table. + */ + if( (pCsr->curFlags & BTCF_WriteFlag)==0 ){ + return SQLITE_READONLY; + } + assert( (pCsr->pBt->btsFlags & BTS_READ_ONLY)==0 + && pCsr->pBt->inTransaction==TRANS_WRITE ); + assert( hasSharedCacheTableLock(pCsr->pBtree, pCsr->pgnoRoot, 0, 2) ); + assert( !hasReadConflicts(pCsr->pBtree, pCsr->pgnoRoot) ); + assert( pCsr->pPage->intKey ); + + return accessPayload(pCsr, offset, amt, (unsigned char *)z, 1); +} + +/* +** Mark this cursor as an incremental blob cursor. +*/ +SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *pCur){ + pCur->curFlags |= BTCF_Incrblob; + pCur->pBtree->hasIncrblobCur = 1; +} +#endif + +/* +** Set both the "read version" (single byte at byte offset 18) and +** "write version" (single byte at byte offset 19) fields in the database +** header to iVersion. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){ + BtShared *pBt = pBtree->pBt; + int rc; /* Return code */ + + assert( iVersion==1 || iVersion==2 ); + + /* If setting the version fields to 1, do not automatically open the + ** WAL connection, even if the version fields are currently set to 2. + */ + pBt->btsFlags &= ~BTS_NO_WAL; + if( iVersion==1 ) pBt->btsFlags |= BTS_NO_WAL; + + rc = sqlite3BtreeBeginTrans(pBtree, 0, 0); + if( rc==SQLITE_OK ){ + u8 *aData = pBt->pPage1->aData; + if( aData[18]!=(u8)iVersion || aData[19]!=(u8)iVersion ){ + rc = sqlite3BtreeBeginTrans(pBtree, 2, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( rc==SQLITE_OK ){ + aData[18] = (u8)iVersion; + aData[19] = (u8)iVersion; + } + } + } + } + + pBt->btsFlags &= ~BTS_NO_WAL; + return rc; +} + +/* +** Return true if the cursor has a hint specified. This routine is +** only used from within assert() statements +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorHasHint(BtCursor *pCsr, unsigned int mask){ + return (pCsr->hints & mask)!=0; +} + +/* +** Return true if the given Btree is read-only. +*/ +SQLITE_PRIVATE int sqlite3BtreeIsReadonly(Btree *p){ + return (p->pBt->btsFlags & BTS_READ_ONLY)!=0; +} + +/* +** Return the size of the header added to each page by this module. +*/ +SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); } + +#if !defined(SQLITE_OMIT_SHARED_CACHE) +/* +** Return true if the Btree passed as the only argument is sharable. +*/ +SQLITE_PRIVATE int sqlite3BtreeSharable(Btree *p){ + return p->sharable; +} + +/* +** Return the number of connections to the BtShared object accessed by +** the Btree handle passed as the only argument. For private caches +** this is always 1. For shared caches it may be 1 or greater. +*/ +SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree *p){ + testcase( p->sharable ); + return p->pBt->nRef; +} +#endif + +/************** End of btree.c ***********************************************/ +/************** Begin file backup.c ******************************************/ +/* +** 2009 January 28 +** +** 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 the implementation of the sqlite3_backup_XXX() +** API functions and the related features. +*/ +/* #include "sqliteInt.h" */ +/* #include "btreeInt.h" */ + +/* +** Structure allocated for each backup operation. +*/ +struct sqlite3_backup { + sqlite3* pDestDb; /* Destination database handle */ + Btree *pDest; /* Destination b-tree file */ + u32 iDestSchema; /* Original schema cookie in destination */ + int bDestLocked; /* True once a write-transaction is open on pDest */ + + Pgno iNext; /* Page number of the next source page to copy */ + sqlite3* pSrcDb; /* Source database handle */ + Btree *pSrc; /* Source b-tree file */ + + int rc; /* Backup process error code */ + + /* These two variables are set by every call to backup_step(). They are + ** read by calls to backup_remaining() and backup_pagecount(). + */ + Pgno nRemaining; /* Number of pages left to copy */ + Pgno nPagecount; /* Total number of pages to copy */ + + int isAttached; /* True once backup has been registered with pager */ + sqlite3_backup *pNext; /* Next backup associated with source pager */ +}; + +/* +** THREAD SAFETY NOTES: +** +** Once it has been created using backup_init(), a single sqlite3_backup +** structure may be accessed via two groups of thread-safe entry points: +** +** * Via the sqlite3_backup_XXX() API function backup_step() and +** backup_finish(). Both these functions obtain the source database +** handle mutex and the mutex associated with the source BtShared +** structure, in that order. +** +** * Via the BackupUpdate() and BackupRestart() functions, which are +** invoked by the pager layer to report various state changes in +** the page cache associated with the source database. The mutex +** associated with the source database BtShared structure will always +** be held when either of these functions are invoked. +** +** The other sqlite3_backup_XXX() API functions, backup_remaining() and +** backup_pagecount() are not thread-safe functions. If they are called +** while some other thread is calling backup_step() or backup_finish(), +** the values returned may be invalid. There is no way for a call to +** BackupUpdate() or BackupRestart() to interfere with backup_remaining() +** or backup_pagecount(). +** +** Depending on the SQLite configuration, the database handles and/or +** the Btree objects may have their own mutexes that require locking. +** Non-sharable Btrees (in-memory databases for example), do not have +** associated mutexes. +*/ + +/* +** Return a pointer corresponding to database zDb (i.e. "main", "temp") +** in connection handle pDb. If such a database cannot be found, return +** a NULL pointer and write an error message to pErrorDb. +** +** If the "temp" database is requested, it may need to be opened by this +** function. If an error occurs while doing so, return 0 and write an +** error message to pErrorDb. +*/ +static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){ + int i = sqlite3FindDbName(pDb, zDb); + + if( i==1 ){ + Parse sParse; + int rc = 0; + memset(&sParse, 0, sizeof(sParse)); + sParse.db = pDb; + if( sqlite3OpenTempDatabase(&sParse) ){ + sqlite3ErrorWithMsg(pErrorDb, sParse.rc, "%s", sParse.zErrMsg); + rc = SQLITE_ERROR; + } + sqlite3DbFree(pErrorDb, sParse.zErrMsg); + sqlite3ParserReset(&sParse); + if( rc ){ + return 0; + } + } + + if( i<0 ){ + sqlite3ErrorWithMsg(pErrorDb, SQLITE_ERROR, "unknown database %s", zDb); + return 0; + } + + return pDb->aDb[i].pBt; +} + +/* +** Attempt to set the page size of the destination to match the page size +** of the source. +*/ +static int setDestPgsz(sqlite3_backup *p){ + int rc; + rc = sqlite3BtreeSetPageSize(p->pDest,sqlite3BtreeGetPageSize(p->pSrc),0,0); + return rc; +} + +/* +** Check that there is no open read-transaction on the b-tree passed as the +** second argument. If there is not, return SQLITE_OK. Otherwise, if there +** is an open read-transaction, return SQLITE_ERROR and leave an error +** message in database handle db. +*/ +static int checkReadTransaction(sqlite3 *db, Btree *p){ + if( sqlite3BtreeIsInReadTrans(p) ){ + sqlite3ErrorWithMsg(db, SQLITE_ERROR, "destination database is in use"); + return SQLITE_ERROR; + } + return SQLITE_OK; +} + +/* +** Create an sqlite3_backup process to copy the contents of zSrcDb from +** connection handle pSrcDb to zDestDb in pDestDb. If successful, return +** a pointer to the new sqlite3_backup object. +** +** If an error occurs, NULL is returned and an error code and error message +** stored in database handle pDestDb. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3* pDestDb, /* Database to write to */ + const char *zDestDb, /* Name of database within pDestDb */ + sqlite3* pSrcDb, /* Database connection to read from */ + const char *zSrcDb /* Name of database within pSrcDb */ +){ + sqlite3_backup *p; /* Value to return */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(pSrcDb)||!sqlite3SafetyCheckOk(pDestDb) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + /* Lock the source database handle. The destination database + ** handle is not locked in this routine, but it is locked in + ** sqlite3_backup_step(). The user is required to ensure that no + ** other thread accesses the destination handle for the duration + ** of the backup operation. Any attempt to use the destination + ** database connection while a backup is in progress may cause + ** a malfunction or a deadlock. + */ + sqlite3_mutex_enter(pSrcDb->mutex); + sqlite3_mutex_enter(pDestDb->mutex); + + if( pSrcDb==pDestDb ){ + sqlite3ErrorWithMsg( + pDestDb, SQLITE_ERROR, "source and destination must be distinct" + ); + p = 0; + }else { + /* Allocate space for a new sqlite3_backup object... + ** EVIDENCE-OF: R-64852-21591 The sqlite3_backup object is created by a + ** call to sqlite3_backup_init() and is destroyed by a call to + ** sqlite3_backup_finish(). */ + p = (sqlite3_backup *)sqlite3MallocZero(sizeof(sqlite3_backup)); + if( !p ){ + sqlite3Error(pDestDb, SQLITE_NOMEM_BKPT); + } + } + + /* If the allocation succeeded, populate the new object. */ + if( p ){ + p->pSrc = findBtree(pDestDb, pSrcDb, zSrcDb); + p->pDest = findBtree(pDestDb, pDestDb, zDestDb); + p->pDestDb = pDestDb; + p->pSrcDb = pSrcDb; + p->iNext = 1; + p->isAttached = 0; + + if( 0==p->pSrc || 0==p->pDest + || checkReadTransaction(pDestDb, p->pDest)!=SQLITE_OK + ){ + /* One (or both) of the named databases did not exist or an OOM + ** error was hit. Or there is a transaction open on the destination + ** database. The error has already been written into the pDestDb + ** handle. All that is left to do here is free the sqlite3_backup + ** structure. */ + sqlite3_free(p); + p = 0; + } + } + if( p ){ + p->pSrc->nBackup++; + } + + sqlite3_mutex_leave(pDestDb->mutex); + sqlite3_mutex_leave(pSrcDb->mutex); + return p; +} + +/* +** Argument rc is an SQLite error code. Return true if this error is +** considered fatal if encountered during a backup operation. All errors +** are considered fatal except for SQLITE_BUSY and SQLITE_LOCKED. +*/ +static int isFatalError(int rc){ + return (rc!=SQLITE_OK && rc!=SQLITE_BUSY && ALWAYS(rc!=SQLITE_LOCKED)); +} + +/* +** Parameter zSrcData points to a buffer containing the data for +** page iSrcPg from the source database. Copy this data into the +** destination database. +*/ +static int backupOnePage( + sqlite3_backup *p, /* Backup handle */ + Pgno iSrcPg, /* Source database page to backup */ + const u8 *zSrcData, /* Source database page data */ + int bUpdate /* True for an update, false otherwise */ +){ + Pager * const pDestPager = sqlite3BtreePager(p->pDest); + const int nSrcPgsz = sqlite3BtreeGetPageSize(p->pSrc); + int nDestPgsz = sqlite3BtreeGetPageSize(p->pDest); + const int nCopy = MIN(nSrcPgsz, nDestPgsz); + const i64 iEnd = (i64)iSrcPg*(i64)nSrcPgsz; + int rc = SQLITE_OK; + i64 iOff; + + assert( sqlite3BtreeGetReserveNoMutex(p->pSrc)>=0 ); + assert( p->bDestLocked ); + assert( !isFatalError(p->rc) ); + assert( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ); + assert( zSrcData ); + + /* Catch the case where the destination is an in-memory database and the + ** page sizes of the source and destination differ. + */ + if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(pDestPager) ){ + rc = SQLITE_READONLY; + } + + /* This loop runs once for each destination page spanned by the source + ** page. For each iteration, variable iOff is set to the byte offset + ** of the destination page. + */ + for(iOff=iEnd-(i64)nSrcPgsz; rc==SQLITE_OK && iOffpDest->pBt) ) continue; + if( SQLITE_OK==(rc = sqlite3PagerGet(pDestPager, iDest, &pDestPg, 0)) + && SQLITE_OK==(rc = sqlite3PagerWrite(pDestPg)) + ){ + const u8 *zIn = &zSrcData[iOff%nSrcPgsz]; + u8 *zDestData = sqlite3PagerGetData(pDestPg); + u8 *zOut = &zDestData[iOff%nDestPgsz]; + + /* Copy the data from the source page into the destination page. + ** Then clear the Btree layer MemPage.isInit flag. Both this module + ** and the pager code use this trick (clearing the first byte + ** of the page 'extra' space to invalidate the Btree layers + ** cached parse of the page). MemPage.isInit is marked + ** "MUST BE FIRST" for this purpose. + */ + memcpy(zOut, zIn, nCopy); + ((u8 *)sqlite3PagerGetExtra(pDestPg))[0] = 0; + if( iOff==0 && bUpdate==0 ){ + sqlite3Put4byte(&zOut[28], sqlite3BtreeLastPage(p->pSrc)); + } + } + sqlite3PagerUnref(pDestPg); + } + + return rc; +} + +/* +** If pFile is currently larger than iSize bytes, then truncate it to +** exactly iSize bytes. If pFile is not larger than iSize bytes, then +** this function is a no-op. +** +** Return SQLITE_OK if everything is successful, or an SQLite error +** code if an error occurs. +*/ +static int backupTruncateFile(sqlite3_file *pFile, i64 iSize){ + i64 iCurrent; + int rc = sqlite3OsFileSize(pFile, &iCurrent); + if( rc==SQLITE_OK && iCurrent>iSize ){ + rc = sqlite3OsTruncate(pFile, iSize); + } + return rc; +} + +/* +** Register this backup object with the associated source pager for +** callbacks when pages are changed or the cache invalidated. +*/ +static void attachBackupObject(sqlite3_backup *p){ + sqlite3_backup **pp; + assert( sqlite3BtreeHoldsMutex(p->pSrc) ); + pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); + p->pNext = *pp; + *pp = p; + p->isAttached = 1; +} + +/* +** Copy nPage pages from the source b-tree to the destination. +*/ +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ + int rc; + int destMode; /* Destination journal mode */ + int pgszSrc = 0; /* Source page size */ + int pgszDest = 0; /* Destination page size */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(p->pSrcDb->mutex); + sqlite3BtreeEnter(p->pSrc); + if( p->pDestDb ){ + sqlite3_mutex_enter(p->pDestDb->mutex); + } + + rc = p->rc; + if( !isFatalError(rc) ){ + Pager * const pSrcPager = sqlite3BtreePager(p->pSrc); /* Source pager */ + Pager * const pDestPager = sqlite3BtreePager(p->pDest); /* Dest pager */ + int ii; /* Iterator variable */ + int nSrcPage = -1; /* Size of source db in pages */ + int bCloseTrans = 0; /* True if src db requires unlocking */ + + /* If the source pager is currently in a write-transaction, return + ** SQLITE_BUSY immediately. + */ + if( p->pDestDb && p->pSrc->pBt->inTransaction==TRANS_WRITE ){ + rc = SQLITE_BUSY; + }else{ + rc = SQLITE_OK; + } + + /* If there is no open read-transaction on the source database, open + ** one now. If a transaction is opened here, then it will be closed + ** before this function exits. + */ + if( rc==SQLITE_OK && 0==sqlite3BtreeIsInReadTrans(p->pSrc) ){ + rc = sqlite3BtreeBeginTrans(p->pSrc, 0, 0); + bCloseTrans = 1; + } + + /* If the destination database has not yet been locked (i.e. if this + ** is the first call to backup_step() for the current backup operation), + ** try to set its page size to the same as the source database. This + ** is especially important on ZipVFS systems, as in that case it is + ** not possible to create a database file that uses one page size by + ** writing to it with another. */ + if( p->bDestLocked==0 && rc==SQLITE_OK && setDestPgsz(p)==SQLITE_NOMEM ){ + rc = SQLITE_NOMEM; + } + + /* Lock the destination database, if it is not locked already. */ + if( SQLITE_OK==rc && p->bDestLocked==0 + && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2, + (int*)&p->iDestSchema)) + ){ + p->bDestLocked = 1; + } + + /* Do not allow backup if the destination database is in WAL mode + ** and the page sizes are different between source and destination */ + pgszSrc = sqlite3BtreeGetPageSize(p->pSrc); + pgszDest = sqlite3BtreeGetPageSize(p->pDest); + destMode = sqlite3PagerGetJournalMode(sqlite3BtreePager(p->pDest)); + if( SQLITE_OK==rc && destMode==PAGER_JOURNALMODE_WAL && pgszSrc!=pgszDest ){ + rc = SQLITE_READONLY; + } + + /* Now that there is a read-lock on the source database, query the + ** source pager for the number of pages in the database. + */ + nSrcPage = (int)sqlite3BtreeLastPage(p->pSrc); + assert( nSrcPage>=0 ); + for(ii=0; (nPage<0 || iiiNext<=(Pgno)nSrcPage && !rc; ii++){ + const Pgno iSrcPg = p->iNext; /* Source page number */ + if( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ){ + DbPage *pSrcPg; /* Source page object */ + rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg,PAGER_GET_READONLY); + if( rc==SQLITE_OK ){ + rc = backupOnePage(p, iSrcPg, sqlite3PagerGetData(pSrcPg), 0); + sqlite3PagerUnref(pSrcPg); + } + } + p->iNext++; + } + if( rc==SQLITE_OK ){ + p->nPagecount = nSrcPage; + p->nRemaining = nSrcPage+1-p->iNext; + if( p->iNext>(Pgno)nSrcPage ){ + rc = SQLITE_DONE; + }else if( !p->isAttached ){ + attachBackupObject(p); + } + } + + /* Update the schema version field in the destination database. This + ** is to make sure that the schema-version really does change in + ** the case where the source and destination databases have the + ** same schema version. + */ + if( rc==SQLITE_DONE ){ + if( nSrcPage==0 ){ + rc = sqlite3BtreeNewDb(p->pDest); + nSrcPage = 1; + } + if( rc==SQLITE_OK || rc==SQLITE_DONE ){ + rc = sqlite3BtreeUpdateMeta(p->pDest,1,p->iDestSchema+1); + } + if( rc==SQLITE_OK ){ + if( p->pDestDb ){ + sqlite3ResetAllSchemasOfConnection(p->pDestDb); + } + if( destMode==PAGER_JOURNALMODE_WAL ){ + rc = sqlite3BtreeSetVersion(p->pDest, 2); + } + } + if( rc==SQLITE_OK ){ + int nDestTruncate; + /* Set nDestTruncate to the final number of pages in the destination + ** database. The complication here is that the destination page + ** size may be different to the source page size. + ** + ** If the source page size is smaller than the destination page size, + ** round up. In this case the call to sqlite3OsTruncate() below will + ** fix the size of the file. However it is important to call + ** sqlite3PagerTruncateImage() here so that any pages in the + ** destination file that lie beyond the nDestTruncate page mark are + ** journalled by PagerCommitPhaseOne() before they are destroyed + ** by the file truncation. + */ + assert( pgszSrc==sqlite3BtreeGetPageSize(p->pSrc) ); + assert( pgszDest==sqlite3BtreeGetPageSize(p->pDest) ); + if( pgszSrcpDest->pBt) ){ + nDestTruncate--; + } + }else{ + nDestTruncate = nSrcPage * (pgszSrc/pgszDest); + } + assert( nDestTruncate>0 ); + + if( pgszSrc= iSize || ( + nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1) + && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+pgszDest + )); + + /* This block ensures that all data required to recreate the original + ** database has been stored in the journal for pDestPager and the + ** journal synced to disk. So at this point we may safely modify + ** the database file in any way, knowing that if a power failure + ** occurs, the original database will be reconstructed from the + ** journal file. */ + sqlite3PagerPagecount(pDestPager, &nDstPage); + for(iPg=nDestTruncate; rc==SQLITE_OK && iPg<=(Pgno)nDstPage; iPg++){ + if( iPg!=PENDING_BYTE_PAGE(p->pDest->pBt) ){ + DbPage *pPg; + rc = sqlite3PagerGet(pDestPager, iPg, &pPg, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pPg); + sqlite3PagerUnref(pPg); + } + } + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1); + } + + /* Write the extra pages and truncate the database file as required */ + iEnd = MIN(PENDING_BYTE + pgszDest, iSize); + for( + iOff=PENDING_BYTE+pgszSrc; + rc==SQLITE_OK && iOffpDest, 0)) + ){ + rc = SQLITE_DONE; + } + } + } + + /* If bCloseTrans is true, then this function opened a read transaction + ** on the source database. Close the read transaction here. There is + ** no need to check the return values of the btree methods here, as + ** "committing" a read-only transaction cannot fail. + */ + if( bCloseTrans ){ + TESTONLY( int rc2 ); + TESTONLY( rc2 = ) sqlite3BtreeCommitPhaseOne(p->pSrc, 0); + TESTONLY( rc2 |= ) sqlite3BtreeCommitPhaseTwo(p->pSrc, 0); + assert( rc2==SQLITE_OK ); + } + + if( rc==SQLITE_IOERR_NOMEM ){ + rc = SQLITE_NOMEM_BKPT; + } + p->rc = rc; + } + if( p->pDestDb ){ + sqlite3_mutex_leave(p->pDestDb->mutex); + } + sqlite3BtreeLeave(p->pSrc); + sqlite3_mutex_leave(p->pSrcDb->mutex); + return rc; +} + +/* +** Release all resources associated with an sqlite3_backup* handle. +*/ +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p){ + sqlite3_backup **pp; /* Ptr to head of pagers backup list */ + sqlite3 *pSrcDb; /* Source database connection */ + int rc; /* Value to return */ + + /* Enter the mutexes */ + if( p==0 ) return SQLITE_OK; + pSrcDb = p->pSrcDb; + sqlite3_mutex_enter(pSrcDb->mutex); + sqlite3BtreeEnter(p->pSrc); + if( p->pDestDb ){ + sqlite3_mutex_enter(p->pDestDb->mutex); + } + + /* Detach this backup from the source pager. */ + if( p->pDestDb ){ + p->pSrc->nBackup--; + } + if( p->isAttached ){ + pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); + assert( pp!=0 ); + while( *pp!=p ){ + pp = &(*pp)->pNext; + assert( pp!=0 ); + } + *pp = p->pNext; + } + + /* If a transaction is still open on the Btree, roll it back. */ + sqlite3BtreeRollback(p->pDest, SQLITE_OK, 0); + + /* Set the error code of the destination database handle. */ + rc = (p->rc==SQLITE_DONE) ? SQLITE_OK : p->rc; + if( p->pDestDb ){ + sqlite3Error(p->pDestDb, rc); + + /* Exit the mutexes and free the backup context structure. */ + sqlite3LeaveMutexAndCloseZombie(p->pDestDb); + } + sqlite3BtreeLeave(p->pSrc); + if( p->pDestDb ){ + /* EVIDENCE-OF: R-64852-21591 The sqlite3_backup object is created by a + ** call to sqlite3_backup_init() and is destroyed by a call to + ** sqlite3_backup_finish(). */ + sqlite3_free(p); + } + sqlite3LeaveMutexAndCloseZombie(pSrcDb); + return rc; +} + +/* +** Return the number of pages still to be backed up as of the most recent +** call to sqlite3_backup_step(). +*/ +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return p->nRemaining; +} + +/* +** Return the total number of pages in the source database as of the most +** recent call to sqlite3_backup_step(). +*/ +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return p->nPagecount; +} + +/* +** This function is called after the contents of page iPage of the +** source database have been modified. If page iPage has already been +** copied into the destination database, then the data written to the +** destination is now invalidated. The destination copy of iPage needs +** to be updated with the new data before the backup operation is +** complete. +** +** It is assumed that the mutex associated with the BtShared object +** corresponding to the source database is held when this function is +** called. +*/ +static SQLITE_NOINLINE void backupUpdate( + sqlite3_backup *p, + Pgno iPage, + const u8 *aData +){ + assert( p!=0 ); + do{ + assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) ); + if( !isFatalError(p->rc) && iPageiNext ){ + /* The backup process p has already copied page iPage. But now it + ** has been modified by a transaction on the source pager. Copy + ** the new data into the backup. + */ + int rc; + assert( p->pDestDb ); + sqlite3_mutex_enter(p->pDestDb->mutex); + rc = backupOnePage(p, iPage, aData, 1); + sqlite3_mutex_leave(p->pDestDb->mutex); + assert( rc!=SQLITE_BUSY && rc!=SQLITE_LOCKED ); + if( rc!=SQLITE_OK ){ + p->rc = rc; + } + } + }while( (p = p->pNext)!=0 ); +} +SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, const u8 *aData){ + if( pBackup ) backupUpdate(pBackup, iPage, aData); +} + +/* +** Restart the backup process. This is called when the pager layer +** detects that the database has been modified by an external database +** connection. In this case there is no way of knowing which of the +** pages that have been copied into the destination database are still +** valid and which are not, so the entire process needs to be restarted. +** +** It is assumed that the mutex associated with the BtShared object +** corresponding to the source database is held when this function is +** called. +*/ +SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *pBackup){ + sqlite3_backup *p; /* Iterator variable */ + for(p=pBackup; p; p=p->pNext){ + assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) ); + p->iNext = 1; + } +} + +#ifndef SQLITE_OMIT_VACUUM +/* +** Copy the complete content of pBtFrom into pBtTo. A transaction +** must be active for both files. +** +** The size of file pTo may be reduced by this operation. If anything +** goes wrong, the transaction on pTo is rolled back. If successful, the +** transaction is committed before returning. +*/ +SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ + int rc; + sqlite3_file *pFd; /* File descriptor for database pTo */ + sqlite3_backup b; + sqlite3BtreeEnter(pTo); + sqlite3BtreeEnter(pFrom); + + assert( sqlite3BtreeIsInTrans(pTo) ); + pFd = sqlite3PagerFile(sqlite3BtreePager(pTo)); + if( pFd->pMethods ){ + i64 nByte = sqlite3BtreeGetPageSize(pFrom)*(i64)sqlite3BtreeLastPage(pFrom); + rc = sqlite3OsFileControl(pFd, SQLITE_FCNTL_OVERWRITE, &nByte); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + if( rc ) goto copy_finished; + } + + /* Set up an sqlite3_backup object. sqlite3_backup.pDestDb must be set + ** to 0. This is used by the implementations of sqlite3_backup_step() + ** and sqlite3_backup_finish() to detect that they are being called + ** from this function, not directly by the user. + */ + memset(&b, 0, sizeof(b)); + b.pSrcDb = pFrom->db; + b.pSrc = pFrom; + b.pDest = pTo; + b.iNext = 1; + + /* 0x7FFFFFFF is the hard limit for the number of pages in a database + ** file. By passing this as the number of pages to copy to + ** sqlite3_backup_step(), we can guarantee that the copy finishes + ** within a single call (unless an error occurs). The assert() statement + ** checks this assumption - (p->rc) should be set to either SQLITE_DONE + ** or an error code. */ + sqlite3_backup_step(&b, 0x7FFFFFFF); + assert( b.rc!=SQLITE_OK ); + + rc = sqlite3_backup_finish(&b); + if( rc==SQLITE_OK ){ + pTo->pBt->btsFlags &= ~BTS_PAGESIZE_FIXED; + }else{ + sqlite3PagerClearCache(sqlite3BtreePager(b.pDest)); + } + + assert( sqlite3BtreeIsInTrans(pTo)==0 ); +copy_finished: + sqlite3BtreeLeave(pFrom); + sqlite3BtreeLeave(pTo); + return rc; +} +#endif /* SQLITE_OMIT_VACUUM */ + +/************** End of backup.c **********************************************/ +/************** Begin file vdbemem.c *****************************************/ +/* +** 2004 May 26 +** +** 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 code use to manipulate "Mem" structure. A "Mem" +** stores a single value in the VDBE. Mem is an opaque structure visible +** only within the VDBE. Interface routines refer to a Mem using the +** name sqlite_value +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* True if X is a power of two. 0 is considered a power of two here. +** In other words, return true if X has at most one bit set. +*/ +#define ISPOWEROF2(X) (((X)&((X)-1))==0) + +#ifdef SQLITE_DEBUG +/* +** Check invariants on a Mem object. +** +** This routine is intended for use inside of assert() statements, like +** this: assert( sqlite3VdbeCheckMemInvariants(pMem) ); +*/ +SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ + /* If MEM_Dyn is set then Mem.xDel!=0. + ** Mem.xDel might not be initialized if MEM_Dyn is clear. + */ + assert( (p->flags & MEM_Dyn)==0 || p->xDel!=0 ); + + /* MEM_Dyn may only be set if Mem.szMalloc==0. In this way we + ** ensure that if Mem.szMalloc>0 then it is safe to do + ** Mem.z = Mem.zMalloc without having to check Mem.flags&MEM_Dyn. + ** That saves a few cycles in inner loops. */ + assert( (p->flags & MEM_Dyn)==0 || p->szMalloc==0 ); + + /* Cannot have more than one of MEM_Int, MEM_Real, or MEM_IntReal */ + assert( ISPOWEROF2(p->flags & (MEM_Int|MEM_Real|MEM_IntReal)) ); + + if( p->flags & MEM_Null ){ + /* Cannot be both MEM_Null and some other type */ + assert( (p->flags & (MEM_Int|MEM_Real|MEM_Str|MEM_Blob|MEM_Agg))==0 ); + + /* If MEM_Null is set, then either the value is a pure NULL (the usual + ** case) or it is a pointer set using sqlite3_bind_pointer() or + ** sqlite3_result_pointer(). If a pointer, then MEM_Term must also be + ** set. + */ + if( (p->flags & (MEM_Term|MEM_Subtype))==(MEM_Term|MEM_Subtype) ){ + /* This is a pointer type. There may be a flag to indicate what to + ** do with the pointer. */ + assert( ((p->flags&MEM_Dyn)!=0 ? 1 : 0) + + ((p->flags&MEM_Ephem)!=0 ? 1 : 0) + + ((p->flags&MEM_Static)!=0 ? 1 : 0) <= 1 ); + + /* No other bits set */ + assert( (p->flags & ~(MEM_Null|MEM_Term|MEM_Subtype|MEM_FromBind + |MEM_Dyn|MEM_Ephem|MEM_Static))==0 ); + }else{ + /* A pure NULL might have other flags, such as MEM_Static, MEM_Dyn, + ** MEM_Ephem, MEM_Cleared, or MEM_Subtype */ + } + }else{ + /* The MEM_Cleared bit is only allowed on NULLs */ + assert( (p->flags & MEM_Cleared)==0 ); + } + + /* The szMalloc field holds the correct memory allocation size */ + assert( p->szMalloc==0 + || p->szMalloc==sqlite3DbMallocSize(p->db,p->zMalloc) ); + + /* If p holds a string or blob, the Mem.z must point to exactly + ** one of the following: + ** + ** (1) Memory in Mem.zMalloc and managed by the Mem object + ** (2) Memory to be freed using Mem.xDel + ** (3) An ephemeral string or blob + ** (4) A static string or blob + */ + if( (p->flags & (MEM_Str|MEM_Blob)) && p->n>0 ){ + assert( + ((p->szMalloc>0 && p->z==p->zMalloc)? 1 : 0) + + ((p->flags&MEM_Dyn)!=0 ? 1 : 0) + + ((p->flags&MEM_Ephem)!=0 ? 1 : 0) + + ((p->flags&MEM_Static)!=0 ? 1 : 0) == 1 + ); + } + return 1; +} +#endif + +/* +** Render a Mem object which is one of MEM_Int, MEM_Real, or MEM_IntReal +** into a buffer. +*/ +static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){ + StrAccum acc; + assert( p->flags & (MEM_Int|MEM_Real|MEM_IntReal) ); + sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0); + if( p->flags & MEM_Int ){ + sqlite3_str_appendf(&acc, "%lld", p->u.i); + }else if( p->flags & MEM_IntReal ){ + sqlite3_str_appendf(&acc, "%!.15g", (double)p->u.i); + }else{ + sqlite3_str_appendf(&acc, "%!.15g", p->u.r); + } + assert( acc.zText==zBuf && acc.mxAlloc<=0 ); + zBuf[acc.nChar] = 0; /* Fast version of sqlite3StrAccumFinish(&acc) */ +} + +#ifdef SQLITE_DEBUG +/* +** Validity checks on pMem. pMem holds a string. +** +** (1) Check that string value of pMem agrees with its integer or real value. +** (2) Check that the string is correctly zero terminated +** +** A single int or real value always converts to the same strings. But +** many different strings can be converted into the same int or real. +** If a table contains a numeric value and an index is based on the +** corresponding string value, then it is important that the string be +** derived from the numeric value, not the other way around, to ensure +** that the index and table are consistent. See ticket +** https://www.sqlite.org/src/info/343634942dd54ab (2018-01-31) for +** an example. +** +** This routine looks at pMem to verify that if it has both a numeric +** representation and a string representation then the string rep has +** been derived from the numeric and not the other way around. It returns +** true if everything is ok and false if there is a problem. +** +** This routine is for use inside of assert() statements only. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemValidStrRep(Mem *p){ + char zBuf[100]; + char *z; + int i, j, incr; + if( (p->flags & MEM_Str)==0 ) return 1; + if( p->flags & MEM_Term ){ + /* Insure that the string is properly zero-terminated. Pay particular + ** attention to the case where p->n is odd */ + if( p->szMalloc>0 && p->z==p->zMalloc ){ + assert( p->enc==SQLITE_UTF8 || p->szMalloc >= ((p->n+1)&~1)+2 ); + assert( p->enc!=SQLITE_UTF8 || p->szMalloc >= p->n+1 ); + } + assert( p->z[p->n]==0 ); + assert( p->enc==SQLITE_UTF8 || p->z[(p->n+1)&~1]==0 ); + assert( p->enc==SQLITE_UTF8 || p->z[((p->n+1)&~1)+1]==0 ); + } + if( (p->flags & (MEM_Int|MEM_Real|MEM_IntReal))==0 ) return 1; + vdbeMemRenderNum(sizeof(zBuf), zBuf, p); + z = p->z; + i = j = 0; + incr = 1; + if( p->enc!=SQLITE_UTF8 ){ + incr = 2; + if( p->enc==SQLITE_UTF16BE ) z++; + } + while( zBuf[j] ){ + if( zBuf[j++]!=z[i] ) return 0; + i += incr; + } + return 1; +} +#endif /* SQLITE_DEBUG */ + +/* +** If pMem is an object with a valid string representation, this routine +** ensures the internal encoding for the string representation is +** 'desiredEnc', one of SQLITE_UTF8, SQLITE_UTF16LE or SQLITE_UTF16BE. +** +** If pMem is not a string object, or the encoding of the string +** representation is already stored using the requested encoding, then this +** routine is a no-op. +** +** SQLITE_OK is returned if the conversion is successful (or not required). +** SQLITE_NOMEM may be returned if a malloc() fails during conversion +** between formats. +*/ +SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ +#ifndef SQLITE_OMIT_UTF16 + int rc; +#endif + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE + || desiredEnc==SQLITE_UTF16BE ); + if( !(pMem->flags&MEM_Str) || pMem->enc==desiredEnc ){ + return SQLITE_OK; + } + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); +#ifdef SQLITE_OMIT_UTF16 + return SQLITE_ERROR; +#else + + /* MemTranslate() may return SQLITE_OK or SQLITE_NOMEM. If NOMEM is returned, + ** then the encoding of the value may not have changed. + */ + rc = sqlite3VdbeMemTranslate(pMem, (u8)desiredEnc); + assert(rc==SQLITE_OK || rc==SQLITE_NOMEM); + assert(rc==SQLITE_OK || pMem->enc!=desiredEnc); + assert(rc==SQLITE_NOMEM || pMem->enc==desiredEnc); + return rc; +#endif +} + +/* +** Make sure pMem->z points to a writable allocation of at least n bytes. +** +** If the bPreserve argument is true, then copy of the content of +** pMem->z into the new allocation. pMem must be either a string or +** blob if bPreserve is true. If bPreserve is false, any prior content +** in pMem->z is discarded. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ + assert( sqlite3VdbeCheckMemInvariants(pMem) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + testcase( pMem->db==0 ); + + /* If the bPreserve flag is set to true, then the memory cell must already + ** contain a valid string or blob value. */ + assert( bPreserve==0 || pMem->flags&(MEM_Blob|MEM_Str) ); + testcase( bPreserve && pMem->z==0 ); + + assert( pMem->szMalloc==0 + || pMem->szMalloc==sqlite3DbMallocSize(pMem->db, pMem->zMalloc) ); + if( pMem->szMalloc>0 && bPreserve && pMem->z==pMem->zMalloc ){ + if( pMem->db ){ + pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); + }else{ + pMem->zMalloc = sqlite3Realloc(pMem->z, n); + if( pMem->zMalloc==0 ) sqlite3_free(pMem->z); + pMem->z = pMem->zMalloc; + } + bPreserve = 0; + }else{ + if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc); + pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n); + } + if( pMem->zMalloc==0 ){ + sqlite3VdbeMemSetNull(pMem); + pMem->z = 0; + pMem->szMalloc = 0; + return SQLITE_NOMEM_BKPT; + }else{ + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); + } + + if( bPreserve && pMem->z ){ + assert( pMem->z!=pMem->zMalloc ); + memcpy(pMem->zMalloc, pMem->z, pMem->n); + } + if( (pMem->flags&MEM_Dyn)!=0 ){ + assert( pMem->xDel!=0 && pMem->xDel!=SQLITE_DYNAMIC ); + pMem->xDel((void *)(pMem->z)); + } + + pMem->z = pMem->zMalloc; + pMem->flags &= ~(MEM_Dyn|MEM_Ephem|MEM_Static); + return SQLITE_OK; +} + +/* +** Change the pMem->zMalloc allocation to be at least szNew bytes. +** If pMem->zMalloc already meets or exceeds the requested size, this +** routine is a no-op. +** +** Any prior string or blob content in the pMem object may be discarded. +** The pMem->xDel destructor is called, if it exists. Though MEM_Str +** and MEM_Blob values may be discarded, MEM_Int, MEM_Real, MEM_IntReal, +** and MEM_Null values are preserved. +** +** Return SQLITE_OK on success or an error code (probably SQLITE_NOMEM) +** if unable to complete the resizing. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ + assert( CORRUPT_DB || szNew>0 ); + assert( (pMem->flags & MEM_Dyn)==0 || pMem->szMalloc==0 ); + if( pMem->szMallocflags & MEM_Dyn)==0 ); + pMem->z = pMem->zMalloc; + pMem->flags &= (MEM_Null|MEM_Int|MEM_Real|MEM_IntReal); + return SQLITE_OK; +} + +/* +** It is already known that pMem contains an unterminated string. +** Add the zero terminator. +** +** Three bytes of zero are added. In this way, there is guaranteed +** to be a double-zero byte at an even byte boundary in order to +** terminate a UTF16 string, even if the initial size of the buffer +** is an odd number of bytes. +*/ +static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){ + if( sqlite3VdbeMemGrow(pMem, pMem->n+3, 1) ){ + return SQLITE_NOMEM_BKPT; + } + pMem->z[pMem->n] = 0; + pMem->z[pMem->n+1] = 0; + pMem->z[pMem->n+2] = 0; + pMem->flags |= MEM_Term; + return SQLITE_OK; +} + +/* +** Change pMem so that its MEM_Str or MEM_Blob value is stored in +** MEM.zMalloc, where it can be safely written. +** +** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){ + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + if( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ){ + if( ExpandBlob(pMem) ) return SQLITE_NOMEM; + if( pMem->szMalloc==0 || pMem->z!=pMem->zMalloc ){ + int rc = vdbeMemAddTerminator(pMem); + if( rc ) return rc; + } + } + pMem->flags &= ~MEM_Ephem; +#ifdef SQLITE_DEBUG + pMem->pScopyFrom = 0; +#endif + + return SQLITE_OK; +} + +/* +** If the given Mem* has a zero-filled tail, turn it into an ordinary +** blob stored in dynamically allocated space. +*/ +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){ + int nByte; + assert( pMem->flags & MEM_Zero ); + assert( (pMem->flags&MEM_Blob)!=0 || MemNullNochng(pMem) ); + testcase( sqlite3_value_nochange(pMem) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + + /* Set nByte to the number of bytes required to store the expanded blob. */ + nByte = pMem->n + pMem->u.nZero; + if( nByte<=0 ){ + if( (pMem->flags & MEM_Blob)==0 ) return SQLITE_OK; + nByte = 1; + } + if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){ + return SQLITE_NOMEM_BKPT; + } + + memset(&pMem->z[pMem->n], 0, pMem->u.nZero); + pMem->n += pMem->u.nZero; + pMem->flags &= ~(MEM_Zero|MEM_Term); + return SQLITE_OK; +} +#endif + +/* +** Make sure the given Mem is \u0000 terminated. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem *pMem){ + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + testcase( (pMem->flags & (MEM_Term|MEM_Str))==(MEM_Term|MEM_Str) ); + testcase( (pMem->flags & (MEM_Term|MEM_Str))==0 ); + if( (pMem->flags & (MEM_Term|MEM_Str))!=MEM_Str ){ + return SQLITE_OK; /* Nothing to do */ + }else{ + return vdbeMemAddTerminator(pMem); + } +} + +/* +** Add MEM_Str to the set of representations for the given Mem. This +** routine is only called if pMem is a number of some kind, not a NULL +** or a BLOB. +** +** Existing representations MEM_Int, MEM_Real, or MEM_IntReal are invalidated +** if bForce is true but are retained if bForce is false. +** +** A MEM_Null value will never be passed to this function. This function is +** used for converting values to text for returning to the user (i.e. via +** sqlite3_value_text()), or for ensuring that values to be used as btree +** keys are strings. In the former case a NULL pointer is returned the +** user and the latter is an internal programming error. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ + const int nByte = 32; + + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( !(pMem->flags&MEM_Zero) ); + assert( !(pMem->flags&(MEM_Str|MEM_Blob)) ); + assert( pMem->flags&(MEM_Int|MEM_Real|MEM_IntReal) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + + if( sqlite3VdbeMemClearAndResize(pMem, nByte) ){ + pMem->enc = 0; + return SQLITE_NOMEM_BKPT; + } + + vdbeMemRenderNum(nByte, pMem->z, pMem); + assert( pMem->z!=0 ); + pMem->n = sqlite3Strlen30NN(pMem->z); + pMem->enc = SQLITE_UTF8; + pMem->flags |= MEM_Str|MEM_Term; + if( bForce ) pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal); + sqlite3VdbeChangeEncoding(pMem, enc); + return SQLITE_OK; +} + +/* +** Memory cell pMem contains the context of an aggregate function. +** This routine calls the finalize method for that function. The +** result of the aggregate is stored back into pMem. +** +** Return SQLITE_ERROR if the finalizer reports an error. SQLITE_OK +** otherwise. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ + sqlite3_context ctx; + Mem t; + assert( pFunc!=0 ); + assert( pFunc->xFinalize!=0 ); + assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + memset(&ctx, 0, sizeof(ctx)); + memset(&t, 0, sizeof(t)); + t.flags = MEM_Null; + t.db = pMem->db; + ctx.pOut = &t; + ctx.pMem = pMem; + ctx.pFunc = pFunc; + pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */ + assert( (pMem->flags & MEM_Dyn)==0 ); + if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc); + memcpy(pMem, &t, sizeof(t)); + return ctx.isError; +} + +/* +** Memory cell pAccum contains the context of an aggregate function. +** This routine calls the xValue method for that function and stores +** the results in memory cell pMem. +** +** SQLITE_ERROR is returned if xValue() reports an error. SQLITE_OK +** otherwise. +*/ +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem *pAccum, Mem *pOut, FuncDef *pFunc){ + sqlite3_context ctx; + assert( pFunc!=0 ); + assert( pFunc->xValue!=0 ); + assert( (pAccum->flags & MEM_Null)!=0 || pFunc==pAccum->u.pDef ); + assert( pAccum->db==0 || sqlite3_mutex_held(pAccum->db->mutex) ); + memset(&ctx, 0, sizeof(ctx)); + sqlite3VdbeMemSetNull(pOut); + ctx.pOut = pOut; + ctx.pMem = pAccum; + ctx.pFunc = pFunc; + pFunc->xValue(&ctx); + return ctx.isError; +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** If the memory cell contains a value that must be freed by +** invoking the external callback in Mem.xDel, then this routine +** will free that value. It also sets Mem.flags to MEM_Null. +** +** This is a helper routine for sqlite3VdbeMemSetNull() and +** for sqlite3VdbeMemRelease(). Use those other routines as the +** entry point for releasing Mem resources. +*/ +static SQLITE_NOINLINE void vdbeMemClearExternAndSetNull(Mem *p){ + assert( p->db==0 || sqlite3_mutex_held(p->db->mutex) ); + assert( VdbeMemDynamic(p) ); + if( p->flags&MEM_Agg ){ + sqlite3VdbeMemFinalize(p, p->u.pDef); + assert( (p->flags & MEM_Agg)==0 ); + testcase( p->flags & MEM_Dyn ); + } + if( p->flags&MEM_Dyn ){ + assert( p->xDel!=SQLITE_DYNAMIC && p->xDel!=0 ); + p->xDel((void *)p->z); + } + p->flags = MEM_Null; +} + +/* +** Release memory held by the Mem p, both external memory cleared +** by p->xDel and memory in p->zMalloc. +** +** This is a helper routine invoked by sqlite3VdbeMemRelease() in +** the unusual case where there really is memory in p that needs +** to be freed. +*/ +static SQLITE_NOINLINE void vdbeMemClear(Mem *p){ + if( VdbeMemDynamic(p) ){ + vdbeMemClearExternAndSetNull(p); + } + if( p->szMalloc ){ + sqlite3DbFreeNN(p->db, p->zMalloc); + p->szMalloc = 0; + } + p->z = 0; +} + +/* +** Release any memory resources held by the Mem. Both the memory that is +** free by Mem.xDel and the Mem.zMalloc allocation are freed. +** +** Use this routine prior to clean up prior to abandoning a Mem, or to +** reset a Mem back to its minimum memory utilization. +** +** Use sqlite3VdbeMemSetNull() to release just the Mem.xDel space +** prior to inserting new content into the Mem. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){ + assert( sqlite3VdbeCheckMemInvariants(p) ); + if( VdbeMemDynamic(p) || p->szMalloc ){ + vdbeMemClear(p); + } +} + +/* +** Convert a 64-bit IEEE double into a 64-bit signed integer. +** If the double is out of range of a 64-bit signed integer then +** return the closest available 64-bit signed integer. +*/ +static SQLITE_NOINLINE i64 doubleToInt64(double r){ +#ifdef SQLITE_OMIT_FLOATING_POINT + /* When floating-point is omitted, double and int64 are the same thing */ + return r; +#else + /* + ** Many compilers we encounter do not define constants for the + ** minimum and maximum 64-bit integers, or they define them + ** inconsistently. And many do not understand the "LL" notation. + ** So we define our own static constants here using nothing + ** larger than a 32-bit integer constant. + */ + static const i64 maxInt = LARGEST_INT64; + static const i64 minInt = SMALLEST_INT64; + + if( r<=(double)minInt ){ + return minInt; + }else if( r>=(double)maxInt ){ + return maxInt; + }else{ + return (i64)r; + } +#endif +} + +/* +** Return some kind of integer value which is the best we can do +** at representing the value that *pMem describes as an integer. +** If pMem is an integer, then the value is exact. If pMem is +** a floating-point then the value returned is the integer part. +** If pMem is a string or blob, then we make an attempt to convert +** it into an integer and return that. If pMem represents an +** an SQL-NULL value, return 0. +** +** If pMem represents a string value, its encoding might be changed. +*/ +static SQLITE_NOINLINE i64 memIntValue(Mem *pMem){ + i64 value = 0; + sqlite3Atoi64(pMem->z, &value, pMem->n, pMem->enc); + return value; +} +SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){ + int flags; + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + flags = pMem->flags; + if( flags & (MEM_Int|MEM_IntReal) ){ + testcase( flags & MEM_IntReal ); + return pMem->u.i; + }else if( flags & MEM_Real ){ + return doubleToInt64(pMem->u.r); + }else if( (flags & (MEM_Str|MEM_Blob))!=0 && pMem->z!=0 ){ + return memIntValue(pMem); + }else{ + return 0; + } +} + +/* +** Return the best representation of pMem that we can get into a +** double. If pMem is already a double or an integer, return its +** value. If it is a string or blob, try to convert it to a double. +** If it is a NULL, return 0.0. +*/ +static SQLITE_NOINLINE double memRealValue(Mem *pMem){ + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + double val = (double)0; + sqlite3AtoF(pMem->z, &val, pMem->n, pMem->enc); + return val; +} +SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){ + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + if( pMem->flags & MEM_Real ){ + return pMem->u.r; + }else if( pMem->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pMem->flags & MEM_IntReal ); + return (double)pMem->u.i; + }else if( pMem->flags & (MEM_Str|MEM_Blob) ){ + return memRealValue(pMem); + }else{ + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + return (double)0; + } +} + +/* +** Return 1 if pMem represents true, and return 0 if pMem represents false. +** Return the value ifNull if pMem is NULL. +*/ +SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem *pMem, int ifNull){ + testcase( pMem->flags & MEM_IntReal ); + if( pMem->flags & (MEM_Int|MEM_IntReal) ) return pMem->u.i!=0; + if( pMem->flags & MEM_Null ) return ifNull; + return sqlite3VdbeRealValue(pMem)!=0.0; +} + +/* +** The MEM structure is already a MEM_Real. Try to also make it a +** MEM_Int if we can. +*/ +SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){ + i64 ix; + assert( pMem->flags & MEM_Real ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + ix = doubleToInt64(pMem->u.r); + + /* Only mark the value as an integer if + ** + ** (1) the round-trip conversion real->int->real is a no-op, and + ** (2) The integer is neither the largest nor the smallest + ** possible integer (ticket #3922) + ** + ** The second and third terms in the following conditional enforces + ** the second condition under the assumption that addition overflow causes + ** values to wrap around. + */ + if( pMem->u.r==ix && ix>SMALLEST_INT64 && ixu.i = ix; + MemSetTypeFlag(pMem, MEM_Int); + } +} + +/* +** Convert pMem to type integer. Invalidate any prior representations. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){ + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + pMem->u.i = sqlite3VdbeIntValue(pMem); + MemSetTypeFlag(pMem, MEM_Int); + return SQLITE_OK; +} + +/* +** Convert pMem so that it is of type MEM_Real. +** Invalidate any prior representations. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){ + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + pMem->u.r = sqlite3VdbeRealValue(pMem); + MemSetTypeFlag(pMem, MEM_Real); + return SQLITE_OK; +} + +/* Compare a floating point value to an integer. Return true if the two +** values are the same within the precision of the floating point value. +** +** This function assumes that i was obtained by assignment from r1. +** +** For some versions of GCC on 32-bit machines, if you do the more obvious +** comparison of "r1==(double)i" you sometimes get an answer of false even +** though the r1 and (double)i values are bit-for-bit the same. +*/ +SQLITE_PRIVATE int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ + double r2 = (double)i; + return r1==0.0 + || (memcmp(&r1, &r2, sizeof(r1))==0 + && i >= -2251799813685248LL && i < 2251799813685248LL); +} + +/* +** Convert pMem so that it has type MEM_Real or MEM_Int. +** Invalidate any prior representations. +** +** Every effort is made to force the conversion, even if the input +** is a string that does not look completely like a number. Convert +** as much of the string as we can and ignore the rest. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){ + testcase( pMem->flags & MEM_Int ); + testcase( pMem->flags & MEM_Real ); + testcase( pMem->flags & MEM_IntReal ); + testcase( pMem->flags & MEM_Null ); + if( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null))==0 ){ + int rc; + sqlite3_int64 ix; + assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); + if( ((rc==0 || rc==1) && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1) + || sqlite3RealSameAsInt(pMem->u.r, (ix = (i64)pMem->u.r)) + ){ + pMem->u.i = ix; + MemSetTypeFlag(pMem, MEM_Int); + }else{ + MemSetTypeFlag(pMem, MEM_Real); + } + } + assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null))!=0 ); + pMem->flags &= ~(MEM_Str|MEM_Blob|MEM_Zero); + return SQLITE_OK; +} + +/* +** Cast the datatype of the value in pMem according to the affinity +** "aff". Casting is different from applying affinity in that a cast +** is forced. In other words, the value is converted into the desired +** affinity even if that results in loss of data. This routine is +** used (for example) to implement the SQL "cast()" operator. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ + if( pMem->flags & MEM_Null ) return SQLITE_OK; + switch( aff ){ + case SQLITE_AFF_BLOB: { /* Really a cast to BLOB */ + if( (pMem->flags & MEM_Blob)==0 ){ + sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); + assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); + if( pMem->flags & MEM_Str ) MemSetTypeFlag(pMem, MEM_Blob); + }else{ + pMem->flags &= ~(MEM_TypeMask&~MEM_Blob); + } + break; + } + case SQLITE_AFF_NUMERIC: { + sqlite3VdbeMemNumerify(pMem); + break; + } + case SQLITE_AFF_INTEGER: { + sqlite3VdbeMemIntegerify(pMem); + break; + } + case SQLITE_AFF_REAL: { + sqlite3VdbeMemRealify(pMem); + break; + } + default: { + assert( aff==SQLITE_AFF_TEXT ); + assert( MEM_Str==(MEM_Blob>>3) ); + pMem->flags |= (pMem->flags&MEM_Blob)>>3; + sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); + assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); + pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal|MEM_Blob|MEM_Zero); + return sqlite3VdbeChangeEncoding(pMem, encoding); + } + } + return SQLITE_OK; +} + +/* +** Initialize bulk memory to be a consistent Mem object. +** +** The minimum amount of initialization feasible is performed. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem *pMem, sqlite3 *db, u16 flags){ + assert( (flags & ~MEM_TypeMask)==0 ); + pMem->flags = flags; + pMem->db = db; + pMem->szMalloc = 0; +} + + +/* +** Delete any previous value and set the value stored in *pMem to NULL. +** +** This routine calls the Mem.xDel destructor to dispose of values that +** require the destructor. But it preserves the Mem.zMalloc memory allocation. +** To free all resources, use sqlite3VdbeMemRelease(), which both calls this +** routine to invoke the destructor and deallocates Mem.zMalloc. +** +** Use this routine to reset the Mem prior to insert a new value. +** +** Use sqlite3VdbeMemRelease() to complete erase the Mem prior to abandoning it. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem *pMem){ + if( VdbeMemDynamic(pMem) ){ + vdbeMemClearExternAndSetNull(pMem); + }else{ + pMem->flags = MEM_Null; + } +} +SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value *p){ + sqlite3VdbeMemSetNull((Mem*)p); +} + +/* +** Delete any previous value and set the value to be a BLOB of length +** n containing all zeros. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){ + sqlite3VdbeMemRelease(pMem); + pMem->flags = MEM_Blob|MEM_Zero; + pMem->n = 0; + if( n<0 ) n = 0; + pMem->u.nZero = n; + pMem->enc = SQLITE_UTF8; + pMem->z = 0; +} + +/* +** The pMem is known to contain content that needs to be destroyed prior +** to a value change. So invoke the destructor, then set the value to +** a 64-bit integer. +*/ +static SQLITE_NOINLINE void vdbeReleaseAndSetInt64(Mem *pMem, i64 val){ + sqlite3VdbeMemSetNull(pMem); + pMem->u.i = val; + pMem->flags = MEM_Int; +} + +/* +** Delete any previous value and set the value stored in *pMem to val, +** manifest type INTEGER. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){ + if( VdbeMemDynamic(pMem) ){ + vdbeReleaseAndSetInt64(pMem, val); + }else{ + pMem->u.i = val; + pMem->flags = MEM_Int; + } +} + +/* A no-op destructor */ +SQLITE_PRIVATE void sqlite3NoopDestructor(void *p){ UNUSED_PARAMETER(p); } + +/* +** Set the value stored in *pMem should already be a NULL. +** Also store a pointer to go with it. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetPointer( + Mem *pMem, + void *pPtr, + const char *zPType, + void (*xDestructor)(void*) +){ + assert( pMem->flags==MEM_Null ); + pMem->u.zPType = zPType ? zPType : ""; + pMem->z = pPtr; + pMem->flags = MEM_Null|MEM_Dyn|MEM_Subtype|MEM_Term; + pMem->eSubtype = 'p'; + pMem->xDel = xDestructor ? xDestructor : sqlite3NoopDestructor; +} + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** Delete any previous value and set the value stored in *pMem to val, +** manifest type REAL. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem *pMem, double val){ + sqlite3VdbeMemSetNull(pMem); + if( !sqlite3IsNaN(val) ){ + pMem->u.r = val; + pMem->flags = MEM_Real; + } +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Return true if the Mem holds a RowSet object. This routine is intended +** for use inside of assert() statements. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem *pMem){ + return (pMem->flags&(MEM_Blob|MEM_Dyn))==(MEM_Blob|MEM_Dyn) + && pMem->xDel==sqlite3RowSetDelete; +} +#endif + +/* +** Delete any previous value and set the value of pMem to be an +** empty boolean index. +** +** Return SQLITE_OK on success and SQLITE_NOMEM if a memory allocation +** error occurs. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemSetRowSet(Mem *pMem){ + sqlite3 *db = pMem->db; + RowSet *p; + assert( db!=0 ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + sqlite3VdbeMemRelease(pMem); + p = sqlite3RowSetInit(db); + if( p==0 ) return SQLITE_NOMEM; + pMem->z = (char*)p; + pMem->flags = MEM_Blob|MEM_Dyn; + pMem->xDel = sqlite3RowSetDelete; + return SQLITE_OK; +} + +/* +** Return true if the Mem object contains a TEXT or BLOB that is +** too large - whose size exceeds SQLITE_MAX_LENGTH. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem *p){ + assert( p->db!=0 ); + if( p->flags & (MEM_Str|MEM_Blob) ){ + int n = p->n; + if( p->flags & MEM_Zero ){ + n += p->u.nZero; + } + return n>p->db->aLimit[SQLITE_LIMIT_LENGTH]; + } + return 0; +} + +#ifdef SQLITE_DEBUG +/* +** This routine prepares a memory cell for modification by breaking +** its link to a shallow copy and by marking any current shallow +** copies of this cell as invalid. +** +** This is used for testing and debugging only - to help ensure that shallow +** copies (created by OP_SCopy) are not misused. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ + int i; + Mem *pX; + for(i=1, pX=pVdbe->aMem+1; inMem; i++, pX++){ + if( pX->pScopyFrom==pMem ){ + u16 mFlags; + if( pVdbe->db->flags & SQLITE_VdbeTrace ){ + sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", + (int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem)); + } + /* If pX is marked as a shallow copy of pMem, then try to verify that + ** no significant changes have been made to pX since the OP_SCopy. + ** A significant change would indicated a missed call to this + ** function for pX. Minor changes, such as adding or removing a + ** dual type, are allowed, as long as the underlying value is the + ** same. */ + mFlags = pMem->flags & pX->flags & pX->mScopyFlags; + assert( (mFlags&(MEM_Int|MEM_IntReal))==0 || pMem->u.i==pX->u.i ); + + /* pMem is the register that is changing. But also mark pX as + ** undefined so that we can quickly detect the shallow-copy error */ + pX->flags = MEM_Undefined; + pX->pScopyFrom = 0; + } + } + pMem->pScopyFrom = 0; +} +#endif /* SQLITE_DEBUG */ + +/* +** Make an shallow copy of pFrom into pTo. Prior contents of +** pTo are freed. The pFrom->z field is not duplicated. If +** pFrom->z is used, then pTo->z points to the same thing as pFrom->z +** and flags gets srcType (either MEM_Ephem or MEM_Static). +*/ +static SQLITE_NOINLINE void vdbeClrCopy(Mem *pTo, const Mem *pFrom, int eType){ + vdbeMemClearExternAndSetNull(pTo); + assert( !VdbeMemDynamic(pTo) ); + sqlite3VdbeMemShallowCopy(pTo, pFrom, eType); +} +SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){ + assert( !sqlite3VdbeMemIsRowSet(pFrom) ); + assert( pTo->db==pFrom->db ); + if( VdbeMemDynamic(pTo) ){ vdbeClrCopy(pTo,pFrom,srcType); return; } + memcpy(pTo, pFrom, MEMCELLSIZE); + if( (pFrom->flags&MEM_Static)==0 ){ + pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Ephem); + assert( srcType==MEM_Ephem || srcType==MEM_Static ); + pTo->flags |= srcType; + } +} + +/* +** Make a full copy of pFrom into pTo. Prior contents of pTo are +** freed before the copy is made. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){ + int rc = SQLITE_OK; + + assert( !sqlite3VdbeMemIsRowSet(pFrom) ); + if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); + memcpy(pTo, pFrom, MEMCELLSIZE); + pTo->flags &= ~MEM_Dyn; + if( pTo->flags&(MEM_Str|MEM_Blob) ){ + if( 0==(pFrom->flags&MEM_Static) ){ + pTo->flags |= MEM_Ephem; + rc = sqlite3VdbeMemMakeWriteable(pTo); + } + } + + return rc; +} + +/* +** Transfer the contents of pFrom to pTo. Any existing value in pTo is +** freed. If pFrom contains ephemeral data, a copy is made. +** +** pFrom contains an SQL NULL when this routine returns. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){ + assert( pFrom->db==0 || sqlite3_mutex_held(pFrom->db->mutex) ); + assert( pTo->db==0 || sqlite3_mutex_held(pTo->db->mutex) ); + assert( pFrom->db==0 || pTo->db==0 || pFrom->db==pTo->db ); + + sqlite3VdbeMemRelease(pTo); + memcpy(pTo, pFrom, sizeof(Mem)); + pFrom->flags = MEM_Null; + pFrom->szMalloc = 0; +} + +/* +** Change the value of a Mem to be a string or a BLOB. +** +** The memory management strategy depends on the value of the xDel +** parameter. If the value passed is SQLITE_TRANSIENT, then the +** string is copied into a (possibly existing) buffer managed by the +** Mem structure. Otherwise, any existing buffer is freed and the +** pointer copied. +** +** If the string is too large (if it exceeds the SQLITE_LIMIT_LENGTH +** size limit) then no memory allocation occurs. If the string can be +** stored without allocating memory, then it is. If a memory allocation +** is required to store the string, then value of pMem is unchanged. In +** either case, SQLITE_TOOBIG is returned. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemSetStr( + Mem *pMem, /* Memory cell to set to string value */ + const char *z, /* String pointer */ + int n, /* Bytes in string, or negative */ + u8 enc, /* Encoding of z. 0 for BLOBs */ + void (*xDel)(void*) /* Destructor function */ +){ + int nByte = n; /* New value for pMem->n */ + int iLimit; /* Maximum allowed string or blob size */ + u16 flags = 0; /* New value for pMem->flags */ + + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + + /* If z is a NULL pointer, set pMem to contain an SQL NULL. */ + if( !z ){ + sqlite3VdbeMemSetNull(pMem); + return SQLITE_OK; + } + + if( pMem->db ){ + iLimit = pMem->db->aLimit[SQLITE_LIMIT_LENGTH]; + }else{ + iLimit = SQLITE_MAX_LENGTH; + } + flags = (enc==0?MEM_Blob:MEM_Str); + if( nByte<0 ){ + assert( enc!=0 ); + if( enc==SQLITE_UTF8 ){ + nByte = 0x7fffffff & (int)strlen(z); + }else{ + for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} + } + flags |= MEM_Term; + } + + /* The following block sets the new values of Mem.z and Mem.xDel. It + ** also sets a flag in local variable "flags" to indicate the memory + ** management (one of MEM_Dyn or MEM_Static). + */ + if( xDel==SQLITE_TRANSIENT ){ + u32 nAlloc = nByte; + if( flags&MEM_Term ){ + nAlloc += (enc==SQLITE_UTF8?1:2); + } + if( nByte>iLimit ){ + return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); + } + testcase( nAlloc==0 ); + testcase( nAlloc==31 ); + testcase( nAlloc==32 ); + if( sqlite3VdbeMemClearAndResize(pMem, (int)MAX(nAlloc,32)) ){ + return SQLITE_NOMEM_BKPT; + } + memcpy(pMem->z, z, nAlloc); + }else{ + sqlite3VdbeMemRelease(pMem); + pMem->z = (char *)z; + if( xDel==SQLITE_DYNAMIC ){ + pMem->zMalloc = pMem->z; + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); + }else{ + pMem->xDel = xDel; + flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn); + } + } + + pMem->n = nByte; + pMem->flags = flags; + if( enc ){ + pMem->enc = enc; +#ifdef SQLITE_ENABLE_SESSION + }else if( pMem->db==0 ){ + pMem->enc = SQLITE_UTF8; +#endif + }else{ + assert( pMem->db!=0 ); + pMem->enc = ENC(pMem->db); + } + +#ifndef SQLITE_OMIT_UTF16 + if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ + return SQLITE_NOMEM_BKPT; + } +#endif + + if( nByte>iLimit ){ + return SQLITE_TOOBIG; + } + + return SQLITE_OK; +} + +/* +** Move data out of a btree key or data field and into a Mem structure. +** The data is payload from the entry that pCur is currently pointing +** to. offset and amt determine what portion of the data or key to retrieve. +** The result is written into the pMem element. +** +** The pMem object must have been initialized. This routine will use +** pMem->zMalloc to hold the content from the btree, if possible. New +** pMem->zMalloc space will be allocated if necessary. The calling routine +** is responsible for making sure that the pMem object is eventually +** destroyed. +** +** If this routine fails for any reason (malloc returns NULL or unable +** to read from the disk) then the pMem is left in an inconsistent state. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemFromBtree( + BtCursor *pCur, /* Cursor pointing at record to retrieve. */ + u32 offset, /* Offset from the start of data to return bytes from. */ + u32 amt, /* Number of bytes to return. */ + Mem *pMem /* OUT: Return data in this Mem structure. */ +){ + int rc; + pMem->flags = MEM_Null; + if( sqlite3BtreeMaxRecordSize(pCur)z); + if( rc==SQLITE_OK ){ + pMem->z[amt] = 0; /* Overrun area used when reading malformed records */ + pMem->flags = MEM_Blob; + pMem->n = (int)amt; + }else{ + sqlite3VdbeMemRelease(pMem); + } + } + return rc; +} +SQLITE_PRIVATE int sqlite3VdbeMemFromBtreeZeroOffset( + BtCursor *pCur, /* Cursor pointing at record to retrieve. */ + u32 amt, /* Number of bytes to return. */ + Mem *pMem /* OUT: Return data in this Mem structure. */ +){ + u32 available = 0; /* Number of bytes available on the local btree page */ + int rc = SQLITE_OK; /* Return code */ + + assert( sqlite3BtreeCursorIsValid(pCur) ); + assert( !VdbeMemDynamic(pMem) ); + + /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert() + ** that both the BtShared and database handle mutexes are held. */ + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + pMem->z = (char *)sqlite3BtreePayloadFetch(pCur, &available); + assert( pMem->z!=0 ); + + if( amt<=available ){ + pMem->flags = MEM_Blob|MEM_Ephem; + pMem->n = (int)amt; + }else{ + rc = sqlite3VdbeMemFromBtree(pCur, 0, amt, pMem); + } + + return rc; +} + +/* +** The pVal argument is known to be a value other than NULL. +** Convert it into a string with encoding enc and return a pointer +** to a zero-terminated version of that string. +*/ +static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){ + assert( pVal!=0 ); + assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) ); + assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) ); + assert( !sqlite3VdbeMemIsRowSet(pVal) ); + assert( (pVal->flags & (MEM_Null))==0 ); + if( pVal->flags & (MEM_Blob|MEM_Str) ){ + if( ExpandBlob(pVal) ) return 0; + pVal->flags |= MEM_Str; + if( pVal->enc != (enc & ~SQLITE_UTF16_ALIGNED) ){ + sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED); + } + if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&SQLITE_PTR_TO_INT(pVal->z)) ){ + assert( (pVal->flags & (MEM_Ephem|MEM_Static))!=0 ); + if( sqlite3VdbeMemMakeWriteable(pVal)!=SQLITE_OK ){ + return 0; + } + } + sqlite3VdbeMemNulTerminate(pVal); /* IMP: R-31275-44060 */ + }else{ + sqlite3VdbeMemStringify(pVal, enc, 0); + assert( 0==(1&SQLITE_PTR_TO_INT(pVal->z)) ); + } + assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0 + || pVal->db->mallocFailed ); + if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){ + assert( sqlite3VdbeMemValidStrRep(pVal) ); + return pVal->z; + }else{ + return 0; + } +} + +/* This function is only available internally, it is not part of the +** external API. It works in a similar way to sqlite3_value_text(), +** except the data returned is in the encoding specified by the second +** parameter, which must be one of SQLITE_UTF16BE, SQLITE_UTF16LE or +** SQLITE_UTF8. +** +** (2006-02-16:) The enc value can be or-ed with SQLITE_UTF16_ALIGNED. +** If that is the case, then the result must be aligned on an even byte +** boundary. +*/ +SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){ + if( !pVal ) return 0; + assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) ); + assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) ); + assert( !sqlite3VdbeMemIsRowSet(pVal) ); + if( (pVal->flags&(MEM_Str|MEM_Term))==(MEM_Str|MEM_Term) && pVal->enc==enc ){ + assert( sqlite3VdbeMemValidStrRep(pVal) ); + return pVal->z; + } + if( pVal->flags&MEM_Null ){ + return 0; + } + return valueToText(pVal, enc); +} + +/* +** Create a new sqlite3_value object. +*/ +SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *db){ + Mem *p = sqlite3DbMallocZero(db, sizeof(*p)); + if( p ){ + p->flags = MEM_Null; + p->db = db; + } + return p; +} + +/* +** Context object passed by sqlite3Stat4ProbeSetValue() through to +** valueNew(). See comments above valueNew() for details. +*/ +struct ValueNewStat4Ctx { + Parse *pParse; + Index *pIdx; + UnpackedRecord **ppRec; + int iVal; +}; + +/* +** Allocate and return a pointer to a new sqlite3_value object. If +** the second argument to this function is NULL, the object is allocated +** by calling sqlite3ValueNew(). +** +** Otherwise, if the second argument is non-zero, then this function is +** being called indirectly by sqlite3Stat4ProbeSetValue(). If it has not +** already been allocated, allocate the UnpackedRecord structure that +** that function will return to its caller here. Then return a pointer to +** an sqlite3_value within the UnpackedRecord.a[] array. +*/ +static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ +#ifdef SQLITE_ENABLE_STAT4 + if( p ){ + UnpackedRecord *pRec = p->ppRec[0]; + + if( pRec==0 ){ + Index *pIdx = p->pIdx; /* Index being probed */ + int nByte; /* Bytes of space to allocate */ + int i; /* Counter variable */ + int nCol = pIdx->nColumn; /* Number of index columns including rowid */ + + nByte = sizeof(Mem) * nCol + ROUND8(sizeof(UnpackedRecord)); + pRec = (UnpackedRecord*)sqlite3DbMallocZero(db, nByte); + if( pRec ){ + pRec->pKeyInfo = sqlite3KeyInfoOfIndex(p->pParse, pIdx); + if( pRec->pKeyInfo ){ + assert( pRec->pKeyInfo->nAllField==nCol ); + assert( pRec->pKeyInfo->enc==ENC(db) ); + pRec->aMem = (Mem *)((u8*)pRec + ROUND8(sizeof(UnpackedRecord))); + for(i=0; iaMem[i].flags = MEM_Null; + pRec->aMem[i].db = db; + } + }else{ + sqlite3DbFreeNN(db, pRec); + pRec = 0; + } + } + if( pRec==0 ) return 0; + p->ppRec[0] = pRec; + } + + pRec->nField = p->iVal+1; + return &pRec->aMem[p->iVal]; + } +#else + UNUSED_PARAMETER(p); +#endif /* defined(SQLITE_ENABLE_STAT4) */ + return sqlite3ValueNew(db); +} + +/* +** The expression object indicated by the second argument is guaranteed +** to be a scalar SQL function. If +** +** * all function arguments are SQL literals, +** * one of the SQLITE_FUNC_CONSTANT or _SLOCHNG function flags is set, and +** * the SQLITE_FUNC_NEEDCOLL function flag is not set, +** +** then this routine attempts to invoke the SQL function. Assuming no +** error occurs, output parameter (*ppVal) is set to point to a value +** object containing the result before returning SQLITE_OK. +** +** Affinity aff is applied to the result of the function before returning. +** If the result is a text value, the sqlite3_value object uses encoding +** enc. +** +** If the conditions above are not met, this function returns SQLITE_OK +** and sets (*ppVal) to NULL. Or, if an error occurs, (*ppVal) is set to +** NULL and an SQLite error code returned. +*/ +#ifdef SQLITE_ENABLE_STAT4 +static int valueFromFunction( + sqlite3 *db, /* The database connection */ + Expr *p, /* The expression to evaluate */ + u8 enc, /* Encoding to use */ + u8 aff, /* Affinity to use */ + sqlite3_value **ppVal, /* Write the new value here */ + struct ValueNewStat4Ctx *pCtx /* Second argument for valueNew() */ +){ + sqlite3_context ctx; /* Context object for function invocation */ + sqlite3_value **apVal = 0; /* Function arguments */ + int nVal = 0; /* Size of apVal[] array */ + FuncDef *pFunc = 0; /* Function definition */ + sqlite3_value *pVal = 0; /* New value */ + int rc = SQLITE_OK; /* Return code */ + ExprList *pList = 0; /* Function arguments */ + int i; /* Iterator variable */ + + assert( pCtx!=0 ); + assert( (p->flags & EP_TokenOnly)==0 ); + pList = p->x.pList; + if( pList ) nVal = pList->nExpr; + pFunc = sqlite3FindFunction(db, p->u.zToken, nVal, enc, 0); + assert( pFunc ); + if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0 + || (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) + ){ + return SQLITE_OK; + } + + if( pList ){ + apVal = (sqlite3_value**)sqlite3DbMallocZero(db, sizeof(apVal[0]) * nVal); + if( apVal==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto value_from_function_out; + } + for(i=0; ia[i].pExpr, enc, aff, &apVal[i]); + if( apVal[i]==0 || rc!=SQLITE_OK ) goto value_from_function_out; + } + } + + pVal = valueNew(db, pCtx); + if( pVal==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto value_from_function_out; + } + + assert( pCtx->pParse->rc==SQLITE_OK ); + memset(&ctx, 0, sizeof(ctx)); + ctx.pOut = pVal; + ctx.pFunc = pFunc; + pFunc->xSFunc(&ctx, nVal, apVal); + if( ctx.isError ){ + rc = ctx.isError; + sqlite3ErrorMsg(pCtx->pParse, "%s", sqlite3_value_text(pVal)); + }else{ + sqlite3ValueApplyAffinity(pVal, aff, SQLITE_UTF8); + assert( rc==SQLITE_OK ); + rc = sqlite3VdbeChangeEncoding(pVal, enc); + if( rc==SQLITE_OK && sqlite3VdbeMemTooBig(pVal) ){ + rc = SQLITE_TOOBIG; + pCtx->pParse->nErr++; + } + } + pCtx->pParse->rc = rc; + + value_from_function_out: + if( rc!=SQLITE_OK ){ + pVal = 0; + } + if( apVal ){ + for(i=0; iop)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft; +#if defined(SQLITE_ENABLE_STAT4) + if( op==TK_REGISTER ) op = pExpr->op2; +#else + if( NEVER(op==TK_REGISTER) ) op = pExpr->op2; +#endif + + /* Compressed expressions only appear when parsing the DEFAULT clause + ** on a table column definition, and hence only when pCtx==0. This + ** check ensures that an EP_TokenOnly expression is never passed down + ** into valueFromFunction(). */ + assert( (pExpr->flags & EP_TokenOnly)==0 || pCtx==0 ); + + if( op==TK_CAST ){ + u8 aff = sqlite3AffinityType(pExpr->u.zToken,0); + rc = valueFromExpr(db, pExpr->pLeft, enc, aff, ppVal, pCtx); + testcase( rc!=SQLITE_OK ); + if( *ppVal ){ + sqlite3VdbeMemCast(*ppVal, aff, SQLITE_UTF8); + sqlite3ValueApplyAffinity(*ppVal, affinity, SQLITE_UTF8); + } + return rc; + } + + /* Handle negative integers in a single step. This is needed in the + ** case when the value is -9223372036854775808. + */ + if( op==TK_UMINUS + && (pExpr->pLeft->op==TK_INTEGER || pExpr->pLeft->op==TK_FLOAT) ){ + pExpr = pExpr->pLeft; + op = pExpr->op; + negInt = -1; + zNeg = "-"; + } + + if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){ + pVal = valueNew(db, pCtx); + if( pVal==0 ) goto no_mem; + if( ExprHasProperty(pExpr, EP_IntValue) ){ + sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue*negInt); + }else{ + zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken); + if( zVal==0 ) goto no_mem; + sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC); + } + if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_BLOB ){ + sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8); + }else{ + sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8); + } + assert( (pVal->flags & MEM_IntReal)==0 ); + if( pVal->flags & (MEM_Int|MEM_IntReal|MEM_Real) ){ + testcase( pVal->flags & MEM_Int ); + testcase( pVal->flags & MEM_Real ); + pVal->flags &= ~MEM_Str; + } + if( enc!=SQLITE_UTF8 ){ + rc = sqlite3VdbeChangeEncoding(pVal, enc); + } + }else if( op==TK_UMINUS ) { + /* This branch happens for multiple negative signs. Ex: -(-5) */ + if( SQLITE_OK==valueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal,pCtx) + && pVal!=0 + ){ + sqlite3VdbeMemNumerify(pVal); + if( pVal->flags & MEM_Real ){ + pVal->u.r = -pVal->u.r; + }else if( pVal->u.i==SMALLEST_INT64 ){ +#ifndef SQLITE_OMIT_FLOATING_POINT + pVal->u.r = -(double)SMALLEST_INT64; +#else + pVal->u.r = LARGEST_INT64; +#endif + MemSetTypeFlag(pVal, MEM_Real); + }else{ + pVal->u.i = -pVal->u.i; + } + sqlite3ValueApplyAffinity(pVal, affinity, enc); + } + }else if( op==TK_NULL ){ + pVal = valueNew(db, pCtx); + if( pVal==0 ) goto no_mem; + sqlite3VdbeMemSetNull(pVal); + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + else if( op==TK_BLOB ){ + int nVal; + assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' ); + assert( pExpr->u.zToken[1]=='\'' ); + pVal = valueNew(db, pCtx); + if( !pVal ) goto no_mem; + zVal = &pExpr->u.zToken[2]; + nVal = sqlite3Strlen30(zVal)-1; + assert( zVal[nVal]=='\'' ); + sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2, + 0, SQLITE_DYNAMIC); + } +#endif +#ifdef SQLITE_ENABLE_STAT4 + else if( op==TK_FUNCTION && pCtx!=0 ){ + rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx); + } +#endif + else if( op==TK_TRUEFALSE ){ + pVal = valueNew(db, pCtx); + if( pVal ){ + pVal->flags = MEM_Int; + pVal->u.i = pExpr->u.zToken[4]==0; + } + } + + *ppVal = pVal; + return rc; + +no_mem: +#ifdef SQLITE_ENABLE_STAT4 + if( pCtx==0 || pCtx->pParse->nErr==0 ) +#endif + sqlite3OomFault(db); + sqlite3DbFree(db, zVal); + assert( *ppVal==0 ); +#ifdef SQLITE_ENABLE_STAT4 + if( pCtx==0 ) sqlite3ValueFree(pVal); +#else + assert( pCtx==0 ); sqlite3ValueFree(pVal); +#endif + return SQLITE_NOMEM_BKPT; +} + +/* +** Create a new sqlite3_value object, containing the value of pExpr. +** +** This only works for very simple expressions that consist of one constant +** token (i.e. "5", "5.1", "'a string'"). If the expression can +** be converted directly into a value, then the value is allocated and +** a pointer written to *ppVal. The caller is responsible for deallocating +** the value by passing it to sqlite3ValueFree() later on. If the expression +** cannot be converted to a value, then *ppVal is set to NULL. +*/ +SQLITE_PRIVATE int sqlite3ValueFromExpr( + sqlite3 *db, /* The database connection */ + Expr *pExpr, /* The expression to evaluate */ + u8 enc, /* Encoding to use */ + u8 affinity, /* Affinity to use */ + sqlite3_value **ppVal /* Write the new value here */ +){ + return pExpr ? valueFromExpr(db, pExpr, enc, affinity, ppVal, 0) : 0; +} + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Attempt to extract a value from pExpr and use it to construct *ppVal. +** +** If pAlloc is not NULL, then an UnpackedRecord object is created for +** pAlloc if one does not exist and the new value is added to the +** UnpackedRecord object. +** +** A value is extracted in the following cases: +** +** * (pExpr==0). In this case the value is assumed to be an SQL NULL, +** +** * The expression is a bound variable, and this is a reprepare, or +** +** * The expression is a literal value. +** +** On success, *ppVal is made to point to the extracted value. The caller +** is responsible for ensuring that the value is eventually freed. +*/ +static int stat4ValueFromExpr( + Parse *pParse, /* Parse context */ + Expr *pExpr, /* The expression to extract a value from */ + u8 affinity, /* Affinity to use */ + struct ValueNewStat4Ctx *pAlloc,/* How to allocate space. Or NULL */ + sqlite3_value **ppVal /* OUT: New value object (or NULL) */ +){ + int rc = SQLITE_OK; + sqlite3_value *pVal = 0; + sqlite3 *db = pParse->db; + + /* Skip over any TK_COLLATE nodes */ + pExpr = sqlite3ExprSkipCollate(pExpr); + + assert( pExpr==0 || pExpr->op!=TK_REGISTER || pExpr->op2!=TK_VARIABLE ); + if( !pExpr ){ + pVal = valueNew(db, pAlloc); + if( pVal ){ + sqlite3VdbeMemSetNull((Mem*)pVal); + } + }else if( pExpr->op==TK_VARIABLE && (db->flags & SQLITE_EnableQPSG)==0 ){ + Vdbe *v; + int iBindVar = pExpr->iColumn; + sqlite3VdbeSetVarmask(pParse->pVdbe, iBindVar); + if( (v = pParse->pReprepare)!=0 ){ + pVal = valueNew(db, pAlloc); + if( pVal ){ + rc = sqlite3VdbeMemCopy((Mem*)pVal, &v->aVar[iBindVar-1]); + sqlite3ValueApplyAffinity(pVal, affinity, ENC(db)); + pVal->db = pParse->db; + } + } + }else{ + rc = valueFromExpr(db, pExpr, ENC(db), affinity, &pVal, pAlloc); + } + + assert( pVal==0 || pVal->db==db ); + *ppVal = pVal; + return rc; +} + +/* +** This function is used to allocate and populate UnpackedRecord +** structures intended to be compared against sample index keys stored +** in the sqlite_stat4 table. +** +** A single call to this function populates zero or more fields of the +** record starting with field iVal (fields are numbered from left to +** right starting with 0). A single field is populated if: +** +** * (pExpr==0). In this case the value is assumed to be an SQL NULL, +** +** * The expression is a bound variable, and this is a reprepare, or +** +** * The sqlite3ValueFromExpr() function is able to extract a value +** from the expression (i.e. the expression is a literal value). +** +** Or, if pExpr is a TK_VECTOR, one field is populated for each of the +** vector components that match either of the two latter criteria listed +** above. +** +** Before any value is appended to the record, the affinity of the +** corresponding column within index pIdx is applied to it. Before +** this function returns, output parameter *pnExtract is set to the +** number of values appended to the record. +** +** When this function is called, *ppRec must either point to an object +** allocated by an earlier call to this function, or must be NULL. If it +** is NULL and a value can be successfully extracted, a new UnpackedRecord +** is allocated (and *ppRec set to point to it) before returning. +** +** Unless an error is encountered, SQLITE_OK is returned. It is not an +** error if a value cannot be extracted from pExpr. If an error does +** occur, an SQLite error code is returned. +*/ +SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( + Parse *pParse, /* Parse context */ + Index *pIdx, /* Index being probed */ + UnpackedRecord **ppRec, /* IN/OUT: Probe record */ + Expr *pExpr, /* The expression to extract a value from */ + int nElem, /* Maximum number of values to append */ + int iVal, /* Array element to populate */ + int *pnExtract /* OUT: Values appended to the record */ +){ + int rc = SQLITE_OK; + int nExtract = 0; + + if( pExpr==0 || pExpr->op!=TK_SELECT ){ + int i; + struct ValueNewStat4Ctx alloc; + + alloc.pParse = pParse; + alloc.pIdx = pIdx; + alloc.ppRec = ppRec; + + for(i=0; idb, pIdx, iVal+i); + alloc.iVal = iVal+i; + rc = stat4ValueFromExpr(pParse, pElem, aff, &alloc, &pVal); + if( !pVal ) break; + nExtract++; + } + } + + *pnExtract = nExtract; + return rc; +} + +/* +** Attempt to extract a value from expression pExpr using the methods +** as described for sqlite3Stat4ProbeSetValue() above. +** +** If successful, set *ppVal to point to a new value object and return +** SQLITE_OK. If no value can be extracted, but no other error occurs +** (e.g. OOM), return SQLITE_OK and set *ppVal to NULL. Or, if an error +** does occur, return an SQLite error code. The final value of *ppVal +** is undefined in this case. +*/ +SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr( + Parse *pParse, /* Parse context */ + Expr *pExpr, /* The expression to extract a value from */ + u8 affinity, /* Affinity to use */ + sqlite3_value **ppVal /* OUT: New value object (or NULL) */ +){ + return stat4ValueFromExpr(pParse, pExpr, affinity, 0, ppVal); +} + +/* +** Extract the iCol-th column from the nRec-byte record in pRec. Write +** the column value into *ppVal. If *ppVal is initially NULL then a new +** sqlite3_value object is allocated. +** +** If *ppVal is initially NULL then the caller is responsible for +** ensuring that the value written into *ppVal is eventually freed. +*/ +SQLITE_PRIVATE int sqlite3Stat4Column( + sqlite3 *db, /* Database handle */ + const void *pRec, /* Pointer to buffer containing record */ + int nRec, /* Size of buffer pRec in bytes */ + int iCol, /* Column to extract */ + sqlite3_value **ppVal /* OUT: Extracted value */ +){ + u32 t = 0; /* a column type code */ + int nHdr; /* Size of the header in the record */ + int iHdr; /* Next unread header byte */ + int iField; /* Next unread data byte */ + int szField = 0; /* Size of the current data field */ + int i; /* Column index */ + u8 *a = (u8*)pRec; /* Typecast byte array */ + Mem *pMem = *ppVal; /* Write result into this Mem object */ + + assert( iCol>0 ); + iHdr = getVarint32(a, nHdr); + if( nHdr>nRec || iHdr>=nHdr ) return SQLITE_CORRUPT_BKPT; + iField = nHdr; + for(i=0; i<=iCol; i++){ + iHdr += getVarint32(&a[iHdr], t); + testcase( iHdr==nHdr ); + testcase( iHdr==nHdr+1 ); + if( iHdr>nHdr ) return SQLITE_CORRUPT_BKPT; + szField = sqlite3VdbeSerialTypeLen(t); + iField += szField; + } + testcase( iField==nRec ); + testcase( iField==nRec+1 ); + if( iField>nRec ) return SQLITE_CORRUPT_BKPT; + if( pMem==0 ){ + pMem = *ppVal = sqlite3ValueNew(db); + if( pMem==0 ) return SQLITE_NOMEM_BKPT; + } + sqlite3VdbeSerialGet(&a[iField-szField], t, pMem); + pMem->enc = ENC(db); + return SQLITE_OK; +} + +/* +** Unless it is NULL, the argument must be an UnpackedRecord object returned +** by an earlier call to sqlite3Stat4ProbeSetValue(). This call deletes +** the object. +*/ +SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord *pRec){ + if( pRec ){ + int i; + int nCol = pRec->pKeyInfo->nAllField; + Mem *aMem = pRec->aMem; + sqlite3 *db = aMem[0].db; + for(i=0; ipKeyInfo); + sqlite3DbFreeNN(db, pRec); + } +} +#endif /* ifdef SQLITE_ENABLE_STAT4 */ + +/* +** Change the string value of an sqlite3_value object +*/ +SQLITE_PRIVATE void sqlite3ValueSetStr( + sqlite3_value *v, /* Value to be set */ + int n, /* Length of string z */ + const void *z, /* Text of the new string */ + u8 enc, /* Encoding to use */ + void (*xDel)(void*) /* Destructor for the string */ +){ + if( v ) sqlite3VdbeMemSetStr((Mem *)v, z, n, enc, xDel); +} + +/* +** Free an sqlite3_value object +*/ +SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value *v){ + if( !v ) return; + sqlite3VdbeMemRelease((Mem *)v); + sqlite3DbFreeNN(((Mem*)v)->db, v); +} + +/* +** The sqlite3ValueBytes() routine returns the number of bytes in the +** sqlite3_value object assuming that it uses the encoding "enc". +** The valueBytes() routine is a helper function. +*/ +static SQLITE_NOINLINE int valueBytes(sqlite3_value *pVal, u8 enc){ + return valueToText(pVal, enc)!=0 ? pVal->n : 0; +} +SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ + Mem *p = (Mem*)pVal; + assert( (p->flags & MEM_Null)==0 || (p->flags & (MEM_Str|MEM_Blob))==0 ); + if( (p->flags & MEM_Str)!=0 && pVal->enc==enc ){ + return p->n; + } + if( (p->flags & MEM_Blob)!=0 ){ + if( p->flags & MEM_Zero ){ + return p->n + p->u.nZero; + }else{ + return p->n; + } + } + if( p->flags & MEM_Null ) return 0; + return valueBytes(pVal, enc); +} + +/************** End of vdbemem.c *********************************************/ +/************** Begin file vdbeaux.c *****************************************/ +/* +** 2003 September 6 +** +** 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 code used for creating, destroying, and populating +** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* Forward references */ +static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef); +static void vdbeFreeOpArray(sqlite3 *, Op *, int); + +/* +** Create a new virtual database engine. +*/ +SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ + sqlite3 *db = pParse->db; + Vdbe *p; + p = sqlite3DbMallocRawNN(db, sizeof(Vdbe) ); + if( p==0 ) return 0; + memset(&p->aOp, 0, sizeof(Vdbe)-offsetof(Vdbe,aOp)); + p->db = db; + if( db->pVdbe ){ + db->pVdbe->pPrev = p; + } + p->pNext = db->pVdbe; + p->pPrev = 0; + db->pVdbe = p; + p->magic = VDBE_MAGIC_INIT; + p->pParse = pParse; + pParse->pVdbe = p; + assert( pParse->aLabel==0 ); + assert( pParse->nLabel==0 ); + assert( p->nOpAlloc==0 ); + assert( pParse->szOpAlloc==0 ); + sqlite3VdbeAddOp2(p, OP_Init, 0, 1); + return p; +} + +/* +** Return the Parse object that owns a Vdbe object. +*/ +SQLITE_PRIVATE Parse *sqlite3VdbeParser(Vdbe *p){ + return p->pParse; +} + +/* +** Change the error string stored in Vdbe.zErrMsg +*/ +SQLITE_PRIVATE void sqlite3VdbeError(Vdbe *p, const char *zFormat, ...){ + va_list ap; + sqlite3DbFree(p->db, p->zErrMsg); + va_start(ap, zFormat); + p->zErrMsg = sqlite3VMPrintf(p->db, zFormat, ap); + va_end(ap); +} + +/* +** Remember the SQL string for a prepared statement. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, u8 prepFlags){ + if( p==0 ) return; + p->prepFlags = prepFlags; + if( (prepFlags & SQLITE_PREPARE_SAVESQL)==0 ){ + p->expmask = 0; + } + assert( p->zSql==0 ); + p->zSql = sqlite3DbStrNDup(p->db, z, n); +} + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Add a new element to the Vdbe->pDblStr list. +*/ +SQLITE_PRIVATE void sqlite3VdbeAddDblquoteStr(sqlite3 *db, Vdbe *p, const char *z){ + if( p ){ + int n = sqlite3Strlen30(z); + DblquoteStr *pStr = sqlite3DbMallocRawNN(db, + sizeof(*pStr)+n+1-sizeof(pStr->z)); + if( pStr ){ + pStr->pNextStr = p->pDblStr; + p->pDblStr = pStr; + memcpy(pStr->z, z, n+1); + } + } +} +#endif + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** zId of length nId is a double-quoted identifier. Check to see if +** that identifier is really used as a string literal. +*/ +SQLITE_PRIVATE int sqlite3VdbeUsesDoubleQuotedString( + Vdbe *pVdbe, /* The prepared statement */ + const char *zId /* The double-quoted identifier, already dequoted */ +){ + DblquoteStr *pStr; + assert( zId!=0 ); + if( pVdbe->pDblStr==0 ) return 0; + for(pStr=pVdbe->pDblStr; pStr; pStr=pStr->pNextStr){ + if( strcmp(zId, pStr->z)==0 ) return 1; + } + return 0; +} +#endif + +/* +** Swap all content between two VDBE structures. +*/ +SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ + Vdbe tmp, *pTmp; + char *zTmp; + assert( pA->db==pB->db ); + tmp = *pA; + *pA = *pB; + *pB = tmp; + pTmp = pA->pNext; + pA->pNext = pB->pNext; + pB->pNext = pTmp; + pTmp = pA->pPrev; + pA->pPrev = pB->pPrev; + pB->pPrev = pTmp; + zTmp = pA->zSql; + pA->zSql = pB->zSql; + pB->zSql = zTmp; +#ifdef SQLITE_ENABLE_NORMALIZE + zTmp = pA->zNormSql; + pA->zNormSql = pB->zNormSql; + pB->zNormSql = zTmp; +#endif + pB->expmask = pA->expmask; + pB->prepFlags = pA->prepFlags; + memcpy(pB->aCounter, pA->aCounter, sizeof(pB->aCounter)); + pB->aCounter[SQLITE_STMTSTATUS_REPREPARE]++; +} + +/* +** Resize the Vdbe.aOp array so that it is at least nOp elements larger +** than its current size. nOp is guaranteed to be less than or equal +** to 1024/sizeof(Op). +** +** If an out-of-memory error occurs while resizing the array, return +** SQLITE_NOMEM. In this case Vdbe.aOp and Vdbe.nOpAlloc remain +** unchanged (this is so that any opcodes already allocated can be +** correctly deallocated along with the rest of the Vdbe). +*/ +static int growOpArray(Vdbe *v, int nOp){ + VdbeOp *pNew; + Parse *p = v->pParse; + + /* The SQLITE_TEST_REALLOC_STRESS compile-time option is designed to force + ** more frequent reallocs and hence provide more opportunities for + ** simulated OOM faults. SQLITE_TEST_REALLOC_STRESS is generally used + ** during testing only. With SQLITE_TEST_REALLOC_STRESS grow the op array + ** by the minimum* amount required until the size reaches 512. Normal + ** operation (without SQLITE_TEST_REALLOC_STRESS) is to double the current + ** size of the op array or add 1KB of space, whichever is smaller. */ +#ifdef SQLITE_TEST_REALLOC_STRESS + sqlite3_int64 nNew = (v->nOpAlloc>=512 ? 2*(sqlite3_int64)v->nOpAlloc + : (sqlite3_int64)v->nOpAlloc+nOp); +#else + sqlite3_int64 nNew = (v->nOpAlloc ? 2*(sqlite3_int64)v->nOpAlloc + : (sqlite3_int64)(1024/sizeof(Op))); + UNUSED_PARAMETER(nOp); +#endif + + /* Ensure that the size of a VDBE does not grow too large */ + if( nNew > p->db->aLimit[SQLITE_LIMIT_VDBE_OP] ){ + sqlite3OomFault(p->db); + return SQLITE_NOMEM; + } + + assert( nOp<=(1024/sizeof(Op)) ); + assert( nNew>=(v->nOpAlloc+nOp) ); + pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); + if( pNew ){ + p->szOpAlloc = sqlite3DbMallocSize(p->db, pNew); + v->nOpAlloc = p->szOpAlloc/sizeof(Op); + v->aOp = pNew; + } + return (pNew ? SQLITE_OK : SQLITE_NOMEM_BKPT); +} + +#ifdef SQLITE_DEBUG +/* This routine is just a convenient place to set a breakpoint that will +** fire after each opcode is inserted and displayed using +** "PRAGMA vdbe_addoptrace=on". Parameters "pc" (program counter) and +** pOp are available to make the breakpoint conditional. +** +** Other useful labels for breakpoints include: +** test_trace_breakpoint(pc,pOp) +** sqlite3CorruptError(lineno) +** sqlite3MisuseError(lineno) +** sqlite3CantopenError(lineno) +*/ +static void test_addop_breakpoint(int pc, Op *pOp){ + static int n = 0; + n++; +} +#endif + +/* +** Add a new instruction to the list of instructions current in the +** VDBE. Return the address of the new instruction. +** +** Parameters: +** +** p Pointer to the VDBE +** +** op The opcode for this instruction +** +** p1, p2, p3 Operands +** +** Use the sqlite3VdbeResolveLabel() function to fix an address and +** the sqlite3VdbeChangeP4() function to change the value of the P4 +** operand. +*/ +static SQLITE_NOINLINE int growOp3(Vdbe *p, int op, int p1, int p2, int p3){ + assert( p->nOpAlloc<=p->nOp ); + if( growOpArray(p, 1) ) return 1; + assert( p->nOpAlloc>p->nOp ); + return sqlite3VdbeAddOp3(p, op, p1, p2, p3); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ + int i; + VdbeOp *pOp; + + i = p->nOp; + assert( p->magic==VDBE_MAGIC_INIT ); + assert( op>=0 && op<0xff ); + if( p->nOpAlloc<=i ){ + return growOp3(p, op, p1, p2, p3); + } + p->nOp++; + pOp = &p->aOp[i]; + pOp->opcode = (u8)op; + pOp->p5 = 0; + pOp->p1 = p1; + pOp->p2 = p2; + pOp->p3 = p3; + pOp->p4.p = 0; + pOp->p4type = P4_NOTUSED; +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + pOp->zComment = 0; +#endif +#ifdef SQLITE_DEBUG + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + sqlite3VdbePrintOp(0, i, &p->aOp[i]); + test_addop_breakpoint(i, &p->aOp[i]); + } +#endif +#ifdef VDBE_PROFILE + pOp->cycles = 0; + pOp->cnt = 0; +#endif +#ifdef SQLITE_VDBE_COVERAGE + pOp->iSrcLine = 0; +#endif + return i; +} +SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe *p, int op){ + return sqlite3VdbeAddOp3(p, op, 0, 0, 0); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe *p, int op, int p1){ + return sqlite3VdbeAddOp3(p, op, p1, 0, 0); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe *p, int op, int p1, int p2){ + return sqlite3VdbeAddOp3(p, op, p1, p2, 0); +} + +/* Generate code for an unconditional jump to instruction iDest +*/ +SQLITE_PRIVATE int sqlite3VdbeGoto(Vdbe *p, int iDest){ + return sqlite3VdbeAddOp3(p, OP_Goto, 0, iDest, 0); +} + +/* Generate code to cause the string zStr to be loaded into +** register iDest +*/ +SQLITE_PRIVATE int sqlite3VdbeLoadString(Vdbe *p, int iDest, const char *zStr){ + return sqlite3VdbeAddOp4(p, OP_String8, 0, iDest, 0, zStr, 0); +} + +/* +** Generate code that initializes multiple registers to string or integer +** constants. The registers begin with iDest and increase consecutively. +** One register is initialized for each characgter in zTypes[]. For each +** "s" character in zTypes[], the register is a string if the argument is +** not NULL, or OP_Null if the value is a null pointer. For each "i" character +** in zTypes[], the register is initialized to an integer. +** +** If the input string does not end with "X" then an OP_ResultRow instruction +** is generated for the values inserted. +*/ +SQLITE_PRIVATE void sqlite3VdbeMultiLoad(Vdbe *p, int iDest, const char *zTypes, ...){ + va_list ap; + int i; + char c; + va_start(ap, zTypes); + for(i=0; (c = zTypes[i])!=0; i++){ + if( c=='s' ){ + const char *z = va_arg(ap, const char*); + sqlite3VdbeAddOp4(p, z==0 ? OP_Null : OP_String8, 0, iDest+i, 0, z, 0); + }else if( c=='i' ){ + sqlite3VdbeAddOp2(p, OP_Integer, va_arg(ap, int), iDest+i); + }else{ + goto skip_op_resultrow; + } + } + sqlite3VdbeAddOp2(p, OP_ResultRow, iDest, i); +skip_op_resultrow: + va_end(ap); +} + +/* +** Add an opcode that includes the p4 value as a pointer. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddOp4( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + const char *zP4, /* The P4 operand */ + int p4type /* P4 operand type */ +){ + int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3); + sqlite3VdbeChangeP4(p, addr, zP4, p4type); + return addr; +} + +/* +** Add an OP_Function or OP_PureFunc opcode. +** +** The eCallCtx argument is information (typically taken from Expr.op2) +** that describes the calling context of the function. 0 means a general +** function call. NC_IsCheck means called by a check constraint, +** NC_IdxExpr means called as part of an index expression. NC_PartIdx +** means in the WHERE clause of a partial index. NC_GenCol means called +** while computing a generated column value. 0 is the usual case. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall( + Parse *pParse, /* Parsing context */ + int p1, /* Constant argument mask */ + int p2, /* First argument register */ + int p3, /* Register into which results are written */ + int nArg, /* Number of argument */ + const FuncDef *pFunc, /* The function to be invoked */ + int eCallCtx /* Calling context */ +){ + Vdbe *v = pParse->pVdbe; + int nByte; + int addr; + sqlite3_context *pCtx; + assert( v ); + nByte = sizeof(*pCtx) + (nArg-1)*sizeof(sqlite3_value*); + pCtx = sqlite3DbMallocRawNN(pParse->db, nByte); + if( pCtx==0 ){ + assert( pParse->db->mallocFailed ); + freeEphemeralFunction(pParse->db, (FuncDef*)pFunc); + return 0; + } + pCtx->pOut = 0; + pCtx->pFunc = (FuncDef*)pFunc; + pCtx->pVdbe = 0; + pCtx->isError = 0; + pCtx->argc = nArg; + pCtx->iOp = sqlite3VdbeCurrentAddr(v); + addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function, + p1, p2, p3, (char*)pCtx, P4_FUNCCTX); + sqlite3VdbeChangeP5(v, eCallCtx & NC_SelfRef); + return addr; +} + +/* +** Add an opcode that includes the p4 value with a P4_INT64 or +** P4_REAL type. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + const u8 *zP4, /* The P4 operand */ + int p4type /* P4 operand type */ +){ + char *p4copy = sqlite3DbMallocRawNN(sqlite3VdbeDb(p), 8); + if( p4copy ) memcpy(p4copy, zP4, 8); + return sqlite3VdbeAddOp4(p, op, p1, p2, p3, p4copy, p4type); +} + +#ifndef SQLITE_OMIT_EXPLAIN +/* +** Return the address of the current EXPLAIN QUERY PLAN baseline. +** 0 means "none". +*/ +SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse *pParse){ + VdbeOp *pOp; + if( pParse->addrExplain==0 ) return 0; + pOp = sqlite3VdbeGetOp(pParse->pVdbe, pParse->addrExplain); + return pOp->p2; +} + +/* +** Set a debugger breakpoint on the following routine in order to +** monitor the EXPLAIN QUERY PLAN code generation. +*/ +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ + (void)z1; + (void)z2; +} +#endif + +/* +** Add a new OP_Explain opcode. +** +** If the bPush flag is true, then make this opcode the parent for +** subsequent Explains until sqlite3VdbeExplainPop() is called. +*/ +SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ +#ifndef SQLITE_DEBUG + /* Always include the OP_Explain opcodes if SQLITE_DEBUG is defined. + ** But omit them (for performance) during production builds */ + if( pParse->explain==2 ) +#endif + { + char *zMsg; + Vdbe *v; + va_list ap; + int iThis; + va_start(ap, zFmt); + zMsg = sqlite3VMPrintf(pParse->db, zFmt, ap); + va_end(ap); + v = pParse->pVdbe; + iThis = v->nOp; + sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0, + zMsg, P4_DYNAMIC); + sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetOp(v,-1)->p4.z); + if( bPush){ + pParse->addrExplain = iThis; + } + } +} + +/* +** Pop the EXPLAIN QUERY PLAN stack one level. +*/ +SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse *pParse){ + sqlite3ExplainBreakpoint("POP", 0); + pParse->addrExplain = sqlite3VdbeExplainParent(pParse); +} +#endif /* SQLITE_OMIT_EXPLAIN */ + +/* +** Add an OP_ParseSchema opcode. This routine is broken out from +** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees +** as having been used. +** +** The zWhere string must have been obtained from sqlite3_malloc(). +** This routine will take ownership of the allocated memory. +*/ +SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe *p, int iDb, char *zWhere){ + int j; + sqlite3VdbeAddOp4(p, OP_ParseSchema, iDb, 0, 0, zWhere, P4_DYNAMIC); + for(j=0; jdb->nDb; j++) sqlite3VdbeUsesBtree(p, j); +} + +/* +** Add an opcode that includes the p4 value as an integer. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddOp4Int( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + int p4 /* The P4 operand as an integer */ +){ + int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3); + if( p->db->mallocFailed==0 ){ + VdbeOp *pOp = &p->aOp[addr]; + pOp->p4type = P4_INT32; + pOp->p4.i = p4; + } + return addr; +} + +/* Insert the end of a co-routine +*/ +SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ + sqlite3VdbeAddOp1(v, OP_EndCoroutine, regYield); + + /* Clear the temporary register cache, thereby ensuring that each + ** co-routine has its own independent set of registers, because co-routines + ** might expect their registers to be preserved across an OP_Yield, and + ** that could cause problems if two or more co-routines are using the same + ** temporary register. + */ + v->pParse->nTempReg = 0; + v->pParse->nRangeReg = 0; +} + +/* +** Create a new symbolic label for an instruction that has yet to be +** coded. The symbolic label is really just a negative number. The +** label can be used as the P2 value of an operation. Later, when +** the label is resolved to a specific address, the VDBE will scan +** through its operation list and change all values of P2 which match +** the label into the resolved address. +** +** The VDBE knows that a P2 value is a label because labels are +** always negative and P2 values are suppose to be non-negative. +** Hence, a negative P2 value is a label that has yet to be resolved. +** (Later:) This is only true for opcodes that have the OPFLG_JUMP +** property. +** +** Variable usage notes: +** +** Parse.aLabel[x] Stores the address that the x-th label resolves +** into. For testing (SQLITE_DEBUG), unresolved +** labels stores -1, but that is not required. +** Parse.nLabelAlloc Number of slots allocated to Parse.aLabel[] +** Parse.nLabel The *negative* of the number of labels that have +** been issued. The negative is stored because +** that gives a performance improvement over storing +** the equivalent positive value. +*/ +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse *pParse){ + return --pParse->nLabel; +} + +/* +** Resolve label "x" to be the address of the next instruction to +** be inserted. The parameter "x" must have been obtained from +** a prior call to sqlite3VdbeMakeLabel(). +*/ +static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){ + int nNewSize = 10 - p->nLabel; + p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, + nNewSize*sizeof(p->aLabel[0])); + if( p->aLabel==0 ){ + p->nLabelAlloc = 0; + }else{ +#ifdef SQLITE_DEBUG + int i; + for(i=p->nLabelAlloc; iaLabel[i] = -1; +#endif + p->nLabelAlloc = nNewSize; + p->aLabel[j] = v->nOp; + } +} +SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ + Parse *p = v->pParse; + int j = ADDR(x); + assert( v->magic==VDBE_MAGIC_INIT ); + assert( j<-p->nLabel ); + assert( j>=0 ); +#ifdef SQLITE_DEBUG + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + printf("RESOLVE LABEL %d to %d\n", x, v->nOp); + } +#endif + if( p->nLabelAlloc + p->nLabel < 0 ){ + resizeResolveLabel(p,v,j); + }else{ + assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */ + p->aLabel[j] = v->nOp; + } +} + +/* +** Mark the VDBE as one that can only be run one time. +*/ +SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe *p){ + p->runOnlyOnce = 1; +} + +/* +** Mark the VDBE as one that can only be run multiple times. +*/ +SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe *p){ + p->runOnlyOnce = 0; +} + +#ifdef SQLITE_DEBUG /* sqlite3AssertMayAbort() logic */ + +/* +** The following type and function are used to iterate through all opcodes +** in a Vdbe main program and each of the sub-programs (triggers) it may +** invoke directly or indirectly. It should be used as follows: +** +** Op *pOp; +** VdbeOpIter sIter; +** +** memset(&sIter, 0, sizeof(sIter)); +** sIter.v = v; // v is of type Vdbe* +** while( (pOp = opIterNext(&sIter)) ){ +** // Do something with pOp +** } +** sqlite3DbFree(v->db, sIter.apSub); +** +*/ +typedef struct VdbeOpIter VdbeOpIter; +struct VdbeOpIter { + Vdbe *v; /* Vdbe to iterate through the opcodes of */ + SubProgram **apSub; /* Array of subprograms */ + int nSub; /* Number of entries in apSub */ + int iAddr; /* Address of next instruction to return */ + int iSub; /* 0 = main program, 1 = first sub-program etc. */ +}; +static Op *opIterNext(VdbeOpIter *p){ + Vdbe *v = p->v; + Op *pRet = 0; + Op *aOp; + int nOp; + + if( p->iSub<=p->nSub ){ + + if( p->iSub==0 ){ + aOp = v->aOp; + nOp = v->nOp; + }else{ + aOp = p->apSub[p->iSub-1]->aOp; + nOp = p->apSub[p->iSub-1]->nOp; + } + assert( p->iAddriAddr]; + p->iAddr++; + if( p->iAddr==nOp ){ + p->iSub++; + p->iAddr = 0; + } + + if( pRet->p4type==P4_SUBPROGRAM ){ + int nByte = (p->nSub+1)*sizeof(SubProgram*); + int j; + for(j=0; jnSub; j++){ + if( p->apSub[j]==pRet->p4.pProgram ) break; + } + if( j==p->nSub ){ + p->apSub = sqlite3DbReallocOrFree(v->db, p->apSub, nByte); + if( !p->apSub ){ + pRet = 0; + }else{ + p->apSub[p->nSub++] = pRet->p4.pProgram; + } + } + } + } + + return pRet; +} + +/* +** Check if the program stored in the VM associated with pParse may +** throw an ABORT exception (causing the statement, but not entire transaction +** to be rolled back). This condition is true if the main program or any +** sub-programs contains any of the following: +** +** * OP_Halt with P1=SQLITE_CONSTRAINT and P2=OE_Abort. +** * OP_HaltIfNull with P1=SQLITE_CONSTRAINT and P2=OE_Abort. +** * OP_Destroy +** * OP_VUpdate +** * OP_VCreate +** * OP_VRename +** * OP_FkCounter with P2==0 (immediate foreign key constraint) +** * OP_CreateBtree/BTREE_INTKEY and OP_InitCoroutine +** (for CREATE TABLE AS SELECT ...) +** +** Then check that the value of Parse.mayAbort is true if an +** ABORT may be thrown, or false otherwise. Return true if it does +** match, or false otherwise. This function is intended to be used as +** part of an assert statement in the compiler. Similar to: +** +** assert( sqlite3VdbeAssertMayAbort(pParse->pVdbe, pParse->mayAbort) ); +*/ +SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ + int hasAbort = 0; + int hasFkCounter = 0; + int hasCreateTable = 0; + int hasCreateIndex = 0; + int hasInitCoroutine = 0; + Op *pOp; + VdbeOpIter sIter; + memset(&sIter, 0, sizeof(sIter)); + sIter.v = v; + + while( (pOp = opIterNext(&sIter))!=0 ){ + int opcode = pOp->opcode; + if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename + || opcode==OP_VDestroy + || opcode==OP_VCreate + || (opcode==OP_ParseSchema && pOp->p4.z==0) + || ((opcode==OP_Halt || opcode==OP_HaltIfNull) + && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) + ){ + hasAbort = 1; + break; + } + if( opcode==OP_CreateBtree && pOp->p3==BTREE_INTKEY ) hasCreateTable = 1; + if( mayAbort ){ + /* hasCreateIndex may also be set for some DELETE statements that use + ** OP_Clear. So this routine may end up returning true in the case + ** where a "DELETE FROM tbl" has a statement-journal but does not + ** require one. This is not so bad - it is an inefficiency, not a bug. */ + if( opcode==OP_CreateBtree && pOp->p3==BTREE_BLOBKEY ) hasCreateIndex = 1; + if( opcode==OP_Clear ) hasCreateIndex = 1; + } + if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1; +#ifndef SQLITE_OMIT_FOREIGN_KEY + if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){ + hasFkCounter = 1; + } +#endif + } + sqlite3DbFree(v->db, sIter.apSub); + + /* Return true if hasAbort==mayAbort. Or if a malloc failure occurred. + ** If malloc failed, then the while() loop above may not have iterated + ** through all opcodes and hasAbort may be set incorrectly. Return + ** true for this case to prevent the assert() in the callers frame + ** from failing. */ + return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter + || (hasCreateTable && hasInitCoroutine) || hasCreateIndex + ); +} +#endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */ + +#ifdef SQLITE_DEBUG +/* +** Increment the nWrite counter in the VDBE if the cursor is not an +** ephemeral cursor, or if the cursor argument is NULL. +*/ +SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe *p, VdbeCursor *pC){ + if( pC==0 + || (pC->eCurType!=CURTYPE_SORTER + && pC->eCurType!=CURTYPE_PSEUDO + && !pC->isEphemeral) + ){ + p->nWrite++; + } +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Assert if an Abort at this point in time might result in a corrupt +** database. +*/ +SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe *p){ + assert( p->nWrite==0 || p->usesStmtJournal ); +} +#endif + +/* +** This routine is called after all opcodes have been inserted. It loops +** through all the opcodes and fixes up some details. +** +** (1) For each jump instruction with a negative P2 value (a label) +** resolve the P2 value to an actual address. +** +** (2) Compute the maximum number of arguments used by any SQL function +** and store that value in *pMaxFuncArgs. +** +** (3) Update the Vdbe.readOnly and Vdbe.bIsReader flags to accurately +** indicate what the prepared statement actually does. +** +** (4) Initialize the p4.xAdvance pointer on opcodes that use it. +** +** (5) Reclaim the memory allocated for storing labels. +** +** This routine will only function correctly if the mkopcodeh.tcl generator +** script numbers the opcodes correctly. Changes to this routine must be +** coordinated with changes to mkopcodeh.tcl. +*/ +static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ + int nMaxArgs = *pMaxFuncArgs; + Op *pOp; + Parse *pParse = p->pParse; + int *aLabel = pParse->aLabel; + p->readOnly = 1; + p->bIsReader = 0; + pOp = &p->aOp[p->nOp-1]; + while(1){ + + /* Only JUMP opcodes and the short list of special opcodes in the switch + ** below need to be considered. The mkopcodeh.tcl generator script groups + ** all these opcodes together near the front of the opcode list. Skip + ** any opcode that does not need processing by virtual of the fact that + ** it is larger than SQLITE_MX_JUMP_OPCODE, as a performance optimization. + */ + if( pOp->opcode<=SQLITE_MX_JUMP_OPCODE ){ + /* NOTE: Be sure to update mkopcodeh.tcl when adding or removing + ** cases from this switch! */ + switch( pOp->opcode ){ + case OP_Transaction: { + if( pOp->p2!=0 ) p->readOnly = 0; + /* fall thru */ + } + case OP_AutoCommit: + case OP_Savepoint: { + p->bIsReader = 1; + break; + } +#ifndef SQLITE_OMIT_WAL + case OP_Checkpoint: +#endif + case OP_Vacuum: + case OP_JournalMode: { + p->readOnly = 0; + p->bIsReader = 1; + break; + } + case OP_Next: + case OP_SorterNext: { + pOp->p4.xAdvance = sqlite3BtreeNext; + pOp->p4type = P4_ADVANCE; + /* The code generator never codes any of these opcodes as a jump + ** to a label. They are always coded as a jump backwards to a + ** known address */ + assert( pOp->p2>=0 ); + break; + } + case OP_Prev: { + pOp->p4.xAdvance = sqlite3BtreePrevious; + pOp->p4type = P4_ADVANCE; + /* The code generator never codes any of these opcodes as a jump + ** to a label. They are always coded as a jump backwards to a + ** known address */ + assert( pOp->p2>=0 ); + break; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + case OP_VUpdate: { + if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; + break; + } + case OP_VFilter: { + int n; + assert( (pOp - p->aOp) >= 3 ); + assert( pOp[-1].opcode==OP_Integer ); + n = pOp[-1].p1; + if( n>nMaxArgs ) nMaxArgs = n; + /* Fall through into the default case */ + } +#endif + default: { + if( pOp->p2<0 ){ + /* The mkopcodeh.tcl script has so arranged things that the only + ** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to + ** have non-negative values for P2. */ + assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ); + assert( ADDR(pOp->p2)<-pParse->nLabel ); + pOp->p2 = aLabel[ADDR(pOp->p2)]; + } + break; + } + } + /* The mkopcodeh.tcl script has so arranged things that the only + ** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to + ** have non-negative values for P2. */ + assert( (sqlite3OpcodeProperty[pOp->opcode]&OPFLG_JUMP)==0 || pOp->p2>=0); + } + if( pOp==p->aOp ) break; + pOp--; + } + sqlite3DbFree(p->db, pParse->aLabel); + pParse->aLabel = 0; + pParse->nLabel = 0; + *pMaxFuncArgs = nMaxArgs; + assert( p->bIsReader!=0 || DbMaskAllZero(p->btreeMask) ); +} + +/* +** Return the address of the next instruction to be inserted. +*/ +SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){ + assert( p->magic==VDBE_MAGIC_INIT ); + return p->nOp; +} + +/* +** Verify that at least N opcode slots are available in p without +** having to malloc for more space (except when compiled using +** SQLITE_TEST_REALLOC_STRESS). This interface is used during testing +** to verify that certain calls to sqlite3VdbeAddOpList() can never +** fail due to a OOM fault and hence that the return value from +** sqlite3VdbeAddOpList() will always be non-NULL. +*/ +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N){ + assert( p->nOp + N <= p->nOpAlloc ); +} +#endif + +/* +** Verify that the VM passed as the only argument does not contain +** an OP_ResultRow opcode. Fail an assert() if it does. This is used +** by code in pragma.c to ensure that the implementation of certain +** pragmas comports with the flags specified in the mkpragmatab.tcl +** script. +*/ +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p){ + int i; + for(i=0; inOp; i++){ + assert( p->aOp[i].opcode!=OP_ResultRow ); + } +} +#endif + +/* +** Generate code (a single OP_Abortable opcode) that will +** verify that the VDBE program can safely call Abort in the current +** context. +*/ +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int onError){ + if( onError==OE_Abort ) sqlite3VdbeAddOp0(p, OP_Abortable); +} +#endif + +/* +** This function returns a pointer to the array of opcodes associated with +** the Vdbe passed as the first argument. It is the callers responsibility +** to arrange for the returned array to be eventually freed using the +** vdbeFreeOpArray() function. +** +** Before returning, *pnOp is set to the number of entries in the returned +** array. Also, *pnMaxArg is set to the larger of its current value and +** the number of entries in the Vdbe.apArg[] array required to execute the +** returned program. +*/ +SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){ + VdbeOp *aOp = p->aOp; + assert( aOp && !p->db->mallocFailed ); + + /* Check that sqlite3VdbeUsesBtree() was not called on this VM */ + assert( DbMaskAllZero(p->btreeMask) ); + + resolveP2Values(p, pnMaxArg); + *pnOp = p->nOp; + p->aOp = 0; + return aOp; +} + +/* +** Add a whole list of operations to the operation stack. Return a +** pointer to the first operation inserted. +** +** Non-zero P2 arguments to jump instructions are automatically adjusted +** so that the jump target is relative to the first operation inserted. +*/ +SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( + Vdbe *p, /* Add opcodes to the prepared statement */ + int nOp, /* Number of opcodes to add */ + VdbeOpList const *aOp, /* The opcodes to be added */ + int iLineno /* Source-file line number of first opcode */ +){ + int i; + VdbeOp *pOut, *pFirst; + assert( nOp>0 ); + assert( p->magic==VDBE_MAGIC_INIT ); + if( p->nOp + nOp > p->nOpAlloc && growOpArray(p, nOp) ){ + return 0; + } + pFirst = pOut = &p->aOp[p->nOp]; + for(i=0; iopcode = aOp->opcode; + pOut->p1 = aOp->p1; + pOut->p2 = aOp->p2; + assert( aOp->p2>=0 ); + if( (sqlite3OpcodeProperty[aOp->opcode] & OPFLG_JUMP)!=0 && aOp->p2>0 ){ + pOut->p2 += p->nOp; + } + pOut->p3 = aOp->p3; + pOut->p4type = P4_NOTUSED; + pOut->p4.p = 0; + pOut->p5 = 0; +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + pOut->zComment = 0; +#endif +#ifdef SQLITE_VDBE_COVERAGE + pOut->iSrcLine = iLineno+i; +#else + (void)iLineno; +#endif +#ifdef SQLITE_DEBUG + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + sqlite3VdbePrintOp(0, i+p->nOp, &p->aOp[i+p->nOp]); + } +#endif + } + p->nOp += nOp; + return pFirst; +} + +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) +/* +** Add an entry to the array of counters managed by sqlite3_stmt_scanstatus(). +*/ +SQLITE_PRIVATE void sqlite3VdbeScanStatus( + Vdbe *p, /* VM to add scanstatus() to */ + int addrExplain, /* Address of OP_Explain (or 0) */ + int addrLoop, /* Address of loop counter */ + int addrVisit, /* Address of rows visited counter */ + LogEst nEst, /* Estimated number of output rows */ + const char *zName /* Name of table or index being scanned */ +){ + sqlite3_int64 nByte = (p->nScan+1) * sizeof(ScanStatus); + ScanStatus *aNew; + aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte); + if( aNew ){ + ScanStatus *pNew = &aNew[p->nScan++]; + pNew->addrExplain = addrExplain; + pNew->addrLoop = addrLoop; + pNew->addrVisit = addrVisit; + pNew->nEst = nEst; + pNew->zName = sqlite3DbStrDup(p->db, zName); + p->aScan = aNew; + } +} +#endif + + +/* +** Change the value of the opcode, or P1, P2, P3, or P5 operands +** for a specific instruction. +*/ +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe *p, int addr, u8 iNewOpcode){ + sqlite3VdbeGetOp(p,addr)->opcode = iNewOpcode; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){ + sqlite3VdbeGetOp(p,addr)->p1 = val; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){ + sqlite3VdbeGetOp(p,addr)->p2 = val; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, int addr, int val){ + sqlite3VdbeGetOp(p,addr)->p3 = val; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u16 p5){ + assert( p->nOp>0 || p->db->mallocFailed ); + if( p->nOp>0 ) p->aOp[p->nOp-1].p5 = p5; +} + +/* +** Change the P2 operand of instruction addr so that it points to +** the address of the next instruction to be coded. +*/ +SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){ + sqlite3VdbeChangeP2(p, addr, p->nOp); +} + +/* +** Change the P2 operand of the jump instruction at addr so that +** the jump lands on the next opcode. Or if the jump instruction was +** the previous opcode (and is thus a no-op) then simply back up +** the next instruction counter by one slot so that the jump is +** overwritten by the next inserted opcode. +** +** This routine is an optimization of sqlite3VdbeJumpHere() that +** strives to omit useless byte-code like this: +** +** 7 Once 0 8 0 +** 8 ... +*/ +SQLITE_PRIVATE void sqlite3VdbeJumpHereOrPopInst(Vdbe *p, int addr){ + if( addr==p->nOp-1 ){ + assert( p->aOp[addr].opcode==OP_Once + || p->aOp[addr].opcode==OP_If + || p->aOp[addr].opcode==OP_FkIfZero ); + assert( p->aOp[addr].p4type==0 ); +#ifdef SQLITE_VDBE_COVERAGE + sqlite3VdbeGetOp(p,-1)->iSrcLine = 0; /* Erase VdbeCoverage() macros */ +#endif + p->nOp--; + }else{ + sqlite3VdbeChangeP2(p, addr, p->nOp); + } +} + + +/* +** If the input FuncDef structure is ephemeral, then free it. If +** the FuncDef is not ephermal, then do nothing. +*/ +static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ + if( (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 ){ + sqlite3DbFreeNN(db, pDef); + } +} + +/* +** Delete a P4 value if necessary. +*/ +static SQLITE_NOINLINE void freeP4Mem(sqlite3 *db, Mem *p){ + if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); + sqlite3DbFreeNN(db, p); +} +static SQLITE_NOINLINE void freeP4FuncCtx(sqlite3 *db, sqlite3_context *p){ + freeEphemeralFunction(db, p->pFunc); + sqlite3DbFreeNN(db, p); +} +static void freeP4(sqlite3 *db, int p4type, void *p4){ + assert( db ); + switch( p4type ){ + case P4_FUNCCTX: { + freeP4FuncCtx(db, (sqlite3_context*)p4); + break; + } + case P4_REAL: + case P4_INT64: + case P4_DYNAMIC: + case P4_DYNBLOB: + case P4_INTARRAY: { + sqlite3DbFree(db, p4); + break; + } + case P4_KEYINFO: { + if( db->pnBytesFreed==0 ) sqlite3KeyInfoUnref((KeyInfo*)p4); + break; + } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + case P4_EXPR: { + sqlite3ExprDelete(db, (Expr*)p4); + break; + } +#endif + case P4_FUNCDEF: { + freeEphemeralFunction(db, (FuncDef*)p4); + break; + } + case P4_MEM: { + if( db->pnBytesFreed==0 ){ + sqlite3ValueFree((sqlite3_value*)p4); + }else{ + freeP4Mem(db, (Mem*)p4); + } + break; + } + case P4_VTAB : { + if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4); + break; + } + } +} + +/* +** Free the space allocated for aOp and any p4 values allocated for the +** opcodes contained within. If aOp is not NULL it is assumed to contain +** nOp entries. +*/ +static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ + if( aOp ){ + Op *pOp; + for(pOp=&aOp[nOp-1]; pOp>=aOp; pOp--){ + if( pOp->p4type <= P4_FREE_IF_LE ) freeP4(db, pOp->p4type, pOp->p4.p); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + sqlite3DbFree(db, pOp->zComment); +#endif + } + sqlite3DbFreeNN(db, aOp); + } +} + +/* +** Link the SubProgram object passed as the second argument into the linked +** list at Vdbe.pSubProgram. This list is used to delete all sub-program +** objects when the VM is no longer required. +*/ +SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *pVdbe, SubProgram *p){ + p->pNext = pVdbe->pProgram; + pVdbe->pProgram = p; +} + +/* +** Return true if the given Vdbe has any SubPrograms. +*/ +SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe *pVdbe){ + return pVdbe->pProgram!=0; +} + +/* +** Change the opcode at addr into OP_Noop +*/ +SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe *p, int addr){ + VdbeOp *pOp; + if( p->db->mallocFailed ) return 0; + assert( addr>=0 && addrnOp ); + pOp = &p->aOp[addr]; + freeP4(p->db, pOp->p4type, pOp->p4.p); + pOp->p4type = P4_NOTUSED; + pOp->p4.z = 0; + pOp->opcode = OP_Noop; + return 1; +} + +/* +** If the last opcode is "op" and it is not a jump destination, +** then remove it. Return true if and only if an opcode was removed. +*/ +SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ + if( p->nOp>0 && p->aOp[p->nOp-1].opcode==op ){ + return sqlite3VdbeChangeToNoop(p, p->nOp-1); + }else{ + return 0; + } +} + +#ifdef SQLITE_DEBUG +/* +** Generate an OP_ReleaseReg opcode to indicate that a range of +** registers, except any identified by mask, are no longer in use. +*/ +SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters( + Parse *pParse, /* Parsing context */ + int iFirst, /* Index of first register to be released */ + int N, /* Number of registers to release */ + u32 mask, /* Mask of registers to NOT release */ + int bUndefine /* If true, mark registers as undefined */ +){ + if( N==0 ) return; + assert( pParse->pVdbe ); + assert( iFirst>=1 ); + assert( iFirst+N-1<=pParse->nMem ); + if( N<=31 && mask!=0 ){ + while( N>0 && (mask&1)!=0 ){ + mask >>= 1; + iFirst++; + N--; + } + while( N>0 && N<=32 && (mask & MASKBIT32(N-1))!=0 ){ + mask &= ~MASKBIT32(N-1); + N--; + } + } + if( N>0 ){ + sqlite3VdbeAddOp3(pParse->pVdbe, OP_ReleaseReg, iFirst, N, *(int*)&mask); + if( bUndefine ) sqlite3VdbeChangeP5(pParse->pVdbe, 1); + } +} +#endif /* SQLITE_DEBUG */ + + +/* +** Change the value of the P4 operand for a specific instruction. +** This routine is useful when a large program is loaded from a +** static array using sqlite3VdbeAddOpList but we want to make a +** few minor changes to the program. +** +** If n>=0 then the P4 operand is dynamic, meaning that a copy of +** the string is made into memory obtained from sqlite3_malloc(). +** A value of n==0 means copy bytes of zP4 up to and including the +** first null byte. If n>0 then copy n+1 bytes of zP4. +** +** Other values of n (P4_STATIC, P4_COLLSEQ etc.) indicate that zP4 points +** to a string or structure that is guaranteed to exist for the lifetime of +** the Vdbe. In these cases we can just copy the pointer. +** +** If addr<0 then change P4 on the most recently inserted instruction. +*/ +static void SQLITE_NOINLINE vdbeChangeP4Full( + Vdbe *p, + Op *pOp, + const char *zP4, + int n +){ + if( pOp->p4type ){ + freeP4(p->db, pOp->p4type, pOp->p4.p); + pOp->p4type = 0; + pOp->p4.p = 0; + } + if( n<0 ){ + sqlite3VdbeChangeP4(p, (int)(pOp - p->aOp), zP4, n); + }else{ + if( n==0 ) n = sqlite3Strlen30(zP4); + pOp->p4.z = sqlite3DbStrNDup(p->db, zP4, n); + pOp->p4type = P4_DYNAMIC; + } +} +SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int n){ + Op *pOp; + sqlite3 *db; + assert( p!=0 ); + db = p->db; + assert( p->magic==VDBE_MAGIC_INIT ); + assert( p->aOp!=0 || db->mallocFailed ); + if( db->mallocFailed ){ + if( n!=P4_VTAB ) freeP4(db, n, (void*)*(char**)&zP4); + return; + } + assert( p->nOp>0 ); + assert( addrnOp ); + if( addr<0 ){ + addr = p->nOp - 1; + } + pOp = &p->aOp[addr]; + if( n>=0 || pOp->p4type ){ + vdbeChangeP4Full(p, pOp, zP4, n); + return; + } + if( n==P4_INT32 ){ + /* Note: this cast is safe, because the origin data point was an int + ** that was cast to a (const char *). */ + pOp->p4.i = SQLITE_PTR_TO_INT(zP4); + pOp->p4type = P4_INT32; + }else if( zP4!=0 ){ + assert( n<0 ); + pOp->p4.p = (void*)zP4; + pOp->p4type = (signed char)n; + if( n==P4_VTAB ) sqlite3VtabLock((VTable*)zP4); + } +} + +/* +** Change the P4 operand of the most recently coded instruction +** to the value defined by the arguments. This is a high-speed +** version of sqlite3VdbeChangeP4(). +** +** The P4 operand must not have been previously defined. And the new +** P4 must not be P4_INT32. Use sqlite3VdbeChangeP4() in either of +** those cases. +*/ +SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe *p, void *pP4, int n){ + VdbeOp *pOp; + assert( n!=P4_INT32 && n!=P4_VTAB ); + assert( n<=0 ); + if( p->db->mallocFailed ){ + freeP4(p->db, n, pP4); + }else{ + assert( pP4!=0 ); + assert( p->nOp>0 ); + pOp = &p->aOp[p->nOp-1]; + assert( pOp->p4type==P4_NOTUSED ); + pOp->p4type = n; + pOp->p4.p = pP4; + } +} + +/* +** Set the P4 on the most recently added opcode to the KeyInfo for the +** index given. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse *pParse, Index *pIdx){ + Vdbe *v = pParse->pVdbe; + KeyInfo *pKeyInfo; + assert( v!=0 ); + assert( pIdx!=0 ); + pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pIdx); + if( pKeyInfo ) sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); +} + +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +/* +** Change the comment on the most recently coded instruction. Or +** insert a No-op and add the comment to that new instruction. This +** makes the code easier to read during debugging. None of this happens +** in a production build. +*/ +static void vdbeVComment(Vdbe *p, const char *zFormat, va_list ap){ + assert( p->nOp>0 || p->aOp==0 ); + assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed + || p->pParse->nErr>0 ); + if( p->nOp ){ + assert( p->aOp ); + sqlite3DbFree(p->db, p->aOp[p->nOp-1].zComment); + p->aOp[p->nOp-1].zComment = sqlite3VMPrintf(p->db, zFormat, ap); + } +} +SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){ + va_list ap; + if( p ){ + va_start(ap, zFormat); + vdbeVComment(p, zFormat, ap); + va_end(ap); + } +} +SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){ + va_list ap; + if( p ){ + sqlite3VdbeAddOp0(p, OP_Noop); + va_start(ap, zFormat); + vdbeVComment(p, zFormat, ap); + va_end(ap); + } +} +#endif /* NDEBUG */ + +#ifdef SQLITE_VDBE_COVERAGE +/* +** Set the value if the iSrcLine field for the previously coded instruction. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe *v, int iLine){ + sqlite3VdbeGetOp(v,-1)->iSrcLine = iLine; +} +#endif /* SQLITE_VDBE_COVERAGE */ + +/* +** Return the opcode for a given address. If the address is -1, then +** return the most recently inserted opcode. +** +** If a memory allocation error has occurred prior to the calling of this +** routine, then a pointer to a dummy VdbeOp will be returned. That opcode +** is readable but not writable, though it is cast to a writable value. +** The return of a dummy opcode allows the call to continue functioning +** after an OOM fault without having to check to see if the return from +** this routine is a valid pointer. But because the dummy.opcode is 0, +** dummy will never be written to. This is verified by code inspection and +** by running with Valgrind. +*/ +SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ + /* C89 specifies that the constant "dummy" will be initialized to all + ** zeros, which is correct. MSVC generates a warning, nevertheless. */ + static VdbeOp dummy; /* Ignore the MSVC warning about no initializer */ + assert( p->magic==VDBE_MAGIC_INIT ); + if( addr<0 ){ + addr = p->nOp - 1; + } + assert( (addr>=0 && addrnOp) || p->db->mallocFailed ); + if( p->db->mallocFailed ){ + return (VdbeOp*)&dummy; + }else{ + return &p->aOp[addr]; + } +} + +#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) +/* +** Return an integer value for one of the parameters to the opcode pOp +** determined by character c. +*/ +static int translateP(char c, const Op *pOp){ + if( c=='1' ) return pOp->p1; + if( c=='2' ) return pOp->p2; + if( c=='3' ) return pOp->p3; + if( c=='4' ) return pOp->p4.i; + return pOp->p5; +} + +/* +** Compute a string for the "comment" field of a VDBE opcode listing. +** +** The Synopsis: field in comments in the vdbe.c source file gets converted +** to an extra string that is appended to the sqlite3OpcodeName(). In the +** absence of other comments, this synopsis becomes the comment on the opcode. +** Some translation occurs: +** +** "PX" -> "r[X]" +** "PX@PY" -> "r[X..X+Y-1]" or "r[x]" if y is 0 or 1 +** "PX@PY+1" -> "r[X..X+Y]" or "r[x]" if y is 0 +** "PY..PY" -> "r[X..Y]" or "r[x]" if y<=x +*/ +SQLITE_PRIVATE char *sqlite3VdbeDisplayComment( + sqlite3 *db, /* Optional - Oom error reporting only */ + const Op *pOp, /* The opcode to be commented */ + const char *zP4 /* Previously obtained value for P4 */ +){ + const char *zOpName; + const char *zSynopsis; + int nOpName; + int ii; + char zAlt[50]; + StrAccum x; + + sqlite3StrAccumInit(&x, 0, 0, 0, SQLITE_MAX_LENGTH); + zOpName = sqlite3OpcodeName(pOp->opcode); + nOpName = sqlite3Strlen30(zOpName); + if( zOpName[nOpName+1] ){ + int seenCom = 0; + char c; + zSynopsis = zOpName += nOpName + 1; + if( strncmp(zSynopsis,"IF ",3)==0 ){ + if( pOp->p5 & SQLITE_STOREP2 ){ + sqlite3_snprintf(sizeof(zAlt), zAlt, "r[P2] = (%s)", zSynopsis+3); + }else{ + sqlite3_snprintf(sizeof(zAlt), zAlt, "if %s goto P2", zSynopsis+3); + } + zSynopsis = zAlt; + } + for(ii=0; (c = zSynopsis[ii])!=0; ii++){ + if( c=='P' ){ + c = zSynopsis[++ii]; + if( c=='4' ){ + sqlite3_str_appendall(&x, zP4); + }else if( c=='X' ){ + sqlite3_str_appendall(&x, pOp->zComment); + seenCom = 1; + }else{ + int v1 = translateP(c, pOp); + int v2; + if( strncmp(zSynopsis+ii+1, "@P", 2)==0 ){ + ii += 3; + v2 = translateP(zSynopsis[ii], pOp); + if( strncmp(zSynopsis+ii+1,"+1",2)==0 ){ + ii += 2; + v2++; + } + if( v2<2 ){ + sqlite3_str_appendf(&x, "%d", v1); + }else{ + sqlite3_str_appendf(&x, "%d..%d", v1, v1+v2-1); + } + }else if( strncmp(zSynopsis+ii+1, "@NP", 3)==0 ){ + sqlite3_context *pCtx = pOp->p4.pCtx; + if( pOp->p4type!=P4_FUNCCTX || pCtx->argc==1 ){ + sqlite3_str_appendf(&x, "%d", v1); + }else if( pCtx->argc>1 ){ + sqlite3_str_appendf(&x, "%d..%d", v1, v1+pCtx->argc-1); + }else{ + assert( x.nChar>2 ); + x.nChar -= 2; + ii++; + } + ii += 3; + }else{ + sqlite3_str_appendf(&x, "%d", v1); + if( strncmp(zSynopsis+ii+1, "..P3", 4)==0 && pOp->p3==0 ){ + ii += 4; + } + } + } + }else{ + sqlite3_str_appendchar(&x, 1, c); + } + } + if( !seenCom && pOp->zComment ){ + sqlite3_str_appendf(&x, "; %s", pOp->zComment); + } + }else if( pOp->zComment ){ + sqlite3_str_appendall(&x, pOp->zComment); + } + if( (x.accError & SQLITE_NOMEM)!=0 && db!=0 ){ + sqlite3OomFault(db); + } + return sqlite3StrAccumFinish(&x); +} +#endif /* SQLITE_ENABLE_EXPLAIN_COMMENTS */ + +#if VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) +/* +** Translate the P4.pExpr value for an OP_CursorHint opcode into text +** that can be displayed in the P4 column of EXPLAIN output. +*/ +static void displayP4Expr(StrAccum *p, Expr *pExpr){ + const char *zOp = 0; + switch( pExpr->op ){ + case TK_STRING: + sqlite3_str_appendf(p, "%Q", pExpr->u.zToken); + break; + case TK_INTEGER: + sqlite3_str_appendf(p, "%d", pExpr->u.iValue); + break; + case TK_NULL: + sqlite3_str_appendf(p, "NULL"); + break; + case TK_REGISTER: { + sqlite3_str_appendf(p, "r[%d]", pExpr->iTable); + break; + } + case TK_COLUMN: { + if( pExpr->iColumn<0 ){ + sqlite3_str_appendf(p, "rowid"); + }else{ + sqlite3_str_appendf(p, "c%d", (int)pExpr->iColumn); + } + break; + } + case TK_LT: zOp = "LT"; break; + case TK_LE: zOp = "LE"; break; + case TK_GT: zOp = "GT"; break; + case TK_GE: zOp = "GE"; break; + case TK_NE: zOp = "NE"; break; + case TK_EQ: zOp = "EQ"; break; + case TK_IS: zOp = "IS"; break; + case TK_ISNOT: zOp = "ISNOT"; break; + case TK_AND: zOp = "AND"; break; + case TK_OR: zOp = "OR"; break; + case TK_PLUS: zOp = "ADD"; break; + case TK_STAR: zOp = "MUL"; break; + case TK_MINUS: zOp = "SUB"; break; + case TK_REM: zOp = "REM"; break; + case TK_BITAND: zOp = "BITAND"; break; + case TK_BITOR: zOp = "BITOR"; break; + case TK_SLASH: zOp = "DIV"; break; + case TK_LSHIFT: zOp = "LSHIFT"; break; + case TK_RSHIFT: zOp = "RSHIFT"; break; + case TK_CONCAT: zOp = "CONCAT"; break; + case TK_UMINUS: zOp = "MINUS"; break; + case TK_UPLUS: zOp = "PLUS"; break; + case TK_BITNOT: zOp = "BITNOT"; break; + case TK_NOT: zOp = "NOT"; break; + case TK_ISNULL: zOp = "ISNULL"; break; + case TK_NOTNULL: zOp = "NOTNULL"; break; + + default: + sqlite3_str_appendf(p, "%s", "expr"); + break; + } + + if( zOp ){ + sqlite3_str_appendf(p, "%s(", zOp); + displayP4Expr(p, pExpr->pLeft); + if( pExpr->pRight ){ + sqlite3_str_append(p, ",", 1); + displayP4Expr(p, pExpr->pRight); + } + sqlite3_str_append(p, ")", 1); + } +} +#endif /* VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) */ + + +#if VDBE_DISPLAY_P4 +/* +** Compute a string that describes the P4 parameter for an opcode. +** Use zTemp for any required temporary buffer space. +*/ +SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ + char *zP4 = 0; + StrAccum x; + + sqlite3StrAccumInit(&x, 0, 0, 0, SQLITE_MAX_LENGTH); + switch( pOp->p4type ){ + case P4_KEYINFO: { + int j; + KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; + assert( pKeyInfo->aSortFlags!=0 ); + sqlite3_str_appendf(&x, "k(%d", pKeyInfo->nKeyField); + for(j=0; jnKeyField; j++){ + CollSeq *pColl = pKeyInfo->aColl[j]; + const char *zColl = pColl ? pColl->zName : ""; + if( strcmp(zColl, "BINARY")==0 ) zColl = "B"; + sqlite3_str_appendf(&x, ",%s%s%s", + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_DESC) ? "-" : "", + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_BIGNULL)? "N." : "", + zColl); + } + sqlite3_str_append(&x, ")", 1); + break; + } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + case P4_EXPR: { + displayP4Expr(&x, pOp->p4.pExpr); + break; + } +#endif + case P4_COLLSEQ: { + static const char *const encnames[] = {"?", "8", "16LE", "16BE"}; + CollSeq *pColl = pOp->p4.pColl; + assert( pColl->enc>=0 && pColl->enc<4 ); + sqlite3_str_appendf(&x, "%.18s-%s", pColl->zName, + encnames[pColl->enc]); + break; + } + case P4_FUNCDEF: { + FuncDef *pDef = pOp->p4.pFunc; + sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); + break; + } + case P4_FUNCCTX: { + FuncDef *pDef = pOp->p4.pCtx->pFunc; + sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); + break; + } + case P4_INT64: { + sqlite3_str_appendf(&x, "%lld", *pOp->p4.pI64); + break; + } + case P4_INT32: { + sqlite3_str_appendf(&x, "%d", pOp->p4.i); + break; + } + case P4_REAL: { + sqlite3_str_appendf(&x, "%.16g", *pOp->p4.pReal); + break; + } + case P4_MEM: { + Mem *pMem = pOp->p4.pMem; + if( pMem->flags & MEM_Str ){ + zP4 = pMem->z; + }else if( pMem->flags & (MEM_Int|MEM_IntReal) ){ + sqlite3_str_appendf(&x, "%lld", pMem->u.i); + }else if( pMem->flags & MEM_Real ){ + sqlite3_str_appendf(&x, "%.16g", pMem->u.r); + }else if( pMem->flags & MEM_Null ){ + zP4 = "NULL"; + }else{ + assert( pMem->flags & MEM_Blob ); + zP4 = "(blob)"; + } + break; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + case P4_VTAB: { + sqlite3_vtab *pVtab = pOp->p4.pVtab->pVtab; + sqlite3_str_appendf(&x, "vtab:%p", pVtab); + break; + } +#endif + case P4_INTARRAY: { + int i; + int *ai = pOp->p4.ai; + int n = ai[0]; /* The first element of an INTARRAY is always the + ** count of the number of elements to follow */ + for(i=1; i<=n; i++){ + sqlite3_str_appendf(&x, "%c%d", (i==1 ? '[' : ','), ai[i]); + } + sqlite3_str_append(&x, "]", 1); + break; + } + case P4_SUBPROGRAM: { + zP4 = "program"; + break; + } + case P4_DYNBLOB: + case P4_ADVANCE: { + break; + } + case P4_TABLE: { + zP4 = pOp->p4.pTab->zName; + break; + } + default: { + zP4 = pOp->p4.z; + } + } + if( zP4 ) sqlite3_str_appendall(&x, zP4); + if( (x.accError & SQLITE_NOMEM)!=0 ){ + sqlite3OomFault(db); + } + return sqlite3StrAccumFinish(&x); +} +#endif /* VDBE_DISPLAY_P4 */ + +/* +** Declare to the Vdbe that the BTree object at db->aDb[i] is used. +** +** The prepared statements need to know in advance the complete set of +** attached databases that will be use. A mask of these databases +** is maintained in p->btreeMask. The p->lockMask value is the subset of +** p->btreeMask of databases that will require a lock. +*/ +SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe *p, int i){ + assert( i>=0 && idb->nDb && i<(int)sizeof(yDbMask)*8 ); + assert( i<(int)sizeof(p->btreeMask)*8 ); + DbMaskSet(p->btreeMask, i); + if( i!=1 && sqlite3BtreeSharable(p->db->aDb[i].pBt) ){ + DbMaskSet(p->lockMask, i); + } +} + +#if !defined(SQLITE_OMIT_SHARED_CACHE) +/* +** If SQLite is compiled to support shared-cache mode and to be threadsafe, +** this routine obtains the mutex associated with each BtShared structure +** that may be accessed by the VM passed as an argument. In doing so it also +** sets the BtShared.db member of each of the BtShared structures, ensuring +** that the correct busy-handler callback is invoked if required. +** +** If SQLite is not threadsafe but does support shared-cache mode, then +** sqlite3BtreeEnter() is invoked to set the BtShared.db variables +** of all of BtShared structures accessible via the database handle +** associated with the VM. +** +** If SQLite is not threadsafe and does not support shared-cache mode, this +** function is a no-op. +** +** The p->btreeMask field is a bitmask of all btrees that the prepared +** statement p will ever use. Let N be the number of bits in p->btreeMask +** corresponding to btrees that use shared cache. Then the runtime of +** this routine is N*N. But as N is rarely more than 1, this should not +** be a problem. +*/ +SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe *p){ + int i; + sqlite3 *db; + Db *aDb; + int nDb; + if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ + db = p->db; + aDb = db->aDb; + nDb = db->nDb; + for(i=0; ilockMask,i) && ALWAYS(aDb[i].pBt!=0) ){ + sqlite3BtreeEnter(aDb[i].pBt); + } + } +} +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 +/* +** Unlock all of the btrees previously locked by a call to sqlite3VdbeEnter(). +*/ +static SQLITE_NOINLINE void vdbeLeave(Vdbe *p){ + int i; + sqlite3 *db; + Db *aDb; + int nDb; + db = p->db; + aDb = db->aDb; + nDb = db->nDb; + for(i=0; ilockMask,i) && ALWAYS(aDb[i].pBt!=0) ){ + sqlite3BtreeLeave(aDb[i].pBt); + } + } +} +SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe *p){ + if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ + vdbeLeave(p); +} +#endif + +#if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) +/* +** Print a single opcode. This routine is used for debugging only. +*/ +SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ + char *zP4; + char *zCom; + sqlite3 dummyDb; + static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n"; + if( pOut==0 ) pOut = stdout; + sqlite3BeginBenignMalloc(); + dummyDb.mallocFailed = 1; + zP4 = sqlite3VdbeDisplayP4(&dummyDb, pOp); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + zCom = sqlite3VdbeDisplayComment(0, pOp, zP4); +#else + zCom = 0; +#endif + /* NB: The sqlite3OpcodeName() function is implemented by code created + ** by the mkopcodeh.awk and mkopcodec.awk scripts which extract the + ** information from the vdbe.c source text */ + fprintf(pOut, zFormat1, pc, + sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, + zP4 ? zP4 : "", pOp->p5, + zCom ? zCom : "" + ); + fflush(pOut); + sqlite3_free(zP4); + sqlite3_free(zCom); + sqlite3EndBenignMalloc(); +} +#endif + +/* +** Initialize an array of N Mem element. +*/ +static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ + while( (N--)>0 ){ + p->db = db; + p->flags = flags; + p->szMalloc = 0; +#ifdef SQLITE_DEBUG + p->pScopyFrom = 0; +#endif + p++; + } +} + +/* +** Release an array of N Mem elements +*/ +static void releaseMemArray(Mem *p, int N){ + if( p && N ){ + Mem *pEnd = &p[N]; + sqlite3 *db = p->db; + if( db->pnBytesFreed ){ + do{ + if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); + }while( (++p)flags & MEM_Agg ); + testcase( p->flags & MEM_Dyn ); + testcase( p->xDel==sqlite3VdbeFrameMemDel ); + if( p->flags&(MEM_Agg|MEM_Dyn) ){ + sqlite3VdbeMemRelease(p); + }else if( p->szMalloc ){ + sqlite3DbFreeNN(db, p->zMalloc); + p->szMalloc = 0; + } + + p->flags = MEM_Undefined; + }while( (++p)iFrameMagic!=SQLITE_FRAME_MAGIC ) return 0; + return 1; +} +#endif + + +/* +** This is a destructor on a Mem object (which is really an sqlite3_value) +** that deletes the Frame object that is attached to it as a blob. +** +** This routine does not delete the Frame right away. It merely adds the +** frame to a list of frames to be deleted when the Vdbe halts. +*/ +SQLITE_PRIVATE void sqlite3VdbeFrameMemDel(void *pArg){ + VdbeFrame *pFrame = (VdbeFrame*)pArg; + assert( sqlite3VdbeFrameIsValid(pFrame) ); + pFrame->pParent = pFrame->v->pDelFrame; + pFrame->v->pDelFrame = pFrame; +} + +#if defined(SQLITE_ENABLE_BYTECODE_VTAB) || !defined(SQLITE_OMIT_EXPLAIN) +/* +** Locate the next opcode to be displayed in EXPLAIN or EXPLAIN +** QUERY PLAN output. +** +** Return SQLITE_ROW on success. Return SQLITE_DONE if there are no +** more opcodes to be displayed. +*/ +SQLITE_PRIVATE int sqlite3VdbeNextOpcode( + Vdbe *p, /* The statement being explained */ + Mem *pSub, /* Storage for keeping track of subprogram nesting */ + int eMode, /* 0: normal. 1: EQP. 2: TablesUsed */ + int *piPc, /* IN/OUT: Current rowid. Overwritten with next rowid */ + int *piAddr, /* OUT: Write index into (*paOp)[] here */ + Op **paOp /* OUT: Write the opcode array here */ +){ + int nRow; /* Stop when row count reaches this */ + int nSub = 0; /* Number of sub-vdbes seen so far */ + SubProgram **apSub = 0; /* Array of sub-vdbes */ + int i; /* Next instruction address */ + int rc = SQLITE_OK; /* Result code */ + Op *aOp = 0; /* Opcode array */ + int iPc; /* Rowid. Copy of value in *piPc */ + + /* When the number of output rows reaches nRow, that means the + ** listing has finished and sqlite3_step() should return SQLITE_DONE. + ** nRow is the sum of the number of rows in the main program, plus + ** the sum of the number of rows in all trigger subprograms encountered + ** so far. The nRow value will increase as new trigger subprograms are + ** encountered, but p->pc will eventually catch up to nRow. + */ + nRow = p->nOp; + if( pSub!=0 ){ + if( pSub->flags&MEM_Blob ){ + /* pSub is initiallly NULL. It is initialized to a BLOB by + ** the P4_SUBPROGRAM processing logic below */ + nSub = pSub->n/sizeof(Vdbe*); + apSub = (SubProgram **)pSub->z; + } + for(i=0; inOp; + } + } + iPc = *piPc; + while(1){ /* Loop exits via break */ + i = iPc++; + if( i>=nRow ){ + p->rc = SQLITE_OK; + rc = SQLITE_DONE; + break; + } + if( inOp ){ + /* The rowid is small enough that we are still in the + ** main program. */ + aOp = p->aOp; + }else{ + /* We are currently listing subprograms. Figure out which one and + ** pick up the appropriate opcode. */ + int j; + i -= p->nOp; + assert( apSub!=0 ); + assert( nSub>0 ); + for(j=0; i>=apSub[j]->nOp; j++){ + i -= apSub[j]->nOp; + assert( inOp || j+1aOp; + } + + /* When an OP_Program opcode is encounter (the only opcode that has + ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms + ** kept in p->aMem[9].z to hold the new program - assuming this subprogram + ** has not already been seen. + */ + if( pSub!=0 && aOp[i].p4type==P4_SUBPROGRAM ){ + int nByte = (nSub+1)*sizeof(SubProgram*); + int j; + for(j=0; jrc = sqlite3VdbeMemGrow(pSub, nByte, nSub!=0); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + break; + } + apSub = (SubProgram **)pSub->z; + apSub[nSub++] = aOp[i].p4.pProgram; + MemSetTypeFlag(pSub, MEM_Blob); + pSub->n = nSub*sizeof(SubProgram*); + nRow += aOp[i].p4.pProgram->nOp; + } + } + if( eMode==0 ) break; +#ifdef SQLITE_ENABLE_BYTECODE_VTAB + if( eMode==2 ){ + Op *pOp = aOp + i; + if( pOp->opcode==OP_OpenRead ) break; + if( pOp->opcode==OP_OpenWrite && (pOp->p5 & OPFLAG_P2ISREG)==0 ) break; + if( pOp->opcode==OP_ReopenIdx ) break; + }else +#endif + { + assert( eMode==1 ); + if( aOp[i].opcode==OP_Explain ) break; + if( aOp[i].opcode==OP_Init && iPc>1 ) break; + } + } + *piPc = iPc; + *piAddr = i; + *paOp = aOp; + return rc; +} +#endif /* SQLITE_ENABLE_BYTECODE_VTAB || !SQLITE_OMIT_EXPLAIN */ + + +/* +** Delete a VdbeFrame object and its contents. VdbeFrame objects are +** allocated by the OP_Program opcode in sqlite3VdbeExec(). +*/ +SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){ + int i; + Mem *aMem = VdbeFrameMem(p); + VdbeCursor **apCsr = (VdbeCursor **)&aMem[p->nChildMem]; + assert( sqlite3VdbeFrameIsValid(p) ); + for(i=0; inChildCsr; i++){ + sqlite3VdbeFreeCursor(p->v, apCsr[i]); + } + releaseMemArray(aMem, p->nChildMem); + sqlite3VdbeDeleteAuxData(p->v->db, &p->pAuxData, -1, 0); + sqlite3DbFree(p->v->db, p); +} + +#ifndef SQLITE_OMIT_EXPLAIN +/* +** Give a listing of the program in the virtual machine. +** +** The interface is the same as sqlite3VdbeExec(). But instead of +** running the code, it invokes the callback once for each instruction. +** This feature is used to implement "EXPLAIN". +** +** When p->explain==1, each instruction is listed. When +** p->explain==2, only OP_Explain instructions are listed and these +** are shown in a different format. p->explain==2 is used to implement +** EXPLAIN QUERY PLAN. +** 2018-04-24: In p->explain==2 mode, the OP_Init opcodes of triggers +** are also shown, so that the boundaries between the main program and +** each trigger are clear. +** +** When p->explain==1, first the main program is listed, then each of +** the trigger subprograms are listed one by one. +*/ +SQLITE_PRIVATE int sqlite3VdbeList( + Vdbe *p /* The VDBE */ +){ + Mem *pSub = 0; /* Memory cell hold array of subprogs */ + sqlite3 *db = p->db; /* The database connection */ + int i; /* Loop counter */ + int rc = SQLITE_OK; /* Return code */ + Mem *pMem = &p->aMem[1]; /* First Mem of result set */ + int bListSubprogs = (p->explain==1 || (db->flags & SQLITE_TriggerEQP)!=0); + Op *aOp; /* Array of opcodes */ + Op *pOp; /* Current opcode */ + + assert( p->explain ); + assert( p->magic==VDBE_MAGIC_RUN ); + assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY || p->rc==SQLITE_NOMEM ); + + /* Even though this opcode does not use dynamic strings for + ** the result, result columns may become dynamic if the user calls + ** sqlite3_column_text16(), causing a translation to UTF-16 encoding. + */ + releaseMemArray(pMem, 8); + p->pResultSet = 0; + + if( p->rc==SQLITE_NOMEM ){ + /* This happens if a malloc() inside a call to sqlite3_column_text() or + ** sqlite3_column_text16() failed. */ + sqlite3OomFault(db); + return SQLITE_ERROR; + } + + if( bListSubprogs ){ + /* The first 8 memory cells are used for the result set. So we will + ** commandeer the 9th cell to use as storage for an array of pointers + ** to trigger subprograms. The VDBE is guaranteed to have at least 9 + ** cells. */ + assert( p->nMem>9 ); + pSub = &p->aMem[9]; + }else{ + pSub = 0; + } + + /* Figure out which opcode is next to display */ + rc = sqlite3VdbeNextOpcode(p, pSub, p->explain==2, &p->pc, &i, &aOp); + + if( rc==SQLITE_OK ){ + pOp = aOp + i; + if( AtomicLoad(&db->u1.isInterrupted) ){ + p->rc = SQLITE_INTERRUPT; + rc = SQLITE_ERROR; + sqlite3VdbeError(p, sqlite3ErrStr(p->rc)); + }else{ + char *zP4 = sqlite3VdbeDisplayP4(db, pOp); + if( p->explain==2 ){ + sqlite3VdbeMemSetInt64(pMem, pOp->p1); + sqlite3VdbeMemSetInt64(pMem+1, pOp->p2); + sqlite3VdbeMemSetInt64(pMem+2, pOp->p3); + sqlite3VdbeMemSetStr(pMem+3, zP4, -1, SQLITE_UTF8, sqlite3_free); + p->nResColumn = 4; + }else{ + sqlite3VdbeMemSetInt64(pMem+0, i); + sqlite3VdbeMemSetStr(pMem+1, (char*)sqlite3OpcodeName(pOp->opcode), + -1, SQLITE_UTF8, SQLITE_STATIC); + sqlite3VdbeMemSetInt64(pMem+2, pOp->p1); + sqlite3VdbeMemSetInt64(pMem+3, pOp->p2); + sqlite3VdbeMemSetInt64(pMem+4, pOp->p3); + /* pMem+5 for p4 is done last */ + sqlite3VdbeMemSetInt64(pMem+6, pOp->p5); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + { + char *zCom = sqlite3VdbeDisplayComment(db, pOp, zP4); + sqlite3VdbeMemSetStr(pMem+7, zCom, -1, SQLITE_UTF8, sqlite3_free); + } +#else + sqlite3VdbeMemSetNull(pMem+7); +#endif + sqlite3VdbeMemSetStr(pMem+5, zP4, -1, SQLITE_UTF8, sqlite3_free); + p->nResColumn = 8; + } + p->pResultSet = pMem; + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM; + rc = SQLITE_ERROR; + }else{ + p->rc = SQLITE_OK; + rc = SQLITE_ROW; + } + } + } + return rc; +} +#endif /* SQLITE_OMIT_EXPLAIN */ + +#ifdef SQLITE_DEBUG +/* +** Print the SQL that was used to generate a VDBE program. +*/ +SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe *p){ + const char *z = 0; + if( p->zSql ){ + z = p->zSql; + }else if( p->nOp>=1 ){ + const VdbeOp *pOp = &p->aOp[0]; + if( pOp->opcode==OP_Init && pOp->p4.z!=0 ){ + z = pOp->p4.z; + while( sqlite3Isspace(*z) ) z++; + } + } + if( z ) printf("SQL: [%s]\n", z); +} +#endif + +#if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) +/* +** Print an IOTRACE message showing SQL content. +*/ +SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){ + int nOp = p->nOp; + VdbeOp *pOp; + if( sqlite3IoTrace==0 ) return; + if( nOp<1 ) return; + pOp = &p->aOp[0]; + if( pOp->opcode==OP_Init && pOp->p4.z!=0 ){ + int i, j; + char z[1000]; + sqlite3_snprintf(sizeof(z), z, "%s", pOp->p4.z); + for(i=0; sqlite3Isspace(z[i]); i++){} + for(j=0; z[i]; i++){ + if( sqlite3Isspace(z[i]) ){ + if( z[i-1]!=' ' ){ + z[j++] = ' '; + } + }else{ + z[j++] = z[i]; + } + } + z[j] = 0; + sqlite3IoTrace("SQL %s\n", z); + } +} +#endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */ + +/* An instance of this object describes bulk memory available for use +** by subcomponents of a prepared statement. Space is allocated out +** of a ReusableSpace object by the allocSpace() routine below. +*/ +struct ReusableSpace { + u8 *pSpace; /* Available memory */ + sqlite3_int64 nFree; /* Bytes of available memory */ + sqlite3_int64 nNeeded; /* Total bytes that could not be allocated */ +}; + +/* Try to allocate nByte bytes of 8-byte aligned bulk memory for pBuf +** from the ReusableSpace object. Return a pointer to the allocated +** memory on success. If insufficient memory is available in the +** ReusableSpace object, increase the ReusableSpace.nNeeded +** value by the amount needed and return NULL. +** +** If pBuf is not initially NULL, that means that the memory has already +** been allocated by a prior call to this routine, so just return a copy +** of pBuf and leave ReusableSpace unchanged. +** +** This allocator is employed to repurpose unused slots at the end of the +** opcode array of prepared state for other memory needs of the prepared +** statement. +*/ +static void *allocSpace( + struct ReusableSpace *p, /* Bulk memory available for allocation */ + void *pBuf, /* Pointer to a prior allocation */ + sqlite3_int64 nByte /* Bytes of memory needed */ +){ + assert( EIGHT_BYTE_ALIGNMENT(p->pSpace) ); + if( pBuf==0 ){ + nByte = ROUND8(nByte); + if( nByte <= p->nFree ){ + p->nFree -= nByte; + pBuf = &p->pSpace[p->nFree]; + }else{ + p->nNeeded += nByte; + } + } + assert( EIGHT_BYTE_ALIGNMENT(pBuf) ); + return pBuf; +} + +/* +** Rewind the VDBE back to the beginning in preparation for +** running it. +*/ +SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + int i; +#endif + assert( p!=0 ); + assert( p->magic==VDBE_MAGIC_INIT || p->magic==VDBE_MAGIC_RESET ); + + /* There should be at least one opcode. + */ + assert( p->nOp>0 ); + + /* Set the magic to VDBE_MAGIC_RUN sooner rather than later. */ + p->magic = VDBE_MAGIC_RUN; + +#ifdef SQLITE_DEBUG + for(i=0; inMem; i++){ + assert( p->aMem[i].db==p->db ); + } +#endif + p->pc = -1; + p->rc = SQLITE_OK; + p->errorAction = OE_Abort; + p->nChange = 0; + p->cacheCtr = 1; + p->minWriteFileFormat = 255; + p->iStatement = 0; + p->nFkConstraint = 0; +#ifdef VDBE_PROFILE + for(i=0; inOp; i++){ + p->aOp[i].cnt = 0; + p->aOp[i].cycles = 0; + } +#endif +} + +/* +** Prepare a virtual machine for execution for the first time after +** creating the virtual machine. This involves things such +** as allocating registers and initializing the program counter. +** After the VDBE has be prepped, it can be executed by one or more +** calls to sqlite3VdbeExec(). +** +** This function may be called exactly once on each virtual machine. +** After this routine is called the VM has been "packaged" and is ready +** to run. After this routine is called, further calls to +** sqlite3VdbeAddOp() functions are prohibited. This routine disconnects +** the Vdbe from the Parse object that helped generate it so that the +** the Vdbe becomes an independent entity and the Parse object can be +** destroyed. +** +** Use the sqlite3VdbeRewind() procedure to restore a virtual machine back +** to its initial state after it has been run. +*/ +SQLITE_PRIVATE void sqlite3VdbeMakeReady( + Vdbe *p, /* The VDBE */ + Parse *pParse /* Parsing context */ +){ + sqlite3 *db; /* The database connection */ + int nVar; /* Number of parameters */ + int nMem; /* Number of VM memory registers */ + int nCursor; /* Number of cursors required */ + int nArg; /* Number of arguments in subprograms */ + int n; /* Loop counter */ + struct ReusableSpace x; /* Reusable bulk memory */ + + assert( p!=0 ); + assert( p->nOp>0 ); + assert( pParse!=0 ); + assert( p->magic==VDBE_MAGIC_INIT ); + assert( pParse==p->pParse ); + db = p->db; + assert( db->mallocFailed==0 ); + nVar = pParse->nVar; + nMem = pParse->nMem; + nCursor = pParse->nTab; + nArg = pParse->nMaxArg; + + /* Each cursor uses a memory cell. The first cursor (cursor 0) can + ** use aMem[0] which is not otherwise used by the VDBE program. Allocate + ** space at the end of aMem[] for cursors 1 and greater. + ** See also: allocateCursor(). + */ + nMem += nCursor; + if( nCursor==0 && nMem>0 ) nMem++; /* Space for aMem[0] even if not used */ + + /* Figure out how much reusable memory is available at the end of the + ** opcode array. This extra memory will be reallocated for other elements + ** of the prepared statement. + */ + n = ROUND8(sizeof(Op)*p->nOp); /* Bytes of opcode memory used */ + x.pSpace = &((u8*)p->aOp)[n]; /* Unused opcode memory */ + assert( EIGHT_BYTE_ALIGNMENT(x.pSpace) ); + x.nFree = ROUNDDOWN8(pParse->szOpAlloc - n); /* Bytes of unused memory */ + assert( x.nFree>=0 ); + assert( EIGHT_BYTE_ALIGNMENT(&x.pSpace[x.nFree]) ); + + resolveP2Values(p, &nArg); + p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); + if( pParse->explain ){ + static const char * const azColName[] = { + "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", + "id", "parent", "notused", "detail" + }; + int iFirst, mx, i; + if( nMem<10 ) nMem = 10; + p->explain = pParse->explain; + if( pParse->explain==2 ){ + sqlite3VdbeSetNumCols(p, 4); + iFirst = 8; + mx = 12; + }else{ + sqlite3VdbeSetNumCols(p, 8); + iFirst = 0; + mx = 8; + } + for(i=iFirst; iexpired = 0; + + /* Memory for registers, parameters, cursor, etc, is allocated in one or two + ** passes. On the first pass, we try to reuse unused memory at the + ** end of the opcode array. If we are unable to satisfy all memory + ** requirements by reusing the opcode array tail, then the second + ** pass will fill in the remainder using a fresh memory allocation. + ** + ** This two-pass approach that reuses as much memory as possible from + ** the leftover memory at the end of the opcode array. This can significantly + ** reduce the amount of memory held by a prepared statement. + */ + x.nNeeded = 0; + p->aMem = allocSpace(&x, 0, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, 0, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, 0, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, 0, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = allocSpace(&x, 0, p->nOp*sizeof(i64)); +#endif + if( x.nNeeded ){ + x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded); + x.nFree = x.nNeeded; + if( !db->mallocFailed ){ + p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); +#endif + } + } + + p->pVList = pParse->pVList; + pParse->pVList = 0; + if( db->mallocFailed ){ + p->nVar = 0; + p->nCursor = 0; + p->nMem = 0; + }else{ + p->nCursor = nCursor; + p->nVar = (ynVar)nVar; + initMemArray(p->aVar, nVar, db, MEM_Null); + p->nMem = nMem; + initMemArray(p->aMem, nMem, db, MEM_Undefined); + memset(p->apCsr, 0, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + memset(p->anExec, 0, p->nOp*sizeof(i64)); +#endif + } + sqlite3VdbeRewind(p); +} + +/* +** Close a VDBE cursor and release all the resources that cursor +** happens to hold. +*/ +SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ + if( pCx==0 ){ + return; + } + assert( pCx->pBtx==0 || pCx->eCurType==CURTYPE_BTREE ); + switch( pCx->eCurType ){ + case CURTYPE_SORTER: { + sqlite3VdbeSorterClose(p->db, pCx); + break; + } + case CURTYPE_BTREE: { + if( pCx->isEphemeral ){ + if( pCx->pBtx ) sqlite3BtreeClose(pCx->pBtx); + /* The pCx->pCursor will be close automatically, if it exists, by + ** the call above. */ + }else{ + assert( pCx->uc.pCursor!=0 ); + sqlite3BtreeCloseCursor(pCx->uc.pCursor); + } + break; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + case CURTYPE_VTAB: { + sqlite3_vtab_cursor *pVCur = pCx->uc.pVCur; + const sqlite3_module *pModule = pVCur->pVtab->pModule; + assert( pVCur->pVtab->nRef>0 ); + pVCur->pVtab->nRef--; + pModule->xClose(pVCur); + break; + } +#endif + } +} + +/* +** Close all cursors in the current frame. +*/ +static void closeCursorsInFrame(Vdbe *p){ + if( p->apCsr ){ + int i; + for(i=0; inCursor; i++){ + VdbeCursor *pC = p->apCsr[i]; + if( pC ){ + sqlite3VdbeFreeCursor(p, pC); + p->apCsr[i] = 0; + } + } + } +} + +/* +** Copy the values stored in the VdbeFrame structure to its Vdbe. This +** is used, for example, when a trigger sub-program is halted to restore +** control to the main program. +*/ +SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){ + Vdbe *v = pFrame->v; + closeCursorsInFrame(v); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + v->anExec = pFrame->anExec; +#endif + v->aOp = pFrame->aOp; + v->nOp = pFrame->nOp; + v->aMem = pFrame->aMem; + v->nMem = pFrame->nMem; + v->apCsr = pFrame->apCsr; + v->nCursor = pFrame->nCursor; + v->db->lastRowid = pFrame->lastRowid; + v->nChange = pFrame->nChange; + v->db->nChange = pFrame->nDbChange; + sqlite3VdbeDeleteAuxData(v->db, &v->pAuxData, -1, 0); + v->pAuxData = pFrame->pAuxData; + pFrame->pAuxData = 0; + return pFrame->pc; +} + +/* +** Close all cursors. +** +** Also release any dynamic memory held by the VM in the Vdbe.aMem memory +** cell array. This is necessary as the memory cell array may contain +** pointers to VdbeFrame objects, which may in turn contain pointers to +** open cursors. +*/ +static void closeAllCursors(Vdbe *p){ + if( p->pFrame ){ + VdbeFrame *pFrame; + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); + sqlite3VdbeFrameRestore(pFrame); + p->pFrame = 0; + p->nFrame = 0; + } + assert( p->nFrame==0 ); + closeCursorsInFrame(p); + if( p->aMem ){ + releaseMemArray(p->aMem, p->nMem); + } + while( p->pDelFrame ){ + VdbeFrame *pDel = p->pDelFrame; + p->pDelFrame = pDel->pParent; + sqlite3VdbeFrameDelete(pDel); + } + + /* Delete any auxdata allocations made by the VM */ + if( p->pAuxData ) sqlite3VdbeDeleteAuxData(p->db, &p->pAuxData, -1, 0); + assert( p->pAuxData==0 ); +} + +/* +** Set the number of result columns that will be returned by this SQL +** statement. This is now set at compile time, rather than during +** execution of the vdbe program so that sqlite3_column_count() can +** be called on an SQL statement before sqlite3_step(). +*/ +SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){ + int n; + sqlite3 *db = p->db; + + if( p->nResColumn ){ + releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + sqlite3DbFree(db, p->aColName); + } + n = nResColumn*COLNAME_N; + p->nResColumn = (u16)nResColumn; + p->aColName = (Mem*)sqlite3DbMallocRawNN(db, sizeof(Mem)*n ); + if( p->aColName==0 ) return; + initMemArray(p->aColName, n, db, MEM_Null); +} + +/* +** Set the name of the idx'th column to be returned by the SQL statement. +** zName must be a pointer to a nul terminated string. +** +** This call must be made after a call to sqlite3VdbeSetNumCols(). +** +** The final parameter, xDel, must be one of SQLITE_DYNAMIC, SQLITE_STATIC +** or SQLITE_TRANSIENT. If it is SQLITE_DYNAMIC, then the buffer pointed +** to by zName will be freed by sqlite3DbFree() when the vdbe is destroyed. +*/ +SQLITE_PRIVATE int sqlite3VdbeSetColName( + Vdbe *p, /* Vdbe being configured */ + int idx, /* Index of column zName applies to */ + int var, /* One of the COLNAME_* constants */ + const char *zName, /* Pointer to buffer containing name */ + void (*xDel)(void*) /* Memory management strategy for zName */ +){ + int rc; + Mem *pColName; + assert( idxnResColumn ); + assert( vardb->mallocFailed ){ + assert( !zName || xDel!=SQLITE_DYNAMIC ); + return SQLITE_NOMEM_BKPT; + } + assert( p->aColName!=0 ); + pColName = &(p->aColName[idx+var*p->nResColumn]); + rc = sqlite3VdbeMemSetStr(pColName, zName, -1, SQLITE_UTF8, xDel); + assert( rc!=0 || !zName || (pColName->flags&MEM_Term)!=0 ); + return rc; +} + +/* +** A read or write transaction may or may not be active on database handle +** db. If a transaction is active, commit it. If there is a +** write-transaction spanning more than one database file, this routine +** takes care of the master journal trickery. +*/ +static int vdbeCommit(sqlite3 *db, Vdbe *p){ + int i; + int nTrans = 0; /* Number of databases with an active write-transaction + ** that are candidates for a two-phase commit using a + ** master-journal */ + int rc = SQLITE_OK; + int needXcommit = 0; + +#ifdef SQLITE_OMIT_VIRTUALTABLE + /* With this option, sqlite3VtabSync() is defined to be simply + ** SQLITE_OK so p is not used. + */ + UNUSED_PARAMETER(p); +#endif + + /* Before doing anything else, call the xSync() callback for any + ** virtual module tables written in this transaction. This has to + ** be done before determining whether a master journal file is + ** required, as an xSync() callback may add an attached database + ** to the transaction. + */ + rc = sqlite3VtabSync(db, p); + + /* This loop determines (a) if the commit hook should be invoked and + ** (b) how many database files have open write transactions, not + ** including the temp database. (b) is important because if more than + ** one database file has an open write transaction, a master journal + ** file is required for an atomic commit. + */ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( sqlite3BtreeIsInTrans(pBt) ){ + /* Whether or not a database might need a master journal depends upon + ** its journal mode (among other things). This matrix determines which + ** journal modes use a master journal and which do not */ + static const u8 aMJNeeded[] = { + /* DELETE */ 1, + /* PERSIST */ 1, + /* OFF */ 0, + /* TRUNCATE */ 1, + /* MEMORY */ 0, + /* WAL */ 0 + }; + Pager *pPager; /* Pager associated with pBt */ + needXcommit = 1; + sqlite3BtreeEnter(pBt); + pPager = sqlite3BtreePager(pBt); + if( db->aDb[i].safety_level!=PAGER_SYNCHRONOUS_OFF + && aMJNeeded[sqlite3PagerGetJournalMode(pPager)] + && sqlite3PagerIsMemdb(pPager)==0 + ){ + assert( i!=1 ); + nTrans++; + } + rc = sqlite3PagerExclusiveLock(pPager); + sqlite3BtreeLeave(pBt); + } + } + if( rc!=SQLITE_OK ){ + return rc; + } + + /* If there are any write-transactions at all, invoke the commit hook */ + if( needXcommit && db->xCommitCallback ){ + rc = db->xCommitCallback(db->pCommitArg); + if( rc ){ + return SQLITE_CONSTRAINT_COMMITHOOK; + } + } + + /* The simple case - no more than one database file (not counting the + ** TEMP database) has a transaction active. There is no need for the + ** master-journal. + ** + ** If the return value of sqlite3BtreeGetFilename() is a zero length + ** string, it means the main database is :memory: or a temp file. In + ** that case we do not support atomic multi-file commits, so use the + ** simple case then too. + */ + if( 0==sqlite3Strlen30(sqlite3BtreeGetFilename(db->aDb[0].pBt)) + || nTrans<=1 + ){ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + rc = sqlite3BtreeCommitPhaseOne(pBt, 0); + } + } + + /* Do the commit only if all databases successfully complete phase 1. + ** If one of the BtreeCommitPhaseOne() calls fails, this indicates an + ** IO error while deleting or truncating a journal file. It is unlikely, + ** but could happen. In this case abandon processing and return the error. + */ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + rc = sqlite3BtreeCommitPhaseTwo(pBt, 0); + } + } + if( rc==SQLITE_OK ){ + sqlite3VtabCommit(db); + } + } + + /* The complex case - There is a multi-file write-transaction active. + ** This requires a master journal file to ensure the transaction is + ** committed atomically. + */ +#ifndef SQLITE_OMIT_DISKIO + else{ + sqlite3_vfs *pVfs = db->pVfs; + char *zMaster = 0; /* File-name for the master journal */ + char const *zMainFile = sqlite3BtreeGetFilename(db->aDb[0].pBt); + sqlite3_file *pMaster = 0; + i64 offset = 0; + int res; + int retryCount = 0; + int nMainFile; + + /* Select a master journal file name */ + nMainFile = sqlite3Strlen30(zMainFile); + zMaster = sqlite3MPrintf(db, "%.4c%s%.16c", 0,zMainFile,0); + if( zMaster==0 ) return SQLITE_NOMEM_BKPT; + zMaster += 4; + do { + u32 iRandom; + if( retryCount ){ + if( retryCount>100 ){ + sqlite3_log(SQLITE_FULL, "MJ delete: %s", zMaster); + sqlite3OsDelete(pVfs, zMaster, 0); + break; + }else if( retryCount==1 ){ + sqlite3_log(SQLITE_FULL, "MJ collide: %s", zMaster); + } + } + retryCount++; + sqlite3_randomness(sizeof(iRandom), &iRandom); + sqlite3_snprintf(13, &zMaster[nMainFile], "-mj%06X9%02X", + (iRandom>>8)&0xffffff, iRandom&0xff); + /* The antipenultimate character of the master journal name must + ** be "9" to avoid name collisions when using 8+3 filenames. */ + assert( zMaster[sqlite3Strlen30(zMaster)-3]=='9' ); + sqlite3FileSuffix3(zMainFile, zMaster); + rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res); + }while( rc==SQLITE_OK && res ); + if( rc==SQLITE_OK ){ + /* Open the master journal. */ + rc = sqlite3OsOpenMalloc(pVfs, zMaster, &pMaster, + SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| + SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_MASTER_JOURNAL, 0 + ); + } + if( rc!=SQLITE_OK ){ + sqlite3DbFree(db, zMaster-4); + return rc; + } + + /* Write the name of each database file in the transaction into the new + ** master journal file. If an error occurs at this point close + ** and delete the master journal file. All the individual journal files + ** still have 'null' as the master journal pointer, so they will roll + ** back independently if a failure occurs. + */ + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( sqlite3BtreeIsInTrans(pBt) ){ + char const *zFile = sqlite3BtreeGetJournalname(pBt); + if( zFile==0 ){ + continue; /* Ignore TEMP and :memory: databases */ + } + assert( zFile[0]!=0 ); + rc = sqlite3OsWrite(pMaster, zFile, sqlite3Strlen30(zFile)+1, offset); + offset += sqlite3Strlen30(zFile)+1; + if( rc!=SQLITE_OK ){ + sqlite3OsCloseFree(pMaster); + sqlite3OsDelete(pVfs, zMaster, 0); + sqlite3DbFree(db, zMaster-4); + return rc; + } + } + } + + /* Sync the master journal file. If the IOCAP_SEQUENTIAL device + ** flag is set this is not required. + */ + if( 0==(sqlite3OsDeviceCharacteristics(pMaster)&SQLITE_IOCAP_SEQUENTIAL) + && SQLITE_OK!=(rc = sqlite3OsSync(pMaster, SQLITE_SYNC_NORMAL)) + ){ + sqlite3OsCloseFree(pMaster); + sqlite3OsDelete(pVfs, zMaster, 0); + sqlite3DbFree(db, zMaster-4); + return rc; + } + + /* Sync all the db files involved in the transaction. The same call + ** sets the master journal pointer in each individual journal. If + ** an error occurs here, do not delete the master journal file. + ** + ** If the error occurs during the first call to + ** sqlite3BtreeCommitPhaseOne(), then there is a chance that the + ** master journal file will be orphaned. But we cannot delete it, + ** in case the master journal file name was written into the journal + ** file before the failure occurred. + */ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + rc = sqlite3BtreeCommitPhaseOne(pBt, zMaster); + } + } + sqlite3OsCloseFree(pMaster); + assert( rc!=SQLITE_BUSY ); + if( rc!=SQLITE_OK ){ + sqlite3DbFree(db, zMaster-4); + return rc; + } + + /* Delete the master journal file. This commits the transaction. After + ** doing this the directory is synced again before any individual + ** transaction files are deleted. + */ + rc = sqlite3OsDelete(pVfs, zMaster, 1); + sqlite3DbFree(db, zMaster-4); + zMaster = 0; + if( rc ){ + return rc; + } + + /* All files and directories have already been synced, so the following + ** calls to sqlite3BtreeCommitPhaseTwo() are only closing files and + ** deleting or truncating journals. If something goes wrong while + ** this is happening we don't really care. The integrity of the + ** transaction is already guaranteed, but some stray 'cold' journals + ** may be lying around. Returning an error code won't help matters. + */ + disable_simulated_io_errors(); + sqlite3BeginBenignMalloc(); + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + sqlite3BtreeCommitPhaseTwo(pBt, 1); + } + } + sqlite3EndBenignMalloc(); + enable_simulated_io_errors(); + + sqlite3VtabCommit(db); + } +#endif + + return rc; +} + +/* +** This routine checks that the sqlite3.nVdbeActive count variable +** matches the number of vdbe's in the list sqlite3.pVdbe that are +** currently active. An assertion fails if the two counts do not match. +** This is an internal self-check only - it is not an essential processing +** step. +** +** This is a no-op if NDEBUG is defined. +*/ +#ifndef NDEBUG +static void checkActiveVdbeCnt(sqlite3 *db){ + Vdbe *p; + int cnt = 0; + int nWrite = 0; + int nRead = 0; + p = db->pVdbe; + while( p ){ + if( sqlite3_stmt_busy((sqlite3_stmt*)p) ){ + cnt++; + if( p->readOnly==0 ) nWrite++; + if( p->bIsReader ) nRead++; + } + p = p->pNext; + } + assert( cnt==db->nVdbeActive ); + assert( nWrite==db->nVdbeWrite ); + assert( nRead==db->nVdbeRead ); +} +#else +#define checkActiveVdbeCnt(x) +#endif + +/* +** If the Vdbe passed as the first argument opened a statement-transaction, +** close it now. Argument eOp must be either SAVEPOINT_ROLLBACK or +** SAVEPOINT_RELEASE. If it is SAVEPOINT_ROLLBACK, then the statement +** transaction is rolled back. If eOp is SAVEPOINT_RELEASE, then the +** statement transaction is committed. +** +** If an IO error occurs, an SQLITE_IOERR_XXX error code is returned. +** Otherwise SQLITE_OK. +*/ +static SQLITE_NOINLINE int vdbeCloseStatement(Vdbe *p, int eOp){ + sqlite3 *const db = p->db; + int rc = SQLITE_OK; + int i; + const int iSavepoint = p->iStatement-1; + + assert( eOp==SAVEPOINT_ROLLBACK || eOp==SAVEPOINT_RELEASE); + assert( db->nStatement>0 ); + assert( p->iStatement==(db->nStatement+db->nSavepoint) ); + + for(i=0; inDb; i++){ + int rc2 = SQLITE_OK; + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + if( eOp==SAVEPOINT_ROLLBACK ){ + rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_ROLLBACK, iSavepoint); + } + if( rc2==SQLITE_OK ){ + rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_RELEASE, iSavepoint); + } + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + db->nStatement--; + p->iStatement = 0; + + if( rc==SQLITE_OK ){ + if( eOp==SAVEPOINT_ROLLBACK ){ + rc = sqlite3VtabSavepoint(db, SAVEPOINT_ROLLBACK, iSavepoint); + } + if( rc==SQLITE_OK ){ + rc = sqlite3VtabSavepoint(db, SAVEPOINT_RELEASE, iSavepoint); + } + } + + /* If the statement transaction is being rolled back, also restore the + ** database handles deferred constraint counter to the value it had when + ** the statement transaction was opened. */ + if( eOp==SAVEPOINT_ROLLBACK ){ + db->nDeferredCons = p->nStmtDefCons; + db->nDeferredImmCons = p->nStmtDefImmCons; + } + return rc; +} +SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *p, int eOp){ + if( p->db->nStatement && p->iStatement ){ + return vdbeCloseStatement(p, eOp); + } + return SQLITE_OK; +} + + +/* +** This function is called when a transaction opened by the database +** handle associated with the VM passed as an argument is about to be +** committed. If there are outstanding deferred foreign key constraint +** violations, return SQLITE_ERROR. Otherwise, SQLITE_OK. +** +** If there are outstanding FK violations and this function returns +** SQLITE_ERROR, set the result of the VM to SQLITE_CONSTRAINT_FOREIGNKEY +** and write an error message to it. Then return SQLITE_ERROR. +*/ +#ifndef SQLITE_OMIT_FOREIGN_KEY +SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){ + sqlite3 *db = p->db; + if( (deferred && (db->nDeferredCons+db->nDeferredImmCons)>0) + || (!deferred && p->nFkConstraint>0) + ){ + p->rc = SQLITE_CONSTRAINT_FOREIGNKEY; + p->errorAction = OE_Abort; + sqlite3VdbeError(p, "FOREIGN KEY constraint failed"); + return SQLITE_ERROR; + } + return SQLITE_OK; +} +#endif + +/* +** This routine is called the when a VDBE tries to halt. If the VDBE +** has made changes and is in autocommit mode, then commit those +** changes. If a rollback is needed, then do the rollback. +** +** This routine is the only way to move the state of a VM from +** SQLITE_MAGIC_RUN to SQLITE_MAGIC_HALT. It is harmless to +** call this on a VM that is in the SQLITE_MAGIC_HALT state. +** +** Return an error code. If the commit could not complete because of +** lock contention, return SQLITE_BUSY. If SQLITE_BUSY is returned, it +** means the close did not happen and needs to be repeated. +*/ +SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ + int rc; /* Used to store transient return codes */ + sqlite3 *db = p->db; + + /* This function contains the logic that determines if a statement or + ** transaction will be committed or rolled back as a result of the + ** execution of this virtual machine. + ** + ** If any of the following errors occur: + ** + ** SQLITE_NOMEM + ** SQLITE_IOERR + ** SQLITE_FULL + ** SQLITE_INTERRUPT + ** + ** Then the internal cache might have been left in an inconsistent + ** state. We need to rollback the statement transaction, if there is + ** one, or the complete transaction if there is no statement transaction. + */ + + if( p->magic!=VDBE_MAGIC_RUN ){ + return SQLITE_OK; + } + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM_BKPT; + } + closeAllCursors(p); + checkActiveVdbeCnt(db); + + /* No commit or rollback needed if the program never started or if the + ** SQL statement does not read or write a database file. */ + if( p->pc>=0 && p->bIsReader ){ + int mrc; /* Primary error code from p->rc */ + int eStatementOp = 0; + int isSpecialError; /* Set to true if a 'special' error */ + + /* Lock all btrees used by the statement */ + sqlite3VdbeEnter(p); + + /* Check for one of the special errors */ + mrc = p->rc & 0xff; + isSpecialError = mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR + || mrc==SQLITE_INTERRUPT || mrc==SQLITE_FULL; + if( isSpecialError ){ + /* If the query was read-only and the error code is SQLITE_INTERRUPT, + ** no rollback is necessary. Otherwise, at least a savepoint + ** transaction must be rolled back to restore the database to a + ** consistent state. + ** + ** Even if the statement is read-only, it is important to perform + ** a statement or transaction rollback operation. If the error + ** occurred while writing to the journal, sub-journal or database + ** file as part of an effort to free up cache space (see function + ** pagerStress() in pager.c), the rollback is required to restore + ** the pager to a consistent state. + */ + if( !p->readOnly || mrc!=SQLITE_INTERRUPT ){ + if( (mrc==SQLITE_NOMEM || mrc==SQLITE_FULL) && p->usesStmtJournal ){ + eStatementOp = SAVEPOINT_ROLLBACK; + }else{ + /* We are forced to roll back the active transaction. Before doing + ** so, abort any other statements this handle currently has active. + */ + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + sqlite3CloseSavepoints(db); + db->autoCommit = 1; + p->nChange = 0; + } + } + } + + /* Check for immediate foreign key violations. */ + if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ + sqlite3VdbeCheckFk(p, 0); + } + + /* If the auto-commit flag is set and this is the only active writer + ** VM, then we do either a commit or rollback of the current transaction. + ** + ** Note: This block also runs if one of the special errors handled + ** above has occurred. + */ + if( !sqlite3VtabInSync(db) + && db->autoCommit + && db->nVdbeWrite==(p->readOnly==0) + ){ + if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ + rc = sqlite3VdbeCheckFk(p, 1); + if( rc!=SQLITE_OK ){ + if( NEVER(p->readOnly) ){ + sqlite3VdbeLeave(p); + return SQLITE_ERROR; + } + rc = SQLITE_CONSTRAINT_FOREIGNKEY; + }else{ + /* The auto-commit flag is true, the vdbe program was successful + ** or hit an 'OR FAIL' constraint and there are no deferred foreign + ** key constraints to hold up the transaction. This means a commit + ** is required. */ + rc = vdbeCommit(db, p); + } + if( rc==SQLITE_BUSY && p->readOnly ){ + sqlite3VdbeLeave(p); + return SQLITE_BUSY; + }else if( rc!=SQLITE_OK ){ + p->rc = rc; + sqlite3RollbackAll(db, SQLITE_OK); + p->nChange = 0; + }else{ + db->nDeferredCons = 0; + db->nDeferredImmCons = 0; + db->flags &= ~(u64)SQLITE_DeferFKs; + sqlite3CommitInternalChanges(db); + } + }else{ + sqlite3RollbackAll(db, SQLITE_OK); + p->nChange = 0; + } + db->nStatement = 0; + }else if( eStatementOp==0 ){ + if( p->rc==SQLITE_OK || p->errorAction==OE_Fail ){ + eStatementOp = SAVEPOINT_RELEASE; + }else if( p->errorAction==OE_Abort ){ + eStatementOp = SAVEPOINT_ROLLBACK; + }else{ + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + sqlite3CloseSavepoints(db); + db->autoCommit = 1; + p->nChange = 0; + } + } + + /* If eStatementOp is non-zero, then a statement transaction needs to + ** be committed or rolled back. Call sqlite3VdbeCloseStatement() to + ** do so. If this operation returns an error, and the current statement + ** error code is SQLITE_OK or SQLITE_CONSTRAINT, then promote the + ** current statement error code. + */ + if( eStatementOp ){ + rc = sqlite3VdbeCloseStatement(p, eStatementOp); + if( rc ){ + if( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_CONSTRAINT ){ + p->rc = rc; + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + } + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + sqlite3CloseSavepoints(db); + db->autoCommit = 1; + p->nChange = 0; + } + } + + /* If this was an INSERT, UPDATE or DELETE and no statement transaction + ** has been rolled back, update the database connection change-counter. + */ + if( p->changeCntOn ){ + if( eStatementOp!=SAVEPOINT_ROLLBACK ){ + sqlite3VdbeSetChanges(db, p->nChange); + }else{ + sqlite3VdbeSetChanges(db, 0); + } + p->nChange = 0; + } + + /* Release the locks */ + sqlite3VdbeLeave(p); + } + + /* We have successfully halted and closed the VM. Record this fact. */ + if( p->pc>=0 ){ + db->nVdbeActive--; + if( !p->readOnly ) db->nVdbeWrite--; + if( p->bIsReader ) db->nVdbeRead--; + assert( db->nVdbeActive>=db->nVdbeRead ); + assert( db->nVdbeRead>=db->nVdbeWrite ); + assert( db->nVdbeWrite>=0 ); + } + p->magic = VDBE_MAGIC_HALT; + checkActiveVdbeCnt(db); + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM_BKPT; + } + + /* If the auto-commit flag is set to true, then any locks that were held + ** by connection db have now been released. Call sqlite3ConnectionUnlocked() + ** to invoke any required unlock-notify callbacks. + */ + if( db->autoCommit ){ + sqlite3ConnectionUnlocked(db); + } + + assert( db->nVdbeActive>0 || db->autoCommit==0 || db->nStatement==0 ); + return (p->rc==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK); +} + + +/* +** Each VDBE holds the result of the most recent sqlite3_step() call +** in p->rc. This routine sets that result back to SQLITE_OK. +*/ +SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe *p){ + p->rc = SQLITE_OK; +} + +/* +** Copy the error code and error message belonging to the VDBE passed +** as the first argument to its database handle (so that they will be +** returned by calls to sqlite3_errcode() and sqlite3_errmsg()). +** +** This function does not clear the VDBE error code or message, just +** copies them to the database handle. +*/ +SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p){ + sqlite3 *db = p->db; + int rc = p->rc; + if( p->zErrMsg ){ + db->bBenignMalloc++; + sqlite3BeginBenignMalloc(); + if( db->pErr==0 ) db->pErr = sqlite3ValueNew(db); + sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT); + sqlite3EndBenignMalloc(); + db->bBenignMalloc--; + }else if( db->pErr ){ + sqlite3ValueSetNull(db->pErr); + } + db->errCode = rc; + return rc; +} + +#ifdef SQLITE_ENABLE_SQLLOG +/* +** If an SQLITE_CONFIG_SQLLOG hook is registered and the VM has been run, +** invoke it. +*/ +static void vdbeInvokeSqllog(Vdbe *v){ + if( sqlite3GlobalConfig.xSqllog && v->rc==SQLITE_OK && v->zSql && v->pc>=0 ){ + char *zExpanded = sqlite3VdbeExpandSql(v, v->zSql); + assert( v->db->init.busy==0 ); + if( zExpanded ){ + sqlite3GlobalConfig.xSqllog( + sqlite3GlobalConfig.pSqllogArg, v->db, zExpanded, 1 + ); + sqlite3DbFree(v->db, zExpanded); + } + } +} +#else +# define vdbeInvokeSqllog(x) +#endif + +/* +** Clean up a VDBE after execution but do not delete the VDBE just yet. +** Write any error messages into *pzErrMsg. Return the result code. +** +** After this routine is run, the VDBE should be ready to be executed +** again. +** +** To look at it another way, this routine resets the state of the +** virtual machine from VDBE_MAGIC_RUN or VDBE_MAGIC_HALT back to +** VDBE_MAGIC_INIT. +*/ +SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + int i; +#endif + + sqlite3 *db; + db = p->db; + + /* If the VM did not run to completion or if it encountered an + ** error, then it might not have been halted properly. So halt + ** it now. + */ + sqlite3VdbeHalt(p); + + /* If the VDBE has been run even partially, then transfer the error code + ** and error message from the VDBE into the main database structure. But + ** if the VDBE has just been set to run but has not actually executed any + ** instructions yet, leave the main database error information unchanged. + */ + if( p->pc>=0 ){ + vdbeInvokeSqllog(p); + sqlite3VdbeTransferError(p); + if( p->runOnlyOnce ) p->expired = 1; + }else if( p->rc && p->expired ){ + /* The expired flag was set on the VDBE before the first call + ** to sqlite3_step(). For consistency (since sqlite3_step() was + ** called), set the database error in this case as well. + */ + sqlite3ErrorWithMsg(db, p->rc, p->zErrMsg ? "%s" : 0, p->zErrMsg); + } + + /* Reset register contents and reclaim error message memory. + */ +#ifdef SQLITE_DEBUG + /* Execute assert() statements to ensure that the Vdbe.apCsr[] and + ** Vdbe.aMem[] arrays have already been cleaned up. */ + if( p->apCsr ) for(i=0; inCursor; i++) assert( p->apCsr[i]==0 ); + if( p->aMem ){ + for(i=0; inMem; i++) assert( p->aMem[i].flags==MEM_Undefined ); + } +#endif + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + p->pResultSet = 0; +#ifdef SQLITE_DEBUG + p->nWrite = 0; +#endif + + /* Save profiling information from this VDBE run. + */ +#ifdef VDBE_PROFILE + { + FILE *out = fopen("vdbe_profile.out", "a"); + if( out ){ + fprintf(out, "---- "); + for(i=0; inOp; i++){ + fprintf(out, "%02x", p->aOp[i].opcode); + } + fprintf(out, "\n"); + if( p->zSql ){ + char c, pc = 0; + fprintf(out, "-- "); + for(i=0; (c = p->zSql[i])!=0; i++){ + if( pc=='\n' ) fprintf(out, "-- "); + putc(c, out); + pc = c; + } + if( pc!='\n' ) fprintf(out, "\n"); + } + for(i=0; inOp; i++){ + char zHdr[100]; + sqlite3_snprintf(sizeof(zHdr), zHdr, "%6u %12llu %8llu ", + p->aOp[i].cnt, + p->aOp[i].cycles, + p->aOp[i].cnt>0 ? p->aOp[i].cycles/p->aOp[i].cnt : 0 + ); + fprintf(out, "%s", zHdr); + sqlite3VdbePrintOp(out, i, &p->aOp[i]); + } + fclose(out); + } + } +#endif + p->magic = VDBE_MAGIC_RESET; + return p->rc & db->errMask; +} + +/* +** Clean up and delete a VDBE after execution. Return an integer which is +** the result code. Write any error message text into *pzErrMsg. +*/ +SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){ + int rc = SQLITE_OK; + if( p->magic==VDBE_MAGIC_RUN || p->magic==VDBE_MAGIC_HALT ){ + rc = sqlite3VdbeReset(p); + assert( (rc & p->db->errMask)==rc ); + } + sqlite3VdbeDelete(p); + return rc; +} + +/* +** If parameter iOp is less than zero, then invoke the destructor for +** all auxiliary data pointers currently cached by the VM passed as +** the first argument. +** +** Or, if iOp is greater than or equal to zero, then the destructor is +** only invoked for those auxiliary data pointers created by the user +** function invoked by the OP_Function opcode at instruction iOp of +** VM pVdbe, and only then if: +** +** * the associated function parameter is the 32nd or later (counting +** from left to right), or +** +** * the corresponding bit in argument mask is clear (where the first +** function parameter corresponds to bit 0 etc.). +*/ +SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp, int mask){ + while( *pp ){ + AuxData *pAux = *pp; + if( (iOp<0) + || (pAux->iAuxOp==iOp + && pAux->iAuxArg>=0 + && (pAux->iAuxArg>31 || !(mask & MASKBIT32(pAux->iAuxArg)))) + ){ + testcase( pAux->iAuxArg==31 ); + if( pAux->xDeleteAux ){ + pAux->xDeleteAux(pAux->pAux); + } + *pp = pAux->pNextAux; + sqlite3DbFree(db, pAux); + }else{ + pp= &pAux->pNextAux; + } + } +} + +/* +** Free all memory associated with the Vdbe passed as the second argument, +** except for object itself, which is preserved. +** +** The difference between this function and sqlite3VdbeDelete() is that +** VdbeDelete() also unlinks the Vdbe from the list of VMs associated with +** the database connection and frees the object itself. +*/ +SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ + SubProgram *pSub, *pNext; + assert( p->db==0 || p->db==db ); + releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + for(pSub=p->pProgram; pSub; pSub=pNext){ + pNext = pSub->pNext; + vdbeFreeOpArray(db, pSub->aOp, pSub->nOp); + sqlite3DbFree(db, pSub); + } + if( p->magic!=VDBE_MAGIC_INIT ){ + releaseMemArray(p->aVar, p->nVar); + sqlite3DbFree(db, p->pVList); + sqlite3DbFree(db, p->pFree); + } + vdbeFreeOpArray(db, p->aOp, p->nOp); + sqlite3DbFree(db, p->aColName); + sqlite3DbFree(db, p->zSql); +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3DbFree(db, p->zNormSql); + { + DblquoteStr *pThis, *pNext; + for(pThis=p->pDblStr; pThis; pThis=pNext){ + pNext = pThis->pNextStr; + sqlite3DbFree(db, pThis); + } + } +#endif +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + { + int i; + for(i=0; inScan; i++){ + sqlite3DbFree(db, p->aScan[i].zName); + } + sqlite3DbFree(db, p->aScan); + } +#endif +} + +/* +** Delete an entire VDBE. +*/ +SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){ + sqlite3 *db; + + assert( p!=0 ); + db = p->db; + assert( sqlite3_mutex_held(db->mutex) ); + sqlite3VdbeClearObject(db, p); + if( p->pPrev ){ + p->pPrev->pNext = p->pNext; + }else{ + assert( db->pVdbe==p ); + db->pVdbe = p->pNext; + } + if( p->pNext ){ + p->pNext->pPrev = p->pPrev; + } + p->magic = VDBE_MAGIC_DEAD; + p->db = 0; + sqlite3DbFreeNN(db, p); +} + +/* +** The cursor "p" has a pending seek operation that has not yet been +** carried out. Seek the cursor now. If an error occurs, return +** the appropriate error code. +*/ +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){ + int res, rc; +#ifdef SQLITE_TEST + extern int sqlite3_search_count; +#endif + assert( p->deferredMoveto ); + assert( p->isTable ); + assert( p->eCurType==CURTYPE_BTREE ); + rc = sqlite3BtreeMovetoUnpacked(p->uc.pCursor, 0, p->movetoTarget, 0, &res); + if( rc ) return rc; + if( res!=0 ) return SQLITE_CORRUPT_BKPT; +#ifdef SQLITE_TEST + sqlite3_search_count++; +#endif + p->deferredMoveto = 0; + p->cacheStatus = CACHE_STALE; + return SQLITE_OK; +} + +/* +** Something has moved cursor "p" out of place. Maybe the row it was +** pointed to was deleted out from under it. Or maybe the btree was +** rebalanced. Whatever the cause, try to restore "p" to the place it +** is supposed to be pointing. If the row was deleted out from under the +** cursor, set the cursor to point to a NULL row. +*/ +static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){ + int isDifferentRow, rc; + assert( p->eCurType==CURTYPE_BTREE ); + assert( p->uc.pCursor!=0 ); + assert( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ); + rc = sqlite3BtreeCursorRestore(p->uc.pCursor, &isDifferentRow); + p->cacheStatus = CACHE_STALE; + if( isDifferentRow ) p->nullRow = 1; + return rc; +} + +/* +** Check to ensure that the cursor is valid. Restore the cursor +** if need be. Return any I/O error from the restore operation. +*/ +SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor *p){ + assert( p->eCurType==CURTYPE_BTREE ); + if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ + return handleMovedCursor(p); + } + return SQLITE_OK; +} + +/* +** Make sure the cursor p is ready to read or write the row to which it +** was last positioned. Return an error code if an OOM fault or I/O error +** prevents us from positioning the cursor to its correct position. +** +** If a MoveTo operation is pending on the given cursor, then do that +** MoveTo now. If no move is pending, check to see if the row has been +** deleted out from under the cursor and if it has, mark the row as +** a NULL row. +** +** If the cursor is already pointing to the correct row and that row has +** not been deleted out from under the cursor, then this routine is a no-op. +*/ +SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ + VdbeCursor *p = *pp; + assert( p->eCurType==CURTYPE_BTREE || p->eCurType==CURTYPE_PSEUDO ); + if( p->deferredMoveto ){ + int iMap; + if( p->aAltMap && (iMap = p->aAltMap[1+*piCol])>0 && !p->nullRow ){ + *pp = p->pAltCursor; + *piCol = iMap - 1; + return SQLITE_OK; + } + return sqlite3VdbeFinishMoveto(p); + } + if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ + return handleMovedCursor(p); + } + return SQLITE_OK; +} + +/* +** The following functions: +** +** sqlite3VdbeSerialType() +** sqlite3VdbeSerialTypeLen() +** sqlite3VdbeSerialLen() +** sqlite3VdbeSerialPut() +** sqlite3VdbeSerialGet() +** +** encapsulate the code that serializes values for storage in SQLite +** data and index records. Each serialized value consists of a +** 'serial-type' and a blob of data. The serial type is an 8-byte unsigned +** integer, stored as a varint. +** +** In an SQLite index record, the serial type is stored directly before +** the blob of data that it corresponds to. In a table record, all serial +** types are stored at the start of the record, and the blobs of data at +** the end. Hence these functions allow the caller to handle the +** serial-type and data blob separately. +** +** The following table describes the various storage classes for data: +** +** serial type bytes of data type +** -------------- --------------- --------------- +** 0 0 NULL +** 1 1 signed integer +** 2 2 signed integer +** 3 3 signed integer +** 4 4 signed integer +** 5 6 signed integer +** 6 8 signed integer +** 7 8 IEEE float +** 8 0 Integer constant 0 +** 9 0 Integer constant 1 +** 10,11 reserved for expansion +** N>=12 and even (N-12)/2 BLOB +** N>=13 and odd (N-13)/2 text +** +** The 8 and 9 types were added in 3.3.0, file format 4. Prior versions +** of SQLite will not understand those serial types. +*/ + +#if 0 /* Inlined into the OP_MakeRecord opcode */ +/* +** Return the serial-type for the value stored in pMem. +** +** This routine might convert a large MEM_IntReal value into MEM_Real. +** +** 2019-07-11: The primary user of this subroutine was the OP_MakeRecord +** opcode in the byte-code engine. But by moving this routine in-line, we +** can omit some redundant tests and make that opcode a lot faster. So +** this routine is now only used by the STAT3 logic and STAT3 support has +** ended. The code is kept here for historical reference only. +*/ +SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ + int flags = pMem->flags; + u32 n; + + assert( pLen!=0 ); + if( flags&MEM_Null ){ + *pLen = 0; + return 0; + } + if( flags&(MEM_Int|MEM_IntReal) ){ + /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ +# define MAX_6BYTE ((((i64)0x00008000)<<32)-1) + i64 i = pMem->u.i; + u64 u; + testcase( flags & MEM_Int ); + testcase( flags & MEM_IntReal ); + if( i<0 ){ + u = ~i; + }else{ + u = i; + } + if( u<=127 ){ + if( (i&1)==i && file_format>=4 ){ + *pLen = 0; + return 8+(u32)u; + }else{ + *pLen = 1; + return 1; + } + } + if( u<=32767 ){ *pLen = 2; return 2; } + if( u<=8388607 ){ *pLen = 3; return 3; } + if( u<=2147483647 ){ *pLen = 4; return 4; } + if( u<=MAX_6BYTE ){ *pLen = 6; return 5; } + *pLen = 8; + if( flags&MEM_IntReal ){ + /* If the value is IntReal and is going to take up 8 bytes to store + ** as an integer, then we might as well make it an 8-byte floating + ** point value */ + pMem->u.r = (double)pMem->u.i; + pMem->flags &= ~MEM_IntReal; + pMem->flags |= MEM_Real; + return 7; + } + return 6; + } + if( flags&MEM_Real ){ + *pLen = 8; + return 7; + } + assert( pMem->db->mallocFailed || flags&(MEM_Str|MEM_Blob) ); + assert( pMem->n>=0 ); + n = (u32)pMem->n; + if( flags & MEM_Zero ){ + n += pMem->u.nZero; + } + *pLen = n; + return ((n*2) + 12 + ((flags&MEM_Str)!=0)); +} +#endif /* inlined into OP_MakeRecord */ + +/* +** The sizes for serial types less than 128 +*/ +static const u8 sqlite3SmallTypeSizes[] = { + /* 0 1 2 3 4 5 6 7 8 9 */ +/* 0 */ 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, +/* 10 */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, +/* 20 */ 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, +/* 30 */ 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, +/* 40 */ 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, +/* 50 */ 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, +/* 60 */ 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, +/* 70 */ 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, +/* 80 */ 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, +/* 90 */ 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, +/* 100 */ 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, +/* 110 */ 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, +/* 120 */ 54, 54, 55, 55, 56, 56, 57, 57 +}; + +/* +** Return the length of the data corresponding to the supplied serial-type. +*/ +SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32 serial_type){ + if( serial_type>=128 ){ + return (serial_type-12)/2; + }else{ + assert( serial_type<12 + || sqlite3SmallTypeSizes[serial_type]==(serial_type - 12)/2 ); + return sqlite3SmallTypeSizes[serial_type]; + } +} +SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){ + assert( serial_type<128 ); + return sqlite3SmallTypeSizes[serial_type]; +} + +/* +** If we are on an architecture with mixed-endian floating +** points (ex: ARM7) then swap the lower 4 bytes with the +** upper 4 bytes. Return the result. +** +** For most architectures, this is a no-op. +** +** (later): It is reported to me that the mixed-endian problem +** on ARM7 is an issue with GCC, not with the ARM7 chip. It seems +** that early versions of GCC stored the two words of a 64-bit +** float in the wrong order. And that error has been propagated +** ever since. The blame is not necessarily with GCC, though. +** GCC might have just copying the problem from a prior compiler. +** I am also told that newer versions of GCC that follow a different +** ABI get the byte order right. +** +** Developers using SQLite on an ARM7 should compile and run their +** application using -DSQLITE_DEBUG=1 at least once. With DEBUG +** enabled, some asserts below will ensure that the byte order of +** floating point values is correct. +** +** (2007-08-30) Frank van Vugt has studied this problem closely +** and has send his findings to the SQLite developers. Frank +** writes that some Linux kernels offer floating point hardware +** emulation that uses only 32-bit mantissas instead of a full +** 48-bits as required by the IEEE standard. (This is the +** CONFIG_FPE_FASTFPE option.) On such systems, floating point +** byte swapping becomes very complicated. To avoid problems, +** the necessary byte swapping is carried out using a 64-bit integer +** rather than a 64-bit float. Frank assures us that the code here +** works for him. We, the developers, have no way to independently +** verify this, but Frank seems to know what he is talking about +** so we trust him. +*/ +#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +static u64 floatSwap(u64 in){ + union { + u64 r; + u32 i[2]; + } u; + u32 t; + + u.r = in; + t = u.i[0]; + u.i[0] = u.i[1]; + u.i[1] = t; + return u.r; +} +# define swapMixedEndianFloat(X) X = floatSwap(X) +#else +# define swapMixedEndianFloat(X) +#endif + +/* +** Write the serialized data blob for the value stored in pMem into +** buf. It is assumed that the caller has allocated sufficient space. +** Return the number of bytes written. +** +** nBuf is the amount of space left in buf[]. The caller is responsible +** for allocating enough space to buf[] to hold the entire field, exclusive +** of the pMem->u.nZero bytes for a MEM_Zero value. +** +** Return the number of bytes actually written into buf[]. The number +** of bytes in the zero-filled tail is included in the return value only +** if those bytes were zeroed in buf[]. +*/ +SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ + u32 len; + + /* Integer and Real */ + if( serial_type<=7 && serial_type>0 ){ + u64 v; + u32 i; + if( serial_type==7 ){ + assert( sizeof(v)==sizeof(pMem->u.r) ); + memcpy(&v, &pMem->u.r, sizeof(v)); + swapMixedEndianFloat(v); + }else{ + v = pMem->u.i; + } + len = i = sqlite3SmallTypeSizes[serial_type]; + assert( i>0 ); + do{ + buf[--i] = (u8)(v&0xFF); + v >>= 8; + }while( i ); + return len; + } + + /* String or blob */ + if( serial_type>=12 ){ + assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.nZero:0) + == (int)sqlite3VdbeSerialTypeLen(serial_type) ); + len = pMem->n; + if( len>0 ) memcpy(buf, pMem->z, len); + return len; + } + + /* NULL or constants 0 or 1 */ + return 0; +} + +/* Input "x" is a sequence of unsigned characters that represent a +** big-endian integer. Return the equivalent native integer +*/ +#define ONE_BYTE_INT(x) ((i8)(x)[0]) +#define TWO_BYTE_INT(x) (256*(i8)((x)[0])|(x)[1]) +#define THREE_BYTE_INT(x) (65536*(i8)((x)[0])|((x)[1]<<8)|(x)[2]) +#define FOUR_BYTE_UINT(x) (((u32)(x)[0]<<24)|((x)[1]<<16)|((x)[2]<<8)|(x)[3]) +#define FOUR_BYTE_INT(x) (16777216*(i8)((x)[0])|((x)[1]<<16)|((x)[2]<<8)|(x)[3]) + +/* +** Deserialize the data blob pointed to by buf as serial type serial_type +** and store the result in pMem. Return the number of bytes read. +** +** This function is implemented as two separate routines for performance. +** The few cases that require local variables are broken out into a separate +** routine so that in most cases the overhead of moving the stack pointer +** is avoided. +*/ +static u32 serialGet( + const unsigned char *buf, /* Buffer to deserialize from */ + u32 serial_type, /* Serial type to deserialize */ + Mem *pMem /* Memory cell to write value into */ +){ + u64 x = FOUR_BYTE_UINT(buf); + u32 y = FOUR_BYTE_UINT(buf+4); + x = (x<<32) + y; + if( serial_type==6 ){ + /* EVIDENCE-OF: R-29851-52272 Value is a big-endian 64-bit + ** twos-complement integer. */ + pMem->u.i = *(i64*)&x; + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + }else{ + /* EVIDENCE-OF: R-57343-49114 Value is a big-endian IEEE 754-2008 64-bit + ** floating point number. */ +#if !defined(NDEBUG) && !defined(SQLITE_OMIT_FLOATING_POINT) + /* Verify that integers and floating point values use the same + ** byte order. Or, that if SQLITE_MIXED_ENDIAN_64BIT_FLOAT is + ** defined that 64-bit floating point values really are mixed + ** endian. + */ + static const u64 t1 = ((u64)0x3ff00000)<<32; + static const double r1 = 1.0; + u64 t2 = t1; + swapMixedEndianFloat(t2); + assert( sizeof(r1)==sizeof(t2) && memcmp(&r1, &t2, sizeof(r1))==0 ); +#endif + assert( sizeof(x)==8 && sizeof(pMem->u.r)==8 ); + swapMixedEndianFloat(x); + memcpy(&pMem->u.r, &x, sizeof(x)); + pMem->flags = IsNaN(x) ? MEM_Null : MEM_Real; + } + return 8; +} +SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( + const unsigned char *buf, /* Buffer to deserialize from */ + u32 serial_type, /* Serial type to deserialize */ + Mem *pMem /* Memory cell to write value into */ +){ + switch( serial_type ){ + case 10: { /* Internal use only: NULL with virtual table + ** UPDATE no-change flag set */ + pMem->flags = MEM_Null|MEM_Zero; + pMem->n = 0; + pMem->u.nZero = 0; + break; + } + case 11: /* Reserved for future use */ + case 0: { /* Null */ + /* EVIDENCE-OF: R-24078-09375 Value is a NULL. */ + pMem->flags = MEM_Null; + break; + } + case 1: { + /* EVIDENCE-OF: R-44885-25196 Value is an 8-bit twos-complement + ** integer. */ + pMem->u.i = ONE_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return 1; + } + case 2: { /* 2-byte signed integer */ + /* EVIDENCE-OF: R-49794-35026 Value is a big-endian 16-bit + ** twos-complement integer. */ + pMem->u.i = TWO_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return 2; + } + case 3: { /* 3-byte signed integer */ + /* EVIDENCE-OF: R-37839-54301 Value is a big-endian 24-bit + ** twos-complement integer. */ + pMem->u.i = THREE_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return 3; + } + case 4: { /* 4-byte signed integer */ + /* EVIDENCE-OF: R-01849-26079 Value is a big-endian 32-bit + ** twos-complement integer. */ + pMem->u.i = FOUR_BYTE_INT(buf); +#ifdef __HP_cc + /* Work around a sign-extension bug in the HP compiler for HP/UX */ + if( buf[0]&0x80 ) pMem->u.i |= 0xffffffff80000000LL; +#endif + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return 4; + } + case 5: { /* 6-byte signed integer */ + /* EVIDENCE-OF: R-50385-09674 Value is a big-endian 48-bit + ** twos-complement integer. */ + pMem->u.i = FOUR_BYTE_UINT(buf+2) + (((i64)1)<<32)*TWO_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return 6; + } + case 6: /* 8-byte signed integer */ + case 7: { /* IEEE floating point */ + /* These use local variables, so do them in a separate routine + ** to avoid having to move the frame pointer in the common case */ + return serialGet(buf,serial_type,pMem); + } + case 8: /* Integer 0 */ + case 9: { /* Integer 1 */ + /* EVIDENCE-OF: R-12976-22893 Value is the integer 0. */ + /* EVIDENCE-OF: R-18143-12121 Value is the integer 1. */ + pMem->u.i = serial_type-8; + pMem->flags = MEM_Int; + return 0; + } + default: { + /* EVIDENCE-OF: R-14606-31564 Value is a BLOB that is (N-12)/2 bytes in + ** length. + ** EVIDENCE-OF: R-28401-00140 Value is a string in the text encoding and + ** (N-13)/2 bytes in length. */ + static const u16 aFlag[] = { MEM_Blob|MEM_Ephem, MEM_Str|MEM_Ephem }; + pMem->z = (char *)buf; + pMem->n = (serial_type-12)/2; + pMem->flags = aFlag[serial_type&1]; + return pMem->n; + } + } + return 0; +} +/* +** This routine is used to allocate sufficient space for an UnpackedRecord +** structure large enough to be used with sqlite3VdbeRecordUnpack() if +** the first argument is a pointer to KeyInfo structure pKeyInfo. +** +** The space is either allocated using sqlite3DbMallocRaw() or from within +** the unaligned buffer passed via the second and third arguments (presumably +** stack space). If the former, then *ppFree is set to a pointer that should +** be eventually freed by the caller using sqlite3DbFree(). Or, if the +** allocation comes from the pSpace/szSpace buffer, *ppFree is set to NULL +** before returning. +** +** If an OOM error occurs, NULL is returned. +*/ +SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( + KeyInfo *pKeyInfo /* Description of the record */ +){ + UnpackedRecord *p; /* Unpacked record to return */ + int nByte; /* Number of bytes required for *p */ + nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1); + p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); + if( !p ) return 0; + p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; + assert( pKeyInfo->aSortFlags!=0 ); + p->pKeyInfo = pKeyInfo; + p->nField = pKeyInfo->nKeyField + 1; + return p; +} + +/* +** Given the nKey-byte encoding of a record in pKey[], populate the +** UnpackedRecord structure indicated by the fourth argument with the +** contents of the decoded record. +*/ +SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( + KeyInfo *pKeyInfo, /* Information about the record format */ + int nKey, /* Size of the binary record */ + const void *pKey, /* The binary record */ + UnpackedRecord *p /* Populate this structure before returning. */ +){ + const unsigned char *aKey = (const unsigned char *)pKey; + u32 d; + u32 idx; /* Offset in aKey[] to read from */ + u16 u; /* Unsigned loop counter */ + u32 szHdr; + Mem *pMem = p->aMem; + + p->default_rc = 0; + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + idx = getVarint32(aKey, szHdr); + d = szHdr; + u = 0; + while( idxenc = pKeyInfo->enc; + pMem->db = pKeyInfo->db; + /* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */ + pMem->szMalloc = 0; + pMem->z = 0; + d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem); + pMem++; + if( (++u)>=p->nField ) break; + } + if( d>(u32)nKey && u ){ + assert( CORRUPT_DB ); + /* In a corrupt record entry, the last pMem might have been set up using + ** uninitialized memory. Overwrite its value with NULL, to prevent + ** warnings from MSAN. */ + sqlite3VdbeMemSetNull(pMem-1); + } + assert( u<=pKeyInfo->nKeyField + 1 ); + p->nField = u; +} + +#ifdef SQLITE_DEBUG +/* +** This function compares two index or table record keys in the same way +** as the sqlite3VdbeRecordCompare() routine. Unlike VdbeRecordCompare(), +** this function deserializes and compares values using the +** sqlite3VdbeSerialGet() and sqlite3MemCompare() functions. It is used +** in assert() statements to ensure that the optimized code in +** sqlite3VdbeRecordCompare() returns results with these two primitives. +** +** Return true if the result of comparison is equivalent to desiredResult. +** Return false if there is a disagreement. +*/ +static int vdbeRecordCompareDebug( + int nKey1, const void *pKey1, /* Left key */ + const UnpackedRecord *pPKey2, /* Right key */ + int desiredResult /* Correct answer */ +){ + u32 d1; /* Offset into aKey[] of next data element */ + u32 idx1; /* Offset into aKey[] of next header element */ + u32 szHdr1; /* Number of bytes in header */ + int i = 0; + int rc = 0; + const unsigned char *aKey1 = (const unsigned char *)pKey1; + KeyInfo *pKeyInfo; + Mem mem1; + + pKeyInfo = pPKey2->pKeyInfo; + if( pKeyInfo->db==0 ) return 1; + mem1.enc = pKeyInfo->enc; + mem1.db = pKeyInfo->db; + /* mem1.flags = 0; // Will be initialized by sqlite3VdbeSerialGet() */ + VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ + + /* Compilers may complain that mem1.u.i is potentially uninitialized. + ** We could initialize it, as shown here, to silence those complaints. + ** But in fact, mem1.u.i will never actually be used uninitialized, and doing + ** the unnecessary initialization has a measurable negative performance + ** impact, since this routine is a very high runner. And so, we choose + ** to ignore the compiler warnings and leave this variable uninitialized. + */ + /* mem1.u.i = 0; // not needed, here to silence compiler warning */ + + idx1 = getVarint32(aKey1, szHdr1); + if( szHdr1>98307 ) return SQLITE_CORRUPT; + d1 = szHdr1; + assert( pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB ); + assert( pKeyInfo->aSortFlags!=0 ); + assert( pKeyInfo->nKeyField>0 ); + assert( idx1<=szHdr1 || CORRUPT_DB ); + do{ + u32 serial_type1; + + /* Read the serial types for the next element in each key. */ + idx1 += getVarint32( aKey1+idx1, serial_type1 ); + + /* Verify that there is enough key space remaining to avoid + ** a buffer overread. The "d1+serial_type1+2" subexpression will + ** always be greater than or equal to the amount of required key space. + ** Use that approximation to avoid the more expensive call to + ** sqlite3VdbeSerialTypeLen() in the common case. + */ + if( d1+(u64)serial_type1+2>(u64)nKey1 + && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)>(u64)nKey1 + ){ + break; + } + + /* Extract the values to be compared. + */ + d1 += sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1); + + /* Do the comparison + */ + rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], + pKeyInfo->nAllField>i ? pKeyInfo->aColl[i] : 0); + if( rc!=0 ){ + assert( mem1.szMalloc==0 ); /* See comment below */ + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) + && ((mem1.flags & MEM_Null) || (pPKey2->aMem[i].flags & MEM_Null)) + ){ + rc = -rc; + } + if( pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC ){ + rc = -rc; /* Invert the result for DESC sort order. */ + } + goto debugCompareEnd; + } + i++; + }while( idx1nField ); + + /* No memory allocation is ever used on mem1. Prove this using + ** the following assert(). If the assert() fails, it indicates a + ** memory leak and a need to call sqlite3VdbeMemRelease(&mem1). + */ + assert( mem1.szMalloc==0 ); + + /* rc==0 here means that one of the keys ran out of fields and + ** all the fields up to that point were equal. Return the default_rc + ** value. */ + rc = pPKey2->default_rc; + +debugCompareEnd: + if( desiredResult==0 && rc==0 ) return 1; + if( desiredResult<0 && rc<0 ) return 1; + if( desiredResult>0 && rc>0 ) return 1; + if( CORRUPT_DB ) return 1; + if( pKeyInfo->db->mallocFailed ) return 1; + return 0; +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Count the number of fields (a.k.a. columns) in the record given by +** pKey,nKey. The verify that this count is less than or equal to the +** limit given by pKeyInfo->nAllField. +** +** If this constraint is not satisfied, it means that the high-speed +** vdbeRecordCompareInt() and vdbeRecordCompareString() routines will +** not work correctly. If this assert() ever fires, it probably means +** that the KeyInfo.nKeyField or KeyInfo.nAllField values were computed +** incorrectly. +*/ +static void vdbeAssertFieldCountWithinLimits( + int nKey, const void *pKey, /* The record to verify */ + const KeyInfo *pKeyInfo /* Compare size with this KeyInfo */ +){ + int nField = 0; + u32 szHdr; + u32 idx; + u32 notUsed; + const unsigned char *aKey = (const unsigned char*)pKey; + + if( CORRUPT_DB ) return; + idx = getVarint32(aKey, szHdr); + assert( nKey>=0 ); + assert( szHdr<=(u32)nKey ); + while( idxnAllField ); +} +#else +# define vdbeAssertFieldCountWithinLimits(A,B,C) +#endif + +/* +** Both *pMem1 and *pMem2 contain string values. Compare the two values +** using the collation sequence pColl. As usual, return a negative , zero +** or positive value if *pMem1 is less than, equal to or greater than +** *pMem2, respectively. Similar in spirit to "rc = (*pMem1) - (*pMem2);". +*/ +static int vdbeCompareMemString( + const Mem *pMem1, + const Mem *pMem2, + const CollSeq *pColl, + u8 *prcErr /* If an OOM occurs, set to SQLITE_NOMEM */ +){ + if( pMem1->enc==pColl->enc ){ + /* The strings are already in the correct encoding. Call the + ** comparison function directly */ + return pColl->xCmp(pColl->pUser,pMem1->n,pMem1->z,pMem2->n,pMem2->z); + }else{ + int rc; + const void *v1, *v2; + Mem c1; + Mem c2; + sqlite3VdbeMemInit(&c1, pMem1->db, MEM_Null); + sqlite3VdbeMemInit(&c2, pMem1->db, MEM_Null); + sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem); + sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem); + v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc); + v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc); + if( (v1==0 || v2==0) ){ + if( prcErr ) *prcErr = SQLITE_NOMEM_BKPT; + rc = 0; + }else{ + rc = pColl->xCmp(pColl->pUser, c1.n, v1, c2.n, v2); + } + sqlite3VdbeMemRelease(&c1); + sqlite3VdbeMemRelease(&c2); + return rc; + } +} + +/* +** The input pBlob is guaranteed to be a Blob that is not marked +** with MEM_Zero. Return true if it could be a zero-blob. +*/ +static int isAllZero(const char *z, int n){ + int i; + for(i=0; in; + int n2 = pB2->n; + + /* It is possible to have a Blob value that has some non-zero content + ** followed by zero content. But that only comes up for Blobs formed + ** by the OP_MakeRecord opcode, and such Blobs never get passed into + ** sqlite3MemCompare(). */ + assert( (pB1->flags & MEM_Zero)==0 || n1==0 ); + assert( (pB2->flags & MEM_Zero)==0 || n2==0 ); + + if( (pB1->flags|pB2->flags) & MEM_Zero ){ + if( pB1->flags & pB2->flags & MEM_Zero ){ + return pB1->u.nZero - pB2->u.nZero; + }else if( pB1->flags & MEM_Zero ){ + if( !isAllZero(pB2->z, pB2->n) ) return -1; + return pB1->u.nZero - n2; + }else{ + if( !isAllZero(pB1->z, pB1->n) ) return +1; + return n1 - pB2->u.nZero; + } + } + c = memcmp(pB1->z, pB2->z, n1>n2 ? n2 : n1); + if( c ) return c; + return n1 - n2; +} + +/* +** Do a comparison between a 64-bit signed integer and a 64-bit floating-point +** number. Return negative, zero, or positive if the first (i64) is less than, +** equal to, or greater than the second (double). +*/ +static int sqlite3IntFloatCompare(i64 i, double r){ + if( sizeof(LONGDOUBLE_TYPE)>8 ){ + LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i; + if( xr ) return +1; + return 0; + }else{ + i64 y; + double s; + if( r<-9223372036854775808.0 ) return +1; + if( r>=9223372036854775808.0 ) return -1; + y = (i64)r; + if( iy ) return +1; + s = (double)i; + if( sr ) return +1; + return 0; + } +} + +/* +** Compare the values contained by the two memory cells, returning +** negative, zero or positive if pMem1 is less than, equal to, or greater +** than pMem2. Sorting order is NULL's first, followed by numbers (integers +** and reals) sorted numerically, followed by text ordered by the collating +** sequence pColl and finally blob's ordered by memcmp(). +** +** Two NULL values are considered equal by this function. +*/ +SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const CollSeq *pColl){ + int f1, f2; + int combined_flags; + + f1 = pMem1->flags; + f2 = pMem2->flags; + combined_flags = f1|f2; + assert( !sqlite3VdbeMemIsRowSet(pMem1) && !sqlite3VdbeMemIsRowSet(pMem2) ); + + /* If one value is NULL, it is less than the other. If both values + ** are NULL, return 0. + */ + if( combined_flags&MEM_Null ){ + return (f2&MEM_Null) - (f1&MEM_Null); + } + + /* At least one of the two values is a number + */ + if( combined_flags&(MEM_Int|MEM_Real|MEM_IntReal) ){ + testcase( combined_flags & MEM_Int ); + testcase( combined_flags & MEM_Real ); + testcase( combined_flags & MEM_IntReal ); + if( (f1 & f2 & (MEM_Int|MEM_IntReal))!=0 ){ + testcase( f1 & f2 & MEM_Int ); + testcase( f1 & f2 & MEM_IntReal ); + if( pMem1->u.i < pMem2->u.i ) return -1; + if( pMem1->u.i > pMem2->u.i ) return +1; + return 0; + } + if( (f1 & f2 & MEM_Real)!=0 ){ + if( pMem1->u.r < pMem2->u.r ) return -1; + if( pMem1->u.r > pMem2->u.r ) return +1; + return 0; + } + if( (f1&(MEM_Int|MEM_IntReal))!=0 ){ + testcase( f1 & MEM_Int ); + testcase( f1 & MEM_IntReal ); + if( (f2&MEM_Real)!=0 ){ + return sqlite3IntFloatCompare(pMem1->u.i, pMem2->u.r); + }else if( (f2&(MEM_Int|MEM_IntReal))!=0 ){ + if( pMem1->u.i < pMem2->u.i ) return -1; + if( pMem1->u.i > pMem2->u.i ) return +1; + return 0; + }else{ + return -1; + } + } + if( (f1&MEM_Real)!=0 ){ + if( (f2&(MEM_Int|MEM_IntReal))!=0 ){ + testcase( f2 & MEM_Int ); + testcase( f2 & MEM_IntReal ); + return -sqlite3IntFloatCompare(pMem2->u.i, pMem1->u.r); + }else{ + return -1; + } + } + return +1; + } + + /* If one value is a string and the other is a blob, the string is less. + ** If both are strings, compare using the collating functions. + */ + if( combined_flags&MEM_Str ){ + if( (f1 & MEM_Str)==0 ){ + return 1; + } + if( (f2 & MEM_Str)==0 ){ + return -1; + } + + assert( pMem1->enc==pMem2->enc || pMem1->db->mallocFailed ); + assert( pMem1->enc==SQLITE_UTF8 || + pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE ); + + /* The collation sequence must be defined at this point, even if + ** the user deletes the collation sequence after the vdbe program is + ** compiled (this was not always the case). + */ + assert( !pColl || pColl->xCmp ); + + if( pColl ){ + return vdbeCompareMemString(pMem1, pMem2, pColl, 0); + } + /* If a NULL pointer was passed as the collate function, fall through + ** to the blob case and use memcmp(). */ + } + + /* Both values must be blobs. Compare using memcmp(). */ + return sqlite3BlobCompare(pMem1, pMem2); +} + + +/* +** The first argument passed to this function is a serial-type that +** corresponds to an integer - all values between 1 and 9 inclusive +** except 7. The second points to a buffer containing an integer value +** serialized according to serial_type. This function deserializes +** and returns the value. +*/ +static i64 vdbeRecordDecodeInt(u32 serial_type, const u8 *aKey){ + u32 y; + assert( CORRUPT_DB || (serial_type>=1 && serial_type<=9 && serial_type!=7) ); + switch( serial_type ){ + case 0: + case 1: + testcase( aKey[0]&0x80 ); + return ONE_BYTE_INT(aKey); + case 2: + testcase( aKey[0]&0x80 ); + return TWO_BYTE_INT(aKey); + case 3: + testcase( aKey[0]&0x80 ); + return THREE_BYTE_INT(aKey); + case 4: { + testcase( aKey[0]&0x80 ); + y = FOUR_BYTE_UINT(aKey); + return (i64)*(int*)&y; + } + case 5: { + testcase( aKey[0]&0x80 ); + return FOUR_BYTE_UINT(aKey+2) + (((i64)1)<<32)*TWO_BYTE_INT(aKey); + } + case 6: { + u64 x = FOUR_BYTE_UINT(aKey); + testcase( aKey[0]&0x80 ); + x = (x<<32) | FOUR_BYTE_UINT(aKey+4); + return (i64)*(i64*)&x; + } + } + + return (serial_type - 8); +} + +/* +** This function compares the two table rows or index records +** specified by {nKey1, pKey1} and pPKey2. It returns a negative, zero +** or positive integer if key1 is less than, equal to or +** greater than key2. The {nKey1, pKey1} key must be a blob +** created by the OP_MakeRecord opcode of the VDBE. The pPKey2 +** key must be a parsed key such as obtained from +** sqlite3VdbeParseRecord. +** +** If argument bSkip is non-zero, it is assumed that the caller has already +** determined that the first fields of the keys are equal. +** +** Key1 and Key2 do not have to contain the same number of fields. If all +** fields that appear in both keys are equal, then pPKey2->default_rc is +** returned. +** +** If database corruption is discovered, set pPKey2->errCode to +** SQLITE_CORRUPT and return 0. If an OOM error is encountered, +** pPKey2->errCode is set to SQLITE_NOMEM and, if it is not NULL, the +** malloc-failed flag set on database handle (pPKey2->pKeyInfo->db). +*/ +SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2, /* Right key */ + int bSkip /* If true, skip the first field */ +){ + u32 d1; /* Offset into aKey[] of next data element */ + int i; /* Index of next field to compare */ + u32 szHdr1; /* Size of record header in bytes */ + u32 idx1; /* Offset of first type in header */ + int rc = 0; /* Return value */ + Mem *pRhs = pPKey2->aMem; /* Next field of pPKey2 to compare */ + KeyInfo *pKeyInfo; + const unsigned char *aKey1 = (const unsigned char *)pKey1; + Mem mem1; + + /* If bSkip is true, then the caller has already determined that the first + ** two elements in the keys are equal. Fix the various stack variables so + ** that this routine begins comparing at the second field. */ + if( bSkip ){ + u32 s1; + idx1 = 1 + getVarint32(&aKey1[1], s1); + szHdr1 = aKey1[0]; + d1 = szHdr1 + sqlite3VdbeSerialTypeLen(s1); + i = 1; + pRhs++; + }else{ + idx1 = getVarint32(aKey1, szHdr1); + d1 = szHdr1; + i = 0; + } + if( d1>(unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } + + VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ + assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField + || CORRUPT_DB ); + assert( pPKey2->pKeyInfo->aSortFlags!=0 ); + assert( pPKey2->pKeyInfo->nKeyField>0 ); + assert( idx1<=szHdr1 || CORRUPT_DB ); + do{ + u32 serial_type; + + /* RHS is an integer */ + if( pRhs->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pRhs->flags & MEM_Int ); + testcase( pRhs->flags & MEM_IntReal ); + serial_type = aKey1[idx1]; + testcase( serial_type==12 ); + if( serial_type>=10 ){ + rc = +1; + }else if( serial_type==0 ){ + rc = -1; + }else if( serial_type==7 ){ + sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); + rc = -sqlite3IntFloatCompare(pRhs->u.i, mem1.u.r); + }else{ + i64 lhs = vdbeRecordDecodeInt(serial_type, &aKey1[d1]); + i64 rhs = pRhs->u.i; + if( lhsrhs ){ + rc = +1; + } + } + } + + /* RHS is real */ + else if( pRhs->flags & MEM_Real ){ + serial_type = aKey1[idx1]; + if( serial_type>=10 ){ + /* Serial types 12 or greater are strings and blobs (greater than + ** numbers). Types 10 and 11 are currently "reserved for future + ** use", so it doesn't really matter what the results of comparing + ** them to numberic values are. */ + rc = +1; + }else if( serial_type==0 ){ + rc = -1; + }else{ + sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); + if( serial_type==7 ){ + if( mem1.u.ru.r ){ + rc = -1; + }else if( mem1.u.r>pRhs->u.r ){ + rc = +1; + } + }else{ + rc = sqlite3IntFloatCompare(mem1.u.i, pRhs->u.r); + } + } + } + + /* RHS is a string */ + else if( pRhs->flags & MEM_Str ){ + getVarint32NR(&aKey1[idx1], serial_type); + testcase( serial_type==12 ); + if( serial_type<12 ){ + rc = -1; + }else if( !(serial_type & 0x01) ){ + rc = +1; + }else{ + mem1.n = (serial_type - 12) / 2; + testcase( (d1+mem1.n)==(unsigned)nKey1 ); + testcase( (d1+mem1.n+1)==(unsigned)nKey1 ); + if( (d1+mem1.n) > (unsigned)nKey1 + || (pKeyInfo = pPKey2->pKeyInfo)->nAllField<=i + ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + }else if( pKeyInfo->aColl[i] ){ + mem1.enc = pKeyInfo->enc; + mem1.db = pKeyInfo->db; + mem1.flags = MEM_Str; + mem1.z = (char*)&aKey1[d1]; + rc = vdbeCompareMemString( + &mem1, pRhs, pKeyInfo->aColl[i], &pPKey2->errCode + ); + }else{ + int nCmp = MIN(mem1.n, pRhs->n); + rc = memcmp(&aKey1[d1], pRhs->z, nCmp); + if( rc==0 ) rc = mem1.n - pRhs->n; + } + } + } + + /* RHS is a blob */ + else if( pRhs->flags & MEM_Blob ){ + assert( (pRhs->flags & MEM_Zero)==0 || pRhs->n==0 ); + getVarint32NR(&aKey1[idx1], serial_type); + testcase( serial_type==12 ); + if( serial_type<12 || (serial_type & 0x01) ){ + rc = -1; + }else{ + int nStr = (serial_type - 12) / 2; + testcase( (d1+nStr)==(unsigned)nKey1 ); + testcase( (d1+nStr+1)==(unsigned)nKey1 ); + if( (d1+nStr) > (unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + }else if( pRhs->flags & MEM_Zero ){ + if( !isAllZero((const char*)&aKey1[d1],nStr) ){ + rc = 1; + }else{ + rc = nStr - pRhs->u.nZero; + } + }else{ + int nCmp = MIN(nStr, pRhs->n); + rc = memcmp(&aKey1[d1], pRhs->z, nCmp); + if( rc==0 ) rc = nStr - pRhs->n; + } + } + } + + /* RHS is null */ + else{ + serial_type = aKey1[idx1]; + rc = (serial_type!=0); + } + + if( rc!=0 ){ + int sortFlags = pPKey2->pKeyInfo->aSortFlags[i]; + if( sortFlags ){ + if( (sortFlags & KEYINFO_ORDER_BIGNULL)==0 + || ((sortFlags & KEYINFO_ORDER_DESC) + !=(serial_type==0 || (pRhs->flags&MEM_Null))) + ){ + rc = -rc; + } + } + assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, rc) ); + assert( mem1.szMalloc==0 ); /* See comment below */ + return rc; + } + + i++; + if( i==pPKey2->nField ) break; + pRhs++; + d1 += sqlite3VdbeSerialTypeLen(serial_type); + idx1 += sqlite3VarintLen(serial_type); + }while( idx1<(unsigned)szHdr1 && d1<=(unsigned)nKey1 ); + + /* No memory allocation is ever used on mem1. Prove this using + ** the following assert(). If the assert() fails, it indicates a + ** memory leak and a need to call sqlite3VdbeMemRelease(&mem1). */ + assert( mem1.szMalloc==0 ); + + /* rc==0 here means that one or both of the keys ran out of fields and + ** all the fields up to that point were equal. Return the default_rc + ** value. */ + assert( CORRUPT_DB + || vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, pPKey2->default_rc) + || pPKey2->pKeyInfo->db->mallocFailed + ); + pPKey2->eqSeen = 1; + return pPKey2->default_rc; +} +SQLITE_PRIVATE int sqlite3VdbeRecordCompare( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2 /* Right key */ +){ + return sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 0); +} + + +/* +** This function is an optimized version of sqlite3VdbeRecordCompare() +** that (a) the first field of pPKey2 is an integer, and (b) the +** size-of-header varint at the start of (pKey1/nKey1) fits in a single +** byte (i.e. is less than 128). +** +** To avoid concerns about buffer overreads, this routine is only used +** on schemas where the maximum valid header size is 63 bytes or less. +*/ +static int vdbeRecordCompareInt( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2 /* Right key */ +){ + const u8 *aKey = &((const u8*)pKey1)[*(const u8*)pKey1 & 0x3F]; + int serial_type = ((const u8*)pKey1)[1]; + int res; + u32 y; + u64 x; + i64 v; + i64 lhs; + + vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); + assert( (*(u8*)pKey1)<=0x3F || CORRUPT_DB ); + switch( serial_type ){ + case 1: { /* 1-byte signed integer */ + lhs = ONE_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 2: { /* 2-byte signed integer */ + lhs = TWO_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 3: { /* 3-byte signed integer */ + lhs = THREE_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 4: { /* 4-byte signed integer */ + y = FOUR_BYTE_UINT(aKey); + lhs = (i64)*(int*)&y; + testcase( lhs<0 ); + break; + } + case 5: { /* 6-byte signed integer */ + lhs = FOUR_BYTE_UINT(aKey+2) + (((i64)1)<<32)*TWO_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 6: { /* 8-byte signed integer */ + x = FOUR_BYTE_UINT(aKey); + x = (x<<32) | FOUR_BYTE_UINT(aKey+4); + lhs = *(i64*)&x; + testcase( lhs<0 ); + break; + } + case 8: + lhs = 0; + break; + case 9: + lhs = 1; + break; + + /* This case could be removed without changing the results of running + ** this code. Including it causes gcc to generate a faster switch + ** statement (since the range of switch targets now starts at zero and + ** is contiguous) but does not cause any duplicate code to be generated + ** (as gcc is clever enough to combine the two like cases). Other + ** compilers might be similar. */ + case 0: case 7: + return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); + + default: + return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); + } + + v = pPKey2->aMem[0].u.i; + if( v>lhs ){ + res = pPKey2->r1; + }else if( vr2; + }else if( pPKey2->nField>1 ){ + /* The first fields of the two keys are equal. Compare the trailing + ** fields. */ + res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); + }else{ + /* The first fields of the two keys are equal and there are no trailing + ** fields. Return pPKey2->default_rc in this case. */ + res = pPKey2->default_rc; + pPKey2->eqSeen = 1; + } + + assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res) ); + return res; +} + +/* +** This function is an optimized version of sqlite3VdbeRecordCompare() +** that (a) the first field of pPKey2 is a string, that (b) the first field +** uses the collation sequence BINARY and (c) that the size-of-header varint +** at the start of (pKey1/nKey1) fits in a single byte. +*/ +static int vdbeRecordCompareString( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2 /* Right key */ +){ + const u8 *aKey1 = (const u8*)pKey1; + int serial_type; + int res; + + assert( pPKey2->aMem[0].flags & MEM_Str ); + vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); + serial_type = (u8)(aKey1[1]); + if( serial_type >= 0x80 ){ + sqlite3GetVarint32(&aKey1[1], (u32*)&serial_type); + } + if( serial_type<12 ){ + res = pPKey2->r1; /* (pKey1/nKey1) is a number or a null */ + }else if( !(serial_type & 0x01) ){ + res = pPKey2->r2; /* (pKey1/nKey1) is a blob */ + }else{ + int nCmp; + int nStr; + int szHdr = aKey1[0]; + + nStr = (serial_type-12) / 2; + if( (szHdr + nStr) > nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } + nCmp = MIN( pPKey2->aMem[0].n, nStr ); + res = memcmp(&aKey1[szHdr], pPKey2->aMem[0].z, nCmp); + + if( res>0 ){ + res = pPKey2->r2; + }else if( res<0 ){ + res = pPKey2->r1; + }else{ + res = nStr - pPKey2->aMem[0].n; + if( res==0 ){ + if( pPKey2->nField>1 ){ + res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); + }else{ + res = pPKey2->default_rc; + pPKey2->eqSeen = 1; + } + }else if( res>0 ){ + res = pPKey2->r2; + }else{ + res = pPKey2->r1; + } + } + } + + assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res) + || CORRUPT_DB + || pPKey2->pKeyInfo->db->mallocFailed + ); + return res; +} + +/* +** Return a pointer to an sqlite3VdbeRecordCompare() compatible function +** suitable for comparing serialized records to the unpacked record passed +** as the only argument. +*/ +SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ + /* varintRecordCompareInt() and varintRecordCompareString() both assume + ** that the size-of-header varint that occurs at the start of each record + ** fits in a single byte (i.e. is 127 or less). varintRecordCompareInt() + ** also assumes that it is safe to overread a buffer by at least the + ** maximum possible legal header size plus 8 bytes. Because there is + ** guaranteed to be at least 74 (but not 136) bytes of padding following each + ** buffer passed to varintRecordCompareInt() this makes it convenient to + ** limit the size of the header to 64 bytes in cases where the first field + ** is an integer. + ** + ** The easiest way to enforce this limit is to consider only records with + ** 13 fields or less. If the first field is an integer, the maximum legal + ** header size is (12*5 + 1 + 1) bytes. */ + if( p->pKeyInfo->nAllField<=13 ){ + int flags = p->aMem[0].flags; + if( p->pKeyInfo->aSortFlags[0] ){ + if( p->pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL ){ + return sqlite3VdbeRecordCompare; + } + p->r1 = 1; + p->r2 = -1; + }else{ + p->r1 = -1; + p->r2 = 1; + } + if( (flags & MEM_Int) ){ + return vdbeRecordCompareInt; + } + testcase( flags & MEM_Real ); + testcase( flags & MEM_Null ); + testcase( flags & MEM_Blob ); + if( (flags & (MEM_Real|MEM_IntReal|MEM_Null|MEM_Blob))==0 + && p->pKeyInfo->aColl[0]==0 + ){ + assert( flags & MEM_Str ); + return vdbeRecordCompareString; + } + } + + return sqlite3VdbeRecordCompare; +} + +/* +** pCur points at an index entry created using the OP_MakeRecord opcode. +** Read the rowid (the last field in the record) and store it in *rowid. +** Return SQLITE_OK if everything works, or an error code otherwise. +** +** pCur might be pointing to text obtained from a corrupt database file. +** So the content cannot be trusted. Do appropriate checks on the content. +*/ +SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ + i64 nCellKey = 0; + int rc; + u32 szHdr; /* Size of the header */ + u32 typeRowid; /* Serial type of the rowid */ + u32 lenRowid; /* Size of the rowid */ + Mem m, v; + + /* Get the size of the index entry. Only indices entries of less + ** than 2GiB are support - anything large must be database corruption. + ** Any corruption is detected in sqlite3BtreeParseCellPtr(), though, so + ** this code can safely assume that nCellKey is 32-bits + */ + assert( sqlite3BtreeCursorIsValid(pCur) ); + nCellKey = sqlite3BtreePayloadSize(pCur); + assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey ); + + /* Read in the complete content of the index entry */ + sqlite3VdbeMemInit(&m, db, 0); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m); + if( rc ){ + return rc; + } + + /* The index entry must begin with a header size */ + getVarint32NR((u8*)m.z, szHdr); + testcase( szHdr==3 ); + testcase( szHdr==m.n ); + testcase( szHdr>0x7fffffff ); + assert( m.n>=0 ); + if( unlikely(szHdr<3 || szHdr>(unsigned)m.n) ){ + goto idx_rowid_corruption; + } + + /* The last field of the index should be an integer - the ROWID. + ** Verify that the last entry really is an integer. */ + getVarint32NR((u8*)&m.z[szHdr-1], typeRowid); + testcase( typeRowid==1 ); + testcase( typeRowid==2 ); + testcase( typeRowid==3 ); + testcase( typeRowid==4 ); + testcase( typeRowid==5 ); + testcase( typeRowid==6 ); + testcase( typeRowid==8 ); + testcase( typeRowid==9 ); + if( unlikely(typeRowid<1 || typeRowid>9 || typeRowid==7) ){ + goto idx_rowid_corruption; + } + lenRowid = sqlite3SmallTypeSizes[typeRowid]; + testcase( (u32)m.n==szHdr+lenRowid ); + if( unlikely((u32)m.neCurType==CURTYPE_BTREE ); + pCur = pC->uc.pCursor; + assert( sqlite3BtreeCursorIsValid(pCur) ); + nCellKey = sqlite3BtreePayloadSize(pCur); + /* nCellKey will always be between 0 and 0xffffffff because of the way + ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */ + if( nCellKey<=0 || nCellKey>0x7fffffff ){ + *res = 0; + return SQLITE_CORRUPT_BKPT; + } + sqlite3VdbeMemInit(&m, db, 0); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m); + if( rc ){ + return rc; + } + *res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, pUnpacked, 0); + sqlite3VdbeMemRelease(&m); + return SQLITE_OK; +} + +/* +** This routine sets the value to be returned by subsequent calls to +** sqlite3_changes() on the database handle 'db'. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *db, int nChange){ + assert( sqlite3_mutex_held(db->mutex) ); + db->nChange = nChange; + db->nTotalChange += nChange; +} + +/* +** Set a flag in the vdbe to update the change counter when it is finalised +** or reset. +*/ +SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe *v){ + v->changeCntOn = 1; +} + +/* +** Mark every prepared statement associated with a database connection +** as expired. +** +** An expired statement means that recompilation of the statement is +** recommend. Statements expire when things happen that make their +** programs obsolete. Removing user-defined functions or collating +** sequences, or changing an authorization function are the types of +** things that make prepared statements obsolete. +** +** If iCode is 1, then expiration is advisory. The statement should +** be reprepared before being restarted, but if it is already running +** it is allowed to run to completion. +** +** Internally, this function just sets the Vdbe.expired flag on all +** prepared statements. The flag is set to 1 for an immediate expiration +** and set to 2 for an advisory expiration. +*/ +SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3 *db, int iCode){ + Vdbe *p; + for(p = db->pVdbe; p; p=p->pNext){ + p->expired = iCode+1; + } +} + +/* +** Return the database associated with the Vdbe. +*/ +SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe *v){ + return v->db; +} + +/* +** Return the SQLITE_PREPARE flags for a Vdbe. +*/ +SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe *v){ + return v->prepFlags; +} + +/* +** Return a pointer to an sqlite3_value structure containing the value bound +** parameter iVar of VM v. Except, if the value is an SQL NULL, return +** 0 instead. Unless it is NULL, apply affinity aff (one of the SQLITE_AFF_* +** constants) to the value before returning it. +** +** The returned value must be freed by the caller using sqlite3ValueFree(). +*/ +SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff){ + assert( iVar>0 ); + if( v ){ + Mem *pMem = &v->aVar[iVar-1]; + assert( (v->db->flags & SQLITE_EnableQPSG)==0 ); + if( 0==(pMem->flags & MEM_Null) ){ + sqlite3_value *pRet = sqlite3ValueNew(v->db); + if( pRet ){ + sqlite3VdbeMemCopy((Mem *)pRet, pMem); + sqlite3ValueApplyAffinity(pRet, aff, SQLITE_UTF8); + } + return pRet; + } + } + return 0; +} + +/* +** Configure SQL variable iVar so that binding a new value to it signals +** to sqlite3_reoptimize() that re-preparing the statement may result +** in a better query plan. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ + assert( iVar>0 ); + assert( (v->db->flags & SQLITE_EnableQPSG)==0 ); + if( iVar>=32 ){ + v->expmask |= 0x80000000; + }else{ + v->expmask |= ((u32)1 << (iVar-1)); + } +} + +/* +** Cause a function to throw an error if it was call from OP_PureFunc +** rather than OP_Function. +** +** OP_PureFunc means that the function must be deterministic, and should +** throw an error if it is given inputs that would make it non-deterministic. +** This routine is invoked by date/time functions that use non-deterministic +** features such as 'now'. +*/ +SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context *pCtx){ + const VdbeOp *pOp; +#ifdef SQLITE_ENABLE_STAT4 + if( pCtx->pVdbe==0 ) return 1; +#endif + pOp = pCtx->pVdbe->aOp + pCtx->iOp; + if( pOp->opcode==OP_PureFunc ){ + const char *zContext; + char *zMsg; + if( pOp->p5 & NC_IsCheck ){ + zContext = "a CHECK constraint"; + }else if( pOp->p5 & NC_GenCol ){ + zContext = "a generated column"; + }else{ + zContext = "an index"; + } + zMsg = sqlite3_mprintf("non-deterministic use of %s() in %s", + pCtx->pFunc->zName, zContext); + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); + return 0; + } + return 1; +} + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored +** in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored +** in memory obtained from sqlite3DbMalloc). +*/ +SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){ + if( pVtab->zErrMsg ){ + sqlite3 *db = p->db; + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg); + sqlite3_free(pVtab->zErrMsg); + pVtab->zErrMsg = 0; + } +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + +/* +** If the second argument is not NULL, release any allocations associated +** with the memory cells in the p->aMem[] array. Also free the UnpackedRecord +** structure itself, using sqlite3DbFree(). +** +** This function is used to free UnpackedRecord structures allocated by +** the vdbeUnpackRecord() function found in vdbeapi.c. +*/ +static void vdbeFreeUnpacked(sqlite3 *db, int nField, UnpackedRecord *p){ + if( p ){ + int i; + for(i=0; iaMem[i]; + if( pMem->zMalloc ) sqlite3VdbeMemRelease(pMem); + } + sqlite3DbFreeNN(db, p); + } +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Invoke the pre-update hook. If this is an UPDATE or DELETE pre-update call, +** then cursor passed as the second argument should point to the row about +** to be update or deleted. If the application calls sqlite3_preupdate_old(), +** the required value will be read from the row the cursor points to. +*/ +SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( + Vdbe *v, /* Vdbe pre-update hook is invoked by */ + VdbeCursor *pCsr, /* Cursor to grab old.* values from */ + int op, /* SQLITE_INSERT, UPDATE or DELETE */ + const char *zDb, /* Database name */ + Table *pTab, /* Modified table */ + i64 iKey1, /* Initial key value */ + int iReg /* Register for new.* record */ +){ + sqlite3 *db = v->db; + i64 iKey2; + PreUpdate preupdate; + const char *zTbl = pTab->zName; + static const u8 fakeSortOrder = 0; + + assert( db->pPreUpdate==0 ); + memset(&preupdate, 0, sizeof(PreUpdate)); + if( HasRowid(pTab)==0 ){ + iKey1 = iKey2 = 0; + preupdate.pPk = sqlite3PrimaryKeyIndex(pTab); + }else{ + if( op==SQLITE_UPDATE ){ + iKey2 = v->aMem[iReg].u.i; + }else{ + iKey2 = iKey1; + } + } + + assert( pCsr->nField==pTab->nCol + || (pCsr->nField==pTab->nCol+1 && op==SQLITE_DELETE && iReg==-1) + ); + + preupdate.v = v; + preupdate.pCsr = pCsr; + preupdate.op = op; + preupdate.iNewReg = iReg; + preupdate.keyinfo.db = db; + preupdate.keyinfo.enc = ENC(db); + preupdate.keyinfo.nKeyField = pTab->nCol; + preupdate.keyinfo.aSortFlags = (u8*)&fakeSortOrder; + preupdate.iKey1 = iKey1; + preupdate.iKey2 = iKey2; + preupdate.pTab = pTab; + + db->pPreUpdate = &preupdate; + db->xPreUpdateCallback(db->pPreUpdateArg, db, op, zDb, zTbl, iKey1, iKey2); + db->pPreUpdate = 0; + sqlite3DbFree(db, preupdate.aRecord); + vdbeFreeUnpacked(db, preupdate.keyinfo.nKeyField+1, preupdate.pUnpacked); + vdbeFreeUnpacked(db, preupdate.keyinfo.nKeyField+1, preupdate.pNewUnpacked); + if( preupdate.aNew ){ + int i; + for(i=0; inField; i++){ + sqlite3VdbeMemRelease(&preupdate.aNew[i]); + } + sqlite3DbFreeNN(db, preupdate.aNew); + } +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +/************** End of vdbeaux.c *********************************************/ +/************** Begin file vdbeapi.c *****************************************/ +/* +** 2004 May 26 +** +** 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 code use to implement APIs that are part of the +** VDBE. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Return TRUE (non-zero) of the statement supplied as an argument needs +** to be recompiled. A statement needs to be recompiled whenever the +** execution environment changes in a way that would alter the program +** that sqlite3_prepare() generates. For example, if new functions or +** collating sequences are registered or if an authorizer function is +** added or changed. +*/ +SQLITE_API int sqlite3_expired(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe*)pStmt; + return p==0 || p->expired; +} +#endif + +/* +** Check on a Vdbe to make sure it has not been finalized. Log +** an error and return true if it has been finalized (or is otherwise +** invalid). Return false if it is ok. +*/ +static int vdbeSafety(Vdbe *p){ + if( p->db==0 ){ + sqlite3_log(SQLITE_MISUSE, "API called with finalized prepared statement"); + return 1; + }else{ + return 0; + } +} +static int vdbeSafetyNotNull(Vdbe *p){ + if( p==0 ){ + sqlite3_log(SQLITE_MISUSE, "API called with NULL prepared statement"); + return 1; + }else{ + return vdbeSafety(p); + } +} + +#ifndef SQLITE_OMIT_TRACE +/* +** Invoke the profile callback. This routine is only called if we already +** know that the profile callback is defined and needs to be invoked. +*/ +static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ + sqlite3_int64 iNow; + sqlite3_int64 iElapse; + assert( p->startTime>0 ); + assert( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 ); + assert( db->init.busy==0 ); + assert( p->zSql!=0 ); + sqlite3OsCurrentTimeInt64(db->pVfs, &iNow); + iElapse = (iNow - p->startTime)*1000000; +#ifndef SQLITE_OMIT_DEPRECATED + if( db->xProfile ){ + db->xProfile(db->pProfileArg, p->zSql, iElapse); + } +#endif + if( db->mTrace & SQLITE_TRACE_PROFILE ){ + db->xTrace(SQLITE_TRACE_PROFILE, db->pTraceArg, p, (void*)&iElapse); + } + p->startTime = 0; +} +/* +** The checkProfileCallback(DB,P) macro checks to see if a profile callback +** is needed, and it invokes the callback if it is needed. +*/ +# define checkProfileCallback(DB,P) \ + if( ((P)->startTime)>0 ){ invokeProfileCallback(DB,P); } +#else +# define checkProfileCallback(DB,P) /*no-op*/ +#endif + +/* +** The following routine destroys a virtual machine that is created by +** the sqlite3_compile() routine. The integer returned is an SQLITE_ +** success/failure code that describes the result of executing the virtual +** machine. +** +** This routine sets the error code and string returned by +** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16(). +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt){ + int rc; + if( pStmt==0 ){ + /* IMPLEMENTATION-OF: R-57228-12904 Invoking sqlite3_finalize() on a NULL + ** pointer is a harmless no-op. */ + rc = SQLITE_OK; + }else{ + Vdbe *v = (Vdbe*)pStmt; + sqlite3 *db = v->db; + if( vdbeSafety(v) ) return SQLITE_MISUSE_BKPT; + sqlite3_mutex_enter(db->mutex); + checkProfileCallback(db, v); + rc = sqlite3VdbeFinalize(v); + rc = sqlite3ApiExit(db, rc); + sqlite3LeaveMutexAndCloseZombie(db); + } + return rc; +} + +/* +** Terminate the current execution of an SQL statement and reset it +** back to its starting state so that it can be reused. A success code from +** the prior execution is returned. +** +** This routine sets the error code and string returned by +** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16(). +*/ +SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt){ + int rc; + if( pStmt==0 ){ + rc = SQLITE_OK; + }else{ + Vdbe *v = (Vdbe*)pStmt; + sqlite3 *db = v->db; + sqlite3_mutex_enter(db->mutex); + checkProfileCallback(db, v); + rc = sqlite3VdbeReset(v); + sqlite3VdbeRewind(v); + assert( (rc & (db->errMask))==rc ); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + } + return rc; +} + +/* +** Set all the parameters in the compiled SQL statement to NULL. +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt *pStmt){ + int i; + int rc = SQLITE_OK; + Vdbe *p = (Vdbe*)pStmt; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = ((Vdbe*)pStmt)->db->mutex; +#endif + sqlite3_mutex_enter(mutex); + for(i=0; inVar; i++){ + sqlite3VdbeMemRelease(&p->aVar[i]); + p->aVar[i].flags = MEM_Null; + } + assert( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || p->expmask==0 ); + if( p->expmask ){ + p->expired = 1; + } + sqlite3_mutex_leave(mutex); + return rc; +} + + +/**************************** sqlite3_value_ ******************************* +** The following routines extract information from a Mem or sqlite3_value +** structure. +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value *pVal){ + Mem *p = (Mem*)pVal; + if( p->flags & (MEM_Blob|MEM_Str) ){ + if( ExpandBlob(p)!=SQLITE_OK ){ + assert( p->flags==MEM_Null && p->z==0 ); + return 0; + } + p->flags |= MEM_Blob; + return p->n ? p->z : 0; + }else{ + return sqlite3_value_text(pVal); + } +} +SQLITE_API int sqlite3_value_bytes(sqlite3_value *pVal){ + return sqlite3ValueBytes(pVal, SQLITE_UTF8); +} +SQLITE_API int sqlite3_value_bytes16(sqlite3_value *pVal){ + return sqlite3ValueBytes(pVal, SQLITE_UTF16NATIVE); +} +SQLITE_API double sqlite3_value_double(sqlite3_value *pVal){ + return sqlite3VdbeRealValue((Mem*)pVal); +} +SQLITE_API int sqlite3_value_int(sqlite3_value *pVal){ + return (int)sqlite3VdbeIntValue((Mem*)pVal); +} +SQLITE_API sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){ + return sqlite3VdbeIntValue((Mem*)pVal); +} +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value *pVal){ + Mem *pMem = (Mem*)pVal; + return ((pMem->flags & MEM_Subtype) ? pMem->eSubtype : 0); +} +SQLITE_API void *sqlite3_value_pointer(sqlite3_value *pVal, const char *zPType){ + Mem *p = (Mem*)pVal; + if( (p->flags&(MEM_TypeMask|MEM_Term|MEM_Subtype)) == + (MEM_Null|MEM_Term|MEM_Subtype) + && zPType!=0 + && p->eSubtype=='p' + && strcmp(p->u.zPType, zPType)==0 + ){ + return (void*)p->z; + }else{ + return 0; + } +} +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value *pVal){ + return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_value_text16(sqlite3_value* pVal){ + return sqlite3ValueText(pVal, SQLITE_UTF16NATIVE); +} +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value *pVal){ + return sqlite3ValueText(pVal, SQLITE_UTF16BE); +} +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value *pVal){ + return sqlite3ValueText(pVal, SQLITE_UTF16LE); +} +#endif /* SQLITE_OMIT_UTF16 */ +/* EVIDENCE-OF: R-12793-43283 Every value in SQLite has one of five +** fundamental datatypes: 64-bit signed integer 64-bit IEEE floating +** point number string BLOB NULL +*/ +SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){ + static const u8 aType[] = { + SQLITE_BLOB, /* 0x00 (not possible) */ + SQLITE_NULL, /* 0x01 NULL */ + SQLITE_TEXT, /* 0x02 TEXT */ + SQLITE_NULL, /* 0x03 (not possible) */ + SQLITE_INTEGER, /* 0x04 INTEGER */ + SQLITE_NULL, /* 0x05 (not possible) */ + SQLITE_INTEGER, /* 0x06 INTEGER + TEXT */ + SQLITE_NULL, /* 0x07 (not possible) */ + SQLITE_FLOAT, /* 0x08 FLOAT */ + SQLITE_NULL, /* 0x09 (not possible) */ + SQLITE_FLOAT, /* 0x0a FLOAT + TEXT */ + SQLITE_NULL, /* 0x0b (not possible) */ + SQLITE_INTEGER, /* 0x0c (not possible) */ + SQLITE_NULL, /* 0x0d (not possible) */ + SQLITE_INTEGER, /* 0x0e (not possible) */ + SQLITE_NULL, /* 0x0f (not possible) */ + SQLITE_BLOB, /* 0x10 BLOB */ + SQLITE_NULL, /* 0x11 (not possible) */ + SQLITE_TEXT, /* 0x12 (not possible) */ + SQLITE_NULL, /* 0x13 (not possible) */ + SQLITE_INTEGER, /* 0x14 INTEGER + BLOB */ + SQLITE_NULL, /* 0x15 (not possible) */ + SQLITE_INTEGER, /* 0x16 (not possible) */ + SQLITE_NULL, /* 0x17 (not possible) */ + SQLITE_FLOAT, /* 0x18 FLOAT + BLOB */ + SQLITE_NULL, /* 0x19 (not possible) */ + SQLITE_FLOAT, /* 0x1a (not possible) */ + SQLITE_NULL, /* 0x1b (not possible) */ + SQLITE_INTEGER, /* 0x1c (not possible) */ + SQLITE_NULL, /* 0x1d (not possible) */ + SQLITE_INTEGER, /* 0x1e (not possible) */ + SQLITE_NULL, /* 0x1f (not possible) */ + SQLITE_FLOAT, /* 0x20 INTREAL */ + SQLITE_NULL, /* 0x21 (not possible) */ + SQLITE_TEXT, /* 0x22 INTREAL + TEXT */ + SQLITE_NULL, /* 0x23 (not possible) */ + SQLITE_FLOAT, /* 0x24 (not possible) */ + SQLITE_NULL, /* 0x25 (not possible) */ + SQLITE_FLOAT, /* 0x26 (not possible) */ + SQLITE_NULL, /* 0x27 (not possible) */ + SQLITE_FLOAT, /* 0x28 (not possible) */ + SQLITE_NULL, /* 0x29 (not possible) */ + SQLITE_FLOAT, /* 0x2a (not possible) */ + SQLITE_NULL, /* 0x2b (not possible) */ + SQLITE_FLOAT, /* 0x2c (not possible) */ + SQLITE_NULL, /* 0x2d (not possible) */ + SQLITE_FLOAT, /* 0x2e (not possible) */ + SQLITE_NULL, /* 0x2f (not possible) */ + SQLITE_BLOB, /* 0x30 (not possible) */ + SQLITE_NULL, /* 0x31 (not possible) */ + SQLITE_TEXT, /* 0x32 (not possible) */ + SQLITE_NULL, /* 0x33 (not possible) */ + SQLITE_FLOAT, /* 0x34 (not possible) */ + SQLITE_NULL, /* 0x35 (not possible) */ + SQLITE_FLOAT, /* 0x36 (not possible) */ + SQLITE_NULL, /* 0x37 (not possible) */ + SQLITE_FLOAT, /* 0x38 (not possible) */ + SQLITE_NULL, /* 0x39 (not possible) */ + SQLITE_FLOAT, /* 0x3a (not possible) */ + SQLITE_NULL, /* 0x3b (not possible) */ + SQLITE_FLOAT, /* 0x3c (not possible) */ + SQLITE_NULL, /* 0x3d (not possible) */ + SQLITE_FLOAT, /* 0x3e (not possible) */ + SQLITE_NULL, /* 0x3f (not possible) */ + }; +#ifdef SQLITE_DEBUG + { + int eType = SQLITE_BLOB; + if( pVal->flags & MEM_Null ){ + eType = SQLITE_NULL; + }else if( pVal->flags & (MEM_Real|MEM_IntReal) ){ + eType = SQLITE_FLOAT; + }else if( pVal->flags & MEM_Int ){ + eType = SQLITE_INTEGER; + }else if( pVal->flags & MEM_Str ){ + eType = SQLITE_TEXT; + } + assert( eType == aType[pVal->flags&MEM_AffMask] ); + } +#endif + return aType[pVal->flags&MEM_AffMask]; +} + +/* Return true if a parameter to xUpdate represents an unchanged column */ +SQLITE_API int sqlite3_value_nochange(sqlite3_value *pVal){ + return (pVal->flags&(MEM_Null|MEM_Zero))==(MEM_Null|MEM_Zero); +} + +/* Return true if a parameter value originated from an sqlite3_bind() */ +SQLITE_API int sqlite3_value_frombind(sqlite3_value *pVal){ + return (pVal->flags&MEM_FromBind)!=0; +} + +/* Make a copy of an sqlite3_value object +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ + sqlite3_value *pNew; + if( pOrig==0 ) return 0; + pNew = sqlite3_malloc( sizeof(*pNew) ); + if( pNew==0 ) return 0; + memset(pNew, 0, sizeof(*pNew)); + memcpy(pNew, pOrig, MEMCELLSIZE); + pNew->flags &= ~MEM_Dyn; + pNew->db = 0; + if( pNew->flags&(MEM_Str|MEM_Blob) ){ + pNew->flags &= ~(MEM_Static|MEM_Dyn); + pNew->flags |= MEM_Ephem; + if( sqlite3VdbeMemMakeWriteable(pNew)!=SQLITE_OK ){ + sqlite3ValueFree(pNew); + pNew = 0; + } + } + return pNew; +} + +/* Destroy an sqlite3_value object previously obtained from +** sqlite3_value_dup(). +*/ +SQLITE_API void sqlite3_value_free(sqlite3_value *pOld){ + sqlite3ValueFree(pOld); +} + + +/**************************** sqlite3_result_ ******************************* +** The following routines are used by user-defined functions to specify +** the function result. +** +** The setStrOrError() function calls sqlite3VdbeMemSetStr() to store the +** result as a string or blob but if the string or blob is too large, it +** then sets the error code to SQLITE_TOOBIG +** +** The invokeValueDestructor(P,X) routine invokes destructor function X() +** on value P is not going to be used and need to be destroyed. +*/ +static void setResultStrOrError( + sqlite3_context *pCtx, /* Function context */ + const char *z, /* String pointer */ + int n, /* Bytes in string, or negative */ + u8 enc, /* Encoding of z. 0 for BLOBs */ + void (*xDel)(void*) /* Destructor function */ +){ + if( sqlite3VdbeMemSetStr(pCtx->pOut, z, n, enc, xDel)==SQLITE_TOOBIG ){ + sqlite3_result_error_toobig(pCtx); + } +} +static int invokeValueDestructor( + const void *p, /* Value to destroy */ + void (*xDel)(void*), /* The destructor */ + sqlite3_context *pCtx /* Set a SQLITE_TOOBIG error if no NULL */ +){ + assert( xDel!=SQLITE_DYNAMIC ); + if( xDel==0 ){ + /* noop */ + }else if( xDel==SQLITE_TRANSIENT ){ + /* noop */ + }else{ + xDel((void*)p); + } + if( pCtx ) sqlite3_result_error_toobig(pCtx); + return SQLITE_TOOBIG; +} +SQLITE_API void sqlite3_result_blob( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( n>=0 ); + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, 0, xDel); +} +SQLITE_API void sqlite3_result_blob64( + sqlite3_context *pCtx, + const void *z, + sqlite3_uint64 n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + assert( xDel!=SQLITE_DYNAMIC ); + if( n>0x7fffffff ){ + (void)invokeValueDestructor(z, xDel, pCtx); + }else{ + setResultStrOrError(pCtx, z, (int)n, 0, xDel); + } +} +SQLITE_API void sqlite3_result_double(sqlite3_context *pCtx, double rVal){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetDouble(pCtx->pOut, rVal); +} +SQLITE_API void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + pCtx->isError = SQLITE_ERROR; + sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF8, SQLITE_TRANSIENT); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + pCtx->isError = SQLITE_ERROR; + sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT); +} +#endif +SQLITE_API void sqlite3_result_int(sqlite3_context *pCtx, int iVal){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetInt64(pCtx->pOut, (i64)iVal); +} +SQLITE_API void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetInt64(pCtx->pOut, iVal); +} +SQLITE_API void sqlite3_result_null(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetNull(pCtx->pOut); +} +SQLITE_API void sqlite3_result_pointer( + sqlite3_context *pCtx, + void *pPtr, + const char *zPType, + void (*xDestructor)(void*) +){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + sqlite3VdbeMemRelease(pOut); + pOut->flags = MEM_Null; + sqlite3VdbeMemSetPointer(pOut, pPtr, zPType, xDestructor); +} +SQLITE_API void sqlite3_result_subtype(sqlite3_context *pCtx, unsigned int eSubtype){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + pOut->eSubtype = eSubtype & 0xff; + pOut->flags |= MEM_Subtype; +} +SQLITE_API void sqlite3_result_text( + sqlite3_context *pCtx, + const char *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF8, xDel); +} +SQLITE_API void sqlite3_result_text64( + sqlite3_context *pCtx, + const char *z, + sqlite3_uint64 n, + void (*xDel)(void *), + unsigned char enc +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + assert( xDel!=SQLITE_DYNAMIC ); + if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE; + if( n>0x7fffffff ){ + (void)invokeValueDestructor(z, xDel, pCtx); + }else{ + setResultStrOrError(pCtx, z, (int)n, enc, xDel); + } +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API void sqlite3_result_text16( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF16NATIVE, xDel); +} +SQLITE_API void sqlite3_result_text16be( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF16BE, xDel); +} +SQLITE_API void sqlite3_result_text16le( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF16LE, xDel); +} +#endif /* SQLITE_OMIT_UTF16 */ +SQLITE_API void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemCopy(pCtx->pOut, pValue); +} +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetZeroBlob(pCtx->pOut, n); +} +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + if( n>(u64)pOut->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + return SQLITE_TOOBIG; + } + sqlite3VdbeMemSetZeroBlob(pCtx->pOut, (int)n); + return SQLITE_OK; +} +SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ + pCtx->isError = errCode ? errCode : -1; +#ifdef SQLITE_DEBUG + if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode; +#endif + if( pCtx->pOut->flags & MEM_Null ){ + sqlite3VdbeMemSetStr(pCtx->pOut, sqlite3ErrStr(errCode), -1, + SQLITE_UTF8, SQLITE_STATIC); + } +} + +/* Force an SQLITE_TOOBIG error. */ +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + pCtx->isError = SQLITE_TOOBIG; + sqlite3VdbeMemSetStr(pCtx->pOut, "string or blob too big", -1, + SQLITE_UTF8, SQLITE_STATIC); +} + +/* An SQLITE_NOMEM error. */ +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetNull(pCtx->pOut); + pCtx->isError = SQLITE_NOMEM_BKPT; + sqlite3OomFault(pCtx->pOut->db); +} + +#ifndef SQLITE_UNTESTABLE +/* Force the INT64 value currently stored as the result to be +** a MEM_IntReal value. See the SQLITE_TESTCTRL_RESULT_INTREAL +** test-control. +*/ +SQLITE_PRIVATE void sqlite3ResultIntReal(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + if( pCtx->pOut->flags & MEM_Int ){ + pCtx->pOut->flags &= ~MEM_Int; + pCtx->pOut->flags |= MEM_IntReal; + } +} +#endif + + +/* +** This function is called after a transaction has been committed. It +** invokes callbacks registered with sqlite3_wal_hook() as required. +*/ +static int doWalCallbacks(sqlite3 *db){ + int rc = SQLITE_OK; +#ifndef SQLITE_OMIT_WAL + int i; + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + int nEntry; + sqlite3BtreeEnter(pBt); + nEntry = sqlite3PagerWalCallback(sqlite3BtreePager(pBt)); + sqlite3BtreeLeave(pBt); + if( nEntry>0 && db->xWalCallback && rc==SQLITE_OK ){ + rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zDbSName, nEntry); + } + } + } +#endif + return rc; +} + + +/* +** Execute the statement pStmt, either until a row of data is ready, the +** statement is completely executed or an error occurs. +** +** This routine implements the bulk of the logic behind the sqlite_step() +** API. The only thing omitted is the automatic recompile if a +** schema change has occurred. That detail is handled by the +** outer sqlite3_step() wrapper procedure. +*/ +static int sqlite3Step(Vdbe *p){ + sqlite3 *db; + int rc; + + assert(p); + if( p->magic!=VDBE_MAGIC_RUN ){ + /* We used to require that sqlite3_reset() be called before retrying + ** sqlite3_step() after any error or after SQLITE_DONE. But beginning + ** with version 3.7.0, we changed this so that sqlite3_reset() would + ** be called automatically instead of throwing the SQLITE_MISUSE error. + ** This "automatic-reset" change is not technically an incompatibility, + ** since any application that receives an SQLITE_MISUSE is broken by + ** definition. + ** + ** Nevertheless, some published applications that were originally written + ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE + ** returns, and those were broken by the automatic-reset change. As a + ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the + ** legacy behavior of returning SQLITE_MISUSE for cases where the + ** previous sqlite3_step() returned something other than a SQLITE_LOCKED + ** or SQLITE_BUSY error. + */ +#ifdef SQLITE_OMIT_AUTORESET + if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){ + sqlite3_reset((sqlite3_stmt*)p); + }else{ + return SQLITE_MISUSE_BKPT; + } +#else + sqlite3_reset((sqlite3_stmt*)p); +#endif + } + + /* Check that malloc() has not failed. If it has, return early. */ + db = p->db; + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; + } + + if( p->pc<0 && p->expired ){ + p->rc = SQLITE_SCHEMA; + rc = SQLITE_ERROR; + goto end_of_step; + } + if( p->pc<0 ){ + /* If there are no other statements currently running, then + ** reset the interrupt flag. This prevents a call to sqlite3_interrupt + ** from interrupting a statement that has not yet started. + */ + if( db->nVdbeActive==0 ){ + AtomicStore(&db->u1.isInterrupted, 0); + } + + assert( db->nVdbeWrite>0 || db->autoCommit==0 + || (db->nDeferredCons==0 && db->nDeferredImmCons==0) + ); + +#ifndef SQLITE_OMIT_TRACE + if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 + && !db->init.busy && p->zSql ){ + sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); + }else{ + assert( p->startTime==0 ); + } +#endif + + db->nVdbeActive++; + if( p->readOnly==0 ) db->nVdbeWrite++; + if( p->bIsReader ) db->nVdbeRead++; + p->pc = 0; + } +#ifdef SQLITE_DEBUG + p->rcApp = SQLITE_OK; +#endif +#ifndef SQLITE_OMIT_EXPLAIN + if( p->explain ){ + rc = sqlite3VdbeList(p); + }else +#endif /* SQLITE_OMIT_EXPLAIN */ + { + db->nVdbeExec++; + rc = sqlite3VdbeExec(p); + db->nVdbeExec--; + } + + if( rc!=SQLITE_ROW ){ +#ifndef SQLITE_OMIT_TRACE + /* If the statement completed successfully, invoke the profile callback */ + checkProfileCallback(db, p); +#endif + + if( rc==SQLITE_DONE && db->autoCommit ){ + assert( p->rc==SQLITE_OK ); + p->rc = doWalCallbacks(db); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + } + } + } + + db->errCode = rc; + if( SQLITE_NOMEM==sqlite3ApiExit(p->db, p->rc) ){ + p->rc = SQLITE_NOMEM_BKPT; + } +end_of_step: + /* At this point local variable rc holds the value that should be + ** returned if this statement was compiled using the legacy + ** sqlite3_prepare() interface. According to the docs, this can only + ** be one of the values in the first assert() below. Variable p->rc + ** contains the value that would be returned if sqlite3_finalize() + ** were called on statement p. + */ + assert( rc==SQLITE_ROW || rc==SQLITE_DONE || rc==SQLITE_ERROR + || (rc&0xff)==SQLITE_BUSY || rc==SQLITE_MISUSE + ); + assert( (p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE) || p->rc==p->rcApp ); + if( rc!=SQLITE_ROW + && rc!=SQLITE_DONE + && (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 + ){ + /* If this statement was prepared using saved SQL and an + ** error has occurred, then return the error code in p->rc to the + ** caller. Set the error code in the database handle to the same value. + */ + rc = sqlite3VdbeTransferError(p); + } + return (rc&db->errMask); +} + +/* +** This is the top-level implementation of sqlite3_step(). Call +** sqlite3Step() to do most of the work. If a schema error occurs, +** call sqlite3Reprepare() and try again. +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ + int rc = SQLITE_OK; /* Result from sqlite3Step() */ + Vdbe *v = (Vdbe*)pStmt; /* the prepared statement */ + int cnt = 0; /* Counter to prevent infinite loop of reprepares */ + sqlite3 *db; /* The database connection */ + + if( vdbeSafetyNotNull(v) ){ + return SQLITE_MISUSE_BKPT; + } + db = v->db; + sqlite3_mutex_enter(db->mutex); + v->doingRerun = 0; + while( (rc = sqlite3Step(v))==SQLITE_SCHEMA + && cnt++ < SQLITE_MAX_SCHEMA_RETRY ){ + int savedPc = v->pc; + rc = sqlite3Reprepare(v); + if( rc!=SQLITE_OK ){ + /* This case occurs after failing to recompile an sql statement. + ** The error message from the SQL compiler has already been loaded + ** into the database handle. This block copies the error message + ** from the database handle into the statement and sets the statement + ** program counter to 0 to ensure that when the statement is + ** finalized or reset the parser error message is available via + ** sqlite3_errmsg() and sqlite3_errcode(). + */ + const char *zErr = (const char *)sqlite3_value_text(db->pErr); + sqlite3DbFree(db, v->zErrMsg); + if( !db->mallocFailed ){ + v->zErrMsg = sqlite3DbStrDup(db, zErr); + v->rc = rc = sqlite3ApiExit(db, rc); + } else { + v->zErrMsg = 0; + v->rc = rc = SQLITE_NOMEM_BKPT; + } + break; + } + sqlite3_reset(pStmt); + if( savedPc>=0 ) v->doingRerun = 1; + assert( v->expired==0 ); + } + sqlite3_mutex_leave(db->mutex); + return rc; +} + + +/* +** Extract the user data from a sqlite3_context structure and return a +** pointer to it. +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context *p){ + assert( p && p->pFunc ); + return p->pFunc->pUserData; +} + +/* +** Extract the user data from a sqlite3_context structure and return a +** pointer to it. +** +** IMPLEMENTATION-OF: R-46798-50301 The sqlite3_context_db_handle() interface +** returns a copy of the pointer to the database connection (the 1st +** parameter) of the sqlite3_create_function() and +** sqlite3_create_function16() routines that originally registered the +** application defined function. +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){ + assert( p && p->pOut ); + return p->pOut->db; +} + +/* +** If this routine is invoked from within an xColumn method of a virtual +** table, then it returns true if and only if the the call is during an +** UPDATE operation and the value of the column will not be modified +** by the UPDATE. +** +** If this routine is called from any context other than within the +** xColumn method of a virtual table, then the return value is meaningless +** and arbitrary. +** +** Virtual table implements might use this routine to optimize their +** performance by substituting a NULL result, or some other light-weight +** value, as a signal to the xUpdate routine that the column is unchanged. +*/ +SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){ + assert( p ); + return sqlite3_value_nochange(p->pOut); +} + +/* +** Return the current time for a statement. If the current time +** is requested more than once within the same run of a single prepared +** statement, the exact same time is returned for each invocation regardless +** of the amount of time that elapses between invocations. In other words, +** the time returned is always the time of the first call. +*/ +SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){ + int rc; +#ifndef SQLITE_ENABLE_STAT4 + sqlite3_int64 *piTime = &p->pVdbe->iCurrentTime; + assert( p->pVdbe!=0 ); +#else + sqlite3_int64 iTime = 0; + sqlite3_int64 *piTime = p->pVdbe!=0 ? &p->pVdbe->iCurrentTime : &iTime; +#endif + if( *piTime==0 ){ + rc = sqlite3OsCurrentTimeInt64(p->pOut->db->pVfs, piTime); + if( rc ) *piTime = 0; + } + return *piTime; +} + +/* +** Create a new aggregate context for p and return a pointer to +** its pMem->z element. +*/ +static SQLITE_NOINLINE void *createAggContext(sqlite3_context *p, int nByte){ + Mem *pMem = p->pMem; + assert( (pMem->flags & MEM_Agg)==0 ); + if( nByte<=0 ){ + sqlite3VdbeMemSetNull(pMem); + pMem->z = 0; + }else{ + sqlite3VdbeMemClearAndResize(pMem, nByte); + pMem->flags = MEM_Agg; + pMem->u.pDef = p->pFunc; + if( pMem->z ){ + memset(pMem->z, 0, nByte); + } + } + return (void*)pMem->z; +} + +/* +** Allocate or return the aggregate context for a user function. A new +** context is allocated on the first call. Subsequent calls return the +** same context that was returned on prior calls. +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ + assert( p && p->pFunc && p->pFunc->xFinalize ); + assert( sqlite3_mutex_held(p->pOut->db->mutex) ); + testcase( nByte<0 ); + if( (p->pMem->flags & MEM_Agg)==0 ){ + return createAggContext(p, nByte); + }else{ + return (void*)p->pMem->z; + } +} + +/* +** Return the auxiliary data pointer, if any, for the iArg'th argument to +** the user-function defined by pCtx. +** +** The left-most argument is 0. +** +** Undocumented behavior: If iArg is negative then access a cache of +** auxiliary data pointers that is available to all functions within a +** single prepared statement. The iArg values must match. +*/ +SQLITE_API void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ + AuxData *pAuxData; + + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); +#if SQLITE_ENABLE_STAT4 + if( pCtx->pVdbe==0 ) return 0; +#else + assert( pCtx->pVdbe!=0 ); +#endif + for(pAuxData=pCtx->pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNextAux){ + if( pAuxData->iAuxArg==iArg && (pAuxData->iAuxOp==pCtx->iOp || iArg<0) ){ + return pAuxData->pAux; + } + } + return 0; +} + +/* +** Set the auxiliary data pointer and delete function, for the iArg'th +** argument to the user-function defined by pCtx. Any previous value is +** deleted by calling the delete function specified when it was set. +** +** The left-most argument is 0. +** +** Undocumented behavior: If iArg is negative then make the data available +** to all functions within the current prepared statement using iArg as an +** access code. +*/ +SQLITE_API void sqlite3_set_auxdata( + sqlite3_context *pCtx, + int iArg, + void *pAux, + void (*xDelete)(void*) +){ + AuxData *pAuxData; + Vdbe *pVdbe = pCtx->pVdbe; + + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); +#ifdef SQLITE_ENABLE_STAT4 + if( pVdbe==0 ) goto failed; +#else + assert( pVdbe!=0 ); +#endif + + for(pAuxData=pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNextAux){ + if( pAuxData->iAuxArg==iArg && (pAuxData->iAuxOp==pCtx->iOp || iArg<0) ){ + break; + } + } + if( pAuxData==0 ){ + pAuxData = sqlite3DbMallocZero(pVdbe->db, sizeof(AuxData)); + if( !pAuxData ) goto failed; + pAuxData->iAuxOp = pCtx->iOp; + pAuxData->iAuxArg = iArg; + pAuxData->pNextAux = pVdbe->pAuxData; + pVdbe->pAuxData = pAuxData; + if( pCtx->isError==0 ) pCtx->isError = -1; + }else if( pAuxData->xDeleteAux ){ + pAuxData->xDeleteAux(pAuxData->pAux); + } + + pAuxData->pAux = pAux; + pAuxData->xDeleteAux = xDelete; + return; + +failed: + if( xDelete ){ + xDelete(pAux); + } +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Return the number of times the Step function of an aggregate has been +** called. +** +** This function is deprecated. Do not use it for new code. It is +** provide only to avoid breaking legacy code. New aggregate function +** implementations should keep their own counts within their aggregate +** context. +*/ +SQLITE_API int sqlite3_aggregate_count(sqlite3_context *p){ + assert( p && p->pMem && p->pFunc && p->pFunc->xFinalize ); + return p->pMem->n; +} +#endif + +/* +** Return the number of columns in the result set for the statement pStmt. +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt){ + Vdbe *pVm = (Vdbe *)pStmt; + return pVm ? pVm->nResColumn : 0; +} + +/* +** Return the number of values available from the current row of the +** currently executing statement pStmt. +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt){ + Vdbe *pVm = (Vdbe *)pStmt; + if( pVm==0 || pVm->pResultSet==0 ) return 0; + return pVm->nResColumn; +} + +/* +** Return a pointer to static memory containing an SQL NULL value. +*/ +static const Mem *columnNullValue(void){ + /* Even though the Mem structure contains an element + ** of type i64, on certain architectures (x86) with certain compiler + ** switches (-Os), gcc may align this Mem object on a 4-byte boundary + ** instead of an 8-byte one. This all works fine, except that when + ** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s + ** that a Mem structure is located on an 8-byte boundary. To prevent + ** these assert()s from failing, when building with SQLITE_DEBUG defined + ** using gcc, we force nullMem to be 8-byte aligned using the magical + ** __attribute__((aligned(8))) macro. */ + static const Mem nullMem +#if defined(SQLITE_DEBUG) && defined(__GNUC__) + __attribute__((aligned(8))) +#endif + = { + /* .u = */ {0}, + /* .flags = */ (u16)MEM_Null, + /* .enc = */ (u8)0, + /* .eSubtype = */ (u8)0, + /* .n = */ (int)0, + /* .z = */ (char*)0, + /* .zMalloc = */ (char*)0, + /* .szMalloc = */ (int)0, + /* .uTemp = */ (u32)0, + /* .db = */ (sqlite3*)0, + /* .xDel = */ (void(*)(void*))0, +#ifdef SQLITE_DEBUG + /* .pScopyFrom = */ (Mem*)0, + /* .mScopyFlags= */ 0, +#endif + }; + return &nullMem; +} + +/* +** Check to see if column iCol of the given statement is valid. If +** it is, return a pointer to the Mem for the value of that column. +** If iCol is not valid, return a pointer to a Mem which has a value +** of NULL. +*/ +static Mem *columnMem(sqlite3_stmt *pStmt, int i){ + Vdbe *pVm; + Mem *pOut; + + pVm = (Vdbe *)pStmt; + if( pVm==0 ) return (Mem*)columnNullValue(); + assert( pVm->db ); + sqlite3_mutex_enter(pVm->db->mutex); + if( pVm->pResultSet!=0 && inResColumn && i>=0 ){ + pOut = &pVm->pResultSet[i]; + }else{ + sqlite3Error(pVm->db, SQLITE_RANGE); + pOut = (Mem*)columnNullValue(); + } + return pOut; +} + +/* +** This function is called after invoking an sqlite3_value_XXX function on a +** column value (i.e. a value returned by evaluating an SQL expression in the +** select list of a SELECT statement) that may cause a malloc() failure. If +** malloc() has failed, the threads mallocFailed flag is cleared and the result +** code of statement pStmt set to SQLITE_NOMEM. +** +** Specifically, this is called from within: +** +** sqlite3_column_int() +** sqlite3_column_int64() +** sqlite3_column_text() +** sqlite3_column_text16() +** sqlite3_column_real() +** sqlite3_column_bytes() +** sqlite3_column_bytes16() +** sqiite3_column_blob() +*/ +static void columnMallocFailure(sqlite3_stmt *pStmt) +{ + /* If malloc() failed during an encoding conversion within an + ** sqlite3_column_XXX API, then set the return code of the statement to + ** SQLITE_NOMEM. The next call to _step() (if any) will return SQLITE_ERROR + ** and _finalize() will return NOMEM. + */ + Vdbe *p = (Vdbe *)pStmt; + if( p ){ + assert( p->db!=0 ); + assert( sqlite3_mutex_held(p->db->mutex) ); + p->rc = sqlite3ApiExit(p->db, p->rc); + sqlite3_mutex_leave(p->db->mutex); + } +} + +/**************************** sqlite3_column_ ******************************* +** The following routines are used to access elements of the current row +** in the result set. +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){ + const void *val; + val = sqlite3_value_blob( columnMem(pStmt,i) ); + /* Even though there is no encoding conversion, value_blob() might + ** need to call malloc() to expand the result of a zeroblob() + ** expression. + */ + columnMallocFailure(pStmt); + return val; +} +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){ + int val = sqlite3_value_bytes( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){ + int val = sqlite3_value_bytes16( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API double sqlite3_column_double(sqlite3_stmt *pStmt, int i){ + double val = sqlite3_value_double( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API int sqlite3_column_int(sqlite3_stmt *pStmt, int i){ + int val = sqlite3_value_int( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){ + sqlite_int64 val = sqlite3_value_int64( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){ + const unsigned char *val = sqlite3_value_text( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt *pStmt, int i){ + Mem *pOut = columnMem(pStmt, i); + if( pOut->flags&MEM_Static ){ + pOut->flags &= ~MEM_Static; + pOut->flags |= MEM_Ephem; + } + columnMallocFailure(pStmt); + return (sqlite3_value *)pOut; +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){ + const void *val = sqlite3_value_text16( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +#endif /* SQLITE_OMIT_UTF16 */ +SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ + int iType = sqlite3_value_type( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return iType; +} + +/* +** Convert the N-th element of pStmt->pColName[] into a string using +** xFunc() then return that string. If N is out of range, return 0. +** +** There are up to 5 names for each column. useType determines which +** name is returned. Here are the names: +** +** 0 The column name as it should be displayed for output +** 1 The datatype name for the column +** 2 The name of the database that the column derives from +** 3 The name of the table that the column derives from +** 4 The name of the table column that the result column derives from +** +** If the result is not a simple column reference (if it is an expression +** or a constant) then useTypes 2, 3, and 4 return NULL. +*/ +static const void *columnName( + sqlite3_stmt *pStmt, /* The statement */ + int N, /* Which column to get the name for */ + int useUtf16, /* True to return the name as UTF16 */ + int useType /* What type of name */ +){ + const void *ret; + Vdbe *p; + int n; + sqlite3 *db; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pStmt==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + ret = 0; + p = (Vdbe *)pStmt; + db = p->db; + assert( db!=0 ); + n = sqlite3_column_count(pStmt); + if( N=0 ){ + N += useType*n; + sqlite3_mutex_enter(db->mutex); + assert( db->mallocFailed==0 ); +#ifndef SQLITE_OMIT_UTF16 + if( useUtf16 ){ + ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]); + }else +#endif + { + ret = sqlite3_value_text((sqlite3_value*)&p->aColName[N]); + } + /* A malloc may have failed inside of the _text() call. If this + ** is the case, clear the mallocFailed flag and return NULL. + */ + if( db->mallocFailed ){ + sqlite3OomClear(db); + ret = 0; + } + sqlite3_mutex_leave(db->mutex); + } + return ret; +} + +/* +** Return the name of the Nth column of the result set returned by SQL +** statement pStmt. +*/ +SQLITE_API const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 0, COLNAME_NAME); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 1, COLNAME_NAME); +} +#endif + +/* +** Constraint: If you have ENABLE_COLUMN_METADATA then you must +** not define OMIT_DECLTYPE. +*/ +#if defined(SQLITE_OMIT_DECLTYPE) && defined(SQLITE_ENABLE_COLUMN_METADATA) +# error "Must not define both SQLITE_OMIT_DECLTYPE \ + and SQLITE_ENABLE_COLUMN_METADATA" +#endif + +#ifndef SQLITE_OMIT_DECLTYPE +/* +** Return the column declaration type (if applicable) of the 'i'th column +** of the result set of SQL statement pStmt. +*/ +SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 0, COLNAME_DECLTYPE); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 1, COLNAME_DECLTYPE); +} +#endif /* SQLITE_OMIT_UTF16 */ +#endif /* SQLITE_OMIT_DECLTYPE */ + +#ifdef SQLITE_ENABLE_COLUMN_METADATA +/* +** Return the name of the database from which a result column derives. +** NULL is returned if the result column is an expression or constant or +** anything else which is not an unambiguous reference to a database column. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 0, COLNAME_DATABASE); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 1, COLNAME_DATABASE); +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Return the name of the table from which a result column derives. +** NULL is returned if the result column is an expression or constant or +** anything else which is not an unambiguous reference to a database column. +*/ +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 0, COLNAME_TABLE); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 1, COLNAME_TABLE); +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Return the name of the table column from which a result column derives. +** NULL is returned if the result column is an expression or constant or +** anything else which is not an unambiguous reference to a database column. +*/ +SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 0, COLNAME_COLUMN); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 1, COLNAME_COLUMN); +} +#endif /* SQLITE_OMIT_UTF16 */ +#endif /* SQLITE_ENABLE_COLUMN_METADATA */ + + +/******************************* sqlite3_bind_ *************************** +** +** Routines used to attach values to wildcards in a compiled SQL statement. +*/ +/* +** Unbind the value bound to variable i in virtual machine p. This is the +** the same as binding a NULL value to the column. If the "i" parameter is +** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK. +** +** A successful evaluation of this routine acquires the mutex on p. +** the mutex is released if any kind of error occurs. +** +** The error code stored in database p->db is overwritten with the return +** value in any case. +*/ +static int vdbeUnbind(Vdbe *p, int i){ + Mem *pVar; + if( vdbeSafetyNotNull(p) ){ + return SQLITE_MISUSE_BKPT; + } + sqlite3_mutex_enter(p->db->mutex); + if( p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){ + sqlite3Error(p->db, SQLITE_MISUSE); + sqlite3_mutex_leave(p->db->mutex); + sqlite3_log(SQLITE_MISUSE, + "bind on a busy prepared statement: [%s]", p->zSql); + return SQLITE_MISUSE_BKPT; + } + if( i<1 || i>p->nVar ){ + sqlite3Error(p->db, SQLITE_RANGE); + sqlite3_mutex_leave(p->db->mutex); + return SQLITE_RANGE; + } + i--; + pVar = &p->aVar[i]; + sqlite3VdbeMemRelease(pVar); + pVar->flags = MEM_Null; + p->db->errCode = SQLITE_OK; + + /* If the bit corresponding to this variable in Vdbe.expmask is set, then + ** binding a new value to this variable invalidates the current query plan. + ** + ** IMPLEMENTATION-OF: R-57496-20354 If the specific value bound to a host + ** parameter in the WHERE clause might influence the choice of query plan + ** for a statement, then the statement will be automatically recompiled, + ** as if there had been a schema change, on the first sqlite3_step() call + ** following any change to the bindings of that parameter. + */ + assert( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || p->expmask==0 ); + if( p->expmask!=0 && (p->expmask & (i>=31 ? 0x80000000 : (u32)1<expired = 1; + } + return SQLITE_OK; +} + +/* +** Bind a text or BLOB value. +*/ +static int bindText( + sqlite3_stmt *pStmt, /* The statement to bind against */ + int i, /* Index of the parameter to bind */ + const void *zData, /* Pointer to the data to be bound */ + int nData, /* Number of bytes of data to be bound */ + void (*xDel)(void*), /* Destructor for the data */ + u8 encoding /* Encoding for the data */ +){ + Vdbe *p = (Vdbe *)pStmt; + Mem *pVar; + int rc; + + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + if( zData!=0 ){ + pVar = &p->aVar[i-1]; + rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel); + if( rc==SQLITE_OK && encoding!=0 ){ + rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db)); + } + if( rc ){ + sqlite3Error(p->db, rc); + rc = sqlite3ApiExit(p->db, rc); + } + } + sqlite3_mutex_leave(p->db->mutex); + }else if( xDel!=SQLITE_STATIC && xDel!=SQLITE_TRANSIENT ){ + xDel((void*)zData); + } + return rc; +} + + +/* +** Bind a blob value to an SQL statement variable. +*/ +SQLITE_API int sqlite3_bind_blob( + sqlite3_stmt *pStmt, + int i, + const void *zData, + int nData, + void (*xDel)(void*) +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( nData<0 ) return SQLITE_MISUSE_BKPT; +#endif + return bindText(pStmt, i, zData, nData, xDel, 0); +} +SQLITE_API int sqlite3_bind_blob64( + sqlite3_stmt *pStmt, + int i, + const void *zData, + sqlite3_uint64 nData, + void (*xDel)(void*) +){ + assert( xDel!=SQLITE_DYNAMIC ); + if( nData>0x7fffffff ){ + return invokeValueDestructor(zData, xDel, 0); + }else{ + return bindText(pStmt, i, zData, (int)nData, xDel, 0); + } +} +SQLITE_API int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue); + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){ + return sqlite3_bind_int64(p, i, (i64)iValue); +} +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue); + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){ + int rc; + Vdbe *p = (Vdbe*)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_pointer( + sqlite3_stmt *pStmt, + int i, + void *pPtr, + const char *zPTtype, + void (*xDestructor)(void*) +){ + int rc; + Vdbe *p = (Vdbe*)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetPointer(&p->aVar[i-1], pPtr, zPTtype, xDestructor); + sqlite3_mutex_leave(p->db->mutex); + }else if( xDestructor ){ + xDestructor(pPtr); + } + return rc; +} +SQLITE_API int sqlite3_bind_text( + sqlite3_stmt *pStmt, + int i, + const char *zData, + int nData, + void (*xDel)(void*) +){ + return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8); +} +SQLITE_API int sqlite3_bind_text64( + sqlite3_stmt *pStmt, + int i, + const char *zData, + sqlite3_uint64 nData, + void (*xDel)(void*), + unsigned char enc +){ + assert( xDel!=SQLITE_DYNAMIC ); + if( nData>0x7fffffff ){ + return invokeValueDestructor(zData, xDel, 0); + }else{ + if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE; + return bindText(pStmt, i, zData, (int)nData, xDel, enc); + } +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API int sqlite3_bind_text16( + sqlite3_stmt *pStmt, + int i, + const void *zData, + int nData, + void (*xDel)(void*) +){ + return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE); +} +#endif /* SQLITE_OMIT_UTF16 */ +SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){ + int rc; + switch( sqlite3_value_type((sqlite3_value*)pValue) ){ + case SQLITE_INTEGER: { + rc = sqlite3_bind_int64(pStmt, i, pValue->u.i); + break; + } + case SQLITE_FLOAT: { + rc = sqlite3_bind_double(pStmt, i, pValue->u.r); + break; + } + case SQLITE_BLOB: { + if( pValue->flags & MEM_Zero ){ + rc = sqlite3_bind_zeroblob(pStmt, i, pValue->u.nZero); + }else{ + rc = sqlite3_bind_blob(pStmt, i, pValue->z, pValue->n,SQLITE_TRANSIENT); + } + break; + } + case SQLITE_TEXT: { + rc = bindText(pStmt,i, pValue->z, pValue->n, SQLITE_TRANSIENT, + pValue->enc); + break; + } + default: { + rc = sqlite3_bind_null(pStmt, i); + break; + } + } + return rc; +} +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n); + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt *pStmt, int i, sqlite3_uint64 n){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + sqlite3_mutex_enter(p->db->mutex); + if( n>(u64)p->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + rc = SQLITE_TOOBIG; + }else{ + assert( (n & 0x7FFFFFFF)==n ); + rc = sqlite3_bind_zeroblob(pStmt, i, n); + } + rc = sqlite3ApiExit(p->db, rc); + sqlite3_mutex_leave(p->db->mutex); + return rc; +} + +/* +** Return the number of wildcards that can be potentially bound to. +** This routine is added to support DBD::SQLite. +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe*)pStmt; + return p ? p->nVar : 0; +} + +/* +** Return the name of a wildcard parameter. Return NULL if the index +** is out of range or if the wildcard is unnamed. +** +** The result is always UTF-8. +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ + Vdbe *p = (Vdbe*)pStmt; + if( p==0 ) return 0; + return sqlite3VListNumToName(p->pVList, i); +} + +/* +** Given a wildcard parameter name, return the index of the variable +** with that name. If there is no variable with the given name, +** return 0. +*/ +SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe *p, const char *zName, int nName){ + if( p==0 || zName==0 ) return 0; + return sqlite3VListNameToNum(p->pVList, zName, nName); +} +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){ + return sqlite3VdbeParameterIndex((Vdbe*)pStmt, zName, sqlite3Strlen30(zName)); +} + +/* +** Transfer all bindings from the first statement over to the second. +*/ +SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){ + Vdbe *pFrom = (Vdbe*)pFromStmt; + Vdbe *pTo = (Vdbe*)pToStmt; + int i; + assert( pTo->db==pFrom->db ); + assert( pTo->nVar==pFrom->nVar ); + sqlite3_mutex_enter(pTo->db->mutex); + for(i=0; inVar; i++){ + sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]); + } + sqlite3_mutex_leave(pTo->db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Deprecated external interface. Internal/core SQLite code +** should call sqlite3TransferBindings. +** +** It is misuse to call this routine with statements from different +** database connections. But as this is a deprecated interface, we +** will not bother to check for that condition. +** +** If the two statements contain a different number of bindings, then +** an SQLITE_ERROR is returned. Nothing else can go wrong, so otherwise +** SQLITE_OK is returned. +*/ +SQLITE_API int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){ + Vdbe *pFrom = (Vdbe*)pFromStmt; + Vdbe *pTo = (Vdbe*)pToStmt; + if( pFrom->nVar!=pTo->nVar ){ + return SQLITE_ERROR; + } + assert( (pTo->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || pTo->expmask==0 ); + if( pTo->expmask ){ + pTo->expired = 1; + } + assert( (pFrom->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || pFrom->expmask==0 ); + if( pFrom->expmask ){ + pFrom->expired = 1; + } + return sqlite3TransferBindings(pFromStmt, pToStmt); +} +#endif + +/* +** Return the sqlite3* database handle to which the prepared statement given +** in the argument belongs. This is the same database handle that was +** the first argument to the sqlite3_prepare() that was used to create +** the statement in the first place. +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->db : 0; +} + +/* +** Return true if the prepared statement is guaranteed to not modify the +** database. +*/ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->readOnly : 1; +} + +/* +** Return 1 if the statement is an EXPLAIN and return 2 if the +** statement is an EXPLAIN QUERY PLAN +*/ +SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->explain : 0; +} + +/* +** Return true if the prepared statement is in need of being reset. +*/ +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt *pStmt){ + Vdbe *v = (Vdbe*)pStmt; + return v!=0 && v->magic==VDBE_MAGIC_RUN && v->pc>=0; +} + +/* +** Return a pointer to the next prepared statement after pStmt associated +** with database connection pDb. If pStmt is NULL, return the first +** prepared statement for the database connection. Return NULL if there +** are no more. +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){ + sqlite3_stmt *pNext; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(pDb) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(pDb->mutex); + if( pStmt==0 ){ + pNext = (sqlite3_stmt*)pDb->pVdbe; + }else{ + pNext = (sqlite3_stmt*)((Vdbe*)pStmt)->pNext; + } + sqlite3_mutex_leave(pDb->mutex); + return pNext; +} + +/* +** Return the value of a status counter for a prepared statement +*/ +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ + Vdbe *pVdbe = (Vdbe*)pStmt; + u32 v; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !pStmt + || (op!=SQLITE_STMTSTATUS_MEMUSED && (op<0||op>=ArraySize(pVdbe->aCounter))) + ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + if( op==SQLITE_STMTSTATUS_MEMUSED ){ + sqlite3 *db = pVdbe->db; + sqlite3_mutex_enter(db->mutex); + v = 0; + db->pnBytesFreed = (int*)&v; + sqlite3VdbeClearObject(db, pVdbe); + sqlite3DbFree(db, pVdbe); + db->pnBytesFreed = 0; + sqlite3_mutex_leave(db->mutex); + }else{ + v = pVdbe->aCounter[op]; + if( resetFlag ) pVdbe->aCounter[op] = 0; + } + return (int)v; +} + +/* +** Return the SQL associated with a prepared statement +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe *)pStmt; + return p ? p->zSql : 0; +} + +/* +** Return the SQL associated with a prepared statement with +** bound parameters expanded. Space to hold the returned string is +** obtained from sqlite3_malloc(). The caller is responsible for +** freeing the returned string by passing it to sqlite3_free(). +** +** The SQLITE_TRACE_SIZE_LIMIT puts an upper bound on the size of +** expanded bound parameters. +*/ +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ +#ifdef SQLITE_OMIT_TRACE + return 0; +#else + char *z = 0; + const char *zSql = sqlite3_sql(pStmt); + if( zSql ){ + Vdbe *p = (Vdbe *)pStmt; + sqlite3_mutex_enter(p->db->mutex); + z = sqlite3VdbeExpandSql(p, zSql); + sqlite3_mutex_leave(p->db->mutex); + } + return z; +#endif +} + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Return the normalized SQL associated with a prepared statement. +*/ +SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe *)pStmt; + if( p==0 ) return 0; + if( p->zNormSql==0 && ALWAYS(p->zSql!=0) ){ + sqlite3_mutex_enter(p->db->mutex); + p->zNormSql = sqlite3Normalize(p, p->zSql); + sqlite3_mutex_leave(p->db->mutex); + } + return p->zNormSql; +} +#endif /* SQLITE_ENABLE_NORMALIZE */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Allocate and populate an UnpackedRecord structure based on the serialized +** record in nKey/pKey. Return a pointer to the new UnpackedRecord structure +** if successful, or a NULL pointer if an OOM error is encountered. +*/ +static UnpackedRecord *vdbeUnpackRecord( + KeyInfo *pKeyInfo, + int nKey, + const void *pKey +){ + UnpackedRecord *pRet; /* Return value */ + + pRet = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); + if( pRet ){ + memset(pRet->aMem, 0, sizeof(Mem)*(pKeyInfo->nKeyField+1)); + sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, pRet); + } + return pRet; +} + +/* +** This function is called from within a pre-update callback to retrieve +** a field of the row currently being updated or deleted. +*/ +SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ + PreUpdate *p = db->pPreUpdate; + Mem *pMem; + int rc = SQLITE_OK; + + /* Test that this call is being made from within an SQLITE_DELETE or + ** SQLITE_UPDATE pre-update callback, and that iIdx is within range. */ + if( !p || p->op==SQLITE_INSERT ){ + rc = SQLITE_MISUSE_BKPT; + goto preupdate_old_out; + } + if( p->pPk ){ + iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); + } + if( iIdx>=p->pCsr->nField || iIdx<0 ){ + rc = SQLITE_RANGE; + goto preupdate_old_out; + } + + /* If the old.* record has not yet been loaded into memory, do so now. */ + if( p->pUnpacked==0 ){ + u32 nRec; + u8 *aRec; + + nRec = sqlite3BtreePayloadSize(p->pCsr->uc.pCursor); + aRec = sqlite3DbMallocRaw(db, nRec); + if( !aRec ) goto preupdate_old_out; + rc = sqlite3BtreePayload(p->pCsr->uc.pCursor, 0, nRec, aRec); + if( rc==SQLITE_OK ){ + p->pUnpacked = vdbeUnpackRecord(&p->keyinfo, nRec, aRec); + if( !p->pUnpacked ) rc = SQLITE_NOMEM; + } + if( rc!=SQLITE_OK ){ + sqlite3DbFree(db, aRec); + goto preupdate_old_out; + } + p->aRecord = aRec; + } + + pMem = *ppValue = &p->pUnpacked->aMem[iIdx]; + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey1); + }else if( iIdx>=p->pUnpacked->nField ){ + *ppValue = (sqlite3_value *)columnNullValue(); + }else if( p->pTab->aCol[iIdx].affinity==SQLITE_AFF_REAL ){ + if( pMem->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pMem->flags & MEM_Int ); + testcase( pMem->flags & MEM_IntReal ); + sqlite3VdbeMemRealify(pMem); + } + } + + preupdate_old_out: + sqlite3Error(db, rc); + return sqlite3ApiExit(db, rc); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is called from within a pre-update callback to retrieve +** the number of columns in the row being updated, deleted or inserted. +*/ +SQLITE_API int sqlite3_preupdate_count(sqlite3 *db){ + PreUpdate *p = db->pPreUpdate; + return (p ? p->keyinfo.nKeyField : 0); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is designed to be called from within a pre-update callback +** only. It returns zero if the change that caused the callback was made +** immediately by a user SQL statement. Or, if the change was made by a +** trigger program, it returns the number of trigger programs currently +** on the stack (1 for a top-level trigger, 2 for a trigger fired by a +** top-level trigger etc.). +** +** For the purposes of the previous paragraph, a foreign key CASCADE, SET NULL +** or SET DEFAULT action is considered a trigger. +*/ +SQLITE_API int sqlite3_preupdate_depth(sqlite3 *db){ + PreUpdate *p = db->pPreUpdate; + return (p ? p->v->nFrame : 0); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is called from within a pre-update callback to retrieve +** a field of the row currently being updated or inserted. +*/ +SQLITE_API int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ + PreUpdate *p = db->pPreUpdate; + int rc = SQLITE_OK; + Mem *pMem; + + if( !p || p->op==SQLITE_DELETE ){ + rc = SQLITE_MISUSE_BKPT; + goto preupdate_new_out; + } + if( p->pPk && p->op!=SQLITE_UPDATE ){ + iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); + } + if( iIdx>=p->pCsr->nField || iIdx<0 ){ + rc = SQLITE_RANGE; + goto preupdate_new_out; + } + + if( p->op==SQLITE_INSERT ){ + /* For an INSERT, memory cell p->iNewReg contains the serialized record + ** that is being inserted. Deserialize it. */ + UnpackedRecord *pUnpack = p->pNewUnpacked; + if( !pUnpack ){ + Mem *pData = &p->v->aMem[p->iNewReg]; + rc = ExpandBlob(pData); + if( rc!=SQLITE_OK ) goto preupdate_new_out; + pUnpack = vdbeUnpackRecord(&p->keyinfo, pData->n, pData->z); + if( !pUnpack ){ + rc = SQLITE_NOMEM; + goto preupdate_new_out; + } + p->pNewUnpacked = pUnpack; + } + pMem = &pUnpack->aMem[iIdx]; + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey2); + }else if( iIdx>=pUnpack->nField ){ + pMem = (sqlite3_value *)columnNullValue(); + } + }else{ + /* For an UPDATE, memory cell (p->iNewReg+1+iIdx) contains the required + ** value. Make a copy of the cell contents and return a pointer to it. + ** It is not safe to return a pointer to the memory cell itself as the + ** caller may modify the value text encoding. + */ + assert( p->op==SQLITE_UPDATE ); + if( !p->aNew ){ + p->aNew = (Mem *)sqlite3DbMallocZero(db, sizeof(Mem) * p->pCsr->nField); + if( !p->aNew ){ + rc = SQLITE_NOMEM; + goto preupdate_new_out; + } + } + assert( iIdx>=0 && iIdxpCsr->nField ); + pMem = &p->aNew[iIdx]; + if( pMem->flags==0 ){ + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey2); + }else{ + rc = sqlite3VdbeMemCopy(pMem, &p->v->aMem[p->iNewReg+1+iIdx]); + if( rc!=SQLITE_OK ) goto preupdate_new_out; + } + } + } + *ppValue = pMem; + + preupdate_new_out: + sqlite3Error(db, rc); + return sqlite3ApiExit(db, rc); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +/* +** Return status data for a single loop within query pStmt. +*/ +SQLITE_API int sqlite3_stmt_scanstatus( + sqlite3_stmt *pStmt, /* Prepared statement being queried */ + int idx, /* Index of loop to report on */ + int iScanStatusOp, /* Which metric to return */ + void *pOut /* OUT: Write the answer here */ +){ + Vdbe *p = (Vdbe*)pStmt; + ScanStatus *pScan; + if( idx<0 || idx>=p->nScan ) return 1; + pScan = &p->aScan[idx]; + switch( iScanStatusOp ){ + case SQLITE_SCANSTAT_NLOOP: { + *(sqlite3_int64*)pOut = p->anExec[pScan->addrLoop]; + break; + } + case SQLITE_SCANSTAT_NVISIT: { + *(sqlite3_int64*)pOut = p->anExec[pScan->addrVisit]; + break; + } + case SQLITE_SCANSTAT_EST: { + double r = 1.0; + LogEst x = pScan->nEst; + while( x<100 ){ + x += 10; + r *= 0.5; + } + *(double*)pOut = r*sqlite3LogEstToInt(x); + break; + } + case SQLITE_SCANSTAT_NAME: { + *(const char**)pOut = pScan->zName; + break; + } + case SQLITE_SCANSTAT_EXPLAIN: { + if( pScan->addrExplain ){ + *(const char**)pOut = p->aOp[ pScan->addrExplain ].p4.z; + }else{ + *(const char**)pOut = 0; + } + break; + } + case SQLITE_SCANSTAT_SELECTID: { + if( pScan->addrExplain ){ + *(int*)pOut = p->aOp[ pScan->addrExplain ].p1; + }else{ + *(int*)pOut = -1; + } + break; + } + default: { + return 1; + } + } + return 0; +} + +/* +** Zero all counters associated with the sqlite3_stmt_scanstatus() data. +*/ +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe*)pStmt; + memset(p->anExec, 0, p->nOp * sizeof(i64)); +} +#endif /* SQLITE_ENABLE_STMT_SCANSTATUS */ + +/************** End of vdbeapi.c *********************************************/ +/************** Begin file vdbetrace.c ***************************************/ +/* +** 2009 November 25 +** +** 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 code used to insert the values of host parameters +** (aka "wildcards") into the SQL text output by sqlite3_trace(). +** +** The Vdbe parse-tree explainer is also found here. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#ifndef SQLITE_OMIT_TRACE + +/* +** zSql is a zero-terminated string of UTF-8 SQL text. Return the number of +** bytes in this text up to but excluding the first character in +** a host parameter. If the text contains no host parameters, return +** the total number of bytes in the text. +*/ +static int findNextHostParameter(const char *zSql, int *pnToken){ + int tokenType; + int nTotal = 0; + int n; + + *pnToken = 0; + while( zSql[0] ){ + n = sqlite3GetToken((u8*)zSql, &tokenType); + assert( n>0 && tokenType!=TK_ILLEGAL ); + if( tokenType==TK_VARIABLE ){ + *pnToken = n; + break; + } + nTotal += n; + zSql += n; + } + return nTotal; +} + +/* +** This function returns a pointer to a nul-terminated string in memory +** obtained from sqlite3DbMalloc(). If sqlite3.nVdbeExec is 1, then the +** string contains a copy of zRawSql but with host parameters expanded to +** their current bindings. Or, if sqlite3.nVdbeExec is greater than 1, +** then the returned string holds a copy of zRawSql with "-- " prepended +** to each line of text. +** +** If the SQLITE_TRACE_SIZE_LIMIT macro is defined to an integer, then +** then long strings and blobs are truncated to that many bytes. This +** can be used to prevent unreasonably large trace strings when dealing +** with large (multi-megabyte) strings and blobs. +** +** The calling function is responsible for making sure the memory returned +** is eventually freed. +** +** ALGORITHM: Scan the input string looking for host parameters in any of +** these forms: ?, ?N, $A, @A, :A. Take care to avoid text within +** string literals, quoted identifier names, and comments. For text forms, +** the host parameter index is found by scanning the prepared +** statement for the corresponding OP_Variable opcode. Once the host +** parameter index is known, locate the value in p->aVar[]. Then render +** the value as a literal in place of the host parameter name. +*/ +SQLITE_PRIVATE char *sqlite3VdbeExpandSql( + Vdbe *p, /* The prepared statement being evaluated */ + const char *zRawSql /* Raw text of the SQL statement */ +){ + sqlite3 *db; /* The database connection */ + int idx = 0; /* Index of a host parameter */ + int nextIndex = 1; /* Index of next ? host parameter */ + int n; /* Length of a token prefix */ + int nToken; /* Length of the parameter token */ + int i; /* Loop counter */ + Mem *pVar; /* Value of a host parameter */ + StrAccum out; /* Accumulate the output here */ +#ifndef SQLITE_OMIT_UTF16 + Mem utf8; /* Used to convert UTF16 into UTF8 for display */ +#endif + char zBase[100]; /* Initial working space */ + + db = p->db; + sqlite3StrAccumInit(&out, 0, zBase, sizeof(zBase), + db->aLimit[SQLITE_LIMIT_LENGTH]); + if( db->nVdbeExec>1 ){ + while( *zRawSql ){ + const char *zStart = zRawSql; + while( *(zRawSql++)!='\n' && *zRawSql ); + sqlite3_str_append(&out, "-- ", 3); + assert( (zRawSql - zStart) > 0 ); + sqlite3_str_append(&out, zStart, (int)(zRawSql-zStart)); + } + }else if( p->nVar==0 ){ + sqlite3_str_append(&out, zRawSql, sqlite3Strlen30(zRawSql)); + }else{ + while( zRawSql[0] ){ + n = findNextHostParameter(zRawSql, &nToken); + assert( n>0 ); + sqlite3_str_append(&out, zRawSql, n); + zRawSql += n; + assert( zRawSql[0] || nToken==0 ); + if( nToken==0 ) break; + if( zRawSql[0]=='?' ){ + if( nToken>1 ){ + assert( sqlite3Isdigit(zRawSql[1]) ); + sqlite3GetInt32(&zRawSql[1], &idx); + }else{ + idx = nextIndex; + } + }else{ + assert( zRawSql[0]==':' || zRawSql[0]=='$' || + zRawSql[0]=='@' || zRawSql[0]=='#' ); + testcase( zRawSql[0]==':' ); + testcase( zRawSql[0]=='$' ); + testcase( zRawSql[0]=='@' ); + testcase( zRawSql[0]=='#' ); + idx = sqlite3VdbeParameterIndex(p, zRawSql, nToken); + assert( idx>0 ); + } + zRawSql += nToken; + nextIndex = idx + 1; + assert( idx>0 && idx<=p->nVar ); + pVar = &p->aVar[idx-1]; + if( pVar->flags & MEM_Null ){ + sqlite3_str_append(&out, "NULL", 4); + }else if( pVar->flags & (MEM_Int|MEM_IntReal) ){ + sqlite3_str_appendf(&out, "%lld", pVar->u.i); + }else if( pVar->flags & MEM_Real ){ + sqlite3_str_appendf(&out, "%!.15g", pVar->u.r); + }else if( pVar->flags & MEM_Str ){ + int nOut; /* Number of bytes of the string text to include in output */ +#ifndef SQLITE_OMIT_UTF16 + u8 enc = ENC(db); + if( enc!=SQLITE_UTF8 ){ + memset(&utf8, 0, sizeof(utf8)); + utf8.db = db; + sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, enc, SQLITE_STATIC); + if( SQLITE_NOMEM==sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8) ){ + out.accError = SQLITE_NOMEM; + out.nAlloc = 0; + } + pVar = &utf8; + } +#endif + nOut = pVar->n; +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOut>SQLITE_TRACE_SIZE_LIMIT ){ + nOut = SQLITE_TRACE_SIZE_LIMIT; + while( nOutn && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; } + } +#endif + sqlite3_str_appendf(&out, "'%.*q'", nOut, pVar->z); +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOutn ){ + sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut); + } +#endif +#ifndef SQLITE_OMIT_UTF16 + if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8); +#endif + }else if( pVar->flags & MEM_Zero ){ + sqlite3_str_appendf(&out, "zeroblob(%d)", pVar->u.nZero); + }else{ + int nOut; /* Number of bytes of the blob to include in output */ + assert( pVar->flags & MEM_Blob ); + sqlite3_str_append(&out, "x'", 2); + nOut = pVar->n; +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT; +#endif + for(i=0; iz[i]&0xff); + } + sqlite3_str_append(&out, "'", 1); +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOutn ){ + sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut); + } +#endif + } + } + } + if( out.accError ) sqlite3_str_reset(&out); + return sqlite3StrAccumFinish(&out); +} + +#endif /* #ifndef SQLITE_OMIT_TRACE */ + +/************** End of vdbetrace.c *******************************************/ +/************** Begin file vdbe.c ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** The code in this file implements the function that runs the +** bytecode of a prepared statement. +** +** Various scripts scan this source file in order to generate HTML +** documentation, headers files, or other derived files. The formatting +** of the code in this file is, therefore, important. See other comments +** in this file for details. If in doubt, do not deviate from existing +** commenting and indentation practices when changing or adding code. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* +** Invoke this macro on memory cells just prior to changing the +** value of the cell. This macro verifies that shallow copies are +** not misused. A shallow copy of a string or blob just copies a +** pointer to the string or blob, not the content. If the original +** is changed while the copy is still in use, the string or blob might +** be changed out from under the copy. This macro verifies that nothing +** like that ever happens. +*/ +#ifdef SQLITE_DEBUG +# define memAboutToChange(P,M) sqlite3VdbeMemAboutToChange(P,M) +#else +# define memAboutToChange(P,M) +#endif + +/* +** The following global variable is incremented every time a cursor +** moves, either by the OP_SeekXX, OP_Next, or OP_Prev opcodes. The test +** procedures use this information to make sure that indices are +** working correctly. This variable has no function other than to +** help verify the correct operation of the library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_search_count = 0; +#endif + +/* +** When this global variable is positive, it gets decremented once before +** each instruction in the VDBE. When it reaches zero, the u1.isInterrupted +** field of the sqlite3 structure is set in order to simulate an interrupt. +** +** This facility is used for testing purposes only. It does not function +** in an ordinary build. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_interrupt_count = 0; +#endif + +/* +** The next global variable is incremented each type the OP_Sort opcode +** is executed. The test procedures use this information to make sure that +** sorting is occurring or not occurring at appropriate times. This variable +** has no function other than to help verify the correct operation of the +** library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_sort_count = 0; +#endif + +/* +** The next global variable records the size of the largest MEM_Blob +** or MEM_Str that has been used by a VDBE opcode. The test procedures +** use this information to make sure that the zero-blob functionality +** is working correctly. This variable has no function other than to +** help verify the correct operation of the library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_max_blobsize = 0; +static void updateMaxBlobsize(Mem *p){ + if( (p->flags & (MEM_Str|MEM_Blob))!=0 && p->n>sqlite3_max_blobsize ){ + sqlite3_max_blobsize = p->n; + } +} +#endif + +/* +** This macro evaluates to true if either the update hook or the preupdate +** hook are enabled for database connect DB. +*/ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +# define HAS_UPDATE_HOOK(DB) ((DB)->xPreUpdateCallback||(DB)->xUpdateCallback) +#else +# define HAS_UPDATE_HOOK(DB) ((DB)->xUpdateCallback) +#endif + +/* +** The next global variable is incremented each time the OP_Found opcode +** is executed. This is used to test whether or not the foreign key +** operation implemented using OP_FkIsZero is working. This variable +** has no function other than to help verify the correct operation of the +** library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_found_count = 0; +#endif + +/* +** Test a register to see if it exceeds the current maximum blob size. +** If it does, record the new maximum blob size. +*/ +#if defined(SQLITE_TEST) && !defined(SQLITE_UNTESTABLE) +# define UPDATE_MAX_BLOBSIZE(P) updateMaxBlobsize(P) +#else +# define UPDATE_MAX_BLOBSIZE(P) +#endif + +#ifdef SQLITE_DEBUG +/* This routine provides a convenient place to set a breakpoint during +** tracing with PRAGMA vdbe_trace=on. The breakpoint fires right after +** each opcode is printed. Variables "pc" (program counter) and pOp are +** available to add conditionals to the breakpoint. GDB example: +** +** break test_trace_breakpoint if pc=22 +** +** Other useful labels for breakpoints include: +** test_addop_breakpoint(pc,pOp) +** sqlite3CorruptError(lineno) +** sqlite3MisuseError(lineno) +** sqlite3CantopenError(lineno) +*/ +static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){ + static int n = 0; + n++; +} +#endif + +/* +** Invoke the VDBE coverage callback, if that callback is defined. This +** feature is used for test suite validation only and does not appear an +** production builds. +** +** M is the type of branch. I is the direction taken for this instance of +** the branch. +** +** M: 2 - two-way branch (I=0: fall-thru 1: jump ) +** 3 - two-way + NULL (I=0: fall-thru 1: jump 2: NULL ) +** 4 - OP_Jump (I=0: jump p1 1: jump p2 2: jump p3) +** +** In other words, if M is 2, then I is either 0 (for fall-through) or +** 1 (for when the branch is taken). If M is 3, the I is 0 for an +** ordinary fall-through, I is 1 if the branch was taken, and I is 2 +** if the result of comparison is NULL. For M=3, I=2 the jump may or +** may not be taken, depending on the SQLITE_JUMPIFNULL flags in p5. +** When M is 4, that means that an OP_Jump is being run. I is 0, 1, or 2 +** depending on if the operands are less than, equal, or greater than. +** +** iSrcLine is the source code line (from the __LINE__ macro) that +** generated the VDBE instruction combined with flag bits. The source +** code line number is in the lower 24 bits of iSrcLine and the upper +** 8 bytes are flags. The lower three bits of the flags indicate +** values for I that should never occur. For example, if the branch is +** always taken, the flags should be 0x05 since the fall-through and +** alternate branch are never taken. If a branch is never taken then +** flags should be 0x06 since only the fall-through approach is allowed. +** +** Bit 0x08 of the flags indicates an OP_Jump opcode that is only +** interested in equal or not-equal. In other words, I==0 and I==2 +** should be treated as equivalent +** +** Since only a line number is retained, not the filename, this macro +** only works for amalgamation builds. But that is ok, since these macros +** should be no-ops except for special builds used to measure test coverage. +*/ +#if !defined(SQLITE_VDBE_COVERAGE) +# define VdbeBranchTaken(I,M) +#else +# define VdbeBranchTaken(I,M) vdbeTakeBranch(pOp->iSrcLine,I,M) + static void vdbeTakeBranch(u32 iSrcLine, u8 I, u8 M){ + u8 mNever; + assert( I<=2 ); /* 0: fall through, 1: taken, 2: alternate taken */ + assert( M<=4 ); /* 2: two-way branch, 3: three-way branch, 4: OP_Jump */ + assert( I> 24; + assert( (I & mNever)==0 ); + if( sqlite3GlobalConfig.xVdbeBranch==0 ) return; /*NO_TEST*/ + /* Invoke the branch coverage callback with three arguments: + ** iSrcLine - the line number of the VdbeCoverage() macro, with + ** flags removed. + ** I - Mask of bits 0x07 indicating which cases are are + ** fulfilled by this instance of the jump. 0x01 means + ** fall-thru, 0x02 means taken, 0x04 means NULL. Any + ** impossible cases (ex: if the comparison is never NULL) + ** are filled in automatically so that the coverage + ** measurement logic does not flag those impossible cases + ** as missed coverage. + ** M - Type of jump. Same as M argument above + */ + I |= mNever; + if( M==2 ) I |= 0x04; + if( M==4 ){ + I |= 0x08; + if( (mNever&0x08)!=0 && (I&0x05)!=0) I |= 0x05; /*NO_TEST*/ + } + sqlite3GlobalConfig.xVdbeBranch(sqlite3GlobalConfig.pVdbeBranchArg, + iSrcLine&0xffffff, I, M); + } +#endif + +/* +** An ephemeral string value (signified by the MEM_Ephem flag) contains +** a pointer to a dynamically allocated string where some other entity +** is responsible for deallocating that string. Because the register +** does not control the string, it might be deleted without the register +** knowing it. +** +** This routine converts an ephemeral string into a dynamically allocated +** string that the register itself controls. In other words, it +** converts an MEM_Ephem string into a string with P.z==P.zMalloc. +*/ +#define Deephemeralize(P) \ + if( ((P)->flags&MEM_Ephem)!=0 \ + && sqlite3VdbeMemMakeWriteable(P) ){ goto no_mem;} + +/* Return true if the cursor was opened using the OP_OpenSorter opcode. */ +#define isSorter(x) ((x)->eCurType==CURTYPE_SORTER) + +/* +** Allocate VdbeCursor number iCur. Return a pointer to it. Return NULL +** if we run out of memory. +*/ +static VdbeCursor *allocateCursor( + Vdbe *p, /* The virtual machine */ + int iCur, /* Index of the new VdbeCursor */ + int nField, /* Number of fields in the table or index */ + int iDb, /* Database the cursor belongs to, or -1 */ + u8 eCurType /* Type of the new cursor */ +){ + /* Find the memory cell that will be used to store the blob of memory + ** required for this VdbeCursor structure. It is convenient to use a + ** vdbe memory cell to manage the memory allocation required for a + ** VdbeCursor structure for the following reasons: + ** + ** * Sometimes cursor numbers are used for a couple of different + ** purposes in a vdbe program. The different uses might require + ** different sized allocations. Memory cells provide growable + ** allocations. + ** + ** * When using ENABLE_MEMORY_MANAGEMENT, memory cell buffers can + ** be freed lazily via the sqlite3_release_memory() API. This + ** minimizes the number of malloc calls made by the system. + ** + ** The memory cell for cursor 0 is aMem[0]. The rest are allocated from + ** the top of the register space. Cursor 1 is at Mem[p->nMem-1]. + ** Cursor 2 is at Mem[p->nMem-2]. And so forth. + */ + Mem *pMem = iCur>0 ? &p->aMem[p->nMem-iCur] : p->aMem; + + int nByte; + VdbeCursor *pCx = 0; + nByte = + ROUND8(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + + (eCurType==CURTYPE_BTREE?sqlite3BtreeCursorSize():0); + + assert( iCur>=0 && iCurnCursor ); + if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ + /* Before calling sqlite3VdbeFreeCursor(), ensure the isEphemeral flag + ** is clear. Otherwise, if this is an ephemeral cursor created by + ** OP_OpenDup, the cursor will not be closed and will still be part + ** of a BtShared.pCursor list. */ + if( p->apCsr[iCur]->pBtx==0 ) p->apCsr[iCur]->isEphemeral = 0; + sqlite3VdbeFreeCursor(p, p->apCsr[iCur]); + p->apCsr[iCur] = 0; + } + if( SQLITE_OK==sqlite3VdbeMemClearAndResize(pMem, nByte) ){ + p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->z; + memset(pCx, 0, offsetof(VdbeCursor,pAltCursor)); + pCx->eCurType = eCurType; + pCx->iDb = iDb; + pCx->nField = nField; + pCx->aOffset = &pCx->aType[nField]; + if( eCurType==CURTYPE_BTREE ){ + pCx->uc.pCursor = (BtCursor*) + &pMem->z[ROUND8(sizeof(VdbeCursor))+2*sizeof(u32)*nField]; + sqlite3BtreeCursorZero(pCx->uc.pCursor); + } + } + return pCx; +} + +/* +** The string in pRec is known to look like an integer and to have a +** floating point value of rValue. Return true and set *piValue to the +** integer value if the string is in range to be an integer. Otherwise, +** return false. +*/ +static int alsoAnInt(Mem *pRec, double rValue, i64 *piValue){ + i64 iValue = (double)rValue; + if( sqlite3RealSameAsInt(rValue,iValue) ){ + *piValue = iValue; + return 1; + } + return 0==sqlite3Atoi64(pRec->z, piValue, pRec->n, pRec->enc); +} + +/* +** Try to convert a value into a numeric representation if we can +** do so without loss of information. In other words, if the string +** looks like a number, convert it into a number. If it does not +** look like a number, leave it alone. +** +** If the bTryForInt flag is true, then extra effort is made to give +** an integer representation. Strings that look like floating point +** values but which have no fractional component (example: '48.00') +** will have a MEM_Int representation when bTryForInt is true. +** +** If bTryForInt is false, then if the input string contains a decimal +** point or exponential notation, the result is only MEM_Real, even +** if there is an exact integer representation of the quantity. +*/ +static void applyNumericAffinity(Mem *pRec, int bTryForInt){ + double rValue; + u8 enc = pRec->enc; + int rc; + assert( (pRec->flags & (MEM_Str|MEM_Int|MEM_Real|MEM_IntReal))==MEM_Str ); + rc = sqlite3AtoF(pRec->z, &rValue, pRec->n, enc); + if( rc<=0 ) return; + if( rc==1 && alsoAnInt(pRec, rValue, &pRec->u.i) ){ + pRec->flags |= MEM_Int; + }else{ + pRec->u.r = rValue; + pRec->flags |= MEM_Real; + if( bTryForInt ) sqlite3VdbeIntegerAffinity(pRec); + } + /* TEXT->NUMERIC is many->one. Hence, it is important to invalidate the + ** string representation after computing a numeric equivalent, because the + ** string representation might not be the canonical representation for the + ** numeric value. Ticket [343634942dd54ab57b7024] 2018-01-31. */ + pRec->flags &= ~MEM_Str; +} + +/* +** Processing is determine by the affinity parameter: +** +** SQLITE_AFF_INTEGER: +** SQLITE_AFF_REAL: +** SQLITE_AFF_NUMERIC: +** Try to convert pRec to an integer representation or a +** floating-point representation if an integer representation +** is not possible. Note that the integer representation is +** always preferred, even if the affinity is REAL, because +** an integer representation is more space efficient on disk. +** +** SQLITE_AFF_TEXT: +** Convert pRec to a text representation. +** +** SQLITE_AFF_BLOB: +** SQLITE_AFF_NONE: +** No-op. pRec is unchanged. +*/ +static void applyAffinity( + Mem *pRec, /* The value to apply affinity to */ + char affinity, /* The affinity to be applied */ + u8 enc /* Use this text encoding */ +){ + if( affinity>=SQLITE_AFF_NUMERIC ){ + assert( affinity==SQLITE_AFF_INTEGER || affinity==SQLITE_AFF_REAL + || affinity==SQLITE_AFF_NUMERIC ); + if( (pRec->flags & MEM_Int)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + if( (pRec->flags & MEM_Real)==0 ){ + if( pRec->flags & MEM_Str ) applyNumericAffinity(pRec,1); + }else{ + sqlite3VdbeIntegerAffinity(pRec); + } + } + }else if( affinity==SQLITE_AFF_TEXT ){ + /* Only attempt the conversion to TEXT if there is an integer or real + ** representation (blob and NULL do not get converted) but no string + ** representation. It would be harmless to repeat the conversion if + ** there is already a string rep, but it is pointless to waste those + ** CPU cycles. */ + if( 0==(pRec->flags&MEM_Str) ){ /*OPTIMIZATION-IF-FALSE*/ + if( (pRec->flags&(MEM_Real|MEM_Int|MEM_IntReal)) ){ + testcase( pRec->flags & MEM_Int ); + testcase( pRec->flags & MEM_Real ); + testcase( pRec->flags & MEM_IntReal ); + sqlite3VdbeMemStringify(pRec, enc, 1); + } + } + pRec->flags &= ~(MEM_Real|MEM_Int|MEM_IntReal); + } +} + +/* +** Try to convert the type of a function argument or a result column +** into a numeric representation. Use either INTEGER or REAL whichever +** is appropriate. But only do the conversion if it is possible without +** loss of information and return the revised type of the argument. +*/ +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value *pVal){ + int eType = sqlite3_value_type(pVal); + if( eType==SQLITE_TEXT ){ + Mem *pMem = (Mem*)pVal; + applyNumericAffinity(pMem, 0); + eType = sqlite3_value_type(pVal); + } + return eType; +} + +/* +** Exported version of applyAffinity(). This one works on sqlite3_value*, +** not the internal Mem* type. +*/ +SQLITE_PRIVATE void sqlite3ValueApplyAffinity( + sqlite3_value *pVal, + u8 affinity, + u8 enc +){ + applyAffinity((Mem *)pVal, affinity, enc); +} + +/* +** pMem currently only holds a string type (or maybe a BLOB that we can +** interpret as a string if we want to). Compute its corresponding +** numeric type, if has one. Set the pMem->u.r and pMem->u.i fields +** accordingly. +*/ +static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ + int rc; + sqlite3_int64 ix; + assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal))==0 ); + assert( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ); + ExpandBlob(pMem); + rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); + if( rc<=0 ){ + if( rc==0 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1 ){ + pMem->u.i = ix; + return MEM_Int; + }else{ + return MEM_Real; + } + }else if( rc==1 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)==0 ){ + pMem->u.i = ix; + return MEM_Int; + } + return MEM_Real; +} + +/* +** Return the numeric type for pMem, either MEM_Int or MEM_Real or both or +** none. +** +** Unlike applyNumericAffinity(), this routine does not modify pMem->flags. +** But it does set pMem->u.r and pMem->u.i appropriately. +*/ +static u16 numericType(Mem *pMem){ + if( pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal) ){ + testcase( pMem->flags & MEM_Int ); + testcase( pMem->flags & MEM_Real ); + testcase( pMem->flags & MEM_IntReal ); + return pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal); + } + if( pMem->flags & (MEM_Str|MEM_Blob) ){ + testcase( pMem->flags & MEM_Str ); + testcase( pMem->flags & MEM_Blob ); + return computeNumericType(pMem); + } + return 0; +} + +#ifdef SQLITE_DEBUG +/* +** Write a nice string representation of the contents of cell pMem +** into buffer zBuf, length nBuf. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr){ + int f = pMem->flags; + static const char *const encnames[] = {"(X)", "(8)", "(16LE)", "(16BE)"}; + if( f&MEM_Blob ){ + int i; + char c; + if( f & MEM_Dyn ){ + c = 'z'; + assert( (f & (MEM_Static|MEM_Ephem))==0 ); + }else if( f & MEM_Static ){ + c = 't'; + assert( (f & (MEM_Dyn|MEM_Ephem))==0 ); + }else if( f & MEM_Ephem ){ + c = 'e'; + assert( (f & (MEM_Static|MEM_Dyn))==0 ); + }else{ + c = 's'; + } + sqlite3_str_appendf(pStr, "%cx[", c); + for(i=0; i<25 && in; i++){ + sqlite3_str_appendf(pStr, "%02X", ((int)pMem->z[i] & 0xFF)); + } + sqlite3_str_appendf(pStr, "|"); + for(i=0; i<25 && in; i++){ + char z = pMem->z[i]; + sqlite3_str_appendchar(pStr, 1, (z<32||z>126)?'.':z); + } + sqlite3_str_appendf(pStr,"]"); + if( f & MEM_Zero ){ + sqlite3_str_appendf(pStr, "+%dz",pMem->u.nZero); + } + }else if( f & MEM_Str ){ + int j; + u8 c; + if( f & MEM_Dyn ){ + c = 'z'; + assert( (f & (MEM_Static|MEM_Ephem))==0 ); + }else if( f & MEM_Static ){ + c = 't'; + assert( (f & (MEM_Dyn|MEM_Ephem))==0 ); + }else if( f & MEM_Ephem ){ + c = 'e'; + assert( (f & (MEM_Static|MEM_Dyn))==0 ); + }else{ + c = 's'; + } + sqlite3_str_appendf(pStr, " %c%d[", c, pMem->n); + for(j=0; j<25 && jn; j++){ + c = pMem->z[j]; + sqlite3_str_appendchar(pStr, 1, (c>=0x20&&c<=0x7f) ? c : '.'); + } + sqlite3_str_appendf(pStr, "]%s", encnames[pMem->enc]); + } +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Print the value of a register for tracing purposes: +*/ +static void memTracePrint(Mem *p){ + if( p->flags & MEM_Undefined ){ + printf(" undefined"); + }else if( p->flags & MEM_Null ){ + printf(p->flags & MEM_Zero ? " NULL-nochng" : " NULL"); + }else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){ + printf(" si:%lld", p->u.i); + }else if( (p->flags & (MEM_IntReal))!=0 ){ + printf(" ir:%lld", p->u.i); + }else if( p->flags & MEM_Int ){ + printf(" i:%lld", p->u.i); +#ifndef SQLITE_OMIT_FLOATING_POINT + }else if( p->flags & MEM_Real ){ + printf(" r:%.17g", p->u.r); +#endif + }else if( sqlite3VdbeMemIsRowSet(p) ){ + printf(" (rowset)"); + }else{ + StrAccum acc; + char zBuf[1000]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3VdbeMemPrettyPrint(p, &acc); + printf(" %s", sqlite3StrAccumFinish(&acc)); + } + if( p->flags & MEM_Subtype ) printf(" subtype=0x%02x", p->eSubtype); +} +static void registerTrace(int iReg, Mem *p){ + printf("R[%d] = ", iReg); + memTracePrint(p); + if( p->pScopyFrom ){ + printf(" <== R[%d]", (int)(p->pScopyFrom - &p[-iReg])); + } + printf("\n"); + sqlite3VdbeCheckMemInvariants(p); +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Show the values of all registers in the virtual machine. Used for +** interactive debugging. +*/ +SQLITE_PRIVATE void sqlite3VdbeRegisterDump(Vdbe *v){ + int i; + for(i=1; inMem; i++) registerTrace(i, v->aMem+i); +} +#endif /* SQLITE_DEBUG */ + + +#ifdef SQLITE_DEBUG +# define REGISTER_TRACE(R,M) if(db->flags&SQLITE_VdbeTrace)registerTrace(R,M) +#else +# define REGISTER_TRACE(R,M) +#endif + + +#ifdef VDBE_PROFILE + +/* +** hwtime.h contains inline assembler code for implementing +** high-performance timing routines. +*/ +/************** Include hwtime.h in the middle of vdbe.c *********************/ +/************** Begin file hwtime.h ******************************************/ +/* +** 2008 May 27 +** +** 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 inline asm code for retrieving "high-performance" +** counters for x86 and x86_64 class CPUs. +*/ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H + +/* +** The following routine only works on pentium-class (or newer) processors. +** It uses the RDTSC opcode to read the cycle count value out of the +** processor and returns that value. This can be used for high-res +** profiling. +*/ +#if !defined(__STRICT_ANSI__) && \ + (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) + + #if defined(__GNUC__) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + + #elif defined(_MSC_VER) + + __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ + __asm { + rdtsc + ret ; return value at EDX:EAX + } + } + + #endif + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long val; + __asm__ __volatile__ ("rdtsc" : "=A" (val)); + return val; + } + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long long retval; + unsigned long junk; + __asm__ __volatile__ ("\n\ + 1: mftbu %1\n\ + mftb %L0\n\ + mftbu %0\n\ + cmpw %0,%1\n\ + bne 1b" + : "=r" (retval), "=r" (junk)); + return retval; + } + +#else + + /* + ** asm() is needed for hardware timing support. Without asm(), + ** disable the sqlite3Hwtime() routine. + ** + ** sqlite3Hwtime() is only used for some obscure debugging + ** and analysis configurations, not in any deliverable, so this + ** should not be a great loss. + */ +SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } + +#endif + +#endif /* !defined(SQLITE_HWTIME_H) */ + +/************** End of hwtime.h **********************************************/ +/************** Continuing where we left off in vdbe.c ***********************/ + +#endif + +#ifndef NDEBUG +/* +** This function is only called from within an assert() expression. It +** checks that the sqlite3.nTransaction variable is correctly set to +** the number of non-transaction savepoints currently in the +** linked list starting at sqlite3.pSavepoint. +** +** Usage: +** +** assert( checkSavepointCount(db) ); +*/ +static int checkSavepointCount(sqlite3 *db){ + int n = 0; + Savepoint *p; + for(p=db->pSavepoint; p; p=p->pNext) n++; + assert( n==(db->nSavepoint + db->isTransactionSavepoint) ); + return 1; +} +#endif + +/* +** Return the register of pOp->p2 after first preparing it to be +** overwritten with an integer value. +*/ +static SQLITE_NOINLINE Mem *out2PrereleaseWithClear(Mem *pOut){ + sqlite3VdbeMemSetNull(pOut); + pOut->flags = MEM_Int; + return pOut; +} +static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){ + Mem *pOut; + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + pOut = &p->aMem[pOp->p2]; + memAboutToChange(p, pOut); + if( VdbeMemDynamic(pOut) ){ /*OPTIMIZATION-IF-FALSE*/ + return out2PrereleaseWithClear(pOut); + }else{ + pOut->flags = MEM_Int; + return pOut; + } +} + + +/* +** Execute as much of a VDBE program as we can. +** This is the core of sqlite3_step(). +*/ +SQLITE_PRIVATE int sqlite3VdbeExec( + Vdbe *p /* The VDBE */ +){ + Op *aOp = p->aOp; /* Copy of p->aOp */ + Op *pOp = aOp; /* Current operation */ +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + Op *pOrigOp; /* Value of pOp at the top of the loop */ +#endif +#ifdef SQLITE_DEBUG + int nExtraDelete = 0; /* Verifies FORDELETE and AUXDELETE flags */ +#endif + int rc = SQLITE_OK; /* Value to return */ + sqlite3 *db = p->db; /* The database */ + u8 resetSchemaOnFault = 0; /* Reset schema after an error if positive */ + u8 encoding = ENC(db); /* The database encoding */ + int iCompare = 0; /* Result of last comparison */ + unsigned nVmStep = 0; /* Number of virtual machine steps */ +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + unsigned nProgressLimit; /* Invoke xProgress() when nVmStep reaches this */ +#endif + Mem *aMem = p->aMem; /* Copy of p->aMem */ + Mem *pIn1 = 0; /* 1st input operand */ + Mem *pIn2 = 0; /* 2nd input operand */ + Mem *pIn3 = 0; /* 3rd input operand */ + Mem *pOut = 0; /* Output operand */ +#ifdef VDBE_PROFILE + u64 start; /* CPU clock count at start of opcode */ +#endif + /*** INSERT STACK UNION HERE ***/ + + assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */ + sqlite3VdbeEnter(p); +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( db->xProgress ){ + u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; + assert( 0 < db->nProgressOps ); + nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); + }else{ + nProgressLimit = 0xffffffff; + } +#endif + if( p->rc==SQLITE_NOMEM ){ + /* This happens if a malloc() inside a call to sqlite3_column_text() or + ** sqlite3_column_text16() failed. */ + goto no_mem; + } + assert( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_BUSY ); + testcase( p->rc!=SQLITE_OK ); + p->rc = SQLITE_OK; + assert( p->bIsReader || p->readOnly!=0 ); + p->iCurrentTime = 0; + assert( p->explain==0 ); + p->pResultSet = 0; + db->busyHandler.nBusy = 0; + if( AtomicLoad(&db->u1.isInterrupted) ) goto abort_due_to_interrupt; + sqlite3VdbeIOTraceSql(p); +#ifdef SQLITE_DEBUG + sqlite3BeginBenignMalloc(); + if( p->pc==0 + && (p->db->flags & (SQLITE_VdbeListing|SQLITE_VdbeEQP|SQLITE_VdbeTrace))!=0 + ){ + int i; + int once = 1; + sqlite3VdbePrintSql(p); + if( p->db->flags & SQLITE_VdbeListing ){ + printf("VDBE Program Listing:\n"); + for(i=0; inOp; i++){ + sqlite3VdbePrintOp(stdout, i, &aOp[i]); + } + } + if( p->db->flags & SQLITE_VdbeEQP ){ + for(i=0; inOp; i++){ + if( aOp[i].opcode==OP_Explain ){ + if( once ) printf("VDBE Query Plan:\n"); + printf("%s\n", aOp[i].p4.z); + once = 0; + } + } + } + if( p->db->flags & SQLITE_VdbeTrace ) printf("VDBE Trace:\n"); + } + sqlite3EndBenignMalloc(); +#endif + for(pOp=&aOp[p->pc]; 1; pOp++){ + /* Errors are detected by individual opcodes, with an immediate + ** jumps to abort_due_to_error. */ + assert( rc==SQLITE_OK ); + + assert( pOp>=aOp && pOp<&aOp[p->nOp]); +#ifdef VDBE_PROFILE + start = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime(); +#endif + nVmStep++; +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + if( p->anExec ) p->anExec[(int)(pOp-aOp)]++; +#endif + + /* Only allow tracing if SQLITE_DEBUG is defined. + */ +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeTrace ){ + sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); + test_trace_breakpoint((int)(pOp - aOp),pOp,p); + } +#endif + + + /* Check to see if we need to simulate an interrupt. This only happens + ** if we have a special test build. + */ +#ifdef SQLITE_TEST + if( sqlite3_interrupt_count>0 ){ + sqlite3_interrupt_count--; + if( sqlite3_interrupt_count==0 ){ + sqlite3_interrupt(db); + } + } +#endif + + /* Sanity checking on other operands */ +#ifdef SQLITE_DEBUG + { + u8 opProperty = sqlite3OpcodeProperty[pOp->opcode]; + if( (opProperty & OPFLG_IN1)!=0 ){ + assert( pOp->p1>0 ); + assert( pOp->p1<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p1]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p1]) ); + REGISTER_TRACE(pOp->p1, &aMem[pOp->p1]); + } + if( (opProperty & OPFLG_IN2)!=0 ){ + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p2]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p2]) ); + REGISTER_TRACE(pOp->p2, &aMem[pOp->p2]); + } + if( (opProperty & OPFLG_IN3)!=0 ){ + assert( pOp->p3>0 ); + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p3]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p3]) ); + REGISTER_TRACE(pOp->p3, &aMem[pOp->p3]); + } + if( (opProperty & OPFLG_OUT2)!=0 ){ + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + memAboutToChange(p, &aMem[pOp->p2]); + } + if( (opProperty & OPFLG_OUT3)!=0 ){ + assert( pOp->p3>0 ); + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + memAboutToChange(p, &aMem[pOp->p3]); + } + } +#endif +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + pOrigOp = pOp; +#endif + + switch( pOp->opcode ){ + +/***************************************************************************** +** What follows is a massive switch statement where each case implements a +** separate instruction in the virtual machine. If we follow the usual +** indentation conventions, each case should be indented by 6 spaces. But +** that is a lot of wasted space on the left margin. So the code within +** the switch statement will break with convention and be flush-left. Another +** big comment (similar to this one) will mark the point in the code where +** we transition back to normal indentation. +** +** The formatting of each case is important. The makefile for SQLite +** generates two C files "opcodes.h" and "opcodes.c" by scanning this +** file looking for lines that begin with "case OP_". The opcodes.h files +** will be filled with #defines that give unique integer values to each +** opcode and the opcodes.c file is filled with an array of strings where +** each string is the symbolic name for the corresponding opcode. If the +** case statement is followed by a comment of the form "/# same as ... #/" +** that comment is used to determine the particular value of the opcode. +** +** Other keywords in the comment that follows each case are used to +** construct the OPFLG_INITIALIZER value that initializes opcodeProperty[]. +** Keywords include: in1, in2, in3, out2, out3. See +** the mkopcodeh.awk script for additional information. +** +** Documentation about VDBE opcodes is generated by scanning this file +** for lines of that contain "Opcode:". That line and all subsequent +** comment lines are used in the generation of the opcode.html documentation +** file. +** +** SUMMARY: +** +** Formatting is important to scripts that scan this file. +** Do not deviate from the formatting style currently in use. +** +*****************************************************************************/ + +/* Opcode: Goto * P2 * * * +** +** An unconditional jump to address P2. +** The next instruction executed will be +** the one at index P2 from the beginning of +** the program. +** +** The P1 parameter is not actually used by this opcode. However, it +** is sometimes set to 1 instead of 0 as a hint to the command-line shell +** that this Goto is the bottom of a loop and that the lines from P2 down +** to the current line should be indented for EXPLAIN output. +*/ +case OP_Goto: { /* jump */ + +#ifdef SQLITE_DEBUG + /* In debuggging mode, when the p5 flags is set on an OP_Goto, that + ** means we should really jump back to the preceeding OP_ReleaseReg + ** instruction. */ + if( pOp->p5 ){ + assert( pOp->p2 < (int)(pOp - aOp) ); + assert( pOp->p2 > 1 ); + pOp = &aOp[pOp->p2 - 2]; + assert( pOp[1].opcode==OP_ReleaseReg ); + goto check_for_interrupt; + } +#endif + +jump_to_p2_and_check_for_interrupt: + pOp = &aOp[pOp->p2 - 1]; + + /* Opcodes that are used as the bottom of a loop (OP_Next, OP_Prev, + ** OP_VNext, or OP_SorterNext) all jump here upon + ** completion. Check to see if sqlite3_interrupt() has been called + ** or if the progress callback needs to be invoked. + ** + ** This code uses unstructured "goto" statements and does not look clean. + ** But that is not due to sloppy coding habits. The code is written this + ** way for performance, to avoid having to run the interrupt and progress + ** checks on every opcode. This helps sqlite3_step() to run about 1.5% + ** faster according to "valgrind --tool=cachegrind" */ +check_for_interrupt: + if( AtomicLoad(&db->u1.isInterrupted) ) goto abort_due_to_interrupt; +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + /* Call the progress callback if it is configured and the required number + ** of VDBE ops have been executed (either since this invocation of + ** sqlite3VdbeExec() or since last time the progress callback was called). + ** If the progress callback returns non-zero, exit the virtual machine with + ** a return code SQLITE_ABORT. + */ + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + assert( db->nProgressOps!=0 ); + nProgressLimit += db->nProgressOps; + if( db->xProgress(db->pProgressArg) ){ + nProgressLimit = 0xffffffff; + rc = SQLITE_INTERRUPT; + goto abort_due_to_error; + } + } +#endif + + break; +} + +/* Opcode: Gosub P1 P2 * * * +** +** Write the current address onto register P1 +** and then jump to address P2. +*/ +case OP_Gosub: { /* jump */ + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pIn1 = &aMem[pOp->p1]; + assert( VdbeMemDynamic(pIn1)==0 ); + memAboutToChange(p, pIn1); + pIn1->flags = MEM_Int; + pIn1->u.i = (int)(pOp-aOp); + REGISTER_TRACE(pOp->p1, pIn1); + + /* Most jump operations do a goto to this spot in order to update + ** the pOp pointer. */ +jump_to_p2: + pOp = &aOp[pOp->p2 - 1]; + break; +} + +/* Opcode: Return P1 * * * * +** +** Jump to the next instruction after the address in register P1. After +** the jump, register P1 becomes undefined. +*/ +case OP_Return: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags==MEM_Int ); + pOp = &aOp[pIn1->u.i]; + pIn1->flags = MEM_Undefined; + break; +} + +/* Opcode: InitCoroutine P1 P2 P3 * * +** +** Set up register P1 so that it will Yield to the coroutine +** located at address P3. +** +** If P2!=0 then the coroutine implementation immediately follows +** this opcode. So jump over the coroutine implementation to +** address P2. +** +** See also: EndCoroutine +*/ +case OP_InitCoroutine: { /* jump */ + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + assert( pOp->p2>=0 && pOp->p2nOp ); + assert( pOp->p3>=0 && pOp->p3nOp ); + pOut = &aMem[pOp->p1]; + assert( !VdbeMemDynamic(pOut) ); + pOut->u.i = pOp->p3 - 1; + pOut->flags = MEM_Int; + if( pOp->p2 ) goto jump_to_p2; + break; +} + +/* Opcode: EndCoroutine P1 * * * * +** +** The instruction at the address in register P1 is a Yield. +** Jump to the P2 parameter of that Yield. +** After the jump, register P1 becomes undefined. +** +** See also: InitCoroutine +*/ +case OP_EndCoroutine: { /* in1 */ + VdbeOp *pCaller; + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags==MEM_Int ); + assert( pIn1->u.i>=0 && pIn1->u.inOp ); + pCaller = &aOp[pIn1->u.i]; + assert( pCaller->opcode==OP_Yield ); + assert( pCaller->p2>=0 && pCaller->p2nOp ); + pOp = &aOp[pCaller->p2 - 1]; + pIn1->flags = MEM_Undefined; + break; +} + +/* Opcode: Yield P1 P2 * * * +** +** Swap the program counter with the value in register P1. This +** has the effect of yielding to a coroutine. +** +** If the coroutine that is launched by this instruction ends with +** Yield or Return then continue to the next instruction. But if +** the coroutine launched by this instruction ends with +** EndCoroutine, then jump to P2 rather than continuing with the +** next instruction. +** +** See also: InitCoroutine +*/ +case OP_Yield: { /* in1, jump */ + int pcDest; + pIn1 = &aMem[pOp->p1]; + assert( VdbeMemDynamic(pIn1)==0 ); + pIn1->flags = MEM_Int; + pcDest = (int)pIn1->u.i; + pIn1->u.i = (int)(pOp - aOp); + REGISTER_TRACE(pOp->p1, pIn1); + pOp = &aOp[pcDest]; + break; +} + +/* Opcode: HaltIfNull P1 P2 P3 P4 P5 +** Synopsis: if r[P3]=null halt +** +** Check the value in register P3. If it is NULL then Halt using +** parameter P1, P2, and P4 as if this were a Halt instruction. If the +** value in register P3 is not NULL, then this routine is a no-op. +** The P5 parameter should be 1. +*/ +case OP_HaltIfNull: { /* in3 */ + pIn3 = &aMem[pOp->p3]; +#ifdef SQLITE_DEBUG + if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); } +#endif + if( (pIn3->flags & MEM_Null)==0 ) break; + /* Fall through into OP_Halt */ +} + +/* Opcode: Halt P1 P2 * P4 P5 +** +** Exit immediately. All open cursors, etc are closed +** automatically. +** +** P1 is the result code returned by sqlite3_exec(), sqlite3_reset(), +** or sqlite3_finalize(). For a normal halt, this should be SQLITE_OK (0). +** For errors, it can be some other value. If P1!=0 then P2 will determine +** whether or not to rollback the current transaction. Do not rollback +** if P2==OE_Fail. Do the rollback if P2==OE_Rollback. If P2==OE_Abort, +** then back out all changes that have occurred during this execution of the +** VDBE, but do not rollback the transaction. +** +** If P4 is not null then it is an error message string. +** +** P5 is a value between 0 and 4, inclusive, that modifies the P4 string. +** +** 0: (no change) +** 1: NOT NULL contraint failed: P4 +** 2: UNIQUE constraint failed: P4 +** 3: CHECK constraint failed: P4 +** 4: FOREIGN KEY constraint failed: P4 +** +** If P5 is not zero and P4 is NULL, then everything after the ":" is +** omitted. +** +** There is an implied "Halt 0 0 0" instruction inserted at the very end of +** every program. So a jump past the last instruction of the program +** is the same as executing Halt. +*/ +case OP_Halt: { + VdbeFrame *pFrame; + int pcx; + + pcx = (int)(pOp - aOp); +#ifdef SQLITE_DEBUG + if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); } +#endif + if( pOp->p1==SQLITE_OK && p->pFrame ){ + /* Halt the sub-program. Return control to the parent frame. */ + pFrame = p->pFrame; + p->pFrame = pFrame->pParent; + p->nFrame--; + sqlite3VdbeSetChanges(db, p->nChange); + pcx = sqlite3VdbeFrameRestore(pFrame); + if( pOp->p2==OE_Ignore ){ + /* Instruction pcx is the OP_Program that invoked the sub-program + ** currently being halted. If the p2 instruction of this OP_Halt + ** instruction is set to OE_Ignore, then the sub-program is throwing + ** an IGNORE exception. In this case jump to the address specified + ** as the p2 of the calling OP_Program. */ + pcx = p->aOp[pcx].p2-1; + } + aOp = p->aOp; + aMem = p->aMem; + pOp = &aOp[pcx]; + break; + } + p->rc = pOp->p1; + p->errorAction = (u8)pOp->p2; + p->pc = pcx; + assert( pOp->p5<=4 ); + if( p->rc ){ + if( pOp->p5 ){ + static const char * const azType[] = { "NOT NULL", "UNIQUE", "CHECK", + "FOREIGN KEY" }; + testcase( pOp->p5==1 ); + testcase( pOp->p5==2 ); + testcase( pOp->p5==3 ); + testcase( pOp->p5==4 ); + sqlite3VdbeError(p, "%s constraint failed", azType[pOp->p5-1]); + if( pOp->p4.z ){ + p->zErrMsg = sqlite3MPrintf(db, "%z: %s", p->zErrMsg, pOp->p4.z); + } + }else{ + sqlite3VdbeError(p, "%s", pOp->p4.z); + } + sqlite3_log(pOp->p1, "abort at %d in [%s]: %s", pcx, p->zSql, p->zErrMsg); + } + rc = sqlite3VdbeHalt(p); + assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR ); + if( rc==SQLITE_BUSY ){ + p->rc = SQLITE_BUSY; + }else{ + assert( rc==SQLITE_OK || (p->rc&0xff)==SQLITE_CONSTRAINT ); + assert( rc==SQLITE_OK || db->nDeferredCons>0 || db->nDeferredImmCons>0 ); + rc = p->rc ? SQLITE_ERROR : SQLITE_DONE; + } + goto vdbe_return; +} + +/* Opcode: Integer P1 P2 * * * +** Synopsis: r[P2]=P1 +** +** The 32-bit integer value P1 is written into register P2. +*/ +case OP_Integer: { /* out2 */ + pOut = out2Prerelease(p, pOp); + pOut->u.i = pOp->p1; + break; +} + +/* Opcode: Int64 * P2 * P4 * +** Synopsis: r[P2]=P4 +** +** P4 is a pointer to a 64-bit integer value. +** Write that value into register P2. +*/ +case OP_Int64: { /* out2 */ + pOut = out2Prerelease(p, pOp); + assert( pOp->p4.pI64!=0 ); + pOut->u.i = *pOp->p4.pI64; + break; +} + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* Opcode: Real * P2 * P4 * +** Synopsis: r[P2]=P4 +** +** P4 is a pointer to a 64-bit floating point value. +** Write that value into register P2. +*/ +case OP_Real: { /* same as TK_FLOAT, out2 */ + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Real; + assert( !sqlite3IsNaN(*pOp->p4.pReal) ); + pOut->u.r = *pOp->p4.pReal; + break; +} +#endif + +/* Opcode: String8 * P2 * P4 * +** Synopsis: r[P2]='P4' +** +** P4 points to a nul terminated UTF-8 string. This opcode is transformed +** into a String opcode before it is executed for the first time. During +** this transformation, the length of string P4 is computed and stored +** as the P1 parameter. +*/ +case OP_String8: { /* same as TK_STRING, out2 */ + assert( pOp->p4.z!=0 ); + pOut = out2Prerelease(p, pOp); + pOp->p1 = sqlite3Strlen30(pOp->p4.z); + +#ifndef SQLITE_OMIT_UTF16 + if( encoding!=SQLITE_UTF8 ){ + rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC); + assert( rc==SQLITE_OK || rc==SQLITE_TOOBIG ); + if( rc ) goto too_big; + if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem; + assert( pOut->szMalloc>0 && pOut->zMalloc==pOut->z ); + assert( VdbeMemDynamic(pOut)==0 ); + pOut->szMalloc = 0; + pOut->flags |= MEM_Static; + if( pOp->p4type==P4_DYNAMIC ){ + sqlite3DbFree(db, pOp->p4.z); + } + pOp->p4type = P4_DYNAMIC; + pOp->p4.z = pOut->z; + pOp->p1 = pOut->n; + } +#endif + if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + pOp->opcode = OP_String; + assert( rc==SQLITE_OK ); + /* Fall through to the next case, OP_String */ +} + +/* Opcode: String P1 P2 P3 P4 P5 +** Synopsis: r[P2]='P4' (len=P1) +** +** The string value P4 of length P1 (bytes) is stored in register P2. +** +** If P3 is not zero and the content of register P3 is equal to P5, then +** the datatype of the register P2 is converted to BLOB. The content is +** the same sequence of bytes, it is merely interpreted as a BLOB instead +** of a string, as if it had been CAST. In other words: +** +** if( P3!=0 and reg[P3]==P5 ) reg[P2] := CAST(reg[P2] as BLOB) +*/ +case OP_String: { /* out2 */ + assert( pOp->p4.z!=0 ); + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Str|MEM_Static|MEM_Term; + pOut->z = pOp->p4.z; + pOut->n = pOp->p1; + pOut->enc = encoding; + UPDATE_MAX_BLOBSIZE(pOut); +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( pOp->p3>0 ){ + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + pIn3 = &aMem[pOp->p3]; + assert( pIn3->flags & MEM_Int ); + if( pIn3->u.i==pOp->p5 ) pOut->flags = MEM_Blob|MEM_Static|MEM_Term; + } +#endif + break; +} + +/* Opcode: Null P1 P2 P3 * * +** Synopsis: r[P2..P3]=NULL +** +** Write a NULL into registers P2. If P3 greater than P2, then also write +** NULL into register P3 and every register in between P2 and P3. If P3 +** is less than P2 (typically P3 is zero) then only register P2 is +** set to NULL. +** +** If the P1 value is non-zero, then also set the MEM_Cleared flag so that +** NULL values will not compare equal even if SQLITE_NULLEQ is set on +** OP_Ne or OP_Eq. +*/ +case OP_Null: { /* out2 */ + int cnt; + u16 nullFlag; + pOut = out2Prerelease(p, pOp); + cnt = pOp->p3-pOp->p2; + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + pOut->flags = nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null; + pOut->n = 0; +#ifdef SQLITE_DEBUG + pOut->uTemp = 0; +#endif + while( cnt>0 ){ + pOut++; + memAboutToChange(p, pOut); + sqlite3VdbeMemSetNull(pOut); + pOut->flags = nullFlag; + pOut->n = 0; + cnt--; + } + break; +} + +/* Opcode: SoftNull P1 * * * * +** Synopsis: r[P1]=NULL +** +** Set register P1 to have the value NULL as seen by the OP_MakeRecord +** instruction, but do not free any string or blob memory associated with +** the register, so that if the value was a string or blob that was +** previously copied using OP_SCopy, the copies will continue to be valid. +*/ +case OP_SoftNull: { + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pOut = &aMem[pOp->p1]; + pOut->flags = (pOut->flags&~(MEM_Undefined|MEM_AffMask))|MEM_Null; + break; +} + +/* Opcode: Blob P1 P2 * P4 * +** Synopsis: r[P2]=P4 (len=P1) +** +** P4 points to a blob of data P1 bytes long. Store this +** blob in register P2. +*/ +case OP_Blob: { /* out2 */ + assert( pOp->p1 <= SQLITE_MAX_LENGTH ); + pOut = out2Prerelease(p, pOp); + sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0); + pOut->enc = encoding; + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Variable P1 P2 * P4 * +** Synopsis: r[P2]=parameter(P1,P4) +** +** Transfer the values of bound parameter P1 into register P2 +** +** If the parameter is named, then its name appears in P4. +** The P4 value is used by sqlite3_bind_parameter_name(). +*/ +case OP_Variable: { /* out2 */ + Mem *pVar; /* Value being transferred */ + + assert( pOp->p1>0 && pOp->p1<=p->nVar ); + assert( pOp->p4.z==0 || pOp->p4.z==sqlite3VListNumToName(p->pVList,pOp->p1) ); + pVar = &p->aVar[pOp->p1 - 1]; + if( sqlite3VdbeMemTooBig(pVar) ){ + goto too_big; + } + pOut = &aMem[pOp->p2]; + if( VdbeMemDynamic(pOut) ) sqlite3VdbeMemSetNull(pOut); + memcpy(pOut, pVar, MEMCELLSIZE); + pOut->flags &= ~(MEM_Dyn|MEM_Ephem); + pOut->flags |= MEM_Static|MEM_FromBind; + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Move P1 P2 P3 * * +** Synopsis: r[P2@P3]=r[P1@P3] +** +** Move the P3 values in register P1..P1+P3-1 over into +** registers P2..P2+P3-1. Registers P1..P1+P3-1 are +** left holding a NULL. It is an error for register ranges +** P1..P1+P3-1 and P2..P2+P3-1 to overlap. It is an error +** for P3 to be less than 1. +*/ +case OP_Move: { + int n; /* Number of registers left to copy */ + int p1; /* Register to copy from */ + int p2; /* Register to copy to */ + + n = pOp->p3; + p1 = pOp->p1; + p2 = pOp->p2; + assert( n>0 && p1>0 && p2>0 ); + assert( p1+n<=p2 || p2+n<=p1 ); + + pIn1 = &aMem[p1]; + pOut = &aMem[p2]; + do{ + assert( pOut<=&aMem[(p->nMem+1 - p->nCursor)] ); + assert( pIn1<=&aMem[(p->nMem+1 - p->nCursor)] ); + assert( memIsValid(pIn1) ); + memAboutToChange(p, pOut); + sqlite3VdbeMemMove(pOut, pIn1); +#ifdef SQLITE_DEBUG + pIn1->pScopyFrom = 0; + { int i; + for(i=1; inMem; i++){ + if( aMem[i].pScopyFrom==pIn1 ){ + aMem[i].pScopyFrom = pOut; + } + } + } +#endif + Deephemeralize(pOut); + REGISTER_TRACE(p2++, pOut); + pIn1++; + pOut++; + }while( --n ); + break; +} + +/* Opcode: Copy P1 P2 P3 * * +** Synopsis: r[P2@P3+1]=r[P1@P3+1] +** +** Make a copy of registers P1..P1+P3 into registers P2..P2+P3. +** +** This instruction makes a deep copy of the value. A duplicate +** is made of any string or blob constant. See also OP_SCopy. +*/ +case OP_Copy: { + int n; + + n = pOp->p3; + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + assert( pOut!=pIn1 ); + while( 1 ){ + memAboutToChange(p, pOut); + sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); + Deephemeralize(pOut); +#ifdef SQLITE_DEBUG + pOut->pScopyFrom = 0; +#endif + REGISTER_TRACE(pOp->p2+pOp->p3-n, pOut); + if( (n--)==0 ) break; + pOut++; + pIn1++; + } + break; +} + +/* Opcode: SCopy P1 P2 * * * +** Synopsis: r[P2]=r[P1] +** +** Make a shallow copy of register P1 into register P2. +** +** This instruction makes a shallow copy of the value. If the value +** is a string or blob, then the copy is only a pointer to the +** original and hence if the original changes so will the copy. +** Worse, if the original is deallocated, the copy becomes invalid. +** Thus the program must guarantee that the original will not change +** during the lifetime of the copy. Use OP_Copy to make a complete +** copy. +*/ +case OP_SCopy: { /* out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + assert( pOut!=pIn1 ); + sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); +#ifdef SQLITE_DEBUG + pOut->pScopyFrom = pIn1; + pOut->mScopyFlags = pIn1->flags; +#endif + break; +} + +/* Opcode: IntCopy P1 P2 * * * +** Synopsis: r[P2]=r[P1] +** +** Transfer the integer value held in register P1 into register P2. +** +** This is an optimized version of SCopy that works only for integer +** values. +*/ +case OP_IntCopy: { /* out2 */ + pIn1 = &aMem[pOp->p1]; + assert( (pIn1->flags & MEM_Int)!=0 ); + pOut = &aMem[pOp->p2]; + sqlite3VdbeMemSetInt64(pOut, pIn1->u.i); + break; +} + +/* Opcode: ResultRow P1 P2 * * * +** Synopsis: output=r[P1@P2] +** +** The registers P1 through P1+P2-1 contain a single row of +** results. This opcode causes the sqlite3_step() call to terminate +** with an SQLITE_ROW return code and it sets up the sqlite3_stmt +** structure to provide access to the r(P1)..r(P1+P2-1) values as +** the result row. +*/ +case OP_ResultRow: { + Mem *pMem; + int i; + assert( p->nResColumn==pOp->p2 ); + assert( pOp->p1>0 ); + assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); + + /* If this statement has violated immediate foreign key constraints, do + ** not return the number of rows modified. And do not RELEASE the statement + ** transaction. It needs to be rolled back. */ + if( SQLITE_OK!=(rc = sqlite3VdbeCheckFk(p, 0)) ){ + assert( db->flags&SQLITE_CountRows ); + assert( p->usesStmtJournal ); + goto abort_due_to_error; + } + + /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then + ** DML statements invoke this opcode to return the number of rows + ** modified to the user. This is the only way that a VM that + ** opens a statement transaction may invoke this opcode. + ** + ** In case this is such a statement, close any statement transaction + ** opened by this VM before returning control to the user. This is to + ** ensure that statement-transactions are always nested, not overlapping. + ** If the open statement-transaction is not closed here, then the user + ** may step another VM that opens its own statement transaction. This + ** may lead to overlapping statement transactions. + ** + ** The statement transaction is never a top-level transaction. Hence + ** the RELEASE call below can never fail. + */ + assert( p->iStatement==0 || db->flags&SQLITE_CountRows ); + rc = sqlite3VdbeCloseStatement(p, SAVEPOINT_RELEASE); + assert( rc==SQLITE_OK ); + + /* Invalidate all ephemeral cursor row caches */ + p->cacheCtr = (p->cacheCtr + 2)|1; + + /* Make sure the results of the current row are \000 terminated + ** and have an assigned type. The results are de-ephemeralized as + ** a side effect. + */ + pMem = p->pResultSet = &aMem[pOp->p1]; + for(i=0; ip2; i++){ + assert( memIsValid(&pMem[i]) ); + Deephemeralize(&pMem[i]); + assert( (pMem[i].flags & MEM_Ephem)==0 + || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 ); + sqlite3VdbeMemNulTerminate(&pMem[i]); + REGISTER_TRACE(pOp->p1+i, &pMem[i]); +#ifdef SQLITE_DEBUG + /* The registers in the result will not be used again when the + ** prepared statement restarts. This is because sqlite3_column() + ** APIs might have caused type conversions of made other changes to + ** the register values. Therefore, we can go ahead and break any + ** OP_SCopy dependencies. */ + pMem[i].pScopyFrom = 0; +#endif + } + if( db->mallocFailed ) goto no_mem; + + if( db->mTrace & SQLITE_TRACE_ROW ){ + db->xTrace(SQLITE_TRACE_ROW, db->pTraceArg, p, 0); + } + + + /* Return SQLITE_ROW + */ + p->pc = (int)(pOp - aOp) + 1; + rc = SQLITE_ROW; + goto vdbe_return; +} + +/* Opcode: Concat P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]+r[P1] +** +** Add the text in register P1 onto the end of the text in +** register P2 and store the result in register P3. +** If either the P1 or P2 text are NULL then store NULL in P3. +** +** P3 = P2 || P1 +** +** It is illegal for P1 and P3 to be the same register. Sometimes, +** if P3 is the same register as P2, the implementation is able +** to avoid a memcpy(). +*/ +case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ + i64 nByte; /* Total size of the output string or blob */ + u16 flags1; /* Initial flags for P1 */ + u16 flags2; /* Initial flags for P2 */ + + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + pOut = &aMem[pOp->p3]; + testcase( pOut==pIn2 ); + assert( pIn1!=pOut ); + flags1 = pIn1->flags; + testcase( flags1 & MEM_Null ); + testcase( pIn2->flags & MEM_Null ); + if( (flags1 | pIn2->flags) & MEM_Null ){ + sqlite3VdbeMemSetNull(pOut); + break; + } + if( (flags1 & (MEM_Str|MEM_Blob))==0 ){ + if( sqlite3VdbeMemStringify(pIn1,encoding,0) ) goto no_mem; + flags1 = pIn1->flags & ~MEM_Str; + }else if( (flags1 & MEM_Zero)!=0 ){ + if( sqlite3VdbeMemExpandBlob(pIn1) ) goto no_mem; + flags1 = pIn1->flags & ~MEM_Str; + } + flags2 = pIn2->flags; + if( (flags2 & (MEM_Str|MEM_Blob))==0 ){ + if( sqlite3VdbeMemStringify(pIn2,encoding,0) ) goto no_mem; + flags2 = pIn2->flags & ~MEM_Str; + }else if( (flags2 & MEM_Zero)!=0 ){ + if( sqlite3VdbeMemExpandBlob(pIn2) ) goto no_mem; + flags2 = pIn2->flags & ~MEM_Str; + } + nByte = pIn1->n + pIn2->n; + if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + if( sqlite3VdbeMemGrow(pOut, (int)nByte+3, pOut==pIn2) ){ + goto no_mem; + } + MemSetTypeFlag(pOut, MEM_Str); + if( pOut!=pIn2 ){ + memcpy(pOut->z, pIn2->z, pIn2->n); + assert( (pIn2->flags & MEM_Dyn) == (flags2 & MEM_Dyn) ); + pIn2->flags = flags2; + } + memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n); + assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); + pIn1->flags = flags1; + pOut->z[nByte]=0; + pOut->z[nByte+1] = 0; + pOut->z[nByte+2] = 0; + pOut->flags |= MEM_Term; + pOut->n = (int)nByte; + pOut->enc = encoding; + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Add P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]+r[P2] +** +** Add the value in register P1 to the value in register P2 +** and store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: Multiply P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]*r[P2] +** +** +** Multiply the value in register P1 by the value in register P2 +** and store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: Subtract P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]-r[P1] +** +** Subtract the value in register P1 from the value in register P2 +** and store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: Divide P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]/r[P1] +** +** Divide the value in register P1 by the value in register P2 +** and store the result in register P3 (P3=P2/P1). If the value in +** register P1 is zero, then the result is NULL. If either input is +** NULL, the result is NULL. +*/ +/* Opcode: Remainder P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]%r[P1] +** +** Compute the remainder after integer register P2 is divided by +** register P1 and store the result in register P3. +** If the value in register P1 is zero the result is NULL. +** If either operand is NULL, the result is NULL. +*/ +case OP_Add: /* same as TK_PLUS, in1, in2, out3 */ +case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */ +case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */ +case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */ +case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ + u16 flags; /* Combined MEM_* flags from both inputs */ + u16 type1; /* Numeric type of left operand */ + u16 type2; /* Numeric type of right operand */ + i64 iA; /* Integer value of left operand */ + i64 iB; /* Integer value of right operand */ + double rA; /* Real value of left operand */ + double rB; /* Real value of right operand */ + + pIn1 = &aMem[pOp->p1]; + type1 = numericType(pIn1); + pIn2 = &aMem[pOp->p2]; + type2 = numericType(pIn2); + pOut = &aMem[pOp->p3]; + flags = pIn1->flags | pIn2->flags; + if( (type1 & type2 & MEM_Int)!=0 ){ + iA = pIn1->u.i; + iB = pIn2->u.i; + switch( pOp->opcode ){ + case OP_Add: if( sqlite3AddInt64(&iB,iA) ) goto fp_math; break; + case OP_Subtract: if( sqlite3SubInt64(&iB,iA) ) goto fp_math; break; + case OP_Multiply: if( sqlite3MulInt64(&iB,iA) ) goto fp_math; break; + case OP_Divide: { + if( iA==0 ) goto arithmetic_result_is_null; + if( iA==-1 && iB==SMALLEST_INT64 ) goto fp_math; + iB /= iA; + break; + } + default: { + if( iA==0 ) goto arithmetic_result_is_null; + if( iA==-1 ) iA = 1; + iB %= iA; + break; + } + } + pOut->u.i = iB; + MemSetTypeFlag(pOut, MEM_Int); + }else if( (flags & MEM_Null)!=0 ){ + goto arithmetic_result_is_null; + }else{ +fp_math: + rA = sqlite3VdbeRealValue(pIn1); + rB = sqlite3VdbeRealValue(pIn2); + switch( pOp->opcode ){ + case OP_Add: rB += rA; break; + case OP_Subtract: rB -= rA; break; + case OP_Multiply: rB *= rA; break; + case OP_Divide: { + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + if( rA==(double)0 ) goto arithmetic_result_is_null; + rB /= rA; + break; + } + default: { + iA = sqlite3VdbeIntValue(pIn1); + iB = sqlite3VdbeIntValue(pIn2); + if( iA==0 ) goto arithmetic_result_is_null; + if( iA==-1 ) iA = 1; + rB = (double)(iB % iA); + break; + } + } +#ifdef SQLITE_OMIT_FLOATING_POINT + pOut->u.i = rB; + MemSetTypeFlag(pOut, MEM_Int); +#else + if( sqlite3IsNaN(rB) ){ + goto arithmetic_result_is_null; + } + pOut->u.r = rB; + MemSetTypeFlag(pOut, MEM_Real); +#endif + } + break; + +arithmetic_result_is_null: + sqlite3VdbeMemSetNull(pOut); + break; +} + +/* Opcode: CollSeq P1 * * P4 +** +** P4 is a pointer to a CollSeq object. If the next call to a user function +** or aggregate calls sqlite3GetFuncCollSeq(), this collation sequence will +** be returned. This is used by the built-in min(), max() and nullif() +** functions. +** +** If P1 is not zero, then it is a register that a subsequent min() or +** max() aggregate will set to 1 if the current row is not the minimum or +** maximum. The P1 register is initialized to 0 by this instruction. +** +** The interface used by the implementation of the aforementioned functions +** to retrieve the collation sequence set by this opcode is not available +** publicly. Only built-in functions have access to this feature. +*/ +case OP_CollSeq: { + assert( pOp->p4type==P4_COLLSEQ ); + if( pOp->p1 ){ + sqlite3VdbeMemSetInt64(&aMem[pOp->p1], 0); + } + break; +} + +/* Opcode: BitAnd P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]&r[P2] +** +** Take the bit-wise AND of the values in register P1 and P2 and +** store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: BitOr P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]|r[P2] +** +** Take the bit-wise OR of the values in register P1 and P2 and +** store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: ShiftLeft P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]<>r[P1] +** +** Shift the integer value in register P2 to the right by the +** number of bits specified by the integer in register P1. +** Store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +case OP_BitAnd: /* same as TK_BITAND, in1, in2, out3 */ +case OP_BitOr: /* same as TK_BITOR, in1, in2, out3 */ +case OP_ShiftLeft: /* same as TK_LSHIFT, in1, in2, out3 */ +case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */ + i64 iA; + u64 uA; + i64 iB; + u8 op; + + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + pOut = &aMem[pOp->p3]; + if( (pIn1->flags | pIn2->flags) & MEM_Null ){ + sqlite3VdbeMemSetNull(pOut); + break; + } + iA = sqlite3VdbeIntValue(pIn2); + iB = sqlite3VdbeIntValue(pIn1); + op = pOp->opcode; + if( op==OP_BitAnd ){ + iA &= iB; + }else if( op==OP_BitOr ){ + iA |= iB; + }else if( iB!=0 ){ + assert( op==OP_ShiftRight || op==OP_ShiftLeft ); + + /* If shifting by a negative amount, shift in the other direction */ + if( iB<0 ){ + assert( OP_ShiftRight==OP_ShiftLeft+1 ); + op = 2*OP_ShiftLeft + 1 - op; + iB = iB>(-64) ? -iB : 64; + } + + if( iB>=64 ){ + iA = (iA>=0 || op==OP_ShiftLeft) ? 0 : -1; + }else{ + memcpy(&uA, &iA, sizeof(uA)); + if( op==OP_ShiftLeft ){ + uA <<= iB; + }else{ + uA >>= iB; + /* Sign-extend on a right shift of a negative number */ + if( iA<0 ) uA |= ((((u64)0xffffffff)<<32)|0xffffffff) << (64-iB); + } + memcpy(&iA, &uA, sizeof(iA)); + } + } + pOut->u.i = iA; + MemSetTypeFlag(pOut, MEM_Int); + break; +} + +/* Opcode: AddImm P1 P2 * * * +** Synopsis: r[P1]=r[P1]+P2 +** +** Add the constant P2 to the value in register P1. +** The result is always an integer. +** +** To force any register to be an integer, just add 0. +*/ +case OP_AddImm: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + memAboutToChange(p, pIn1); + sqlite3VdbeMemIntegerify(pIn1); + pIn1->u.i += pOp->p2; + break; +} + +/* Opcode: MustBeInt P1 P2 * * * +** +** Force the value in register P1 to be an integer. If the value +** in P1 is not an integer and cannot be converted into an integer +** without data loss, then jump immediately to P2, or if P2==0 +** raise an SQLITE_MISMATCH exception. +*/ +case OP_MustBeInt: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + if( (pIn1->flags & MEM_Int)==0 ){ + applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding); + if( (pIn1->flags & MEM_Int)==0 ){ + VdbeBranchTaken(1, 2); + if( pOp->p2==0 ){ + rc = SQLITE_MISMATCH; + goto abort_due_to_error; + }else{ + goto jump_to_p2; + } + } + } + VdbeBranchTaken(0, 2); + MemSetTypeFlag(pIn1, MEM_Int); + break; +} + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* Opcode: RealAffinity P1 * * * * +** +** If register P1 holds an integer convert it to a real value. +** +** This opcode is used when extracting information from a column that +** has REAL affinity. Such column values may still be stored as +** integers, for space efficiency, but after extraction we want them +** to have only a real value. +*/ +case OP_RealAffinity: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + if( pIn1->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pIn1->flags & MEM_Int ); + testcase( pIn1->flags & MEM_IntReal ); + sqlite3VdbeMemRealify(pIn1); + REGISTER_TRACE(pOp->p1, pIn1); + } + break; +} +#endif + +#ifndef SQLITE_OMIT_CAST +/* Opcode: Cast P1 P2 * * * +** Synopsis: affinity(r[P1]) +** +** Force the value in register P1 to be the type defined by P2. +** +**
      +**
    • P2=='A' → BLOB +**
    • P2=='B' → TEXT +**
    • P2=='C' → NUMERIC +**
    • P2=='D' → INTEGER +**
    • P2=='E' → REAL +**
    +** +** A NULL value is not changed by this routine. It remains NULL. +*/ +case OP_Cast: { /* in1 */ + assert( pOp->p2>=SQLITE_AFF_BLOB && pOp->p2<=SQLITE_AFF_REAL ); + testcase( pOp->p2==SQLITE_AFF_TEXT ); + testcase( pOp->p2==SQLITE_AFF_BLOB ); + testcase( pOp->p2==SQLITE_AFF_NUMERIC ); + testcase( pOp->p2==SQLITE_AFF_INTEGER ); + testcase( pOp->p2==SQLITE_AFF_REAL ); + pIn1 = &aMem[pOp->p1]; + memAboutToChange(p, pIn1); + rc = ExpandBlob(pIn1); + if( rc ) goto abort_due_to_error; + rc = sqlite3VdbeMemCast(pIn1, pOp->p2, encoding); + if( rc ) goto abort_due_to_error; + UPDATE_MAX_BLOBSIZE(pIn1); + REGISTER_TRACE(pOp->p1, pIn1); + break; +} +#endif /* SQLITE_OMIT_CAST */ + +/* Opcode: Eq P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]==r[P1] +** +** Compare the values in register P1 and P3. If reg(P3)==reg(P1) then +** jump to address P2. Or if the SQLITE_STOREP2 flag is set in P5, then +** store the result of comparison in register P2. +** +** The SQLITE_AFF_MASK portion of P5 must be an affinity character - +** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made +** to coerce both inputs according to this affinity before the +** comparison is made. If the SQLITE_AFF_MASK is 0x00, then numeric +** affinity is used. Note that the affinity conversions are stored +** back into the input registers P1 and P3. So this opcode can cause +** persistent changes to registers P1 and P3. +** +** Once any conversions have taken place, and neither value is NULL, +** the values are compared. If both values are blobs then memcmp() is +** used to determine the results of the comparison. If both values +** are text, then the appropriate collating function specified in +** P4 is used to do the comparison. If P4 is not specified then +** memcmp() is used to compare text string. If both values are +** numeric, then a numeric comparison is used. If the two values +** are of different types, then numbers are considered less than +** strings and strings are considered less than blobs. +** +** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either +** true or false and is never NULL. If both operands are NULL then the result +** of comparison is true. If either operand is NULL then the result is false. +** If neither operand is NULL the result is the same as it would be if +** the SQLITE_NULLEQ flag were omitted from P5. +** +** If both SQLITE_STOREP2 and SQLITE_KEEPNULL flags are set then the +** content of r[P2] is only changed if the new value is NULL or 0 (false). +** In other words, a prior r[P2] value will not be overwritten by 1 (true). +*/ +/* Opcode: Ne P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]!=r[P1] +** +** This works just like the Eq opcode except that the jump is taken if +** the operands in registers P1 and P3 are not equal. See the Eq opcode for +** additional information. +** +** If both SQLITE_STOREP2 and SQLITE_KEEPNULL flags are set then the +** content of r[P2] is only changed if the new value is NULL or 1 (true). +** In other words, a prior r[P2] value will not be overwritten by 0 (false). +*/ +/* Opcode: Lt P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]r[P1] +** +** This works just like the Lt opcode except that the jump is taken if +** the content of register P3 is greater than the content of +** register P1. See the Lt opcode for additional information. +*/ +/* Opcode: Ge P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]>=r[P1] +** +** This works just like the Lt opcode except that the jump is taken if +** the content of register P3 is greater than or equal to the content of +** register P1. See the Lt opcode for additional information. +*/ +case OP_Eq: /* same as TK_EQ, jump, in1, in3 */ +case OP_Ne: /* same as TK_NE, jump, in1, in3 */ +case OP_Lt: /* same as TK_LT, jump, in1, in3 */ +case OP_Le: /* same as TK_LE, jump, in1, in3 */ +case OP_Gt: /* same as TK_GT, jump, in1, in3 */ +case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ + int res, res2; /* Result of the comparison of pIn1 against pIn3 */ + char affinity; /* Affinity to use for comparison */ + u16 flags1; /* Copy of initial value of pIn1->flags */ + u16 flags3; /* Copy of initial value of pIn3->flags */ + + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + flags1 = pIn1->flags; + flags3 = pIn3->flags; + if( (flags1 | flags3)&MEM_Null ){ + /* One or both operands are NULL */ + if( pOp->p5 & SQLITE_NULLEQ ){ + /* If SQLITE_NULLEQ is set (which will only happen if the operator is + ** OP_Eq or OP_Ne) then take the jump or not depending on whether + ** or not both operands are null. + */ + assert( (flags1 & MEM_Cleared)==0 ); + assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 || CORRUPT_DB ); + testcase( (pOp->p5 & SQLITE_JUMPIFNULL)!=0 ); + if( (flags1&flags3&MEM_Null)!=0 + && (flags3&MEM_Cleared)==0 + ){ + res = 0; /* Operands are equal */ + }else{ + res = ((flags3 & MEM_Null) ? -1 : +1); /* Operands are not equal */ + } + }else{ + /* SQLITE_NULLEQ is clear and at least one operand is NULL, + ** then the result is always NULL. + ** The jump is taken if the SQLITE_JUMPIFNULL bit is set. + */ + if( pOp->p5 & SQLITE_STOREP2 ){ + pOut = &aMem[pOp->p2]; + iCompare = 1; /* Operands are not equal */ + memAboutToChange(p, pOut); + MemSetTypeFlag(pOut, MEM_Null); + REGISTER_TRACE(pOp->p2, pOut); + }else{ + VdbeBranchTaken(2,3); + if( pOp->p5 & SQLITE_JUMPIFNULL ){ + goto jump_to_p2; + } + } + break; + } + }else{ + /* Neither operand is NULL. Do a comparison. */ + affinity = pOp->p5 & SQLITE_AFF_MASK; + if( affinity>=SQLITE_AFF_NUMERIC ){ + if( (flags1 | flags3)&MEM_Str ){ + if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn1,0); + testcase( flags3==pIn3->flags ); + flags3 = pIn3->flags; + } + if( (flags3 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn3,0); + } + } + /* Handle the common case of integer comparison here, as an + ** optimization, to avoid a call to sqlite3MemCompare() */ + if( (pIn1->flags & pIn3->flags & MEM_Int)!=0 ){ + if( pIn3->u.i > pIn1->u.i ){ res = +1; goto compare_op; } + if( pIn3->u.i < pIn1->u.i ){ res = -1; goto compare_op; } + res = 0; + goto compare_op; + } + }else if( affinity==SQLITE_AFF_TEXT ){ + if( (flags1 & MEM_Str)==0 && (flags1&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ + testcase( pIn1->flags & MEM_Int ); + testcase( pIn1->flags & MEM_Real ); + testcase( pIn1->flags & MEM_IntReal ); + sqlite3VdbeMemStringify(pIn1, encoding, 1); + testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); + flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); + if( NEVER(pIn1==pIn3) ) flags3 = flags1 | MEM_Str; + } + if( (flags3 & MEM_Str)==0 && (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ + testcase( pIn3->flags & MEM_Int ); + testcase( pIn3->flags & MEM_Real ); + testcase( pIn3->flags & MEM_IntReal ); + sqlite3VdbeMemStringify(pIn3, encoding, 1); + testcase( (flags3&MEM_Dyn) != (pIn3->flags&MEM_Dyn) ); + flags3 = (pIn3->flags & ~MEM_TypeMask) | (flags3 & MEM_TypeMask); + } + } + assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 ); + res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl); + } +compare_op: + /* At this point, res is negative, zero, or positive if reg[P1] is + ** less than, equal to, or greater than reg[P3], respectively. Compute + ** the answer to this operator in res2, depending on what the comparison + ** operator actually is. The next block of code depends on the fact + ** that the 6 comparison operators are consecutive integers in this + ** order: NE, EQ, GT, LE, LT, GE */ + assert( OP_Eq==OP_Ne+1 ); assert( OP_Gt==OP_Ne+2 ); assert( OP_Le==OP_Ne+3 ); + assert( OP_Lt==OP_Ne+4 ); assert( OP_Ge==OP_Ne+5 ); + if( res<0 ){ /* ne, eq, gt, le, lt, ge */ + static const unsigned char aLTb[] = { 1, 0, 0, 1, 1, 0 }; + res2 = aLTb[pOp->opcode - OP_Ne]; + }else if( res==0 ){ + static const unsigned char aEQb[] = { 0, 1, 0, 1, 0, 1 }; + res2 = aEQb[pOp->opcode - OP_Ne]; + }else{ + static const unsigned char aGTb[] = { 1, 0, 1, 0, 0, 1 }; + res2 = aGTb[pOp->opcode - OP_Ne]; + } + + /* Undo any changes made by applyAffinity() to the input registers. */ + assert( (pIn3->flags & MEM_Dyn) == (flags3 & MEM_Dyn) ); + pIn3->flags = flags3; + assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); + pIn1->flags = flags1; + + if( pOp->p5 & SQLITE_STOREP2 ){ + pOut = &aMem[pOp->p2]; + iCompare = res; + if( (pOp->p5 & SQLITE_KEEPNULL)!=0 ){ + /* The KEEPNULL flag prevents OP_Eq from overwriting a NULL with 1 + ** and prevents OP_Ne from overwriting NULL with 0. This flag + ** is only used in contexts where either: + ** (1) op==OP_Eq && (r[P2]==NULL || r[P2]==0) + ** (2) op==OP_Ne && (r[P2]==NULL || r[P2]==1) + ** Therefore it is not necessary to check the content of r[P2] for + ** NULL. */ + assert( pOp->opcode==OP_Ne || pOp->opcode==OP_Eq ); + assert( res2==0 || res2==1 ); + testcase( res2==0 && pOp->opcode==OP_Eq ); + testcase( res2==1 && pOp->opcode==OP_Eq ); + testcase( res2==0 && pOp->opcode==OP_Ne ); + testcase( res2==1 && pOp->opcode==OP_Ne ); + if( (pOp->opcode==OP_Eq)==res2 ) break; + } + memAboutToChange(p, pOut); + MemSetTypeFlag(pOut, MEM_Int); + pOut->u.i = res2; + REGISTER_TRACE(pOp->p2, pOut); + }else{ + VdbeBranchTaken(res2!=0, (pOp->p5 & SQLITE_NULLEQ)?2:3); + if( res2 ){ + goto jump_to_p2; + } + } + break; +} + +/* Opcode: ElseNotEq * P2 * * * +** +** This opcode must follow an OP_Lt or OP_Gt comparison operator. There +** can be zero or more OP_ReleaseReg opcodes intervening, but no other +** opcodes are allowed to occur between this instruction and the previous +** OP_Lt or OP_Gt. Furthermore, the prior OP_Lt or OP_Gt must have the +** SQLITE_STOREP2 bit set in the P5 field. +** +** If result of an OP_Eq comparison on the same two operands as the +** prior OP_Lt or OP_Gt would have been NULL or false (0), then then +** jump to P2. If the result of an OP_Eq comparison on the two previous +** operands would have been true (1), then fall through. +*/ +case OP_ElseNotEq: { /* same as TK_ESCAPE, jump */ + +#ifdef SQLITE_DEBUG + /* Verify the preconditions of this opcode - that it follows an OP_Lt or + ** OP_Gt with the SQLITE_STOREP2 flag set, with zero or more intervening + ** OP_ReleaseReg opcodes */ + int iAddr; + for(iAddr = (int)(pOp - aOp) - 1; ALWAYS(iAddr>=0); iAddr--){ + if( aOp[iAddr].opcode==OP_ReleaseReg ) continue; + assert( aOp[iAddr].opcode==OP_Lt || aOp[iAddr].opcode==OP_Gt ); + assert( aOp[iAddr].p5 & SQLITE_STOREP2 ); + break; + } +#endif /* SQLITE_DEBUG */ + VdbeBranchTaken(iCompare!=0, 2); + if( iCompare!=0 ) goto jump_to_p2; + break; +} + + +/* Opcode: Permutation * * * P4 * +** +** Set the permutation used by the OP_Compare operator in the next +** instruction. The permutation is stored in the P4 operand. +** +** The permutation is only valid until the next OP_Compare that has +** the OPFLAG_PERMUTE bit set in P5. Typically the OP_Permutation should +** occur immediately prior to the OP_Compare. +** +** The first integer in the P4 integer array is the length of the array +** and does not become part of the permutation. +*/ +case OP_Permutation: { + assert( pOp->p4type==P4_INTARRAY ); + assert( pOp->p4.ai ); + assert( pOp[1].opcode==OP_Compare ); + assert( pOp[1].p5 & OPFLAG_PERMUTE ); + break; +} + +/* Opcode: Compare P1 P2 P3 P4 P5 +** Synopsis: r[P1@P3] <-> r[P2@P3] +** +** Compare two vectors of registers in reg(P1)..reg(P1+P3-1) (call this +** vector "A") and in reg(P2)..reg(P2+P3-1) ("B"). Save the result of +** the comparison for use by the next OP_Jump instruct. +** +** If P5 has the OPFLAG_PERMUTE bit set, then the order of comparison is +** determined by the most recent OP_Permutation operator. If the +** OPFLAG_PERMUTE bit is clear, then register are compared in sequential +** order. +** +** P4 is a KeyInfo structure that defines collating sequences and sort +** orders for the comparison. The permutation applies to registers +** only. The KeyInfo elements are used sequentially. +** +** The comparison is a sort comparison, so NULLs compare equal, +** NULLs are less than numbers, numbers are less than strings, +** and strings are less than blobs. +*/ +case OP_Compare: { + int n; + int i; + int p1; + int p2; + const KeyInfo *pKeyInfo; + int idx; + CollSeq *pColl; /* Collating sequence to use on this term */ + int bRev; /* True for DESCENDING sort order */ + int *aPermute; /* The permutation */ + + if( (pOp->p5 & OPFLAG_PERMUTE)==0 ){ + aPermute = 0; + }else{ + assert( pOp>aOp ); + assert( pOp[-1].opcode==OP_Permutation ); + assert( pOp[-1].p4type==P4_INTARRAY ); + aPermute = pOp[-1].p4.ai + 1; + assert( aPermute!=0 ); + } + n = pOp->p3; + pKeyInfo = pOp->p4.pKeyInfo; + assert( n>0 ); + assert( pKeyInfo!=0 ); + p1 = pOp->p1; + p2 = pOp->p2; +#ifdef SQLITE_DEBUG + if( aPermute ){ + int k, mx = 0; + for(k=0; kmx ) mx = aPermute[k]; + assert( p1>0 && p1+mx<=(p->nMem+1 - p->nCursor)+1 ); + assert( p2>0 && p2+mx<=(p->nMem+1 - p->nCursor)+1 ); + }else{ + assert( p1>0 && p1+n<=(p->nMem+1 - p->nCursor)+1 ); + assert( p2>0 && p2+n<=(p->nMem+1 - p->nCursor)+1 ); + } +#endif /* SQLITE_DEBUG */ + for(i=0; inKeyField ); + pColl = pKeyInfo->aColl[i]; + bRev = (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC); + iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl); + if( iCompare ){ + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) + && ((aMem[p1+idx].flags & MEM_Null) || (aMem[p2+idx].flags & MEM_Null)) + ){ + iCompare = -iCompare; + } + if( bRev ) iCompare = -iCompare; + break; + } + } + break; +} + +/* Opcode: Jump P1 P2 P3 * * +** +** Jump to the instruction at address P1, P2, or P3 depending on whether +** in the most recent OP_Compare instruction the P1 vector was less than +** equal to, or greater than the P2 vector, respectively. +*/ +case OP_Jump: { /* jump */ + if( iCompare<0 ){ + VdbeBranchTaken(0,4); pOp = &aOp[pOp->p1 - 1]; + }else if( iCompare==0 ){ + VdbeBranchTaken(1,4); pOp = &aOp[pOp->p2 - 1]; + }else{ + VdbeBranchTaken(2,4); pOp = &aOp[pOp->p3 - 1]; + } + break; +} + +/* Opcode: And P1 P2 P3 * * +** Synopsis: r[P3]=(r[P1] && r[P2]) +** +** Take the logical AND of the values in registers P1 and P2 and +** write the result into register P3. +** +** If either P1 or P2 is 0 (false) then the result is 0 even if +** the other input is NULL. A NULL and true or two NULLs give +** a NULL output. +*/ +/* Opcode: Or P1 P2 P3 * * +** Synopsis: r[P3]=(r[P1] || r[P2]) +** +** Take the logical OR of the values in register P1 and P2 and +** store the answer in register P3. +** +** If either P1 or P2 is nonzero (true) then the result is 1 (true) +** even if the other input is NULL. A NULL and false or two NULLs +** give a NULL output. +*/ +case OP_And: /* same as TK_AND, in1, in2, out3 */ +case OP_Or: { /* same as TK_OR, in1, in2, out3 */ + int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ + int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ + + v1 = sqlite3VdbeBooleanValue(&aMem[pOp->p1], 2); + v2 = sqlite3VdbeBooleanValue(&aMem[pOp->p2], 2); + if( pOp->opcode==OP_And ){ + static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 }; + v1 = and_logic[v1*3+v2]; + }else{ + static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 }; + v1 = or_logic[v1*3+v2]; + } + pOut = &aMem[pOp->p3]; + if( v1==2 ){ + MemSetTypeFlag(pOut, MEM_Null); + }else{ + pOut->u.i = v1; + MemSetTypeFlag(pOut, MEM_Int); + } + break; +} + +/* Opcode: IsTrue P1 P2 P3 P4 * +** Synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 +** +** This opcode implements the IS TRUE, IS FALSE, IS NOT TRUE, and +** IS NOT FALSE operators. +** +** Interpret the value in register P1 as a boolean value. Store that +** boolean (a 0 or 1) in register P2. Or if the value in register P1 is +** NULL, then the P3 is stored in register P2. Invert the answer if P4 +** is 1. +** +** The logic is summarized like this: +** +**
      +**
    • If P3==0 and P4==0 then r[P2] := r[P1] IS TRUE +**
    • If P3==1 and P4==1 then r[P2] := r[P1] IS FALSE +**
    • If P3==0 and P4==1 then r[P2] := r[P1] IS NOT TRUE +**
    • If P3==1 and P4==0 then r[P2] := r[P1] IS NOT FALSE +**
    +*/ +case OP_IsTrue: { /* in1, out2 */ + assert( pOp->p4type==P4_INT32 ); + assert( pOp->p4.i==0 || pOp->p4.i==1 ); + assert( pOp->p3==0 || pOp->p3==1 ); + sqlite3VdbeMemSetInt64(&aMem[pOp->p2], + sqlite3VdbeBooleanValue(&aMem[pOp->p1], pOp->p3) ^ pOp->p4.i); + break; +} + +/* Opcode: Not P1 P2 * * * +** Synopsis: r[P2]= !r[P1] +** +** Interpret the value in register P1 as a boolean value. Store the +** boolean complement in register P2. If the value in register P1 is +** NULL, then a NULL is stored in P2. +*/ +case OP_Not: { /* same as TK_NOT, in1, out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + if( (pIn1->flags & MEM_Null)==0 ){ + sqlite3VdbeMemSetInt64(pOut, !sqlite3VdbeBooleanValue(pIn1,0)); + }else{ + sqlite3VdbeMemSetNull(pOut); + } + break; +} + +/* Opcode: BitNot P1 P2 * * * +** Synopsis: r[P2]= ~r[P1] +** +** Interpret the content of register P1 as an integer. Store the +** ones-complement of the P1 value into register P2. If P1 holds +** a NULL then store a NULL in P2. +*/ +case OP_BitNot: { /* same as TK_BITNOT, in1, out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + sqlite3VdbeMemSetNull(pOut); + if( (pIn1->flags & MEM_Null)==0 ){ + pOut->flags = MEM_Int; + pOut->u.i = ~sqlite3VdbeIntValue(pIn1); + } + break; +} + +/* Opcode: Once P1 P2 * * * +** +** Fall through to the next instruction the first time this opcode is +** encountered on each invocation of the byte-code program. Jump to P2 +** on the second and all subsequent encounters during the same invocation. +** +** Top-level programs determine first invocation by comparing the P1 +** operand against the P1 operand on the OP_Init opcode at the beginning +** of the program. If the P1 values differ, then fall through and make +** the P1 of this opcode equal to the P1 of OP_Init. If P1 values are +** the same then take the jump. +** +** For subprograms, there is a bitmask in the VdbeFrame that determines +** whether or not the jump should be taken. The bitmask is necessary +** because the self-altering code trick does not work for recursive +** triggers. +*/ +case OP_Once: { /* jump */ + u32 iAddr; /* Address of this instruction */ + assert( p->aOp[0].opcode==OP_Init ); + if( p->pFrame ){ + iAddr = (int)(pOp - p->aOp); + if( (p->pFrame->aOnce[iAddr/8] & (1<<(iAddr & 7)))!=0 ){ + VdbeBranchTaken(1, 2); + goto jump_to_p2; + } + p->pFrame->aOnce[iAddr/8] |= 1<<(iAddr & 7); + }else{ + if( p->aOp[0].p1==pOp->p1 ){ + VdbeBranchTaken(1, 2); + goto jump_to_p2; + } + } + VdbeBranchTaken(0, 2); + pOp->p1 = p->aOp[0].p1; + break; +} + +/* Opcode: If P1 P2 P3 * * +** +** Jump to P2 if the value in register P1 is true. The value +** is considered true if it is numeric and non-zero. If the value +** in P1 is NULL then take the jump if and only if P3 is non-zero. +*/ +case OP_If: { /* jump, in1 */ + int c; + c = sqlite3VdbeBooleanValue(&aMem[pOp->p1], pOp->p3); + VdbeBranchTaken(c!=0, 2); + if( c ) goto jump_to_p2; + break; +} + +/* Opcode: IfNot P1 P2 P3 * * +** +** Jump to P2 if the value in register P1 is False. The value +** is considered false if it has a numeric value of zero. If the value +** in P1 is NULL then take the jump if and only if P3 is non-zero. +*/ +case OP_IfNot: { /* jump, in1 */ + int c; + c = !sqlite3VdbeBooleanValue(&aMem[pOp->p1], !pOp->p3); + VdbeBranchTaken(c!=0, 2); + if( c ) goto jump_to_p2; + break; +} + +/* Opcode: IsNull P1 P2 * * * +** Synopsis: if r[P1]==NULL goto P2 +** +** Jump to P2 if the value in register P1 is NULL. +*/ +case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ + pIn1 = &aMem[pOp->p1]; + VdbeBranchTaken( (pIn1->flags & MEM_Null)!=0, 2); + if( (pIn1->flags & MEM_Null)!=0 ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: NotNull P1 P2 * * * +** Synopsis: if r[P1]!=NULL goto P2 +** +** Jump to P2 if the value in register P1 is not NULL. +*/ +case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */ + pIn1 = &aMem[pOp->p1]; + VdbeBranchTaken( (pIn1->flags & MEM_Null)==0, 2); + if( (pIn1->flags & MEM_Null)==0 ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: IfNullRow P1 P2 P3 * * +** Synopsis: if P1.nullRow then r[P3]=NULL, goto P2 +** +** Check the cursor P1 to see if it is currently pointing at a NULL row. +** If it is, then set register P3 to NULL and jump immediately to P2. +** If P1 is not on a NULL row, then fall through without making any +** changes. +*/ +case OP_IfNullRow: { /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( p->apCsr[pOp->p1]!=0 ); + if( p->apCsr[pOp->p1]->nullRow ){ + sqlite3VdbeMemSetNull(aMem + pOp->p3); + goto jump_to_p2; + } + break; +} + +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC +/* Opcode: Offset P1 P2 P3 * * +** Synopsis: r[P3] = sqlite_offset(P1) +** +** Store in register r[P3] the byte offset into the database file that is the +** start of the payload for the record at which that cursor P1 is currently +** pointing. +** +** P2 is the column number for the argument to the sqlite_offset() function. +** This opcode does not use P2 itself, but the P2 value is used by the +** code generator. The P1, P2, and P3 operands to this opcode are the +** same as for OP_Column. +** +** This opcode is only available if SQLite is compiled with the +** -DSQLITE_ENABLE_OFFSET_SQL_FUNC option. +*/ +case OP_Offset: { /* out3 */ + VdbeCursor *pC; /* The VDBE cursor */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + pOut = &p->aMem[pOp->p3]; + if( NEVER(pC==0) || pC->eCurType!=CURTYPE_BTREE ){ + sqlite3VdbeMemSetNull(pOut); + }else{ + sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor)); + } + break; +} +#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ + +/* Opcode: Column P1 P2 P3 P4 P5 +** Synopsis: r[P3]=PX +** +** Interpret the data that cursor P1 points to as a structure built using +** the MakeRecord instruction. (See the MakeRecord opcode for additional +** information about the format of the data.) Extract the P2-th column +** from this record. If there are less that (P2+1) +** values in the record, extract a NULL. +** +** The value extracted is stored in register P3. +** +** If the record contains fewer than P2 fields, then extract a NULL. Or, +** if the P4 argument is a P4_MEM use the value of the P4 argument as +** the result. +** +** If the OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG bits are set on P5 then +** the result is guaranteed to only be used as the argument of a length() +** or typeof() function, respectively. The loading of large blobs can be +** skipped for length() and all content loading can be skipped for typeof(). +*/ +case OP_Column: { + int p2; /* column number to retrieve */ + VdbeCursor *pC; /* The VDBE cursor */ + BtCursor *pCrsr; /* The BTree cursor */ + u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */ + int len; /* The length of the serialized data for the column */ + int i; /* Loop counter */ + Mem *pDest; /* Where to write the extracted value */ + Mem sMem; /* For storing the record being decoded */ + const u8 *zData; /* Part of the record being decoded */ + const u8 *zHdr; /* Next unparsed byte of the header */ + const u8 *zEndHdr; /* Pointer to first byte after the header */ + u64 offset64; /* 64-bit offset */ + u32 t; /* A type code from the record header */ + Mem *pReg; /* PseudoTable input register */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + p2 = pOp->p2; + + /* If the cursor cache is stale (meaning it is not currently point at + ** the correct row) then bring it up-to-date by doing the necessary + ** B-Tree seek. */ + rc = sqlite3VdbeCursorMoveto(&pC, &p2); + if( rc ) goto abort_due_to_error; + + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); + assert( pC!=0 ); + assert( p2nField ); + aOffset = pC->aOffset; + assert( pC->eCurType!=CURTYPE_VTAB ); + assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow ); + assert( pC->eCurType!=CURTYPE_SORTER ); + + if( pC->cacheStatus!=p->cacheCtr ){ /*OPTIMIZATION-IF-FALSE*/ + if( pC->nullRow ){ + if( pC->eCurType==CURTYPE_PSEUDO ){ + /* For the special case of as pseudo-cursor, the seekResult field + ** identifies the register that holds the record */ + assert( pC->seekResult>0 ); + pReg = &aMem[pC->seekResult]; + assert( pReg->flags & MEM_Blob ); + assert( memIsValid(pReg) ); + pC->payloadSize = pC->szRow = pReg->n; + pC->aRow = (u8*)pReg->z; + }else{ + sqlite3VdbeMemSetNull(pDest); + goto op_column_out; + } + }else{ + pCrsr = pC->uc.pCursor; + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pCrsr ); + assert( sqlite3BtreeCursorIsValid(pCrsr) ); + pC->payloadSize = sqlite3BtreePayloadSize(pCrsr); + pC->aRow = sqlite3BtreePayloadFetch(pCrsr, &pC->szRow); + assert( pC->szRow<=pC->payloadSize ); + assert( pC->szRow<=65536 ); /* Maximum page size is 64KiB */ + if( pC->payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + } + pC->cacheStatus = p->cacheCtr; + pC->iHdrOffset = getVarint32(pC->aRow, aOffset[0]); + pC->nHdrParsed = 0; + + + if( pC->szRowaRow does not have to hold the entire row, but it does at least + ** need to cover the header of the record. If pC->aRow does not contain + ** the complete header, then set it to zero, forcing the header to be + ** dynamically allocated. */ + pC->aRow = 0; + pC->szRow = 0; + + /* Make sure a corrupt database has not given us an oversize header. + ** Do this now to avoid an oversize memory allocation. + ** + ** Type entries can be between 1 and 5 bytes each. But 4 and 5 byte + ** types use so much data space that there can only be 4096 and 32 of + ** them, respectively. So the maximum header length results from a + ** 3-byte type for each of the maximum of 32768 columns plus three + ** extra bytes for the header length itself. 32768*3 + 3 = 98307. + */ + if( aOffset[0] > 98307 || aOffset[0] > pC->payloadSize ){ + goto op_column_corrupt; + } + }else{ + /* This is an optimization. By skipping over the first few tests + ** (ex: pC->nHdrParsed<=p2) in the next section, we achieve a + ** measurable performance gain. + ** + ** This branch is taken even if aOffset[0]==0. Such a record is never + ** generated by SQLite, and could be considered corruption, but we + ** accept it for historical reasons. When aOffset[0]==0, the code this + ** branch jumps to reads past the end of the record, but never more + ** than a few bytes. Even if the record occurs at the end of the page + ** content area, the "page header" comes after the page content and so + ** this overread is harmless. Similar overreads can occur for a corrupt + ** database file. + */ + zData = pC->aRow; + assert( pC->nHdrParsed<=p2 ); /* Conditional skipped */ + testcase( aOffset[0]==0 ); + goto op_column_read_header; + } + } + + /* Make sure at least the first p2+1 entries of the header have been + ** parsed and valid information is in aOffset[] and pC->aType[]. + */ + if( pC->nHdrParsed<=p2 ){ + /* If there is more header available for parsing in the record, try + ** to extract additional fields up through the p2+1-th field + */ + if( pC->iHdrOffsetaRow==0 ){ + memset(&sMem, 0, sizeof(sMem)); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pC->uc.pCursor,aOffset[0],&sMem); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + zData = (u8*)sMem.z; + }else{ + zData = pC->aRow; + } + + /* Fill in pC->aType[i] and aOffset[i] values through the p2-th field. */ + op_column_read_header: + i = pC->nHdrParsed; + offset64 = aOffset[i]; + zHdr = zData + pC->iHdrOffset; + zEndHdr = zData + aOffset[0]; + testcase( zHdr>=zEndHdr ); + do{ + if( (pC->aType[i] = t = zHdr[0])<0x80 ){ + zHdr++; + offset64 += sqlite3VdbeOneByteSerialTypeLen(t); + }else{ + zHdr += sqlite3GetVarint32(zHdr, &t); + pC->aType[i] = t; + offset64 += sqlite3VdbeSerialTypeLen(t); + } + aOffset[++i] = (u32)(offset64 & 0xffffffff); + }while( i<=p2 && zHdr=zEndHdr && (zHdr>zEndHdr || offset64!=pC->payloadSize)) + || (offset64 > pC->payloadSize) + ){ + if( aOffset[0]==0 ){ + i = 0; + zHdr = zEndHdr; + }else{ + if( pC->aRow==0 ) sqlite3VdbeMemRelease(&sMem); + goto op_column_corrupt; + } + } + + pC->nHdrParsed = i; + pC->iHdrOffset = (u32)(zHdr - zData); + if( pC->aRow==0 ) sqlite3VdbeMemRelease(&sMem); + }else{ + t = 0; + } + + /* If after trying to extract new entries from the header, nHdrParsed is + ** still not up to p2, that means that the record has fewer than p2 + ** columns. So the result will be either the default value or a NULL. + */ + if( pC->nHdrParsed<=p2 ){ + if( pOp->p4type==P4_MEM ){ + sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static); + }else{ + sqlite3VdbeMemSetNull(pDest); + } + goto op_column_out; + } + }else{ + t = pC->aType[p2]; + } + + /* Extract the content for the p2+1-th column. Control can only + ** reach this point if aOffset[p2], aOffset[p2+1], and pC->aType[p2] are + ** all valid. + */ + assert( p2nHdrParsed ); + assert( rc==SQLITE_OK ); + assert( sqlite3VdbeCheckMemInvariants(pDest) ); + if( VdbeMemDynamic(pDest) ){ + sqlite3VdbeMemSetNull(pDest); + } + assert( t==pC->aType[p2] ); + if( pC->szRow>=aOffset[p2+1] ){ + /* This is the common case where the desired content fits on the original + ** page - where the content is not on an overflow page */ + zData = pC->aRow + aOffset[p2]; + if( t<12 ){ + sqlite3VdbeSerialGet(zData, t, pDest); + }else{ + /* If the column value is a string, we need a persistent value, not + ** a MEM_Ephem value. This branch is a fast short-cut that is equivalent + ** to calling sqlite3VdbeSerialGet() and sqlite3VdbeDeephemeralize(). + */ + static const u16 aFlag[] = { MEM_Blob, MEM_Str|MEM_Term }; + pDest->n = len = (t-12)/2; + pDest->enc = encoding; + if( pDest->szMalloc < len+2 ){ + pDest->flags = MEM_Null; + if( sqlite3VdbeMemGrow(pDest, len+2, 0) ) goto no_mem; + }else{ + pDest->z = pDest->zMalloc; + } + memcpy(pDest->z, zData, len); + pDest->z[len] = 0; + pDest->z[len+1] = 0; + pDest->flags = aFlag[t&1]; + } + }else{ + pDest->enc = encoding; + /* This branch happens only when content is on overflow pages */ + if( ((pOp->p5 & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG))!=0 + && ((t>=12 && (t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0)) + || (len = sqlite3VdbeSerialTypeLen(t))==0 + ){ + /* Content is irrelevant for + ** 1. the typeof() function, + ** 2. the length(X) function if X is a blob, and + ** 3. if the content length is zero. + ** So we might as well use bogus content rather than reading + ** content from disk. + ** + ** Although sqlite3VdbeSerialGet() may read at most 8 bytes from the + ** buffer passed to it, debugging function VdbeMemPrettyPrint() may + ** read more. Use the global constant sqlite3CtypeMap[] as the array, + ** as that array is 256 bytes long (plenty for VdbeMemPrettyPrint()) + ** and it begins with a bunch of zeros. + */ + sqlite3VdbeSerialGet((u8*)sqlite3CtypeMap, t, pDest); + }else{ + rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, aOffset[p2], len, pDest); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + sqlite3VdbeSerialGet((const u8*)pDest->z, t, pDest); + pDest->flags &= ~MEM_Ephem; + } + } + +op_column_out: + UPDATE_MAX_BLOBSIZE(pDest); + REGISTER_TRACE(pOp->p3, pDest); + break; + +op_column_corrupt: + if( aOp[0].p3>0 ){ + pOp = &aOp[aOp[0].p3-1]; + break; + }else{ + rc = SQLITE_CORRUPT_BKPT; + goto abort_due_to_error; + } +} + +/* Opcode: Affinity P1 P2 * P4 * +** Synopsis: affinity(r[P1@P2]) +** +** Apply affinities to a range of P2 registers starting with P1. +** +** P4 is a string that is P2 characters long. The N-th character of the +** string indicates the column affinity that should be used for the N-th +** memory cell in the range. +*/ +case OP_Affinity: { + const char *zAffinity; /* The affinity to be applied */ + + zAffinity = pOp->p4.z; + assert( zAffinity!=0 ); + assert( pOp->p2>0 ); + assert( zAffinity[pOp->p2]==0 ); + pIn1 = &aMem[pOp->p1]; + while( 1 /*exit-by-break*/ ){ + assert( pIn1 <= &p->aMem[(p->nMem+1 - p->nCursor)] ); + assert( zAffinity[0]==SQLITE_AFF_NONE || memIsValid(pIn1) ); + applyAffinity(pIn1, zAffinity[0], encoding); + if( zAffinity[0]==SQLITE_AFF_REAL && (pIn1->flags & MEM_Int)!=0 ){ + /* When applying REAL affinity, if the result is still an MEM_Int + ** that will fit in 6 bytes, then change the type to MEM_IntReal + ** so that we keep the high-resolution integer value but know that + ** the type really wants to be REAL. */ + testcase( pIn1->u.i==140737488355328LL ); + testcase( pIn1->u.i==140737488355327LL ); + testcase( pIn1->u.i==-140737488355328LL ); + testcase( pIn1->u.i==-140737488355329LL ); + if( pIn1->u.i<=140737488355327LL && pIn1->u.i>=-140737488355328LL ){ + pIn1->flags |= MEM_IntReal; + pIn1->flags &= ~MEM_Int; + }else{ + pIn1->u.r = (double)pIn1->u.i; + pIn1->flags |= MEM_Real; + pIn1->flags &= ~MEM_Int; + } + } + REGISTER_TRACE((int)(pIn1-aMem), pIn1); + zAffinity++; + if( zAffinity[0]==0 ) break; + pIn1++; + } + break; +} + +/* Opcode: MakeRecord P1 P2 P3 P4 * +** Synopsis: r[P3]=mkrec(r[P1@P2]) +** +** Convert P2 registers beginning with P1 into the [record format] +** use as a data record in a database table or as a key +** in an index. The OP_Column opcode can decode the record later. +** +** P4 may be a string that is P2 characters long. The N-th character of the +** string indicates the column affinity that should be used for the N-th +** field of the index key. +** +** The mapping from character to affinity is given by the SQLITE_AFF_ +** macros defined in sqliteInt.h. +** +** If P4 is NULL then all index fields have the affinity BLOB. +*/ +case OP_MakeRecord: { + Mem *pRec; /* The new record */ + u64 nData; /* Number of bytes of data space */ + int nHdr; /* Number of bytes of header space */ + i64 nByte; /* Data space required for this record */ + i64 nZero; /* Number of zero bytes at the end of the record */ + int nVarint; /* Number of bytes in a varint */ + u32 serial_type; /* Type field */ + Mem *pData0; /* First field to be combined into the record */ + Mem *pLast; /* Last field of the record */ + int nField; /* Number of fields in the record */ + char *zAffinity; /* The affinity string for the record */ + int file_format; /* File format to use for encoding */ + u32 len; /* Length of a field */ + u8 *zHdr; /* Where to write next byte of the header */ + u8 *zPayload; /* Where to write next byte of the payload */ + + /* Assuming the record contains N fields, the record format looks + ** like this: + ** + ** ------------------------------------------------------------------------ + ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 | + ** ------------------------------------------------------------------------ + ** + ** Data(0) is taken from register P1. Data(1) comes from register P1+1 + ** and so forth. + ** + ** Each type field is a varint representing the serial type of the + ** corresponding data element (see sqlite3VdbeSerialType()). The + ** hdr-size field is also a varint which is the offset from the beginning + ** of the record to data0. + */ + nData = 0; /* Number of bytes of data space */ + nHdr = 0; /* Number of bytes of header space */ + nZero = 0; /* Number of zero bytes at the end of the record */ + nField = pOp->p1; + zAffinity = pOp->p4.z; + assert( nField>0 && pOp->p2>0 && pOp->p2+nField<=(p->nMem+1 - p->nCursor)+1 ); + pData0 = &aMem[nField]; + nField = pOp->p2; + pLast = &pData0[nField-1]; + file_format = p->minWriteFileFormat; + + /* Identify the output register */ + assert( pOp->p3p1 || pOp->p3>=pOp->p1+pOp->p2 ); + pOut = &aMem[pOp->p3]; + memAboutToChange(p, pOut); + + /* Apply the requested affinity to all inputs + */ + assert( pData0<=pLast ); + if( zAffinity ){ + pRec = pData0; + do{ + applyAffinity(pRec, zAffinity[0], encoding); + if( zAffinity[0]==SQLITE_AFF_REAL && (pRec->flags & MEM_Int) ){ + pRec->flags |= MEM_IntReal; + pRec->flags &= ~(MEM_Int); + } + REGISTER_TRACE((int)(pRec-aMem), pRec); + zAffinity++; + pRec++; + assert( zAffinity[0]==0 || pRec<=pLast ); + }while( zAffinity[0] ); + } + +#ifdef SQLITE_ENABLE_NULL_TRIM + /* NULLs can be safely trimmed from the end of the record, as long as + ** as the schema format is 2 or more and none of the omitted columns + ** have a non-NULL default value. Also, the record must be left with + ** at least one field. If P5>0 then it will be one more than the + ** index of the right-most column with a non-NULL default value */ + if( pOp->p5 ){ + while( (pLast->flags & MEM_Null)!=0 && nField>pOp->p5 ){ + pLast--; + nField--; + } + } +#endif + + /* Loop through the elements that will make up the record to figure + ** out how much space is required for the new record. After this loop, + ** the Mem.uTemp field of each term should hold the serial-type that will + ** be used for that term in the generated record: + ** + ** Mem.uTemp value type + ** --------------- --------------- + ** 0 NULL + ** 1 1-byte signed integer + ** 2 2-byte signed integer + ** 3 3-byte signed integer + ** 4 4-byte signed integer + ** 5 6-byte signed integer + ** 6 8-byte signed integer + ** 7 IEEE float + ** 8 Integer constant 0 + ** 9 Integer constant 1 + ** 10,11 reserved for expansion + ** N>=12 and even BLOB + ** N>=13 and odd text + ** + ** The following additional values are computed: + ** nHdr Number of bytes needed for the record header + ** nData Number of bytes of data space needed for the record + ** nZero Zero bytes at the end of the record + */ + pRec = pLast; + do{ + assert( memIsValid(pRec) ); + if( pRec->flags & MEM_Null ){ + if( pRec->flags & MEM_Zero ){ + /* Values with MEM_Null and MEM_Zero are created by xColumn virtual + ** table methods that never invoke sqlite3_result_xxxxx() while + ** computing an unchanging column value in an UPDATE statement. + ** Give such values a special internal-use-only serial-type of 10 + ** so that they can be passed through to xUpdate and have + ** a true sqlite3_value_nochange(). */ + assert( pOp->p5==OPFLAG_NOCHNG_MAGIC || CORRUPT_DB ); + pRec->uTemp = 10; + }else{ + pRec->uTemp = 0; + } + nHdr++; + }else if( pRec->flags & (MEM_Int|MEM_IntReal) ){ + /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ + i64 i = pRec->u.i; + u64 uu; + testcase( pRec->flags & MEM_Int ); + testcase( pRec->flags & MEM_IntReal ); + if( i<0 ){ + uu = ~i; + }else{ + uu = i; + } + nHdr++; + testcase( uu==127 ); testcase( uu==128 ); + testcase( uu==32767 ); testcase( uu==32768 ); + testcase( uu==8388607 ); testcase( uu==8388608 ); + testcase( uu==2147483647 ); testcase( uu==2147483648 ); + testcase( uu==140737488355327LL ); testcase( uu==140737488355328LL ); + if( uu<=127 ){ + if( (i&1)==i && file_format>=4 ){ + pRec->uTemp = 8+(u32)uu; + }else{ + nData++; + pRec->uTemp = 1; + } + }else if( uu<=32767 ){ + nData += 2; + pRec->uTemp = 2; + }else if( uu<=8388607 ){ + nData += 3; + pRec->uTemp = 3; + }else if( uu<=2147483647 ){ + nData += 4; + pRec->uTemp = 4; + }else if( uu<=140737488355327LL ){ + nData += 6; + pRec->uTemp = 5; + }else{ + nData += 8; + if( pRec->flags & MEM_IntReal ){ + /* If the value is IntReal and is going to take up 8 bytes to store + ** as an integer, then we might as well make it an 8-byte floating + ** point value */ + pRec->u.r = (double)pRec->u.i; + pRec->flags &= ~MEM_IntReal; + pRec->flags |= MEM_Real; + pRec->uTemp = 7; + }else{ + pRec->uTemp = 6; + } + } + }else if( pRec->flags & MEM_Real ){ + nHdr++; + nData += 8; + pRec->uTemp = 7; + }else{ + assert( db->mallocFailed || pRec->flags&(MEM_Str|MEM_Blob) ); + assert( pRec->n>=0 ); + len = (u32)pRec->n; + serial_type = (len*2) + 12 + ((pRec->flags & MEM_Str)!=0); + if( pRec->flags & MEM_Zero ){ + serial_type += pRec->u.nZero*2; + if( nData ){ + if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; + len += pRec->u.nZero; + }else{ + nZero += pRec->u.nZero; + } + } + nData += len; + nHdr += sqlite3VarintLen(serial_type); + pRec->uTemp = serial_type; + } + if( pRec==pData0 ) break; + pRec--; + }while(1); + + /* EVIDENCE-OF: R-22564-11647 The header begins with a single varint + ** which determines the total number of bytes in the header. The varint + ** value is the size of the header in bytes including the size varint + ** itself. */ + testcase( nHdr==126 ); + testcase( nHdr==127 ); + if( nHdr<=126 ){ + /* The common case */ + nHdr += 1; + }else{ + /* Rare case of a really large header */ + nVarint = sqlite3VarintLen(nHdr); + nHdr += nVarint; + if( nVarintp3) is not allowed to + ** be one of the input registers (because the following call to + ** sqlite3VdbeMemClearAndResize() could clobber the value before it is used). + */ + if( nByte+nZero<=pOut->szMalloc ){ + /* The output register is already large enough to hold the record. + ** No error checks or buffer enlargement is required */ + pOut->z = pOut->zMalloc; + }else{ + /* Need to make sure that the output is not too big and then enlarge + ** the output register to hold the full result */ + if( nByte+nZero>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + if( sqlite3VdbeMemClearAndResize(pOut, (int)nByte) ){ + goto no_mem; + } + } + pOut->n = (int)nByte; + pOut->flags = MEM_Blob; + if( nZero ){ + pOut->u.nZero = nZero; + pOut->flags |= MEM_Zero; + } + UPDATE_MAX_BLOBSIZE(pOut); + zHdr = (u8 *)pOut->z; + zPayload = zHdr + nHdr; + + /* Write the record */ + zHdr += putVarint32(zHdr, nHdr); + assert( pData0<=pLast ); + pRec = pData0; + do{ + serial_type = pRec->uTemp; + /* EVIDENCE-OF: R-06529-47362 Following the size varint are one or more + ** additional varints, one per column. */ + zHdr += putVarint32(zHdr, serial_type); /* serial type */ + /* EVIDENCE-OF: R-64536-51728 The values for each column in the record + ** immediately follow the header. */ + zPayload += sqlite3VdbeSerialPut(zPayload, pRec, serial_type); /* content */ + }while( (++pRec)<=pLast ); + assert( nHdr==(int)(zHdr - (u8*)pOut->z) ); + assert( nByte==(int)(zPayload - (u8*)pOut->z) ); + + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + REGISTER_TRACE(pOp->p3, pOut); + break; +} + +/* Opcode: Count P1 P2 p3 * * +** Synopsis: r[P2]=count() +** +** Store the number of entries (an integer value) in the table or index +** opened by cursor P1 in register P2. +** +** If P3==0, then an exact count is obtained, which involves visiting +** every btree page of the table. But if P3 is non-zero, an estimate +** is returned based on the current cursor position. +*/ +case OP_Count: { /* out2 */ + i64 nEntry; + BtCursor *pCrsr; + + assert( p->apCsr[pOp->p1]->eCurType==CURTYPE_BTREE ); + pCrsr = p->apCsr[pOp->p1]->uc.pCursor; + assert( pCrsr ); + if( pOp->p3 ){ + nEntry = sqlite3BtreeRowCountEst(pCrsr); + }else{ + nEntry = 0; /* Not needed. Only used to silence a warning. */ + rc = sqlite3BtreeCount(db, pCrsr, &nEntry); + if( rc ) goto abort_due_to_error; + } + pOut = out2Prerelease(p, pOp); + pOut->u.i = nEntry; + goto check_for_interrupt; +} + +/* Opcode: Savepoint P1 * * P4 * +** +** Open, release or rollback the savepoint named by parameter P4, depending +** on the value of P1. To open a new savepoint set P1==0 (SAVEPOINT_BEGIN). +** To release (commit) an existing savepoint set P1==1 (SAVEPOINT_RELEASE). +** To rollback an existing savepoint set P1==2 (SAVEPOINT_ROLLBACK). +*/ +case OP_Savepoint: { + int p1; /* Value of P1 operand */ + char *zName; /* Name of savepoint */ + int nName; + Savepoint *pNew; + Savepoint *pSavepoint; + Savepoint *pTmp; + int iSavepoint; + int ii; + + p1 = pOp->p1; + zName = pOp->p4.z; + + /* Assert that the p1 parameter is valid. Also that if there is no open + ** transaction, then there cannot be any savepoints. + */ + assert( db->pSavepoint==0 || db->autoCommit==0 ); + assert( p1==SAVEPOINT_BEGIN||p1==SAVEPOINT_RELEASE||p1==SAVEPOINT_ROLLBACK ); + assert( db->pSavepoint || db->isTransactionSavepoint==0 ); + assert( checkSavepointCount(db) ); + assert( p->bIsReader ); + + if( p1==SAVEPOINT_BEGIN ){ + if( db->nVdbeWrite>0 ){ + /* A new savepoint cannot be created if there are active write + ** statements (i.e. open read/write incremental blob handles). + */ + sqlite3VdbeError(p, "cannot open savepoint - SQL statements in progress"); + rc = SQLITE_BUSY; + }else{ + nName = sqlite3Strlen30(zName); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* This call is Ok even if this savepoint is actually a transaction + ** savepoint (and therefore should not prompt xSavepoint()) callbacks. + ** If this is a transaction savepoint being opened, it is guaranteed + ** that the db->aVTrans[] array is empty. */ + assert( db->autoCommit==0 || db->nVTrans==0 ); + rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, + db->nStatement+db->nSavepoint); + if( rc!=SQLITE_OK ) goto abort_due_to_error; +#endif + + /* Create a new savepoint structure. */ + pNew = sqlite3DbMallocRawNN(db, sizeof(Savepoint)+nName+1); + if( pNew ){ + pNew->zName = (char *)&pNew[1]; + memcpy(pNew->zName, zName, nName+1); + + /* If there is no open transaction, then mark this as a special + ** "transaction savepoint". */ + if( db->autoCommit ){ + db->autoCommit = 0; + db->isTransactionSavepoint = 1; + }else{ + db->nSavepoint++; + } + + /* Link the new savepoint into the database handle's list. */ + pNew->pNext = db->pSavepoint; + db->pSavepoint = pNew; + pNew->nDeferredCons = db->nDeferredCons; + pNew->nDeferredImmCons = db->nDeferredImmCons; + } + } + }else{ + assert( p1==SAVEPOINT_RELEASE || p1==SAVEPOINT_ROLLBACK ); + iSavepoint = 0; + + /* Find the named savepoint. If there is no such savepoint, then an + ** an error is returned to the user. */ + for( + pSavepoint = db->pSavepoint; + pSavepoint && sqlite3StrICmp(pSavepoint->zName, zName); + pSavepoint = pSavepoint->pNext + ){ + iSavepoint++; + } + if( !pSavepoint ){ + sqlite3VdbeError(p, "no such savepoint: %s", zName); + rc = SQLITE_ERROR; + }else if( db->nVdbeWrite>0 && p1==SAVEPOINT_RELEASE ){ + /* It is not possible to release (commit) a savepoint if there are + ** active write statements. + */ + sqlite3VdbeError(p, "cannot release savepoint - " + "SQL statements in progress"); + rc = SQLITE_BUSY; + }else{ + + /* Determine whether or not this is a transaction savepoint. If so, + ** and this is a RELEASE command, then the current transaction + ** is committed. + */ + int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint; + if( isTransaction && p1==SAVEPOINT_RELEASE ){ + if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ + goto vdbe_return; + } + db->autoCommit = 1; + if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + db->autoCommit = 0; + p->rc = rc = SQLITE_BUSY; + goto vdbe_return; + } + rc = p->rc; + if( rc ){ + db->autoCommit = 0; + }else{ + db->isTransactionSavepoint = 0; + } + }else{ + int isSchemaChange; + iSavepoint = db->nSavepoint - iSavepoint - 1; + if( p1==SAVEPOINT_ROLLBACK ){ + isSchemaChange = (db->mDbFlags & DBFLAG_SchemaChange)!=0; + for(ii=0; iinDb; ii++){ + rc = sqlite3BtreeTripAllCursors(db->aDb[ii].pBt, + SQLITE_ABORT_ROLLBACK, + isSchemaChange==0); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + } + }else{ + assert( p1==SAVEPOINT_RELEASE ); + isSchemaChange = 0; + } + for(ii=0; iinDb; ii++){ + rc = sqlite3BtreeSavepoint(db->aDb[ii].pBt, p1, iSavepoint); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + } + if( isSchemaChange ){ + sqlite3ExpirePreparedStatements(db, 0); + sqlite3ResetAllSchemasOfConnection(db); + db->mDbFlags |= DBFLAG_SchemaChange; + } + } + if( rc ) goto abort_due_to_error; + + /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all + ** savepoints nested inside of the savepoint being operated on. */ + while( db->pSavepoint!=pSavepoint ){ + pTmp = db->pSavepoint; + db->pSavepoint = pTmp->pNext; + sqlite3DbFree(db, pTmp); + db->nSavepoint--; + } + + /* If it is a RELEASE, then destroy the savepoint being operated on + ** too. If it is a ROLLBACK TO, then set the number of deferred + ** constraint violations present in the database to the value stored + ** when the savepoint was created. */ + if( p1==SAVEPOINT_RELEASE ){ + assert( pSavepoint==db->pSavepoint ); + db->pSavepoint = pSavepoint->pNext; + sqlite3DbFree(db, pSavepoint); + if( !isTransaction ){ + db->nSavepoint--; + } + }else{ + assert( p1==SAVEPOINT_ROLLBACK ); + db->nDeferredCons = pSavepoint->nDeferredCons; + db->nDeferredImmCons = pSavepoint->nDeferredImmCons; + } + + if( !isTransaction || p1==SAVEPOINT_ROLLBACK ){ + rc = sqlite3VtabSavepoint(db, p1, iSavepoint); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + } + } + } + if( rc ) goto abort_due_to_error; + + break; +} + +/* Opcode: AutoCommit P1 P2 * * * +** +** Set the database auto-commit flag to P1 (1 or 0). If P2 is true, roll +** back any currently active btree transactions. If there are any active +** VMs (apart from this one), then a ROLLBACK fails. A COMMIT fails if +** there are active writing VMs or active VMs that use shared cache. +** +** This instruction causes the VM to halt. +*/ +case OP_AutoCommit: { + int desiredAutoCommit; + int iRollback; + + desiredAutoCommit = pOp->p1; + iRollback = pOp->p2; + assert( desiredAutoCommit==1 || desiredAutoCommit==0 ); + assert( desiredAutoCommit==1 || iRollback==0 ); + assert( db->nVdbeActive>0 ); /* At least this one VM is active */ + assert( p->bIsReader ); + + if( desiredAutoCommit!=db->autoCommit ){ + if( iRollback ){ + assert( desiredAutoCommit==1 ); + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + db->autoCommit = 1; + }else if( desiredAutoCommit && db->nVdbeWrite>0 ){ + /* If this instruction implements a COMMIT and other VMs are writing + ** return an error indicating that the other VMs must complete first. + */ + sqlite3VdbeError(p, "cannot commit transaction - " + "SQL statements in progress"); + rc = SQLITE_BUSY; + goto abort_due_to_error; + }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ + goto vdbe_return; + }else{ + db->autoCommit = (u8)desiredAutoCommit; + } + if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + db->autoCommit = (u8)(1-desiredAutoCommit); + p->rc = rc = SQLITE_BUSY; + goto vdbe_return; + } + sqlite3CloseSavepoints(db); + if( p->rc==SQLITE_OK ){ + rc = SQLITE_DONE; + }else{ + rc = SQLITE_ERROR; + } + goto vdbe_return; + }else{ + sqlite3VdbeError(p, + (!desiredAutoCommit)?"cannot start a transaction within a transaction":( + (iRollback)?"cannot rollback - no transaction is active": + "cannot commit - no transaction is active")); + + rc = SQLITE_ERROR; + goto abort_due_to_error; + } + /*NOTREACHED*/ assert(0); +} + +/* Opcode: Transaction P1 P2 P3 P4 P5 +** +** Begin a transaction on database P1 if a transaction is not already +** active. +** If P2 is non-zero, then a write-transaction is started, or if a +** read-transaction is already active, it is upgraded to a write-transaction. +** If P2 is zero, then a read-transaction is started. +** +** P1 is the index of the database file on which the transaction is +** started. Index 0 is the main database file and index 1 is the +** file used for temporary tables. Indices of 2 or more are used for +** attached databases. +** +** If a write-transaction is started and the Vdbe.usesStmtJournal flag is +** true (this flag is set if the Vdbe may modify more than one row and may +** throw an ABORT exception), a statement transaction may also be opened. +** More specifically, a statement transaction is opened iff the database +** connection is currently not in autocommit mode, or if there are other +** active statements. A statement transaction allows the changes made by this +** VDBE to be rolled back after an error without having to roll back the +** entire transaction. If no error is encountered, the statement transaction +** will automatically commit when the VDBE halts. +** +** If P5!=0 then this opcode also checks the schema cookie against P3 +** and the schema generation counter against P4. +** The cookie changes its value whenever the database schema changes. +** This operation is used to detect when that the cookie has changed +** and that the current process needs to reread the schema. If the schema +** cookie in P3 differs from the schema cookie in the database header or +** if the schema generation counter in P4 differs from the current +** generation counter, then an SQLITE_SCHEMA error is raised and execution +** halts. The sqlite3_step() wrapper function might then reprepare the +** statement and rerun it from the beginning. +*/ +case OP_Transaction: { + Btree *pBt; + int iMeta = 0; + + assert( p->bIsReader ); + assert( p->readOnly==0 || pOp->p2==0 ); + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + if( pOp->p2 && (db->flags & SQLITE_QueryOnly)!=0 ){ + rc = SQLITE_READONLY; + goto abort_due_to_error; + } + pBt = db->aDb[pOp->p1].pBt; + + if( pBt ){ + rc = sqlite3BtreeBeginTrans(pBt, pOp->p2, &iMeta); + testcase( rc==SQLITE_BUSY_SNAPSHOT ); + testcase( rc==SQLITE_BUSY_RECOVERY ); + if( rc!=SQLITE_OK ){ + if( (rc&0xff)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + p->rc = rc; + goto vdbe_return; + } + goto abort_due_to_error; + } + + if( p->usesStmtJournal + && pOp->p2 + && (db->autoCommit==0 || db->nVdbeRead>1) + ){ + assert( sqlite3BtreeIsInTrans(pBt) ); + if( p->iStatement==0 ){ + assert( db->nStatement>=0 && db->nSavepoint>=0 ); + db->nStatement++; + p->iStatement = db->nSavepoint + db->nStatement; + } + + rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement-1); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginStmt(pBt, p->iStatement); + } + + /* Store the current value of the database handles deferred constraint + ** counter. If the statement transaction needs to be rolled back, + ** the value of this counter needs to be restored too. */ + p->nStmtDefCons = db->nDeferredCons; + p->nStmtDefImmCons = db->nDeferredImmCons; + } + } + assert( pOp->p5==0 || pOp->p4type==P4_INT32 ); + if( pOp->p5 + && (iMeta!=pOp->p3 + || db->aDb[pOp->p1].pSchema->iGeneration!=pOp->p4.i) + ){ + /* + ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema + ** version is checked to ensure that the schema has not changed since the + ** SQL statement was prepared. + */ + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed"); + /* If the schema-cookie from the database file matches the cookie + ** stored with the in-memory representation of the schema, do + ** not reload the schema from the database file. + ** + ** If virtual-tables are in use, this is not just an optimization. + ** Often, v-tables store their data in other SQLite tables, which + ** are queried from within xNext() and other v-table methods using + ** prepared queries. If such a query is out-of-date, we do not want to + ** discard the database schema, as the user code implementing the + ** v-table would have to be ready for the sqlite3_vtab structure itself + ** to be invalidated whenever sqlite3_step() is called from within + ** a v-table method. + */ + if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ + sqlite3ResetOneSchema(db, pOp->p1); + } + p->expired = 1; + rc = SQLITE_SCHEMA; + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: ReadCookie P1 P2 P3 * * +** +** Read cookie number P3 from database P1 and write it into register P2. +** P3==1 is the schema version. P3==2 is the database format. +** P3==3 is the recommended pager cache size, and so forth. P1==0 is +** the main database file and P1==1 is the database file used to store +** temporary tables. +** +** There must be a read-lock on the database (either a transaction +** must be started or there must be an open cursor) before +** executing this instruction. +*/ +case OP_ReadCookie: { /* out2 */ + int iMeta; + int iDb; + int iCookie; + + assert( p->bIsReader ); + iDb = pOp->p1; + iCookie = pOp->p3; + assert( pOp->p3=0 && iDbnDb ); + assert( db->aDb[iDb].pBt!=0 ); + assert( DbMaskTest(p->btreeMask, iDb) ); + + sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32 *)&iMeta); + pOut = out2Prerelease(p, pOp); + pOut->u.i = iMeta; + break; +} + +/* Opcode: SetCookie P1 P2 P3 * * +** +** Write the integer value P3 into cookie number P2 of database P1. +** P2==1 is the schema version. P2==2 is the database format. +** P2==3 is the recommended pager cache +** size, and so forth. P1==0 is the main database file and P1==1 is the +** database file used to store temporary tables. +** +** A transaction must be started before executing this opcode. +*/ +case OP_SetCookie: { + Db *pDb; + + sqlite3VdbeIncrWriteCounter(p, 0); + assert( pOp->p2p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( p->readOnly==0 ); + pDb = &db->aDb[pOp->p1]; + assert( pDb->pBt!=0 ); + assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); + /* See note about index shifting on OP_ReadCookie */ + rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3); + if( pOp->p2==BTREE_SCHEMA_VERSION ){ + /* When the schema cookie changes, record the new cookie internally */ + pDb->pSchema->schema_cookie = pOp->p3; + db->mDbFlags |= DBFLAG_SchemaChange; + }else if( pOp->p2==BTREE_FILE_FORMAT ){ + /* Record changes in the file format */ + pDb->pSchema->file_format = pOp->p3; + } + if( pOp->p1==1 ){ + /* Invalidate all prepared statements whenever the TEMP database + ** schema is changed. Ticket #1644 */ + sqlite3ExpirePreparedStatements(db, 0); + p->expired = 0; + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: OpenRead P1 P2 P3 P4 P5 +** Synopsis: root=P2 iDb=P3 +** +** Open a read-only cursor for the database table whose root page is +** P2 in a database file. The database file is determined by P3. +** P3==0 means the main database, P3==1 means the database used for +** temporary tables, and P3>1 means used the corresponding attached +** database. Give the new cursor an identifier of P1. The P1 +** values need not be contiguous but all P1 values should be small integers. +** It is an error for P1 to be negative. +** +** Allowed P5 bits: +**
      +**
    • 0x02 OPFLAG_SEEKEQ: This cursor will only be used for +** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT +** of OP_SeekLE/OP_IdxLT) +**
    +** +** The P4 value may be either an integer (P4_INT32) or a pointer to +** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo +** object, then table being opened must be an [index b-tree] where the +** KeyInfo object defines the content and collating +** sequence of that index b-tree. Otherwise, if P4 is an integer +** value, then the table being opened must be a [table b-tree] with a +** number of columns no less than the value of P4. +** +** See also: OpenWrite, ReopenIdx +*/ +/* Opcode: ReopenIdx P1 P2 P3 P4 P5 +** Synopsis: root=P2 iDb=P3 +** +** The ReopenIdx opcode works like OP_OpenRead except that it first +** checks to see if the cursor on P1 is already open on the same +** b-tree and if it is this opcode becomes a no-op. In other words, +** if the cursor is already open, do not reopen it. +** +** The ReopenIdx opcode may only be used with P5==0 or P5==OPFLAG_SEEKEQ +** and with P4 being a P4_KEYINFO object. Furthermore, the P3 value must +** be the same as every other ReopenIdx or OpenRead for the same cursor +** number. +** +** Allowed P5 bits: +**
      +**
    • 0x02 OPFLAG_SEEKEQ: This cursor will only be used for +** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT +** of OP_SeekLE/OP_IdxLT) +**
    +** +** See also: OP_OpenRead, OP_OpenWrite +*/ +/* Opcode: OpenWrite P1 P2 P3 P4 P5 +** Synopsis: root=P2 iDb=P3 +** +** Open a read/write cursor named P1 on the table or index whose root +** page is P2 (or whose root page is held in register P2 if the +** OPFLAG_P2ISREG bit is set in P5 - see below). +** +** The P4 value may be either an integer (P4_INT32) or a pointer to +** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo +** object, then table being opened must be an [index b-tree] where the +** KeyInfo object defines the content and collating +** sequence of that index b-tree. Otherwise, if P4 is an integer +** value, then the table being opened must be a [table b-tree] with a +** number of columns no less than the value of P4. +** +** Allowed P5 bits: +**
      +**
    • 0x02 OPFLAG_SEEKEQ: This cursor will only be used for +** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT +** of OP_SeekLE/OP_IdxLT) +**
    • 0x08 OPFLAG_FORDELETE: This cursor is used only to seek +** and subsequently delete entries in an index btree. This is a +** hint to the storage engine that the storage engine is allowed to +** ignore. The hint is not used by the official SQLite b*tree storage +** engine, but is used by COMDB2. +**
    • 0x10 OPFLAG_P2ISREG: Use the content of register P2 +** as the root page, not the value of P2 itself. +**
    +** +** This instruction works like OpenRead except that it opens the cursor +** in read/write mode. +** +** See also: OP_OpenRead, OP_ReopenIdx +*/ +case OP_ReopenIdx: { + int nField; + KeyInfo *pKeyInfo; + int p2; + int iDb; + int wrFlag; + Btree *pX; + VdbeCursor *pCur; + Db *pDb; + + assert( pOp->p5==0 || pOp->p5==OPFLAG_SEEKEQ ); + assert( pOp->p4type==P4_KEYINFO ); + pCur = p->apCsr[pOp->p1]; + if( pCur && pCur->pgnoRoot==(u32)pOp->p2 ){ + assert( pCur->iDb==pOp->p3 ); /* Guaranteed by the code generator */ + goto open_cursor_set_hints; + } + /* If the cursor is not currently open or is open on a different + ** index, then fall through into OP_OpenRead to force a reopen */ +case OP_OpenRead: +case OP_OpenWrite: + + assert( pOp->opcode==OP_OpenWrite || pOp->p5==0 || pOp->p5==OPFLAG_SEEKEQ ); + assert( p->bIsReader ); + assert( pOp->opcode==OP_OpenRead || pOp->opcode==OP_ReopenIdx + || p->readOnly==0 ); + + if( p->expired==1 ){ + rc = SQLITE_ABORT_ROLLBACK; + goto abort_due_to_error; + } + + nField = 0; + pKeyInfo = 0; + p2 = pOp->p2; + iDb = pOp->p3; + assert( iDb>=0 && iDbnDb ); + assert( DbMaskTest(p->btreeMask, iDb) ); + pDb = &db->aDb[iDb]; + pX = pDb->pBt; + assert( pX!=0 ); + if( pOp->opcode==OP_OpenWrite ){ + assert( OPFLAG_FORDELETE==BTREE_FORDELETE ); + wrFlag = BTREE_WRCSR | (pOp->p5 & OPFLAG_FORDELETE); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( pDb->pSchema->file_format < p->minWriteFileFormat ){ + p->minWriteFileFormat = pDb->pSchema->file_format; + } + }else{ + wrFlag = 0; + } + if( pOp->p5 & OPFLAG_P2ISREG ){ + assert( p2>0 ); + assert( p2<=(p->nMem+1 - p->nCursor) ); + assert( pOp->opcode==OP_OpenWrite ); + pIn2 = &aMem[p2]; + assert( memIsValid(pIn2) ); + assert( (pIn2->flags & MEM_Int)!=0 ); + sqlite3VdbeMemIntegerify(pIn2); + p2 = (int)pIn2->u.i; + /* The p2 value always comes from a prior OP_CreateBtree opcode and + ** that opcode will always set the p2 value to 2 or more or else fail. + ** If there were a failure, the prepared statement would have halted + ** before reaching this instruction. */ + assert( p2>=2 ); + } + if( pOp->p4type==P4_KEYINFO ){ + pKeyInfo = pOp->p4.pKeyInfo; + assert( pKeyInfo->enc==ENC(db) ); + assert( pKeyInfo->db==db ); + nField = pKeyInfo->nAllField; + }else if( pOp->p4type==P4_INT32 ){ + nField = pOp->p4.i; + } + assert( pOp->p1>=0 ); + assert( nField>=0 ); + testcase( nField==0 ); /* Table with INTEGER PRIMARY KEY and nothing else */ + pCur = allocateCursor(p, pOp->p1, nField, iDb, CURTYPE_BTREE); + if( pCur==0 ) goto no_mem; + pCur->nullRow = 1; + pCur->isOrdered = 1; + pCur->pgnoRoot = p2; +#ifdef SQLITE_DEBUG + pCur->wrFlag = wrFlag; +#endif + rc = sqlite3BtreeCursor(pX, p2, wrFlag, pKeyInfo, pCur->uc.pCursor); + pCur->pKeyInfo = pKeyInfo; + /* Set the VdbeCursor.isTable variable. Previous versions of + ** SQLite used to check if the root-page flags were sane at this point + ** and report database corruption if they were not, but this check has + ** since moved into the btree layer. */ + pCur->isTable = pOp->p4type!=P4_KEYINFO; + +open_cursor_set_hints: + assert( OPFLAG_BULKCSR==BTREE_BULKLOAD ); + assert( OPFLAG_SEEKEQ==BTREE_SEEK_EQ ); + testcase( pOp->p5 & OPFLAG_BULKCSR ); + testcase( pOp->p2 & OPFLAG_SEEKEQ ); + sqlite3BtreeCursorHintFlags(pCur->uc.pCursor, + (pOp->p5 & (OPFLAG_BULKCSR|OPFLAG_SEEKEQ))); + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: OpenDup P1 P2 * * * +** +** Open a new cursor P1 that points to the same ephemeral table as +** cursor P2. The P2 cursor must have been opened by a prior OP_OpenEphemeral +** opcode. Only ephemeral cursors may be duplicated. +** +** Duplicate ephemeral cursors are used for self-joins of materialized views. +*/ +case OP_OpenDup: { + VdbeCursor *pOrig; /* The original cursor to be duplicated */ + VdbeCursor *pCx; /* The new cursor */ + + pOrig = p->apCsr[pOp->p2]; + assert( pOrig ); + assert( pOrig->pBtx!=0 ); /* Only ephemeral cursors can be duplicated */ + + pCx = allocateCursor(p, pOp->p1, pOrig->nField, -1, CURTYPE_BTREE); + if( pCx==0 ) goto no_mem; + pCx->nullRow = 1; + pCx->isEphemeral = 1; + pCx->pKeyInfo = pOrig->pKeyInfo; + pCx->isTable = pOrig->isTable; + pCx->pgnoRoot = pOrig->pgnoRoot; + pCx->isOrdered = pOrig->isOrdered; + rc = sqlite3BtreeCursor(pOrig->pBtx, pCx->pgnoRoot, BTREE_WRCSR, + pCx->pKeyInfo, pCx->uc.pCursor); + /* The sqlite3BtreeCursor() routine can only fail for the first cursor + ** opened for a database. Since there is already an open cursor when this + ** opcode is run, the sqlite3BtreeCursor() cannot fail */ + assert( rc==SQLITE_OK ); + break; +} + + +/* Opcode: OpenEphemeral P1 P2 * P4 P5 +** Synopsis: nColumn=P2 +** +** Open a new cursor P1 to a transient table. +** The cursor is always opened read/write even if +** the main database is read-only. The ephemeral +** table is deleted automatically when the cursor is closed. +** +** If the cursor P1 is already opened on an ephemeral table, the table +** is cleared (all content is erased). +** +** P2 is the number of columns in the ephemeral table. +** The cursor points to a BTree table if P4==0 and to a BTree index +** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure +** that defines the format of keys in the index. +** +** The P5 parameter can be a mask of the BTREE_* flags defined +** in btree.h. These flags control aspects of the operation of +** the btree. The BTREE_OMIT_JOURNAL and BTREE_SINGLE flags are +** added automatically. +*/ +/* Opcode: OpenAutoindex P1 P2 * P4 * +** Synopsis: nColumn=P2 +** +** This opcode works the same as OP_OpenEphemeral. It has a +** different name to distinguish its use. Tables created using +** by this opcode will be used for automatically created transient +** indices in joins. +*/ +case OP_OpenAutoindex: +case OP_OpenEphemeral: { + VdbeCursor *pCx; + KeyInfo *pKeyInfo; + + static const int vfsFlags = + SQLITE_OPEN_READWRITE | + SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | + SQLITE_OPEN_DELETEONCLOSE | + SQLITE_OPEN_TRANSIENT_DB; + assert( pOp->p1>=0 ); + assert( pOp->p2>=0 ); + pCx = p->apCsr[pOp->p1]; + if( pCx && pCx->pBtx ){ + /* If the ephermeral table is already open, erase all existing content + ** so that the table is empty again, rather than creating a new table. */ + assert( pCx->isEphemeral ); + pCx->seqCount = 0; + pCx->cacheStatus = CACHE_STALE; + rc = sqlite3BtreeClearTable(pCx->pBtx, pCx->pgnoRoot, 0); + }else{ + pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); + if( pCx==0 ) goto no_mem; + pCx->isEphemeral = 1; + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, + BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, + vfsFlags); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0); + } + if( rc==SQLITE_OK ){ + /* If a transient index is required, create it by calling + ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before + ** opening it. If a transient table is required, just use the + ** automatically created table with root-page 1 (an BLOB_INTKEY table). + */ + if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ + assert( pOp->p4type==P4_KEYINFO ); + rc = sqlite3BtreeCreateTable(pCx->pBtx, (int*)&pCx->pgnoRoot, + BTREE_BLOBKEY | pOp->p5); + if( rc==SQLITE_OK ){ + assert( pCx->pgnoRoot==MASTER_ROOT+1 ); + assert( pKeyInfo->db==db ); + assert( pKeyInfo->enc==ENC(db) ); + rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR, + pKeyInfo, pCx->uc.pCursor); + } + pCx->isTable = 0; + }else{ + pCx->pgnoRoot = MASTER_ROOT; + rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, + 0, pCx->uc.pCursor); + pCx->isTable = 1; + } + } + pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); + } + if( rc ) goto abort_due_to_error; + pCx->nullRow = 1; + break; +} + +/* Opcode: SorterOpen P1 P2 P3 P4 * +** +** This opcode works like OP_OpenEphemeral except that it opens +** a transient index that is specifically designed to sort large +** tables using an external merge-sort algorithm. +** +** If argument P3 is non-zero, then it indicates that the sorter may +** assume that a stable sort considering the first P3 fields of each +** key is sufficient to produce the required results. +*/ +case OP_SorterOpen: { + VdbeCursor *pCx; + + assert( pOp->p1>=0 ); + assert( pOp->p2>=0 ); + pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_SORTER); + if( pCx==0 ) goto no_mem; + pCx->pKeyInfo = pOp->p4.pKeyInfo; + assert( pCx->pKeyInfo->db==db ); + assert( pCx->pKeyInfo->enc==ENC(db) ); + rc = sqlite3VdbeSorterInit(db, pOp->p3, pCx); + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: SequenceTest P1 P2 * * * +** Synopsis: if( cursor[P1].ctr++ ) pc = P2 +** +** P1 is a sorter cursor. If the sequence counter is currently zero, jump +** to P2. Regardless of whether or not the jump is taken, increment the +** the sequence value. +*/ +case OP_SequenceTest: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + if( (pC->seqCount++)==0 ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: OpenPseudo P1 P2 P3 * * +** Synopsis: P3 columns in r[P2] +** +** Open a new cursor that points to a fake table that contains a single +** row of data. The content of that one row is the content of memory +** register P2. In other words, cursor P1 becomes an alias for the +** MEM_Blob content contained in register P2. +** +** A pseudo-table created by this opcode is used to hold a single +** row output from the sorter so that the row can be decomposed into +** individual columns using the OP_Column opcode. The OP_Column opcode +** is the only cursor opcode that works with a pseudo-table. +** +** P3 is the number of fields in the records that will be stored by +** the pseudo-table. +*/ +case OP_OpenPseudo: { + VdbeCursor *pCx; + + assert( pOp->p1>=0 ); + assert( pOp->p3>=0 ); + pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, CURTYPE_PSEUDO); + if( pCx==0 ) goto no_mem; + pCx->nullRow = 1; + pCx->seekResult = pOp->p2; + pCx->isTable = 1; + /* Give this pseudo-cursor a fake BtCursor pointer so that pCx + ** can be safely passed to sqlite3VdbeCursorMoveto(). This avoids a test + ** for pCx->eCurType==CURTYPE_BTREE inside of sqlite3VdbeCursorMoveto() + ** which is a performance optimization */ + pCx->uc.pCursor = sqlite3BtreeFakeValidCursor(); + assert( pOp->p5==0 ); + break; +} + +/* Opcode: Close P1 * * * * +** +** Close a cursor previously opened as P1. If P1 is not +** currently open, this instruction is a no-op. +*/ +case OP_Close: { + assert( pOp->p1>=0 && pOp->p1nCursor ); + sqlite3VdbeFreeCursor(p, p->apCsr[pOp->p1]); + p->apCsr[pOp->p1] = 0; + break; +} + +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK +/* Opcode: ColumnsUsed P1 * * P4 * +** +** This opcode (which only exists if SQLite was compiled with +** SQLITE_ENABLE_COLUMN_USED_MASK) identifies which columns of the +** table or index for cursor P1 are used. P4 is a 64-bit integer +** (P4_INT64) in which the first 63 bits are one for each of the +** first 63 columns of the table or index that are actually used +** by the cursor. The high-order bit is set if any column after +** the 64th is used. +*/ +case OP_ColumnsUsed: { + VdbeCursor *pC; + pC = p->apCsr[pOp->p1]; + assert( pC->eCurType==CURTYPE_BTREE ); + pC->maskUsed = *(u64*)pOp->p4.pI64; + break; +} +#endif + +/* Opcode: SeekGE P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as the key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the smallest entry that +** is greater than or equal to the key value. If there are no records +** greater than or equal to the key and P2 is not zero, then jump to P2. +** +** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this +** opcode will either land on a record that exactly matches the key, or +** else it will cause a jump to P2. When the cursor is OPFLAG_SEEKEQ, +** this opcode must be followed by an IdxLE opcode with the same arguments. +** The IdxGT opcode will be skipped if this opcode succeeds, but the +** IdxGT opcode will be used on subsequent loop iterations. The +** OPFLAG_SEEKEQ flags is a hint to the btree layer to say that this +** is an equality search. +** +** This opcode leaves the cursor configured to move in forward order, +** from the beginning toward the end. In other words, the cursor is +** configured to use Next, not Prev. +** +** See also: Found, NotFound, SeekLt, SeekGt, SeekLe +*/ +/* Opcode: SeekGT P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the smallest entry that +** is greater than the key value. If there are no records greater than +** the key and P2 is not zero, then jump to P2. +** +** This opcode leaves the cursor configured to move in forward order, +** from the beginning toward the end. In other words, the cursor is +** configured to use Next, not Prev. +** +** See also: Found, NotFound, SeekLt, SeekGe, SeekLe +*/ +/* Opcode: SeekLT P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the largest entry that +** is less than the key value. If there are no records less than +** the key and P2 is not zero, then jump to P2. +** +** This opcode leaves the cursor configured to move in reverse order, +** from the end toward the beginning. In other words, the cursor is +** configured to use Prev, not Next. +** +** See also: Found, NotFound, SeekGt, SeekGe, SeekLe +*/ +/* Opcode: SeekLE P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the largest entry that +** is less than or equal to the key value. If there are no records +** less than or equal to the key and P2 is not zero, then jump to P2. +** +** This opcode leaves the cursor configured to move in reverse order, +** from the end toward the beginning. In other words, the cursor is +** configured to use Prev, not Next. +** +** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this +** opcode will either land on a record that exactly matches the key, or +** else it will cause a jump to P2. When the cursor is OPFLAG_SEEKEQ, +** this opcode must be followed by an IdxLE opcode with the same arguments. +** The IdxGE opcode will be skipped if this opcode succeeds, but the +** IdxGE opcode will be used on subsequent loop iterations. The +** OPFLAG_SEEKEQ flags is a hint to the btree layer to say that this +** is an equality search. +** +** See also: Found, NotFound, SeekGt, SeekGe, SeekLt +*/ +case OP_SeekLT: /* jump, in3, group */ +case OP_SeekLE: /* jump, in3, group */ +case OP_SeekGE: /* jump, in3, group */ +case OP_SeekGT: { /* jump, in3, group */ + int res; /* Comparison result */ + int oc; /* Opcode */ + VdbeCursor *pC; /* The cursor to seek */ + UnpackedRecord r; /* The key to seek for */ + int nField; /* Number of columns or fields in the key */ + i64 iKey; /* The rowid we are to seek to */ + int eqOnly; /* Only interested in == results */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p2!=0 ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( OP_SeekLE == OP_SeekLT+1 ); + assert( OP_SeekGE == OP_SeekLT+2 ); + assert( OP_SeekGT == OP_SeekLT+3 ); + assert( pC->isOrdered ); + assert( pC->uc.pCursor!=0 ); + oc = pOp->opcode; + eqOnly = 0; + pC->nullRow = 0; +#ifdef SQLITE_DEBUG + pC->seekOp = pOp->opcode; +#endif + + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + if( pC->isTable ){ + u16 flags3, newType; + /* The OPFLAG_SEEKEQ/BTREE_SEEK_EQ flag is only set on index cursors */ + assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 + || CORRUPT_DB ); + + /* The input value in P3 might be of any type: integer, real, string, + ** blob, or NULL. But it needs to be an integer before we can do + ** the seek, so convert it. */ + pIn3 = &aMem[pOp->p3]; + flags3 = pIn3->flags; + if( (flags3 & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn3, 0); + } + iKey = sqlite3VdbeIntValue(pIn3); /* Get the integer key value */ + newType = pIn3->flags; /* Record the type after applying numeric affinity */ + pIn3->flags = flags3; /* But convert the type back to its original */ + + /* If the P3 value could not be converted into an integer without + ** loss of information, then special processing is required... */ + if( (newType & (MEM_Int|MEM_IntReal))==0 ){ + if( (newType & MEM_Real)==0 ){ + if( (newType & MEM_Null) || oc>=OP_SeekGE ){ + VdbeBranchTaken(1,2); + goto jump_to_p2; + }else{ + rc = sqlite3BtreeLast(pC->uc.pCursor, &res); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + goto seek_not_found; + } + }else + + /* If the approximation iKey is larger than the actual real search + ** term, substitute >= for > and < for <=. e.g. if the search term + ** is 4.9 and the integer approximation 5: + ** + ** (x > 4.9) -> (x >= 5) + ** (x <= 4.9) -> (x < 5) + */ + if( pIn3->u.r<(double)iKey ){ + assert( OP_SeekGE==(OP_SeekGT-1) ); + assert( OP_SeekLT==(OP_SeekLE-1) ); + assert( (OP_SeekLE & 0x0001)==(OP_SeekGT & 0x0001) ); + if( (oc & 0x0001)==(OP_SeekGT & 0x0001) ) oc--; + } + + /* If the approximation iKey is smaller than the actual real search + ** term, substitute <= for < and > for >=. */ + else if( pIn3->u.r>(double)iKey ){ + assert( OP_SeekLE==(OP_SeekLT+1) ); + assert( OP_SeekGT==(OP_SeekGE+1) ); + assert( (OP_SeekLT & 0x0001)==(OP_SeekGE & 0x0001) ); + if( (oc & 0x0001)==(OP_SeekLT & 0x0001) ) oc++; + } + } + rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)iKey, 0, &res); + pC->movetoTarget = iKey; /* Used by OP_Delete */ + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + }else{ + /* For a cursor with the OPFLAG_SEEKEQ/BTREE_SEEK_EQ hint, only the + ** OP_SeekGE and OP_SeekLE opcodes are allowed, and these must be + ** immediately followed by an OP_IdxGT or OP_IdxLT opcode, respectively, + ** with the same key. + */ + if( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ) ){ + eqOnly = 1; + assert( pOp->opcode==OP_SeekGE || pOp->opcode==OP_SeekLE ); + assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT ); + assert( pOp->opcode==OP_SeekGE || pOp[1].opcode==OP_IdxLT ); + assert( pOp->opcode==OP_SeekLE || pOp[1].opcode==OP_IdxGT ); + assert( pOp[1].p1==pOp[0].p1 ); + assert( pOp[1].p2==pOp[0].p2 ); + assert( pOp[1].p3==pOp[0].p3 ); + assert( pOp[1].p4.i==pOp[0].p4.i ); + } + + nField = pOp->p4.i; + assert( pOp->p4type==P4_INT32 ); + assert( nField>0 ); + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)nField; + + /* The next line of code computes as follows, only faster: + ** if( oc==OP_SeekGT || oc==OP_SeekLE ){ + ** r.default_rc = -1; + ** }else{ + ** r.default_rc = +1; + ** } + */ + r.default_rc = ((1 & (oc - OP_SeekLT)) ? -1 : +1); + assert( oc!=OP_SeekGT || r.default_rc==-1 ); + assert( oc!=OP_SeekLE || r.default_rc==-1 ); + assert( oc!=OP_SeekGE || r.default_rc==+1 ); + assert( oc!=OP_SeekLT || r.default_rc==+1 ); + + r.aMem = &aMem[pOp->p3]; +#ifdef SQLITE_DEBUG + { int i; for(i=0; iuc.pCursor, &r, 0, 0, &res); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + if( eqOnly && r.eqSeen==0 ){ + assert( res!=0 ); + goto seek_not_found; + } + } +#ifdef SQLITE_TEST + sqlite3_search_count++; +#endif + if( oc>=OP_SeekGE ){ assert( oc==OP_SeekGE || oc==OP_SeekGT ); + if( res<0 || (res==0 && oc==OP_SeekGT) ){ + res = 0; + rc = sqlite3BtreeNext(pC->uc.pCursor, 0); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + res = 1; + }else{ + goto abort_due_to_error; + } + } + }else{ + res = 0; + } + }else{ + assert( oc==OP_SeekLT || oc==OP_SeekLE ); + if( res>0 || (res==0 && oc==OP_SeekLT) ){ + res = 0; + rc = sqlite3BtreePrevious(pC->uc.pCursor, 0); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + res = 1; + }else{ + goto abort_due_to_error; + } + } + }else{ + /* res might be negative because the table is empty. Check to + ** see if this is the case. + */ + res = sqlite3BtreeEof(pC->uc.pCursor); + } + } +seek_not_found: + assert( pOp->p2>0 ); + VdbeBranchTaken(res!=0,2); + if( res ){ + goto jump_to_p2; + }else if( eqOnly ){ + assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT ); + pOp++; /* Skip the OP_IdxLt or OP_IdxGT that follows */ + } + break; +} + +/* Opcode: SeekHit P1 P2 * * * +** Synopsis: seekHit=P2 +** +** Set the seekHit flag on cursor P1 to the value in P2. +* The seekHit flag is used by the IfNoHope opcode. +** +** P1 must be a valid b-tree cursor. P2 must be a boolean value, +** either 0 or 1. +*/ +case OP_SeekHit: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pOp->p2==0 || pOp->p2==1 ); + pC->seekHit = pOp->p2 & 1; + break; +} + +/* Opcode: IfNotOpen P1 P2 * * * +** Synopsis: if( !csr[P1] ) goto P2 +** +** If cursor P1 is not open, jump to instruction P2. Otherwise, fall through. +*/ +case OP_IfNotOpen: { /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + VdbeBranchTaken(p->apCsr[pOp->p1]==0, 2); + if( !p->apCsr[pOp->p1] ){ + goto jump_to_p2_and_check_for_interrupt; + } + break; +} + +/* Opcode: Found P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If P4==0 then register P3 holds a blob constructed by MakeRecord. If +** P4>0 then register P3 is the first of P4 registers that form an unpacked +** record. +** +** Cursor P1 is on an index btree. If the record identified by P3 and P4 +** is a prefix of any entry in P1 then a jump is made to P2 and +** P1 is left pointing at the matching entry. +** +** This operation leaves the cursor in a state where it can be +** advanced in the forward direction. The Next instruction will work, +** but not the Prev instruction. +** +** See also: NotFound, NoConflict, NotExists. SeekGe +*/ +/* Opcode: NotFound P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If P4==0 then register P3 holds a blob constructed by MakeRecord. If +** P4>0 then register P3 is the first of P4 registers that form an unpacked +** record. +** +** Cursor P1 is on an index btree. If the record identified by P3 and P4 +** is not the prefix of any entry in P1 then a jump is made to P2. If P1 +** does contain an entry whose prefix matches the P3/P4 record then control +** falls through to the next instruction and P1 is left pointing at the +** matching entry. +** +** This operation leaves the cursor in a state where it cannot be +** advanced in either direction. In other words, the Next and Prev +** opcodes do not work after this operation. +** +** See also: Found, NotExists, NoConflict, IfNoHope +*/ +/* Opcode: IfNoHope P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** Register P3 is the first of P4 registers that form an unpacked +** record. +** +** Cursor P1 is on an index btree. If the seekHit flag is set on P1, then +** this opcode is a no-op. But if the seekHit flag of P1 is clear, then +** check to see if there is any entry in P1 that matches the +** prefix identified by P3 and P4. If no entry matches the prefix, +** jump to P2. Otherwise fall through. +** +** This opcode behaves like OP_NotFound if the seekHit +** flag is clear and it behaves like OP_Noop if the seekHit flag is set. +** +** This opcode is used in IN clause processing for a multi-column key. +** If an IN clause is attached to an element of the key other than the +** left-most element, and if there are no matches on the most recent +** seek over the whole key, then it might be that one of the key element +** to the left is prohibiting a match, and hence there is "no hope" of +** any match regardless of how many IN clause elements are checked. +** In such a case, we abandon the IN clause search early, using this +** opcode. The opcode name comes from the fact that the +** jump is taken if there is "no hope" of achieving a match. +** +** See also: NotFound, SeekHit +*/ +/* Opcode: NoConflict P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If P4==0 then register P3 holds a blob constructed by MakeRecord. If +** P4>0 then register P3 is the first of P4 registers that form an unpacked +** record. +** +** Cursor P1 is on an index btree. If the record identified by P3 and P4 +** contains any NULL value, jump immediately to P2. If all terms of the +** record are not-NULL then a check is done to determine if any row in the +** P1 index btree has a matching key prefix. If there are no matches, jump +** immediately to P2. If there is a match, fall through and leave the P1 +** cursor pointing to the matching row. +** +** This opcode is similar to OP_NotFound with the exceptions that the +** branch is always taken if any part of the search key input is NULL. +** +** This operation leaves the cursor in a state where it cannot be +** advanced in either direction. In other words, the Next and Prev +** opcodes do not work after this operation. +** +** See also: NotFound, Found, NotExists +*/ +case OP_IfNoHope: { /* jump, in3 */ + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + if( pC->seekHit ) break; + /* Fall through into OP_NotFound */ +} +case OP_NoConflict: /* jump, in3 */ +case OP_NotFound: /* jump, in3 */ +case OP_Found: { /* jump, in3 */ + int alreadyExists; + int takeJump; + int ii; + VdbeCursor *pC; + int res; + UnpackedRecord *pFree; + UnpackedRecord *pIdxKey; + UnpackedRecord r; + +#ifdef SQLITE_TEST + if( pOp->opcode!=OP_NoConflict ) sqlite3_found_count++; +#endif + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p4type==P4_INT32 ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); +#ifdef SQLITE_DEBUG + pC->seekOp = pOp->opcode; +#endif + pIn3 = &aMem[pOp->p3]; + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + assert( pC->isTable==0 ); + if( pOp->p4.i>0 ){ + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)pOp->p4.i; + r.aMem = pIn3; +#ifdef SQLITE_DEBUG + for(ii=0; iip3+ii, &r.aMem[ii]); + } +#endif + pIdxKey = &r; + pFree = 0; + }else{ + assert( pIn3->flags & MEM_Blob ); + rc = ExpandBlob(pIn3); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + if( rc ) goto no_mem; + pFree = pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo); + if( pIdxKey==0 ) goto no_mem; + sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z, pIdxKey); + } + pIdxKey->default_rc = 0; + takeJump = 0; + if( pOp->opcode==OP_NoConflict ){ + /* For the OP_NoConflict opcode, take the jump if any of the + ** input fields are NULL, since any key with a NULL will not + ** conflict */ + for(ii=0; iinField; ii++){ + if( pIdxKey->aMem[ii].flags & MEM_Null ){ + takeJump = 1; + break; + } + } + } + rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, pIdxKey, 0, 0, &res); + if( pFree ) sqlite3DbFreeNN(db, pFree); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + pC->seekResult = res; + alreadyExists = (res==0); + pC->nullRow = 1-alreadyExists; + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + if( pOp->opcode==OP_Found ){ + VdbeBranchTaken(alreadyExists!=0,2); + if( alreadyExists ) goto jump_to_p2; + }else{ + VdbeBranchTaken(takeJump||alreadyExists==0,2); + if( takeJump || !alreadyExists ) goto jump_to_p2; + } + break; +} + +/* Opcode: SeekRowid P1 P2 P3 * * +** Synopsis: intkey=r[P3] +** +** P1 is the index of a cursor open on an SQL table btree (with integer +** keys). If register P3 does not contain an integer or if P1 does not +** contain a record with rowid P3 then jump immediately to P2. +** Or, if P2 is 0, raise an SQLITE_CORRUPT error. If P1 does contain +** a record with rowid P3 then +** leave the cursor pointing at that record and fall through to the next +** instruction. +** +** The OP_NotExists opcode performs the same operation, but with OP_NotExists +** the P3 register must be guaranteed to contain an integer value. With this +** opcode, register P3 might not contain an integer. +** +** The OP_NotFound opcode performs the same operation on index btrees +** (with arbitrary multi-value keys). +** +** This opcode leaves the cursor in a state where it cannot be advanced +** in either direction. In other words, the Next and Prev opcodes will +** not work following this opcode. +** +** See also: Found, NotFound, NoConflict, SeekRowid +*/ +/* Opcode: NotExists P1 P2 P3 * * +** Synopsis: intkey=r[P3] +** +** P1 is the index of a cursor open on an SQL table btree (with integer +** keys). P3 is an integer rowid. If P1 does not contain a record with +** rowid P3 then jump immediately to P2. Or, if P2 is 0, raise an +** SQLITE_CORRUPT error. If P1 does contain a record with rowid P3 then +** leave the cursor pointing at that record and fall through to the next +** instruction. +** +** The OP_SeekRowid opcode performs the same operation but also allows the +** P3 register to contain a non-integer value, in which case the jump is +** always taken. This opcode requires that P3 always contain an integer. +** +** The OP_NotFound opcode performs the same operation on index btrees +** (with arbitrary multi-value keys). +** +** This opcode leaves the cursor in a state where it cannot be advanced +** in either direction. In other words, the Next and Prev opcodes will +** not work following this opcode. +** +** See also: Found, NotFound, NoConflict, SeekRowid +*/ +case OP_SeekRowid: { /* jump, in3 */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + u64 iKey; + + pIn3 = &aMem[pOp->p3]; + testcase( pIn3->flags & MEM_Int ); + testcase( pIn3->flags & MEM_IntReal ); + testcase( pIn3->flags & MEM_Real ); + testcase( (pIn3->flags & (MEM_Str|MEM_Int))==MEM_Str ); + if( (pIn3->flags & (MEM_Int|MEM_IntReal))==0 ){ + /* If pIn3->u.i does not contain an integer, compute iKey as the + ** integer value of pIn3. Jump to P2 if pIn3 cannot be converted + ** into an integer without loss of information. Take care to avoid + ** changing the datatype of pIn3, however, as it is used by other + ** parts of the prepared statement. */ + Mem x = pIn3[0]; + applyAffinity(&x, SQLITE_AFF_NUMERIC, encoding); + if( (x.flags & MEM_Int)==0 ) goto jump_to_p2; + iKey = x.u.i; + goto notExistsWithKey; + } + /* Fall through into OP_NotExists */ +case OP_NotExists: /* jump, in3 */ + pIn3 = &aMem[pOp->p3]; + assert( (pIn3->flags & MEM_Int)!=0 || pOp->opcode==OP_SeekRowid ); + assert( pOp->p1>=0 && pOp->p1nCursor ); + iKey = pIn3->u.i; +notExistsWithKey: + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); +#ifdef SQLITE_DEBUG + if( pOp->opcode==OP_SeekRowid ) pC->seekOp = OP_SeekRowid; +#endif + assert( pC->isTable ); + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + assert( pCrsr!=0 ); + res = 0; + rc = sqlite3BtreeMovetoUnpacked(pCrsr, 0, iKey, 0, &res); + assert( rc==SQLITE_OK || res==0 ); + pC->movetoTarget = iKey; /* Used by OP_Delete */ + pC->nullRow = 0; + pC->cacheStatus = CACHE_STALE; + pC->deferredMoveto = 0; + VdbeBranchTaken(res!=0,2); + pC->seekResult = res; + if( res!=0 ){ + assert( rc==SQLITE_OK ); + if( pOp->p2==0 ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + goto jump_to_p2; + } + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: Sequence P1 P2 * * * +** Synopsis: r[P2]=cursor[P1].ctr++ +** +** Find the next available sequence number for cursor P1. +** Write the sequence number into register P2. +** The sequence number on the cursor is incremented after this +** instruction. +*/ +case OP_Sequence: { /* out2 */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( p->apCsr[pOp->p1]!=0 ); + assert( p->apCsr[pOp->p1]->eCurType!=CURTYPE_VTAB ); + pOut = out2Prerelease(p, pOp); + pOut->u.i = p->apCsr[pOp->p1]->seqCount++; + break; +} + + +/* Opcode: NewRowid P1 P2 P3 * * +** Synopsis: r[P2]=rowid +** +** Get a new integer record number (a.k.a "rowid") used as the key to a table. +** The record number is not previously used as a key in the database +** table that cursor P1 points to. The new record number is written +** written to register P2. +** +** If P3>0 then P3 is a register in the root frame of this VDBE that holds +** the largest previously generated record number. No new record numbers are +** allowed to be less than this value. When this value reaches its maximum, +** an SQLITE_FULL error is generated. The P3 register is updated with the ' +** generated record number. This P3 mechanism is used to help implement the +** AUTOINCREMENT feature. +*/ +case OP_NewRowid: { /* out2 */ + i64 v; /* The new rowid */ + VdbeCursor *pC; /* Cursor of table to get the new rowid */ + int res; /* Result of an sqlite3BtreeLast() */ + int cnt; /* Counter to limit the number of searches */ + Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */ + VdbeFrame *pFrame; /* Root frame of VDBE */ + + v = 0; + res = 0; + pOut = out2Prerelease(p, pOp); + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->isTable ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + { + /* The next rowid or record number (different terms for the same + ** thing) is obtained in a two-step algorithm. + ** + ** First we attempt to find the largest existing rowid and add one + ** to that. But if the largest existing rowid is already the maximum + ** positive integer, we have to fall through to the second + ** probabilistic algorithm + ** + ** The second algorithm is to select a rowid at random and see if + ** it already exists in the table. If it does not exist, we have + ** succeeded. If the random rowid does exist, we select a new one + ** and try again, up to 100 times. + */ + assert( pC->isTable ); + +#ifdef SQLITE_32BIT_ROWID +# define MAX_ROWID 0x7fffffff +#else + /* Some compilers complain about constants of the form 0x7fffffffffffffff. + ** Others complain about 0x7ffffffffffffffffLL. The following macro seems + ** to provide the constant while making all compilers happy. + */ +# define MAX_ROWID (i64)( (((u64)0x7fffffff)<<32) | (u64)0xffffffff ) +#endif + + if( !pC->useRandomRowid ){ + rc = sqlite3BtreeLast(pC->uc.pCursor, &res); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + if( res ){ + v = 1; /* IMP: R-61914-48074 */ + }else{ + assert( sqlite3BtreeCursorIsValid(pC->uc.pCursor) ); + v = sqlite3BtreeIntegerKey(pC->uc.pCursor); + if( v>=MAX_ROWID ){ + pC->useRandomRowid = 1; + }else{ + v++; /* IMP: R-29538-34987 */ + } + } + } + +#ifndef SQLITE_OMIT_AUTOINCREMENT + if( pOp->p3 ){ + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3>0 ); + if( p->pFrame ){ + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3<=pFrame->nMem ); + pMem = &pFrame->aMem[pOp->p3]; + }else{ + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + pMem = &aMem[pOp->p3]; + memAboutToChange(p, pMem); + } + assert( memIsValid(pMem) ); + + REGISTER_TRACE(pOp->p3, pMem); + sqlite3VdbeMemIntegerify(pMem); + assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ + if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){ + rc = SQLITE_FULL; /* IMP: R-17817-00630 */ + goto abort_due_to_error; + } + if( vu.i+1 ){ + v = pMem->u.i + 1; + } + pMem->u.i = v; + } +#endif + if( pC->useRandomRowid ){ + /* IMPLEMENTATION-OF: R-07677-41881 If the largest ROWID is equal to the + ** largest possible integer (9223372036854775807) then the database + ** engine starts picking positive candidate ROWIDs at random until + ** it finds one that is not previously used. */ + assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is + ** an AUTOINCREMENT table. */ + cnt = 0; + do{ + sqlite3_randomness(sizeof(v), &v); + v &= (MAX_ROWID>>1); v++; /* Ensure that v is greater than zero */ + }while( ((rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)v, + 0, &res))==SQLITE_OK) + && (res==0) + && (++cnt<100)); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + rc = SQLITE_FULL; /* IMP: R-38219-53002 */ + goto abort_due_to_error; + } + assert( v>0 ); /* EV: R-40812-03570 */ + } + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + } + pOut->u.i = v; + break; +} + +/* Opcode: Insert P1 P2 P3 P4 P5 +** Synopsis: intkey=r[P3] data=r[P2] +** +** Write an entry into the table of cursor P1. A new entry is +** created if it doesn't already exist or the data for an existing +** entry is overwritten. The data is the value MEM_Blob stored in register +** number P2. The key is stored in register P3. The key must +** be a MEM_Int. +** +** If the OPFLAG_NCHANGE flag of P5 is set, then the row change count is +** incremented (otherwise not). If the OPFLAG_LASTROWID flag of P5 is set, +** then rowid is stored for subsequent return by the +** sqlite3_last_insert_rowid() function (otherwise it is unmodified). +** +** If the OPFLAG_USESEEKRESULT flag of P5 is set, the implementation might +** run faster by avoiding an unnecessary seek on cursor P1. However, +** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior +** seeks on the cursor or if the most recent seek used a key equal to P3. +** +** If the OPFLAG_ISUPDATE flag is set, then this opcode is part of an +** UPDATE operation. Otherwise (if the flag is clear) then this opcode +** is part of an INSERT operation. The difference is only important to +** the update hook. +** +** Parameter P4 may point to a Table structure, or may be NULL. If it is +** not NULL, then the update-hook (sqlite3.xUpdateCallback) is invoked +** following a successful insert. +** +** (WARNING/TODO: If P1 is a pseudo-cursor and P2 is dynamically +** allocated, then ownership of P2 is transferred to the pseudo-cursor +** and register P2 becomes ephemeral. If the cursor is changed, the +** value of register P2 will then change. Make sure this does not +** cause any problems.) +** +** This instruction only works on tables. The equivalent instruction +** for indices is OP_IdxInsert. +*/ +case OP_Insert: { + Mem *pData; /* MEM cell holding data for the record to be inserted */ + Mem *pKey; /* MEM cell holding key for the record */ + VdbeCursor *pC; /* Cursor to table into which insert is written */ + int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */ + const char *zDb; /* database name - used by the update hook */ + Table *pTab; /* Table structure - used by update and pre-update hooks */ + BtreePayload x; /* Payload to be inserted */ + + pData = &aMem[pOp->p2]; + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( memIsValid(pData) ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->deferredMoveto==0 ); + assert( pC->uc.pCursor!=0 ); + assert( (pOp->p5 & OPFLAG_ISNOOP) || pC->isTable ); + assert( pOp->p4type==P4_TABLE || pOp->p4type>=P4_STATIC ); + REGISTER_TRACE(pOp->p2, pData); + sqlite3VdbeIncrWriteCounter(p, pC); + + pKey = &aMem[pOp->p3]; + assert( pKey->flags & MEM_Int ); + assert( memIsValid(pKey) ); + REGISTER_TRACE(pOp->p3, pKey); + x.nKey = pKey->u.i; + + if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ + assert( pC->iDb>=0 ); + zDb = db->aDb[pC->iDb].zDbSName; + pTab = pOp->p4.pTab; + assert( (pOp->p5 & OPFLAG_ISNOOP) || HasRowid(pTab) ); + }else{ + pTab = 0; + zDb = 0; /* Not needed. Silence a compiler warning. */ + } + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + /* Invoke the pre-update hook, if any */ + if( pTab ){ + if( db->xPreUpdateCallback && !(pOp->p5 & OPFLAG_ISUPDATE) ){ + sqlite3VdbePreUpdateHook(p, pC, SQLITE_INSERT, zDb, pTab, x.nKey,pOp->p2); + } + if( db->xUpdateCallback==0 || pTab->aCol==0 ){ + /* Prevent post-update hook from running in cases when it should not */ + pTab = 0; + } + } + if( pOp->p5 & OPFLAG_ISNOOP ) break; +#endif + + if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; + if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = x.nKey; + assert( pData->flags & (MEM_Blob|MEM_Str) ); + x.pData = pData->z; + x.nData = pData->n; + seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0); + if( pData->flags & MEM_Zero ){ + x.nZero = pData->u.nZero; + }else{ + x.nZero = 0; + } + x.pKey = 0; + rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, + (pOp->p5 & (OPFLAG_APPEND|OPFLAG_SAVEPOSITION)), seekResult + ); + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + + /* Invoke the update-hook if required. */ + if( rc ) goto abort_due_to_error; + if( pTab ){ + assert( db->xUpdateCallback!=0 ); + assert( pTab->aCol!=0 ); + db->xUpdateCallback(db->pUpdateArg, + (pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT, + zDb, pTab->zName, x.nKey); + } + break; +} + +/* Opcode: Delete P1 P2 P3 P4 P5 +** +** Delete the record at which the P1 cursor is currently pointing. +** +** If the OPFLAG_SAVEPOSITION bit of the P5 parameter is set, then +** the cursor will be left pointing at either the next or the previous +** record in the table. If it is left pointing at the next record, then +** the next Next instruction will be a no-op. As a result, in this case +** it is ok to delete a record from within a Next loop. If +** OPFLAG_SAVEPOSITION bit of P5 is clear, then the cursor will be +** 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. +** +** If the OPFLAG_NCHANGE flag of P2 (NB: P2 not P5) is set, then the row +** change count is incremented (otherwise not). +** +** P1 must not be pseudo-table. It has to be a real table with +** multiple rows. +** +** If P4 is not NULL then it points to a Table object. In this case either +** the update or pre-update hook, or both, may be invoked. The P1 cursor must +** have been positioned using OP_NotFound prior to invoking this opcode in +** this case. Specifically, if one is configured, the pre-update hook is +** invoked if P4 is not NULL. The update-hook is invoked if one is configured, +** P4 is not NULL, and the OPFLAG_NCHANGE flag is set in P2. +** +** If the OPFLAG_ISUPDATE flag is set in P2, then P3 contains the address +** of the memory cell that contains the value that the rowid of the row will +** be set to by the update. +*/ +case OP_Delete: { + VdbeCursor *pC; + const char *zDb; + Table *pTab; + int opflags; + + opflags = pOp->p2; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + assert( pC->deferredMoveto==0 ); + sqlite3VdbeIncrWriteCounter(p, pC); + +#ifdef SQLITE_DEBUG + if( pOp->p4type==P4_TABLE + && HasRowid(pOp->p4.pTab) + && pOp->p5==0 + && sqlite3BtreeCursorIsValidNN(pC->uc.pCursor) + ){ + /* If p5 is zero, the seek operation that positioned the cursor prior to + ** OP_Delete will have also set the pC->movetoTarget field to the rowid of + ** the row that is being deleted */ + i64 iKey = sqlite3BtreeIntegerKey(pC->uc.pCursor); + assert( CORRUPT_DB || pC->movetoTarget==iKey ); + } +#endif + + /* If the update-hook or pre-update-hook will be invoked, set zDb to + ** the name of the db to pass as to it. Also set local pTab to a copy + ** of p4.pTab. Finally, if p5 is true, indicating that this cursor was + ** last moved with OP_Next or OP_Prev, not Seek or NotFound, set + ** VdbeCursor.movetoTarget to the current rowid. */ + if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ + assert( pC->iDb>=0 ); + assert( pOp->p4.pTab!=0 ); + zDb = db->aDb[pC->iDb].zDbSName; + pTab = pOp->p4.pTab; + if( (pOp->p5 & OPFLAG_SAVEPOSITION)!=0 && pC->isTable ){ + pC->movetoTarget = sqlite3BtreeIntegerKey(pC->uc.pCursor); + } + }else{ + zDb = 0; /* Not needed. Silence a compiler warning. */ + pTab = 0; /* Not needed. Silence a compiler warning. */ + } + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + /* Invoke the pre-update-hook if required. */ + if( db->xPreUpdateCallback && pOp->p4.pTab ){ + assert( !(opflags & OPFLAG_ISUPDATE) + || HasRowid(pTab)==0 + || (aMem[pOp->p3].flags & MEM_Int) + ); + sqlite3VdbePreUpdateHook(p, pC, + (opflags & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_DELETE, + zDb, pTab, pC->movetoTarget, + pOp->p3 + ); + } + if( opflags & OPFLAG_ISNOOP ) break; +#endif + + /* Only flags that can be set are SAVEPOISTION and AUXDELETE */ + assert( (pOp->p5 & ~(OPFLAG_SAVEPOSITION|OPFLAG_AUXDELETE))==0 ); + assert( OPFLAG_SAVEPOSITION==BTREE_SAVEPOSITION ); + assert( OPFLAG_AUXDELETE==BTREE_AUXDELETE ); + +#ifdef SQLITE_DEBUG + if( p->pFrame==0 ){ + if( pC->isEphemeral==0 + && (pOp->p5 & OPFLAG_AUXDELETE)==0 + && (pC->wrFlag & OPFLAG_FORDELETE)==0 + ){ + nExtraDelete++; + } + if( pOp->p2 & OPFLAG_NCHANGE ){ + nExtraDelete--; + } + } +#endif + + rc = sqlite3BtreeDelete(pC->uc.pCursor, pOp->p5); + pC->cacheStatus = CACHE_STALE; + pC->seekResult = 0; + if( rc ) goto abort_due_to_error; + + /* Invoke the update-hook if required. */ + if( opflags & OPFLAG_NCHANGE ){ + p->nChange++; + if( db->xUpdateCallback && HasRowid(pTab) ){ + db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, pTab->zName, + pC->movetoTarget); + assert( pC->iDb>=0 ); + } + } + + break; +} +/* Opcode: ResetCount * * * * * +** +** The value of the change counter is copied to the database handle +** change counter (returned by subsequent calls to sqlite3_changes()). +** Then the VMs internal change counter resets to 0. +** This is used by trigger programs. +*/ +case OP_ResetCount: { + sqlite3VdbeSetChanges(db, p->nChange); + p->nChange = 0; + break; +} + +/* Opcode: SorterCompare P1 P2 P3 P4 +** Synopsis: if key(P1)!=trim(r[P3],P4) goto P2 +** +** P1 is a sorter cursor. This instruction compares a prefix of the +** record blob in register P3 against a prefix of the entry that +** the sorter cursor currently points to. Only the first P4 fields +** of r[P3] and the sorter record are compared. +** +** If either P3 or the sorter contains a NULL in one of their significant +** fields (not counting the P4 fields at the end which are ignored) then +** the comparison is assumed to be equal. +** +** Fall through to next instruction if the two records compare equal to +** each other. Jump to P2 if they are different. +*/ +case OP_SorterCompare: { + VdbeCursor *pC; + int res; + int nKeyCol; + + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + assert( pOp->p4type==P4_INT32 ); + pIn3 = &aMem[pOp->p3]; + nKeyCol = pOp->p4.i; + res = 0; + rc = sqlite3VdbeSorterCompare(pC, pIn3, nKeyCol, &res); + VdbeBranchTaken(res!=0,2); + if( rc ) goto abort_due_to_error; + if( res ) goto jump_to_p2; + break; +}; + +/* Opcode: SorterData P1 P2 P3 * * +** Synopsis: r[P2]=data +** +** 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 +** 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 +** us from having to issue a separate NullRow instruction to clear that cache. +*/ +case OP_SorterData: { + VdbeCursor *pC; + + pOut = &aMem[pOp->p2]; + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + rc = sqlite3VdbeSorterRowkey(pC, pOut); + assert( rc!=SQLITE_OK || (pOut->flags & MEM_Blob) ); + assert( pOp->p1>=0 && pOp->p1nCursor ); + if( rc ) goto abort_due_to_error; + p->apCsr[pOp->p3]->cacheStatus = CACHE_STALE; + break; +} + +/* Opcode: RowData P1 P2 P3 * * +** Synopsis: r[P2]=data +** +** Write into register P2 the complete row content for the row at +** which cursor P1 is currently pointing. +** There is no interpretation of the data. +** It is just copied onto the P2 register exactly as +** it is found in the database file. +** +** If cursor P1 is an index, then the content is the key of the row. +** If cursor P2 is a table, then the content extracted is the data. +** +** If the P1 cursor must be pointing to a valid row (not a NULL row) +** of a real table, not a pseudo-table. +** +** If P3!=0 then this opcode is allowed to make an ephemeral pointer +** into the database page. That means that the content of the output +** register will be invalidated as soon as the cursor moves - including +** moves caused by other cursors that "save" the current cursors +** position in order that they can write to the same table. If P3==0 +** then a copy of the data is made into memory. P3!=0 is faster, but +** P3==0 is safer. +** +** If P3!=0 then the content of the P2 register is unsuitable for use +** in OP_Result and any OP_Result will invalidate the P2 register content. +** The P2 register content is invalidated by opcodes like OP_Function or +** by any use of another cursor pointing to the same table. +*/ +case OP_RowData: { + VdbeCursor *pC; + BtCursor *pCrsr; + u32 n; + + pOut = out2Prerelease(p, pOp); + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( isSorter(pC)==0 ); + assert( pC->nullRow==0 ); + assert( pC->uc.pCursor!=0 ); + pCrsr = pC->uc.pCursor; + + /* The OP_RowData opcodes always follow OP_NotExists or + ** OP_SeekRowid or OP_Rewind/Op_Next with no intervening instructions + ** that might invalidate the cursor. + ** If this where not the case, on of the following assert()s + ** would fail. Should this ever change (because of changes in the code + ** generator) then the fix would be to insert a call to + ** sqlite3VdbeCursorMoveto(). + */ + assert( pC->deferredMoveto==0 ); + assert( sqlite3BtreeCursorIsValid(pCrsr) ); +#if 0 /* Not required due to the previous to assert() statements */ + rc = sqlite3VdbeCursorMoveto(pC); + if( rc!=SQLITE_OK ) goto abort_due_to_error; +#endif + + n = sqlite3BtreePayloadSize(pCrsr); + if( n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + testcase( n==0 ); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pCrsr, n, pOut); + if( rc ) goto abort_due_to_error; + if( !pOp->p3 ) Deephemeralize(pOut); + UPDATE_MAX_BLOBSIZE(pOut); + REGISTER_TRACE(pOp->p2, pOut); + break; +} + +/* Opcode: Rowid P1 P2 * * * +** Synopsis: r[P2]=rowid +** +** Store in register P2 an integer which is the key of the table entry that +** P1 is currently point to. +** +** P1 can be either an ordinary table or a virtual table. There used to +** be a separate OP_VRowid opcode for use with virtual tables, but this +** one opcode now works for both table types. +*/ +case OP_Rowid: { /* out2 */ + VdbeCursor *pC; + i64 v; + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + + pOut = out2Prerelease(p, pOp); + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow ); + if( pC->nullRow ){ + pOut->flags = MEM_Null; + break; + }else if( pC->deferredMoveto ){ + v = pC->movetoTarget; +#ifndef SQLITE_OMIT_VIRTUALTABLE + }else if( pC->eCurType==CURTYPE_VTAB ){ + assert( pC->uc.pVCur!=0 ); + pVtab = pC->uc.pVCur->pVtab; + pModule = pVtab->pModule; + assert( pModule->xRowid ); + rc = pModule->xRowid(pC->uc.pVCur, &v); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + }else{ + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + rc = sqlite3VdbeCursorRestore(pC); + if( rc ) goto abort_due_to_error; + if( pC->nullRow ){ + pOut->flags = MEM_Null; + break; + } + v = sqlite3BtreeIntegerKey(pC->uc.pCursor); + } + pOut->u.i = v; + break; +} + +/* Opcode: NullRow P1 * * * * +** +** Move the cursor P1 to a null row. Any OP_Column operations +** that occur while the cursor is on the null row will always +** write a NULL. +*/ +case OP_NullRow: { + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + pC->nullRow = 1; + pC->cacheStatus = CACHE_STALE; + if( pC->eCurType==CURTYPE_BTREE ){ + assert( pC->uc.pCursor!=0 ); + sqlite3BtreeClearCursor(pC->uc.pCursor); + } +#ifdef SQLITE_DEBUG + if( pC->seekOp==0 ) pC->seekOp = OP_NullRow; +#endif + break; +} + +/* Opcode: SeekEnd P1 * * * * +** +** Position cursor P1 at the end of the btree for the purpose of +** appending a new entry onto the btree. +** +** It is assumed that the cursor is used only for appending and so +** if the cursor is valid, then the cursor must already be pointing +** at the end of the btree and so no changes are made to +** the cursor. +*/ +/* Opcode: Last P1 P2 * * * +** +** The next use of the Rowid or Column or Prev instruction for P1 +** will refer to the last entry in the database table or index. +** If the table or index is empty and P2>0, then jump immediately to P2. +** If P2 is 0 or if the table or index is not empty, fall through +** to the following instruction. +** +** This opcode leaves the cursor configured to move in reverse order, +** from the end toward the beginning. In other words, the cursor is +** configured to use Prev, not Next. +*/ +case OP_SeekEnd: +case OP_Last: { /* jump */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + res = 0; + assert( pCrsr!=0 ); +#ifdef SQLITE_DEBUG + pC->seekOp = pOp->opcode; +#endif + if( pOp->opcode==OP_SeekEnd ){ + assert( pOp->p2==0 ); + pC->seekResult = -1; + if( sqlite3BtreeCursorIsValidNN(pCrsr) ){ + break; + } + } + rc = sqlite3BtreeLast(pCrsr, &res); + pC->nullRow = (u8)res; + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + if( rc ) goto abort_due_to_error; + if( pOp->p2>0 ){ + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + } + break; +} + +/* Opcode: IfSmaller P1 P2 P3 * * +** +** Estimate the number of rows in the table P1. Jump to P2 if that +** estimate is less than approximately 2**(0.1*P3). +*/ +case OP_IfSmaller: { /* jump */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + i64 sz; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + pCrsr = pC->uc.pCursor; + assert( pCrsr ); + rc = sqlite3BtreeFirst(pCrsr, &res); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + sz = sqlite3BtreeRowCountEst(pCrsr); + if( ALWAYS(sz>=0) && sqlite3LogEst((u64)sz)p3 ) res = 1; + } + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + break; +} + + +/* Opcode: SorterSort P1 P2 * * * +** +** After all records have been inserted into the Sorter object +** identified by P1, invoke this opcode to actually do the sorting. +** Jump to P2 if there are no records to be sorted. +** +** This opcode is an alias for OP_Sort and OP_Rewind that is used +** for Sorter objects. +*/ +/* Opcode: Sort P1 P2 * * * +** +** This opcode does exactly the same thing as OP_Rewind except that +** it increments an undocumented global variable used for testing. +** +** Sorting is accomplished by writing records into a sorting index, +** then rewinding that index and playing it back from beginning to +** end. We use the OP_Sort opcode instead of OP_Rewind to do the +** rewinding so that the global variable will be incremented and +** regression tests can determine whether or not the optimizer is +** correctly optimizing out sorts. +*/ +case OP_SorterSort: /* jump */ +case OP_Sort: { /* jump */ +#ifdef SQLITE_TEST + sqlite3_sort_count++; + sqlite3_search_count--; +#endif + p->aCounter[SQLITE_STMTSTATUS_SORT]++; + /* Fall through into OP_Rewind */ +} +/* Opcode: Rewind P1 P2 * * * +** +** The next use of the Rowid or Column or Next instruction for P1 +** will refer to the first entry in the database table or index. +** If the table or index is empty, jump immediately to P2. +** If the table or index is not empty, fall through to the following +** instruction. +** +** This opcode leaves the cursor configured to move in forward order, +** from the beginning toward the end. In other words, the cursor is +** configured to use Next, not Prev. +*/ +case OP_Rewind: { /* jump */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5==0 ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( isSorter(pC)==(pOp->opcode==OP_SorterSort) ); + res = 1; +#ifdef SQLITE_DEBUG + pC->seekOp = OP_Rewind; +#endif + if( isSorter(pC) ){ + rc = sqlite3VdbeSorterRewind(pC, &res); + }else{ + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + assert( pCrsr ); + rc = sqlite3BtreeFirst(pCrsr, &res); + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + } + if( rc ) goto abort_due_to_error; + pC->nullRow = (u8)res; + assert( pOp->p2>0 && pOp->p2nOp ); + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + break; +} + +/* Opcode: Next P1 P2 P3 P4 P5 +** +** Advance cursor P1 so that it points to the next key/data pair in its +** table or index. If there are no more key/value pairs then fall through +** to the following instruction. But if the cursor advance was successful, +** jump immediately to P2. +** +** The Next opcode is only valid following an SeekGT, SeekGE, or +** OP_Rewind opcode used to position the cursor. Next is not allowed +** to follow SeekLT, SeekLE, or OP_Last. +** +** The P1 cursor must be for a real table, not a pseudo-table. P1 must have +** been opened prior to this opcode or the program will segfault. +** +** The P3 value is a hint to the btree implementation. If P3==1, that +** means P1 is an SQL index and that this instruction could have been +** omitted if that index had been unique. P3 is usually 0. P3 is +** always either 0 or 1. +** +** P4 is always of type P4_ADVANCE. The function pointer points to +** sqlite3BtreeNext(). +** +** If P5 is positive and the jump is taken, then event counter +** number P5-1 in the prepared statement is incremented. +** +** See also: Prev +*/ +/* Opcode: Prev P1 P2 P3 P4 P5 +** +** Back up cursor P1 so that it points to the previous key/data pair in its +** table or index. If there is no previous key/value pairs then fall through +** to the following instruction. But if the cursor backup was successful, +** jump immediately to P2. +** +** +** The Prev opcode is only valid following an SeekLT, SeekLE, or +** OP_Last opcode used to position the cursor. Prev is not allowed +** to follow SeekGT, SeekGE, or OP_Rewind. +** +** The P1 cursor must be for a real table, not a pseudo-table. If P1 is +** not open then the behavior is undefined. +** +** The P3 value is a hint to the btree implementation. If P3==1, that +** means P1 is an SQL index and that this instruction could have been +** omitted if that index had been unique. P3 is usually 0. P3 is +** always either 0 or 1. +** +** P4 is always of type P4_ADVANCE. The function pointer points to +** sqlite3BtreePrevious(). +** +** If P5 is positive and the jump is taken, then event counter +** number P5-1 in the prepared statement is incremented. +*/ +/* Opcode: SorterNext P1 P2 * * P5 +** +** This opcode works just like OP_Next except that P1 must be a +** sorter object for which the OP_SorterSort opcode has been +** invoked. This opcode advances the cursor to the next sorted +** record, or jumps to P2 if there are no more sorted records. +*/ +case OP_SorterNext: { /* jump */ + VdbeCursor *pC; + + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + rc = sqlite3VdbeSorterNext(db, pC); + goto next_tail; +case OP_Prev: /* jump */ +case OP_Next: /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5aCounter) ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->deferredMoveto==0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); + assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious ); + + /* The Next opcode is only used after SeekGT, SeekGE, Rewind, and Found. + ** The Prev opcode is only used after SeekLT, SeekLE, and Last. */ + assert( pOp->opcode!=OP_Next + || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE + || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found + || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid + || pC->seekOp==OP_IfNoHope); + assert( pOp->opcode!=OP_Prev + || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE + || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope + || pC->seekOp==OP_NullRow); + + rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3); +next_tail: + pC->cacheStatus = CACHE_STALE; + VdbeBranchTaken(rc==SQLITE_OK,2); + if( rc==SQLITE_OK ){ + pC->nullRow = 0; + p->aCounter[pOp->p5]++; +#ifdef SQLITE_TEST + sqlite3_search_count++; +#endif + goto jump_to_p2_and_check_for_interrupt; + } + if( rc!=SQLITE_DONE ) goto abort_due_to_error; + rc = SQLITE_OK; + pC->nullRow = 1; + goto check_for_interrupt; +} + +/* Opcode: IdxInsert P1 P2 P3 P4 P5 +** Synopsis: key=r[P2] +** +** Register P2 holds an SQL index key made using the +** MakeRecord instructions. This opcode writes that key +** into the index P1. Data for the entry is nil. +** +** If P4 is not zero, then it is the number of values in the unpacked +** key of reg(P2). In that case, P3 is the index of the first register +** for the unpacked key. The availability of the unpacked key can sometimes +** be an optimization. +** +** If P5 has the OPFLAG_APPEND bit set, that is a hint to the b-tree layer +** that this insert is likely to be an append. +** +** If P5 has the OPFLAG_NCHANGE bit set, then the change counter is +** incremented by this instruction. If the OPFLAG_NCHANGE bit is clear, +** then the change counter is unchanged. +** +** If the OPFLAG_USESEEKRESULT flag of P5 is set, the implementation might +** run faster by avoiding an unnecessary seek on cursor P1. However, +** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior +** seeks on the cursor or if the most recent seek used a key equivalent +** to P2. +** +** This instruction only works for indices. The equivalent instruction +** for tables is OP_Insert. +*/ +case OP_IdxInsert: { /* in2 */ + VdbeCursor *pC; + BtreePayload x; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + sqlite3VdbeIncrWriteCounter(p, pC); + assert( pC!=0 ); + assert( !isSorter(pC) ); + pIn2 = &aMem[pOp->p2]; + assert( pIn2->flags & MEM_Blob ); + if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->isTable==0 ); + rc = ExpandBlob(pIn2); + if( rc ) goto abort_due_to_error; + x.nKey = pIn2->n; + x.pKey = pIn2->z; + x.aMem = aMem + pOp->p3; + x.nMem = (u16)pOp->p4.i; + rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, + (pOp->p5 & (OPFLAG_APPEND|OPFLAG_SAVEPOSITION)), + ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0) + ); + assert( pC->deferredMoveto==0 ); + pC->cacheStatus = CACHE_STALE; + if( rc) goto abort_due_to_error; + break; +} + +/* Opcode: SorterInsert P1 P2 * * * +** Synopsis: key=r[P2] +** +** Register P2 holds an SQL index key made using the +** MakeRecord instructions. This opcode writes that key +** into the sorter P1. Data for the entry is nil. +*/ +case OP_SorterInsert: { /* in2 */ + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + sqlite3VdbeIncrWriteCounter(p, pC); + assert( pC!=0 ); + assert( isSorter(pC) ); + pIn2 = &aMem[pOp->p2]; + assert( pIn2->flags & MEM_Blob ); + assert( pC->isTable==0 ); + rc = ExpandBlob(pIn2); + if( rc ) goto abort_due_to_error; + rc = sqlite3VdbeSorterWrite(pC, pIn2); + if( rc) goto abort_due_to_error; + break; +} + +/* Opcode: IdxDelete P1 P2 P3 * P5 +** Synopsis: key=r[P2@P3] +** +** The content of P3 registers starting at register P2 form +** an unpacked index key. This opcode removes that entry from the +** index opened by cursor P1. +** +** If P5 is not zero, then raise an SQLITE_CORRUPT_INDEX error +** if no matching index entry is found. This happens when running +** an UPDATE or DELETE statement and the index entry to be updated +** or deleted is not found. For some uses of IdxDelete +** (example: the EXCEPT operator) it does not matter that no matching +** entry is found. For those cases, P5 is zero. +*/ +case OP_IdxDelete: { + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + UnpackedRecord r; + + assert( pOp->p3>0 ); + assert( pOp->p2>0 && pOp->p2+pOp->p3<=(p->nMem+1 - p->nCursor)+1 ); + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3VdbeIncrWriteCounter(p, pC); + pCrsr = pC->uc.pCursor; + assert( pCrsr!=0 ); + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)pOp->p3; + r.default_rc = 0; + r.aMem = &aMem[pOp->p2]; + rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &res); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + rc = sqlite3BtreeDelete(pCrsr, BTREE_AUXDELETE); + if( rc ) goto abort_due_to_error; + }else if( pOp->p5 ){ + rc = SQLITE_CORRUPT_INDEX; + goto abort_due_to_error; + } + assert( pC->deferredMoveto==0 ); + pC->cacheStatus = CACHE_STALE; + pC->seekResult = 0; + break; +} + +/* Opcode: DeferredSeek P1 * P3 P4 * +** Synopsis: Move P3 to P1.rowid if needed +** +** P1 is an open index cursor and P3 is a cursor on the corresponding +** table. This opcode does a deferred seek of the P3 table cursor +** to the row that corresponds to the current row of P1. +** +** This is a deferred seek. Nothing actually happens until +** the cursor is used to read a record. That way, if no reads +** occur, no unnecessary I/O happens. +** +** P4 may be an array of integers (type P4_INTARRAY) containing +** one entry for each column in the P3 table. If array entry a(i) +** is non-zero, then reading column a(i)-1 from cursor P3 is +** equivalent to performing the deferred seek and then reading column i +** from P1. This information is stored in P3 and used to redirect +** reads against P3 over to P1, thus possibly avoiding the need to +** seek and read cursor P3. +*/ +/* Opcode: IdxRowid P1 P2 * * * +** Synopsis: r[P2]=rowid +** +** Write into register P2 an integer which is the last entry in the record at +** the end of the index key pointed to by cursor P1. This integer should be +** the rowid of the table entry to which this index entry points. +** +** See also: Rowid, MakeRecord. +*/ +case OP_DeferredSeek: +case OP_IdxRowid: { /* out2 */ + VdbeCursor *pC; /* The P1 index cursor */ + VdbeCursor *pTabCur; /* The P2 table cursor (OP_DeferredSeek only) */ + i64 rowid; /* Rowid that P1 current points to */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + assert( pC->isTable==0 ); + assert( pC->deferredMoveto==0 ); + assert( !pC->nullRow || pOp->opcode==OP_IdxRowid ); + + /* The IdxRowid and Seek opcodes are combined because of the commonality + ** of sqlite3VdbeCursorRestore() and sqlite3VdbeIdxRowid(). */ + rc = sqlite3VdbeCursorRestore(pC); + + /* sqlite3VbeCursorRestore() can only fail if the record has been deleted + ** out from under the cursor. That will never happens for an IdxRowid + ** or Seek opcode */ + if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; + + if( !pC->nullRow ){ + rowid = 0; /* Not needed. Only used to silence a warning. */ + rc = sqlite3VdbeIdxRowid(db, pC->uc.pCursor, &rowid); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + if( pOp->opcode==OP_DeferredSeek ){ + assert( pOp->p3>=0 && pOp->p3nCursor ); + pTabCur = p->apCsr[pOp->p3]; + assert( pTabCur!=0 ); + assert( pTabCur->eCurType==CURTYPE_BTREE ); + assert( pTabCur->uc.pCursor!=0 ); + assert( pTabCur->isTable ); + pTabCur->nullRow = 0; + pTabCur->movetoTarget = rowid; + pTabCur->deferredMoveto = 1; + assert( pOp->p4type==P4_INTARRAY || pOp->p4.ai==0 ); + pTabCur->aAltMap = pOp->p4.ai; + pTabCur->pAltCursor = pC; + }else{ + pOut = out2Prerelease(p, pOp); + pOut->u.i = rowid; + } + }else{ + assert( pOp->opcode==OP_IdxRowid ); + sqlite3VdbeMemSetNull(&aMem[pOp->p2]); + } + break; +} + +/* Opcode: FinishSeek P1 * * * * +** +** If cursor P1 was previously moved via OP_DeferredSeek, complete that +** seek operation now, without further delay. If the cursor seek has +** already occurred, this instruction is a no-op. +*/ +case OP_FinishSeek: { + VdbeCursor *pC; /* The P1 index cursor */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + if( pC->deferredMoveto ){ + rc = sqlite3VdbeFinishMoveto(pC); + if( rc ) goto abort_due_to_error; + } + break; +} + +/* Opcode: IdxGE P1 P2 P3 P4 P5 +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY. Compare this key value against the index +** that P1 is currently pointing to, ignoring the PRIMARY KEY or ROWID +** fields at the end. +** +** If the P1 index entry is greater than or equal to the key value +** then jump to P2. Otherwise fall through to the next instruction. +*/ +/* Opcode: IdxGT P1 P2 P3 P4 P5 +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY. Compare this key value against the index +** that P1 is currently pointing to, ignoring the PRIMARY KEY or ROWID +** fields at the end. +** +** If the P1 index entry is greater than the key value +** then jump to P2. Otherwise fall through to the next instruction. +*/ +/* Opcode: IdxLT P1 P2 P3 P4 P5 +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY or ROWID. Compare this key value against +** the index that P1 is currently pointing to, ignoring the PRIMARY KEY or +** ROWID on the P1 index. +** +** If the P1 index entry is less than the key value then jump to P2. +** Otherwise fall through to the next instruction. +*/ +/* Opcode: IdxLE P1 P2 P3 P4 P5 +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY or ROWID. Compare this key value against +** the index that P1 is currently pointing to, ignoring the PRIMARY KEY or +** ROWID on the P1 index. +** +** If the P1 index entry is less than or equal to the key value then jump +** to P2. Otherwise fall through to the next instruction. +*/ +case OP_IdxLE: /* jump */ +case OP_IdxGT: /* jump */ +case OP_IdxLT: /* jump */ +case OP_IdxGE: { /* jump */ + VdbeCursor *pC; + int res; + UnpackedRecord r; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->isOrdered ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0); + assert( pC->deferredMoveto==0 ); + assert( pOp->p5==0 || pOp->p5==1 ); + assert( pOp->p4type==P4_INT32 ); + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)pOp->p4.i; + if( pOp->opcodeopcode==OP_IdxLE || pOp->opcode==OP_IdxGT ); + r.default_rc = -1; + }else{ + assert( pOp->opcode==OP_IdxGE || pOp->opcode==OP_IdxLT ); + r.default_rc = 0; + } + r.aMem = &aMem[pOp->p3]; +#ifdef SQLITE_DEBUG + { + int i; + for(i=0; ip3+i, &aMem[pOp->p3+i]); + } + } +#endif + res = 0; /* Not needed. Only used to silence a warning. */ + rc = sqlite3VdbeIdxKeyCompare(db, pC, &r, &res); + assert( (OP_IdxLE&1)==(OP_IdxLT&1) && (OP_IdxGE&1)==(OP_IdxGT&1) ); + if( (pOp->opcode&1)==(OP_IdxLT&1) ){ + assert( pOp->opcode==OP_IdxLE || pOp->opcode==OP_IdxLT ); + res = -res; + }else{ + assert( pOp->opcode==OP_IdxGE || pOp->opcode==OP_IdxGT ); + res++; + } + VdbeBranchTaken(res>0,2); + if( rc ) goto abort_due_to_error; + if( res>0 ) goto jump_to_p2; + break; +} + +/* Opcode: Destroy P1 P2 P3 * * +** +** Delete an entire database table or index whose root page in the database +** 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 +** that is used to store tables create using CREATE TEMPORARY TABLE. +** +** If AUTOVACUUM is enabled then it is possible that another root page +** might be moved into the newly deleted root page in order to keep all +** root pages contiguous at the beginning of the database. The former +** value of the root page that moved - its value before the move occurred - +** is stored in register P2. If no page movement was required (because the +** table being dropped was already the last one in the database) then a +** zero is stored in register P2. If AUTOVACUUM is disabled then a zero +** is stored in register P2. +** +** This opcode throws an error if there are any active reader VMs when +** it is invoked. This is done to avoid the difficulty associated with +** updating existing cursors when a root page is moved in an AUTOVACUUM +** database. This error is thrown even if the database is not an AUTOVACUUM +** db in order to avoid introducing an incompatibility between autovacuum +** and non-autovacuum modes. +** +** See also: Clear +*/ +case OP_Destroy: { /* out2 */ + int iMoved; + int iDb; + + sqlite3VdbeIncrWriteCounter(p, 0); + assert( p->readOnly==0 ); + assert( pOp->p1>1 ); + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Null; + if( db->nVdbeRead > db->nVDestroy+1 ){ + rc = SQLITE_LOCKED; + p->errorAction = OE_Abort; + goto abort_due_to_error; + }else{ + iDb = pOp->p3; + assert( DbMaskTest(p->btreeMask, iDb) ); + iMoved = 0; /* Not needed. Only to silence a warning. */ + rc = sqlite3BtreeDropTable(db->aDb[iDb].pBt, pOp->p1, &iMoved); + pOut->flags = MEM_Int; + pOut->u.i = iMoved; + if( rc ) goto abort_due_to_error; +#ifndef SQLITE_OMIT_AUTOVACUUM + if( iMoved!=0 ){ + sqlite3RootPageMoved(db, iDb, iMoved, pOp->p1); + /* All OP_Destroy operations occur on the same btree */ + assert( resetSchemaOnFault==0 || resetSchemaOnFault==iDb+1 ); + resetSchemaOnFault = iDb+1; + } +#endif + } + break; +} + +/* Opcode: Clear P1 P2 P3 +** +** Delete all contents of the database table or index whose root page +** 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 +** that is used to store tables create using CREATE TEMPORARY TABLE. +** +** If the P3 value is non-zero, then the table referred to must be an +** intkey table (an SQL table, not an index). In this case the row change +** count is incremented by the number of rows in the table being cleared. +** If P3 is greater than zero, then the value stored in register P3 is +** also incremented by the number of rows in the table being cleared. +** +** See also: Destroy +*/ +case OP_Clear: { + int nChange; + + sqlite3VdbeIncrWriteCounter(p, 0); + nChange = 0; + assert( p->readOnly==0 ); + assert( DbMaskTest(p->btreeMask, pOp->p2) ); + rc = sqlite3BtreeClearTable( + db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &nChange : 0) + ); + if( pOp->p3 ){ + p->nChange += nChange; + if( pOp->p3>0 ){ + assert( memIsValid(&aMem[pOp->p3]) ); + memAboutToChange(p, &aMem[pOp->p3]); + aMem[pOp->p3].u.i += nChange; + } + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: ResetSorter P1 * * * * +** +** Delete all contents from the ephemeral table or sorter +** that is open on cursor P1. +** +** This opcode only works for cursors used for sorting and +** opened with OP_OpenEphemeral or OP_SorterOpen. +*/ +case OP_ResetSorter: { + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + if( isSorter(pC) ){ + sqlite3VdbeSorterReset(db, pC->uc.pSorter); + }else{ + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->isEphemeral ); + rc = sqlite3BtreeClearTableOfCursor(pC->uc.pCursor); + if( rc ) goto abort_due_to_error; + } + break; +} + +/* Opcode: CreateBtree P1 P2 P3 * * +** Synopsis: r[P2]=root iDb=P1 flags=P3 +** +** Allocate a new b-tree in the main database file if P1==0 or in the +** TEMP database file if P1==1 or in an attached database if +** P1>1. The P3 argument must be 1 (BTREE_INTKEY) for a rowid table +** it must be 2 (BTREE_BLOBKEY) for an index or WITHOUT ROWID table. +** The root page number of the new b-tree is stored in register P2. +*/ +case OP_CreateBtree: { /* out2 */ + int pgno; + Db *pDb; + + sqlite3VdbeIncrWriteCounter(p, 0); + pOut = out2Prerelease(p, pOp); + pgno = 0; + assert( pOp->p3==BTREE_INTKEY || pOp->p3==BTREE_BLOBKEY ); + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( p->readOnly==0 ); + pDb = &db->aDb[pOp->p1]; + assert( pDb->pBt!=0 ); + rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, pOp->p3); + if( rc ) goto abort_due_to_error; + pOut->u.i = pgno; + break; +} + +/* Opcode: SqlExec * * * P4 * +** +** Run the SQL statement or statements specified in the P4 string. +*/ +case OP_SqlExec: { + sqlite3VdbeIncrWriteCounter(p, 0); + db->nSqlExec++; + rc = sqlite3_exec(db, pOp->p4.z, 0, 0, 0); + db->nSqlExec--; + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: ParseSchema P1 * * P4 * +** +** Read and parse all entries from the SQLITE_MASTER table of database P1 +** that match the WHERE clause P4. If P4 is a NULL pointer, then the +** entire schema for P1 is reparsed. +** +** This opcode invokes the parser to create a new virtual machine, +** then runs the new virtual machine. It is thus a re-entrant opcode. +*/ +case OP_ParseSchema: { + int iDb; + const char *zMaster; + char *zSql; + InitData initData; + + /* Any prepared statement that invokes this opcode will hold mutexes + ** on every btree. This is a prerequisite for invoking + ** sqlite3InitCallback(). + */ +#ifdef SQLITE_DEBUG + for(iDb=0; iDbnDb; iDb++){ + assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); + } +#endif + + iDb = pOp->p1; + assert( iDb>=0 && iDbnDb ); + assert( DbHasProperty(db, iDb, DB_SchemaLoaded) ); + +#ifndef SQLITE_OMIT_ALTERTABLE + if( pOp->p4.z==0 ){ + sqlite3SchemaClear(db->aDb[iDb].pSchema); + db->mDbFlags &= ~DBFLAG_SchemaKnownOk; + rc = sqlite3InitOne(db, iDb, &p->zErrMsg, INITFLAG_AlterTable); + db->mDbFlags |= DBFLAG_SchemaChange; + p->expired = 0; + }else +#endif + { + zMaster = MASTER_NAME; + initData.db = db; + initData.iDb = iDb; + initData.pzErrMsg = &p->zErrMsg; + initData.mInitFlags = 0; + zSql = sqlite3MPrintf(db, + "SELECT*FROM\"%w\".%s WHERE %s ORDER BY rowid", + db->aDb[iDb].zDbSName, zMaster, pOp->p4.z); + if( zSql==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + assert( db->init.busy==0 ); + db->init.busy = 1; + initData.rc = SQLITE_OK; + initData.nInitRow = 0; + assert( !db->mallocFailed ); + rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); + if( rc==SQLITE_OK ) rc = initData.rc; + if( rc==SQLITE_OK && initData.nInitRow==0 ){ + /* The OP_ParseSchema opcode with a non-NULL P4 argument should parse + ** at least one SQL statement. Any less than that indicates that + ** the sqlite_master table is corrupt. */ + rc = SQLITE_CORRUPT_BKPT; + } + sqlite3DbFreeNN(db, zSql); + db->init.busy = 0; + } + } + if( rc ){ + sqlite3ResetAllSchemasOfConnection(db); + if( rc==SQLITE_NOMEM ){ + goto no_mem; + } + goto abort_due_to_error; + } + break; +} + +#if !defined(SQLITE_OMIT_ANALYZE) +/* Opcode: LoadAnalysis P1 * * * * +** +** Read the sqlite_stat1 table for database P1 and load the content +** of that table into the internal index hash table. This will cause +** the analysis to be used when preparing all subsequent queries. +*/ +case OP_LoadAnalysis: { + assert( pOp->p1>=0 && pOp->p1nDb ); + rc = sqlite3AnalysisLoad(db, pOp->p1); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* !defined(SQLITE_OMIT_ANALYZE) */ + +/* Opcode: DropTable P1 * * P4 * +** +** Remove the internal (in-memory) data structures that describe +** the table named P4 in database P1. This is called after a table +** is dropped from disk (using the Destroy opcode) in order to keep +** the internal representation of the +** schema consistent with what is on disk. +*/ +case OP_DropTable: { + sqlite3VdbeIncrWriteCounter(p, 0); + sqlite3UnlinkAndDeleteTable(db, pOp->p1, pOp->p4.z); + break; +} + +/* Opcode: DropIndex P1 * * P4 * +** +** Remove the internal (in-memory) data structures that describe +** the index named P4 in database P1. This is called after an index +** is dropped from disk (using the Destroy opcode) +** in order to keep the internal representation of the +** schema consistent with what is on disk. +*/ +case OP_DropIndex: { + sqlite3VdbeIncrWriteCounter(p, 0); + sqlite3UnlinkAndDeleteIndex(db, pOp->p1, pOp->p4.z); + break; +} + +/* Opcode: DropTrigger P1 * * P4 * +** +** Remove the internal (in-memory) data structures that describe +** the trigger named P4 in database P1. This is called after a trigger +** is dropped from disk (using the Destroy opcode) in order to keep +** the internal representation of the +** schema consistent with what is on disk. +*/ +case OP_DropTrigger: { + sqlite3VdbeIncrWriteCounter(p, 0); + sqlite3UnlinkAndDeleteTrigger(db, pOp->p1, pOp->p4.z); + break; +} + + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* Opcode: IntegrityCk P1 P2 P3 P4 P5 +** +** Do an analysis of the currently open database. Store in +** register P1 the text of an error message describing any problems. +** If no problems are found, store a NULL in register P1. +** +** The register P3 contains one less than the maximum number of allowed errors. +** At most reg(P3) errors will be reported. +** In other words, the analysis stops as soon as reg(P1) errors are +** seen. Reg(P1) is updated with the number of errors remaining. +** +** The root page numbers of all tables in the database are integers +** stored in P4_INTARRAY argument. +** +** If P5 is not zero, the check is done on the auxiliary database +** file, not the main database file. +** +** This opcode is used to implement the integrity_check pragma. +*/ +case OP_IntegrityCk: { + int nRoot; /* Number of tables to check. (Number of root pages.) */ + int *aRoot; /* Array of rootpage numbers for tables to be checked */ + int nErr; /* Number of errors reported */ + char *z; /* Text of the error report */ + Mem *pnErr; /* Register keeping track of errors remaining */ + + assert( p->bIsReader ); + nRoot = pOp->p2; + aRoot = pOp->p4.ai; + assert( nRoot>0 ); + assert( aRoot[0]==nRoot ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + pnErr = &aMem[pOp->p3]; + assert( (pnErr->flags & MEM_Int)!=0 ); + assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 ); + pIn1 = &aMem[pOp->p1]; + assert( pOp->p5nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p5) ); + z = sqlite3BtreeIntegrityCheck(db, db->aDb[pOp->p5].pBt, &aRoot[1], nRoot, + (int)pnErr->u.i+1, &nErr); + sqlite3VdbeMemSetNull(pIn1); + if( nErr==0 ){ + assert( z==0 ); + }else if( z==0 ){ + goto no_mem; + }else{ + pnErr->u.i -= nErr-1; + sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free); + } + UPDATE_MAX_BLOBSIZE(pIn1); + sqlite3VdbeChangeEncoding(pIn1, encoding); + goto check_for_interrupt; +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +/* Opcode: RowSetAdd P1 P2 * * * +** Synopsis: rowset(P1)=r[P2] +** +** Insert the integer value held by register P2 into a RowSet object +** held in register P1. +** +** An assertion fails if P2 is not an integer. +*/ +case OP_RowSetAdd: { /* in1, in2 */ + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + assert( (pIn2->flags & MEM_Int)!=0 ); + if( (pIn1->flags & MEM_Blob)==0 ){ + if( sqlite3VdbeMemSetRowSet(pIn1) ) goto no_mem; + } + assert( sqlite3VdbeMemIsRowSet(pIn1) ); + sqlite3RowSetInsert((RowSet*)pIn1->z, pIn2->u.i); + break; +} + +/* Opcode: RowSetRead P1 P2 P3 * * +** Synopsis: r[P3]=rowset(P1) +** +** Extract the smallest value from the RowSet object in P1 +** and put that value into register P3. +** Or, if RowSet object P1 is initially empty, leave P3 +** unchanged and jump to instruction P2. +*/ +case OP_RowSetRead: { /* jump, in1, out3 */ + i64 val; + + pIn1 = &aMem[pOp->p1]; + assert( (pIn1->flags & MEM_Blob)==0 || sqlite3VdbeMemIsRowSet(pIn1) ); + if( (pIn1->flags & MEM_Blob)==0 + || sqlite3RowSetNext((RowSet*)pIn1->z, &val)==0 + ){ + /* The boolean index is empty */ + sqlite3VdbeMemSetNull(pIn1); + VdbeBranchTaken(1,2); + goto jump_to_p2_and_check_for_interrupt; + }else{ + /* A value was pulled from the index */ + VdbeBranchTaken(0,2); + sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val); + } + goto check_for_interrupt; +} + +/* Opcode: RowSetTest P1 P2 P3 P4 +** Synopsis: if r[P3] in rowset(P1) goto P2 +** +** Register P3 is assumed to hold a 64-bit integer value. If register P1 +** contains a RowSet object and that RowSet object contains +** the value held in P3, jump to register P2. Otherwise, insert the +** integer in P3 into the RowSet and continue on to the +** next opcode. +** +** The RowSet object is optimized for the case where sets of integers +** are inserted in distinct phases, which each set contains no duplicates. +** Each set is identified by a unique P4 value. The first set +** must have P4==0, the final set must have P4==-1, and for all other sets +** must have P4>0. +** +** This allows optimizations: (a) when P4==0 there is no need to test +** the RowSet object for P3, as it is guaranteed not to contain it, +** (b) when P4==-1 there is no need to insert the value, as it will +** never be tested for, and (c) when a value that is part of set X is +** inserted, there is no need to search to see if the same value was +** previously inserted as part of set X (only if it was previously +** inserted as part of some other set). +*/ +case OP_RowSetTest: { /* jump, in1, in3 */ + int iSet; + int exists; + + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + iSet = pOp->p4.i; + assert( pIn3->flags&MEM_Int ); + + /* If there is anything other than a rowset object in memory cell P1, + ** delete it now and initialize P1 with an empty rowset + */ + if( (pIn1->flags & MEM_Blob)==0 ){ + if( sqlite3VdbeMemSetRowSet(pIn1) ) goto no_mem; + } + assert( sqlite3VdbeMemIsRowSet(pIn1) ); + assert( pOp->p4type==P4_INT32 ); + assert( iSet==-1 || iSet>=0 ); + if( iSet ){ + exists = sqlite3RowSetTest((RowSet*)pIn1->z, iSet, pIn3->u.i); + VdbeBranchTaken(exists!=0,2); + if( exists ) goto jump_to_p2; + } + if( iSet>=0 ){ + sqlite3RowSetInsert((RowSet*)pIn1->z, pIn3->u.i); + } + break; +} + + +#ifndef SQLITE_OMIT_TRIGGER + +/* Opcode: Program P1 P2 P3 P4 P5 +** +** Execute the trigger program passed as P4 (type P4_SUBPROGRAM). +** +** P1 contains the address of the memory cell that contains the first memory +** cell in an array of values used as arguments to the sub-program. P2 +** contains the address to jump to if the sub-program throws an IGNORE +** exception using the RAISE() function. Register P3 contains the address +** of a memory cell in this (the parent) VM that is used to allocate the +** memory required by the sub-vdbe at runtime. +** +** P4 is a pointer to the VM containing the trigger program. +** +** If P5 is non-zero, then recursive program invocation is enabled. +*/ +case OP_Program: { /* jump */ + int nMem; /* Number of memory registers for sub-program */ + int nByte; /* Bytes of runtime space required for sub-program */ + Mem *pRt; /* Register to allocate runtime space */ + Mem *pMem; /* Used to iterate through memory cells */ + Mem *pEnd; /* Last memory cell in new array */ + VdbeFrame *pFrame; /* New vdbe frame to execute in */ + SubProgram *pProgram; /* Sub-program to execute */ + void *t; /* Token identifying trigger */ + + pProgram = pOp->p4.pProgram; + pRt = &aMem[pOp->p3]; + assert( pProgram->nOp>0 ); + + /* If the p5 flag is clear, then recursive invocation of triggers is + ** disabled for backwards compatibility (p5 is set if this sub-program + ** is really a trigger, not a foreign key action, and the flag set + ** and cleared by the "PRAGMA recursive_triggers" command is clear). + ** + ** It is recursive invocation of triggers, at the SQL level, that is + ** disabled. In some cases a single trigger may generate more than one + ** SubProgram (if the trigger may be executed with more than one different + ** ON CONFLICT algorithm). SubProgram structures associated with a + ** single trigger all have the same value for the SubProgram.token + ** variable. */ + if( pOp->p5 ){ + t = pProgram->token; + for(pFrame=p->pFrame; pFrame && pFrame->token!=t; pFrame=pFrame->pParent); + if( pFrame ) break; + } + + if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){ + rc = SQLITE_ERROR; + sqlite3VdbeError(p, "too many levels of trigger recursion"); + goto abort_due_to_error; + } + + /* Register pRt is used to store the memory required to save the state + ** of the current program, and the memory required at runtime to execute + ** the trigger program. If this trigger has been fired before, then pRt + ** is already allocated. Otherwise, it must be initialized. */ + if( (pRt->flags&MEM_Blob)==0 ){ + /* SubProgram.nMem is set to the number of memory cells used by the + ** program stored in SubProgram.aOp. As well as these, one memory + ** cell is required for each cursor used by the program. Set local + ** variable nMem (and later, VdbeFrame.nChildMem) to this value. + */ + nMem = pProgram->nMem + pProgram->nCsr; + assert( nMem>0 ); + if( pProgram->nCsr==0 ) nMem++; + nByte = ROUND8(sizeof(VdbeFrame)) + + nMem * sizeof(Mem) + + pProgram->nCsr * sizeof(VdbeCursor*) + + (pProgram->nOp + 7)/8; + pFrame = sqlite3DbMallocZero(db, nByte); + if( !pFrame ){ + goto no_mem; + } + sqlite3VdbeMemRelease(pRt); + pRt->flags = MEM_Blob|MEM_Dyn; + pRt->z = (char*)pFrame; + pRt->n = nByte; + pRt->xDel = sqlite3VdbeFrameMemDel; + + pFrame->v = p; + pFrame->nChildMem = nMem; + pFrame->nChildCsr = pProgram->nCsr; + pFrame->pc = (int)(pOp - aOp); + pFrame->aMem = p->aMem; + pFrame->nMem = p->nMem; + pFrame->apCsr = p->apCsr; + pFrame->nCursor = p->nCursor; + pFrame->aOp = p->aOp; + pFrame->nOp = p->nOp; + pFrame->token = pProgram->token; +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + pFrame->anExec = p->anExec; +#endif +#ifdef SQLITE_DEBUG + pFrame->iFrameMagic = SQLITE_FRAME_MAGIC; +#endif + + pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem]; + for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){ + pMem->flags = MEM_Undefined; + pMem->db = db; + } + }else{ + pFrame = (VdbeFrame*)pRt->z; + assert( pRt->xDel==sqlite3VdbeFrameMemDel ); + assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem + || (pProgram->nCsr==0 && pProgram->nMem+1==pFrame->nChildMem) ); + assert( pProgram->nCsr==pFrame->nChildCsr ); + assert( (int)(pOp - aOp)==pFrame->pc ); + } + + p->nFrame++; + pFrame->pParent = p->pFrame; + pFrame->lastRowid = db->lastRowid; + pFrame->nChange = p->nChange; + pFrame->nDbChange = p->db->nChange; + assert( pFrame->pAuxData==0 ); + pFrame->pAuxData = p->pAuxData; + p->pAuxData = 0; + p->nChange = 0; + p->pFrame = pFrame; + p->aMem = aMem = VdbeFrameMem(pFrame); + p->nMem = pFrame->nChildMem; + p->nCursor = (u16)pFrame->nChildCsr; + p->apCsr = (VdbeCursor **)&aMem[p->nMem]; + pFrame->aOnce = (u8*)&p->apCsr[pProgram->nCsr]; + memset(pFrame->aOnce, 0, (pProgram->nOp + 7)/8); + p->aOp = aOp = pProgram->aOp; + p->nOp = pProgram->nOp; +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = 0; +#endif +#ifdef SQLITE_DEBUG + /* Verify that second and subsequent executions of the same trigger do not + ** try to reuse register values from the first use. */ + { + int i; + for(i=0; inMem; i++){ + aMem[i].pScopyFrom = 0; /* Prevent false-positive AboutToChange() errs */ + MemSetTypeFlag(&aMem[i], MEM_Undefined); /* Fault if this reg is reused */ + } + } +#endif + pOp = &aOp[-1]; + goto check_for_interrupt; +} + +/* Opcode: Param P1 P2 * * * +** +** This opcode is only ever present in sub-programs called via the +** OP_Program instruction. Copy a value currently stored in a memory +** cell of the calling (parent) frame to cell P2 in the current frames +** address space. This is used by trigger programs to access the new.* +** and old.* values. +** +** The address of the cell in the parent frame is determined by adding +** the value of the P1 argument to the value of the P1 argument to the +** calling OP_Program instruction. +*/ +case OP_Param: { /* out2 */ + VdbeFrame *pFrame; + Mem *pIn; + pOut = out2Prerelease(p, pOp); + pFrame = p->pFrame; + pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1]; + sqlite3VdbeMemShallowCopy(pOut, pIn, MEM_Ephem); + break; +} + +#endif /* #ifndef SQLITE_OMIT_TRIGGER */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY +/* Opcode: FkCounter P1 P2 * * * +** Synopsis: fkctr[P1]+=P2 +** +** Increment a "constraint counter" by P2 (P2 may be negative or positive). +** If P1 is non-zero, the database constraint counter is incremented +** (deferred foreign key constraints). Otherwise, if P1 is zero, the +** statement counter is incremented (immediate foreign key constraints). +*/ +case OP_FkCounter: { + if( db->flags & SQLITE_DeferFKs ){ + db->nDeferredImmCons += pOp->p2; + }else if( pOp->p1 ){ + db->nDeferredCons += pOp->p2; + }else{ + p->nFkConstraint += pOp->p2; + } + break; +} + +/* Opcode: FkIfZero P1 P2 * * * +** Synopsis: if fkctr[P1]==0 goto P2 +** +** This opcode tests if a foreign key constraint-counter is currently zero. +** If so, jump to instruction P2. Otherwise, fall through to the next +** instruction. +** +** If P1 is non-zero, then the jump is taken if the database constraint-counter +** is zero (the one that counts deferred constraint violations). If P1 is +** zero, the jump is taken if the statement constraint-counter is zero +** (immediate foreign key constraint violations). +*/ +case OP_FkIfZero: { /* jump */ + if( pOp->p1 ){ + VdbeBranchTaken(db->nDeferredCons==0 && db->nDeferredImmCons==0, 2); + if( db->nDeferredCons==0 && db->nDeferredImmCons==0 ) goto jump_to_p2; + }else{ + VdbeBranchTaken(p->nFkConstraint==0 && db->nDeferredImmCons==0, 2); + if( p->nFkConstraint==0 && db->nDeferredImmCons==0 ) goto jump_to_p2; + } + break; +} +#endif /* #ifndef SQLITE_OMIT_FOREIGN_KEY */ + +#ifndef SQLITE_OMIT_AUTOINCREMENT +/* Opcode: MemMax P1 P2 * * * +** Synopsis: r[P1]=max(r[P1],r[P2]) +** +** P1 is a register in the root frame of this VM (the root frame is +** different from the current frame if this instruction is being executed +** within a sub-program). Set the value of register P1 to the maximum of +** its current value and the value in register P2. +** +** This instruction throws an error if the memory cell is not initially +** an integer. +*/ +case OP_MemMax: { /* in2 */ + VdbeFrame *pFrame; + if( p->pFrame ){ + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); + pIn1 = &pFrame->aMem[pOp->p1]; + }else{ + pIn1 = &aMem[pOp->p1]; + } + assert( memIsValid(pIn1) ); + sqlite3VdbeMemIntegerify(pIn1); + pIn2 = &aMem[pOp->p2]; + sqlite3VdbeMemIntegerify(pIn2); + if( pIn1->u.iu.i){ + pIn1->u.i = pIn2->u.i; + } + break; +} +#endif /* SQLITE_OMIT_AUTOINCREMENT */ + +/* Opcode: IfPos P1 P2 P3 * * +** Synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 +** +** Register P1 must contain an integer. +** If the value of register P1 is 1 or greater, subtract P3 from the +** value in P1 and jump to P2. +** +** If the initial value of register P1 is less than 1, then the +** value is unchanged and control passes through to the next instruction. +*/ +case OP_IfPos: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags&MEM_Int ); + VdbeBranchTaken( pIn1->u.i>0, 2); + if( pIn1->u.i>0 ){ + pIn1->u.i -= pOp->p3; + goto jump_to_p2; + } + break; +} + +/* Opcode: OffsetLimit P1 P2 P3 * * +** Synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) +** +** This opcode performs a commonly used computation associated with +** LIMIT and OFFSET process. r[P1] holds the limit counter. r[P3] +** holds the offset counter. The opcode computes the combined value +** of the LIMIT and OFFSET and stores that value in r[P2]. The r[P2] +** value computed is the total number of rows that will need to be +** visited in order to complete the query. +** +** If r[P3] is zero or negative, that means there is no OFFSET +** and r[P2] is set to be the value of the LIMIT, r[P1]. +** +** if r[P1] is zero or negative, that means there is no LIMIT +** and r[P2] is set to -1. +** +** Otherwise, r[P2] is set to the sum of r[P1] and r[P3]. +*/ +case OP_OffsetLimit: { /* in1, out2, in3 */ + i64 x; + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + pOut = out2Prerelease(p, pOp); + assert( pIn1->flags & MEM_Int ); + assert( pIn3->flags & MEM_Int ); + x = pIn1->u.i; + if( x<=0 || sqlite3AddInt64(&x, pIn3->u.i>0?pIn3->u.i:0) ){ + /* If the LIMIT is less than or equal to zero, loop forever. This + ** is documented. But also, if the LIMIT+OFFSET exceeds 2^63 then + ** also loop forever. This is undocumented. In fact, one could argue + ** that the loop should terminate. But assuming 1 billion iterations + ** per second (far exceeding the capabilities of any current hardware) + ** it would take nearly 300 years to actually reach the limit. So + ** looping forever is a reasonable approximation. */ + pOut->u.i = -1; + }else{ + pOut->u.i = x; + } + break; +} + +/* Opcode: IfNotZero P1 P2 * * * +** Synopsis: if r[P1]!=0 then r[P1]--, goto P2 +** +** Register P1 must contain an integer. If the content of register P1 is +** initially greater than zero, then decrement the value in register P1. +** If it is non-zero (negative or positive) and then also jump to P2. +** If register P1 is initially zero, leave it unchanged and fall through. +*/ +case OP_IfNotZero: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags&MEM_Int ); + VdbeBranchTaken(pIn1->u.i<0, 2); + if( pIn1->u.i ){ + if( pIn1->u.i>0 ) pIn1->u.i--; + goto jump_to_p2; + } + break; +} + +/* Opcode: DecrJumpZero P1 P2 * * * +** Synopsis: if (--r[P1])==0 goto P2 +** +** Register P1 must hold an integer. Decrement the value in P1 +** and jump to P2 if the new value is exactly zero. +*/ +case OP_DecrJumpZero: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags&MEM_Int ); + if( pIn1->u.i>SMALLEST_INT64 ) pIn1->u.i--; + VdbeBranchTaken(pIn1->u.i==0, 2); + if( pIn1->u.i==0 ) goto jump_to_p2; + break; +} + + +/* Opcode: AggStep * P2 P3 P4 P5 +** Synopsis: accum=r[P3] step(r[P2@P5]) +** +** Execute the xStep function for an aggregate. +** The function has P5 arguments. P4 is a pointer to the +** FuncDef structure that specifies the function. Register P3 is the +** accumulator. +** +** The P5 arguments are taken from register P2 and its +** successors. +*/ +/* Opcode: AggInverse * P2 P3 P4 P5 +** Synopsis: accum=r[P3] inverse(r[P2@P5]) +** +** Execute the xInverse function for an aggregate. +** The function has P5 arguments. P4 is a pointer to the +** FuncDef structure that specifies the function. Register P3 is the +** accumulator. +** +** The P5 arguments are taken from register P2 and its +** successors. +*/ +/* Opcode: AggStep1 P1 P2 P3 P4 P5 +** Synopsis: accum=r[P3] step(r[P2@P5]) +** +** Execute the xStep (if P1==0) or xInverse (if P1!=0) function for an +** aggregate. The function has P5 arguments. P4 is a pointer to the +** FuncDef structure that specifies the function. Register P3 is the +** accumulator. +** +** The P5 arguments are taken from register P2 and its +** successors. +** +** This opcode is initially coded as OP_AggStep0. On first evaluation, +** the FuncDef stored in P4 is converted into an sqlite3_context and +** the opcode is changed. In this way, the initialization of the +** sqlite3_context only happens once, instead of on each call to the +** step function. +*/ +case OP_AggInverse: +case OP_AggStep: { + int n; + sqlite3_context *pCtx; + + assert( pOp->p4type==P4_FUNCDEF ); + n = pOp->p5; + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) ); + assert( pOp->p3p2 || pOp->p3>=pOp->p2+n ); + pCtx = sqlite3DbMallocRawNN(db, n*sizeof(sqlite3_value*) + + (sizeof(pCtx[0]) + sizeof(Mem) - sizeof(sqlite3_value*))); + if( pCtx==0 ) goto no_mem; + pCtx->pMem = 0; + pCtx->pOut = (Mem*)&(pCtx->argv[n]); + sqlite3VdbeMemInit(pCtx->pOut, db, MEM_Null); + pCtx->pFunc = pOp->p4.pFunc; + pCtx->iOp = (int)(pOp - aOp); + pCtx->pVdbe = p; + pCtx->skipFlag = 0; + pCtx->isError = 0; + pCtx->argc = n; + pOp->p4type = P4_FUNCCTX; + pOp->p4.pCtx = pCtx; + + /* OP_AggInverse must have P1==1 and OP_AggStep must have P1==0 */ + assert( pOp->p1==(pOp->opcode==OP_AggInverse) ); + + pOp->opcode = OP_AggStep1; + /* Fall through into OP_AggStep */ +} +case OP_AggStep1: { + int i; + sqlite3_context *pCtx; + Mem *pMem; + + assert( pOp->p4type==P4_FUNCCTX ); + pCtx = pOp->p4.pCtx; + pMem = &aMem[pOp->p3]; + +#ifdef SQLITE_DEBUG + if( pOp->p1 ){ + /* This is an OP_AggInverse call. Verify that xStep has always + ** been called at least once prior to any xInverse call. */ + assert( pMem->uTemp==0x1122e0e3 ); + }else{ + /* This is an OP_AggStep call. Mark it as such. */ + pMem->uTemp = 0x1122e0e3; + } +#endif + + /* If this function is inside of a trigger, the register array in aMem[] + ** might change from one evaluation to the next. The next block of code + ** checks to see if the register array has changed, and if so it + ** reinitializes the relavant parts of the sqlite3_context object */ + if( pCtx->pMem != pMem ){ + pCtx->pMem = pMem; + for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; + } + +#ifdef SQLITE_DEBUG + for(i=0; iargc; i++){ + assert( memIsValid(pCtx->argv[i]) ); + REGISTER_TRACE(pOp->p2+i, pCtx->argv[i]); + } +#endif + + pMem->n++; + assert( pCtx->pOut->flags==MEM_Null ); + assert( pCtx->isError==0 ); + assert( pCtx->skipFlag==0 ); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pOp->p1 ){ + (pCtx->pFunc->xInverse)(pCtx,pCtx->argc,pCtx->argv); + }else +#endif + (pCtx->pFunc->xSFunc)(pCtx,pCtx->argc,pCtx->argv); /* IMP: R-24505-23230 */ + + if( pCtx->isError ){ + if( pCtx->isError>0 ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pCtx->pOut)); + rc = pCtx->isError; + } + if( pCtx->skipFlag ){ + assert( pOp[-1].opcode==OP_CollSeq ); + i = pOp[-1].p1; + if( i ) sqlite3VdbeMemSetInt64(&aMem[i], 1); + pCtx->skipFlag = 0; + } + sqlite3VdbeMemRelease(pCtx->pOut); + pCtx->pOut->flags = MEM_Null; + pCtx->isError = 0; + if( rc ) goto abort_due_to_error; + } + assert( pCtx->pOut->flags==MEM_Null ); + assert( pCtx->skipFlag==0 ); + break; +} + +/* Opcode: AggFinal P1 P2 * P4 * +** Synopsis: accum=r[P1] N=P2 +** +** P1 is the memory location that is the accumulator for an aggregate +** or window function. Execute the finalizer function +** for an aggregate and store the result in P1. +** +** P2 is the number of arguments that the step function takes and +** P4 is a pointer to the FuncDef for this function. The P2 +** argument is not used by this opcode. It is only there to disambiguate +** functions that can take varying numbers of arguments. The +** P4 argument is only needed for the case where +** the step function was not previously called. +*/ +/* Opcode: AggValue * P2 P3 P4 * +** Synopsis: r[P3]=value N=P2 +** +** Invoke the xValue() function and store the result in register P3. +** +** P2 is the number of arguments that the step function takes and +** P4 is a pointer to the FuncDef for this function. The P2 +** argument is not used by this opcode. It is only there to disambiguate +** functions that can take varying numbers of arguments. The +** P4 argument is only needed for the case where +** the step function was not previously called. +*/ +case OP_AggValue: +case OP_AggFinal: { + Mem *pMem; + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + assert( pOp->p3==0 || pOp->opcode==OP_AggValue ); + pMem = &aMem[pOp->p1]; + assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pOp->p3 ){ + memAboutToChange(p, &aMem[pOp->p3]); + rc = sqlite3VdbeMemAggValue(pMem, &aMem[pOp->p3], pOp->p4.pFunc); + pMem = &aMem[pOp->p3]; + }else +#endif + { + rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc); + } + + if( rc ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pMem)); + goto abort_due_to_error; + } + sqlite3VdbeChangeEncoding(pMem, encoding); + UPDATE_MAX_BLOBSIZE(pMem); + if( sqlite3VdbeMemTooBig(pMem) ){ + goto too_big; + } + break; +} + +#ifndef SQLITE_OMIT_WAL +/* Opcode: Checkpoint P1 P2 P3 * * +** +** Checkpoint database P1. This is a no-op if P1 is not currently in +** WAL mode. Parameter P2 is one of SQLITE_CHECKPOINT_PASSIVE, FULL, +** RESTART, or TRUNCATE. Write 1 or 0 into mem[P3] if the checkpoint returns +** SQLITE_BUSY or not, respectively. Write the number of pages in the +** WAL after the checkpoint into mem[P3+1] and the number of pages +** in the WAL that have been checkpointed after the checkpoint +** completes into mem[P3+2]. However on an error, mem[P3+1] and +** mem[P3+2] are initialized to -1. +*/ +case OP_Checkpoint: { + int i; /* Loop counter */ + int aRes[3]; /* Results */ + Mem *pMem; /* Write results here */ + + assert( p->readOnly==0 ); + aRes[0] = 0; + aRes[1] = aRes[2] = -1; + assert( pOp->p2==SQLITE_CHECKPOINT_PASSIVE + || pOp->p2==SQLITE_CHECKPOINT_FULL + || pOp->p2==SQLITE_CHECKPOINT_RESTART + || pOp->p2==SQLITE_CHECKPOINT_TRUNCATE + ); + rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &aRes[1], &aRes[2]); + if( rc ){ + if( rc!=SQLITE_BUSY ) goto abort_due_to_error; + rc = SQLITE_OK; + aRes[0] = 1; + } + for(i=0, pMem = &aMem[pOp->p3]; i<3; i++, pMem++){ + sqlite3VdbeMemSetInt64(pMem, (i64)aRes[i]); + } + break; +}; +#endif + +#ifndef SQLITE_OMIT_PRAGMA +/* Opcode: JournalMode P1 P2 P3 * * +** +** Change the journal mode of database P1 to P3. P3 must be one of the +** PAGER_JOURNALMODE_XXX values. If changing between the various rollback +** modes (delete, truncate, persist, off and memory), this is a simple +** operation. No IO is required. +** +** If changing into or out of WAL mode the procedure is more complicated. +** +** Write a string containing the final journal-mode to register P2. +*/ +case OP_JournalMode: { /* out2 */ + Btree *pBt; /* Btree to change journal mode of */ + Pager *pPager; /* Pager associated with pBt */ + int eNew; /* New journal mode */ + int eOld; /* The old journal mode */ +#ifndef SQLITE_OMIT_WAL + const char *zFilename; /* Name of database file for pPager */ +#endif + + pOut = out2Prerelease(p, pOp); + eNew = pOp->p3; + assert( eNew==PAGER_JOURNALMODE_DELETE + || eNew==PAGER_JOURNALMODE_TRUNCATE + || eNew==PAGER_JOURNALMODE_PERSIST + || eNew==PAGER_JOURNALMODE_OFF + || eNew==PAGER_JOURNALMODE_MEMORY + || eNew==PAGER_JOURNALMODE_WAL + || eNew==PAGER_JOURNALMODE_QUERY + ); + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( p->readOnly==0 ); + + pBt = db->aDb[pOp->p1].pBt; + pPager = sqlite3BtreePager(pBt); + eOld = sqlite3PagerGetJournalMode(pPager); + if( eNew==PAGER_JOURNALMODE_QUERY ) eNew = eOld; + if( !sqlite3PagerOkToChangeJournalMode(pPager) ) eNew = eOld; + +#ifndef SQLITE_OMIT_WAL + zFilename = sqlite3PagerFilename(pPager, 1); + + /* Do not allow a transition to journal_mode=WAL for a database + ** in temporary storage or if the VFS does not support shared memory + */ + if( eNew==PAGER_JOURNALMODE_WAL + && (sqlite3Strlen30(zFilename)==0 /* Temp file */ + || !sqlite3PagerWalSupported(pPager)) /* No shared-memory support */ + ){ + eNew = eOld; + } + + if( (eNew!=eOld) + && (eOld==PAGER_JOURNALMODE_WAL || eNew==PAGER_JOURNALMODE_WAL) + ){ + if( !db->autoCommit || db->nVdbeRead>1 ){ + rc = SQLITE_ERROR; + sqlite3VdbeError(p, + "cannot change %s wal mode from within a transaction", + (eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of") + ); + goto abort_due_to_error; + }else{ + + if( eOld==PAGER_JOURNALMODE_WAL ){ + /* If leaving WAL mode, close the log file. If successful, the call + ** to PagerCloseWal() checkpoints and deletes the write-ahead-log + ** file. An EXCLUSIVE lock may still be held on the database file + ** after a successful return. + */ + rc = sqlite3PagerCloseWal(pPager, db); + if( rc==SQLITE_OK ){ + sqlite3PagerSetJournalMode(pPager, eNew); + } + }else if( eOld==PAGER_JOURNALMODE_MEMORY ){ + /* Cannot transition directly from MEMORY to WAL. Use mode OFF + ** as an intermediate */ + sqlite3PagerSetJournalMode(pPager, PAGER_JOURNALMODE_OFF); + } + + /* Open a transaction on the database file. Regardless of the journal + ** mode, this transaction always uses a rollback journal. + */ + assert( sqlite3BtreeIsInTrans(pBt)==0 ); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeSetVersion(pBt, (eNew==PAGER_JOURNALMODE_WAL ? 2 : 1)); + } + } + } +#endif /* ifndef SQLITE_OMIT_WAL */ + + if( rc ) eNew = eOld; + eNew = sqlite3PagerSetJournalMode(pPager, eNew); + + pOut->flags = MEM_Str|MEM_Static|MEM_Term; + pOut->z = (char *)sqlite3JournalModename(eNew); + pOut->n = sqlite3Strlen30(pOut->z); + pOut->enc = SQLITE_UTF8; + sqlite3VdbeChangeEncoding(pOut, encoding); + if( rc ) goto abort_due_to_error; + break; +}; +#endif /* SQLITE_OMIT_PRAGMA */ + +#if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) +/* Opcode: Vacuum P1 P2 * * * +** +** Vacuum the entire database P1. P1 is 0 for "main", and 2 or more +** for an attached database. The "temp" database may not be vacuumed. +** +** If P2 is not zero, then it is a register holding a string which is +** the file into which the result of vacuum should be written. When +** P2 is zero, the vacuum overwrites the original database. +*/ +case OP_Vacuum: { + assert( p->readOnly==0 ); + rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1, + pOp->p2 ? &aMem[pOp->p2] : 0); + if( rc ) goto abort_due_to_error; + break; +} +#endif + +#if !defined(SQLITE_OMIT_AUTOVACUUM) +/* Opcode: IncrVacuum P1 P2 * * * +** +** Perform a single step of the incremental vacuum procedure on +** the P1 database. If the vacuum has finished, jump to instruction +** P2. Otherwise, fall through to the next instruction. +*/ +case OP_IncrVacuum: { /* jump */ + Btree *pBt; + + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( p->readOnly==0 ); + pBt = db->aDb[pOp->p1].pBt; + rc = sqlite3BtreeIncrVacuum(pBt); + VdbeBranchTaken(rc==SQLITE_DONE,2); + if( rc ){ + if( rc!=SQLITE_DONE ) goto abort_due_to_error; + rc = SQLITE_OK; + goto jump_to_p2; + } + break; +} +#endif + +/* Opcode: Expire P1 P2 * * * +** +** Cause precompiled statements to expire. When an expired statement +** is executed using sqlite3_step() it will either automatically +** reprepare itself (if it was originally created using sqlite3_prepare_v2()) +** or it will fail with SQLITE_SCHEMA. +** +** If P1 is 0, then all SQL statements become expired. If P1 is non-zero, +** then only the currently executing statement is expired. +** +** If P2 is 0, then SQL statements are expired immediately. If P2 is 1, +** then running SQL statements are allowed to continue to run to completion. +** The P2==1 case occurs when a CREATE INDEX or similar schema change happens +** that might help the statement run faster but which does not affect the +** correctness of operation. +*/ +case OP_Expire: { + assert( pOp->p2==0 || pOp->p2==1 ); + if( !pOp->p1 ){ + sqlite3ExpirePreparedStatements(db, pOp->p2); + }else{ + p->expired = pOp->p2+1; + } + break; +} + +/* Opcode: CursorLock P1 * * * * +** +** Lock the btree to which cursor P1 is pointing so that the btree cannot be +** written by an other cursor. +*/ +case OP_CursorLock: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorPin(pC->uc.pCursor); + break; +} + +/* Opcode: CursorUnlock P1 * * * * +** +** Unlock the btree to which cursor P1 is pointing so that it can be +** written by other cursors. +*/ +case OP_CursorUnlock: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorUnpin(pC->uc.pCursor); + break; +} + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* Opcode: TableLock P1 P2 P3 P4 * +** Synopsis: iDb=P1 root=P2 write=P3 +** +** Obtain a lock on a particular table. This instruction is only used when +** the shared-cache feature is enabled. +** +** P1 is the index of the database in sqlite3.aDb[] of the database +** on which the lock is acquired. A readlock is obtained if P3==0 or +** a write lock if P3==1. +** +** P2 contains the root-page of the table to lock. +** +** P4 contains a pointer to the name of the table being locked. This is only +** used to generate an error message if the lock cannot be obtained. +*/ +case OP_TableLock: { + u8 isWriteLock = (u8)pOp->p3; + if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommit) ){ + int p1 = pOp->p1; + assert( p1>=0 && p1nDb ); + assert( DbMaskTest(p->btreeMask, p1) ); + assert( isWriteLock==0 || isWriteLock==1 ); + rc = sqlite3BtreeLockTable(db->aDb[p1].pBt, pOp->p2, isWriteLock); + if( rc ){ + if( (rc&0xFF)==SQLITE_LOCKED ){ + const char *z = pOp->p4.z; + sqlite3VdbeError(p, "database table is locked: %s", z); + } + goto abort_due_to_error; + } + } + break; +} +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VBegin * * * P4 * +** +** P4 may be a pointer to an sqlite3_vtab structure. If so, call the +** xBegin method for that table. +** +** Also, whether or not P4 is set, check that this is not being called from +** within a callback to a virtual table xSync() method. If it is, the error +** code will be set to SQLITE_LOCKED. +*/ +case OP_VBegin: { + VTable *pVTab; + pVTab = pOp->p4.pVtab; + rc = sqlite3VtabBegin(db, pVTab); + if( pVTab ) sqlite3VtabImportErrmsg(p, pVTab->pVtab); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VCreate P1 P2 * * * +** +** P2 is a register that holds the name of a virtual table in database +** P1. Call the xCreate method for that table. +*/ +case OP_VCreate: { + Mem sMem; /* For storing the record being decoded */ + const char *zTab; /* Name of the virtual table */ + + memset(&sMem, 0, sizeof(sMem)); + sMem.db = db; + /* Because P2 is always a static string, it is impossible for the + ** sqlite3VdbeMemCopy() to fail */ + assert( (aMem[pOp->p2].flags & MEM_Str)!=0 ); + assert( (aMem[pOp->p2].flags & MEM_Static)!=0 ); + rc = sqlite3VdbeMemCopy(&sMem, &aMem[pOp->p2]); + assert( rc==SQLITE_OK ); + zTab = (const char*)sqlite3_value_text(&sMem); + assert( zTab || db->mallocFailed ); + if( zTab ){ + rc = sqlite3VtabCallCreate(db, pOp->p1, zTab, &p->zErrMsg); + } + sqlite3VdbeMemRelease(&sMem); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VDestroy P1 * * P4 * +** +** P4 is the name of a virtual table in database P1. Call the xDestroy method +** of that table. +*/ +case OP_VDestroy: { + db->nVDestroy++; + rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z); + db->nVDestroy--; + assert( p->errorAction==OE_Abort && p->usesStmtJournal ); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VOpen P1 * * P4 * +** +** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. +** P1 is a cursor number. This opcode opens a cursor to the virtual +** table and stores that cursor in P1. +*/ +case OP_VOpen: { + VdbeCursor *pCur; + sqlite3_vtab_cursor *pVCur; + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + + assert( p->bIsReader ); + pCur = 0; + pVCur = 0; + pVtab = pOp->p4.pVtab->pVtab; + if( pVtab==0 || NEVER(pVtab->pModule==0) ){ + rc = SQLITE_LOCKED; + goto abort_due_to_error; + } + pModule = pVtab->pModule; + rc = pModule->xOpen(pVtab, &pVCur); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; + + /* Initialize sqlite3_vtab_cursor base class */ + pVCur->pVtab = pVtab; + + /* Initialize vdbe cursor object */ + pCur = allocateCursor(p, pOp->p1, 0, -1, CURTYPE_VTAB); + if( pCur ){ + pCur->uc.pVCur = pVCur; + pVtab->nRef++; + }else{ + assert( db->mallocFailed ); + pModule->xClose(pVCur); + goto no_mem; + } + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VFilter P1 P2 P3 P4 * +** Synopsis: iplan=r[P3] zplan='P4' +** +** P1 is a cursor opened using VOpen. P2 is an address to jump to if +** the filtered result set is empty. +** +** P4 is either NULL or a string that was generated by the xBestIndex +** method of the module. The interpretation of the P4 string is left +** to the module implementation. +** +** This opcode invokes the xFilter method on the virtual table specified +** by P1. The integer query plan parameter to xFilter is stored in register +** P3. Register P3+1 stores the argc parameter to be passed to the +** xFilter method. Registers P3+2..P3+1+argc are the argc +** additional parameters which are passed to +** xFilter as argv. Register P3+2 becomes argv[0] when passed to xFilter. +** +** A jump is made to P2 if the result set after filtering would be empty. +*/ +case OP_VFilter: { /* jump */ + int nArg; + int iQuery; + const sqlite3_module *pModule; + Mem *pQuery; + Mem *pArgc; + sqlite3_vtab_cursor *pVCur; + sqlite3_vtab *pVtab; + VdbeCursor *pCur; + int res; + int i; + Mem **apArg; + + pQuery = &aMem[pOp->p3]; + pArgc = &pQuery[1]; + pCur = p->apCsr[pOp->p1]; + assert( memIsValid(pQuery) ); + REGISTER_TRACE(pOp->p3, pQuery); + assert( pCur->eCurType==CURTYPE_VTAB ); + pVCur = pCur->uc.pVCur; + pVtab = pVCur->pVtab; + pModule = pVtab->pModule; + + /* Grab the index number and argc parameters */ + assert( (pQuery->flags&MEM_Int)!=0 && pArgc->flags==MEM_Int ); + nArg = (int)pArgc->u.i; + iQuery = (int)pQuery->u.i; + + /* Invoke the xFilter method */ + res = 0; + apArg = p->apArg; + for(i = 0; ixFilter(pVCur, iQuery, pOp->p4.z, nArg, apArg); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; + res = pModule->xEof(pVCur); + pCur->nullRow = 0; + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VColumn P1 P2 P3 * P5 +** Synopsis: r[P3]=vcolumn(P2) +** +** Store in register P3 the value of the P2-th column of +** the current row of the virtual-table of cursor P1. +** +** If the VColumn opcode is being used to fetch the value of +** an unchanging column during an UPDATE operation, then the P5 +** value is OPFLAG_NOCHNG. This will cause the sqlite3_vtab_nochange() +** function to return true inside the xColumn method of the virtual +** table implementation. The P5 column might also contain other +** bits (OPFLAG_LENGTHARG or OPFLAG_TYPEOFARG) but those bits are +** unused by OP_VColumn. +*/ +case OP_VColumn: { + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + Mem *pDest; + sqlite3_context sContext; + + VdbeCursor *pCur = p->apCsr[pOp->p1]; + assert( pCur->eCurType==CURTYPE_VTAB ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); + if( pCur->nullRow ){ + sqlite3VdbeMemSetNull(pDest); + break; + } + pVtab = pCur->uc.pVCur->pVtab; + pModule = pVtab->pModule; + assert( pModule->xColumn ); + memset(&sContext, 0, sizeof(sContext)); + sContext.pOut = pDest; + assert( pOp->p5==OPFLAG_NOCHNG || pOp->p5==0 ); + if( pOp->p5 & OPFLAG_NOCHNG ){ + sqlite3VdbeMemSetNull(pDest); + pDest->flags = MEM_Null|MEM_Zero; + pDest->u.nZero = 0; + }else{ + MemSetTypeFlag(pDest, MEM_Null); + } + rc = pModule->xColumn(pCur->uc.pVCur, &sContext, pOp->p2); + sqlite3VtabImportErrmsg(p, pVtab); + if( sContext.isError>0 ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pDest)); + rc = sContext.isError; + } + sqlite3VdbeChangeEncoding(pDest, encoding); + REGISTER_TRACE(pOp->p3, pDest); + UPDATE_MAX_BLOBSIZE(pDest); + + if( sqlite3VdbeMemTooBig(pDest) ){ + goto too_big; + } + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VNext P1 P2 * * * +** +** Advance virtual table P1 to the next row in its result set and +** jump to instruction P2. Or, if the virtual table has reached +** the end of its result set, then fall through to the next instruction. +*/ +case OP_VNext: { /* jump */ + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + int res; + VdbeCursor *pCur; + + res = 0; + pCur = p->apCsr[pOp->p1]; + assert( pCur->eCurType==CURTYPE_VTAB ); + if( pCur->nullRow ){ + break; + } + pVtab = pCur->uc.pVCur->pVtab; + pModule = pVtab->pModule; + assert( pModule->xNext ); + + /* Invoke the xNext() method of the module. There is no way for the + ** underlying implementation to return an error if one occurs during + ** xNext(). Instead, if an error occurs, true is returned (indicating that + ** data is available) and the error code returned when xColumn or + ** some other method is next invoked on the save virtual table cursor. + */ + rc = pModule->xNext(pCur->uc.pVCur); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; + res = pModule->xEof(pCur->uc.pVCur); + VdbeBranchTaken(!res,2); + if( !res ){ + /* If there is data, jump to P2 */ + goto jump_to_p2_and_check_for_interrupt; + } + goto check_for_interrupt; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VRename P1 * * P4 * +** +** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. +** This opcode invokes the corresponding xRename method. The value +** in register P1 is passed as the zName argument to the xRename method. +*/ +case OP_VRename: { + sqlite3_vtab *pVtab; + Mem *pName; + int isLegacy; + + isLegacy = (db->flags & SQLITE_LegacyAlter); + db->flags |= SQLITE_LegacyAlter; + pVtab = pOp->p4.pVtab->pVtab; + pName = &aMem[pOp->p1]; + assert( pVtab->pModule->xRename ); + assert( memIsValid(pName) ); + assert( p->readOnly==0 ); + REGISTER_TRACE(pOp->p1, pName); + assert( pName->flags & MEM_Str ); + testcase( pName->enc==SQLITE_UTF8 ); + testcase( pName->enc==SQLITE_UTF16BE ); + testcase( pName->enc==SQLITE_UTF16LE ); + rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); + if( rc ) goto abort_due_to_error; + rc = pVtab->pModule->xRename(pVtab, pName->z); + if( isLegacy==0 ) db->flags &= ~(u64)SQLITE_LegacyAlter; + sqlite3VtabImportErrmsg(p, pVtab); + p->expired = 0; + if( rc ) goto abort_due_to_error; + break; +} +#endif + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VUpdate P1 P2 P3 P4 P5 +** Synopsis: data=r[P3@P2] +** +** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. +** This opcode invokes the corresponding xUpdate method. P2 values +** are contiguous memory cells starting at P3 to pass to the xUpdate +** invocation. The value in register (P3+P2-1) corresponds to the +** p2th element of the argv array passed to xUpdate. +** +** The xUpdate method will do a DELETE or an INSERT or both. +** The argv[0] element (which corresponds to memory cell P3) +** is the rowid of a row to delete. If argv[0] is NULL then no +** deletion occurs. The argv[1] element is the rowid of the new +** row. This can be NULL to have the virtual table select the new +** rowid for itself. The subsequent elements in the array are +** the values of columns in the new row. +** +** If P2==1 then no insert is performed. argv[0] is the rowid of +** a row to delete. +** +** P1 is a boolean flag. If it is set to true and the xUpdate call +** is successful, then the value returned by sqlite3_last_insert_rowid() +** is set to the value of the rowid for the row just inserted. +** +** P5 is the error actions (OE_Replace, OE_Fail, OE_Ignore, etc) to +** apply in the case of a constraint failure on an insert or update. +*/ +case OP_VUpdate: { + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + int nArg; + int i; + sqlite_int64 rowid; + Mem **apArg; + Mem *pX; + + assert( pOp->p2==1 || pOp->p5==OE_Fail || pOp->p5==OE_Rollback + || pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace + ); + assert( p->readOnly==0 ); + if( db->mallocFailed ) goto no_mem; + sqlite3VdbeIncrWriteCounter(p, 0); + pVtab = pOp->p4.pVtab->pVtab; + if( pVtab==0 || NEVER(pVtab->pModule==0) ){ + rc = SQLITE_LOCKED; + goto abort_due_to_error; + } + pModule = pVtab->pModule; + nArg = pOp->p2; + assert( pOp->p4type==P4_VTAB ); + if( ALWAYS(pModule->xUpdate) ){ + u8 vtabOnConflict = db->vtabOnConflict; + apArg = p->apArg; + pX = &aMem[pOp->p3]; + for(i=0; ivtabOnConflict = pOp->p5; + rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid); + db->vtabOnConflict = vtabOnConflict; + sqlite3VtabImportErrmsg(p, pVtab); + if( rc==SQLITE_OK && pOp->p1 ){ + assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) ); + db->lastRowid = rowid; + } + if( (rc&0xff)==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){ + if( pOp->p5==OE_Ignore ){ + rc = SQLITE_OK; + }else{ + p->errorAction = ((pOp->p5==OE_Replace) ? OE_Abort : pOp->p5); + } + }else{ + p->nChange++; + } + if( rc ) goto abort_due_to_error; + } + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* Opcode: Pagecount P1 P2 * * * +** +** Write the current number of pages in database P1 to memory cell P2. +*/ +case OP_Pagecount: { /* out2 */ + pOut = out2Prerelease(p, pOp); + pOut->u.i = sqlite3BtreeLastPage(db->aDb[pOp->p1].pBt); + break; +} +#endif + + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* Opcode: MaxPgcnt P1 P2 P3 * * +** +** Try to set the maximum page count for database P1 to the value in P3. +** Do not let the maximum page count fall below the current page count and +** do not change the maximum page count value if P3==0. +** +** Store the maximum page count after the change in register P2. +*/ +case OP_MaxPgcnt: { /* out2 */ + unsigned int newMax; + Btree *pBt; + + pOut = out2Prerelease(p, pOp); + pBt = db->aDb[pOp->p1].pBt; + newMax = 0; + if( pOp->p3 ){ + newMax = sqlite3BtreeLastPage(pBt); + if( newMax < (unsigned)pOp->p3 ) newMax = (unsigned)pOp->p3; + } + pOut->u.i = sqlite3BtreeMaxPageCount(pBt, newMax); + break; +} +#endif + +/* Opcode: Function P1 P2 P3 P4 * +** Synopsis: r[P3]=func(r[P2@NP]) +** +** Invoke a user function (P4 is a pointer to an sqlite3_context object that +** contains a pointer to the function to be run) with arguments taken +** from register P2 and successors. The number of arguments is in +** the sqlite3_context object that P4 points to. +** The result of the function is stored +** in register P3. Register P3 must not be one of the function inputs. +** +** P1 is a 32-bit bitmask indicating whether or not each argument to the +** function was determined to be constant at compile time. If the first +** argument was constant then bit 0 of P1 is set. This is used to determine +** whether meta data associated with a user function argument using the +** sqlite3_set_auxdata() API may be safely retained until the next +** invocation of this opcode. +** +** See also: AggStep, AggFinal, PureFunc +*/ +/* Opcode: PureFunc P1 P2 P3 P4 * +** Synopsis: r[P3]=func(r[P2@NP]) +** +** Invoke a user function (P4 is a pointer to an sqlite3_context object that +** contains a pointer to the function to be run) with arguments taken +** from register P2 and successors. The number of arguments is in +** the sqlite3_context object that P4 points to. +** The result of the function is stored +** in register P3. Register P3 must not be one of the function inputs. +** +** P1 is a 32-bit bitmask indicating whether or not each argument to the +** function was determined to be constant at compile time. If the first +** argument was constant then bit 0 of P1 is set. This is used to determine +** whether meta data associated with a user function argument using the +** sqlite3_set_auxdata() API may be safely retained until the next +** invocation of this opcode. +** +** This opcode works exactly like OP_Function. The only difference is in +** its name. This opcode is used in places where the function must be +** purely non-deterministic. Some built-in date/time functions can be +** either determinitic of non-deterministic, depending on their arguments. +** When those function are used in a non-deterministic way, they will check +** to see if they were called using OP_PureFunc instead of OP_Function, and +** if they were, they throw an error. +** +** See also: AggStep, AggFinal, Function +*/ +case OP_PureFunc: /* group */ +case OP_Function: { /* group */ + int i; + sqlite3_context *pCtx; + + assert( pOp->p4type==P4_FUNCCTX ); + pCtx = pOp->p4.pCtx; + + /* If this function is inside of a trigger, the register array in aMem[] + ** might change from one evaluation to the next. The next block of code + ** checks to see if the register array has changed, and if so it + ** reinitializes the relavant parts of the sqlite3_context object */ + pOut = &aMem[pOp->p3]; + if( pCtx->pOut != pOut ){ + pCtx->pVdbe = p; + pCtx->pOut = pOut; + for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; + } + assert( pCtx->pVdbe==p ); + + memAboutToChange(p, pOut); +#ifdef SQLITE_DEBUG + for(i=0; iargc; i++){ + assert( memIsValid(pCtx->argv[i]) ); + REGISTER_TRACE(pOp->p2+i, pCtx->argv[i]); + } +#endif + MemSetTypeFlag(pOut, MEM_Null); + assert( pCtx->isError==0 ); + (*pCtx->pFunc->xSFunc)(pCtx, pCtx->argc, pCtx->argv);/* IMP: R-24505-23230 */ + + /* If the function returned an error, throw an exception */ + if( pCtx->isError ){ + if( pCtx->isError>0 ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pOut)); + rc = pCtx->isError; + } + sqlite3VdbeDeleteAuxData(db, &p->pAuxData, pCtx->iOp, pOp->p1); + pCtx->isError = 0; + if( rc ) goto abort_due_to_error; + } + + /* Copy the result of the function into register P3 */ + if( pOut->flags & (MEM_Str|MEM_Blob) ){ + sqlite3VdbeChangeEncoding(pOut, encoding); + if( sqlite3VdbeMemTooBig(pOut) ) goto too_big; + } + + REGISTER_TRACE(pOp->p3, pOut); + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Trace P1 P2 * P4 * +** +** Write P4 on the statement trace output if statement tracing is +** enabled. +** +** Operand P1 must be 0x7fffffff and P2 must positive. +*/ +/* Opcode: Init P1 P2 P3 P4 * +** Synopsis: Start at P2 +** +** Programs contain a single instance of this opcode as the very first +** opcode. +** +** If tracing is enabled (by the sqlite3_trace()) interface, then +** the UTF-8 string contained in P4 is emitted on the trace callback. +** Or if P4 is blank, use the string returned by sqlite3_sql(). +** +** If P2 is not zero, jump to instruction P2. +** +** Increment the value of P1 so that OP_Once opcodes will jump the +** first time they are evaluated for this run. +** +** If P3 is not zero, then it is an address to jump to if an SQLITE_CORRUPT +** error is encountered. +*/ +case OP_Trace: +case OP_Init: { /* jump */ + int i; +#ifndef SQLITE_OMIT_TRACE + char *zTrace; +#endif + + /* If the P4 argument is not NULL, then it must be an SQL comment string. + ** The "--" string is broken up to prevent false-positives with srcck1.c. + ** + ** This assert() provides evidence for: + ** EVIDENCE-OF: R-50676-09860 The callback can compute the same text that + ** would have been returned by the legacy sqlite3_trace() interface by + ** using the X argument when X begins with "--" and invoking + ** sqlite3_expanded_sql(P) otherwise. + */ + assert( pOp->p4.z==0 || strncmp(pOp->p4.z, "-" "- ", 3)==0 ); + + /* OP_Init is always instruction 0 */ + assert( pOp==p->aOp || pOp->opcode==OP_Trace ); + +#ifndef SQLITE_OMIT_TRACE + if( (db->mTrace & (SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY))!=0 + && !p->doingRerun + && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 + ){ +#ifndef SQLITE_OMIT_DEPRECATED + if( db->mTrace & SQLITE_TRACE_LEGACY ){ + void (*x)(void*,const char*) = (void(*)(void*,const char*))db->xTrace; + char *z = sqlite3VdbeExpandSql(p, zTrace); + x(db->pTraceArg, z); + sqlite3_free(z); + }else +#endif + if( db->nVdbeExec>1 ){ + char *z = sqlite3MPrintf(db, "-- %s", zTrace); + (void)db->xTrace(SQLITE_TRACE_STMT, db->pTraceArg, p, z); + sqlite3DbFree(db, z); + }else{ + (void)db->xTrace(SQLITE_TRACE_STMT, db->pTraceArg, p, zTrace); + } + } +#ifdef SQLITE_USE_FCNTL_TRACE + zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); + if( zTrace ){ + int j; + for(j=0; jnDb; j++){ + if( DbMaskTest(p->btreeMask, j)==0 ) continue; + sqlite3_file_control(db, db->aDb[j].zDbSName, SQLITE_FCNTL_TRACE, zTrace); + } + } +#endif /* SQLITE_USE_FCNTL_TRACE */ +#ifdef SQLITE_DEBUG + if( (db->flags & SQLITE_SqlTrace)!=0 + && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 + ){ + sqlite3DebugPrintf("SQL-trace: %s\n", zTrace); + } +#endif /* SQLITE_DEBUG */ +#endif /* SQLITE_OMIT_TRACE */ + assert( pOp->p2>0 ); + if( pOp->p1>=sqlite3GlobalConfig.iOnceResetThreshold ){ + if( pOp->opcode==OP_Trace ) break; + for(i=1; inOp; i++){ + if( p->aOp[i].opcode==OP_Once ) p->aOp[i].p1 = 0; + } + pOp->p1 = 0; + } + pOp->p1++; + p->aCounter[SQLITE_STMTSTATUS_RUN]++; + goto jump_to_p2; +} + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* Opcode: CursorHint P1 * * P4 * +** +** Provide a hint to cursor P1 that it only needs to return rows that +** satisfy the Expr in P4. TK_REGISTER terms in the P4 expression refer +** to values currently held in registers. TK_COLUMN terms in the P4 +** expression refer to columns in the b-tree to which cursor P1 is pointing. +*/ +case OP_CursorHint: { + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p4type==P4_EXPR ); + pC = p->apCsr[pOp->p1]; + if( pC ){ + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorHint(pC->uc.pCursor, BTREE_HINT_RANGE, + pOp->p4.pExpr, aMem); + } + break; +} +#endif /* SQLITE_ENABLE_CURSOR_HINTS */ + +#ifdef SQLITE_DEBUG +/* Opcode: Abortable * * * * * +** +** Verify that an Abort can happen. Assert if an Abort at this point +** might cause database corruption. This opcode only appears in debugging +** builds. +** +** An Abort is safe if either there have been no writes, or if there is +** an active statement journal. +*/ +case OP_Abortable: { + sqlite3VdbeAssertAbortable(p); + break; +} +#endif + +#ifdef SQLITE_DEBUG +/* Opcode: ReleaseReg P1 P2 P3 * P5 +** Synopsis: release r[P1@P2] mask P3 +** +** Release registers from service. Any content that was in the +** the registers is unreliable after this opcode completes. +** +** The registers released will be the P2 registers starting at P1, +** except if bit ii of P3 set, then do not release register P1+ii. +** In other words, P3 is a mask of registers to preserve. +** +** Releasing a register clears the Mem.pScopyFrom pointer. That means +** that if the content of the released register was set using OP_SCopy, +** a change to the value of the source register for the OP_SCopy will no longer +** generate an assertion fault in sqlite3VdbeMemAboutToChange(). +** +** If P5 is set, then all released registers have their type set +** to MEM_Undefined so that any subsequent attempt to read the released +** register (before it is reinitialized) will generate an assertion fault. +** +** P5 ought to be set on every call to this opcode. +** However, there are places in the code generator will release registers +** before their are used, under the (valid) assumption that the registers +** will not be reallocated for some other purpose before they are used and +** hence are safe to release. +** +** This opcode is only available in testing and debugging builds. It is +** not generated for release builds. The purpose of this opcode is to help +** validate the generated bytecode. This opcode does not actually contribute +** to computing an answer. +*/ +case OP_ReleaseReg: { + Mem *pMem; + int i; + u32 constMask; + assert( pOp->p1>0 ); + assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); + pMem = &aMem[pOp->p1]; + constMask = pOp->p3; + for(i=0; ip2; i++, pMem++){ + if( i>=32 || (constMask & MASKBIT32(i))==0 ){ + pMem->pScopyFrom = 0; + if( i<32 && pOp->p5 ) MemSetTypeFlag(pMem, MEM_Undefined); + } + } + break; +} +#endif + +/* Opcode: Noop * * * * * +** +** Do nothing. This instruction is often useful as a jump +** destination. +*/ +/* +** The magic Explain opcode are only inserted when explain==2 (which +** is to say when the EXPLAIN QUERY PLAN syntax is used.) +** This opcode records information from the optimizer. It is the +** the same as a no-op. This opcodesnever appears in a real VM program. +*/ +default: { /* This is really OP_Noop, OP_Explain */ + assert( pOp->opcode==OP_Noop || pOp->opcode==OP_Explain ); + + break; +} + +/***************************************************************************** +** The cases of the switch statement above this line should all be indented +** by 6 spaces. But the left-most 6 spaces have been removed to improve the +** readability. From this point on down, the normal indentation rules are +** restored. +*****************************************************************************/ + } + +#ifdef VDBE_PROFILE + { + u64 endTime = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime(); + if( endTime>start ) pOrigOp->cycles += endTime - start; + pOrigOp->cnt++; + } +#endif + + /* The following code adds nothing to the actual functionality + ** of the program. It is only here for testing and debugging. + ** On the other hand, it does burn CPU cycles every time through + ** the evaluator loop. So we can leave it out when NDEBUG is defined. + */ +#ifndef NDEBUG + assert( pOp>=&aOp[-1] && pOp<&aOp[p->nOp-1] ); + +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeTrace ){ + u8 opProperty = sqlite3OpcodeProperty[pOrigOp->opcode]; + if( rc!=0 ) printf("rc=%d\n",rc); + if( opProperty & (OPFLG_OUT2) ){ + registerTrace(pOrigOp->p2, &aMem[pOrigOp->p2]); + } + if( opProperty & OPFLG_OUT3 ){ + registerTrace(pOrigOp->p3, &aMem[pOrigOp->p3]); + } + if( opProperty==0xff ){ + /* Never happens. This code exists to avoid a harmless linkage + ** warning aboud sqlite3VdbeRegisterDump() being defined but not + ** used. */ + sqlite3VdbeRegisterDump(p); + } + } +#endif /* SQLITE_DEBUG */ +#endif /* NDEBUG */ + } /* The end of the for(;;) loop the loops through opcodes */ + + /* If we reach this point, it means that execution is finished with + ** an error of some kind. + */ +abort_due_to_error: + if( db->mallocFailed ) rc = SQLITE_NOMEM_BKPT; + assert( rc ); + if( p->zErrMsg==0 && rc!=SQLITE_IOERR_NOMEM ){ + sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); + } + p->rc = rc; + sqlite3SystemError(db, rc); + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(rc, "statement aborts at %d: [%s] %s", + (int)(pOp - aOp), p->zSql, p->zErrMsg); + sqlite3VdbeHalt(p); + if( rc==SQLITE_IOERR_NOMEM ) sqlite3OomFault(db); + rc = SQLITE_ERROR; + if( resetSchemaOnFault>0 ){ + sqlite3ResetOneSchema(db, resetSchemaOnFault-1); + } + + /* This is the only way out of this procedure. We have to + ** release the mutexes on btrees that were acquired at the + ** top. */ +vdbe_return: +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + nProgressLimit += db->nProgressOps; + if( db->xProgress(db->pProgressArg) ){ + nProgressLimit = 0xffffffff; + rc = SQLITE_INTERRUPT; + goto abort_due_to_error; + } + } +#endif + p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep; + sqlite3VdbeLeave(p); + assert( rc!=SQLITE_OK || nExtraDelete==0 + || sqlite3_strlike("DELETE%",p->zSql,0)!=0 + ); + return rc; + + /* Jump to here if a string or blob larger than SQLITE_MAX_LENGTH + ** is encountered. + */ +too_big: + sqlite3VdbeError(p, "string or blob too big"); + rc = SQLITE_TOOBIG; + goto abort_due_to_error; + + /* Jump to here if a malloc() fails. + */ +no_mem: + sqlite3OomFault(db); + sqlite3VdbeError(p, "out of memory"); + rc = SQLITE_NOMEM_BKPT; + goto abort_due_to_error; + + /* Jump to here if the sqlite3_interrupt() API sets the interrupt + ** flag. + */ +abort_due_to_interrupt: + assert( AtomicLoad(&db->u1.isInterrupted) ); + rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; + p->rc = rc; + sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); + goto abort_due_to_error; +} + + +/************** End of vdbe.c ************************************************/ +/************** Begin file vdbeblob.c ****************************************/ +/* +** 2007 May 1 +** +** 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 code used to implement incremental BLOB I/O. +*/ + +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#ifndef SQLITE_OMIT_INCRBLOB + +/* +** Valid sqlite3_blob* handles point to Incrblob structures. +*/ +typedef struct Incrblob Incrblob; +struct Incrblob { + int nByte; /* Size of open blob, in bytes */ + int iOffset; /* Byte offset of blob in cursor data */ + u16 iCol; /* Table column this handle is open on */ + BtCursor *pCsr; /* Cursor pointing at blob row */ + sqlite3_stmt *pStmt; /* Statement holding cursor open */ + sqlite3 *db; /* The associated database */ + char *zDb; /* Database name */ + Table *pTab; /* Table object */ +}; + + +/* +** This function is used by both blob_open() and blob_reopen(). It seeks +** the b-tree cursor associated with blob handle p to point to row iRow. +** If successful, SQLITE_OK is returned and subsequent calls to +** sqlite3_blob_read() or sqlite3_blob_write() access the specified row. +** +** If an error occurs, or if the specified row does not exist or does not +** contain a value of type TEXT or BLOB in the column nominated when the +** blob handle was opened, then an error code is returned and *pzErr may +** be set to point to a buffer containing an error message. It is the +** responsibility of the caller to free the error message buffer using +** sqlite3DbFree(). +** +** If an error does occur, then the b-tree cursor is closed. All subsequent +** calls to sqlite3_blob_read(), blob_write() or blob_reopen() will +** immediately return SQLITE_ABORT. +*/ +static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ + int rc; /* Error code */ + char *zErr = 0; /* Error message */ + Vdbe *v = (Vdbe *)p->pStmt; + + /* Set the value of register r[1] in the SQL statement to integer iRow. + ** This is done directly as a performance optimization + */ + v->aMem[1].flags = MEM_Int; + v->aMem[1].u.i = iRow; + + /* If the statement has been run before (and is paused at the OP_ResultRow) + ** then back it up to the point where it does the OP_NotExists. This could + ** have been down with an extra OP_Goto, but simply setting the program + ** counter is faster. */ + if( v->pc>4 ){ + v->pc = 4; + assert( v->aOp[v->pc].opcode==OP_NotExists ); + rc = sqlite3VdbeExec(v); + }else{ + rc = sqlite3_step(p->pStmt); + } + if( rc==SQLITE_ROW ){ + VdbeCursor *pC = v->apCsr[0]; + u32 type = pC->nHdrParsed>p->iCol ? pC->aType[p->iCol] : 0; + testcase( pC->nHdrParsed==p->iCol ); + testcase( pC->nHdrParsed==p->iCol+1 ); + if( type<12 ){ + zErr = sqlite3MPrintf(p->db, "cannot open value of type %s", + type==0?"null": type==7?"real": "integer" + ); + rc = SQLITE_ERROR; + sqlite3_finalize(p->pStmt); + p->pStmt = 0; + }else{ + p->iOffset = pC->aType[p->iCol + pC->nField]; + p->nByte = sqlite3VdbeSerialTypeLen(type); + p->pCsr = pC->uc.pCursor; + sqlite3BtreeIncrblobCursor(p->pCsr); + } + } + + if( rc==SQLITE_ROW ){ + rc = SQLITE_OK; + }else if( p->pStmt ){ + rc = sqlite3_finalize(p->pStmt); + p->pStmt = 0; + if( rc==SQLITE_OK ){ + zErr = sqlite3MPrintf(p->db, "no such rowid: %lld", iRow); + rc = SQLITE_ERROR; + }else{ + zErr = sqlite3MPrintf(p->db, "%s", sqlite3_errmsg(p->db)); + } + } + + assert( rc!=SQLITE_OK || zErr==0 ); + assert( rc!=SQLITE_ROW && rc!=SQLITE_DONE ); + + *pzErr = zErr; + return rc; +} + +/* +** Open a blob handle. +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3* db, /* The database connection */ + const char *zDb, /* The attached database containing the blob */ + const char *zTable, /* The table containing the blob */ + const char *zColumn, /* The column containing the blob */ + sqlite_int64 iRow, /* The row containing the glob */ + int wrFlag, /* True -> read/write access, false -> read-only */ + sqlite3_blob **ppBlob /* Handle for accessing the blob returned here */ +){ + int nAttempt = 0; + int iCol; /* Index of zColumn in row-record */ + int rc = SQLITE_OK; + char *zErr = 0; + Table *pTab; + Incrblob *pBlob = 0; + Parse sParse; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppBlob==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + *ppBlob = 0; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zTable==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + wrFlag = !!wrFlag; /* wrFlag = (wrFlag ? 1 : 0); */ + + sqlite3_mutex_enter(db->mutex); + + pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob)); + do { + memset(&sParse, 0, sizeof(Parse)); + if( !pBlob ) goto blob_open_out; + sParse.db = db; + sqlite3DbFree(db, zErr); + zErr = 0; + + sqlite3BtreeEnterAll(db); + pTab = sqlite3LocateTable(&sParse, 0, zTable, zDb); + if( pTab && IsVirtual(pTab) ){ + pTab = 0; + sqlite3ErrorMsg(&sParse, "cannot open virtual table: %s", zTable); + } + if( pTab && !HasRowid(pTab) ){ + pTab = 0; + sqlite3ErrorMsg(&sParse, "cannot open table without rowid: %s", zTable); + } +#ifndef SQLITE_OMIT_VIEW + if( pTab && pTab->pSelect ){ + pTab = 0; + sqlite3ErrorMsg(&sParse, "cannot open view: %s", zTable); + } +#endif + if( !pTab ){ + if( sParse.zErrMsg ){ + sqlite3DbFree(db, zErr); + zErr = sParse.zErrMsg; + sParse.zErrMsg = 0; + } + rc = SQLITE_ERROR; + sqlite3BtreeLeaveAll(db); + goto blob_open_out; + } + pBlob->pTab = pTab; + pBlob->zDb = db->aDb[sqlite3SchemaToIndex(db, pTab->pSchema)].zDbSName; + + /* Now search pTab for the exact column. */ + for(iCol=0; iColnCol; iCol++) { + if( sqlite3StrICmp(pTab->aCol[iCol].zName, zColumn)==0 ){ + break; + } + } + if( iCol==pTab->nCol ){ + sqlite3DbFree(db, zErr); + zErr = sqlite3MPrintf(db, "no such column: \"%s\"", zColumn); + rc = SQLITE_ERROR; + sqlite3BtreeLeaveAll(db); + goto blob_open_out; + } + + /* If the value is being opened for writing, check that the + ** column is not indexed, and that it is not part of a foreign key. + */ + if( wrFlag ){ + const char *zFault = 0; + Index *pIdx; +#ifndef SQLITE_OMIT_FOREIGN_KEY + if( db->flags&SQLITE_ForeignKeys ){ + /* Check that the column is not part of an FK child key definition. It + ** is not necessary to check if it is part of a parent key, as parent + ** key columns must be indexed. The check below will pick up this + ** case. */ + FKey *pFKey; + for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + int j; + for(j=0; jnCol; j++){ + if( pFKey->aCol[j].iFrom==iCol ){ + zFault = "foreign key"; + } + } + } + } +#endif + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int j; + for(j=0; jnKeyCol; j++){ + /* FIXME: Be smarter about indexes that use expressions */ + if( pIdx->aiColumn[j]==iCol || pIdx->aiColumn[j]==XN_EXPR ){ + zFault = "indexed"; + } + } + } + if( zFault ){ + sqlite3DbFree(db, zErr); + zErr = sqlite3MPrintf(db, "cannot open %s column for writing", zFault); + rc = SQLITE_ERROR; + sqlite3BtreeLeaveAll(db); + goto blob_open_out; + } + } + + pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(&sParse); + assert( pBlob->pStmt || db->mallocFailed ); + if( pBlob->pStmt ){ + + /* This VDBE program seeks a btree cursor to the identified + ** db/table/row entry. The reason for using a vdbe program instead + ** of writing code to use the b-tree layer directly is that the + ** vdbe program will take advantage of the various transaction, + ** locking and error handling infrastructure built into the vdbe. + ** + ** After seeking the cursor, the vdbe executes an OP_ResultRow. + ** Code external to the Vdbe then "borrows" the b-tree cursor and + ** uses it to implement the blob_read(), blob_write() and + ** blob_bytes() functions. + ** + ** The sqlite3_blob_close() function finalizes the vdbe program, + ** which closes the b-tree cursor and (possibly) commits the + ** transaction. + */ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList openBlob[] = { + {OP_TableLock, 0, 0, 0}, /* 0: Acquire a read or write lock */ + {OP_OpenRead, 0, 0, 0}, /* 1: Open a cursor */ + /* blobSeekToRow() will initialize r[1] to the desired rowid */ + {OP_NotExists, 0, 5, 1}, /* 2: Seek the cursor to rowid=r[1] */ + {OP_Column, 0, 0, 1}, /* 3 */ + {OP_ResultRow, 1, 0, 0}, /* 4 */ + {OP_Halt, 0, 0, 0}, /* 5 */ + }; + Vdbe *v = (Vdbe *)pBlob->pStmt; + int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + VdbeOp *aOp; + + sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, wrFlag, + pTab->pSchema->schema_cookie, + pTab->pSchema->iGeneration); + sqlite3VdbeChangeP5(v, 1); + assert( sqlite3VdbeCurrentAddr(v)==2 || db->mallocFailed ); + aOp = sqlite3VdbeAddOpList(v, ArraySize(openBlob), openBlob, iLn); + + /* Make sure a mutex is held on the table to be accessed */ + sqlite3VdbeUsesBtree(v, iDb); + + if( db->mallocFailed==0 ){ + assert( aOp!=0 ); + /* Configure the OP_TableLock instruction */ +#ifdef SQLITE_OMIT_SHARED_CACHE + aOp[0].opcode = OP_Noop; +#else + aOp[0].p1 = iDb; + aOp[0].p2 = pTab->tnum; + aOp[0].p3 = wrFlag; + sqlite3VdbeChangeP4(v, 2, pTab->zName, P4_TRANSIENT); + } + if( db->mallocFailed==0 ){ +#endif + + /* Remove either the OP_OpenWrite or OpenRead. Set the P2 + ** parameter of the other to pTab->tnum. */ + if( wrFlag ) aOp[1].opcode = OP_OpenWrite; + aOp[1].p2 = pTab->tnum; + aOp[1].p3 = iDb; + + /* Configure the number of columns. Configure the cursor to + ** think that the table has one more column than it really + ** does. An OP_Column to retrieve this imaginary column will + ** always return an SQL NULL. This is useful because it means + ** we can invoke OP_Column to fill in the vdbe cursors type + ** and offset cache without causing any IO. + */ + aOp[1].p4type = P4_INT32; + aOp[1].p4.i = pTab->nCol+1; + aOp[3].p2 = pTab->nCol; + + sParse.nVar = 0; + sParse.nMem = 1; + sParse.nTab = 1; + sqlite3VdbeMakeReady(v, &sParse); + } + } + + pBlob->iCol = iCol; + pBlob->db = db; + sqlite3BtreeLeaveAll(db); + if( db->mallocFailed ){ + goto blob_open_out; + } + rc = blobSeekToRow(pBlob, iRow, &zErr); + } while( (++nAttempt)mallocFailed==0 ){ + *ppBlob = (sqlite3_blob *)pBlob; + }else{ + if( pBlob && pBlob->pStmt ) sqlite3VdbeFinalize((Vdbe *)pBlob->pStmt); + sqlite3DbFree(db, pBlob); + } + sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); + sqlite3DbFree(db, zErr); + sqlite3ParserReset(&sParse); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Close a blob handle that was previously created using +** sqlite3_blob_open(). +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *pBlob){ + Incrblob *p = (Incrblob *)pBlob; + int rc; + sqlite3 *db; + + if( p ){ + sqlite3_stmt *pStmt = p->pStmt; + db = p->db; + sqlite3_mutex_enter(db->mutex); + sqlite3DbFree(db, p); + sqlite3_mutex_leave(db->mutex); + rc = sqlite3_finalize(pStmt); + }else{ + rc = SQLITE_OK; + } + return rc; +} + +/* +** Perform a read or write operation on a blob +*/ +static int blobReadWrite( + sqlite3_blob *pBlob, + void *z, + int n, + int iOffset, + int (*xCall)(BtCursor*, u32, u32, void*) +){ + int rc; + Incrblob *p = (Incrblob *)pBlob; + Vdbe *v; + sqlite3 *db; + + if( p==0 ) return SQLITE_MISUSE_BKPT; + db = p->db; + sqlite3_mutex_enter(db->mutex); + v = (Vdbe*)p->pStmt; + + if( n<0 || iOffset<0 || ((sqlite3_int64)iOffset+n)>p->nByte ){ + /* Request is out of range. Return a transient error. */ + rc = SQLITE_ERROR; + }else if( v==0 ){ + /* If there is no statement handle, then the blob-handle has + ** already been invalidated. Return SQLITE_ABORT in this case. + */ + rc = SQLITE_ABORT; + }else{ + /* Call either BtreeData() or BtreePutData(). If SQLITE_ABORT is + ** returned, clean-up the statement handle. + */ + assert( db == v->db ); + sqlite3BtreeEnterCursor(p->pCsr); + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( xCall==sqlite3BtreePutData && db->xPreUpdateCallback ){ + /* If a pre-update hook is registered and this is a write cursor, + ** invoke it here. + ** + ** TODO: The preupdate-hook is passed SQLITE_DELETE, even though this + ** operation should really be an SQLITE_UPDATE. This is probably + ** incorrect, but is convenient because at this point the new.* values + ** are not easily obtainable. And for the sessions module, an + ** SQLITE_UPDATE where the PK columns do not change is handled in the + ** same way as an SQLITE_DELETE (the SQLITE_DELETE code is actually + ** slightly more efficient). Since you cannot write to a PK column + ** using the incremental-blob API, this works. For the sessions module + ** anyhow. + */ + sqlite3_int64 iKey; + iKey = sqlite3BtreeIntegerKey(p->pCsr); + sqlite3VdbePreUpdateHook( + v, v->apCsr[0], SQLITE_DELETE, p->zDb, p->pTab, iKey, -1 + ); + } +#endif + + rc = xCall(p->pCsr, iOffset+p->iOffset, n, z); + sqlite3BtreeLeaveCursor(p->pCsr); + if( rc==SQLITE_ABORT ){ + sqlite3VdbeFinalize(v); + p->pStmt = 0; + }else{ + v->rc = rc; + } + } + sqlite3Error(db, rc); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Read data from a blob handle. +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *pBlob, void *z, int n, int iOffset){ + return blobReadWrite(pBlob, z, n, iOffset, sqlite3BtreePayloadChecked); +} + +/* +** Write data to a blob handle. +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *pBlob, const void *z, int n, int iOffset){ + return blobReadWrite(pBlob, (void *)z, n, iOffset, sqlite3BtreePutData); +} + +/* +** Query a blob handle for the size of the data. +** +** The Incrblob.nByte field is fixed for the lifetime of the Incrblob +** so no mutex is required for access. +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){ + Incrblob *p = (Incrblob *)pBlob; + return (p && p->pStmt) ? p->nByte : 0; +} + +/* +** Move an existing blob handle to point to a different row of the same +** database table. +** +** If an error occurs, or if the specified row does not exist or does not +** contain a blob or text value, then an error code is returned and the +** database handle error code and message set. If this happens, then all +** subsequent calls to sqlite3_blob_xxx() functions (except blob_close()) +** immediately return SQLITE_ABORT. +*/ +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ + int rc; + Incrblob *p = (Incrblob *)pBlob; + sqlite3 *db; + + if( p==0 ) return SQLITE_MISUSE_BKPT; + db = p->db; + sqlite3_mutex_enter(db->mutex); + + if( p->pStmt==0 ){ + /* If there is no statement handle, then the blob-handle has + ** already been invalidated. Return SQLITE_ABORT in this case. + */ + rc = SQLITE_ABORT; + }else{ + char *zErr; + rc = blobSeekToRow(p, iRow, &zErr); + if( rc!=SQLITE_OK ){ + sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); + sqlite3DbFree(db, zErr); + } + assert( rc!=SQLITE_SCHEMA ); + } + + rc = sqlite3ApiExit(db, rc); + assert( rc==SQLITE_OK || p->pStmt==0 ); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#endif /* #ifndef SQLITE_OMIT_INCRBLOB */ + +/************** End of vdbeblob.c ********************************************/ +/************** Begin file vdbesort.c ****************************************/ +/* +** 2011-07-09 +** +** 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 code for the VdbeSorter object, used in concert with +** a VdbeCursor to sort large numbers of keys for CREATE INDEX statements +** or by SELECT statements with ORDER BY clauses that cannot be satisfied +** using indexes and without LIMIT clauses. +** +** The VdbeSorter object implements a multi-threaded external merge sort +** algorithm that is efficient even if the number of elements being sorted +** exceeds the available memory. +** +** Here is the (internal, non-API) interface between this module and the +** rest of the SQLite system: +** +** sqlite3VdbeSorterInit() Create a new VdbeSorter object. +** +** sqlite3VdbeSorterWrite() Add a single new row to the VdbeSorter +** object. The row is a binary blob in the +** OP_MakeRecord format that contains both +** the ORDER BY key columns and result columns +** in the case of a SELECT w/ ORDER BY, or +** the complete record for an index entry +** in the case of a CREATE INDEX. +** +** sqlite3VdbeSorterRewind() Sort all content previously added. +** Position the read cursor on the +** first sorted element. +** +** sqlite3VdbeSorterNext() Advance the read cursor to the next sorted +** element. +** +** sqlite3VdbeSorterRowkey() Return the complete binary blob for the +** row currently under the read cursor. +** +** sqlite3VdbeSorterCompare() Compare the binary blob for the row +** currently under the read cursor against +** another binary blob X and report if +** X is strictly less than the read cursor. +** Used to enforce uniqueness in a +** CREATE UNIQUE INDEX statement. +** +** sqlite3VdbeSorterClose() Close the VdbeSorter object and reclaim +** all resources. +** +** sqlite3VdbeSorterReset() Refurbish the VdbeSorter for reuse. This +** is like Close() followed by Init() only +** much faster. +** +** The interfaces above must be called in a particular order. Write() can +** only occur in between Init()/Reset() and Rewind(). Next(), Rowkey(), and +** Compare() can only occur in between Rewind() and Close()/Reset(). i.e. +** +** Init() +** for each record: Write() +** Rewind() +** Rowkey()/Compare() +** Next() +** Close() +** +** Algorithm: +** +** Records passed to the sorter via calls to Write() are initially held +** unsorted in main memory. Assuming the amount of memory used never exceeds +** a threshold, when Rewind() is called the set of records is sorted using +** an in-memory merge sort. In this case, no temporary files are required +** and subsequent calls to Rowkey(), Next() and Compare() read records +** directly from main memory. +** +** If the amount of space used to store records in main memory exceeds the +** threshold, then the set of records currently in memory are sorted and +** written to a temporary file in "Packed Memory Array" (PMA) format. +** A PMA created at this point is known as a "level-0 PMA". Higher levels +** of PMAs may be created by merging existing PMAs together - for example +** merging two or more level-0 PMAs together creates a level-1 PMA. +** +** The threshold for the amount of main memory to use before flushing +** records to a PMA is roughly the same as the limit configured for the +** page-cache of the main database. Specifically, the threshold is set to +** the value returned by "PRAGMA main.page_size" multipled by +** that returned by "PRAGMA main.cache_size", in bytes. +** +** If the sorter is running in single-threaded mode, then all PMAs generated +** are appended to a single temporary file. Or, if the sorter is running in +** multi-threaded mode then up to (N+1) temporary files may be opened, where +** N is the configured number of worker threads. In this case, instead of +** sorting the records and writing the PMA to a temporary file itself, the +** calling thread usually launches a worker thread to do so. Except, if +** there are already N worker threads running, the main thread does the work +** itself. +** +** The sorter is running in multi-threaded mode if (a) the library was built +** with pre-processor symbol SQLITE_MAX_WORKER_THREADS set to a value greater +** than zero, and (b) worker threads have been enabled at runtime by calling +** "PRAGMA threads=N" with some value of N greater than 0. +** +** When Rewind() is called, any data remaining in memory is flushed to a +** final PMA. So at this point the data is stored in some number of sorted +** PMAs within temporary files on disk. +** +** If there are fewer than SORTER_MAX_MERGE_COUNT PMAs in total and the +** sorter is running in single-threaded mode, then these PMAs are merged +** incrementally as keys are retreived from the sorter by the VDBE. The +** MergeEngine object, described in further detail below, performs this +** merge. +** +** Or, if running in multi-threaded mode, then a background thread is +** launched to merge the existing PMAs. Once the background thread has +** merged T bytes of data into a single sorted PMA, the main thread +** begins reading keys from that PMA while the background thread proceeds +** with merging the next T bytes of data. And so on. +** +** Parameter T is set to half the value of the memory threshold used +** by Write() above to determine when to create a new PMA. +** +** If there are more than SORTER_MAX_MERGE_COUNT PMAs in total when +** Rewind() is called, then a hierarchy of incremental-merges is used. +** First, T bytes of data from the first SORTER_MAX_MERGE_COUNT PMAs on +** disk are merged together. Then T bytes of data from the second set, and +** so on, such that no operation ever merges more than SORTER_MAX_MERGE_COUNT +** PMAs at a time. This done is to improve locality. +** +** If running in multi-threaded mode and there are more than +** SORTER_MAX_MERGE_COUNT PMAs on disk when Rewind() is called, then more +** than one background thread may be created. Specifically, there may be +** one background thread for each temporary file on disk, and one background +** thread to merge the output of each of the others to a single PMA for +** the main thread to read from. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* +** If SQLITE_DEBUG_SORTER_THREADS is defined, this module outputs various +** messages to stderr that may be helpful in understanding the performance +** characteristics of the sorter in multi-threaded mode. +*/ +#if 0 +# define SQLITE_DEBUG_SORTER_THREADS 1 +#endif + +/* +** Hard-coded maximum amount of data to accumulate in memory before flushing +** to a level 0 PMA. The purpose of this limit is to prevent various integer +** overflows. 512MiB. +*/ +#define SQLITE_MAX_PMASZ (1<<29) + +/* +** Private objects used by the sorter +*/ +typedef struct MergeEngine MergeEngine; /* Merge PMAs together */ +typedef struct PmaReader PmaReader; /* Incrementally read one PMA */ +typedef struct PmaWriter PmaWriter; /* Incrementally write one PMA */ +typedef struct SorterRecord SorterRecord; /* A record being sorted */ +typedef struct SortSubtask SortSubtask; /* A sub-task in the sort process */ +typedef struct SorterFile SorterFile; /* Temporary file object wrapper */ +typedef struct SorterList SorterList; /* In-memory list of records */ +typedef struct IncrMerger IncrMerger; /* Read & merge multiple PMAs */ + +/* +** A container for a temp file handle and the current amount of data +** stored in the file. +*/ +struct SorterFile { + sqlite3_file *pFd; /* File handle */ + i64 iEof; /* Bytes of data stored in pFd */ +}; + +/* +** An in-memory list of objects to be sorted. +** +** If aMemory==0 then each object is allocated separately and the objects +** are connected using SorterRecord.u.pNext. If aMemory!=0 then all objects +** are stored in the aMemory[] bulk memory, one right after the other, and +** are connected using SorterRecord.u.iNext. +*/ +struct SorterList { + SorterRecord *pList; /* Linked list of records */ + u8 *aMemory; /* If non-NULL, bulk memory to hold pList */ + int szPMA; /* Size of pList as PMA in bytes */ +}; + +/* +** The MergeEngine object is used to combine two or more smaller PMAs into +** one big PMA using a merge operation. Separate PMAs all need to be +** combined into one big PMA in order to be able to step through the sorted +** records in order. +** +** The aReadr[] array contains a PmaReader object for each of the PMAs being +** merged. An aReadr[] object either points to a valid key or else is at EOF. +** ("EOF" means "End Of File". When aReadr[] is at EOF there is no more data.) +** For the purposes of the paragraphs below, we assume that the array is +** actually N elements in size, where N is the smallest power of 2 greater +** to or equal to the number of PMAs being merged. The extra aReadr[] elements +** are treated as if they are empty (always at EOF). +** +** The aTree[] array is also N elements in size. The value of N is stored in +** the MergeEngine.nTree variable. +** +** The final (N/2) elements of aTree[] contain the results of comparing +** pairs of PMA keys together. Element i contains the result of +** comparing aReadr[2*i-N] and aReadr[2*i-N+1]. Whichever key is smaller, the +** aTree element is set to the index of it. +** +** For the purposes of this comparison, EOF is considered greater than any +** other key value. If the keys are equal (only possible with two EOF +** values), it doesn't matter which index is stored. +** +** The (N/4) elements of aTree[] that precede the final (N/2) described +** above contains the index of the smallest of each block of 4 PmaReaders +** And so on. So that aTree[1] contains the index of the PmaReader that +** currently points to the smallest key value. aTree[0] is unused. +** +** Example: +** +** aReadr[0] -> Banana +** aReadr[1] -> Feijoa +** aReadr[2] -> Elderberry +** aReadr[3] -> Currant +** aReadr[4] -> Grapefruit +** aReadr[5] -> Apple +** aReadr[6] -> Durian +** aReadr[7] -> EOF +** +** aTree[] = { X, 5 0, 5 0, 3, 5, 6 } +** +** The current element is "Apple" (the value of the key indicated by +** PmaReader 5). When the Next() operation is invoked, PmaReader 5 will +** be advanced to the next key in its segment. Say the next key is +** "Eggplant": +** +** aReadr[5] -> Eggplant +** +** The contents of aTree[] are updated first by comparing the new PmaReader +** 5 key to the current key of PmaReader 4 (still "Grapefruit"). The PmaReader +** 5 value is still smaller, so aTree[6] is set to 5. And so on up the tree. +** The value of PmaReader 6 - "Durian" - is now smaller than that of PmaReader +** 5, so aTree[3] is set to 6. Key 0 is smaller than key 6 (Bananafile2. And instead of using a +** background thread to prepare data for the PmaReader, with a single +** threaded IncrMerger the allocate part of pTask->file2 is "refilled" with +** keys from pMerger by the calling thread whenever the PmaReader runs out +** of data. +*/ +struct IncrMerger { + SortSubtask *pTask; /* Task that owns this merger */ + MergeEngine *pMerger; /* Merge engine thread reads data from */ + i64 iStartOff; /* Offset to start writing file at */ + int mxSz; /* Maximum bytes of data to store */ + int bEof; /* Set to true when merge is finished */ + int bUseThread; /* True to use a bg thread for this object */ + SorterFile aFile[2]; /* aFile[0] for reading, [1] for writing */ +}; + +/* +** An instance of this object is used for writing a PMA. +** +** The PMA is written one record at a time. Each record is of an arbitrary +** size. But I/O is more efficient if it occurs in page-sized blocks where +** each block is aligned on a page boundary. This object caches writes to +** the PMA so that aligned, page-size blocks are written. +*/ +struct PmaWriter { + int eFWErr; /* Non-zero if in an error state */ + u8 *aBuffer; /* Pointer to write buffer */ + int nBuffer; /* Size of write buffer in bytes */ + int iBufStart; /* First byte of buffer to write */ + int iBufEnd; /* Last byte of buffer to write */ + i64 iWriteOff; /* Offset of start of buffer in file */ + sqlite3_file *pFd; /* File handle to write to */ +}; + +/* +** This object is the header on a single record while that record is being +** held in memory and prior to being written out as part of a PMA. +** +** How the linked list is connected depends on how memory is being managed +** by this module. If using a separate allocation for each in-memory record +** (VdbeSorter.list.aMemory==0), then the list is always connected using the +** SorterRecord.u.pNext pointers. +** +** Or, if using the single large allocation method (VdbeSorter.list.aMemory!=0), +** then while records are being accumulated the list is linked using the +** SorterRecord.u.iNext offset. This is because the aMemory[] array may +** be sqlite3Realloc()ed while records are being accumulated. Once the VM +** has finished passing records to the sorter, or when the in-memory buffer +** is full, the list is sorted. As part of the sorting process, it is +** converted to use the SorterRecord.u.pNext pointers. See function +** vdbeSorterSort() for details. +*/ +struct SorterRecord { + int nVal; /* Size of the record in bytes */ + union { + SorterRecord *pNext; /* Pointer to next record in list */ + int iNext; /* Offset within aMemory of next record */ + } u; + /* The data for the record immediately follows this header */ +}; + +/* Return a pointer to the buffer containing the record data for SorterRecord +** object p. Should be used as if: +** +** void *SRVAL(SorterRecord *p) { return (void*)&p[1]; } +*/ +#define SRVAL(p) ((void*)((SorterRecord*)(p) + 1)) + + +/* Maximum number of PMAs that a single MergeEngine can merge */ +#define SORTER_MAX_MERGE_COUNT 16 + +static int vdbeIncrSwap(IncrMerger*); +static void vdbeIncrFree(IncrMerger *); + +/* +** Free all memory belonging to the PmaReader object passed as the +** argument. All structure fields are set to zero before returning. +*/ +static void vdbePmaReaderClear(PmaReader *pReadr){ + sqlite3_free(pReadr->aAlloc); + sqlite3_free(pReadr->aBuffer); + if( pReadr->aMap ) sqlite3OsUnfetch(pReadr->pFd, 0, pReadr->aMap); + vdbeIncrFree(pReadr->pIncr); + memset(pReadr, 0, sizeof(PmaReader)); +} + +/* +** Read the next nByte bytes of data from the PMA p. +** If successful, set *ppOut to point to a buffer containing the data +** and return SQLITE_OK. Otherwise, if an error occurs, return an SQLite +** error code. +** +** The buffer returned in *ppOut is only valid until the +** next call to this function. +*/ +static int vdbePmaReadBlob( + PmaReader *p, /* PmaReader from which to take the blob */ + int nByte, /* Bytes of data to read */ + u8 **ppOut /* OUT: Pointer to buffer containing data */ +){ + int iBuf; /* Offset within buffer to read from */ + int nAvail; /* Bytes of data available in buffer */ + + if( p->aMap ){ + *ppOut = &p->aMap[p->iReadOff]; + p->iReadOff += nByte; + return SQLITE_OK; + } + + assert( p->aBuffer ); + + /* If there is no more data to be read from the buffer, read the next + ** p->nBuffer bytes of data from the file into it. Or, if there are less + ** than p->nBuffer bytes remaining in the PMA, read all remaining data. */ + iBuf = p->iReadOff % p->nBuffer; + if( iBuf==0 ){ + int nRead; /* Bytes to read from disk */ + int rc; /* sqlite3OsRead() return code */ + + /* Determine how many bytes of data to read. */ + if( (p->iEof - p->iReadOff) > (i64)p->nBuffer ){ + nRead = p->nBuffer; + }else{ + nRead = (int)(p->iEof - p->iReadOff); + } + assert( nRead>0 ); + + /* Readr data from the file. Return early if an error occurs. */ + rc = sqlite3OsRead(p->pFd, p->aBuffer, nRead, p->iReadOff); + assert( rc!=SQLITE_IOERR_SHORT_READ ); + if( rc!=SQLITE_OK ) return rc; + } + nAvail = p->nBuffer - iBuf; + + if( nByte<=nAvail ){ + /* The requested data is available in the in-memory buffer. In this + ** case there is no need to make a copy of the data, just return a + ** pointer into the buffer to the caller. */ + *ppOut = &p->aBuffer[iBuf]; + p->iReadOff += nByte; + }else{ + /* The requested data is not all available in the in-memory buffer. + ** In this case, allocate space at p->aAlloc[] to copy the requested + ** range into. Then return a copy of pointer p->aAlloc to the caller. */ + int nRem; /* Bytes remaining to copy */ + + /* Extend the p->aAlloc[] allocation if required. */ + if( p->nAllocnAlloc); + while( nByte>nNew ) nNew = nNew*2; + aNew = sqlite3Realloc(p->aAlloc, nNew); + if( !aNew ) return SQLITE_NOMEM_BKPT; + p->nAlloc = nNew; + p->aAlloc = aNew; + } + + /* Copy as much data as is available in the buffer into the start of + ** p->aAlloc[]. */ + memcpy(p->aAlloc, &p->aBuffer[iBuf], nAvail); + p->iReadOff += nAvail; + nRem = nByte - nAvail; + + /* The following loop copies up to p->nBuffer bytes per iteration into + ** the p->aAlloc[] buffer. */ + while( nRem>0 ){ + int rc; /* vdbePmaReadBlob() return code */ + int nCopy; /* Number of bytes to copy */ + u8 *aNext; /* Pointer to buffer to copy data from */ + + nCopy = nRem; + if( nRem>p->nBuffer ) nCopy = p->nBuffer; + rc = vdbePmaReadBlob(p, nCopy, &aNext); + if( rc!=SQLITE_OK ) return rc; + assert( aNext!=p->aAlloc ); + memcpy(&p->aAlloc[nByte - nRem], aNext, nCopy); + nRem -= nCopy; + } + + *ppOut = p->aAlloc; + } + + return SQLITE_OK; +} + +/* +** Read a varint from the stream of data accessed by p. Set *pnOut to +** the value read. +*/ +static int vdbePmaReadVarint(PmaReader *p, u64 *pnOut){ + int iBuf; + + if( p->aMap ){ + p->iReadOff += sqlite3GetVarint(&p->aMap[p->iReadOff], pnOut); + }else{ + iBuf = p->iReadOff % p->nBuffer; + if( iBuf && (p->nBuffer-iBuf)>=9 ){ + p->iReadOff += sqlite3GetVarint(&p->aBuffer[iBuf], pnOut); + }else{ + u8 aVarint[16], *a; + int i = 0, rc; + do{ + rc = vdbePmaReadBlob(p, 1, &a); + if( rc ) return rc; + aVarint[(i++)&0xf] = a[0]; + }while( (a[0]&0x80)!=0 ); + sqlite3GetVarint(aVarint, pnOut); + } + } + + return SQLITE_OK; +} + +/* +** Attempt to memory map file pFile. If successful, set *pp to point to the +** new mapping and return SQLITE_OK. If the mapping is not attempted +** (because the file is too large or the VFS layer is configured not to use +** mmap), return SQLITE_OK and set *pp to NULL. +** +** Or, if an error occurs, return an SQLite error code. The final value of +** *pp is undefined in this case. +*/ +static int vdbeSorterMapFile(SortSubtask *pTask, SorterFile *pFile, u8 **pp){ + int rc = SQLITE_OK; + if( pFile->iEof<=(i64)(pTask->pSorter->db->nMaxSorterMmap) ){ + sqlite3_file *pFd = pFile->pFd; + if( pFd->pMethods->iVersion>=3 ){ + rc = sqlite3OsFetch(pFd, 0, (int)pFile->iEof, (void**)pp); + testcase( rc!=SQLITE_OK ); + } + } + return rc; +} + +/* +** Attach PmaReader pReadr to file pFile (if it is not already attached to +** that file) and seek it to offset iOff within the file. Return SQLITE_OK +** if successful, or an SQLite error code if an error occurs. +*/ +static int vdbePmaReaderSeek( + SortSubtask *pTask, /* Task context */ + PmaReader *pReadr, /* Reader whose cursor is to be moved */ + SorterFile *pFile, /* Sorter file to read from */ + i64 iOff /* Offset in pFile */ +){ + int rc = SQLITE_OK; + + assert( pReadr->pIncr==0 || pReadr->pIncr->bEof==0 ); + + if( sqlite3FaultSim(201) ) return SQLITE_IOERR_READ; + if( pReadr->aMap ){ + sqlite3OsUnfetch(pReadr->pFd, 0, pReadr->aMap); + pReadr->aMap = 0; + } + pReadr->iReadOff = iOff; + pReadr->iEof = pFile->iEof; + pReadr->pFd = pFile->pFd; + + rc = vdbeSorterMapFile(pTask, pFile, &pReadr->aMap); + if( rc==SQLITE_OK && pReadr->aMap==0 ){ + int pgsz = pTask->pSorter->pgsz; + int iBuf = pReadr->iReadOff % pgsz; + if( pReadr->aBuffer==0 ){ + pReadr->aBuffer = (u8*)sqlite3Malloc(pgsz); + if( pReadr->aBuffer==0 ) rc = SQLITE_NOMEM_BKPT; + pReadr->nBuffer = pgsz; + } + if( rc==SQLITE_OK && iBuf ){ + int nRead = pgsz - iBuf; + if( (pReadr->iReadOff + nRead) > pReadr->iEof ){ + nRead = (int)(pReadr->iEof - pReadr->iReadOff); + } + rc = sqlite3OsRead( + pReadr->pFd, &pReadr->aBuffer[iBuf], nRead, pReadr->iReadOff + ); + testcase( rc!=SQLITE_OK ); + } + } + + return rc; +} + +/* +** Advance PmaReader pReadr to the next key in its PMA. Return SQLITE_OK if +** no error occurs, or an SQLite error code if one does. +*/ +static int vdbePmaReaderNext(PmaReader *pReadr){ + int rc = SQLITE_OK; /* Return Code */ + u64 nRec = 0; /* Size of record in bytes */ + + + if( pReadr->iReadOff>=pReadr->iEof ){ + IncrMerger *pIncr = pReadr->pIncr; + int bEof = 1; + if( pIncr ){ + rc = vdbeIncrSwap(pIncr); + if( rc==SQLITE_OK && pIncr->bEof==0 ){ + rc = vdbePmaReaderSeek( + pIncr->pTask, pReadr, &pIncr->aFile[0], pIncr->iStartOff + ); + bEof = 0; + } + } + + if( bEof ){ + /* This is an EOF condition */ + vdbePmaReaderClear(pReadr); + testcase( rc!=SQLITE_OK ); + return rc; + } + } + + if( rc==SQLITE_OK ){ + rc = vdbePmaReadVarint(pReadr, &nRec); + } + if( rc==SQLITE_OK ){ + pReadr->nKey = (int)nRec; + rc = vdbePmaReadBlob(pReadr, (int)nRec, &pReadr->aKey); + testcase( rc!=SQLITE_OK ); + } + + return rc; +} + +/* +** Initialize PmaReader pReadr to scan through the PMA stored in file pFile +** starting at offset iStart and ending at offset iEof-1. This function +** leaves the PmaReader pointing to the first key in the PMA (or EOF if the +** PMA is empty). +** +** If the pnByte parameter is NULL, then it is assumed that the file +** contains a single PMA, and that that PMA omits the initial length varint. +*/ +static int vdbePmaReaderInit( + SortSubtask *pTask, /* Task context */ + SorterFile *pFile, /* Sorter file to read from */ + i64 iStart, /* Start offset in pFile */ + PmaReader *pReadr, /* PmaReader to populate */ + i64 *pnByte /* IN/OUT: Increment this value by PMA size */ +){ + int rc; + + assert( pFile->iEof>iStart ); + assert( pReadr->aAlloc==0 && pReadr->nAlloc==0 ); + assert( pReadr->aBuffer==0 ); + assert( pReadr->aMap==0 ); + + rc = vdbePmaReaderSeek(pTask, pReadr, pFile, iStart); + if( rc==SQLITE_OK ){ + u64 nByte = 0; /* Size of PMA in bytes */ + rc = vdbePmaReadVarint(pReadr, &nByte); + pReadr->iEof = pReadr->iReadOff + nByte; + *pnByte += nByte; + } + + if( rc==SQLITE_OK ){ + rc = vdbePmaReaderNext(pReadr); + } + return rc; +} + +/* +** A version of vdbeSorterCompare() that assumes that it has already been +** determined that the first field of key1 is equal to the first field of +** key2. +*/ +static int vdbeSorterCompareTail( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + UnpackedRecord *r2 = pTask->pUnpacked; + if( *pbKey2Cached==0 ){ + sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); + *pbKey2Cached = 1; + } + return sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, r2, 1); +} + +/* +** Compare key1 (buffer pKey1, size nKey1 bytes) with key2 (buffer pKey2, +** size nKey2 bytes). Use (pTask->pKeyInfo) for the collation sequences +** used by the comparison. Return the result of the comparison. +** +** If IN/OUT parameter *pbKey2Cached is true when this function is called, +** it is assumed that (pTask->pUnpacked) contains the unpacked version +** of key2. If it is false, (pTask->pUnpacked) is populated with the unpacked +** version of key2 and *pbKey2Cached set to true before returning. +** +** If an OOM error is encountered, (pTask->pUnpacked->error_rc) is set +** to SQLITE_NOMEM. +*/ +static int vdbeSorterCompare( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + UnpackedRecord *r2 = pTask->pUnpacked; + if( !*pbKey2Cached ){ + sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); + *pbKey2Cached = 1; + } + return sqlite3VdbeRecordCompare(nKey1, pKey1, r2); +} + +/* +** A specially optimized version of vdbeSorterCompare() that assumes that +** the first field of each key is a TEXT value and that the collation +** sequence to compare them with is BINARY. +*/ +static int vdbeSorterCompareText( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + const u8 * const p1 = (const u8 * const)pKey1; + const u8 * const p2 = (const u8 * const)pKey2; + const u8 * const v1 = &p1[ p1[0] ]; /* Pointer to value 1 */ + const u8 * const v2 = &p2[ p2[0] ]; /* Pointer to value 2 */ + + int n1; + int n2; + int res; + + getVarint32NR(&p1[1], n1); + getVarint32NR(&p2[1], n2); + res = memcmp(v1, v2, (MIN(n1, n2) - 13)/2); + if( res==0 ){ + res = n1 - n2; + } + + if( res==0 ){ + if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ + res = vdbeSorterCompareTail( + pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 + ); + } + }else{ + assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); + if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ + res = res * -1; + } + } + + return res; +} + +/* +** A specially optimized version of vdbeSorterCompare() that assumes that +** the first field of each key is an INTEGER value. +*/ +static int vdbeSorterCompareInt( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + const u8 * const p1 = (const u8 * const)pKey1; + const u8 * const p2 = (const u8 * const)pKey2; + const int s1 = p1[1]; /* Left hand serial type */ + const int s2 = p2[1]; /* Right hand serial type */ + const u8 * const v1 = &p1[ p1[0] ]; /* Pointer to value 1 */ + const u8 * const v2 = &p2[ p2[0] ]; /* Pointer to value 2 */ + int res; /* Return value */ + + assert( (s1>0 && s1<7) || s1==8 || s1==9 ); + assert( (s2>0 && s2<7) || s2==8 || s2==9 ); + + if( s1==s2 ){ + /* The two values have the same sign. Compare using memcmp(). */ + static const u8 aLen[] = {0, 1, 2, 3, 4, 6, 8, 0, 0, 0 }; + const u8 n = aLen[s1]; + int i; + res = 0; + for(i=0; i7 && s2>7 ){ + res = s1 - s2; + }else{ + if( s2>7 ){ + res = +1; + }else if( s1>7 ){ + res = -1; + }else{ + res = s1 - s2; + } + assert( res!=0 ); + + if( res>0 ){ + if( *v1 & 0x80 ) res = -1; + }else{ + if( *v2 & 0x80 ) res = +1; + } + } + + if( res==0 ){ + if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ + res = vdbeSorterCompareTail( + pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 + ); + } + }else if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ + assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); + res = res * -1; + } + + return res; +} + +/* +** Initialize the temporary index cursor just opened as a sorter cursor. +** +** Usually, the sorter module uses the value of (pCsr->pKeyInfo->nKeyField) +** to determine the number of fields that should be compared from the +** records being sorted. However, if the value passed as argument nField +** is non-zero and the sorter is able to guarantee a stable sort, nField +** is used instead. This is used when sorting records for a CREATE INDEX +** statement. In this case, keys are always delivered to the sorter in +** order of the primary key, which happens to be make up the final part +** of the records being sorted. So if the sort is stable, there is never +** any reason to compare PK fields and they can be ignored for a small +** performance boost. +** +** The sorter can guarantee a stable sort when running in single-threaded +** mode, but not in multi-threaded mode. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterInit( + sqlite3 *db, /* Database connection (for malloc()) */ + int nField, /* Number of key fields in each record */ + VdbeCursor *pCsr /* Cursor that holds the new sorter */ +){ + int pgsz; /* Page size of main database */ + int i; /* Used to iterate through aTask[] */ + VdbeSorter *pSorter; /* The new sorter */ + KeyInfo *pKeyInfo; /* Copy of pCsr->pKeyInfo with db==0 */ + int szKeyInfo; /* Size of pCsr->pKeyInfo in bytes */ + int sz; /* Size of pSorter in bytes */ + int rc = SQLITE_OK; +#if SQLITE_MAX_WORKER_THREADS==0 +# define nWorker 0 +#else + int nWorker; +#endif + + /* Initialize the upper limit on the number of worker threads */ +#if SQLITE_MAX_WORKER_THREADS>0 + if( sqlite3TempInMemory(db) || sqlite3GlobalConfig.bCoreMutex==0 ){ + nWorker = 0; + }else{ + nWorker = db->aLimit[SQLITE_LIMIT_WORKER_THREADS]; + } +#endif + + /* Do not allow the total number of threads (main thread + all workers) + ** to exceed the maximum merge count */ +#if SQLITE_MAX_WORKER_THREADS>=SORTER_MAX_MERGE_COUNT + if( nWorker>=SORTER_MAX_MERGE_COUNT ){ + nWorker = SORTER_MAX_MERGE_COUNT-1; + } +#endif + + assert( pCsr->pKeyInfo && pCsr->pBtx==0 ); + assert( pCsr->eCurType==CURTYPE_SORTER ); + szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nKeyField-1)*sizeof(CollSeq*); + sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask); + + pSorter = (VdbeSorter*)sqlite3DbMallocZero(db, sz + szKeyInfo); + pCsr->uc.pSorter = pSorter; + if( pSorter==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + pSorter->pKeyInfo = pKeyInfo = (KeyInfo*)((u8*)pSorter + sz); + memcpy(pKeyInfo, pCsr->pKeyInfo, szKeyInfo); + pKeyInfo->db = 0; + if( nField && nWorker==0 ){ + pKeyInfo->nKeyField = nField; + } + pSorter->pgsz = pgsz = sqlite3BtreeGetPageSize(db->aDb[0].pBt); + pSorter->nTask = nWorker + 1; + pSorter->iPrev = (u8)(nWorker - 1); + pSorter->bUseThreads = (pSorter->nTask>1); + pSorter->db = db; + for(i=0; inTask; i++){ + SortSubtask *pTask = &pSorter->aTask[i]; + pTask->pSorter = pSorter; + } + + if( !sqlite3TempInMemory(db) ){ + i64 mxCache; /* Cache size in bytes*/ + u32 szPma = sqlite3GlobalConfig.szPma; + pSorter->mnPmaSize = szPma * pgsz; + + mxCache = db->aDb[0].pSchema->cache_size; + if( mxCache<0 ){ + /* A negative cache-size value C indicates that the cache is abs(C) + ** KiB in size. */ + mxCache = mxCache * -1024; + }else{ + mxCache = mxCache * pgsz; + } + mxCache = MIN(mxCache, SQLITE_MAX_PMASZ); + pSorter->mxPmaSize = MAX(pSorter->mnPmaSize, (int)mxCache); + + /* Avoid large memory allocations if the application has requested + ** SQLITE_CONFIG_SMALL_MALLOC. */ + if( sqlite3GlobalConfig.bSmallMalloc==0 ){ + assert( pSorter->iMemory==0 ); + pSorter->nMemory = pgsz; + pSorter->list.aMemory = (u8*)sqlite3Malloc(pgsz); + if( !pSorter->list.aMemory ) rc = SQLITE_NOMEM_BKPT; + } + } + + if( pKeyInfo->nAllField<13 + && (pKeyInfo->aColl[0]==0 || pKeyInfo->aColl[0]==db->pDfltColl) + && (pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL)==0 + ){ + pSorter->typeMask = SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT; + } + } + + return rc; +} +#undef nWorker /* Defined at the top of this function */ + +/* +** Free the list of sorted records starting at pRecord. +*/ +static void vdbeSorterRecordFree(sqlite3 *db, SorterRecord *pRecord){ + SorterRecord *p; + SorterRecord *pNext; + for(p=pRecord; p; p=pNext){ + pNext = p->u.pNext; + sqlite3DbFree(db, p); + } +} + +/* +** Free all resources owned by the object indicated by argument pTask. All +** fields of *pTask are zeroed before returning. +*/ +static void vdbeSortSubtaskCleanup(sqlite3 *db, SortSubtask *pTask){ + sqlite3DbFree(db, pTask->pUnpacked); +#if SQLITE_MAX_WORKER_THREADS>0 + /* pTask->list.aMemory can only be non-zero if it was handed memory + ** from the main thread. That only occurs SQLITE_MAX_WORKER_THREADS>0 */ + if( pTask->list.aMemory ){ + sqlite3_free(pTask->list.aMemory); + }else +#endif + { + assert( pTask->list.aMemory==0 ); + vdbeSorterRecordFree(0, pTask->list.pList); + } + if( pTask->file.pFd ){ + sqlite3OsCloseFree(pTask->file.pFd); + } + if( pTask->file2.pFd ){ + sqlite3OsCloseFree(pTask->file2.pFd); + } + memset(pTask, 0, sizeof(SortSubtask)); +} + +#ifdef SQLITE_DEBUG_SORTER_THREADS +static void vdbeSorterWorkDebug(SortSubtask *pTask, const char *zEvent){ + i64 t; + int iTask = (pTask - pTask->pSorter->aTask); + sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); + fprintf(stderr, "%lld:%d %s\n", t, iTask, zEvent); +} +static void vdbeSorterRewindDebug(const char *zEvent){ + i64 t; + sqlite3OsCurrentTimeInt64(sqlite3_vfs_find(0), &t); + fprintf(stderr, "%lld:X %s\n", t, zEvent); +} +static void vdbeSorterPopulateDebug( + SortSubtask *pTask, + const char *zEvent +){ + i64 t; + int iTask = (pTask - pTask->pSorter->aTask); + sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); + fprintf(stderr, "%lld:bg%d %s\n", t, iTask, zEvent); +} +static void vdbeSorterBlockDebug( + SortSubtask *pTask, + int bBlocked, + const char *zEvent +){ + if( bBlocked ){ + i64 t; + sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); + fprintf(stderr, "%lld:main %s\n", t, zEvent); + } +} +#else +# define vdbeSorterWorkDebug(x,y) +# define vdbeSorterRewindDebug(y) +# define vdbeSorterPopulateDebug(x,y) +# define vdbeSorterBlockDebug(x,y,z) +#endif + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** Join thread pTask->thread. +*/ +static int vdbeSorterJoinThread(SortSubtask *pTask){ + int rc = SQLITE_OK; + if( pTask->pThread ){ +#ifdef SQLITE_DEBUG_SORTER_THREADS + int bDone = pTask->bDone; +#endif + void *pRet = SQLITE_INT_TO_PTR(SQLITE_ERROR); + vdbeSorterBlockDebug(pTask, !bDone, "enter"); + (void)sqlite3ThreadJoin(pTask->pThread, &pRet); + vdbeSorterBlockDebug(pTask, !bDone, "exit"); + rc = SQLITE_PTR_TO_INT(pRet); + assert( pTask->bDone==1 ); + pTask->bDone = 0; + pTask->pThread = 0; + } + return rc; +} + +/* +** Launch a background thread to run xTask(pIn). +*/ +static int vdbeSorterCreateThread( + SortSubtask *pTask, /* Thread will use this task object */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + assert( pTask->pThread==0 && pTask->bDone==0 ); + return sqlite3ThreadCreate(&pTask->pThread, xTask, pIn); +} + +/* +** Join all outstanding threads launched by SorterWrite() to create +** level-0 PMAs. +*/ +static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){ + int rc = rcin; + int i; + + /* This function is always called by the main user thread. + ** + ** If this function is being called after SorterRewind() has been called, + ** it is possible that thread pSorter->aTask[pSorter->nTask-1].pThread + ** is currently attempt to join one of the other threads. To avoid a race + ** condition where this thread also attempts to join the same object, join + ** thread pSorter->aTask[pSorter->nTask-1].pThread first. */ + for(i=pSorter->nTask-1; i>=0; i--){ + SortSubtask *pTask = &pSorter->aTask[i]; + int rc2 = vdbeSorterJoinThread(pTask); + if( rc==SQLITE_OK ) rc = rc2; + } + return rc; +} +#else +# define vdbeSorterJoinAll(x,rcin) (rcin) +# define vdbeSorterJoinThread(pTask) SQLITE_OK +#endif + +/* +** Allocate a new MergeEngine object capable of handling up to +** nReader PmaReader inputs. +** +** nReader is automatically rounded up to the next power of two. +** nReader may not exceed SORTER_MAX_MERGE_COUNT even after rounding up. +*/ +static MergeEngine *vdbeMergeEngineNew(int nReader){ + int N = 2; /* Smallest power of two >= nReader */ + int nByte; /* Total bytes of space to allocate */ + MergeEngine *pNew; /* Pointer to allocated object to return */ + + assert( nReader<=SORTER_MAX_MERGE_COUNT ); + + while( NnTree = N; + pNew->pTask = 0; + pNew->aReadr = (PmaReader*)&pNew[1]; + pNew->aTree = (int*)&pNew->aReadr[N]; + } + return pNew; +} + +/* +** Free the MergeEngine object passed as the only argument. +*/ +static void vdbeMergeEngineFree(MergeEngine *pMerger){ + int i; + if( pMerger ){ + for(i=0; inTree; i++){ + vdbePmaReaderClear(&pMerger->aReadr[i]); + } + } + sqlite3_free(pMerger); +} + +/* +** Free all resources associated with the IncrMerger object indicated by +** the first argument. +*/ +static void vdbeIncrFree(IncrMerger *pIncr){ + if( pIncr ){ +#if SQLITE_MAX_WORKER_THREADS>0 + if( pIncr->bUseThread ){ + vdbeSorterJoinThread(pIncr->pTask); + if( pIncr->aFile[0].pFd ) sqlite3OsCloseFree(pIncr->aFile[0].pFd); + if( pIncr->aFile[1].pFd ) sqlite3OsCloseFree(pIncr->aFile[1].pFd); + } +#endif + vdbeMergeEngineFree(pIncr->pMerger); + sqlite3_free(pIncr); + } +} + +/* +** Reset a sorting cursor back to its original empty state. +*/ +SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){ + int i; + (void)vdbeSorterJoinAll(pSorter, SQLITE_OK); + assert( pSorter->bUseThreads || pSorter->pReader==0 ); +#if SQLITE_MAX_WORKER_THREADS>0 + if( pSorter->pReader ){ + vdbePmaReaderClear(pSorter->pReader); + sqlite3DbFree(db, pSorter->pReader); + pSorter->pReader = 0; + } +#endif + vdbeMergeEngineFree(pSorter->pMerger); + pSorter->pMerger = 0; + for(i=0; inTask; i++){ + SortSubtask *pTask = &pSorter->aTask[i]; + vdbeSortSubtaskCleanup(db, pTask); + pTask->pSorter = pSorter; + } + if( pSorter->list.aMemory==0 ){ + vdbeSorterRecordFree(0, pSorter->list.pList); + } + pSorter->list.pList = 0; + pSorter->list.szPMA = 0; + pSorter->bUsePMA = 0; + pSorter->iMemory = 0; + pSorter->mxKeysize = 0; + sqlite3DbFree(db, pSorter->pUnpacked); + pSorter->pUnpacked = 0; +} + +/* +** Free any cursor components allocated by sqlite3VdbeSorterXXX routines. +*/ +SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){ + VdbeSorter *pSorter; + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + if( pSorter ){ + sqlite3VdbeSorterReset(db, pSorter); + sqlite3_free(pSorter->list.aMemory); + sqlite3DbFree(db, pSorter); + pCsr->uc.pSorter = 0; + } +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** The first argument is a file-handle open on a temporary file. The file +** is guaranteed to be nByte bytes or smaller in size. This function +** attempts to extend the file to nByte bytes in size and to ensure that +** the VFS has memory mapped it. +** +** Whether or not the file does end up memory mapped of course depends on +** the specific VFS implementation. +*/ +static void vdbeSorterExtendFile(sqlite3 *db, sqlite3_file *pFd, i64 nByte){ + if( nByte<=(i64)(db->nMaxSorterMmap) && pFd->pMethods->iVersion>=3 ){ + void *p = 0; + int chunksize = 4*1024; + sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_CHUNK_SIZE, &chunksize); + sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_SIZE_HINT, &nByte); + sqlite3OsFetch(pFd, 0, (int)nByte, &p); + sqlite3OsUnfetch(pFd, 0, p); + } +} +#else +# define vdbeSorterExtendFile(x,y,z) +#endif + +/* +** Allocate space for a file-handle and open a temporary file. If successful, +** set *ppFd to point to the malloc'd file-handle and return SQLITE_OK. +** Otherwise, set *ppFd to 0 and return an SQLite error code. +*/ +static int vdbeSorterOpenTempFile( + sqlite3 *db, /* Database handle doing sort */ + i64 nExtend, /* Attempt to extend file to this size */ + sqlite3_file **ppFd +){ + int rc; + if( sqlite3FaultSim(202) ) return SQLITE_IOERR_ACCESS; + rc = sqlite3OsOpenMalloc(db->pVfs, 0, ppFd, + SQLITE_OPEN_TEMP_JOURNAL | + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE, &rc + ); + if( rc==SQLITE_OK ){ + i64 max = SQLITE_MAX_MMAP_SIZE; + sqlite3OsFileControlHint(*ppFd, SQLITE_FCNTL_MMAP_SIZE, (void*)&max); + if( nExtend>0 ){ + vdbeSorterExtendFile(db, *ppFd, nExtend); + } + } + return rc; +} + +/* +** If it has not already been allocated, allocate the UnpackedRecord +** structure at pTask->pUnpacked. Return SQLITE_OK if successful (or +** if no allocation was required), or SQLITE_NOMEM otherwise. +*/ +static int vdbeSortAllocUnpacked(SortSubtask *pTask){ + if( pTask->pUnpacked==0 ){ + pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pTask->pSorter->pKeyInfo); + if( pTask->pUnpacked==0 ) return SQLITE_NOMEM_BKPT; + pTask->pUnpacked->nField = pTask->pSorter->pKeyInfo->nKeyField; + pTask->pUnpacked->errCode = 0; + } + return SQLITE_OK; +} + + +/* +** Merge the two sorted lists p1 and p2 into a single list. +*/ +static SorterRecord *vdbeSorterMerge( + SortSubtask *pTask, /* Calling thread context */ + SorterRecord *p1, /* First list to merge */ + SorterRecord *p2 /* Second list to merge */ +){ + SorterRecord *pFinal = 0; + SorterRecord **pp = &pFinal; + int bCached = 0; + + assert( p1!=0 && p2!=0 ); + for(;;){ + int res; + res = pTask->xCompare( + pTask, &bCached, SRVAL(p1), p1->nVal, SRVAL(p2), p2->nVal + ); + + if( res<=0 ){ + *pp = p1; + pp = &p1->u.pNext; + p1 = p1->u.pNext; + if( p1==0 ){ + *pp = p2; + break; + } + }else{ + *pp = p2; + pp = &p2->u.pNext; + p2 = p2->u.pNext; + bCached = 0; + if( p2==0 ){ + *pp = p1; + break; + } + } + } + return pFinal; +} + +/* +** Return the SorterCompare function to compare values collected by the +** sorter object passed as the only argument. +*/ +static SorterCompare vdbeSorterGetCompare(VdbeSorter *p){ + if( p->typeMask==SORTER_TYPE_INTEGER ){ + return vdbeSorterCompareInt; + }else if( p->typeMask==SORTER_TYPE_TEXT ){ + return vdbeSorterCompareText; + } + return vdbeSorterCompare; +} + +/* +** Sort the linked list of records headed at pTask->pList. Return +** SQLITE_OK if successful, or an SQLite error code (i.e. SQLITE_NOMEM) if +** an error occurs. +*/ +static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ + int i; + SorterRecord *p; + int rc; + SorterRecord *aSlot[64]; + + rc = vdbeSortAllocUnpacked(pTask); + if( rc!=SQLITE_OK ) return rc; + + p = pList->pList; + pTask->xCompare = vdbeSorterGetCompare(pTask->pSorter); + memset(aSlot, 0, sizeof(aSlot)); + + while( p ){ + SorterRecord *pNext; + if( pList->aMemory ){ + if( (u8*)p==pList->aMemory ){ + pNext = 0; + }else{ + assert( p->u.iNextaMemory) ); + pNext = (SorterRecord*)&pList->aMemory[p->u.iNext]; + } + }else{ + pNext = p->u.pNext; + } + + p->u.pNext = 0; + for(i=0; aSlot[i]; i++){ + p = vdbeSorterMerge(pTask, p, aSlot[i]); + aSlot[i] = 0; + } + aSlot[i] = p; + p = pNext; + } + + p = 0; + for(i=0; ipList = p; + + assert( pTask->pUnpacked->errCode==SQLITE_OK + || pTask->pUnpacked->errCode==SQLITE_NOMEM + ); + return pTask->pUnpacked->errCode; +} + +/* +** Initialize a PMA-writer object. +*/ +static void vdbePmaWriterInit( + sqlite3_file *pFd, /* File handle to write to */ + PmaWriter *p, /* Object to populate */ + int nBuf, /* Buffer size */ + i64 iStart /* Offset of pFd to begin writing at */ +){ + memset(p, 0, sizeof(PmaWriter)); + p->aBuffer = (u8*)sqlite3Malloc(nBuf); + if( !p->aBuffer ){ + p->eFWErr = SQLITE_NOMEM_BKPT; + }else{ + p->iBufEnd = p->iBufStart = (iStart % nBuf); + p->iWriteOff = iStart - p->iBufStart; + p->nBuffer = nBuf; + p->pFd = pFd; + } +} + +/* +** Write nData bytes of data to the PMA. Return SQLITE_OK +** if successful, or an SQLite error code if an error occurs. +*/ +static void vdbePmaWriteBlob(PmaWriter *p, u8 *pData, int nData){ + int nRem = nData; + while( nRem>0 && p->eFWErr==0 ){ + int nCopy = nRem; + if( nCopy>(p->nBuffer - p->iBufEnd) ){ + nCopy = p->nBuffer - p->iBufEnd; + } + + memcpy(&p->aBuffer[p->iBufEnd], &pData[nData-nRem], nCopy); + p->iBufEnd += nCopy; + if( p->iBufEnd==p->nBuffer ){ + p->eFWErr = sqlite3OsWrite(p->pFd, + &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, + p->iWriteOff + p->iBufStart + ); + p->iBufStart = p->iBufEnd = 0; + p->iWriteOff += p->nBuffer; + } + assert( p->iBufEndnBuffer ); + + nRem -= nCopy; + } +} + +/* +** Flush any buffered data to disk and clean up the PMA-writer object. +** The results of using the PMA-writer after this call are undefined. +** Return SQLITE_OK if flushing the buffered data succeeds or is not +** required. Otherwise, return an SQLite error code. +** +** Before returning, set *piEof to the offset immediately following the +** last byte written to the file. +*/ +static int vdbePmaWriterFinish(PmaWriter *p, i64 *piEof){ + int rc; + if( p->eFWErr==0 && ALWAYS(p->aBuffer) && p->iBufEnd>p->iBufStart ){ + p->eFWErr = sqlite3OsWrite(p->pFd, + &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, + p->iWriteOff + p->iBufStart + ); + } + *piEof = (p->iWriteOff + p->iBufEnd); + sqlite3_free(p->aBuffer); + rc = p->eFWErr; + memset(p, 0, sizeof(PmaWriter)); + return rc; +} + +/* +** Write value iVal encoded as a varint to the PMA. Return +** SQLITE_OK if successful, or an SQLite error code if an error occurs. +*/ +static void vdbePmaWriteVarint(PmaWriter *p, u64 iVal){ + int nByte; + u8 aByte[10]; + nByte = sqlite3PutVarint(aByte, iVal); + vdbePmaWriteBlob(p, aByte, nByte); +} + +/* +** Write the current contents of in-memory linked-list pList to a level-0 +** PMA in the temp file belonging to sub-task pTask. Return SQLITE_OK if +** successful, or an SQLite error code otherwise. +** +** The format of a PMA is: +** +** * A varint. This varint contains the total number of bytes of content +** in the PMA (not including the varint itself). +** +** * One or more records packed end-to-end in order of ascending keys. +** Each record consists of a varint followed by a blob of data (the +** key). The varint is the number of bytes in the blob of data. +*/ +static int vdbeSorterListToPMA(SortSubtask *pTask, SorterList *pList){ + sqlite3 *db = pTask->pSorter->db; + int rc = SQLITE_OK; /* Return code */ + PmaWriter writer; /* Object used to write to the file */ + +#ifdef SQLITE_DEBUG + /* Set iSz to the expected size of file pTask->file after writing the PMA. + ** This is used by an assert() statement at the end of this function. */ + i64 iSz = pList->szPMA + sqlite3VarintLen(pList->szPMA) + pTask->file.iEof; +#endif + + vdbeSorterWorkDebug(pTask, "enter"); + memset(&writer, 0, sizeof(PmaWriter)); + assert( pList->szPMA>0 ); + + /* If the first temporary PMA file has not been opened, open it now. */ + if( pTask->file.pFd==0 ){ + rc = vdbeSorterOpenTempFile(db, 0, &pTask->file.pFd); + assert( rc!=SQLITE_OK || pTask->file.pFd ); + assert( pTask->file.iEof==0 ); + assert( pTask->nPMA==0 ); + } + + /* Try to get the file to memory map */ + if( rc==SQLITE_OK ){ + vdbeSorterExtendFile(db, pTask->file.pFd, pTask->file.iEof+pList->szPMA+9); + } + + /* Sort the list */ + if( rc==SQLITE_OK ){ + rc = vdbeSorterSort(pTask, pList); + } + + if( rc==SQLITE_OK ){ + SorterRecord *p; + SorterRecord *pNext = 0; + + vdbePmaWriterInit(pTask->file.pFd, &writer, pTask->pSorter->pgsz, + pTask->file.iEof); + pTask->nPMA++; + vdbePmaWriteVarint(&writer, pList->szPMA); + for(p=pList->pList; p; p=pNext){ + pNext = p->u.pNext; + vdbePmaWriteVarint(&writer, p->nVal); + vdbePmaWriteBlob(&writer, SRVAL(p), p->nVal); + if( pList->aMemory==0 ) sqlite3_free(p); + } + pList->pList = p; + rc = vdbePmaWriterFinish(&writer, &pTask->file.iEof); + } + + vdbeSorterWorkDebug(pTask, "exit"); + assert( rc!=SQLITE_OK || pList->pList==0 ); + assert( rc!=SQLITE_OK || pTask->file.iEof==iSz ); + return rc; +} + +/* +** Advance the MergeEngine to its next entry. +** Set *pbEof to true there is no next entry because +** the MergeEngine has reached the end of all its inputs. +** +** Return SQLITE_OK if successful or an error code if an error occurs. +*/ +static int vdbeMergeEngineStep( + MergeEngine *pMerger, /* The merge engine to advance to the next row */ + int *pbEof /* Set TRUE at EOF. Set false for more content */ +){ + int rc; + int iPrev = pMerger->aTree[1];/* Index of PmaReader to advance */ + SortSubtask *pTask = pMerger->pTask; + + /* Advance the current PmaReader */ + rc = vdbePmaReaderNext(&pMerger->aReadr[iPrev]); + + /* Update contents of aTree[] */ + if( rc==SQLITE_OK ){ + int i; /* Index of aTree[] to recalculate */ + PmaReader *pReadr1; /* First PmaReader to compare */ + PmaReader *pReadr2; /* Second PmaReader to compare */ + int bCached = 0; + + /* Find the first two PmaReaders to compare. The one that was just + ** advanced (iPrev) and the one next to it in the array. */ + pReadr1 = &pMerger->aReadr[(iPrev & 0xFFFE)]; + pReadr2 = &pMerger->aReadr[(iPrev | 0x0001)]; + + for(i=(pMerger->nTree+iPrev)/2; i>0; i=i/2){ + /* Compare pReadr1 and pReadr2. Store the result in variable iRes. */ + int iRes; + if( pReadr1->pFd==0 ){ + iRes = +1; + }else if( pReadr2->pFd==0 ){ + iRes = -1; + }else{ + iRes = pTask->xCompare(pTask, &bCached, + pReadr1->aKey, pReadr1->nKey, pReadr2->aKey, pReadr2->nKey + ); + } + + /* If pReadr1 contained the smaller value, set aTree[i] to its index. + ** Then set pReadr2 to the next PmaReader to compare to pReadr1. In this + ** case there is no cache of pReadr2 in pTask->pUnpacked, so set + ** pKey2 to point to the record belonging to pReadr2. + ** + ** Alternatively, if pReadr2 contains the smaller of the two values, + ** set aTree[i] to its index and update pReadr1. If vdbeSorterCompare() + ** was actually called above, then pTask->pUnpacked now contains + ** a value equivalent to pReadr2. So set pKey2 to NULL to prevent + ** vdbeSorterCompare() from decoding pReadr2 again. + ** + ** If the two values were equal, then the value from the oldest + ** PMA should be considered smaller. The VdbeSorter.aReadr[] array + ** is sorted from oldest to newest, so pReadr1 contains older values + ** than pReadr2 iff (pReadr1aTree[i] = (int)(pReadr1 - pMerger->aReadr); + pReadr2 = &pMerger->aReadr[ pMerger->aTree[i ^ 0x0001] ]; + bCached = 0; + }else{ + if( pReadr1->pFd ) bCached = 0; + pMerger->aTree[i] = (int)(pReadr2 - pMerger->aReadr); + pReadr1 = &pMerger->aReadr[ pMerger->aTree[i ^ 0x0001] ]; + } + } + *pbEof = (pMerger->aReadr[pMerger->aTree[1]].pFd==0); + } + + return (rc==SQLITE_OK ? pTask->pUnpacked->errCode : rc); +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** The main routine for background threads that write level-0 PMAs. +*/ +static void *vdbeSorterFlushThread(void *pCtx){ + SortSubtask *pTask = (SortSubtask*)pCtx; + int rc; /* Return code */ + assert( pTask->bDone==0 ); + rc = vdbeSorterListToPMA(pTask, &pTask->list); + pTask->bDone = 1; + return SQLITE_INT_TO_PTR(rc); +} +#endif /* SQLITE_MAX_WORKER_THREADS>0 */ + +/* +** Flush the current contents of VdbeSorter.list to a new PMA, possibly +** using a background thread. +*/ +static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ +#if SQLITE_MAX_WORKER_THREADS==0 + pSorter->bUsePMA = 1; + return vdbeSorterListToPMA(&pSorter->aTask[0], &pSorter->list); +#else + int rc = SQLITE_OK; + int i; + SortSubtask *pTask = 0; /* Thread context used to create new PMA */ + int nWorker = (pSorter->nTask-1); + + /* Set the flag to indicate that at least one PMA has been written. + ** Or will be, anyhow. */ + pSorter->bUsePMA = 1; + + /* Select a sub-task to sort and flush the current list of in-memory + ** records to disk. If the sorter is running in multi-threaded mode, + ** round-robin between the first (pSorter->nTask-1) tasks. Except, if + ** the background thread from a sub-tasks previous turn is still running, + ** skip it. If the first (pSorter->nTask-1) sub-tasks are all still busy, + ** fall back to using the final sub-task. The first (pSorter->nTask-1) + ** sub-tasks are prefered as they use background threads - the final + ** sub-task uses the main thread. */ + for(i=0; iiPrev + i + 1) % nWorker; + pTask = &pSorter->aTask[iTest]; + if( pTask->bDone ){ + rc = vdbeSorterJoinThread(pTask); + } + if( rc!=SQLITE_OK || pTask->pThread==0 ) break; + } + + if( rc==SQLITE_OK ){ + if( i==nWorker ){ + /* Use the foreground thread for this operation */ + rc = vdbeSorterListToPMA(&pSorter->aTask[nWorker], &pSorter->list); + }else{ + /* Launch a background thread for this operation */ + u8 *aMem; + void *pCtx; + + assert( pTask!=0 ); + assert( pTask->pThread==0 && pTask->bDone==0 ); + assert( pTask->list.pList==0 ); + assert( pTask->list.aMemory==0 || pSorter->list.aMemory!=0 ); + + aMem = pTask->list.aMemory; + pCtx = (void*)pTask; + pSorter->iPrev = (u8)(pTask - pSorter->aTask); + pTask->list = pSorter->list; + pSorter->list.pList = 0; + pSorter->list.szPMA = 0; + if( aMem ){ + pSorter->list.aMemory = aMem; + pSorter->nMemory = sqlite3MallocSize(aMem); + }else if( pSorter->list.aMemory ){ + pSorter->list.aMemory = sqlite3Malloc(pSorter->nMemory); + if( !pSorter->list.aMemory ) return SQLITE_NOMEM_BKPT; + } + + rc = vdbeSorterCreateThread(pTask, vdbeSorterFlushThread, pCtx); + } + } + + return rc; +#endif /* SQLITE_MAX_WORKER_THREADS!=0 */ +} + +/* +** Add a record to the sorter. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterWrite( + const VdbeCursor *pCsr, /* Sorter cursor */ + Mem *pVal /* Memory cell containing record */ +){ + VdbeSorter *pSorter; + int rc = SQLITE_OK; /* Return Code */ + SorterRecord *pNew; /* New list element */ + int bFlush; /* True to flush contents of memory to PMA */ + int nReq; /* Bytes of memory required */ + int nPMA; /* Bytes of PMA space required */ + int t; /* serial type of first record field */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + getVarint32NR((const u8*)&pVal->z[1], t); + if( t>0 && t<10 && t!=7 ){ + pSorter->typeMask &= SORTER_TYPE_INTEGER; + }else if( t>10 && (t & 0x01) ){ + pSorter->typeMask &= SORTER_TYPE_TEXT; + }else{ + pSorter->typeMask = 0; + } + + assert( pSorter ); + + /* Figure out whether or not the current contents of memory should be + ** flushed to a PMA before continuing. If so, do so. + ** + ** If using the single large allocation mode (pSorter->aMemory!=0), then + ** flush the contents of memory to a new PMA if (a) at least one value is + ** already in memory and (b) the new value will not fit in memory. + ** + ** Or, if using separate allocations for each record, flush the contents + ** of memory to a PMA if either of the following are true: + ** + ** * The total memory allocated for the in-memory list is greater + ** than (page-size * cache-size), or + ** + ** * The total memory allocated for the in-memory list is greater + ** than (page-size * 10) and sqlite3HeapNearlyFull() returns true. + */ + nReq = pVal->n + sizeof(SorterRecord); + nPMA = pVal->n + sqlite3VarintLen(pVal->n); + if( pSorter->mxPmaSize ){ + if( pSorter->list.aMemory ){ + bFlush = pSorter->iMemory && (pSorter->iMemory+nReq) > pSorter->mxPmaSize; + }else{ + bFlush = ( + (pSorter->list.szPMA > pSorter->mxPmaSize) + || (pSorter->list.szPMA > pSorter->mnPmaSize && sqlite3HeapNearlyFull()) + ); + } + if( bFlush ){ + rc = vdbeSorterFlushPMA(pSorter); + pSorter->list.szPMA = 0; + pSorter->iMemory = 0; + assert( rc!=SQLITE_OK || pSorter->list.pList==0 ); + } + } + + pSorter->list.szPMA += nPMA; + if( nPMA>pSorter->mxKeysize ){ + pSorter->mxKeysize = nPMA; + } + + if( pSorter->list.aMemory ){ + int nMin = pSorter->iMemory + nReq; + + if( nMin>pSorter->nMemory ){ + u8 *aNew; + sqlite3_int64 nNew = 2 * (sqlite3_int64)pSorter->nMemory; + int iListOff = -1; + if( pSorter->list.pList ){ + iListOff = (u8*)pSorter->list.pList - pSorter->list.aMemory; + } + while( nNew < nMin ) nNew = nNew*2; + if( nNew > pSorter->mxPmaSize ) nNew = pSorter->mxPmaSize; + if( nNew < nMin ) nNew = nMin; + aNew = sqlite3Realloc(pSorter->list.aMemory, nNew); + if( !aNew ) return SQLITE_NOMEM_BKPT; + if( iListOff>=0 ){ + pSorter->list.pList = (SorterRecord*)&aNew[iListOff]; + } + pSorter->list.aMemory = aNew; + pSorter->nMemory = nNew; + } + + pNew = (SorterRecord*)&pSorter->list.aMemory[pSorter->iMemory]; + pSorter->iMemory += ROUND8(nReq); + if( pSorter->list.pList ){ + pNew->u.iNext = (int)((u8*)(pSorter->list.pList) - pSorter->list.aMemory); + } + }else{ + pNew = (SorterRecord *)sqlite3Malloc(nReq); + if( pNew==0 ){ + return SQLITE_NOMEM_BKPT; + } + pNew->u.pNext = pSorter->list.pList; + } + + memcpy(SRVAL(pNew), pVal->z, pVal->n); + pNew->nVal = pVal->n; + pSorter->list.pList = pNew; + + return rc; +} + +/* +** Read keys from pIncr->pMerger and populate pIncr->aFile[1]. The format +** of the data stored in aFile[1] is the same as that used by regular PMAs, +** except that the number-of-bytes varint is omitted from the start. +*/ +static int vdbeIncrPopulate(IncrMerger *pIncr){ + int rc = SQLITE_OK; + int rc2; + i64 iStart = pIncr->iStartOff; + SorterFile *pOut = &pIncr->aFile[1]; + SortSubtask *pTask = pIncr->pTask; + MergeEngine *pMerger = pIncr->pMerger; + PmaWriter writer; + assert( pIncr->bEof==0 ); + + vdbeSorterPopulateDebug(pTask, "enter"); + + vdbePmaWriterInit(pOut->pFd, &writer, pTask->pSorter->pgsz, iStart); + while( rc==SQLITE_OK ){ + int dummy; + PmaReader *pReader = &pMerger->aReadr[ pMerger->aTree[1] ]; + int nKey = pReader->nKey; + i64 iEof = writer.iWriteOff + writer.iBufEnd; + + /* Check if the output file is full or if the input has been exhausted. + ** In either case exit the loop. */ + if( pReader->pFd==0 ) break; + if( (iEof + nKey + sqlite3VarintLen(nKey))>(iStart + pIncr->mxSz) ) break; + + /* Write the next key to the output. */ + vdbePmaWriteVarint(&writer, nKey); + vdbePmaWriteBlob(&writer, pReader->aKey, nKey); + assert( pIncr->pMerger->pTask==pTask ); + rc = vdbeMergeEngineStep(pIncr->pMerger, &dummy); + } + + rc2 = vdbePmaWriterFinish(&writer, &pOut->iEof); + if( rc==SQLITE_OK ) rc = rc2; + vdbeSorterPopulateDebug(pTask, "exit"); + return rc; +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** The main routine for background threads that populate aFile[1] of +** multi-threaded IncrMerger objects. +*/ +static void *vdbeIncrPopulateThread(void *pCtx){ + IncrMerger *pIncr = (IncrMerger*)pCtx; + void *pRet = SQLITE_INT_TO_PTR( vdbeIncrPopulate(pIncr) ); + pIncr->pTask->bDone = 1; + return pRet; +} + +/* +** Launch a background thread to populate aFile[1] of pIncr. +*/ +static int vdbeIncrBgPopulate(IncrMerger *pIncr){ + void *p = (void*)pIncr; + assert( pIncr->bUseThread ); + return vdbeSorterCreateThread(pIncr->pTask, vdbeIncrPopulateThread, p); +} +#endif + +/* +** This function is called when the PmaReader corresponding to pIncr has +** finished reading the contents of aFile[0]. Its purpose is to "refill" +** aFile[0] such that the PmaReader should start rereading it from the +** beginning. +** +** For single-threaded objects, this is accomplished by literally reading +** keys from pIncr->pMerger and repopulating aFile[0]. +** +** For multi-threaded objects, all that is required is to wait until the +** background thread is finished (if it is not already) and then swap +** aFile[0] and aFile[1] in place. If the contents of pMerger have not +** been exhausted, this function also launches a new background thread +** to populate the new aFile[1]. +** +** SQLITE_OK is returned on success, or an SQLite error code otherwise. +*/ +static int vdbeIncrSwap(IncrMerger *pIncr){ + int rc = SQLITE_OK; + +#if SQLITE_MAX_WORKER_THREADS>0 + if( pIncr->bUseThread ){ + rc = vdbeSorterJoinThread(pIncr->pTask); + + if( rc==SQLITE_OK ){ + SorterFile f0 = pIncr->aFile[0]; + pIncr->aFile[0] = pIncr->aFile[1]; + pIncr->aFile[1] = f0; + } + + if( rc==SQLITE_OK ){ + if( pIncr->aFile[0].iEof==pIncr->iStartOff ){ + pIncr->bEof = 1; + }else{ + rc = vdbeIncrBgPopulate(pIncr); + } + } + }else +#endif + { + rc = vdbeIncrPopulate(pIncr); + pIncr->aFile[0] = pIncr->aFile[1]; + if( pIncr->aFile[0].iEof==pIncr->iStartOff ){ + pIncr->bEof = 1; + } + } + + return rc; +} + +/* +** Allocate and return a new IncrMerger object to read data from pMerger. +** +** If an OOM condition is encountered, return NULL. In this case free the +** pMerger argument before returning. +*/ +static int vdbeIncrMergerNew( + SortSubtask *pTask, /* The thread that will be using the new IncrMerger */ + MergeEngine *pMerger, /* The MergeEngine that the IncrMerger will control */ + IncrMerger **ppOut /* Write the new IncrMerger here */ +){ + int rc = SQLITE_OK; + IncrMerger *pIncr = *ppOut = (IncrMerger*) + (sqlite3FaultSim(100) ? 0 : sqlite3MallocZero(sizeof(*pIncr))); + if( pIncr ){ + pIncr->pMerger = pMerger; + pIncr->pTask = pTask; + pIncr->mxSz = MAX(pTask->pSorter->mxKeysize+9,pTask->pSorter->mxPmaSize/2); + pTask->file2.iEof += pIncr->mxSz; + }else{ + vdbeMergeEngineFree(pMerger); + rc = SQLITE_NOMEM_BKPT; + } + return rc; +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** Set the "use-threads" flag on object pIncr. +*/ +static void vdbeIncrMergerSetThreads(IncrMerger *pIncr){ + pIncr->bUseThread = 1; + pIncr->pTask->file2.iEof -= pIncr->mxSz; +} +#endif /* SQLITE_MAX_WORKER_THREADS>0 */ + + + +/* +** Recompute pMerger->aTree[iOut] by comparing the next keys on the +** two PmaReaders that feed that entry. Neither of the PmaReaders +** are advanced. This routine merely does the comparison. +*/ +static void vdbeMergeEngineCompare( + MergeEngine *pMerger, /* Merge engine containing PmaReaders to compare */ + int iOut /* Store the result in pMerger->aTree[iOut] */ +){ + int i1; + int i2; + int iRes; + PmaReader *p1; + PmaReader *p2; + + assert( iOutnTree && iOut>0 ); + + if( iOut>=(pMerger->nTree/2) ){ + i1 = (iOut - pMerger->nTree/2) * 2; + i2 = i1 + 1; + }else{ + i1 = pMerger->aTree[iOut*2]; + i2 = pMerger->aTree[iOut*2+1]; + } + + p1 = &pMerger->aReadr[i1]; + p2 = &pMerger->aReadr[i2]; + + if( p1->pFd==0 ){ + iRes = i2; + }else if( p2->pFd==0 ){ + iRes = i1; + }else{ + SortSubtask *pTask = pMerger->pTask; + int bCached = 0; + int res; + assert( pTask->pUnpacked!=0 ); /* from vdbeSortSubtaskMain() */ + res = pTask->xCompare( + pTask, &bCached, p1->aKey, p1->nKey, p2->aKey, p2->nKey + ); + if( res<=0 ){ + iRes = i1; + }else{ + iRes = i2; + } + } + + pMerger->aTree[iOut] = iRes; +} + +/* +** Allowed values for the eMode parameter to vdbeMergeEngineInit() +** and vdbePmaReaderIncrMergeInit(). +** +** Only INCRINIT_NORMAL is valid in single-threaded builds (when +** SQLITE_MAX_WORKER_THREADS==0). The other values are only used +** when there exists one or more separate worker threads. +*/ +#define INCRINIT_NORMAL 0 +#define INCRINIT_TASK 1 +#define INCRINIT_ROOT 2 + +/* +** Forward reference required as the vdbeIncrMergeInit() and +** vdbePmaReaderIncrInit() routines are called mutually recursively when +** building a merge tree. +*/ +static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode); + +/* +** Initialize the MergeEngine object passed as the second argument. Once this +** function returns, the first key of merged data may be read from the +** MergeEngine object in the usual fashion. +** +** If argument eMode is INCRINIT_ROOT, then it is assumed that any IncrMerge +** objects attached to the PmaReader objects that the merger reads from have +** already been populated, but that they have not yet populated aFile[0] and +** set the PmaReader objects up to read from it. In this case all that is +** required is to call vdbePmaReaderNext() on each PmaReader to point it at +** its first key. +** +** Otherwise, if eMode is any value other than INCRINIT_ROOT, then use +** vdbePmaReaderIncrMergeInit() to initialize each PmaReader that feeds data +** to pMerger. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int vdbeMergeEngineInit( + SortSubtask *pTask, /* Thread that will run pMerger */ + MergeEngine *pMerger, /* MergeEngine to initialize */ + int eMode /* One of the INCRINIT_XXX constants */ +){ + int rc = SQLITE_OK; /* Return code */ + int i; /* For looping over PmaReader objects */ + int nTree; /* Number of subtrees to merge */ + + /* Failure to allocate the merge would have been detected prior to + ** invoking this routine */ + assert( pMerger!=0 ); + + /* eMode is always INCRINIT_NORMAL in single-threaded mode */ + assert( SQLITE_MAX_WORKER_THREADS>0 || eMode==INCRINIT_NORMAL ); + + /* Verify that the MergeEngine is assigned to a single thread */ + assert( pMerger->pTask==0 ); + pMerger->pTask = pTask; + + nTree = pMerger->nTree; + for(i=0; i0 && eMode==INCRINIT_ROOT ){ + /* PmaReaders should be normally initialized in order, as if they are + ** reading from the same temp file this makes for more linear file IO. + ** However, in the INCRINIT_ROOT case, if PmaReader aReadr[nTask-1] is + ** in use it will block the vdbePmaReaderNext() call while it uses + ** the main thread to fill its buffer. So calling PmaReaderNext() + ** on this PmaReader before any of the multi-threaded PmaReaders takes + ** better advantage of multi-processor hardware. */ + rc = vdbePmaReaderNext(&pMerger->aReadr[nTree-i-1]); + }else{ + rc = vdbePmaReaderIncrInit(&pMerger->aReadr[i], INCRINIT_NORMAL); + } + if( rc!=SQLITE_OK ) return rc; + } + + for(i=pMerger->nTree-1; i>0; i--){ + vdbeMergeEngineCompare(pMerger, i); + } + return pTask->pUnpacked->errCode; +} + +/* +** The PmaReader passed as the first argument is guaranteed to be an +** incremental-reader (pReadr->pIncr!=0). This function serves to open +** and/or initialize the temp file related fields of the IncrMerge +** object at (pReadr->pIncr). +** +** If argument eMode is set to INCRINIT_NORMAL, then all PmaReaders +** in the sub-tree headed by pReadr are also initialized. Data is then +** loaded into the buffers belonging to pReadr and it is set to point to +** the first key in its range. +** +** If argument eMode is set to INCRINIT_TASK, then pReadr is guaranteed +** to be a multi-threaded PmaReader and this function is being called in a +** background thread. In this case all PmaReaders in the sub-tree are +** initialized as for INCRINIT_NORMAL and the aFile[1] buffer belonging to +** pReadr is populated. However, pReadr itself is not set up to point +** to its first key. A call to vdbePmaReaderNext() is still required to do +** that. +** +** The reason this function does not call vdbePmaReaderNext() immediately +** in the INCRINIT_TASK case is that vdbePmaReaderNext() assumes that it has +** to block on thread (pTask->thread) before accessing aFile[1]. But, since +** this entire function is being run by thread (pTask->thread), that will +** lead to the current background thread attempting to join itself. +** +** Finally, if argument eMode is set to INCRINIT_ROOT, it may be assumed +** that pReadr->pIncr is a multi-threaded IncrMerge objects, and that all +** child-trees have already been initialized using IncrInit(INCRINIT_TASK). +** In this case vdbePmaReaderNext() is called on all child PmaReaders and +** the current PmaReader set to point to the first key in its range. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ + int rc = SQLITE_OK; + IncrMerger *pIncr = pReadr->pIncr; + SortSubtask *pTask = pIncr->pTask; + sqlite3 *db = pTask->pSorter->db; + + /* eMode is always INCRINIT_NORMAL in single-threaded mode */ + assert( SQLITE_MAX_WORKER_THREADS>0 || eMode==INCRINIT_NORMAL ); + + rc = vdbeMergeEngineInit(pTask, pIncr->pMerger, eMode); + + /* Set up the required files for pIncr. A multi-theaded IncrMerge object + ** requires two temp files to itself, whereas a single-threaded object + ** only requires a region of pTask->file2. */ + if( rc==SQLITE_OK ){ + int mxSz = pIncr->mxSz; +#if SQLITE_MAX_WORKER_THREADS>0 + if( pIncr->bUseThread ){ + rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[0].pFd); + if( rc==SQLITE_OK ){ + rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[1].pFd); + } + }else +#endif + /*if( !pIncr->bUseThread )*/{ + if( pTask->file2.pFd==0 ){ + assert( pTask->file2.iEof>0 ); + rc = vdbeSorterOpenTempFile(db, pTask->file2.iEof, &pTask->file2.pFd); + pTask->file2.iEof = 0; + } + if( rc==SQLITE_OK ){ + pIncr->aFile[1].pFd = pTask->file2.pFd; + pIncr->iStartOff = pTask->file2.iEof; + pTask->file2.iEof += mxSz; + } + } + } + +#if SQLITE_MAX_WORKER_THREADS>0 + if( rc==SQLITE_OK && pIncr->bUseThread ){ + /* Use the current thread to populate aFile[1], even though this + ** PmaReader is multi-threaded. If this is an INCRINIT_TASK object, + ** then this function is already running in background thread + ** pIncr->pTask->thread. + ** + ** If this is the INCRINIT_ROOT object, then it is running in the + ** main VDBE thread. But that is Ok, as that thread cannot return + ** control to the VDBE or proceed with anything useful until the + ** first results are ready from this merger object anyway. + */ + assert( eMode==INCRINIT_ROOT || eMode==INCRINIT_TASK ); + rc = vdbeIncrPopulate(pIncr); + } +#endif + + if( rc==SQLITE_OK && (SQLITE_MAX_WORKER_THREADS==0 || eMode!=INCRINIT_TASK) ){ + rc = vdbePmaReaderNext(pReadr); + } + + return rc; +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** The main routine for vdbePmaReaderIncrMergeInit() operations run in +** background threads. +*/ +static void *vdbePmaReaderBgIncrInit(void *pCtx){ + PmaReader *pReader = (PmaReader*)pCtx; + void *pRet = SQLITE_INT_TO_PTR( + vdbePmaReaderIncrMergeInit(pReader,INCRINIT_TASK) + ); + pReader->pIncr->pTask->bDone = 1; + return pRet; +} +#endif + +/* +** If the PmaReader passed as the first argument is not an incremental-reader +** (if pReadr->pIncr==0), then this function is a no-op. Otherwise, it invokes +** the vdbePmaReaderIncrMergeInit() function with the parameters passed to +** this routine to initialize the incremental merge. +** +** If the IncrMerger object is multi-threaded (IncrMerger.bUseThread==1), +** then a background thread is launched to call vdbePmaReaderIncrMergeInit(). +** Or, if the IncrMerger is single threaded, the same function is called +** using the current thread. +*/ +static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode){ + IncrMerger *pIncr = pReadr->pIncr; /* Incremental merger */ + int rc = SQLITE_OK; /* Return code */ + if( pIncr ){ +#if SQLITE_MAX_WORKER_THREADS>0 + assert( pIncr->bUseThread==0 || eMode==INCRINIT_TASK ); + if( pIncr->bUseThread ){ + void *pCtx = (void*)pReadr; + rc = vdbeSorterCreateThread(pIncr->pTask, vdbePmaReaderBgIncrInit, pCtx); + }else +#endif + { + rc = vdbePmaReaderIncrMergeInit(pReadr, eMode); + } + } + return rc; +} + +/* +** Allocate a new MergeEngine object to merge the contents of nPMA level-0 +** PMAs from pTask->file. If no error occurs, set *ppOut to point to +** the new object and return SQLITE_OK. Or, if an error does occur, set *ppOut +** to NULL and return an SQLite error code. +** +** When this function is called, *piOffset is set to the offset of the +** first PMA to read from pTask->file. Assuming no error occurs, it is +** set to the offset immediately following the last byte of the last +** PMA before returning. If an error does occur, then the final value of +** *piOffset is undefined. +*/ +static int vdbeMergeEngineLevel0( + SortSubtask *pTask, /* Sorter task to read from */ + int nPMA, /* Number of PMAs to read */ + i64 *piOffset, /* IN/OUT: Readr offset in pTask->file */ + MergeEngine **ppOut /* OUT: New merge-engine */ +){ + MergeEngine *pNew; /* Merge engine to return */ + i64 iOff = *piOffset; + int i; + int rc = SQLITE_OK; + + *ppOut = pNew = vdbeMergeEngineNew(nPMA); + if( pNew==0 ) rc = SQLITE_NOMEM_BKPT; + + for(i=0; iaReadr[i]; + rc = vdbePmaReaderInit(pTask, &pTask->file, iOff, pReadr, &nDummy); + iOff = pReadr->iEof; + } + + if( rc!=SQLITE_OK ){ + vdbeMergeEngineFree(pNew); + *ppOut = 0; + } + *piOffset = iOff; + return rc; +} + +/* +** Return the depth of a tree comprising nPMA PMAs, assuming a fanout of +** SORTER_MAX_MERGE_COUNT. The returned value does not include leaf nodes. +** +** i.e. +** +** nPMA<=16 -> TreeDepth() == 0 +** nPMA<=256 -> TreeDepth() == 1 +** nPMA<=65536 -> TreeDepth() == 2 +*/ +static int vdbeSorterTreeDepth(int nPMA){ + int nDepth = 0; + i64 nDiv = SORTER_MAX_MERGE_COUNT; + while( nDiv < (i64)nPMA ){ + nDiv = nDiv * SORTER_MAX_MERGE_COUNT; + nDepth++; + } + return nDepth; +} + +/* +** pRoot is the root of an incremental merge-tree with depth nDepth (according +** to vdbeSorterTreeDepth()). pLeaf is the iSeq'th leaf to be added to the +** tree, counting from zero. This function adds pLeaf to the tree. +** +** If successful, SQLITE_OK is returned. If an error occurs, an SQLite error +** code is returned and pLeaf is freed. +*/ +static int vdbeSorterAddToTree( + SortSubtask *pTask, /* Task context */ + int nDepth, /* Depth of tree according to TreeDepth() */ + int iSeq, /* Sequence number of leaf within tree */ + MergeEngine *pRoot, /* Root of tree */ + MergeEngine *pLeaf /* Leaf to add to tree */ +){ + int rc = SQLITE_OK; + int nDiv = 1; + int i; + MergeEngine *p = pRoot; + IncrMerger *pIncr; + + rc = vdbeIncrMergerNew(pTask, pLeaf, &pIncr); + + for(i=1; iaReadr[iIter]; + + if( pReadr->pIncr==0 ){ + MergeEngine *pNew = vdbeMergeEngineNew(SORTER_MAX_MERGE_COUNT); + if( pNew==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + rc = vdbeIncrMergerNew(pTask, pNew, &pReadr->pIncr); + } + } + if( rc==SQLITE_OK ){ + p = pReadr->pIncr->pMerger; + nDiv = nDiv / SORTER_MAX_MERGE_COUNT; + } + } + + if( rc==SQLITE_OK ){ + p->aReadr[iSeq % SORTER_MAX_MERGE_COUNT].pIncr = pIncr; + }else{ + vdbeIncrFree(pIncr); + } + return rc; +} + +/* +** This function is called as part of a SorterRewind() operation on a sorter +** that has already written two or more level-0 PMAs to one or more temp +** files. It builds a tree of MergeEngine/IncrMerger/PmaReader objects that +** can be used to incrementally merge all PMAs on disk. +** +** If successful, SQLITE_OK is returned and *ppOut set to point to the +** MergeEngine object at the root of the tree before returning. Or, if an +** error occurs, an SQLite error code is returned and the final value +** of *ppOut is undefined. +*/ +static int vdbeSorterMergeTreeBuild( + VdbeSorter *pSorter, /* The VDBE cursor that implements the sort */ + MergeEngine **ppOut /* Write the MergeEngine here */ +){ + MergeEngine *pMain = 0; + int rc = SQLITE_OK; + int iTask; + +#if SQLITE_MAX_WORKER_THREADS>0 + /* If the sorter uses more than one task, then create the top-level + ** MergeEngine here. This MergeEngine will read data from exactly + ** one PmaReader per sub-task. */ + assert( pSorter->bUseThreads || pSorter->nTask==1 ); + if( pSorter->nTask>1 ){ + pMain = vdbeMergeEngineNew(pSorter->nTask); + if( pMain==0 ) rc = SQLITE_NOMEM_BKPT; + } +#endif + + for(iTask=0; rc==SQLITE_OK && iTasknTask; iTask++){ + SortSubtask *pTask = &pSorter->aTask[iTask]; + assert( pTask->nPMA>0 || SQLITE_MAX_WORKER_THREADS>0 ); + if( SQLITE_MAX_WORKER_THREADS==0 || pTask->nPMA ){ + MergeEngine *pRoot = 0; /* Root node of tree for this task */ + int nDepth = vdbeSorterTreeDepth(pTask->nPMA); + i64 iReadOff = 0; + + if( pTask->nPMA<=SORTER_MAX_MERGE_COUNT ){ + rc = vdbeMergeEngineLevel0(pTask, pTask->nPMA, &iReadOff, &pRoot); + }else{ + int i; + int iSeq = 0; + pRoot = vdbeMergeEngineNew(SORTER_MAX_MERGE_COUNT); + if( pRoot==0 ) rc = SQLITE_NOMEM_BKPT; + for(i=0; inPMA && rc==SQLITE_OK; i += SORTER_MAX_MERGE_COUNT){ + MergeEngine *pMerger = 0; /* New level-0 PMA merger */ + int nReader; /* Number of level-0 PMAs to merge */ + + nReader = MIN(pTask->nPMA - i, SORTER_MAX_MERGE_COUNT); + rc = vdbeMergeEngineLevel0(pTask, nReader, &iReadOff, &pMerger); + if( rc==SQLITE_OK ){ + rc = vdbeSorterAddToTree(pTask, nDepth, iSeq++, pRoot, pMerger); + } + } + } + + if( rc==SQLITE_OK ){ +#if SQLITE_MAX_WORKER_THREADS>0 + if( pMain!=0 ){ + rc = vdbeIncrMergerNew(pTask, pRoot, &pMain->aReadr[iTask].pIncr); + }else +#endif + { + assert( pMain==0 ); + pMain = pRoot; + } + }else{ + vdbeMergeEngineFree(pRoot); + } + } + } + + if( rc!=SQLITE_OK ){ + vdbeMergeEngineFree(pMain); + pMain = 0; + } + *ppOut = pMain; + return rc; +} + +/* +** This function is called as part of an sqlite3VdbeSorterRewind() operation +** on a sorter that has written two or more PMAs to temporary files. It sets +** up either VdbeSorter.pMerger (for single threaded sorters) or pReader +** (for multi-threaded sorters) so that it can be used to iterate through +** all records stored in the sorter. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ + int rc; /* Return code */ + SortSubtask *pTask0 = &pSorter->aTask[0]; + MergeEngine *pMain = 0; +#if SQLITE_MAX_WORKER_THREADS + sqlite3 *db = pTask0->pSorter->db; + int i; + SorterCompare xCompare = vdbeSorterGetCompare(pSorter); + for(i=0; inTask; i++){ + pSorter->aTask[i].xCompare = xCompare; + } +#endif + + rc = vdbeSorterMergeTreeBuild(pSorter, &pMain); + if( rc==SQLITE_OK ){ +#if SQLITE_MAX_WORKER_THREADS + assert( pSorter->bUseThreads==0 || pSorter->nTask>1 ); + if( pSorter->bUseThreads ){ + int iTask; + PmaReader *pReadr = 0; + SortSubtask *pLast = &pSorter->aTask[pSorter->nTask-1]; + rc = vdbeSortAllocUnpacked(pLast); + if( rc==SQLITE_OK ){ + pReadr = (PmaReader*)sqlite3DbMallocZero(db, sizeof(PmaReader)); + pSorter->pReader = pReadr; + if( pReadr==0 ) rc = SQLITE_NOMEM_BKPT; + } + if( rc==SQLITE_OK ){ + rc = vdbeIncrMergerNew(pLast, pMain, &pReadr->pIncr); + if( rc==SQLITE_OK ){ + vdbeIncrMergerSetThreads(pReadr->pIncr); + for(iTask=0; iTask<(pSorter->nTask-1); iTask++){ + IncrMerger *pIncr; + if( (pIncr = pMain->aReadr[iTask].pIncr) ){ + vdbeIncrMergerSetThreads(pIncr); + assert( pIncr->pTask!=pLast ); + } + } + for(iTask=0; rc==SQLITE_OK && iTasknTask; iTask++){ + /* Check that: + ** + ** a) The incremental merge object is configured to use the + ** right task, and + ** b) If it is using task (nTask-1), it is configured to run + ** in single-threaded mode. This is important, as the + ** root merge (INCRINIT_ROOT) will be using the same task + ** object. + */ + PmaReader *p = &pMain->aReadr[iTask]; + assert( p->pIncr==0 || ( + (p->pIncr->pTask==&pSorter->aTask[iTask]) /* a */ + && (iTask!=pSorter->nTask-1 || p->pIncr->bUseThread==0) /* b */ + )); + rc = vdbePmaReaderIncrInit(p, INCRINIT_TASK); + } + } + pMain = 0; + } + if( rc==SQLITE_OK ){ + rc = vdbePmaReaderIncrMergeInit(pReadr, INCRINIT_ROOT); + } + }else +#endif + { + rc = vdbeMergeEngineInit(pTask0, pMain, INCRINIT_NORMAL); + pSorter->pMerger = pMain; + pMain = 0; + } + } + + if( rc!=SQLITE_OK ){ + vdbeMergeEngineFree(pMain); + } + return rc; +} + + +/* +** Once the sorter has been populated by calls to sqlite3VdbeSorterWrite, +** this function is called to prepare for iterating through the records +** in sorted order. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *pCsr, int *pbEof){ + VdbeSorter *pSorter; + int rc = SQLITE_OK; /* Return code */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + assert( pSorter ); + + /* If no data has been written to disk, then do not do so now. Instead, + ** sort the VdbeSorter.pRecord list. The vdbe layer will read data directly + ** from the in-memory list. */ + if( pSorter->bUsePMA==0 ){ + if( pSorter->list.pList ){ + *pbEof = 0; + rc = vdbeSorterSort(&pSorter->aTask[0], &pSorter->list); + }else{ + *pbEof = 1; + } + return rc; + } + + /* Write the current in-memory list to a PMA. When the VdbeSorterWrite() + ** function flushes the contents of memory to disk, it immediately always + ** creates a new list consisting of a single key immediately afterwards. + ** So the list is never empty at this point. */ + assert( pSorter->list.pList ); + rc = vdbeSorterFlushPMA(pSorter); + + /* Join all threads */ + rc = vdbeSorterJoinAll(pSorter, rc); + + vdbeSorterRewindDebug("rewind"); + + /* Assuming no errors have occurred, set up a merger structure to + ** incrementally read and merge all remaining PMAs. */ + assert( pSorter->pReader==0 ); + if( rc==SQLITE_OK ){ + rc = vdbeSorterSetupMerge(pSorter); + *pbEof = 0; + } + + vdbeSorterRewindDebug("rewinddone"); + return rc; +} + +/* +** Advance to the next element in the sorter. Return value: +** +** SQLITE_OK success +** SQLITE_DONE end of data +** otherwise some kind of error. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *db, const VdbeCursor *pCsr){ + VdbeSorter *pSorter; + int rc; /* Return code */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + assert( pSorter->bUsePMA || (pSorter->pReader==0 && pSorter->pMerger==0) ); + if( pSorter->bUsePMA ){ + assert( pSorter->pReader==0 || pSorter->pMerger==0 ); + assert( pSorter->bUseThreads==0 || pSorter->pReader ); + assert( pSorter->bUseThreads==1 || pSorter->pMerger ); +#if SQLITE_MAX_WORKER_THREADS>0 + if( pSorter->bUseThreads ){ + rc = vdbePmaReaderNext(pSorter->pReader); + if( rc==SQLITE_OK && pSorter->pReader->pFd==0 ) rc = SQLITE_DONE; + }else +#endif + /*if( !pSorter->bUseThreads )*/ { + int res = 0; + assert( pSorter->pMerger!=0 ); + assert( pSorter->pMerger->pTask==(&pSorter->aTask[0]) ); + rc = vdbeMergeEngineStep(pSorter->pMerger, &res); + if( rc==SQLITE_OK && res ) rc = SQLITE_DONE; + } + }else{ + SorterRecord *pFree = pSorter->list.pList; + pSorter->list.pList = pFree->u.pNext; + pFree->u.pNext = 0; + if( pSorter->list.aMemory==0 ) vdbeSorterRecordFree(db, pFree); + rc = pSorter->list.pList ? SQLITE_OK : SQLITE_DONE; + } + return rc; +} + +/* +** Return a pointer to a buffer owned by the sorter that contains the +** current key. +*/ +static void *vdbeSorterRowkey( + const VdbeSorter *pSorter, /* Sorter object */ + int *pnKey /* OUT: Size of current key in bytes */ +){ + void *pKey; + if( pSorter->bUsePMA ){ + PmaReader *pReader; +#if SQLITE_MAX_WORKER_THREADS>0 + if( pSorter->bUseThreads ){ + pReader = pSorter->pReader; + }else +#endif + /*if( !pSorter->bUseThreads )*/{ + pReader = &pSorter->pMerger->aReadr[pSorter->pMerger->aTree[1]]; + } + *pnKey = pReader->nKey; + pKey = pReader->aKey; + }else{ + *pnKey = pSorter->list.pList->nVal; + pKey = SRVAL(pSorter->list.pList); + } + return pKey; +} + +/* +** Copy the current sorter key into the memory cell pOut. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *pCsr, Mem *pOut){ + VdbeSorter *pSorter; + void *pKey; int nKey; /* Sorter key to copy into pOut */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + pKey = vdbeSorterRowkey(pSorter, &nKey); + if( sqlite3VdbeMemClearAndResize(pOut, nKey) ){ + return SQLITE_NOMEM_BKPT; + } + pOut->n = nKey; + MemSetTypeFlag(pOut, MEM_Blob); + memcpy(pOut->z, pKey, nKey); + + return SQLITE_OK; +} + +/* +** Compare the key in memory cell pVal with the key that the sorter cursor +** passed as the first argument currently points to. For the purposes of +** the comparison, ignore the rowid field at the end of each record. +** +** If the sorter cursor key contains any NULL values, consider it to be +** less than pVal. Even if pVal also contains NULL values. +** +** If an error occurs, return an SQLite error code (i.e. SQLITE_NOMEM). +** Otherwise, set *pRes to a negative, zero or positive value if the +** key in pVal is smaller than, equal to or larger than the current sorter +** key. +** +** This routine forms the core of the OP_SorterCompare opcode, which in +** turn is used to verify uniqueness when constructing a UNIQUE INDEX. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterCompare( + const VdbeCursor *pCsr, /* Sorter cursor */ + Mem *pVal, /* Value to compare to current sorter key */ + int nKeyCol, /* Compare this many columns */ + int *pRes /* OUT: Result of comparison */ +){ + VdbeSorter *pSorter; + UnpackedRecord *r2; + KeyInfo *pKeyInfo; + int i; + void *pKey; int nKey; /* Sorter key to compare pVal with */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + r2 = pSorter->pUnpacked; + pKeyInfo = pCsr->pKeyInfo; + if( r2==0 ){ + r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); + if( r2==0 ) return SQLITE_NOMEM_BKPT; + r2->nField = nKeyCol; + } + assert( r2->nField==nKeyCol ); + + pKey = vdbeSorterRowkey(pSorter, &nKey); + sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, r2); + for(i=0; iaMem[i].flags & MEM_Null ){ + *pRes = -1; + return SQLITE_OK; + } + } + + *pRes = sqlite3VdbeRecordCompare(pVal->n, pVal->z, r2); + return SQLITE_OK; +} + +/************** End of vdbesort.c ********************************************/ +/************** Begin file vdbevtab.c ****************************************/ +/* +** 2020-03-23 +** +** 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 implements virtual-tables for examining the bytecode content +** of a prepared statement. +*/ +/* #include "sqliteInt.h" */ +#if defined(SQLITE_ENABLE_BYTECODE_VTAB) && !defined(SQLITE_OMIT_VIRTUALTABLE) +/* #include "vdbeInt.h" */ + +/* An instance of the bytecode() table-valued function. +*/ +typedef struct bytecodevtab bytecodevtab; +struct bytecodevtab { + sqlite3_vtab base; /* Base class - must be first */ + sqlite3 *db; /* Database connection */ + int bTablesUsed; /* 2 for tables_used(). 0 for bytecode(). */ +}; + +/* A cursor for scanning through the bytecode +*/ +typedef struct bytecodevtab_cursor bytecodevtab_cursor; +struct bytecodevtab_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3_stmt *pStmt; /* The statement whose bytecode is displayed */ + int iRowid; /* The rowid of the output table */ + int iAddr; /* Address */ + int needFinalize; /* Cursors owns pStmt and must finalize it */ + int showSubprograms; /* Provide a listing of subprograms */ + Op *aOp; /* Operand array */ + char *zP4; /* Rendered P4 value */ + const char *zType; /* tables_used.type */ + const char *zSchema; /* tables_used.schema */ + const char *zName; /* tables_used.name */ + Mem sub; /* Subprograms */ +}; + +/* +** Create a new bytecode() table-valued function. +*/ +static int bytecodevtabConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + bytecodevtab *pNew; + int rc; + int isTabUsed = pAux!=0; + const char *azSchema[2] = { + /* bytecode() schema */ + "CREATE TABLE x(" + "addr INT," + "opcode TEXT," + "p1 INT," + "p2 INT," + "p3 INT," + "p4 TEXT," + "p5 INT," + "comment TEXT," + "subprog TEXT," + "stmt HIDDEN" + ");", + + /* Tables_used() schema */ + "CREATE TABLE x(" + "type TEXT," + "schema TEXT," + "name TEXT," + "wr INT," + "subprog TEXT," + "stmt HIDDEN" + ");" + }; + + rc = sqlite3_declare_vtab(db, azSchema[isTabUsed]); + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + pNew->db = db; + pNew->bTablesUsed = isTabUsed*2; + } + return rc; +} + +/* +** This method is the destructor for bytecodevtab objects. +*/ +static int bytecodevtabDisconnect(sqlite3_vtab *pVtab){ + bytecodevtab *p = (bytecodevtab*)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Constructor for a new bytecodevtab_cursor object. +*/ +static int bytecodevtabOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + bytecodevtab *pVTab = (bytecodevtab*)p; + bytecodevtab_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + sqlite3VdbeMemInit(&pCur->sub, pVTab->db, 1); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Clear all internal content from a bytecodevtab cursor. +*/ +static void bytecodevtabCursorClear(bytecodevtab_cursor *pCur){ + sqlite3_free(pCur->zP4); + pCur->zP4 = 0; + sqlite3VdbeMemRelease(&pCur->sub); + sqlite3VdbeMemSetNull(&pCur->sub); + if( pCur->needFinalize ){ + sqlite3_finalize(pCur->pStmt); + } + pCur->pStmt = 0; + pCur->needFinalize = 0; + pCur->zType = 0; + pCur->zSchema = 0; + pCur->zName = 0; +} + +/* +** Destructor for a bytecodevtab_cursor. +*/ +static int bytecodevtabClose(sqlite3_vtab_cursor *cur){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + bytecodevtabCursorClear(pCur); + sqlite3_free(pCur); + return SQLITE_OK; +} + + +/* +** Advance a bytecodevtab_cursor to its next row of output. +*/ +static int bytecodevtabNext(sqlite3_vtab_cursor *cur){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + bytecodevtab *pTab = (bytecodevtab*)cur->pVtab; + int rc; + if( pCur->zP4 ){ + sqlite3_free(pCur->zP4); + pCur->zP4 = 0; + } + if( pCur->zName ){ + pCur->zName = 0; + pCur->zType = 0; + pCur->zSchema = 0; + } + rc = sqlite3VdbeNextOpcode( + (Vdbe*)pCur->pStmt, + pCur->showSubprograms ? &pCur->sub : 0, + pTab->bTablesUsed, + &pCur->iRowid, + &pCur->iAddr, + &pCur->aOp); + if( rc!=SQLITE_OK ){ + sqlite3VdbeMemSetNull(&pCur->sub); + pCur->aOp = 0; + } + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int bytecodevtabEof(sqlite3_vtab_cursor *cur){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + return pCur->aOp==0; +} + +/* +** Return values of columns for the row at which the bytecodevtab_cursor +** is currently pointing. +*/ +static int bytecodevtabColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + bytecodevtab *pVTab = (bytecodevtab*)cur->pVtab; + Op *pOp = pCur->aOp + pCur->iAddr; + if( pVTab->bTablesUsed ){ + if( i==4 ){ + i = 8; + }else{ + if( i<=2 && pCur->zType==0 ){ + Schema *pSchema; + HashElem *k; + int iDb = pOp->p3; + int iRoot = pOp->p2; + sqlite3 *db = pVTab->db; + pSchema = db->aDb[iDb].pSchema; + pCur->zSchema = db->aDb[iDb].zDbSName; + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ + Table *pTab = (Table*)sqliteHashData(k); + if( !IsVirtual(pTab) && pTab->tnum==iRoot ){ + pCur->zName = pTab->zName; + pCur->zType = "table"; + break; + } + } + if( pCur->zName==0 ){ + for(k=sqliteHashFirst(&pSchema->idxHash); k; k=sqliteHashNext(k)){ + Index *pIdx = (Index*)sqliteHashData(k); + if( pIdx->tnum==iRoot ){ + pCur->zName = pIdx->zName; + pCur->zType = "index"; + } + } + } + } + i += 10; + } + } + switch( i ){ + case 0: /* addr */ + sqlite3_result_int(ctx, pCur->iAddr); + break; + case 1: /* opcode */ + sqlite3_result_text(ctx, (char*)sqlite3OpcodeName(pOp->opcode), + -1, SQLITE_STATIC); + break; + case 2: /* p1 */ + sqlite3_result_int(ctx, pOp->p1); + break; + case 3: /* p2 */ + sqlite3_result_int(ctx, pOp->p2); + break; + case 4: /* p3 */ + sqlite3_result_int(ctx, pOp->p3); + break; + case 5: /* p4 */ + case 7: /* comment */ + if( pCur->zP4==0 ){ + pCur->zP4 = sqlite3VdbeDisplayP4(pVTab->db, pOp); + } + if( i==5 ){ + sqlite3_result_text(ctx, pCur->zP4, -1, SQLITE_STATIC); + }else{ +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + char *zCom = sqlite3VdbeDisplayComment(pVTab->db, pOp, pCur->zP4); + sqlite3_result_text(ctx, zCom, -1, sqlite3_free); +#endif + } + break; + case 6: /* p5 */ + sqlite3_result_int(ctx, pOp->p5); + break; + case 8: { /* subprog */ + Op *aOp = pCur->aOp; + assert( aOp[0].opcode==OP_Init ); + assert( aOp[0].p4.z==0 || strncmp(aOp[0].p4.z,"-" "- ",3)==0 ); + if( pCur->iRowid==pCur->iAddr+1 ){ + break; /* Result is NULL for the main program */ + }else if( aOp[0].p4.z!=0 ){ + sqlite3_result_text(ctx, aOp[0].p4.z+3, -1, SQLITE_STATIC); + }else{ + sqlite3_result_text(ctx, "(FK)", 4, SQLITE_STATIC); + } + break; + } + case 10: /* tables_used.type */ + sqlite3_result_text(ctx, pCur->zType, -1, SQLITE_STATIC); + break; + case 11: /* tables_used.schema */ + sqlite3_result_text(ctx, pCur->zSchema, -1, SQLITE_STATIC); + break; + case 12: /* tables_used.name */ + sqlite3_result_text(ctx, pCur->zName, -1, SQLITE_STATIC); + break; + case 13: /* tables_used.wr */ + sqlite3_result_int(ctx, pOp->opcode==OP_OpenWrite); + break; + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int bytecodevtabRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +/* +** Initialize a cursor. +** +** idxNum==0 means show all subprograms +** idxNum==1 means show only the main bytecode and omit subprograms. +*/ +static int bytecodevtabFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor *)pVtabCursor; + bytecodevtab *pVTab = (bytecodevtab *)pVtabCursor->pVtab; + int rc = SQLITE_OK; + + bytecodevtabCursorClear(pCur); + pCur->iRowid = 0; + pCur->iAddr = 0; + pCur->showSubprograms = idxNum==0; + assert( argc==1 ); + if( sqlite3_value_type(argv[0])==SQLITE_TEXT ){ + const char *zSql = (const char*)sqlite3_value_text(argv[0]); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(pVTab->db, zSql, -1, &pCur->pStmt, 0); + pCur->needFinalize = 1; + } + }else{ + pCur->pStmt = (sqlite3_stmt*)sqlite3_value_pointer(argv[0],"stmt-pointer"); + } + if( pCur->pStmt==0 ){ + pVTab->base.zErrMsg = sqlite3_mprintf( + "argument to %s() is not a valid SQL statement", + pVTab->bTablesUsed ? "tables_used" : "bytecode" + ); + rc = SQLITE_ERROR; + }else{ + bytecodevtabNext(pVtabCursor); + } + return rc; +} + +/* +** We must have a single stmt=? constraint that will be passed through +** into the xFilter method. If there is no valid stmt=? constraint, +** then return an SQLITE_CONSTRAINT error. +*/ +static int bytecodevtabBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; + int rc = SQLITE_CONSTRAINT; + struct sqlite3_index_constraint *p; + bytecodevtab *pVTab = (bytecodevtab*)tab; + int iBaseCol = pVTab->bTablesUsed ? 4 : 8; + pIdxInfo->estimatedCost = (double)100; + pIdxInfo->estimatedRows = 100; + pIdxInfo->idxNum = 0; + for(i=0, p=pIdxInfo->aConstraint; inConstraint; i++, p++){ + if( p->usable==0 ) continue; + if( p->op==SQLITE_INDEX_CONSTRAINT_EQ && p->iColumn==iBaseCol+1 ){ + rc = SQLITE_OK; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + } + if( p->op==SQLITE_INDEX_CONSTRAINT_ISNULL && p->iColumn==iBaseCol ){ + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->idxNum = 1; + } + } + return rc; +} + +/* +** This following structure defines all the methods for the +** virtual table. +*/ +static sqlite3_module bytecodevtabModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ bytecodevtabConnect, + /* xBestIndex */ bytecodevtabBestIndex, + /* xDisconnect */ bytecodevtabDisconnect, + /* xDestroy */ 0, + /* xOpen */ bytecodevtabOpen, + /* xClose */ bytecodevtabClose, + /* xFilter */ bytecodevtabFilter, + /* xNext */ bytecodevtabNext, + /* xEof */ bytecodevtabEof, + /* xColumn */ bytecodevtabColumn, + /* xRowid */ bytecodevtabRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0 +}; + + +SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ + int rc; + rc = sqlite3_create_module(db, "bytecode", &bytecodevtabModule, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_module(db, "tables_used", &bytecodevtabModule, &db); + } + return rc; +} +#elif defined(SQLITE_ENABLE_BYTECODE_VTAB) +SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ return SQLITE_OK; } +#endif /* SQLITE_ENABLE_BYTECODE_VTAB */ + +/************** End of vdbevtab.c ********************************************/ +/************** Begin file memjournal.c **************************************/ +/* +** 2008 October 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 code use to implement an in-memory rollback journal. +** The in-memory rollback journal is used to journal transactions for +** ":memory:" databases and when the journal_mode=MEMORY pragma is used. +** +** Update: The in-memory journal is also used to temporarily cache +** smaller journals that are not critical for power-loss recovery. +** For example, statement journals that are not too big will be held +** entirely in memory, thus reducing the number of file I/O calls, and +** more importantly, reducing temporary file creation events. If these +** journals become too large for memory, they are spilled to disk. But +** in the common case, they are usually small and no file I/O needs to +** occur. +*/ +/* #include "sqliteInt.h" */ + +/* Forward references to internal structures */ +typedef struct MemJournal MemJournal; +typedef struct FilePoint FilePoint; +typedef struct FileChunk FileChunk; + +/* +** The rollback journal is composed of a linked list of these structures. +** +** The zChunk array is always at least 8 bytes in size - usually much more. +** Its actual size is stored in the MemJournal.nChunkSize variable. +*/ +struct FileChunk { + FileChunk *pNext; /* Next chunk in the journal */ + u8 zChunk[8]; /* Content of this chunk */ +}; + +/* +** By default, allocate this many bytes of memory for each FileChunk object. +*/ +#define MEMJOURNAL_DFLT_FILECHUNKSIZE 1024 + +/* +** For chunk size nChunkSize, return the number of bytes that should +** be allocated for each FileChunk structure. +*/ +#define fileChunkSize(nChunkSize) (sizeof(FileChunk) + ((nChunkSize)-8)) + +/* +** An instance of this object serves as a cursor into the rollback journal. +** The cursor can be either for reading or writing. +*/ +struct FilePoint { + sqlite3_int64 iOffset; /* Offset from the beginning of the file */ + FileChunk *pChunk; /* Specific chunk into which cursor points */ +}; + +/* +** This structure is a subclass of sqlite3_file. Each open memory-journal +** is an instance of this class. +*/ +struct MemJournal { + const sqlite3_io_methods *pMethod; /* Parent class. MUST BE FIRST */ + int nChunkSize; /* In-memory chunk-size */ + + int nSpill; /* Bytes of data before flushing */ + int nSize; /* Bytes of data currently in memory */ + FileChunk *pFirst; /* Head of in-memory chunk-list */ + FilePoint endpoint; /* Pointer to the end of the file */ + FilePoint readpoint; /* Pointer to the end of the last xRead() */ + + int flags; /* xOpen flags */ + sqlite3_vfs *pVfs; /* The "real" underlying VFS */ + const char *zJournal; /* Name of the journal file */ +}; + +/* +** Read data from the in-memory journal file. This is the implementation +** of the sqlite3_vfs.xRead method. +*/ +static int memjrnlRead( + sqlite3_file *pJfd, /* The journal file from which to read */ + void *zBuf, /* Put the results here */ + int iAmt, /* Number of bytes to read */ + sqlite_int64 iOfst /* Begin reading at this offset */ +){ + MemJournal *p = (MemJournal *)pJfd; + u8 *zOut = zBuf; + int nRead = iAmt; + int iChunkOffset; + FileChunk *pChunk; + + if( (iAmt+iOfst)>p->endpoint.iOffset ){ + return SQLITE_IOERR_SHORT_READ; + } + assert( p->readpoint.iOffset==0 || p->readpoint.pChunk!=0 ); + if( p->readpoint.iOffset!=iOfst || iOfst==0 ){ + sqlite3_int64 iOff = 0; + for(pChunk=p->pFirst; + ALWAYS(pChunk) && (iOff+p->nChunkSize)<=iOfst; + pChunk=pChunk->pNext + ){ + iOff += p->nChunkSize; + } + }else{ + pChunk = p->readpoint.pChunk; + assert( pChunk!=0 ); + } + + iChunkOffset = (int)(iOfst%p->nChunkSize); + do { + int iSpace = p->nChunkSize - iChunkOffset; + int nCopy = MIN(nRead, (p->nChunkSize - iChunkOffset)); + memcpy(zOut, (u8*)pChunk->zChunk + iChunkOffset, nCopy); + zOut += nCopy; + nRead -= iSpace; + iChunkOffset = 0; + } while( nRead>=0 && (pChunk=pChunk->pNext)!=0 && nRead>0 ); + p->readpoint.iOffset = pChunk ? iOfst+iAmt : 0; + p->readpoint.pChunk = pChunk; + + return SQLITE_OK; +} + +/* +** Free the list of FileChunk structures headed at MemJournal.pFirst. +*/ +static void memjrnlFreeChunks(MemJournal *p){ + FileChunk *pIter; + FileChunk *pNext; + for(pIter=p->pFirst; pIter; pIter=pNext){ + pNext = pIter->pNext; + sqlite3_free(pIter); + } + p->pFirst = 0; +} + +/* +** Flush the contents of memory to a real file on disk. +*/ +static int memjrnlCreateFile(MemJournal *p){ + int rc; + sqlite3_file *pReal = (sqlite3_file*)p; + MemJournal copy = *p; + + memset(p, 0, sizeof(MemJournal)); + rc = sqlite3OsOpen(copy.pVfs, copy.zJournal, pReal, copy.flags, 0); + if( rc==SQLITE_OK ){ + int nChunk = copy.nChunkSize; + i64 iOff = 0; + FileChunk *pIter; + for(pIter=copy.pFirst; pIter; pIter=pIter->pNext){ + if( iOff + nChunk > copy.endpoint.iOffset ){ + nChunk = copy.endpoint.iOffset - iOff; + } + rc = sqlite3OsWrite(pReal, (u8*)pIter->zChunk, nChunk, iOff); + if( rc ) break; + iOff += nChunk; + } + if( rc==SQLITE_OK ){ + /* No error has occurred. Free the in-memory buffers. */ + memjrnlFreeChunks(©); + } + } + if( rc!=SQLITE_OK ){ + /* If an error occurred while creating or writing to the file, restore + ** the original before returning. This way, SQLite uses the in-memory + ** journal data to roll back changes made to the internal page-cache + ** before this function was called. */ + sqlite3OsClose(pReal); + *p = copy; + } + return rc; +} + + +/* +** Write data to the file. +*/ +static int memjrnlWrite( + sqlite3_file *pJfd, /* The journal file into which to write */ + const void *zBuf, /* Take data to be written from here */ + int iAmt, /* Number of bytes to write */ + sqlite_int64 iOfst /* Begin writing at this offset into the file */ +){ + MemJournal *p = (MemJournal *)pJfd; + int nWrite = iAmt; + u8 *zWrite = (u8 *)zBuf; + + /* If the file should be created now, create it and write the new data + ** into the file on disk. */ + if( p->nSpill>0 && (iAmt+iOfst)>p->nSpill ){ + int rc = memjrnlCreateFile(p); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pJfd, zBuf, iAmt, iOfst); + } + return rc; + } + + /* If the contents of this write should be stored in memory */ + else{ + /* An in-memory journal file should only ever be appended to. Random + ** access writes are not required. The only exception to this is when + ** the in-memory journal is being used by a connection using the + ** atomic-write optimization. In this case the first 28 bytes of the + ** journal file may be written as part of committing the transaction. */ + assert( iOfst==p->endpoint.iOffset || iOfst==0 ); +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + if( iOfst==0 && p->pFirst ){ + assert( p->nChunkSize>iAmt ); + memcpy((u8*)p->pFirst->zChunk, zBuf, iAmt); + }else +#else + assert( iOfst>0 || p->pFirst==0 ); +#endif + { + while( nWrite>0 ){ + FileChunk *pChunk = p->endpoint.pChunk; + int iChunkOffset = (int)(p->endpoint.iOffset%p->nChunkSize); + int iSpace = MIN(nWrite, p->nChunkSize - iChunkOffset); + + if( iChunkOffset==0 ){ + /* New chunk is required to extend the file. */ + FileChunk *pNew = sqlite3_malloc(fileChunkSize(p->nChunkSize)); + if( !pNew ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + pNew->pNext = 0; + if( pChunk ){ + assert( p->pFirst ); + pChunk->pNext = pNew; + }else{ + assert( !p->pFirst ); + p->pFirst = pNew; + } + p->endpoint.pChunk = pNew; + } + + memcpy((u8*)p->endpoint.pChunk->zChunk + iChunkOffset, zWrite, iSpace); + zWrite += iSpace; + nWrite -= iSpace; + p->endpoint.iOffset += iSpace; + } + p->nSize = iAmt + iOfst; + } + } + + return SQLITE_OK; +} + +/* +** Truncate the file. +** +** If the journal file is already on disk, truncate it there. Or, if it +** is still in main memory but is being truncated to zero bytes in size, +** ignore +*/ +static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ + MemJournal *p = (MemJournal *)pJfd; + if( ALWAYS(size==0) ){ + memjrnlFreeChunks(p); + p->nSize = 0; + p->endpoint.pChunk = 0; + p->endpoint.iOffset = 0; + p->readpoint.pChunk = 0; + p->readpoint.iOffset = 0; + } + return SQLITE_OK; +} + +/* +** Close the file. +*/ +static int memjrnlClose(sqlite3_file *pJfd){ + MemJournal *p = (MemJournal *)pJfd; + memjrnlFreeChunks(p); + return SQLITE_OK; +} + +/* +** Sync the file. +** +** If the real file has been created, call its xSync method. Otherwise, +** syncing an in-memory journal is a no-op. +*/ +static int memjrnlSync(sqlite3_file *pJfd, int flags){ + UNUSED_PARAMETER2(pJfd, flags); + return SQLITE_OK; +} + +/* +** Query the size of the file in bytes. +*/ +static int memjrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){ + MemJournal *p = (MemJournal *)pJfd; + *pSize = (sqlite_int64) p->endpoint.iOffset; + return SQLITE_OK; +} + +/* +** Table of methods for MemJournal sqlite3_file object. +*/ +static const struct sqlite3_io_methods MemJournalMethods = { + 1, /* iVersion */ + memjrnlClose, /* xClose */ + memjrnlRead, /* xRead */ + memjrnlWrite, /* xWrite */ + memjrnlTruncate, /* xTruncate */ + memjrnlSync, /* xSync */ + memjrnlFileSize, /* xFileSize */ + 0, /* xLock */ + 0, /* xUnlock */ + 0, /* xCheckReservedLock */ + 0, /* xFileControl */ + 0, /* xSectorSize */ + 0, /* xDeviceCharacteristics */ + 0, /* xShmMap */ + 0, /* xShmLock */ + 0, /* xShmBarrier */ + 0, /* xShmUnmap */ + 0, /* xFetch */ + 0 /* xUnfetch */ +}; + +/* +** Open a journal file. +** +** The behaviour of the journal file depends on the value of parameter +** nSpill. If nSpill is 0, then the journal file is always create and +** accessed using the underlying VFS. If nSpill is less than zero, then +** all content is always stored in main-memory. Finally, if nSpill is a +** positive value, then the journal file is initially created in-memory +** but may be flushed to disk later on. In this case the journal file is +** flushed to disk either when it grows larger than nSpill bytes in size, +** or when sqlite3JournalCreate() is called. +*/ +SQLITE_PRIVATE int sqlite3JournalOpen( + sqlite3_vfs *pVfs, /* The VFS to use for actual file I/O */ + const char *zName, /* Name of the journal file */ + sqlite3_file *pJfd, /* Preallocated, blank file handle */ + int flags, /* Opening flags */ + int nSpill /* Bytes buffered before opening the file */ +){ + MemJournal *p = (MemJournal*)pJfd; + + /* Zero the file-handle object. If nSpill was passed zero, initialize + ** it using the sqlite3OsOpen() function of the underlying VFS. In this + ** case none of the code in this module is executed as a result of calls + ** made on the journal file-handle. */ + memset(p, 0, sizeof(MemJournal)); + if( nSpill==0 ){ + return sqlite3OsOpen(pVfs, zName, pJfd, flags, 0); + } + + if( nSpill>0 ){ + p->nChunkSize = nSpill; + }else{ + p->nChunkSize = 8 + MEMJOURNAL_DFLT_FILECHUNKSIZE - sizeof(FileChunk); + assert( MEMJOURNAL_DFLT_FILECHUNKSIZE==fileChunkSize(p->nChunkSize) ); + } + + p->pMethod = (const sqlite3_io_methods*)&MemJournalMethods; + p->nSpill = nSpill; + p->flags = flags; + p->zJournal = zName; + p->pVfs = pVfs; + return SQLITE_OK; +} + +/* +** Open an in-memory journal file. +*/ +SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){ + sqlite3JournalOpen(0, 0, pJfd, 0, -1); +} + +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) +/* +** If the argument p points to a MemJournal structure that is not an +** in-memory-only journal file (i.e. is one that was opened with a +ve +** nSpill parameter or as SQLITE_OPEN_MAIN_JOURNAL), and the underlying +** file has not yet been created, create it now. +*/ +SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *pJfd){ + int rc = SQLITE_OK; + MemJournal *p = (MemJournal*)pJfd; + if( p->pMethod==&MemJournalMethods && ( +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + p->nSpill>0 +#else + /* While this appears to not be possible without ATOMIC_WRITE, the + ** paths are complex, so it seems prudent to leave the test in as + ** a NEVER(), in case our analysis is subtly flawed. */ + NEVER(p->nSpill>0) +#endif +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + || (p->flags & SQLITE_OPEN_MAIN_JOURNAL) +#endif + )){ + rc = memjrnlCreateFile(p); + } + return rc; +} +#endif + +/* +** The file-handle passed as the only argument is open on a journal file. +** Return true if this "journal file" is currently stored in heap memory, +** or false otherwise. +*/ +SQLITE_PRIVATE int sqlite3JournalIsInMemory(sqlite3_file *p){ + return p->pMethods==&MemJournalMethods; +} + +/* +** Return the number of bytes required to store a JournalFile that uses vfs +** pVfs to create the underlying on-disk files. +*/ +SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){ + return MAX(pVfs->szOsFile, (int)sizeof(MemJournal)); +} + +/************** End of memjournal.c ******************************************/ +/************** Begin file walker.c ******************************************/ +/* +** 2008 August 16 +** +** 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 routines used for walking the parser tree for +** an SQL statement. +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ + + +#if !defined(SQLITE_OMIT_WINDOWFUNC) +/* +** Walk all expressions linked into the list of Window objects passed +** as the second argument. +*/ +static int walkWindowList(Walker *pWalker, Window *pList){ + Window *pWin; + for(pWin=pList; pWin; pWin=pWin->pNextWin){ + int rc; + rc = sqlite3WalkExprList(pWalker, pWin->pOrderBy); + if( rc ) return WRC_Abort; + rc = sqlite3WalkExprList(pWalker, pWin->pPartition); + if( rc ) return WRC_Abort; + rc = sqlite3WalkExpr(pWalker, pWin->pFilter); + if( rc ) return WRC_Abort; + + /* The next two are purely for calls to sqlite3RenameExprUnmap() + ** within sqlite3WindowOffsetExpr(). Because of constraints imposed + ** by sqlite3WindowOffsetExpr(), they can never fail. The results do + ** not matter anyhow. */ + rc = sqlite3WalkExpr(pWalker, pWin->pStart); + if( NEVER(rc) ) return WRC_Abort; + rc = sqlite3WalkExpr(pWalker, pWin->pEnd); + if( NEVER(rc) ) return WRC_Abort; + } + return WRC_Continue; +} +#endif + +/* +** Walk an expression tree. Invoke the callback once for each node +** of the expression, while descending. (In other words, the callback +** is invoked before visiting children.) +** +** The return value from the callback should be one of the WRC_* +** constants to specify how to proceed with the walk. +** +** WRC_Continue Continue descending down the tree. +** +** WRC_Prune Do not descend into child nodes, but allow +** the walk to continue with sibling nodes. +** +** WRC_Abort Do no more callbacks. Unwind the stack and +** return from the top-level walk call. +** +** The return value from this routine is WRC_Abort to abandon the tree walk +** and WRC_Continue to continue. +*/ +static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ + int rc; + testcase( ExprHasProperty(pExpr, EP_TokenOnly) ); + testcase( ExprHasProperty(pExpr, EP_Reduced) ); + while(1){ + rc = pWalker->xExprCallback(pWalker, pExpr); + if( rc ) return rc & WRC_Abort; + if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ + assert( pExpr->x.pList==0 || pExpr->pRight==0 ); + if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; + if( pExpr->pRight ){ + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); + pExpr = pExpr->pRight; + continue; + }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); + if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; + }else{ + if( pExpr->x.pList ){ + if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; + } +#endif + } + } + break; + } + return WRC_Continue; +} +SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){ + return pExpr ? walkExpr(pWalker,pExpr) : WRC_Continue; +} + +/* +** Call sqlite3WalkExpr() for every expression in list p or until +** an abort request is seen. +*/ +SQLITE_PRIVATE int sqlite3WalkExprList(Walker *pWalker, ExprList *p){ + int i; + struct ExprList_item *pItem; + if( p ){ + for(i=p->nExpr, pItem=p->a; i>0; i--, pItem++){ + if( sqlite3WalkExpr(pWalker, pItem->pExpr) ) return WRC_Abort; + } + } + return WRC_Continue; +} + +/* +** Walk all expressions associated with SELECT statement p. Do +** not invoke the SELECT callback on p, but do (of course) invoke +** any expr callbacks and SELECT callbacks that come from subqueries. +** Return WRC_Abort or WRC_Continue. +*/ +SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ + if( sqlite3WalkExprList(pWalker, p->pEList) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, p->pWhere) ) return WRC_Abort; + if( sqlite3WalkExprList(pWalker, p->pGroupBy) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; + if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; +#if !defined(SQLITE_OMIT_WINDOWFUNC) && !defined(SQLITE_OMIT_ALTERTABLE) + { + Parse *pParse = pWalker->pParse; + if( pParse && IN_RENAME_OBJECT ){ + /* The following may return WRC_Abort if there are unresolvable + ** symbols (e.g. a table that does not exist) in a window definition. */ + int rc = walkWindowList(pWalker, p->pWinDefn); + return rc; + } + } +#endif + return WRC_Continue; +} + +/* +** Walk the parse trees associated with all subqueries in the +** FROM clause of SELECT statement p. Do not invoke the select +** callback on p, but do invoke it on each FROM clause subquery +** and on any subqueries further down in the tree. Return +** WRC_Abort or WRC_Continue; +*/ +SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ + SrcList *pSrc; + int i; + struct SrcList_item *pItem; + + pSrc = p->pSrc; + if( pSrc ){ + for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ + if( pItem->pSelect && sqlite3WalkSelect(pWalker, pItem->pSelect) ){ + return WRC_Abort; + } + if( pItem->fg.isTabFunc + && sqlite3WalkExprList(pWalker, pItem->u1.pFuncArg) + ){ + return WRC_Abort; + } + } + } + return WRC_Continue; +} + +/* +** Call sqlite3WalkExpr() for every expression in Select statement p. +** Invoke sqlite3WalkSelect() for subqueries in the FROM clause and +** on the compound select chain, p->pPrior. +** +** If it is not NULL, the xSelectCallback() callback is invoked before +** the walk of the expressions and FROM clause. The xSelectCallback2() +** method is invoked following the walk of the expressions and FROM clause, +** but only if both xSelectCallback and xSelectCallback2 are both non-NULL +** and if the expressions and FROM clause both return WRC_Continue; +** +** Return WRC_Continue under normal conditions. Return WRC_Abort if +** there is an abort request. +** +** If the Walker does not have an xSelectCallback() then this routine +** is a no-op returning WRC_Continue. +*/ +SQLITE_PRIVATE int sqlite3WalkSelect(Walker *pWalker, Select *p){ + int rc; + if( p==0 ) return WRC_Continue; + if( pWalker->xSelectCallback==0 ) return WRC_Continue; + do{ + rc = pWalker->xSelectCallback(pWalker, p); + if( rc ) return rc & WRC_Abort; + if( sqlite3WalkSelectExpr(pWalker, p) + || sqlite3WalkSelectFrom(pWalker, p) + ){ + return WRC_Abort; + } + if( pWalker->xSelectCallback2 ){ + pWalker->xSelectCallback2(pWalker, p); + } + p = p->pPrior; + }while( p!=0 ); + return WRC_Continue; +} + +/* Increase the walkerDepth when entering a subquery, and +** descrease when leaving the subquery. +*/ +SQLITE_PRIVATE int sqlite3WalkerDepthIncrease(Walker *pWalker, Select *pSelect){ + UNUSED_PARAMETER(pSelect); + pWalker->walkerDepth++; + return WRC_Continue; +} +SQLITE_PRIVATE void sqlite3WalkerDepthDecrease(Walker *pWalker, Select *pSelect){ + UNUSED_PARAMETER(pSelect); + pWalker->walkerDepth--; +} + + +/* +** No-op routine for the parse-tree walker. +** +** When this routine is the Walker.xExprCallback then expression trees +** are walked without any actions being taken at each node. Presumably, +** when this routine is used for Walker.xExprCallback then +** Walker.xSelectCallback is set to do something useful for every +** subquery in the parser tree. +*/ +SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return WRC_Continue; +} + +/* +** No-op routine for the parse-tree walker for SELECT statements. +** subquery in the parser tree. +*/ +SQLITE_PRIVATE int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return WRC_Continue; +} + +/************** End of walker.c **********************************************/ +/************** Begin file resolve.c *****************************************/ +/* +** 2008 August 18 +** +** 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 routines used for walking the parser tree and +** resolve all identifiers by associating them with a particular +** table and column. +*/ +/* #include "sqliteInt.h" */ + +/* +** Walk the expression tree pExpr and increase the aggregate function +** depth (the Expr.op2 field) by N on every TK_AGG_FUNCTION node. +** This needs to occur when copying a TK_AGG_FUNCTION node from an +** outer query into an inner subquery. +** +** incrAggFunctionDepth(pExpr,n) is the main routine. incrAggDepth(..) +** is a helper function - a callback for the tree walker. +** +** See also the sqlite3WindowExtraAggFuncDepth() routine in window.c +*/ +static int incrAggDepth(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_AGG_FUNCTION ) pExpr->op2 += pWalker->u.n; + return WRC_Continue; +} +static void incrAggFunctionDepth(Expr *pExpr, int N){ + if( N>0 ){ + Walker w; + memset(&w, 0, sizeof(w)); + w.xExprCallback = incrAggDepth; + w.u.n = N; + sqlite3WalkExpr(&w, pExpr); + } +} + +/* +** Turn the pExpr expression into an alias for the iCol-th column of the +** result set in pEList. +** +** If the reference is followed by a COLLATE operator, then make sure +** the COLLATE operator is preserved. For example: +** +** SELECT a+b, c+d FROM t1 ORDER BY 1 COLLATE nocase; +** +** Should be transformed into: +** +** SELECT a+b, c+d FROM t1 ORDER BY (a+b) COLLATE nocase; +** +** The nSubquery parameter specifies how many levels of subquery the +** alias is removed from the original expression. The usual value is +** zero but it might be more if the alias is contained within a subquery +** of the original expression. The Expr.op2 field of TK_AGG_FUNCTION +** structures must be increased by the nSubquery amount. +*/ +static void resolveAlias( + Parse *pParse, /* Parsing context */ + ExprList *pEList, /* A result set */ + int iCol, /* A column in the result set. 0..pEList->nExpr-1 */ + Expr *pExpr, /* Transform this into an alias to the result set */ + const char *zType, /* "GROUP" or "ORDER" or "" */ + int nSubquery /* Number of subqueries that the label is moving */ +){ + Expr *pOrig; /* The iCol-th column of the result set */ + Expr *pDup; /* Copy of pOrig */ + sqlite3 *db; /* The database connection */ + + assert( iCol>=0 && iColnExpr ); + pOrig = pEList->a[iCol].pExpr; + assert( pOrig!=0 ); + db = pParse->db; + pDup = sqlite3ExprDup(db, pOrig, 0); + if( pDup!=0 ){ + if( zType[0]!='G' ) incrAggFunctionDepth(pDup, nSubquery); + if( pExpr->op==TK_COLLATE ){ + pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); + } + + /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This + ** prevents ExprDelete() from deleting the Expr structure itself, + ** allowing it to be repopulated by the memcpy() on the following line. + ** The pExpr->u.zToken might point into memory that will be freed by the + ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to + ** make a copy of the token before doing the sqlite3DbFree(). + */ + ExprSetProperty(pExpr, EP_Static); + sqlite3ExprDelete(db, pExpr); + memcpy(pExpr, pDup, sizeof(*pExpr)); + if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){ + assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 ); + pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken); + pExpr->flags |= EP_MemToken; + } + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + if( pExpr->y.pWin!=0 ){ + pExpr->y.pWin->pOwner = pExpr; + }else{ + assert( db->mallocFailed ); + } + } + sqlite3DbFree(db, pDup); + } + ExprSetProperty(pExpr, EP_Alias); +} + + +/* +** Return TRUE if the name zCol occurs anywhere in the USING clause. +** +** Return FALSE if the USING clause is NULL or if it does not contain +** zCol. +*/ +static int nameInUsingClause(IdList *pUsing, const char *zCol){ + if( pUsing ){ + int k; + for(k=0; knId; k++){ + if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ) return 1; + } + } + return 0; +} + +/* +** Subqueries stores the original database, table and column names for their +** result sets in ExprList.a[].zSpan, in the form "DATABASE.TABLE.COLUMN". +** Check to see if the zSpan given to this routine matches the zDb, zTab, +** and zCol. If any of zDb, zTab, and zCol are NULL then those fields will +** match anything. +*/ +SQLITE_PRIVATE int sqlite3MatchEName( + const struct ExprList_item *pItem, + const char *zCol, + const char *zTab, + const char *zDb +){ + int n; + const char *zSpan; + if( pItem->eEName!=ENAME_TAB ) return 0; + zSpan = pItem->zEName; + for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} + if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ + return 0; + } + zSpan += n+1; + for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} + if( zTab && (sqlite3StrNICmp(zSpan, zTab, n)!=0 || zTab[n]!=0) ){ + return 0; + } + zSpan += n+1; + if( zCol && sqlite3StrICmp(zSpan, zCol)!=0 ){ + return 0; + } + return 1; +} + +/* +** Return TRUE if the double-quoted string mis-feature should be supported. +*/ +static int areDoubleQuotedStringsEnabled(sqlite3 *db, NameContext *pTopNC){ + if( db->init.busy ) return 1; /* Always support for legacy schemas */ + if( pTopNC->ncFlags & NC_IsDDL ){ + /* Currently parsing a DDL statement */ + if( sqlite3WritableSchema(db) && (db->flags & SQLITE_DqsDML)!=0 ){ + return 1; + } + return (db->flags & SQLITE_DqsDDL)!=0; + }else{ + /* Currently parsing a DML statement */ + return (db->flags & SQLITE_DqsDML)!=0; + } +} + +/* +** The argument is guaranteed to be a non-NULL Expr node of type TK_COLUMN. +** return the appropriate colUsed mask. +*/ +SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr *pExpr){ + int n; + Table *pExTab; + + n = pExpr->iColumn; + pExTab = pExpr->y.pTab; + assert( pExTab!=0 ); + if( (pExTab->tabFlags & TF_HasGenerated)!=0 + && (pExTab->aCol[n].colFlags & COLFLAG_GENERATED)!=0 + ){ + testcase( pExTab->nCol==BMS-1 ); + testcase( pExTab->nCol==BMS ); + return pExTab->nCol>=BMS ? ALLBITS : MASKBIT(pExTab->nCol)-1; + }else{ + testcase( n==BMS-1 ); + testcase( n==BMS ); + if( n>=BMS ) n = BMS-1; + return ((Bitmask)1)<iDb Set the index in db->aDb[] of the database X +** (even if X is implied). +** pExpr->iTable Set to the cursor number for the table obtained +** from pSrcList. +** pExpr->y.pTab Points to the Table structure of X.Y (even if +** X and/or Y are implied.) +** pExpr->iColumn Set to the column number within the table. +** pExpr->op Set to TK_COLUMN. +** pExpr->pLeft Any expression this points to is deleted +** pExpr->pRight Any expression this points to is deleted. +** +** The zDb variable is the name of the database (the "X"). This value may be +** NULL meaning that name is of the form Y.Z or Z. Any available database +** can be used. The zTable variable is the name of the table (the "Y"). This +** value can be NULL if zDb is also NULL. If zTable is NULL it +** means that the form of the name is Z and that columns from any table +** can be used. +** +** If the name cannot be resolved unambiguously, leave an error message +** in pParse and return WRC_Abort. Return WRC_Prune on success. +*/ +static int lookupName( + Parse *pParse, /* The parsing context */ + const char *zDb, /* Name of the database containing table, or NULL */ + const char *zTab, /* Name of table containing column, or NULL */ + const char *zCol, /* Name of the column. */ + NameContext *pNC, /* The name context used to resolve the name */ + Expr *pExpr /* Make this EXPR node point to the selected column */ +){ + int i, j; /* Loop counters */ + int cnt = 0; /* Number of matching column names */ + int cntTab = 0; /* Number of matching table names */ + int nSubquery = 0; /* How many levels of subquery */ + sqlite3 *db = pParse->db; /* The database connection */ + struct SrcList_item *pItem; /* Use for looping over pSrcList items */ + struct SrcList_item *pMatch = 0; /* The matching pSrcList item */ + NameContext *pTopNC = pNC; /* First namecontext in the list */ + Schema *pSchema = 0; /* Schema of the expression */ + int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */ + Table *pTab = 0; /* Table hold the row */ + Column *pCol; /* A column of pTab */ + + assert( pNC ); /* the name context cannot be NULL. */ + assert( zCol ); /* The Z in X.Y.Z cannot be NULL */ + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + + /* Initialize the node to no-match */ + pExpr->iTable = -1; + ExprSetVVAProperty(pExpr, EP_NoReduce); + + /* Translate the schema name in zDb into a pointer to the corresponding + ** schema. If not found, pSchema will remain NULL and nothing will match + ** resulting in an appropriate error message toward the end of this routine + */ + if( zDb ){ + testcase( pNC->ncFlags & NC_PartIdx ); + testcase( pNC->ncFlags & NC_IsCheck ); + if( (pNC->ncFlags & (NC_PartIdx|NC_IsCheck))!=0 ){ + /* Silently ignore database qualifiers inside CHECK constraints and + ** partial indices. Do not raise errors because that might break + ** legacy and because it does not hurt anything to just ignore the + ** database name. */ + zDb = 0; + }else{ + for(i=0; inDb; i++){ + assert( db->aDb[i].zDbSName ); + if( sqlite3StrICmp(db->aDb[i].zDbSName,zDb)==0 ){ + pSchema = db->aDb[i].pSchema; + break; + } + } + if( i==db->nDb && sqlite3StrICmp("main", zDb)==0 ){ + /* This branch is taken when the main database has been renamed + ** using SQLITE_DBCONFIG_MAINDBNAME. */ + pSchema = db->aDb[0].pSchema; + zDb = db->aDb[0].zDbSName; + } + } + } + + /* Start at the inner-most context and move outward until a match is found */ + assert( pNC && cnt==0 ); + do{ + ExprList *pEList; + SrcList *pSrcList = pNC->pSrcList; + + if( pSrcList ){ + for(i=0, pItem=pSrcList->a; inSrc; i++, pItem++){ + u8 hCol; + pTab = pItem->pTab; + assert( pTab!=0 && pTab->zName!=0 ); + assert( pTab->nCol>0 ); + if( pItem->pSelect && (pItem->pSelect->selFlags & SF_NestedFrom)!=0 ){ + int hit = 0; + pEList = pItem->pSelect->pEList; + for(j=0; jnExpr; j++){ + if( sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){ + cnt++; + cntTab = 2; + pMatch = pItem; + pExpr->iColumn = j; + hit = 1; + } + } + if( hit || zTab==0 ) continue; + } + if( zDb && pTab->pSchema!=pSchema ){ + continue; + } + if( zTab ){ + const char *zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName; + assert( zTabName!=0 ); + if( sqlite3StrICmp(zTabName, zTab)!=0 ){ + continue; + } + if( IN_RENAME_OBJECT && pItem->zAlias ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab); + } + } + if( 0==(cntTab++) ){ + pMatch = pItem; + } + hCol = sqlite3StrIHash(zCol); + for(j=0, pCol=pTab->aCol; jnCol; j++, pCol++){ + if( pCol->hName==hCol && sqlite3StrICmp(pCol->zName, zCol)==0 ){ + /* If there has been exactly one prior match and this match + ** is for the right-hand table of a NATURAL JOIN or is in a + ** USING clause, then skip this match. + */ + if( cnt==1 ){ + if( pItem->fg.jointype & JT_NATURAL ) continue; + if( nameInUsingClause(pItem->pUsing, zCol) ) continue; + } + cnt++; + pMatch = pItem; + /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ + pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j; + break; + } + } + } + if( pMatch ){ + pExpr->iTable = pMatch->iCursor; + pExpr->y.pTab = pMatch->pTab; + /* RIGHT JOIN not (yet) supported */ + assert( (pMatch->fg.jointype & JT_RIGHT)==0 ); + if( (pMatch->fg.jointype & JT_LEFT)!=0 ){ + ExprSetProperty(pExpr, EP_CanBeNull); + } + pSchema = pExpr->y.pTab->pSchema; + } + } /* if( pSrcList ) */ + +#if !defined(SQLITE_OMIT_TRIGGER) || !defined(SQLITE_OMIT_UPSERT) + /* If we have not already resolved the name, then maybe + ** it is a new.* or old.* trigger argument reference. Or + ** maybe it is an excluded.* from an upsert. + */ + if( zDb==0 && zTab!=0 && cntTab==0 ){ + pTab = 0; +#ifndef SQLITE_OMIT_TRIGGER + if( pParse->pTriggerTab!=0 ){ + int op = pParse->eTriggerOp; + assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT ); + if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){ + pExpr->iTable = 1; + pTab = pParse->pTriggerTab; + }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){ + pExpr->iTable = 0; + pTab = pParse->pTriggerTab; + } + } +#endif /* SQLITE_OMIT_TRIGGER */ +#ifndef SQLITE_OMIT_UPSERT + if( (pNC->ncFlags & NC_UUpsert)!=0 ){ + Upsert *pUpsert = pNC->uNC.pUpsert; + if( pUpsert && sqlite3StrICmp("excluded",zTab)==0 ){ + pTab = pUpsert->pUpsertSrc->a[0].pTab; + pExpr->iTable = 2; + } + } +#endif /* SQLITE_OMIT_UPSERT */ + + if( pTab ){ + int iCol; + u8 hCol = sqlite3StrIHash(zCol); + pSchema = pTab->pSchema; + cntTab++; + for(iCol=0, pCol=pTab->aCol; iColnCol; iCol++, pCol++){ + if( pCol->hName==hCol && sqlite3StrICmp(pCol->zName, zCol)==0 ){ + if( iCol==pTab->iPKey ){ + iCol = -1; + } + break; + } + } + if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) && VisibleRowid(pTab) ){ + /* IMP: R-51414-32910 */ + iCol = -1; + } + if( iColnCol ){ + cnt++; +#ifndef SQLITE_OMIT_UPSERT + if( pExpr->iTable==2 ){ + testcase( iCol==(-1) ); + if( IN_RENAME_OBJECT ){ + pExpr->iColumn = iCol; + pExpr->y.pTab = pTab; + eNewExprOp = TK_COLUMN; + }else{ + pExpr->iTable = pNC->uNC.pUpsert->regData + iCol; + eNewExprOp = TK_REGISTER; + ExprSetProperty(pExpr, EP_Alias); + } + }else +#endif /* SQLITE_OMIT_UPSERT */ + { +#ifndef SQLITE_OMIT_TRIGGER + if( iCol<0 ){ + pExpr->affExpr = SQLITE_AFF_INTEGER; + }else if( pExpr->iTable==0 ){ + testcase( iCol==31 ); + testcase( iCol==32 ); + pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<y.pTab = pTab; + pExpr->iColumn = (i16)iCol; + eNewExprOp = TK_TRIGGER; +#endif /* SQLITE_OMIT_TRIGGER */ + } + } + } + } +#endif /* !defined(SQLITE_OMIT_TRIGGER) || !defined(SQLITE_OMIT_UPSERT) */ + + /* + ** Perhaps the name is a reference to the ROWID + */ + if( cnt==0 + && cntTab==1 + && pMatch + && (pNC->ncFlags & (NC_IdxExpr|NC_GenCol))==0 + && sqlite3IsRowid(zCol) + && VisibleRowid(pMatch->pTab) + ){ + cnt = 1; + pExpr->iColumn = -1; + pExpr->affExpr = SQLITE_AFF_INTEGER; + } + + /* + ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z + ** might refer to an result-set alias. This happens, for example, when + ** we are resolving names in the WHERE clause of the following command: + ** + ** SELECT a+b AS x FROM table WHERE x<10; + ** + ** In cases like this, replace pExpr with a copy of the expression that + ** forms the result set entry ("a+b" in the example) and return immediately. + ** Note that the expression in the result set should have already been + ** resolved by the time the WHERE clause is resolved. + ** + ** The ability to use an output result-set column in the WHERE, GROUP BY, + ** or HAVING clauses, or as part of a larger expression in the ORDER BY + ** clause is not standard SQL. This is a (goofy) SQLite extension, that + ** is supported for backwards compatibility only. Hence, we issue a warning + ** on sqlite3_log() whenever the capability is used. + */ + if( (pNC->ncFlags & NC_UEList)!=0 + && cnt==0 + && zTab==0 + ){ + pEList = pNC->uNC.pEList; + assert( pEList!=0 ); + for(j=0; jnExpr; j++){ + char *zAs = pEList->a[j].zEName; + if( pEList->a[j].eEName==ENAME_NAME + && sqlite3_stricmp(zAs, zCol)==0 + ){ + Expr *pOrig; + assert( pExpr->pLeft==0 && pExpr->pRight==0 ); + assert( pExpr->x.pList==0 ); + assert( pExpr->x.pSelect==0 ); + pOrig = pEList->a[j].pExpr; + if( (pNC->ncFlags&NC_AllowAgg)==0 && ExprHasProperty(pOrig, EP_Agg) ){ + sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); + return WRC_Abort; + } + if( ExprHasProperty(pOrig, EP_Win) + && ((pNC->ncFlags&NC_AllowWin)==0 || pNC!=pTopNC ) + ){ + sqlite3ErrorMsg(pParse, "misuse of aliased window function %s",zAs); + return WRC_Abort; + } + if( sqlite3ExprVectorSize(pOrig)!=1 ){ + sqlite3ErrorMsg(pParse, "row value misused"); + return WRC_Abort; + } + resolveAlias(pParse, pEList, j, pExpr, "", nSubquery); + cnt = 1; + pMatch = 0; + assert( zTab==0 && zDb==0 ); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pExpr); + } + goto lookupname_end; + } + } + } + + /* Advance to the next name context. The loop will exit when either + ** we have a match (cnt>0) or when we run out of name contexts. + */ + if( cnt ) break; + pNC = pNC->pNext; + nSubquery++; + }while( pNC ); + + + /* + ** If X and Y are NULL (in other words if only the column name Z is + ** supplied) and the value of Z is enclosed in double-quotes, then + ** Z is a string literal if it doesn't match any column names. In that + ** case, we need to return right away and not make any changes to + ** pExpr. + ** + ** Because no reference was made to outer contexts, the pNC->nRef + ** fields are not changed in any context. + */ + if( cnt==0 && zTab==0 ){ + assert( pExpr->op==TK_ID ); + if( ExprHasProperty(pExpr,EP_DblQuoted) + && areDoubleQuotedStringsEnabled(db, pTopNC) + ){ + /* If a double-quoted identifier does not match any known column name, + ** then treat it as a string. + ** + ** This hack was added in the early days of SQLite in a misguided attempt + ** to be compatible with MySQL 3.x, which used double-quotes for strings. + ** I now sorely regret putting in this hack. The effect of this hack is + ** that misspelled identifier names are silently converted into strings + ** rather than causing an error, to the frustration of countless + ** programmers. To all those frustrated programmers, my apologies. + ** + ** Someday, I hope to get rid of this hack. Unfortunately there is + ** a huge amount of legacy SQL that uses it. So for now, we just + ** issue a warning. + */ + sqlite3_log(SQLITE_WARNING, + "double-quoted string literal: \"%w\"", zCol); +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3VdbeAddDblquoteStr(db, pParse->pVdbe, zCol); +#endif + pExpr->op = TK_STRING; + pExpr->y.pTab = 0; + return WRC_Prune; + } + if( sqlite3ExprIdToTrueFalse(pExpr) ){ + return WRC_Prune; + } + } + + /* + ** cnt==0 means there was not match. cnt>1 means there were two or + ** more matches. Either way, we have an error. + */ + if( cnt!=1 ){ + const char *zErr; + zErr = cnt==0 ? "no such column" : "ambiguous column name"; + if( zDb ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol); + }else if( zTab ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zErr, zTab, zCol); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol); + } + pParse->checkSchema = 1; + pTopNC->nErr++; + } + + /* If a column from a table in pSrcList is referenced, then record + ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes + ** bit 0 to be set. Column 1 sets bit 1. And so forth. Bit 63 is + ** set if the 63rd or any subsequent column is used. + ** + ** The colUsed mask is an optimization used to help determine if an + ** index is a covering index. The correct answer is still obtained + ** if the mask contains extra set bits. However, it is important to + ** avoid setting bits beyond the maximum column number of the table. + ** (See ticket [b92e5e8ec2cdbaa1]). + ** + ** If a generated column is referenced, set bits for every column + ** of the table. + */ + if( pExpr->iColumn>=0 && pMatch!=0 ){ + pMatch->colUsed |= sqlite3ExprColUsed(pExpr); + } + + /* Clean up and return + */ + sqlite3ExprDelete(db, pExpr->pLeft); + pExpr->pLeft = 0; + sqlite3ExprDelete(db, pExpr->pRight); + pExpr->pRight = 0; + pExpr->op = eNewExprOp; + ExprSetProperty(pExpr, EP_Leaf); +lookupname_end: + if( cnt==1 ){ + assert( pNC!=0 ); + if( !ExprHasProperty(pExpr, EP_Alias) ){ + sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList); + } + /* Increment the nRef value on all name contexts from TopNC up to + ** the point where the name matched. */ + for(;;){ + assert( pTopNC!=0 ); + pTopNC->nRef++; + if( pTopNC==pNC ) break; + pTopNC = pTopNC->pNext; + } + return WRC_Prune; + } else { + return WRC_Abort; + } +} + +/* +** Allocate and return a pointer to an expression to load the column iCol +** from datasource iSrc in SrcList pSrc. +*/ +SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSrc, int iCol){ + Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0); + if( p ){ + struct SrcList_item *pItem = &pSrc->a[iSrc]; + Table *pTab = p->y.pTab = pItem->pTab; + p->iTable = pItem->iCursor; + if( p->y.pTab->iPKey==iCol ){ + p->iColumn = -1; + }else{ + p->iColumn = (ynVar)iCol; + if( (pTab->tabFlags & TF_HasGenerated)!=0 + && (pTab->aCol[iCol].colFlags & COLFLAG_GENERATED)!=0 + ){ + testcase( pTab->nCol==63 ); + testcase( pTab->nCol==64 ); + pItem->colUsed = pTab->nCol>=64 ? ALLBITS : MASKBIT(pTab->nCol)-1; + }else{ + testcase( iCol==BMS ); + testcase( iCol==BMS-1 ); + pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); + } + } + } + return p; +} + +/* +** Report an error that an expression is not valid for some set of +** pNC->ncFlags values determined by validMask. +** +** static void notValid( +** Parse *pParse, // Leave error message here +** NameContext *pNC, // The name context +** const char *zMsg, // Type of error +** int validMask, // Set of contexts for which prohibited +** Expr *pExpr // Invalidate this expression on error +** ){...} +** +** As an optimization, since the conditional is almost always false +** (because errors are rare), the conditional is moved outside of the +** function call using a macro. +*/ +static void notValidImpl( + Parse *pParse, /* Leave error message here */ + NameContext *pNC, /* The name context */ + const char *zMsg, /* Type of error */ + Expr *pExpr /* Invalidate this expression on error */ +){ + const char *zIn = "partial index WHERE clauses"; + if( pNC->ncFlags & NC_IdxExpr ) zIn = "index expressions"; +#ifndef SQLITE_OMIT_CHECK + else if( pNC->ncFlags & NC_IsCheck ) zIn = "CHECK constraints"; +#endif +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + else if( pNC->ncFlags & NC_GenCol ) zIn = "generated columns"; +#endif + sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn); + if( pExpr ) pExpr->op = TK_NULL; +} +#define sqlite3ResolveNotValid(P,N,M,X,E) \ + assert( ((X)&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol))==0 ); \ + if( ((N)->ncFlags & (X))!=0 ) notValidImpl(P,N,M,E); + +/* +** Expression p should encode a floating point value between 1.0 and 0.0. +** Return 1024 times this value. Or return -1 if p is not a floating point +** value between 1.0 and 0.0. +*/ +static int exprProbability(Expr *p){ + double r = -1.0; + if( p->op!=TK_FLOAT ) return -1; + sqlite3AtoF(p->u.zToken, &r, sqlite3Strlen30(p->u.zToken), SQLITE_UTF8); + assert( r>=0.0 ); + if( r>1.0 ) return -1; + return (int)(r*134217728.0); +} + +/* +** This routine is callback for sqlite3WalkExpr(). +** +** Resolve symbolic names into TK_COLUMN operators for the current +** node in the expression tree. Return 0 to continue the search down +** the tree or 2 to abort the tree walk. +** +** This routine also does error checking and name resolution for +** function names. The operator for aggregate functions is changed +** to TK_AGG_FUNCTION. +*/ +static int resolveExprStep(Walker *pWalker, Expr *pExpr){ + NameContext *pNC; + Parse *pParse; + + pNC = pWalker->u.pNC; + assert( pNC!=0 ); + pParse = pNC->pParse; + assert( pParse==pWalker->pParse ); + +#ifndef NDEBUG + if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){ + SrcList *pSrcList = pNC->pSrcList; + int i; + for(i=0; ipSrcList->nSrc; i++){ + assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursornTab); + } + } +#endif + switch( pExpr->op ){ + +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) + /* The special operator TK_ROW means use the rowid for the first + ** column in the FROM clause. This is used by the LIMIT and ORDER BY + ** clause processing on UPDATE and DELETE statements. + */ + case TK_ROW: { + SrcList *pSrcList = pNC->pSrcList; + struct SrcList_item *pItem; + assert( pSrcList && pSrcList->nSrc==1 ); + pItem = pSrcList->a; + assert( HasRowid(pItem->pTab) && pItem->pTab->pSelect==0 ); + pExpr->op = TK_COLUMN; + pExpr->y.pTab = pItem->pTab; + pExpr->iTable = pItem->iCursor; + pExpr->iColumn = -1; + pExpr->affExpr = SQLITE_AFF_INTEGER; + break; + } +#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) + && !defined(SQLITE_OMIT_SUBQUERY) */ + + /* A column name: ID + ** Or table name and column name: ID.ID + ** Or a database, table and column: ID.ID.ID + ** + ** The TK_ID and TK_OUT cases are combined so that there will only + ** be one call to lookupName(). Then the compiler will in-line + ** lookupName() for a size reduction and performance increase. + */ + case TK_ID: + case TK_DOT: { + const char *zColumn; + const char *zTable; + const char *zDb; + Expr *pRight; + + if( pExpr->op==TK_ID ){ + zDb = 0; + zTable = 0; + zColumn = pExpr->u.zToken; + }else{ + Expr *pLeft = pExpr->pLeft; + testcase( pNC->ncFlags & NC_IdxExpr ); + testcase( pNC->ncFlags & NC_GenCol ); + sqlite3ResolveNotValid(pParse, pNC, "the \".\" operator", + NC_IdxExpr|NC_GenCol, 0); + pRight = pExpr->pRight; + if( pRight->op==TK_ID ){ + zDb = 0; + }else{ + assert( pRight->op==TK_DOT ); + zDb = pLeft->u.zToken; + pLeft = pRight->pLeft; + pRight = pRight->pRight; + } + zTable = pLeft->u.zToken; + zColumn = pRight->u.zToken; + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight); + sqlite3RenameTokenRemap(pParse, (void*)&pExpr->y.pTab, (void*)pLeft); + } + } + return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr); + } + + /* Resolve function names + */ + case TK_FUNCTION: { + ExprList *pList = pExpr->x.pList; /* The argument list */ + int n = pList ? pList->nExpr : 0; /* Number of arguments */ + int no_such_func = 0; /* True if no such function exists */ + int wrong_num_args = 0; /* True if wrong number of arguments */ + int is_agg = 0; /* True if is an aggregate function */ + int nId; /* Number of characters in function name */ + const char *zId; /* The function name. */ + FuncDef *pDef; /* Information about the function */ + u8 enc = ENC(pParse->db); /* The database encoding */ + int savedAllowFlags = (pNC->ncFlags & (NC_AllowAgg | NC_AllowWin)); +#ifndef SQLITE_OMIT_WINDOWFUNC + Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0); +#endif + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + zId = pExpr->u.zToken; + nId = sqlite3Strlen30(zId); + pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); + if( pDef==0 ){ + pDef = sqlite3FindFunction(pParse->db, zId, -2, enc, 0); + if( pDef==0 ){ + no_such_func = 1; + }else{ + wrong_num_args = 1; + } + }else{ + is_agg = pDef->xFinalize!=0; + if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ + ExprSetProperty(pExpr, EP_Unlikely); + if( n==2 ){ + pExpr->iTable = exprProbability(pList->a[1].pExpr); + if( pExpr->iTable<0 ){ + sqlite3ErrorMsg(pParse, + "second argument to likelihood() must be a " + "constant between 0.0 and 1.0"); + pNC->nErr++; + } + }else{ + /* EVIDENCE-OF: R-61304-29449 The unlikely(X) function is + ** equivalent to likelihood(X, 0.0625). + ** EVIDENCE-OF: R-01283-11636 The unlikely(X) function is + ** short-hand for likelihood(X,0.0625). + ** EVIDENCE-OF: R-36850-34127 The likely(X) function is short-hand + ** for likelihood(X,0.9375). + ** EVIDENCE-OF: R-53436-40973 The likely(X) function is equivalent + ** to likelihood(X,0.9375). */ + /* TUNING: unlikely() probability is 0.0625. likely() is 0.9375 */ + pExpr->iTable = pDef->zName[0]=='u' ? 8388608 : 125829120; + } + } +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0,pDef->zName,0); + if( auth!=SQLITE_OK ){ + if( auth==SQLITE_DENY ){ + sqlite3ErrorMsg(pParse, "not authorized to use function: %s", + pDef->zName); + pNC->nErr++; + } + pExpr->op = TK_NULL; + return WRC_Prune; + } + } +#endif + if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){ + /* For the purposes of the EP_ConstFunc flag, date and time + ** functions and other functions that change slowly are considered + ** constant because they are constant for the duration of one query. + ** This allows them to be factored out of inner loops. */ + ExprSetProperty(pExpr,EP_ConstFunc); + } + if( (pDef->funcFlags & SQLITE_FUNC_CONSTANT)==0 ){ + /* Clearly non-deterministic functions like random(), but also + ** date/time functions that use 'now', and other functions like + ** sqlite_version() that might change over time cannot be used + ** in an index or generated column. Curiously, they can be used + ** in a CHECK constraint. SQLServer, MySQL, and PostgreSQL all + ** all this. */ + sqlite3ResolveNotValid(pParse, pNC, "non-deterministic functions", + NC_IdxExpr|NC_PartIdx|NC_GenCol, 0); + }else{ + assert( (NC_SelfRef & 0xff)==NC_SelfRef ); /* Must fit in 8 bits */ + pExpr->op2 = pNC->ncFlags & NC_SelfRef; + if( pNC->ncFlags & NC_FromDDL ) ExprSetProperty(pExpr, EP_FromDDL); + } + if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 + && pParse->nested==0 + && (pParse->db->mDbFlags & DBFLAG_InternalFunc)==0 + ){ + /* Internal-use-only functions are disallowed unless the + ** SQL is being compiled using sqlite3NestedParse() or + ** the SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test-control has be + ** used to activate internal functionsn for testing purposes */ + no_such_func = 1; + pDef = 0; + }else + if( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 + && !IN_RENAME_OBJECT + ){ + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); + } + } + + if( 0==IN_RENAME_OBJECT ){ +#ifndef SQLITE_OMIT_WINDOWFUNC + assert( is_agg==0 || (pDef->funcFlags & SQLITE_FUNC_MINMAX) + || (pDef->xValue==0 && pDef->xInverse==0) + || (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize) + ); + if( pDef && pDef->xValue==0 && pWin ){ + sqlite3ErrorMsg(pParse, + "%.*s() may not be used as a window function", nId, zId + ); + pNC->nErr++; + }else if( + (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) + || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pWin) + || (is_agg && pWin && (pNC->ncFlags & NC_AllowWin)==0) + ){ + const char *zType; + if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pWin ){ + zType = "window"; + }else{ + zType = "aggregate"; + } + sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()",zType,nId,zId); + pNC->nErr++; + is_agg = 0; + } +#else + if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) ){ + sqlite3ErrorMsg(pParse,"misuse of aggregate function %.*s()",nId,zId); + pNC->nErr++; + is_agg = 0; + } +#endif + else if( no_such_func && pParse->db->init.busy==0 +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + && pParse->explain==0 +#endif + ){ + sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); + pNC->nErr++; + }else if( wrong_num_args ){ + sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", + nId, zId); + pNC->nErr++; + } +#ifndef SQLITE_OMIT_WINDOWFUNC + else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3ErrorMsg(pParse, + "FILTER may not be used with non-aggregate %.*s()", + nId, zId + ); + pNC->nErr++; + } +#endif + if( is_agg ){ + /* Window functions may not be arguments of aggregate functions. + ** Or arguments of other window functions. But aggregate functions + ** may be arguments for window functions. */ +#ifndef SQLITE_OMIT_WINDOWFUNC + pNC->ncFlags &= ~(NC_AllowWin | (!pWin ? NC_AllowAgg : 0)); +#else + pNC->ncFlags &= ~NC_AllowAgg; +#endif + } + } +#ifndef SQLITE_OMIT_WINDOWFUNC + else if( ExprHasProperty(pExpr, EP_WinFunc) ){ + is_agg = 1; + } +#endif + sqlite3WalkExprList(pWalker, pList); + if( is_agg ){ +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pWin ){ + Select *pSel = pNC->pWinSelect; + assert( pWin==pExpr->y.pWin ); + if( IN_RENAME_OBJECT==0 ){ + sqlite3WindowUpdate(pParse, pSel ? pSel->pWinDefn : 0, pWin, pDef); + } + sqlite3WalkExprList(pWalker, pWin->pPartition); + sqlite3WalkExprList(pWalker, pWin->pOrderBy); + sqlite3WalkExpr(pWalker, pWin->pFilter); + sqlite3WindowLink(pSel, pWin); + pNC->ncFlags |= NC_HasWin; + }else +#endif /* SQLITE_OMIT_WINDOWFUNC */ + { + NameContext *pNC2 = pNC; + pExpr->op = TK_AGG_FUNCTION; + pExpr->op2 = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); + } +#endif + while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){ + pExpr->op2++; + pNC2 = pNC2->pNext; + } + assert( pDef!=0 || IN_RENAME_OBJECT ); + if( pNC2 && pDef ){ + assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg ); + testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 ); + pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX); + + } + } + pNC->ncFlags |= savedAllowFlags; + } + /* FIX ME: Compute pExpr->affinity based on the expected return + ** type of the function + */ + return WRC_Prune; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_SELECT: + case TK_EXISTS: testcase( pExpr->op==TK_EXISTS ); +#endif + case TK_IN: { + testcase( pExpr->op==TK_IN ); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + int nRef = pNC->nRef; + testcase( pNC->ncFlags & NC_IsCheck ); + testcase( pNC->ncFlags & NC_PartIdx ); + testcase( pNC->ncFlags & NC_IdxExpr ); + testcase( pNC->ncFlags & NC_GenCol ); + sqlite3ResolveNotValid(pParse, pNC, "subqueries", + NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr); + sqlite3WalkSelect(pWalker, pExpr->x.pSelect); + assert( pNC->nRef>=nRef ); + if( nRef!=pNC->nRef ){ + ExprSetProperty(pExpr, EP_VarSelect); + pNC->ncFlags |= NC_VarSelect; + } + } + break; + } + case TK_VARIABLE: { + testcase( pNC->ncFlags & NC_IsCheck ); + testcase( pNC->ncFlags & NC_PartIdx ); + testcase( pNC->ncFlags & NC_IdxExpr ); + testcase( pNC->ncFlags & NC_GenCol ); + sqlite3ResolveNotValid(pParse, pNC, "parameters", + NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr); + break; + } + case TK_IS: + case TK_ISNOT: { + Expr *pRight = sqlite3ExprSkipCollateAndLikely(pExpr->pRight); + assert( !ExprHasProperty(pExpr, EP_Reduced) ); + /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE", + ** and "x IS NOT FALSE". */ + if( pRight && pRight->op==TK_ID ){ + int rc = resolveExprStep(pWalker, pRight); + if( rc==WRC_Abort ) return WRC_Abort; + if( pRight->op==TK_TRUEFALSE ){ + pExpr->op2 = pExpr->op; + pExpr->op = TK_TRUTH; + return WRC_Continue; + } + } + /* Fall thru */ + } + case TK_BETWEEN: + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: { + int nLeft, nRight; + if( pParse->db->mallocFailed ) break; + assert( pExpr->pLeft!=0 ); + nLeft = sqlite3ExprVectorSize(pExpr->pLeft); + if( pExpr->op==TK_BETWEEN ){ + nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[0].pExpr); + if( nRight==nLeft ){ + nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[1].pExpr); + } + }else{ + assert( pExpr->pRight!=0 ); + nRight = sqlite3ExprVectorSize(pExpr->pRight); + } + if( nLeft!=nRight ){ + testcase( pExpr->op==TK_EQ ); + testcase( pExpr->op==TK_NE ); + testcase( pExpr->op==TK_LT ); + testcase( pExpr->op==TK_LE ); + testcase( pExpr->op==TK_GT ); + testcase( pExpr->op==TK_GE ); + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_ISNOT ); + testcase( pExpr->op==TK_BETWEEN ); + sqlite3ErrorMsg(pParse, "row value misused"); + } + break; + } + } + return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; +} + +/* +** pEList is a list of expressions which are really the result set of the +** a SELECT statement. pE is a term in an ORDER BY or GROUP BY clause. +** This routine checks to see if pE is a simple identifier which corresponds +** to the AS-name of one of the terms of the expression list. If it is, +** this routine return an integer between 1 and N where N is the number of +** elements in pEList, corresponding to the matching entry. If there is +** no match, or if pE is not a simple identifier, then this routine +** return 0. +** +** pEList has been resolved. pE has not. +*/ +static int resolveAsName( + Parse *pParse, /* Parsing context for error messages */ + ExprList *pEList, /* List of expressions to scan */ + Expr *pE /* Expression we are trying to match */ +){ + int i; /* Loop counter */ + + UNUSED_PARAMETER(pParse); + + if( pE->op==TK_ID ){ + char *zCol = pE->u.zToken; + for(i=0; inExpr; i++){ + if( pEList->a[i].eEName==ENAME_NAME + && sqlite3_stricmp(pEList->a[i].zEName, zCol)==0 + ){ + return i+1; + } + } + } + return 0; +} + +/* +** pE is a pointer to an expression which is a single term in the +** ORDER BY of a compound SELECT. The expression has not been +** name resolved. +** +** At the point this routine is called, we already know that the +** ORDER BY term is not an integer index into the result set. That +** case is handled by the calling routine. +** +** Attempt to match pE against result set columns in the left-most +** SELECT statement. Return the index i of the matching column, +** as an indication to the caller that it should sort by the i-th column. +** The left-most column is 1. In other words, the value returned is the +** same integer value that would be used in the SQL statement to indicate +** the column. +** +** If there is no match, return 0. Return -1 if an error occurs. +*/ +static int resolveOrderByTermToExprList( + Parse *pParse, /* Parsing context for error messages */ + Select *pSelect, /* The SELECT statement with the ORDER BY clause */ + Expr *pE /* The specific ORDER BY term */ +){ + int i; /* Loop counter */ + ExprList *pEList; /* The columns of the result set */ + NameContext nc; /* Name context for resolving pE */ + sqlite3 *db; /* Database connection */ + int rc; /* Return code from subprocedures */ + u8 savedSuppErr; /* Saved value of db->suppressErr */ + + assert( sqlite3ExprIsInteger(pE, &i)==0 ); + pEList = pSelect->pEList; + + /* Resolve all names in the ORDER BY term expression + */ + memset(&nc, 0, sizeof(nc)); + nc.pParse = pParse; + nc.pSrcList = pSelect->pSrc; + nc.uNC.pEList = pEList; + nc.ncFlags = NC_AllowAgg|NC_UEList; + nc.nErr = 0; + db = pParse->db; + savedSuppErr = db->suppressErr; + if( IN_RENAME_OBJECT==0 ) db->suppressErr = 1; + rc = sqlite3ResolveExprNames(&nc, pE); + db->suppressErr = savedSuppErr; + if( rc ) return 0; + + /* Try to match the ORDER BY expression against an expression + ** in the result set. Return an 1-based index of the matching + ** result-set entry. + */ + for(i=0; inExpr; i++){ + if( sqlite3ExprCompare(0, pEList->a[i].pExpr, pE, -1)<2 ){ + return i+1; + } + } + + /* If no match, return 0. */ + return 0; +} + +/* +** Generate an ORDER BY or GROUP BY term out-of-range error. +*/ +static void resolveOutOfRangeError( + Parse *pParse, /* The error context into which to write the error */ + const char *zType, /* "ORDER" or "GROUP" */ + int i, /* The index (1-based) of the term out of range */ + int mx /* Largest permissible value of i */ +){ + sqlite3ErrorMsg(pParse, + "%r %s BY term out of range - should be " + "between 1 and %d", i, zType, mx); +} + +/* +** Analyze the ORDER BY clause in a compound SELECT statement. Modify +** each term of the ORDER BY clause is a constant integer between 1 +** and N where N is the number of columns in the compound SELECT. +** +** ORDER BY terms that are already an integer between 1 and N are +** unmodified. ORDER BY terms that are integers outside the range of +** 1 through N generate an error. ORDER BY terms that are expressions +** are matched against result set expressions of compound SELECT +** beginning with the left-most SELECT and working toward the right. +** At the first match, the ORDER BY expression is transformed into +** the integer column number. +** +** Return the number of errors seen. +*/ +static int resolveCompoundOrderBy( + Parse *pParse, /* Parsing context. Leave error messages here */ + Select *pSelect /* The SELECT statement containing the ORDER BY */ +){ + int i; + ExprList *pOrderBy; + ExprList *pEList; + sqlite3 *db; + int moreToDo = 1; + + pOrderBy = pSelect->pOrderBy; + if( pOrderBy==0 ) return 0; + db = pParse->db; + if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause"); + return 1; + } + for(i=0; inExpr; i++){ + pOrderBy->a[i].done = 0; + } + pSelect->pNext = 0; + while( pSelect->pPrior ){ + pSelect->pPrior->pNext = pSelect; + pSelect = pSelect->pPrior; + } + while( pSelect && moreToDo ){ + struct ExprList_item *pItem; + moreToDo = 0; + pEList = pSelect->pEList; + assert( pEList!=0 ); + for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ + int iCol = -1; + Expr *pE, *pDup; + if( pItem->done ) continue; + pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr); + if( sqlite3ExprIsInteger(pE, &iCol) ){ + if( iCol<=0 || iCol>pEList->nExpr ){ + resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr); + return 1; + } + }else{ + iCol = resolveAsName(pParse, pEList, pE); + if( iCol==0 ){ + /* Now test if expression pE matches one of the values returned + ** by pSelect. In the usual case this is done by duplicating the + ** expression, resolving any symbols in it, and then comparing + ** it against each expression returned by the SELECT statement. + ** Once the comparisons are finished, the duplicate expression + ** is deleted. + ** + ** Or, if this is running as part of an ALTER TABLE operation, + ** resolve the symbols in the actual expression, not a duplicate. + ** And, if one of the comparisons is successful, leave the expression + ** as is instead of transforming it to an integer as in the usual + ** case. This allows the code in alter.c to modify column + ** refererences within the ORDER BY expression as required. */ + if( IN_RENAME_OBJECT ){ + pDup = pE; + }else{ + pDup = sqlite3ExprDup(db, pE, 0); + } + if( !db->mallocFailed ){ + assert(pDup); + iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); + } + if( !IN_RENAME_OBJECT ){ + sqlite3ExprDelete(db, pDup); + } + } + } + if( iCol>0 ){ + /* Convert the ORDER BY term into an integer column number iCol, + ** taking care to preserve the COLLATE clause if it exists */ + if( !IN_RENAME_OBJECT ){ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return 1; + pNew->flags |= EP_IntValue; + pNew->u.iValue = iCol; + if( pItem->pExpr==pE ){ + pItem->pExpr = pNew; + }else{ + Expr *pParent = pItem->pExpr; + assert( pParent->op==TK_COLLATE ); + while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; + assert( pParent->pLeft==pE ); + pParent->pLeft = pNew; + } + sqlite3ExprDelete(db, pE); + pItem->u.x.iOrderByCol = (u16)iCol; + } + pItem->done = 1; + }else{ + moreToDo = 1; + } + } + pSelect = pSelect->pNext; + } + for(i=0; inExpr; i++){ + if( pOrderBy->a[i].done==0 ){ + sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any " + "column in the result set", i+1); + return 1; + } + } + return 0; +} + +/* +** Check every term in the ORDER BY or GROUP BY clause pOrderBy of +** the SELECT statement pSelect. If any term is reference to a +** result set expression (as determined by the ExprList.a.u.x.iOrderByCol +** field) then convert that term into a copy of the corresponding result set +** column. +** +** If any errors are detected, add an error message to pParse and +** return non-zero. Return zero if no errors are seen. +*/ +SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy( + Parse *pParse, /* Parsing context. Leave error messages here */ + Select *pSelect, /* The SELECT statement containing the clause */ + ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */ + const char *zType /* "ORDER" or "GROUP" */ +){ + int i; + sqlite3 *db = pParse->db; + ExprList *pEList; + struct ExprList_item *pItem; + + if( pOrderBy==0 || pParse->db->mallocFailed || IN_RENAME_OBJECT ) return 0; + if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); + return 1; + } + pEList = pSelect->pEList; + assert( pEList!=0 ); /* sqlite3SelectNew() guarantees this */ + for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ + if( pItem->u.x.iOrderByCol ){ + if( pItem->u.x.iOrderByCol>pEList->nExpr ){ + resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr); + return 1; + } + resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol-1, pItem->pExpr, + zType,0); + } + } + return 0; +} + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Walker callback for windowRemoveExprFromSelect(). +*/ +static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ + UNUSED_PARAMETER(pWalker); + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window *pWin = pExpr->y.pWin; + sqlite3WindowUnlinkFromSelect(pWin); + } + return WRC_Continue; +} + +/* +** Remove any Window objects owned by the expression pExpr from the +** Select.pWin list of Select object pSelect. +*/ +static void windowRemoveExprFromSelect(Select *pSelect, Expr *pExpr){ + if( pSelect->pWin ){ + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.xExprCallback = resolveRemoveWindowsCb; + sWalker.u.pSelect = pSelect; + sqlite3WalkExpr(&sWalker, pExpr); + } +} +#else +# define windowRemoveExprFromSelect(a, b) +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. +** The Name context of the SELECT statement is pNC. zType is either +** "ORDER" or "GROUP" depending on which type of clause pOrderBy is. +** +** This routine resolves each term of the clause into an expression. +** If the order-by term is an integer I between 1 and N (where N is the +** number of columns in the result set of the SELECT) then the expression +** in the resolution is a copy of the I-th result-set expression. If +** the order-by term is an identifier that corresponds to the AS-name of +** a result-set expression, then the term resolves to a copy of the +** result-set expression. Otherwise, the expression is resolved in +** the usual way - using sqlite3ResolveExprNames(). +** +** This routine returns the number of errors. If errors occur, then +** an appropriate error message might be left in pParse. (OOM errors +** excepted.) +*/ +static int resolveOrderGroupBy( + NameContext *pNC, /* The name context of the SELECT statement */ + Select *pSelect, /* The SELECT statement holding pOrderBy */ + ExprList *pOrderBy, /* An ORDER BY or GROUP BY clause to resolve */ + const char *zType /* Either "ORDER" or "GROUP", as appropriate */ +){ + int i, j; /* Loop counters */ + int iCol; /* Column number */ + struct ExprList_item *pItem; /* A term of the ORDER BY clause */ + Parse *pParse; /* Parsing context */ + int nResult; /* Number of terms in the result set */ + + if( pOrderBy==0 ) return 0; + nResult = pSelect->pEList->nExpr; + pParse = pNC->pParse; + for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ + Expr *pE = pItem->pExpr; + Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pE); + if( zType[0]!='G' ){ + iCol = resolveAsName(pParse, pSelect->pEList, pE2); + if( iCol>0 ){ + /* If an AS-name match is found, mark this ORDER BY column as being + ** a copy of the iCol-th result-set column. The subsequent call to + ** sqlite3ResolveOrderGroupBy() will convert the expression to a + ** copy of the iCol-th result-set expression. */ + pItem->u.x.iOrderByCol = (u16)iCol; + continue; + } + } + if( sqlite3ExprIsInteger(pE2, &iCol) ){ + /* The ORDER BY term is an integer constant. Again, set the column + ** number so that sqlite3ResolveOrderGroupBy() will convert the + ** order-by term to a copy of the result-set expression */ + if( iCol<1 || iCol>0xffff ){ + resolveOutOfRangeError(pParse, zType, i+1, nResult); + return 1; + } + pItem->u.x.iOrderByCol = (u16)iCol; + continue; + } + + /* Otherwise, treat the ORDER BY term as an ordinary expression */ + pItem->u.x.iOrderByCol = 0; + if( sqlite3ResolveExprNames(pNC, pE) ){ + return 1; + } + for(j=0; jpEList->nExpr; j++){ + if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ + /* Since this expresion is being changed into a reference + ** to an identical expression in the result set, remove all Window + ** objects belonging to the expression from the Select.pWin list. */ + windowRemoveExprFromSelect(pSelect, pE); + pItem->u.x.iOrderByCol = j+1; + } + } + } + return sqlite3ResolveOrderGroupBy(pParse, pSelect, pOrderBy, zType); +} + +/* +** Resolve names in the SELECT statement p and all of its descendants. +*/ +static int resolveSelectStep(Walker *pWalker, Select *p){ + NameContext *pOuterNC; /* Context that contains this SELECT */ + NameContext sNC; /* Name context of this SELECT */ + int isCompound; /* True if p is a compound select */ + int nCompound; /* Number of compound terms processed so far */ + Parse *pParse; /* Parsing context */ + int i; /* Loop counter */ + ExprList *pGroupBy; /* The GROUP BY clause */ + Select *pLeftmost; /* Left-most of SELECT of a compound */ + sqlite3 *db; /* Database connection */ + + + assert( p!=0 ); + if( p->selFlags & SF_Resolved ){ + return WRC_Prune; + } + pOuterNC = pWalker->u.pNC; + pParse = pWalker->pParse; + db = pParse->db; + + /* Normally sqlite3SelectExpand() will be called first and will have + ** already expanded this SELECT. However, if this is a subquery within + ** an expression, sqlite3ResolveExprNames() will be called without a + ** prior call to sqlite3SelectExpand(). When that happens, let + ** sqlite3SelectPrep() do all of the processing for this SELECT. + ** sqlite3SelectPrep() will invoke both sqlite3SelectExpand() and + ** this routine in the correct order. + */ + if( (p->selFlags & SF_Expanded)==0 ){ + sqlite3SelectPrep(pParse, p, pOuterNC); + return (pParse->nErr || db->mallocFailed) ? WRC_Abort : WRC_Prune; + } + + isCompound = p->pPrior!=0; + nCompound = 0; + pLeftmost = p; + while( p ){ + assert( (p->selFlags & SF_Expanded)!=0 ); + assert( (p->selFlags & SF_Resolved)==0 ); + p->selFlags |= SF_Resolved; + + /* Resolve the expressions in the LIMIT and OFFSET clauses. These + ** are not allowed to refer to any names, so pass an empty NameContext. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pWinSelect = p; + if( sqlite3ResolveExprNames(&sNC, p->pLimit) ){ + return WRC_Abort; + } + + /* If the SF_Converted flags is set, then this Select object was + ** was created by the convertCompoundSelectToSubquery() function. + ** In this case the ORDER BY clause (p->pOrderBy) should be resolved + ** as if it were part of the sub-query, not the parent. This block + ** moves the pOrderBy down to the sub-query. It will be moved back + ** after the names have been resolved. */ + if( p->selFlags & SF_Converted ){ + Select *pSub = p->pSrc->a[0].pSelect; + assert( p->pSrc->nSrc==1 && p->pOrderBy ); + assert( pSub->pPrior && pSub->pOrderBy==0 ); + pSub->pOrderBy = p->pOrderBy; + p->pOrderBy = 0; + } + + /* Recursively resolve names in all subqueries + */ + for(i=0; ipSrc->nSrc; i++){ + struct SrcList_item *pItem = &p->pSrc->a[i]; + if( pItem->pSelect && (pItem->pSelect->selFlags & SF_Resolved)==0 ){ + NameContext *pNC; /* Used to iterate name contexts */ + int nRef = 0; /* Refcount for pOuterNC and outer contexts */ + const char *zSavedContext = pParse->zAuthContext; + + /* Count the total number of references to pOuterNC and all of its + ** parent contexts. After resolving references to expressions in + ** pItem->pSelect, check if this value has changed. If so, then + ** SELECT statement pItem->pSelect must be correlated. Set the + ** pItem->fg.isCorrelated flag if this is the case. */ + for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef += pNC->nRef; + + if( pItem->zName ) pParse->zAuthContext = pItem->zName; + sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC); + pParse->zAuthContext = zSavedContext; + if( pParse->nErr || db->mallocFailed ) return WRC_Abort; + + for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef -= pNC->nRef; + assert( pItem->fg.isCorrelated==0 && nRef<=0 ); + pItem->fg.isCorrelated = (nRef!=0); + } + } + + /* Set up the local name-context to pass to sqlite3ResolveExprNames() to + ** resolve the result-set expression list. + */ + sNC.ncFlags = NC_AllowAgg|NC_AllowWin; + sNC.pSrcList = p->pSrc; + sNC.pNext = pOuterNC; + + /* Resolve names in the result set. */ + if( sqlite3ResolveExprListNames(&sNC, p->pEList) ) return WRC_Abort; + sNC.ncFlags &= ~NC_AllowWin; + + /* If there are no aggregate functions in the result-set, and no GROUP BY + ** expression, do not allow aggregates in any of the other expressions. + */ + assert( (p->selFlags & SF_Aggregate)==0 ); + pGroupBy = p->pGroupBy; + if( pGroupBy || (sNC.ncFlags & NC_HasAgg)!=0 ){ + assert( NC_MinMaxAgg==SF_MinMaxAgg ); + p->selFlags |= SF_Aggregate | (sNC.ncFlags&NC_MinMaxAgg); + }else{ + sNC.ncFlags &= ~NC_AllowAgg; + } + + /* If a HAVING clause is present, then there must be a GROUP BY clause. + */ + if( p->pHaving && !pGroupBy ){ + sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); + return WRC_Abort; + } + + /* Add the output column list to the name-context before parsing the + ** other expressions in the SELECT statement. This is so that + ** expressions in the WHERE clause (etc.) can refer to expressions by + ** aliases in the result set. + ** + ** Minor point: If this is the case, then the expression will be + ** re-evaluated for each reference to it. + */ + assert( (sNC.ncFlags & (NC_UAggInfo|NC_UUpsert))==0 ); + sNC.uNC.pEList = p->pEList; + sNC.ncFlags |= NC_UEList; + if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort; + if( sqlite3ResolveExprNames(&sNC, p->pWhere) ) return WRC_Abort; + + /* Resolve names in table-valued-function arguments */ + for(i=0; ipSrc->nSrc; i++){ + struct SrcList_item *pItem = &p->pSrc->a[i]; + if( pItem->fg.isTabFunc + && sqlite3ResolveExprListNames(&sNC, pItem->u1.pFuncArg) + ){ + return WRC_Abort; + } + } + + /* The ORDER BY and GROUP BY clauses may not refer to terms in + ** outer queries + */ + sNC.pNext = 0; + sNC.ncFlags |= NC_AllowAgg|NC_AllowWin; + + /* If this is a converted compound query, move the ORDER BY clause from + ** the sub-query back to the parent query. At this point each term + ** within the ORDER BY clause has been transformed to an integer value. + ** These integers will be replaced by copies of the corresponding result + ** set expressions by the call to resolveOrderGroupBy() below. */ + if( p->selFlags & SF_Converted ){ + Select *pSub = p->pSrc->a[0].pSelect; + p->pOrderBy = pSub->pOrderBy; + pSub->pOrderBy = 0; + } + + /* Process the ORDER BY clause for singleton SELECT statements. + ** The ORDER BY clause for compounds SELECT statements is handled + ** below, after all of the result-sets for all of the elements of + ** the compound have been resolved. + ** + ** If there is an ORDER BY clause on a term of a compound-select other + ** than the right-most term, then that is a syntax error. But the error + ** is not detected until much later, and so we need to go ahead and + ** resolve those symbols on the incorrect ORDER BY for consistency. + */ + if( isCompound<=nCompound /* Defer right-most ORDER BY of a compound */ + && resolveOrderGroupBy(&sNC, p, p->pOrderBy, "ORDER") + ){ + return WRC_Abort; + } + if( db->mallocFailed ){ + return WRC_Abort; + } + sNC.ncFlags &= ~NC_AllowWin; + + /* Resolve the GROUP BY clause. At the same time, make sure + ** the GROUP BY clause does not contain aggregate functions. + */ + if( pGroupBy ){ + struct ExprList_item *pItem; + + if( resolveOrderGroupBy(&sNC, p, pGroupBy, "GROUP") || db->mallocFailed ){ + return WRC_Abort; + } + for(i=0, pItem=pGroupBy->a; inExpr; i++, pItem++){ + if( ExprHasProperty(pItem->pExpr, EP_Agg) ){ + sqlite3ErrorMsg(pParse, "aggregate functions are not allowed in " + "the GROUP BY clause"); + return WRC_Abort; + } + } + } + +#ifndef SQLITE_OMIT_WINDOWFUNC + if( IN_RENAME_OBJECT ){ + Window *pWin; + for(pWin=p->pWinDefn; pWin; pWin=pWin->pNextWin){ + if( sqlite3ResolveExprListNames(&sNC, pWin->pOrderBy) + || sqlite3ResolveExprListNames(&sNC, pWin->pPartition) + ){ + return WRC_Abort; + } + } + } +#endif + + /* If this is part of a compound SELECT, check that it has the right + ** number of expressions in the select list. */ + if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ + sqlite3SelectWrongNumTermsError(pParse, p->pNext); + return WRC_Abort; + } + + /* Advance to the next term of the compound + */ + p = p->pPrior; + nCompound++; + } + + /* Resolve the ORDER BY on a compound SELECT after all terms of + ** the compound have been resolved. + */ + if( isCompound && resolveCompoundOrderBy(pParse, pLeftmost) ){ + return WRC_Abort; + } + + return WRC_Prune; +} + +/* +** This routine walks an expression tree and resolves references to +** table columns and result-set columns. At the same time, do error +** checking on function usage and set a flag if any aggregate functions +** are seen. +** +** To resolve table columns references we look for nodes (or subtrees) of the +** form X.Y.Z or Y.Z or just Z where +** +** X: The name of a database. Ex: "main" or "temp" or +** the symbolic name assigned to an ATTACH-ed database. +** +** Y: The name of a table in a FROM clause. Or in a trigger +** one of the special names "old" or "new". +** +** Z: The name of a column in table Y. +** +** The node at the root of the subtree is modified as follows: +** +** Expr.op Changed to TK_COLUMN +** Expr.pTab Points to the Table object for X.Y +** Expr.iColumn The column index in X.Y. -1 for the rowid. +** Expr.iTable The VDBE cursor number for X.Y +** +** +** To resolve result-set references, look for expression nodes of the +** form Z (with no X and Y prefix) where the Z matches the right-hand +** size of an AS clause in the result-set of a SELECT. The Z expression +** is replaced by a copy of the left-hand side of the result-set expression. +** Table-name and function resolution occurs on the substituted expression +** tree. For example, in: +** +** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY x; +** +** The "x" term of the order by is replaced by "a+b" to render: +** +** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY a+b; +** +** Function calls are checked to make sure that the function is +** defined and that the correct number of arguments are specified. +** If the function is an aggregate function, then the NC_HasAgg flag is +** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION. +** If an expression contains aggregate functions then the EP_Agg +** property on the expression is set. +** +** An error message is left in pParse if anything is amiss. The number +** if errors is returned. +*/ +SQLITE_PRIVATE int sqlite3ResolveExprNames( + NameContext *pNC, /* Namespace to resolve expressions in. */ + Expr *pExpr /* The expression to be analyzed. */ +){ + int savedHasAgg; + Walker w; + + if( pExpr==0 ) return SQLITE_OK; + savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + w.pParse = pNC->pParse; + w.xExprCallback = resolveExprStep; + w.xSelectCallback = resolveSelectStep; + w.xSelectCallback2 = 0; + w.u.pNC = pNC; +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight += pExpr->nHeight; + if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){ + return SQLITE_ERROR; + } +#endif + sqlite3WalkExpr(&w, pExpr); +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight -= pExpr->nHeight; +#endif + assert( EP_Agg==NC_HasAgg ); + assert( EP_Win==NC_HasWin ); + testcase( pNC->ncFlags & NC_HasAgg ); + testcase( pNC->ncFlags & NC_HasWin ); + ExprSetProperty(pExpr, pNC->ncFlags & (NC_HasAgg|NC_HasWin) ); + pNC->ncFlags |= savedHasAgg; + return pNC->nErr>0 || w.pParse->nErr>0; +} + +/* +** Resolve all names for all expression in an expression list. This is +** just like sqlite3ResolveExprNames() except that it works for an expression +** list rather than a single expression. +*/ +SQLITE_PRIVATE int sqlite3ResolveExprListNames( + NameContext *pNC, /* Namespace to resolve expressions in. */ + ExprList *pList /* The expression list to be analyzed. */ +){ + int i; + int savedHasAgg = 0; + Walker w; + if( pList==0 ) return WRC_Continue; + w.pParse = pNC->pParse; + w.xExprCallback = resolveExprStep; + w.xSelectCallback = resolveSelectStep; + w.xSelectCallback2 = 0; + w.u.pNC = pNC; + savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + for(i=0; inExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + if( pExpr==0 ) continue; +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight += pExpr->nHeight; + if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){ + return WRC_Abort; + } +#endif + sqlite3WalkExpr(&w, pExpr); +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight -= pExpr->nHeight; +#endif + assert( EP_Agg==NC_HasAgg ); + assert( EP_Win==NC_HasWin ); + testcase( pNC->ncFlags & NC_HasAgg ); + testcase( pNC->ncFlags & NC_HasWin ); + if( pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin) ){ + ExprSetProperty(pExpr, pNC->ncFlags & (NC_HasAgg|NC_HasWin) ); + savedHasAgg |= pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + } + if( pNC->nErr>0 || w.pParse->nErr>0 ) return WRC_Abort; + } + pNC->ncFlags |= savedHasAgg; + return WRC_Continue; +} + +/* +** Resolve all names in all expressions of a SELECT and in all +** decendents of the SELECT, including compounds off of p->pPrior, +** subqueries in expressions, and subqueries used as FROM clause +** terms. +** +** See sqlite3ResolveExprNames() for a description of the kinds of +** transformations that occur. +** +** All SELECT statements should have been expanded using +** sqlite3SelectExpand() prior to invoking this routine. +*/ +SQLITE_PRIVATE void sqlite3ResolveSelectNames( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + NameContext *pOuterNC /* Name context for parent SELECT statement */ +){ + Walker w; + + assert( p!=0 ); + w.xExprCallback = resolveExprStep; + w.xSelectCallback = resolveSelectStep; + w.xSelectCallback2 = 0; + w.pParse = pParse; + w.u.pNC = pOuterNC; + sqlite3WalkSelect(&w, p); +} + +/* +** Resolve names in expressions that can only reference a single table +** or which cannot reference any tables at all. Examples: +** +** "type" flag +** ------------ +** (1) CHECK constraints NC_IsCheck +** (2) WHERE clauses on partial indices NC_PartIdx +** (3) Expressions in indexes on expressions NC_IdxExpr +** (4) Expression arguments to VACUUM INTO. 0 +** (5) GENERATED ALWAYS as expressions NC_GenCol +** +** In all cases except (4), the Expr.iTable value for Expr.op==TK_COLUMN +** nodes of the expression is set to -1 and the Expr.iColumn value is +** set to the column number. In case (4), TK_COLUMN nodes cause an error. +** +** Any errors cause an error message to be set in pParse. +*/ +SQLITE_PRIVATE int sqlite3ResolveSelfReference( + Parse *pParse, /* Parsing context */ + Table *pTab, /* The table being referenced, or NULL */ + int type, /* NC_IsCheck, NC_PartIdx, NC_IdxExpr, NC_GenCol, or 0 */ + Expr *pExpr, /* Expression to resolve. May be NULL. */ + ExprList *pList /* Expression list to resolve. May be NULL. */ +){ + SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ + NameContext sNC; /* Name context for pParse->pNewTable */ + int rc; + + assert( type==0 || pTab!=0 ); + assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr + || type==NC_GenCol || pTab==0 ); + memset(&sNC, 0, sizeof(sNC)); + memset(&sSrc, 0, sizeof(sSrc)); + if( pTab ){ + sSrc.nSrc = 1; + sSrc.a[0].zName = pTab->zName; + sSrc.a[0].pTab = pTab; + sSrc.a[0].iCursor = -1; + if( pTab->pSchema!=pParse->db->aDb[1].pSchema ){ + /* Cause EP_FromDDL to be set on TK_FUNCTION nodes of non-TEMP + ** schema elements */ + type |= NC_FromDDL; + } + } + sNC.pParse = pParse; + sNC.pSrcList = &sSrc; + sNC.ncFlags = type | NC_IsDDL; + if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; + if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList); + return rc; +} + +/************** End of resolve.c *********************************************/ +/************** Begin file expr.c ********************************************/ +/* +** 2001 September 15 +** +** 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 routines used for analyzing expressions and +** for generating VDBE code that evaluates expressions in SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* Forward declarations */ +static void exprCodeBetween(Parse*,Expr*,int,void(*)(Parse*,Expr*,int,int),int); +static int exprCodeVector(Parse *pParse, Expr *p, int *piToFree); + +/* +** Return the affinity character for a single column of a table. +*/ +SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table *pTab, int iCol){ + assert( iColnCol ); + return iCol>=0 ? pTab->aCol[iCol].affinity : SQLITE_AFF_INTEGER; +} + +/* +** Return the 'affinity' of the expression pExpr if any. +** +** If pExpr is a column, a reference to a column via an 'AS' alias, +** or a sub-select with a column as the return value, then the +** affinity of that column is returned. Otherwise, 0x00 is returned, +** indicating no affinity for the expression. +** +** i.e. the WHERE clause expressions in the following statements all +** have an affinity: +** +** CREATE TABLE t1(a); +** SELECT * FROM t1 WHERE a; +** SELECT a AS b FROM t1 WHERE b; +** SELECT * FROM t1 WHERE (select a from t1); +*/ +SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr){ + int op; + while( ExprHasProperty(pExpr, EP_Skip) ){ + assert( pExpr->op==TK_COLLATE || pExpr->op==TK_IF_NULL_ROW ); + pExpr = pExpr->pLeft; + assert( pExpr!=0 ); + } + op = pExpr->op; + if( op==TK_SELECT ){ + assert( pExpr->flags&EP_xIsSelect ); + if( ALWAYS(pExpr->x.pSelect) + && pExpr->x.pSelect->pEList + && ALWAYS(pExpr->x.pSelect->pEList->a[0].pExpr) + ){ + return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr); + } + } + if( op==TK_REGISTER ) op = pExpr->op2; +#ifndef SQLITE_OMIT_CAST + if( op==TK_CAST ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + return sqlite3AffinityType(pExpr->u.zToken, 0); + } +#endif + if( (op==TK_AGG_COLUMN || op==TK_COLUMN) && pExpr->y.pTab ){ + return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); + } + if( op==TK_SELECT_COLUMN ){ + assert( pExpr->pLeft->flags&EP_xIsSelect ); + return sqlite3ExprAffinity( + pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr + ); + } + if( op==TK_VECTOR ){ + return sqlite3ExprAffinity(pExpr->x.pList->a[0].pExpr); + } + return pExpr->affExpr; +} + +/* +** Set the collating sequence for expression pExpr to be the collating +** sequence named by pToken. Return a pointer to a new Expr node that +** implements the COLLATE operator. +** +** If a memory allocation error occurs, that fact is recorded in pParse->db +** and the pExpr parameter is returned unchanged. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* Add the "COLLATE" clause to this expression */ + const Token *pCollName, /* Name of collating sequence */ + int dequote /* True to dequote pCollName */ +){ + if( pCollName->n>0 ){ + Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLLATE, pCollName, dequote); + if( pNew ){ + pNew->pLeft = pExpr; + pNew->flags |= EP_Collate|EP_Skip; + pExpr = pNew; + } + } + return pExpr; +} +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){ + Token s; + assert( zC!=0 ); + sqlite3TokenInit(&s, (char*)zC); + return sqlite3ExprAddCollateToken(pParse, pExpr, &s, 0); +} + +/* +** Skip over any TK_COLLATE operators. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ + while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ + assert( pExpr->op==TK_COLLATE || pExpr->op==TK_IF_NULL_ROW ); + pExpr = pExpr->pLeft; + } + return pExpr; +} + +/* +** Skip over any TK_COLLATE operators and/or any unlikely() +** or likelihood() or likely() functions at the root of an +** expression. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ + while( pExpr && ExprHasProperty(pExpr, EP_Skip|EP_Unlikely) ){ + if( ExprHasProperty(pExpr, EP_Unlikely) ){ + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + assert( pExpr->x.pList->nExpr>0 ); + assert( pExpr->op==TK_FUNCTION ); + pExpr = pExpr->x.pList->a[0].pExpr; + }else{ + assert( pExpr->op==TK_COLLATE || pExpr->op==TK_IF_NULL_ROW ); + pExpr = pExpr->pLeft; + } + } + return pExpr; +} + +/* +** Return the collation sequence for the expression pExpr. If +** there is no defined collating sequence, return NULL. +** +** See also: sqlite3ExprNNCollSeq() +** +** The sqlite3ExprNNCollSeq() works the same exact that it returns the +** default collation if pExpr has no defined collation. +** +** The collating sequence might be determined by a COLLATE operator +** or by the presence of a column with a defined collating sequence. +** COLLATE operators take first precedence. Left operands take +** precedence over right operands. +*/ +SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ + sqlite3 *db = pParse->db; + CollSeq *pColl = 0; + const Expr *p = pExpr; + while( p ){ + int op = p->op; + if( op==TK_REGISTER ) op = p->op2; + if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER) + && p->y.pTab!=0 + ){ + /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally + ** a TK_COLUMN but was previously evaluated and cached in a register */ + int j = p->iColumn; + if( j>=0 ){ + const char *zColl = p->y.pTab->aCol[j].zColl; + pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); + } + break; + } + if( op==TK_CAST || op==TK_UPLUS ){ + p = p->pLeft; + continue; + } + if( op==TK_VECTOR ){ + p = p->x.pList->a[0].pExpr; + continue; + } + if( op==TK_COLLATE ){ + pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); + break; + } + if( p->flags & EP_Collate ){ + if( p->pLeft && (p->pLeft->flags & EP_Collate)!=0 ){ + p = p->pLeft; + }else{ + Expr *pNext = p->pRight; + /* The Expr.x union is never used at the same time as Expr.pRight */ + assert( p->x.pList==0 || p->pRight==0 ); + if( p->x.pList!=0 + && !db->mallocFailed + && ALWAYS(!ExprHasProperty(p, EP_xIsSelect)) + ){ + int i; + for(i=0; ix.pList->nExpr; i++){ + if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){ + pNext = p->x.pList->a[i].pExpr; + break; + } + } + } + p = pNext; + } + }else{ + break; + } + } + if( sqlite3CheckCollSeq(pParse, pColl) ){ + pColl = 0; + } + return pColl; +} + +/* +** Return the collation sequence for the expression pExpr. If +** there is no defined collating sequence, return a pointer to the +** defautl collation sequence. +** +** See also: sqlite3ExprCollSeq() +** +** The sqlite3ExprCollSeq() routine works the same except that it +** returns NULL if there is no defined collation. +*/ +SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, const Expr *pExpr){ + CollSeq *p = sqlite3ExprCollSeq(pParse, pExpr); + if( p==0 ) p = pParse->db->pDfltColl; + assert( p!=0 ); + return p; +} + +/* +** Return TRUE if the two expressions have equivalent collating sequences. +*/ +SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse *pParse, const Expr *pE1, const Expr *pE2){ + CollSeq *pColl1 = sqlite3ExprNNCollSeq(pParse, pE1); + CollSeq *pColl2 = sqlite3ExprNNCollSeq(pParse, pE2); + return sqlite3StrICmp(pColl1->zName, pColl2->zName)==0; +} + +/* +** pExpr is an operand of a comparison operator. aff2 is the +** type affinity of the other operand. This routine returns the +** type affinity that should be used for the comparison operator. +*/ +SQLITE_PRIVATE char sqlite3CompareAffinity(const Expr *pExpr, char aff2){ + char aff1 = sqlite3ExprAffinity(pExpr); + if( aff1>SQLITE_AFF_NONE && aff2>SQLITE_AFF_NONE ){ + /* Both sides of the comparison are columns. If one has numeric + ** affinity, use that. Otherwise use no affinity. + */ + if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ + return SQLITE_AFF_NUMERIC; + }else{ + return SQLITE_AFF_BLOB; + } + }else{ + /* One side is a column, the other is not. Use the columns affinity. */ + assert( aff1<=SQLITE_AFF_NONE || aff2<=SQLITE_AFF_NONE ); + return (aff1<=SQLITE_AFF_NONE ? aff2 : aff1) | SQLITE_AFF_NONE; + } +} + +/* +** pExpr is a comparison operator. Return the type affinity that should +** be applied to both operands prior to doing the comparison. +*/ +static char comparisonAffinity(const Expr *pExpr){ + char aff; + assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT || + pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE || + pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT ); + assert( pExpr->pLeft ); + aff = sqlite3ExprAffinity(pExpr->pLeft); + if( pExpr->pRight ){ + aff = sqlite3CompareAffinity(pExpr->pRight, aff); + }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff); + }else if( aff==0 ){ + aff = SQLITE_AFF_BLOB; + } + return aff; +} + +/* +** pExpr is a comparison expression, eg. '=', '<', IN(...) etc. +** idx_affinity is the affinity of an indexed column. Return true +** if the index with affinity idx_affinity may be used to implement +** the comparison in pExpr. +*/ +SQLITE_PRIVATE int sqlite3IndexAffinityOk(const Expr *pExpr, char idx_affinity){ + char aff = comparisonAffinity(pExpr); + if( affflags & EP_Collate ){ + pColl = sqlite3ExprCollSeq(pParse, pLeft); + }else if( pRight && (pRight->flags & EP_Collate)!=0 ){ + pColl = sqlite3ExprCollSeq(pParse, pRight); + }else{ + pColl = sqlite3ExprCollSeq(pParse, pLeft); + if( !pColl ){ + pColl = sqlite3ExprCollSeq(pParse, pRight); + } + } + return pColl; +} + +/* Expresssion p is a comparison operator. Return a collation sequence +** appropriate for the comparison operator. +** +** This is normally just a wrapper around sqlite3BinaryCompareCollSeq(). +** However, if the OP_Commuted flag is set, then the order of the operands +** is reversed in the sqlite3BinaryCompareCollSeq() call so that the +** correct collating sequence is found. +*/ +SQLITE_PRIVATE CollSeq *sqlite3ExprCompareCollSeq(Parse *pParse, const Expr *p){ + if( ExprHasProperty(p, EP_Commuted) ){ + return sqlite3BinaryCompareCollSeq(pParse, p->pRight, p->pLeft); + }else{ + return sqlite3BinaryCompareCollSeq(pParse, p->pLeft, p->pRight); + } +} + +/* +** Generate code for a comparison operator. +*/ +static int codeCompare( + Parse *pParse, /* The parsing (and code generating) context */ + Expr *pLeft, /* The left operand */ + Expr *pRight, /* The right operand */ + int opcode, /* The comparison opcode */ + int in1, int in2, /* Register holding operands */ + int dest, /* Jump here if true. */ + int jumpIfNull, /* If true, jump if either operand is NULL */ + int isCommuted /* The comparison has been commuted */ +){ + int p5; + int addr; + CollSeq *p4; + + if( pParse->nErr ) return 0; + if( isCommuted ){ + p4 = sqlite3BinaryCompareCollSeq(pParse, pRight, pLeft); + }else{ + p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); + } + p5 = binaryCompareP5(pLeft, pRight, jumpIfNull); + addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1, + (void*)p4, P4_COLLSEQ); + sqlite3VdbeChangeP5(pParse->pVdbe, (u8)p5); + return addr; +} + +/* +** Return true if expression pExpr is a vector, or false otherwise. +** +** A vector is defined as any expression that results in two or more +** columns of result. Every TK_VECTOR node is an vector because the +** parser will not generate a TK_VECTOR with fewer than two entries. +** But a TK_SELECT might be either a vector or a scalar. It is only +** considered a vector if it has two or more result columns. +*/ +SQLITE_PRIVATE int sqlite3ExprIsVector(Expr *pExpr){ + return sqlite3ExprVectorSize(pExpr)>1; +} + +/* +** If the expression passed as the only argument is of type TK_VECTOR +** return the number of expressions in the vector. Or, if the expression +** is a sub-select, return the number of columns in the sub-select. For +** any other type of expression, return 1. +*/ +SQLITE_PRIVATE int sqlite3ExprVectorSize(Expr *pExpr){ + u8 op = pExpr->op; + if( op==TK_REGISTER ) op = pExpr->op2; + if( op==TK_VECTOR ){ + return pExpr->x.pList->nExpr; + }else if( op==TK_SELECT ){ + return pExpr->x.pSelect->pEList->nExpr; + }else{ + return 1; + } +} + +/* +** Return a pointer to a subexpression of pVector that is the i-th +** column of the vector (numbered starting with 0). The caller must +** ensure that i is within range. +** +** If pVector is really a scalar (and "scalar" here includes subqueries +** that return a single column!) then return pVector unmodified. +** +** pVector retains ownership of the returned subexpression. +** +** If the vector is a (SELECT ...) then the expression returned is +** just the expression for the i-th term of the result set, and may +** not be ready for evaluation because the table cursor has not yet +** been positioned. +*/ +SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){ + assert( iop2==0 || pVector->op==TK_REGISTER ); + if( pVector->op==TK_SELECT || pVector->op2==TK_SELECT ){ + return pVector->x.pSelect->pEList->a[i].pExpr; + }else{ + return pVector->x.pList->a[i].pExpr; + } + } + return pVector; +} + +/* +** Compute and return a new Expr object which when passed to +** sqlite3ExprCode() will generate all necessary code to compute +** the iField-th column of the vector expression pVector. +** +** It is ok for pVector to be a scalar (as long as iField==0). +** In that case, this routine works like sqlite3ExprDup(). +** +** The caller owns the returned Expr object and is responsible for +** ensuring that the returned value eventually gets freed. +** +** The caller retains ownership of pVector. If pVector is a TK_SELECT, +** then the returned object will reference pVector and so pVector must remain +** valid for the life of the returned object. If pVector is a TK_VECTOR +** or a scalar expression, then it can be deleted as soon as this routine +** returns. +** +** A trick to cause a TK_SELECT pVector to be deleted together with +** the returned Expr object is to attach the pVector to the pRight field +** of the returned TK_SELECT_COLUMN Expr object. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprForVectorField( + Parse *pParse, /* Parsing context */ + Expr *pVector, /* The vector. List of expressions or a sub-SELECT */ + int iField /* Which column of the vector to return */ +){ + Expr *pRet; + if( pVector->op==TK_SELECT ){ + assert( pVector->flags & EP_xIsSelect ); + /* The TK_SELECT_COLUMN Expr node: + ** + ** pLeft: pVector containing TK_SELECT. Not deleted. + ** pRight: not used. But recursively deleted. + ** iColumn: Index of a column in pVector + ** iTable: 0 or the number of columns on the LHS of an assignment + ** pLeft->iTable: First in an array of register holding result, or 0 + ** if the result is not yet computed. + ** + ** sqlite3ExprDelete() specifically skips the recursive delete of + ** pLeft on TK_SELECT_COLUMN nodes. But pRight is followed, so pVector + ** can be attached to pRight to cause this node to take ownership of + ** pVector. Typically there will be multiple TK_SELECT_COLUMN nodes + ** with the same pLeft pointer to the pVector, but only one of them + ** will own the pVector. + */ + pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0); + if( pRet ){ + pRet->iColumn = iField; + pRet->pLeft = pVector; + } + assert( pRet==0 || pRet->iTable==0 ); + }else{ + if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; + pRet = sqlite3ExprDup(pParse->db, pVector, 0); + sqlite3RenameTokenRemap(pParse, pRet, pVector); + } + return pRet; +} + +/* +** If expression pExpr is of type TK_SELECT, generate code to evaluate +** it. Return the register in which the result is stored (or, if the +** sub-select returns more than one column, the first in an array +** of registers in which the result is stored). +** +** If pExpr is not a TK_SELECT expression, return 0. +*/ +static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ + int reg = 0; +#ifndef SQLITE_OMIT_SUBQUERY + if( pExpr->op==TK_SELECT ){ + reg = sqlite3CodeSubselect(pParse, pExpr); + } +#endif + return reg; +} + +/* +** Argument pVector points to a vector expression - either a TK_VECTOR +** or TK_SELECT that returns more than one column. This function returns +** the register number of a register that contains the value of +** element iField of the vector. +** +** If pVector is a TK_SELECT expression, then code for it must have +** already been generated using the exprCodeSubselect() routine. In this +** case parameter regSelect should be the first in an array of registers +** containing the results of the sub-select. +** +** If pVector is of type TK_VECTOR, then code for the requested field +** is generated. In this case (*pRegFree) may be set to the number of +** a temporary register to be freed by the caller before returning. +** +** Before returning, output parameter (*ppExpr) is set to point to the +** Expr object corresponding to element iElem of the vector. +*/ +static int exprVectorRegister( + Parse *pParse, /* Parse context */ + Expr *pVector, /* Vector to extract element from */ + int iField, /* Field to extract from pVector */ + int regSelect, /* First in array of registers */ + Expr **ppExpr, /* OUT: Expression element */ + int *pRegFree /* OUT: Temp register to free */ +){ + u8 op = pVector->op; + assert( op==TK_VECTOR || op==TK_REGISTER || op==TK_SELECT ); + if( op==TK_REGISTER ){ + *ppExpr = sqlite3VectorFieldSubexpr(pVector, iField); + return pVector->iTable+iField; + } + if( op==TK_SELECT ){ + *ppExpr = pVector->x.pSelect->pEList->a[iField].pExpr; + return regSelect+iField; + } + *ppExpr = pVector->x.pList->a[iField].pExpr; + return sqlite3ExprCodeTemp(pParse, *ppExpr, pRegFree); +} + +/* +** Expression pExpr is a comparison between two vector values. Compute +** the result of the comparison (1, 0, or NULL) and write that +** result into register dest. +** +** The caller must satisfy the following preconditions: +** +** if pExpr->op==TK_IS: op==TK_EQ and p5==SQLITE_NULLEQ +** if pExpr->op==TK_ISNOT: op==TK_NE and p5==SQLITE_NULLEQ +** otherwise: op==pExpr->op and p5==0 +*/ +static void codeVectorCompare( + Parse *pParse, /* Code generator context */ + Expr *pExpr, /* The comparison operation */ + int dest, /* Write results into this register */ + u8 op, /* Comparison operator */ + u8 p5 /* SQLITE_NULLEQ or zero */ +){ + Vdbe *v = pParse->pVdbe; + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pRight; + int nLeft = sqlite3ExprVectorSize(pLeft); + int i; + int regLeft = 0; + int regRight = 0; + u8 opx = op; + int addrDone = sqlite3VdbeMakeLabel(pParse); + int isCommuted = ExprHasProperty(pExpr,EP_Commuted); + + assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); + if( pParse->nErr ) return; + if( nLeft!=sqlite3ExprVectorSize(pRight) ){ + sqlite3ErrorMsg(pParse, "row value misused"); + return; + } + assert( pExpr->op==TK_EQ || pExpr->op==TK_NE + || pExpr->op==TK_IS || pExpr->op==TK_ISNOT + || pExpr->op==TK_LT || pExpr->op==TK_GT + || pExpr->op==TK_LE || pExpr->op==TK_GE + ); + assert( pExpr->op==op || (pExpr->op==TK_IS && op==TK_EQ) + || (pExpr->op==TK_ISNOT && op==TK_NE) ); + assert( p5==0 || pExpr->op!=op ); + assert( p5==SQLITE_NULLEQ || pExpr->op==op ); + + p5 |= SQLITE_STOREP2; + if( opx==TK_LE ) opx = TK_LT; + if( opx==TK_GE ) opx = TK_GT; + + regLeft = exprCodeSubselect(pParse, pLeft); + regRight = exprCodeSubselect(pParse, pRight); + + for(i=0; 1 /*Loop exits by "break"*/; i++){ + int regFree1 = 0, regFree2 = 0; + Expr *pL, *pR; + int r1, r2; + assert( i>=0 && i0 +/* +** Check that argument nHeight is less than or equal to the maximum +** expression depth allowed. If it is not, leave an error message in +** pParse. +*/ +SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse *pParse, int nHeight){ + int rc = SQLITE_OK; + int mxHeight = pParse->db->aLimit[SQLITE_LIMIT_EXPR_DEPTH]; + if( nHeight>mxHeight ){ + sqlite3ErrorMsg(pParse, + "Expression tree is too large (maximum depth %d)", mxHeight + ); + rc = SQLITE_ERROR; + } + return rc; +} + +/* The following three functions, heightOfExpr(), heightOfExprList() +** and heightOfSelect(), are used to determine the maximum height +** of any expression tree referenced by the structure passed as the +** first argument. +** +** If this maximum height is greater than the current value pointed +** to by pnHeight, the second parameter, then set *pnHeight to that +** value. +*/ +static void heightOfExpr(Expr *p, int *pnHeight){ + if( p ){ + if( p->nHeight>*pnHeight ){ + *pnHeight = p->nHeight; + } + } +} +static void heightOfExprList(ExprList *p, int *pnHeight){ + if( p ){ + int i; + for(i=0; inExpr; i++){ + heightOfExpr(p->a[i].pExpr, pnHeight); + } + } +} +static void heightOfSelect(Select *pSelect, int *pnHeight){ + Select *p; + for(p=pSelect; p; p=p->pPrior){ + heightOfExpr(p->pWhere, pnHeight); + heightOfExpr(p->pHaving, pnHeight); + heightOfExpr(p->pLimit, pnHeight); + heightOfExprList(p->pEList, pnHeight); + heightOfExprList(p->pGroupBy, pnHeight); + heightOfExprList(p->pOrderBy, pnHeight); + } +} + +/* +** Set the Expr.nHeight variable in the structure passed as an +** argument. An expression with no children, Expr.pList or +** Expr.pSelect member has a height of 1. Any other expression +** has a height equal to the maximum height of any other +** referenced Expr plus one. +** +** Also propagate EP_Propagate flags up from Expr.x.pList to Expr.flags, +** if appropriate. +*/ +static void exprSetHeight(Expr *p){ + int nHeight = 0; + heightOfExpr(p->pLeft, &nHeight); + heightOfExpr(p->pRight, &nHeight); + if( ExprHasProperty(p, EP_xIsSelect) ){ + heightOfSelect(p->x.pSelect, &nHeight); + }else if( p->x.pList ){ + heightOfExprList(p->x.pList, &nHeight); + p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); + } + p->nHeight = nHeight + 1; +} + +/* +** Set the Expr.nHeight variable using the exprSetHeight() function. If +** the height is greater than the maximum allowed expression depth, +** leave an error in pParse. +** +** Also propagate all EP_Propagate flags from the Expr.x.pList into +** Expr.flags. +*/ +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ + if( pParse->nErr ) return; + exprSetHeight(p); + sqlite3ExprCheckHeight(pParse, p->nHeight); +} + +/* +** Return the maximum height of any expression tree referenced +** by the select statement passed as an argument. +*/ +SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){ + int nHeight = 0; + heightOfSelect(p, &nHeight); + return nHeight; +} +#else /* ABOVE: Height enforcement enabled. BELOW: Height enforcement off */ +/* +** Propagate all EP_Propagate flags from the Expr.x.pList into +** Expr.flags. +*/ +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ + if( p && p->x.pList && !ExprHasProperty(p, EP_xIsSelect) ){ + p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); + } +} +#define exprSetHeight(y) +#endif /* SQLITE_MAX_EXPR_DEPTH>0 */ + +/* +** This routine is the core allocator for Expr nodes. +** +** Construct a new expression node and return a pointer to it. Memory +** for this node and for the pToken argument is a single allocation +** obtained from sqlite3DbMalloc(). The calling function +** is responsible for making sure the node eventually gets freed. +** +** If dequote is true, then the token (if it exists) is dequoted. +** If dequote is false, no dequoting is performed. The deQuote +** parameter is ignored if pToken is NULL or if the token does not +** appear to be quoted. If the quotes were of the form "..." (double-quotes) +** then the EP_DblQuoted flag is set on the expression node. +** +** Special case: If op==TK_INTEGER and pToken points to a string that +** can be translated into a 32-bit integer, then the token is not +** stored in u.zToken. Instead, the integer values is written +** into u.iValue and the EP_IntValue flag is set. No extra storage +** is allocated to hold the integer text and the dequote flag is ignored. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprAlloc( + sqlite3 *db, /* Handle for sqlite3DbMallocRawNN() */ + int op, /* Expression opcode */ + const Token *pToken, /* Token argument. Might be NULL */ + int dequote /* True to dequote */ +){ + Expr *pNew; + int nExtra = 0; + int iValue = 0; + + assert( db!=0 ); + if( pToken ){ + if( op!=TK_INTEGER || pToken->z==0 + || sqlite3GetInt32(pToken->z, &iValue)==0 ){ + nExtra = pToken->n+1; + assert( iValue>=0 ); + } + } + pNew = sqlite3DbMallocRawNN(db, sizeof(Expr)+nExtra); + if( pNew ){ + memset(pNew, 0, sizeof(Expr)); + pNew->op = (u8)op; + pNew->iAgg = -1; + if( pToken ){ + if( nExtra==0 ){ + pNew->flags |= EP_IntValue|EP_Leaf|(iValue?EP_IsTrue:EP_IsFalse); + pNew->u.iValue = iValue; + }else{ + pNew->u.zToken = (char*)&pNew[1]; + assert( pToken->z!=0 || pToken->n==0 ); + if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n); + pNew->u.zToken[pToken->n] = 0; + if( dequote && sqlite3Isquote(pNew->u.zToken[0]) ){ + sqlite3DequoteExpr(pNew); + } + } + } +#if SQLITE_MAX_EXPR_DEPTH>0 + pNew->nHeight = 1; +#endif + } + return pNew; +} + +/* +** Allocate a new expression node from a zero-terminated token that has +** already been dequoted. +*/ +SQLITE_PRIVATE Expr *sqlite3Expr( + sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */ + int op, /* Expression opcode */ + const char *zToken /* Token argument. Might be NULL */ +){ + Token x; + x.z = zToken; + x.n = sqlite3Strlen30(zToken); + return sqlite3ExprAlloc(db, op, &x, 0); +} + +/* +** Attach subtrees pLeft and pRight to the Expr node pRoot. +** +** If pRoot==NULL that means that a memory allocation error has occurred. +** In that case, delete the subtrees pLeft and pRight. +*/ +SQLITE_PRIVATE void sqlite3ExprAttachSubtrees( + sqlite3 *db, + Expr *pRoot, + Expr *pLeft, + Expr *pRight +){ + if( pRoot==0 ){ + assert( db->mallocFailed ); + sqlite3ExprDelete(db, pLeft); + sqlite3ExprDelete(db, pRight); + }else{ + if( pRight ){ + pRoot->pRight = pRight; + pRoot->flags |= EP_Propagate & pRight->flags; + } + if( pLeft ){ + pRoot->pLeft = pLeft; + pRoot->flags |= EP_Propagate & pLeft->flags; + } + exprSetHeight(pRoot); + } +} + +/* +** Allocate an Expr node which joins as many as two subtrees. +** +** One or both of the subtrees can be NULL. Return a pointer to the new +** Expr node. Or, if an OOM error occurs, set pParse->db->mallocFailed, +** free the subtrees and return NULL. +*/ +SQLITE_PRIVATE Expr *sqlite3PExpr( + Parse *pParse, /* Parsing context */ + int op, /* Expression opcode */ + Expr *pLeft, /* Left operand */ + Expr *pRight /* Right operand */ +){ + Expr *p; + p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)); + if( p ){ + memset(p, 0, sizeof(Expr)); + p->op = op & 0xff; + p->iAgg = -1; + sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); + sqlite3ExprCheckHeight(pParse, p->nHeight); + }else{ + sqlite3ExprDelete(pParse->db, pLeft); + sqlite3ExprDelete(pParse->db, pRight); + } + return p; +} + +/* +** Add pSelect to the Expr.x.pSelect field. Or, if pExpr is NULL (due +** do a memory allocation failure) then delete the pSelect object. +*/ +SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse *pParse, Expr *pExpr, Select *pSelect){ + if( pExpr ){ + pExpr->x.pSelect = pSelect; + ExprSetProperty(pExpr, EP_xIsSelect|EP_Subquery); + sqlite3ExprSetHeightAndFlags(pParse, pExpr); + }else{ + assert( pParse->db->mallocFailed ); + sqlite3SelectDelete(pParse->db, pSelect); + } +} + + +/* +** Join two expressions using an AND operator. If either expression is +** NULL, then just return the other expression. +** +** If one side or the other of the AND is known to be false, then instead +** of returning an AND expression, just return a constant expression with +** a value of false. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ + sqlite3 *db = pParse->db; + if( pLeft==0 ){ + return pRight; + }else if( pRight==0 ){ + return pLeft; + }else if( (ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight)) + && !IN_RENAME_OBJECT + ){ + sqlite3ExprDelete(db, pLeft); + sqlite3ExprDelete(db, pRight); + return sqlite3Expr(db, TK_INTEGER, "0"); + }else{ + return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); + } +} + +/* +** Construct a new expression node for a function with multiple +** arguments. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprFunction( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* Argument list */ + Token *pToken, /* Name of the function */ + int eDistinct /* SF_Distinct or SF_ALL or 0 */ +){ + Expr *pNew; + sqlite3 *db = pParse->db; + assert( pToken ); + pNew = sqlite3ExprAlloc(db, TK_FUNCTION, pToken, 1); + if( pNew==0 ){ + sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ + return 0; + } + if( pList && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ + sqlite3ErrorMsg(pParse, "too many arguments on function %T", pToken); + } + pNew->x.pList = pList; + ExprSetProperty(pNew, EP_HasFunc); + assert( !ExprHasProperty(pNew, EP_xIsSelect) ); + sqlite3ExprSetHeightAndFlags(pParse, pNew); + if( eDistinct==SF_Distinct ) ExprSetProperty(pNew, EP_Distinct); + return pNew; +} + +/* +** Check to see if a function is usable according to current access +** rules: +** +** SQLITE_FUNC_DIRECT - Only usable from top-level SQL +** +** SQLITE_FUNC_UNSAFE - Usable if TRUSTED_SCHEMA or from +** top-level SQL +** +** If the function is not usable, create an error. +*/ +SQLITE_PRIVATE void sqlite3ExprFunctionUsable( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* The function invocation */ + FuncDef *pDef /* The function being invoked */ +){ + assert( !IN_RENAME_OBJECT ); + assert( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 ); + if( ExprHasProperty(pExpr, EP_FromDDL) ){ + if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0 + || (pParse->db->flags & SQLITE_TrustedSchema)==0 + ){ + /* Functions prohibited in triggers and views if: + ** (1) tagged with SQLITE_DIRECTONLY + ** (2) not tagged with SQLITE_INNOCUOUS (which means it + ** is tagged with SQLITE_FUNC_UNSAFE) and + ** SQLITE_DBCONFIG_TRUSTED_SCHEMA is off (meaning + ** that the schema is possibly tainted). + */ + sqlite3ErrorMsg(pParse, "unsafe use of %s()", pDef->zName); + } + } +} + +/* +** Assign a variable number to an expression that encodes a wildcard +** in the original SQL statement. +** +** Wildcards consisting of a single "?" are assigned the next sequential +** variable number. +** +** Wildcards of the form "?nnn" are assigned the number "nnn". We make +** sure "nnn" is not too big to avoid a denial of service attack when +** the SQL statement comes from an external source. +** +** Wildcards of the form ":aaa", "@aaa", or "$aaa" are assigned the same number +** as the previous instance of the same wildcard. Or if this is the first +** instance of the wildcard, the next sequential variable number is +** assigned. +*/ +SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ + sqlite3 *db = pParse->db; + const char *z; + ynVar x; + + if( pExpr==0 ) return; + assert( !ExprHasProperty(pExpr, EP_IntValue|EP_Reduced|EP_TokenOnly) ); + z = pExpr->u.zToken; + assert( z!=0 ); + assert( z[0]!=0 ); + assert( n==(u32)sqlite3Strlen30(z) ); + if( z[1]==0 ){ + /* Wildcard of the form "?". Assign the next variable number */ + assert( z[0]=='?' ); + x = (ynVar)(++pParse->nVar); + }else{ + int doAdd = 0; + if( z[0]=='?' ){ + /* Wildcard of the form "?nnn". Convert "nnn" to an integer and + ** use it as the variable number */ + i64 i; + int bOk; + if( n==2 ){ /*OPTIMIZATION-IF-TRUE*/ + i = z[1]-'0'; /* The common case of ?N for a single digit N */ + bOk = 1; + }else{ + bOk = 0==sqlite3Atoi64(&z[1], &i, n-1, SQLITE_UTF8); + } + testcase( i==0 ); + testcase( i==1 ); + testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 ); + testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ); + if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ + sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d", + db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]); + return; + } + x = (ynVar)i; + if( x>pParse->nVar ){ + pParse->nVar = (int)x; + doAdd = 1; + }else if( sqlite3VListNumToName(pParse->pVList, x)==0 ){ + doAdd = 1; + } + }else{ + /* Wildcards like ":aaa", "$aaa" or "@aaa". Reuse the same variable + ** number as the prior appearance of the same name, or if the name + ** has never appeared before, reuse the same variable number + */ + x = (ynVar)sqlite3VListNameToNum(pParse->pVList, z, n); + if( x==0 ){ + x = (ynVar)(++pParse->nVar); + doAdd = 1; + } + } + if( doAdd ){ + pParse->pVList = sqlite3VListAdd(db, pParse->pVList, z, n, x); + } + } + pExpr->iColumn = x; + if( x>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ + sqlite3ErrorMsg(pParse, "too many SQL variables"); + } +} + +/* +** Recursively delete an expression tree. +*/ +static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ + assert( p!=0 ); + /* Sanity check: Assert that the IntValue is non-negative if it exists */ + assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 ); + + assert( !ExprHasProperty(p, EP_WinFunc) || p->y.pWin!=0 || db->mallocFailed ); + assert( p->op!=TK_FUNCTION || ExprHasProperty(p, EP_TokenOnly|EP_Reduced) + || p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc) ); +#ifdef SQLITE_DEBUG + if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){ + assert( p->pLeft==0 ); + assert( p->pRight==0 ); + assert( p->x.pSelect==0 ); + } +#endif + if( !ExprHasProperty(p, (EP_TokenOnly|EP_Leaf)) ){ + /* The Expr.x union is never used at the same time as Expr.pRight */ + assert( p->x.pList==0 || p->pRight==0 ); + if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft); + if( p->pRight ){ + assert( !ExprHasProperty(p, EP_WinFunc) ); + sqlite3ExprDeleteNN(db, p->pRight); + }else if( ExprHasProperty(p, EP_xIsSelect) ){ + assert( !ExprHasProperty(p, EP_WinFunc) ); + sqlite3SelectDelete(db, p->x.pSelect); + }else{ + sqlite3ExprListDelete(db, p->x.pList); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(p, EP_WinFunc) ){ + sqlite3WindowDelete(db, p->y.pWin); + } +#endif + } + } + if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken); + if( !ExprHasProperty(p, EP_Static) ){ + sqlite3DbFreeNN(db, p); + } +} +SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ + if( p ) sqlite3ExprDeleteNN(db, p); +} + +/* Invoke sqlite3RenameExprUnmap() and sqlite3ExprDelete() on the +** expression. +*/ +SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse *pParse, Expr *p){ + if( p ){ + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, p); + } + sqlite3ExprDeleteNN(pParse->db, p); + } +} + +/* +** Return the number of bytes allocated for the expression structure +** passed as the first argument. This is always one of EXPR_FULLSIZE, +** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE. +*/ +static int exprStructSize(Expr *p){ + if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE; + if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE; + return EXPR_FULLSIZE; +} + +/* +** The dupedExpr*Size() routines each return the number of bytes required +** to store a copy of an expression or expression tree. They differ in +** how much of the tree is measured. +** +** dupedExprStructSize() Size of only the Expr structure +** dupedExprNodeSize() Size of Expr + space for token +** dupedExprSize() Expr + token + subtree components +** +*************************************************************************** +** +** The dupedExprStructSize() function returns two values OR-ed together: +** (1) the space required for a copy of the Expr structure only and +** (2) the EP_xxx flags that indicate what the structure size should be. +** The return values is always one of: +** +** EXPR_FULLSIZE +** EXPR_REDUCEDSIZE | EP_Reduced +** EXPR_TOKENONLYSIZE | EP_TokenOnly +** +** The size of the structure can be found by masking the return value +** of this routine with 0xfff. The flags can be found by masking the +** return value with EP_Reduced|EP_TokenOnly. +** +** Note that with flags==EXPRDUP_REDUCE, this routines works on full-size +** (unreduced) Expr objects as they or originally constructed by the parser. +** During expression analysis, extra information is computed and moved into +** later parts of the Expr object and that extra information might get chopped +** off if the expression is reduced. Note also that it does not work to +** make an EXPRDUP_REDUCE copy of a reduced expression. It is only legal +** to reduce a pristine expression tree from the parser. The implementation +** of dupedExprStructSize() contain multiple assert() statements that attempt +** to enforce this constraint. +*/ +static int dupedExprStructSize(Expr *p, int flags){ + int nSize; + assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */ + assert( EXPR_FULLSIZE<=0xfff ); + assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 ); + if( 0==flags || p->op==TK_SELECT_COLUMN +#ifndef SQLITE_OMIT_WINDOWFUNC + || ExprHasProperty(p, EP_WinFunc) +#endif + ){ + nSize = EXPR_FULLSIZE; + }else{ + assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); + assert( !ExprHasProperty(p, EP_FromJoin) ); + assert( !ExprHasProperty(p, EP_MemToken) ); + assert( !ExprHasVVAProperty(p, EP_NoReduce) ); + if( p->pLeft || p->x.pList ){ + nSize = EXPR_REDUCEDSIZE | EP_Reduced; + }else{ + assert( p->pRight==0 ); + nSize = EXPR_TOKENONLYSIZE | EP_TokenOnly; + } + } + return nSize; +} + +/* +** This function returns the space in bytes required to store the copy +** of the Expr structure and a copy of the Expr.u.zToken string (if that +** string is defined.) +*/ +static int dupedExprNodeSize(Expr *p, int flags){ + int nByte = dupedExprStructSize(p, flags) & 0xfff; + if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nByte += sqlite3Strlen30NN(p->u.zToken)+1; + } + return ROUND8(nByte); +} + +/* +** Return the number of bytes required to create a duplicate of the +** expression passed as the first argument. The second argument is a +** mask containing EXPRDUP_XXX flags. +** +** The value returned includes space to create a copy of the Expr struct +** itself and the buffer referred to by Expr.u.zToken, if any. +** +** If the EXPRDUP_REDUCE flag is set, then the return value includes +** space to duplicate all Expr nodes in the tree formed by Expr.pLeft +** and Expr.pRight variables (but not for any structures pointed to or +** descended from the Expr.x.pList or Expr.x.pSelect variables). +*/ +static int dupedExprSize(Expr *p, int flags){ + int nByte = 0; + if( p ){ + nByte = dupedExprNodeSize(p, flags); + if( flags&EXPRDUP_REDUCE ){ + nByte += dupedExprSize(p->pLeft, flags) + dupedExprSize(p->pRight, flags); + } + } + return nByte; +} + +/* +** This function is similar to sqlite3ExprDup(), except that if pzBuffer +** is not NULL then *pzBuffer is assumed to point to a buffer large enough +** to store the copy of expression p, the copies of p->u.zToken +** (if applicable), and the copies of the p->pLeft and p->pRight expressions, +** if any. Before returning, *pzBuffer is set to the first byte past the +** portion of the buffer copied into by this function. +*/ +static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ + Expr *pNew; /* Value to return */ + u8 *zAlloc; /* Memory space from which to build Expr object */ + u32 staticFlag; /* EP_Static if space not obtained from malloc */ + + assert( db!=0 ); + assert( p ); + assert( dupFlags==0 || dupFlags==EXPRDUP_REDUCE ); + assert( pzBuffer==0 || dupFlags==EXPRDUP_REDUCE ); + + /* Figure out where to write the new Expr structure. */ + if( pzBuffer ){ + zAlloc = *pzBuffer; + staticFlag = EP_Static; + }else{ + zAlloc = sqlite3DbMallocRawNN(db, dupedExprSize(p, dupFlags)); + staticFlag = 0; + } + pNew = (Expr *)zAlloc; + + if( pNew ){ + /* Set nNewSize to the size allocated for the structure pointed to + ** by pNew. This is either EXPR_FULLSIZE, EXPR_REDUCEDSIZE or + ** EXPR_TOKENONLYSIZE. nToken is set to the number of bytes consumed + ** by the copy of the p->u.zToken string (if any). + */ + const unsigned nStructSize = dupedExprStructSize(p, dupFlags); + const int nNewSize = nStructSize & 0xfff; + int nToken; + if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nToken = sqlite3Strlen30(p->u.zToken) + 1; + }else{ + nToken = 0; + } + if( dupFlags ){ + assert( ExprHasProperty(p, EP_Reduced)==0 ); + memcpy(zAlloc, p, nNewSize); + }else{ + u32 nSize = (u32)exprStructSize(p); + memcpy(zAlloc, p, nSize); + if( nSizeflags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken); + pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); + pNew->flags |= staticFlag; + ExprClearVVAProperties(pNew); + if( dupFlags ){ + ExprSetVVAProperty(pNew, EP_Immutable); + } + + /* Copy the p->u.zToken string, if any. */ + if( nToken ){ + char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize]; + memcpy(zToken, p->u.zToken, nToken); + } + + if( 0==((p->flags|pNew->flags) & (EP_TokenOnly|EP_Leaf)) ){ + /* Fill in the pNew->x.pSelect or pNew->x.pList member. */ + if( ExprHasProperty(p, EP_xIsSelect) ){ + pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, dupFlags); + }else{ + pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, dupFlags); + } + } + + /* Fill in pNew->pLeft and pNew->pRight. */ + if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly|EP_WinFunc) ){ + zAlloc += dupedExprNodeSize(p, dupFlags); + if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){ + pNew->pLeft = p->pLeft ? + exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc) : 0; + pNew->pRight = p->pRight ? + exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc) : 0; + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(p, EP_WinFunc) ){ + pNew->y.pWin = sqlite3WindowDup(db, pNew, p->y.pWin); + assert( ExprHasProperty(pNew, EP_WinFunc) ); + } +#endif /* SQLITE_OMIT_WINDOWFUNC */ + if( pzBuffer ){ + *pzBuffer = zAlloc; + } + }else{ + if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ + if( pNew->op==TK_SELECT_COLUMN ){ + pNew->pLeft = p->pLeft; + assert( p->iColumn==0 || p->pRight==0 ); + assert( p->pRight==0 || p->pRight==p->pLeft ); + }else{ + pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0); + } + pNew->pRight = sqlite3ExprDup(db, p->pRight, 0); + } + } + } + return pNew; +} + +/* +** Create and return a deep copy of the object passed as the second +** argument. If an OOM condition is encountered, NULL is returned +** and the db->mallocFailed flag set. +*/ +#ifndef SQLITE_OMIT_CTE +static With *withDup(sqlite3 *db, With *p){ + With *pRet = 0; + if( p ){ + sqlite3_int64 nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1); + pRet = sqlite3DbMallocZero(db, nByte); + if( pRet ){ + int i; + pRet->nCte = p->nCte; + for(i=0; inCte; i++){ + pRet->a[i].pSelect = sqlite3SelectDup(db, p->a[i].pSelect, 0); + pRet->a[i].pCols = sqlite3ExprListDup(db, p->a[i].pCols, 0); + pRet->a[i].zName = sqlite3DbStrDup(db, p->a[i].zName); + } + } + } + return pRet; +} +#else +# define withDup(x,y) 0 +#endif + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** The gatherSelectWindows() procedure and its helper routine +** gatherSelectWindowsCallback() are used to scan all the expressions +** an a newly duplicated SELECT statement and gather all of the Window +** objects found there, assembling them onto the linked list at Select->pWin. +*/ +static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_WinFunc) ){ + Select *pSelect = pWalker->u.pSelect; + Window *pWin = pExpr->y.pWin; + assert( pWin ); + assert( IsWindowFunc(pExpr) ); + assert( pWin->ppThis==0 ); + sqlite3WindowLink(pSelect, pWin); + } + return WRC_Continue; +} +static int gatherSelectWindowsSelectCallback(Walker *pWalker, Select *p){ + return p==pWalker->u.pSelect ? WRC_Continue : WRC_Prune; +} +static void gatherSelectWindows(Select *p){ + Walker w; + w.xExprCallback = gatherSelectWindowsCallback; + w.xSelectCallback = gatherSelectWindowsSelectCallback; + w.xSelectCallback2 = 0; + w.pParse = 0; + w.u.pSelect = p; + sqlite3WalkSelect(&w, p); +} +#endif + + +/* +** The following group of routines make deep copies of expressions, +** expression lists, ID lists, and select statements. The copies can +** be deleted (by being passed to their respective ...Delete() routines) +** without effecting the originals. +** +** The expression list, ID, and source lists return by sqlite3ExprListDup(), +** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded +** by subsequent calls to sqlite*ListAppend() routines. +** +** Any tables that the SrcList might point to are not duplicated. +** +** The flags parameter contains a combination of the EXPRDUP_XXX flags. +** If the EXPRDUP_REDUCE flag is set, then the structure returned is a +** truncated version of the usual Expr structure that will be stored as +** part of the in-memory representation of the database schema. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){ + assert( flags==0 || flags==EXPRDUP_REDUCE ); + return p ? exprDup(db, p, flags, 0) : 0; +} +SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ + ExprList *pNew; + struct ExprList_item *pItem, *pOldItem; + int i; + Expr *pPriorSelectCol = 0; + assert( db!=0 ); + if( p==0 ) return 0; + pNew = sqlite3DbMallocRawNN(db, sqlite3DbMallocSize(db, p)); + if( pNew==0 ) return 0; + pNew->nExpr = p->nExpr; + pItem = pNew->a; + pOldItem = p->a; + for(i=0; inExpr; i++, pItem++, pOldItem++){ + Expr *pOldExpr = pOldItem->pExpr; + Expr *pNewExpr; + pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags); + if( pOldExpr + && pOldExpr->op==TK_SELECT_COLUMN + && (pNewExpr = pItem->pExpr)!=0 + ){ + assert( pNewExpr->iColumn==0 || i>0 ); + if( pNewExpr->iColumn==0 ){ + assert( pOldExpr->pLeft==pOldExpr->pRight ); + pPriorSelectCol = pNewExpr->pLeft = pNewExpr->pRight; + }else{ + assert( i>0 ); + assert( pItem[-1].pExpr!=0 ); + assert( pNewExpr->iColumn==pItem[-1].pExpr->iColumn+1 ); + assert( pPriorSelectCol==pItem[-1].pExpr->pLeft ); + pNewExpr->pLeft = pPriorSelectCol; + } + } + pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); + pItem->sortFlags = pOldItem->sortFlags; + pItem->eEName = pOldItem->eEName; + pItem->done = 0; + pItem->bNulls = pOldItem->bNulls; + pItem->bSorterRef = pOldItem->bSorterRef; + pItem->u = pOldItem->u; + } + return pNew; +} + +/* +** If cursors, triggers, views and subqueries are all omitted from +** the build, then none of the following routines, except for +** sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes +** called with a NULL argument. +*/ +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \ + || !defined(SQLITE_OMIT_SUBQUERY) +SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ + SrcList *pNew; + int i; + int nByte; + assert( db!=0 ); + if( p==0 ) return 0; + nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); + pNew = sqlite3DbMallocRawNN(db, nByte ); + if( pNew==0 ) return 0; + pNew->nSrc = pNew->nAlloc = p->nSrc; + for(i=0; inSrc; i++){ + struct SrcList_item *pNewItem = &pNew->a[i]; + struct SrcList_item *pOldItem = &p->a[i]; + Table *pTab; + pNewItem->pSchema = pOldItem->pSchema; + pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); + pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias); + pNewItem->fg = pOldItem->fg; + pNewItem->iCursor = pOldItem->iCursor; + pNewItem->addrFillSub = pOldItem->addrFillSub; + pNewItem->regReturn = pOldItem->regReturn; + if( pNewItem->fg.isIndexedBy ){ + pNewItem->u1.zIndexedBy = sqlite3DbStrDup(db, pOldItem->u1.zIndexedBy); + } + pNewItem->pIBIndex = pOldItem->pIBIndex; + if( pNewItem->fg.isTabFunc ){ + pNewItem->u1.pFuncArg = + sqlite3ExprListDup(db, pOldItem->u1.pFuncArg, flags); + } + pTab = pNewItem->pTab = pOldItem->pTab; + if( pTab ){ + pTab->nTabRef++; + } + pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); + pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags); + pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing); + pNewItem->colUsed = pOldItem->colUsed; + } + return pNew; +} +SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){ + IdList *pNew; + int i; + assert( db!=0 ); + if( p==0 ) return 0; + pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) ); + if( pNew==0 ) return 0; + pNew->nId = p->nId; + pNew->a = sqlite3DbMallocRawNN(db, p->nId*sizeof(p->a[0]) ); + if( pNew->a==0 ){ + sqlite3DbFreeNN(db, pNew); + return 0; + } + /* Note that because the size of the allocation for p->a[] is not + ** necessarily a power of two, sqlite3IdListAppend() may not be called + ** on the duplicate created by this function. */ + for(i=0; inId; i++){ + struct IdList_item *pNewItem = &pNew->a[i]; + struct IdList_item *pOldItem = &p->a[i]; + pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pNewItem->idx = pOldItem->idx; + } + return pNew; +} +SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ + Select *pRet = 0; + Select *pNext = 0; + Select **pp = &pRet; + Select *p; + + assert( db!=0 ); + for(p=pDup; p; p=p->pPrior){ + Select *pNew = sqlite3DbMallocRawNN(db, sizeof(*p) ); + if( pNew==0 ) break; + pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags); + pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags); + pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags); + pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags); + pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags); + pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags); + pNew->op = p->op; + pNew->pNext = pNext; + pNew->pPrior = 0; + pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags); + pNew->iLimit = 0; + pNew->iOffset = 0; + pNew->selFlags = p->selFlags & ~SF_UsesEphemeral; + pNew->addrOpenEphm[0] = -1; + pNew->addrOpenEphm[1] = -1; + pNew->nSelectRow = p->nSelectRow; + pNew->pWith = withDup(db, p->pWith); +#ifndef SQLITE_OMIT_WINDOWFUNC + pNew->pWin = 0; + pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); + if( p->pWin && db->mallocFailed==0 ) gatherSelectWindows(pNew); +#endif + pNew->selId = p->selId; + *pp = pNew; + pp = &pNew->pPrior; + pNext = pNew; + } + + return pRet; +} +#else +SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ + assert( p==0 ); + return 0; +} +#endif + + +/* +** Add a new element to the end of an expression list. If pList is +** initially NULL, then create a new expression list. +** +** The pList argument must be either NULL or a pointer to an ExprList +** obtained from a prior call to sqlite3ExprListAppend(). This routine +** may not be used with an ExprList obtained from sqlite3ExprListDup(). +** Reason: This routine assumes that the number of slots in pList->a[] +** is a power of two. That is true for sqlite3ExprListAppend() returns +** but is not necessarily true from the return value of sqlite3ExprListDup(). +** +** If a memory allocation error occurs, the entire list is freed and +** NULL is returned. If non-NULL is returned, then it is guaranteed +** that the new entry was successfully appended. +*/ +SQLITE_PRIVATE ExprList *sqlite3ExprListAppend( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to append. Might be NULL */ + Expr *pExpr /* Expression to be appended. Might be NULL */ +){ + struct ExprList_item *pItem; + sqlite3 *db = pParse->db; + assert( db!=0 ); + if( pList==0 ){ + pList = sqlite3DbMallocRawNN(db, sizeof(ExprList) ); + if( pList==0 ){ + goto no_mem; + } + pList->nExpr = 0; + }else if( (pList->nExpr & (pList->nExpr-1))==0 ){ + ExprList *pNew; + pNew = sqlite3DbRealloc(db, pList, + sizeof(*pList)+(2*(sqlite3_int64)pList->nExpr-1)*sizeof(pList->a[0])); + if( pNew==0 ){ + goto no_mem; + } + pList = pNew; + } + pItem = &pList->a[pList->nExpr++]; + assert( offsetof(struct ExprList_item,zEName)==sizeof(pItem->pExpr) ); + assert( offsetof(struct ExprList_item,pExpr)==0 ); + memset(&pItem->zEName,0,sizeof(*pItem)-offsetof(struct ExprList_item,zEName)); + pItem->pExpr = pExpr; + return pList; + +no_mem: + /* Avoid leaking memory if malloc has failed. */ + sqlite3ExprDelete(db, pExpr); + sqlite3ExprListDelete(db, pList); + return 0; +} + +/* +** pColumns and pExpr form a vector assignment which is part of the SET +** clause of an UPDATE statement. Like this: +** +** (a,b,c) = (expr1,expr2,expr3) +** Or: (a,b,c) = (SELECT x,y,z FROM ....) +** +** For each term of the vector assignment, append new entries to the +** expression list pList. In the case of a subquery on the RHS, append +** TK_SELECT_COLUMN expressions. +*/ +SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to append. Might be NULL */ + IdList *pColumns, /* List of names of LHS of the assignment */ + Expr *pExpr /* Vector expression to be appended. Might be NULL */ +){ + sqlite3 *db = pParse->db; + int n; + int i; + int iFirst = pList ? pList->nExpr : 0; + /* pColumns can only be NULL due to an OOM but an OOM will cause an + ** exit prior to this routine being invoked */ + if( NEVER(pColumns==0) ) goto vector_append_error; + if( pExpr==0 ) goto vector_append_error; + + /* If the RHS is a vector, then we can immediately check to see that + ** the size of the RHS and LHS match. But if the RHS is a SELECT, + ** wildcards ("*") in the result set of the SELECT must be expanded before + ** we can do the size check, so defer the size check until code generation. + */ + if( pExpr->op!=TK_SELECT && pColumns->nId!=(n=sqlite3ExprVectorSize(pExpr)) ){ + sqlite3ErrorMsg(pParse, "%d columns assigned %d values", + pColumns->nId, n); + goto vector_append_error; + } + + for(i=0; inId; i++){ + Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i); + assert( pSubExpr!=0 || db->mallocFailed ); + assert( pSubExpr==0 || pSubExpr->iTable==0 ); + if( pSubExpr==0 ) continue; + pSubExpr->iTable = pColumns->nId; + pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); + if( pList ){ + assert( pList->nExpr==iFirst+i+1 ); + pList->a[pList->nExpr-1].zEName = pColumns->a[i].zName; + pColumns->a[i].zName = 0; + } + } + + if( !db->mallocFailed && pExpr->op==TK_SELECT && ALWAYS(pList!=0) ){ + Expr *pFirst = pList->a[iFirst].pExpr; + assert( pFirst!=0 ); + assert( pFirst->op==TK_SELECT_COLUMN ); + + /* Store the SELECT statement in pRight so it will be deleted when + ** sqlite3ExprListDelete() is called */ + pFirst->pRight = pExpr; + pExpr = 0; + + /* Remember the size of the LHS in iTable so that we can check that + ** the RHS and LHS sizes match during code generation. */ + pFirst->iTable = pColumns->nId; + } + +vector_append_error: + sqlite3ExprUnmapAndDelete(pParse, pExpr); + sqlite3IdListDelete(db, pColumns); + return pList; +} + +/* +** Set the sort order for the last element on the given ExprList. +*/ +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){ + struct ExprList_item *pItem; + if( p==0 ) return; + assert( p->nExpr>0 ); + + assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC==0 && SQLITE_SO_DESC>0 ); + assert( iSortOrder==SQLITE_SO_UNDEFINED + || iSortOrder==SQLITE_SO_ASC + || iSortOrder==SQLITE_SO_DESC + ); + assert( eNulls==SQLITE_SO_UNDEFINED + || eNulls==SQLITE_SO_ASC + || eNulls==SQLITE_SO_DESC + ); + + pItem = &p->a[p->nExpr-1]; + assert( pItem->bNulls==0 ); + if( iSortOrder==SQLITE_SO_UNDEFINED ){ + iSortOrder = SQLITE_SO_ASC; + } + pItem->sortFlags = (u8)iSortOrder; + + if( eNulls!=SQLITE_SO_UNDEFINED ){ + pItem->bNulls = 1; + if( iSortOrder!=eNulls ){ + pItem->sortFlags |= KEYINFO_ORDER_BIGNULL; + } + } +} + +/* +** Set the ExprList.a[].zEName element of the most recently added item +** on the expression list. +** +** pList might be NULL following an OOM error. But pName should never be +** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag +** is set. +*/ +SQLITE_PRIVATE void sqlite3ExprListSetName( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to add the span. */ + Token *pName, /* Name to be added */ + int dequote /* True to cause the name to be dequoted */ +){ + assert( pList!=0 || pParse->db->mallocFailed!=0 ); + assert( pParse->eParseMode!=PARSE_MODE_UNMAP || dequote==0 ); + if( pList ){ + struct ExprList_item *pItem; + assert( pList->nExpr>0 ); + pItem = &pList->a[pList->nExpr-1]; + assert( pItem->zEName==0 ); + assert( pItem->eEName==ENAME_NAME ); + pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); + if( dequote ){ + /* If dequote==0, then pName->z does not point to part of a DDL + ** statement handled by the parser. And so no token need be added + ** to the token-map. */ + sqlite3Dequote(pItem->zEName); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenMap(pParse, (void*)pItem->zEName, pName); + } + } + } +} + +/* +** Set the ExprList.a[].zSpan element of the most recently added item +** on the expression list. +** +** pList might be NULL following an OOM error. But pSpan should never be +** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag +** is set. +*/ +SQLITE_PRIVATE void sqlite3ExprListSetSpan( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to add the span. */ + const char *zStart, /* Start of the span */ + const char *zEnd /* End of the span */ +){ + sqlite3 *db = pParse->db; + assert( pList!=0 || db->mallocFailed!=0 ); + if( pList ){ + struct ExprList_item *pItem = &pList->a[pList->nExpr-1]; + assert( pList->nExpr>0 ); + if( pItem->zEName==0 ){ + pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd); + pItem->eEName = ENAME_SPAN; + } + } +} + +/* +** If the expression list pEList contains more than iLimit elements, +** leave an error message in pParse. +*/ +SQLITE_PRIVATE void sqlite3ExprListCheckLength( + Parse *pParse, + ExprList *pEList, + const char *zObject +){ + int mx = pParse->db->aLimit[SQLITE_LIMIT_COLUMN]; + testcase( pEList && pEList->nExpr==mx ); + testcase( pEList && pEList->nExpr==mx+1 ); + if( pEList && pEList->nExpr>mx ){ + sqlite3ErrorMsg(pParse, "too many columns in %s", zObject); + } +} + +/* +** Delete an entire expression list. +*/ +static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){ + int i = pList->nExpr; + struct ExprList_item *pItem = pList->a; + assert( pList->nExpr>0 ); + do{ + sqlite3ExprDelete(db, pItem->pExpr); + sqlite3DbFree(db, pItem->zEName); + pItem++; + }while( --i>0 ); + sqlite3DbFreeNN(db, pList); +} +SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){ + if( pList ) exprListDeleteNN(db, pList); +} + +/* +** Return the bitwise-OR of all Expr.flags fields in the given +** ExprList. +*/ +SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList *pList){ + int i; + u32 m = 0; + assert( pList!=0 ); + for(i=0; inExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + assert( pExpr!=0 ); + m |= pExpr->flags; + } + return m; +} + +/* +** This is a SELECT-node callback for the expression walker that +** always "fails". By "fail" in this case, we mean set +** pWalker->eCode to zero and abort. +** +** This callback is used by multiple expression walkers. +*/ +SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){ + UNUSED_PARAMETER(NotUsed); + pWalker->eCode = 0; + return WRC_Abort; +} + +/* +** Check the input string to see if it is "true" or "false" (in any case). +** +** If the string is.... Return +** "true" EP_IsTrue +** "false" EP_IsFalse +** anything else 0 +*/ +SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char *zIn){ + if( sqlite3StrICmp(zIn, "true")==0 ) return EP_IsTrue; + if( sqlite3StrICmp(zIn, "false")==0 ) return EP_IsFalse; + return 0; +} + + +/* +** If the input expression is an ID with the name "true" or "false" +** then convert it into an TK_TRUEFALSE term. Return non-zero if +** the conversion happened, and zero if the expression is unaltered. +*/ +SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){ + u32 v; + assert( pExpr->op==TK_ID || pExpr->op==TK_STRING ); + if( !ExprHasProperty(pExpr, EP_Quoted) + && (v = sqlite3IsTrueOrFalse(pExpr->u.zToken))!=0 + ){ + pExpr->op = TK_TRUEFALSE; + ExprSetProperty(pExpr, v); + return 1; + } + return 0; +} + +/* +** The argument must be a TK_TRUEFALSE Expr node. Return 1 if it is TRUE +** and 0 if it is FALSE. +*/ +SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr *pExpr){ + pExpr = sqlite3ExprSkipCollate((Expr*)pExpr); + assert( pExpr->op==TK_TRUEFALSE ); + assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0 + || sqlite3StrICmp(pExpr->u.zToken,"false")==0 ); + return pExpr->u.zToken[4]==0; +} + +/* +** If pExpr is an AND or OR expression, try to simplify it by eliminating +** terms that are always true or false. Return the simplified expression. +** Or return the original expression if no simplification is possible. +** +** Examples: +** +** (x<10) AND true => (x<10) +** (x<10) AND false => false +** (x<10) AND (y=22 OR false) => (x<10) AND (y=22) +** (x<10) AND (y=22 OR true) => (x<10) +** (y=22) OR true => true +*/ +SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ + assert( pExpr!=0 ); + if( pExpr->op==TK_AND || pExpr->op==TK_OR ){ + Expr *pRight = sqlite3ExprSimplifiedAndOr(pExpr->pRight); + Expr *pLeft = sqlite3ExprSimplifiedAndOr(pExpr->pLeft); + if( ExprAlwaysTrue(pLeft) || ExprAlwaysFalse(pRight) ){ + pExpr = pExpr->op==TK_AND ? pRight : pLeft; + }else if( ExprAlwaysTrue(pRight) || ExprAlwaysFalse(pLeft) ){ + pExpr = pExpr->op==TK_AND ? pLeft : pRight; + } + } + return pExpr; +} + + +/* +** These routines are Walker callbacks used to check expressions to +** see if they are "constant" for some definition of constant. The +** Walker.eCode value determines the type of "constant" we are looking +** for. +** +** These callback routines are used to implement the following: +** +** sqlite3ExprIsConstant() pWalker->eCode==1 +** sqlite3ExprIsConstantNotJoin() pWalker->eCode==2 +** sqlite3ExprIsTableConstant() pWalker->eCode==3 +** sqlite3ExprIsConstantOrFunction() pWalker->eCode==4 or 5 +** +** In all cases, the callbacks set Walker.eCode=0 and abort if the expression +** is found to not be a constant. +** +** The sqlite3ExprIsConstantOrFunction() is used for evaluating DEFAULT +** expressions in a CREATE TABLE statement. The Walker.eCode value is 5 +** when parsing an existing schema out of the sqlite_master table and 4 +** when processing a new CREATE TABLE statement. A bound parameter raises +** an error for new statements, but is silently converted +** to NULL for existing schemas. This allows sqlite_master tables that +** contain a bound parameter because they were generated by older versions +** of SQLite to be parsed by newer versions of SQLite without raising a +** malformed schema error. +*/ +static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ + + /* If pWalker->eCode is 2 then any term of the expression that comes from + ** the ON or USING clauses of a left join disqualifies the expression + ** from being considered constant. */ + if( pWalker->eCode==2 && ExprHasProperty(pExpr, EP_FromJoin) ){ + pWalker->eCode = 0; + return WRC_Abort; + } + + switch( pExpr->op ){ + /* Consider functions to be constant if all their arguments are constant + ** and either pWalker->eCode==4 or 5 or the function has the + ** SQLITE_FUNC_CONST flag. */ + case TK_FUNCTION: + if( (pWalker->eCode>=4 || ExprHasProperty(pExpr,EP_ConstFunc)) + && !ExprHasProperty(pExpr, EP_WinFunc) + ){ + if( pWalker->eCode==5 ) ExprSetProperty(pExpr, EP_FromDDL); + return WRC_Continue; + }else{ + pWalker->eCode = 0; + return WRC_Abort; + } + case TK_ID: + /* Convert "true" or "false" in a DEFAULT clause into the + ** appropriate TK_TRUEFALSE operator */ + if( sqlite3ExprIdToTrueFalse(pExpr) ){ + return WRC_Prune; + } + /* Fall thru */ + case TK_COLUMN: + case TK_AGG_FUNCTION: + case TK_AGG_COLUMN: + testcase( pExpr->op==TK_ID ); + testcase( pExpr->op==TK_COLUMN ); + testcase( pExpr->op==TK_AGG_FUNCTION ); + testcase( pExpr->op==TK_AGG_COLUMN ); + if( ExprHasProperty(pExpr, EP_FixedCol) && pWalker->eCode!=2 ){ + return WRC_Continue; + } + if( pWalker->eCode==3 && pExpr->iTable==pWalker->u.iCur ){ + return WRC_Continue; + } + /* Fall through */ + case TK_IF_NULL_ROW: + case TK_REGISTER: + case TK_DOT: + testcase( pExpr->op==TK_REGISTER ); + testcase( pExpr->op==TK_IF_NULL_ROW ); + testcase( pExpr->op==TK_DOT ); + pWalker->eCode = 0; + return WRC_Abort; + case TK_VARIABLE: + if( pWalker->eCode==5 ){ + /* Silently convert bound parameters that appear inside of CREATE + ** statements into a NULL when parsing the CREATE statement text out + ** of the sqlite_master table */ + pExpr->op = TK_NULL; + }else if( pWalker->eCode==4 ){ + /* A bound parameter in a CREATE statement that originates from + ** sqlite3_prepare() causes an error */ + pWalker->eCode = 0; + return WRC_Abort; + } + /* Fall through */ + default: + testcase( pExpr->op==TK_SELECT ); /* sqlite3SelectWalkFail() disallows */ + testcase( pExpr->op==TK_EXISTS ); /* sqlite3SelectWalkFail() disallows */ + return WRC_Continue; + } +} +static int exprIsConst(Expr *p, int initFlag, int iCur){ + Walker w; + w.eCode = initFlag; + w.xExprCallback = exprNodeIsConstant; + w.xSelectCallback = sqlite3SelectWalkFail; +#ifdef SQLITE_DEBUG + w.xSelectCallback2 = sqlite3SelectWalkAssert2; +#endif + w.u.iCur = iCur; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + +/* +** Walk an expression tree. Return non-zero if the expression is constant +** and 0 if it involves variables or function calls. +** +** For the purposes of this function, a double-quoted string (ex: "abc") +** is considered a variable but a single-quoted string (ex: 'abc') is +** a constant. +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){ + return exprIsConst(p, 1, 0); +} + +/* +** Walk an expression tree. Return non-zero if +** +** (1) the expression is constant, and +** (2) the expression does originate in the ON or USING clause +** of a LEFT JOIN, and +** (3) the expression does not contain any EP_FixedCol TK_COLUMN +** operands created by the constant propagation optimization. +** +** When this routine returns true, it indicates that the expression +** can be added to the pParse->pConstExpr list and evaluated once when +** the prepared statement starts up. See sqlite3ExprCodeRunJustOnce(). +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){ + return exprIsConst(p, 2, 0); +} + +/* +** Walk an expression tree. Return non-zero if the expression is constant +** for any single row of the table with cursor iCur. In other words, the +** expression must not refer to any non-deterministic function nor any +** table other than iCur. +*/ +SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ + return exprIsConst(p, 3, iCur); +} + + +/* +** sqlite3WalkExpr() callback used by sqlite3ExprIsConstantOrGroupBy(). +*/ +static int exprNodeIsConstantOrGroupBy(Walker *pWalker, Expr *pExpr){ + ExprList *pGroupBy = pWalker->u.pGroupBy; + int i; + + /* Check if pExpr is identical to any GROUP BY term. If so, consider + ** it constant. */ + for(i=0; inExpr; i++){ + Expr *p = pGroupBy->a[i].pExpr; + if( sqlite3ExprCompare(0, pExpr, p, -1)<2 ){ + CollSeq *pColl = sqlite3ExprNNCollSeq(pWalker->pParse, p); + if( sqlite3IsBinary(pColl) ){ + return WRC_Prune; + } + } + } + + /* Check if pExpr is a sub-select. If so, consider it variable. */ + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + pWalker->eCode = 0; + return WRC_Abort; + } + + return exprNodeIsConstant(pWalker, pExpr); +} + +/* +** Walk the expression tree passed as the first argument. Return non-zero +** if the expression consists entirely of constants or copies of terms +** in pGroupBy that sort with the BINARY collation sequence. +** +** This routine is used to determine if a term of the HAVING clause can +** be promoted into the WHERE clause. In order for such a promotion to work, +** the value of the HAVING clause term must be the same for all members of +** a "group". The requirement that the GROUP BY term must be BINARY +** assumes that no other collating sequence will have a finer-grained +** grouping than binary. In other words (A=B COLLATE binary) implies +** A=B in every other collating sequence. The requirement that the +** GROUP BY be BINARY is stricter than necessary. It would also work +** to promote HAVING clauses that use the same alternative collating +** sequence as the GROUP BY term, but that is much harder to check, +** alternative collating sequences are uncommon, and this is only an +** optimization, so we take the easy way out and simply require the +** GROUP BY to use the BINARY collating sequence. +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse *pParse, Expr *p, ExprList *pGroupBy){ + Walker w; + w.eCode = 1; + w.xExprCallback = exprNodeIsConstantOrGroupBy; + w.xSelectCallback = 0; + w.u.pGroupBy = pGroupBy; + w.pParse = pParse; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + +/* +** Walk an expression tree for the DEFAULT field of a column definition +** in a CREATE TABLE statement. Return non-zero if the expression is +** acceptable for use as a DEFAULT. That is to say, return non-zero if +** the expression is constant or a function call with constant arguments. +** Return and 0 if there are any variables. +** +** isInit is true when parsing from sqlite_master. isInit is false when +** processing a new CREATE TABLE statement. When isInit is true, parameters +** (such as ? or $abc) in the expression are converted into NULL. When +** isInit is false, parameters raise an error. Parameters should not be +** allowed in a CREATE TABLE statement, but some legacy versions of SQLite +** allowed it, so we need to support it when reading sqlite_master for +** backwards compatibility. +** +** If isInit is true, set EP_FromDDL on every TK_FUNCTION node. +** +** For the purposes of this function, a double-quoted string (ex: "abc") +** is considered a variable but a single-quoted string (ex: 'abc') is +** a constant. +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr *p, u8 isInit){ + assert( isInit==0 || isInit==1 ); + return exprIsConst(p, 4+isInit, 0); +} + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Walk an expression tree. Return 1 if the expression contains a +** subquery of some kind. Return 0 if there are no subqueries. +*/ +SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr *p){ + Walker w; + w.eCode = 1; + w.xExprCallback = sqlite3ExprWalkNoop; + w.xSelectCallback = sqlite3SelectWalkFail; +#ifdef SQLITE_DEBUG + w.xSelectCallback2 = sqlite3SelectWalkAssert2; +#endif + sqlite3WalkExpr(&w, p); + return w.eCode==0; +} +#endif + +/* +** If the expression p codes a constant integer that is small enough +** to fit in a 32-bit integer, return 1 and put the value of the integer +** in *pValue. If the expression is not an integer or if it is too big +** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. +*/ +SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){ + int rc = 0; + if( NEVER(p==0) ) return 0; /* Used to only happen following on OOM */ + + /* If an expression is an integer literal that fits in a signed 32-bit + ** integer, then the EP_IntValue flag will have already been set */ + assert( p->op!=TK_INTEGER || (p->flags & EP_IntValue)!=0 + || sqlite3GetInt32(p->u.zToken, &rc)==0 ); + + if( p->flags & EP_IntValue ){ + *pValue = p->u.iValue; + return 1; + } + switch( p->op ){ + case TK_UPLUS: { + rc = sqlite3ExprIsInteger(p->pLeft, pValue); + break; + } + case TK_UMINUS: { + int v; + if( sqlite3ExprIsInteger(p->pLeft, &v) ){ + assert( v!=(-2147483647-1) ); + *pValue = -v; + rc = 1; + } + break; + } + default: break; + } + return rc; +} + +/* +** Return FALSE if there is no chance that the expression can be NULL. +** +** If the expression might be NULL or if the expression is too complex +** to tell return TRUE. +** +** This routine is used as an optimization, to skip OP_IsNull opcodes +** when we know that a value cannot be NULL. Hence, a false positive +** (returning TRUE when in fact the expression can never be NULL) might +** be a small performance hit but is otherwise harmless. On the other +** hand, a false negative (returning FALSE when the result could be NULL) +** will likely result in an incorrect answer. So when in doubt, return +** TRUE. +*/ +SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ + u8 op; + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + p = p->pLeft; + } + op = p->op; + if( op==TK_REGISTER ) op = p->op2; + switch( op ){ + case TK_INTEGER: + case TK_STRING: + case TK_FLOAT: + case TK_BLOB: + return 0; + case TK_COLUMN: + return ExprHasProperty(p, EP_CanBeNull) || + p->y.pTab==0 || /* Reference to column of index on expression */ + (p->iColumn>=0 + && ALWAYS(p->y.pTab->aCol!=0) /* Defense against OOM problems */ + && p->y.pTab->aCol[p->iColumn].notNull==0); + default: + return 1; + } +} + +/* +** Return TRUE if the given expression is a constant which would be +** unchanged by OP_Affinity with the affinity given in the second +** argument. +** +** This routine is used to determine if the OP_Affinity operation +** can be omitted. When in doubt return FALSE. A false negative +** is harmless. A false positive, however, can result in the wrong +** answer. +*/ +SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ + u8 op; + int unaryMinus = 0; + if( aff==SQLITE_AFF_BLOB ) return 1; + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + if( p->op==TK_UMINUS ) unaryMinus = 1; + p = p->pLeft; + } + op = p->op; + if( op==TK_REGISTER ) op = p->op2; + switch( op ){ + case TK_INTEGER: { + return aff>=SQLITE_AFF_NUMERIC; + } + case TK_FLOAT: { + return aff>=SQLITE_AFF_NUMERIC; + } + case TK_STRING: { + return !unaryMinus && aff==SQLITE_AFF_TEXT; + } + case TK_BLOB: { + return !unaryMinus; + } + case TK_COLUMN: { + assert( p->iTable>=0 ); /* p cannot be part of a CHECK constraint */ + return aff>=SQLITE_AFF_NUMERIC && p->iColumn<0; + } + default: { + return 0; + } + } +} + +/* +** Return TRUE if the given string is a row-id column name. +*/ +SQLITE_PRIVATE int sqlite3IsRowid(const char *z){ + if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1; + if( sqlite3StrICmp(z, "ROWID")==0 ) return 1; + if( sqlite3StrICmp(z, "OID")==0 ) return 1; + return 0; +} + +/* +** pX is the RHS of an IN operator. If pX is a SELECT statement +** that can be simplified to a direct table access, then return +** a pointer to the SELECT statement. If pX is not a SELECT statement, +** or if the SELECT statement needs to be manifested into a transient +** table, then return NULL. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +static Select *isCandidateForInOpt(Expr *pX){ + Select *p; + SrcList *pSrc; + ExprList *pEList; + Table *pTab; + int i; + if( !ExprHasProperty(pX, EP_xIsSelect) ) return 0; /* Not a subquery */ + if( ExprHasProperty(pX, EP_VarSelect) ) return 0; /* Correlated subq */ + p = pX->x.pSelect; + if( p->pPrior ) return 0; /* Not a compound SELECT */ + if( p->selFlags & (SF_Distinct|SF_Aggregate) ){ + testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); + testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); + return 0; /* No DISTINCT keyword and no aggregate functions */ + } + assert( p->pGroupBy==0 ); /* Has no GROUP BY clause */ + if( p->pLimit ) return 0; /* Has no LIMIT clause */ + if( p->pWhere ) return 0; /* Has no WHERE clause */ + pSrc = p->pSrc; + assert( pSrc!=0 ); + if( pSrc->nSrc!=1 ) return 0; /* Single term in FROM clause */ + if( pSrc->a[0].pSelect ) return 0; /* FROM is not a subquery or view */ + pTab = pSrc->a[0].pTab; + assert( pTab!=0 ); + assert( pTab->pSelect==0 ); /* FROM clause is not a view */ + if( IsVirtual(pTab) ) return 0; /* FROM clause not a virtual table */ + pEList = p->pEList; + assert( pEList!=0 ); + /* All SELECT results must be columns. */ + for(i=0; inExpr; i++){ + Expr *pRes = pEList->a[i].pExpr; + if( pRes->op!=TK_COLUMN ) return 0; + assert( pRes->iTable==pSrc->a[0].iCursor ); /* Not a correlated subquery */ + } + return p; +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Generate code that checks the left-most column of index table iCur to see if +** it contains any NULL entries. Cause the register at regHasNull to be set +** to a non-NULL value if iCur contains no NULLs. Cause register regHasNull +** to be set to NULL if iCur contains one or more NULL values. +*/ +static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ + int addr1; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regHasNull); + addr1 = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Column, iCur, 0, regHasNull); + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + VdbeComment((v, "first_entry_in(%d)", iCur)); + sqlite3VdbeJumpHere(v, addr1); +} +#endif + + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** The argument is an IN operator with a list (not a subquery) on the +** right-hand side. Return TRUE if that list is constant. +*/ +static int sqlite3InRhsIsConstant(Expr *pIn){ + Expr *pLHS; + int res; + assert( !ExprHasProperty(pIn, EP_xIsSelect) ); + pLHS = pIn->pLeft; + pIn->pLeft = 0; + res = sqlite3ExprIsConstant(pIn); + pIn->pLeft = pLHS; + return res; +} +#endif + +/* +** This function is used by the implementation of the IN (...) operator. +** The pX parameter is the expression on the RHS of the IN operator, which +** might be either a list of expressions or a subquery. +** +** The job of this routine is to find or create a b-tree object that can +** be used either to test for membership in the RHS set or to iterate through +** all members of the RHS set, skipping duplicates. +** +** A cursor is opened on the b-tree object that is the RHS of the IN operator +** and pX->iTable is set to the index of that cursor. +** +** The returned value of this function indicates the b-tree type, as follows: +** +** IN_INDEX_ROWID - The cursor was opened on a database table. +** IN_INDEX_INDEX_ASC - The cursor was opened on an ascending index. +** IN_INDEX_INDEX_DESC - The cursor was opened on a descending index. +** IN_INDEX_EPH - The cursor was opened on a specially created and +** populated epheremal table. +** IN_INDEX_NOOP - No cursor was allocated. The IN operator must be +** implemented as a sequence of comparisons. +** +** An existing b-tree might be used if the RHS expression pX is a simple +** subquery such as: +** +** SELECT , ... FROM +** +** If the RHS of the IN operator is a list or a more complex subquery, then +** an ephemeral table might need to be generated from the RHS and then +** pX->iTable made to point to the ephemeral table instead of an +** existing table. +** +** The inFlags parameter must contain, at a minimum, one of the bits +** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains +** IN_INDEX_MEMBERSHIP, then the generated table will be used for a fast +** membership test. When the IN_INDEX_LOOP bit is set, the IN index will +** be used to loop over all values of the RHS of the IN operator. +** +** When IN_INDEX_LOOP is used (and the b-tree will be used to iterate +** through the set members) then the b-tree must not contain duplicates. +** An epheremal table will be created unless the selected columns are guaranteed +** to be unique - either because it is an INTEGER PRIMARY KEY or due to +** a UNIQUE constraint or index. +** +** When IN_INDEX_MEMBERSHIP is used (and the b-tree will be used +** for fast set membership tests) then an epheremal table must +** be used unless is a single INTEGER PRIMARY KEY column or an +** index can be found with the specified as its left-most. +** +** If the IN_INDEX_NOOP_OK and IN_INDEX_MEMBERSHIP are both set and +** if the RHS of the IN operator is a list (not a subquery) then this +** routine might decide that creating an ephemeral b-tree for membership +** testing is too expensive and return IN_INDEX_NOOP. In that case, the +** calling routine should implement the IN operator using a sequence +** of Eq or Ne comparison operations. +** +** When the b-tree is being used for membership tests, the calling function +** might need to know whether or not the RHS side of the IN operator +** contains a NULL. If prRhsHasNull is not a NULL pointer and +** if there is any chance that the (...) might contain a NULL value at +** runtime, then a register is allocated and the register number written +** to *prRhsHasNull. If there is no chance that the (...) contains a +** NULL value, then *prRhsHasNull is left unchanged. +** +** If a register is allocated and its location stored in *prRhsHasNull, then +** the value in that register will be NULL if the b-tree contains one or more +** NULL values, and it will be some non-NULL value if the b-tree contains no +** NULL values. +** +** If the aiMap parameter is not NULL, it must point to an array containing +** one element for each column returned by the SELECT statement on the RHS +** of the IN(...) operator. The i'th entry of the array is populated with the +** offset of the index column that matches the i'th column returned by the +** SELECT. For example, if the expression and selected index are: +** +** (?,?,?) IN (SELECT a, b, c FROM t1) +** CREATE INDEX i1 ON t1(b, c, a); +** +** then aiMap[] is populated with {2, 0, 1}. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3FindInIndex( + Parse *pParse, /* Parsing context */ + Expr *pX, /* The IN expression */ + u32 inFlags, /* IN_INDEX_LOOP, _MEMBERSHIP, and/or _NOOP_OK */ + int *prRhsHasNull, /* Register holding NULL status. See notes */ + int *aiMap, /* Mapping from Index fields to RHS fields */ + int *piTab /* OUT: index to use */ +){ + Select *p; /* SELECT to the right of IN operator */ + int eType = 0; /* Type of RHS table. IN_INDEX_* */ + int iTab = pParse->nTab++; /* Cursor of the RHS table */ + int mustBeUnique; /* True if RHS must be unique */ + Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ + + assert( pX->op==TK_IN ); + mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; + + /* If the RHS of this IN(...) operator is a SELECT, and if it matters + ** whether or not the SELECT result contains NULL values, check whether + ** or not NULL is actually possible (it may not be, for example, due + ** to NOT NULL constraints in the schema). If no NULL values are possible, + ** set prRhsHasNull to 0 before continuing. */ + if( prRhsHasNull && (pX->flags & EP_xIsSelect) ){ + int i; + ExprList *pEList = pX->x.pSelect->pEList; + for(i=0; inExpr; i++){ + if( sqlite3ExprCanBeNull(pEList->a[i].pExpr) ) break; + } + if( i==pEList->nExpr ){ + prRhsHasNull = 0; + } + } + + /* Check to see if an existing table or index can be used to + ** satisfy the query. This is preferable to generating a new + ** ephemeral table. */ + if( pParse->nErr==0 && (p = isCandidateForInOpt(pX))!=0 ){ + sqlite3 *db = pParse->db; /* Database connection */ + Table *pTab; /* Table
    . */ + i16 iDb; /* Database idx for pTab */ + ExprList *pEList = p->pEList; + int nExpr = pEList->nExpr; + + assert( p->pEList!=0 ); /* Because of isCandidateForInOpt(p) */ + assert( p->pEList->a[0].pExpr!=0 ); /* Because of isCandidateForInOpt(p) */ + assert( p->pSrc!=0 ); /* Because of isCandidateForInOpt(p) */ + pTab = p->pSrc->a[0].pTab; + + /* Code an OP_Transaction and OP_TableLock for
    . */ + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + + assert(v); /* sqlite3GetVdbe() has always been previously called */ + if( nExpr==1 && pEList->a[0].pExpr->iColumn<0 ){ + /* The "x IN (SELECT rowid FROM table)" case */ + int iAddr = sqlite3VdbeAddOp0(v, OP_Once); + VdbeCoverage(v); + + sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); + eType = IN_INDEX_ROWID; + ExplainQueryPlan((pParse, 0, + "USING ROWID SEARCH ON TABLE %s FOR IN-OPERATOR",pTab->zName)); + sqlite3VdbeJumpHere(v, iAddr); + }else{ + Index *pIdx; /* Iterator variable */ + int affinity_ok = 1; + int i; + + /* Check that the affinity that will be used to perform each + ** comparison is the same as the affinity of each column in table + ** on the RHS of the IN operator. If it not, it is not possible to + ** use any index of the RHS table. */ + for(i=0; ipLeft, i); + int iCol = pEList->a[i].pExpr->iColumn; + char idxaff = sqlite3TableColumnAffinity(pTab,iCol); /* RHS table */ + char cmpaff = sqlite3CompareAffinity(pLhs, idxaff); + testcase( cmpaff==SQLITE_AFF_BLOB ); + testcase( cmpaff==SQLITE_AFF_TEXT ); + switch( cmpaff ){ + case SQLITE_AFF_BLOB: + break; + case SQLITE_AFF_TEXT: + /* sqlite3CompareAffinity() only returns TEXT if one side or the + ** other has no affinity and the other side is TEXT. Hence, + ** the only way for cmpaff to be TEXT is for idxaff to be TEXT + ** and for the term on the LHS of the IN to have no affinity. */ + assert( idxaff==SQLITE_AFF_TEXT ); + break; + default: + affinity_ok = sqlite3IsNumericAffinity(idxaff); + } + } + + if( affinity_ok ){ + /* Search for an existing index that will work for this IN operator */ + for(pIdx=pTab->pIndex; pIdx && eType==0; pIdx=pIdx->pNext){ + Bitmask colUsed; /* Columns of the index used */ + Bitmask mCol; /* Mask for the current column */ + if( pIdx->nColumnpPartIdxWhere!=0 ) continue; + /* Maximum nColumn is BMS-2, not BMS-1, so that we can compute + ** BITMASK(nExpr) without overflowing */ + testcase( pIdx->nColumn==BMS-2 ); + testcase( pIdx->nColumn==BMS-1 ); + if( pIdx->nColumn>=BMS-1 ) continue; + if( mustBeUnique ){ + if( pIdx->nKeyCol>nExpr + ||(pIdx->nColumn>nExpr && !IsUniqueIndex(pIdx)) + ){ + continue; /* This index is not unique over the IN RHS columns */ + } + } + + colUsed = 0; /* Columns of index used so far */ + for(i=0; ipLeft, i); + Expr *pRhs = pEList->a[i].pExpr; + CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); + int j; + + assert( pReq!=0 || pRhs->iColumn==XN_ROWID || pParse->nErr ); + for(j=0; jaiColumn[j]!=pRhs->iColumn ) continue; + assert( pIdx->azColl[j] ); + if( pReq!=0 && sqlite3StrICmp(pReq->zName, pIdx->azColl[j])!=0 ){ + continue; + } + break; + } + if( j==nExpr ) break; + mCol = MASKBIT(j); + if( mCol & colUsed ) break; /* Each column used only once */ + colUsed |= mCol; + if( aiMap ) aiMap[i] = j; + } + + assert( i==nExpr || colUsed!=(MASKBIT(nExpr)-1) ); + if( colUsed==(MASKBIT(nExpr)-1) ){ + /* If we reach this point, that means the index pIdx is usable */ + int iAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + ExplainQueryPlan((pParse, 0, + "USING INDEX %s FOR IN-OPERATOR",pIdx->zName)); + sqlite3VdbeAddOp3(v, OP_OpenRead, iTab, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + VdbeComment((v, "%s", pIdx->zName)); + assert( IN_INDEX_INDEX_DESC == IN_INDEX_INDEX_ASC+1 ); + eType = IN_INDEX_INDEX_ASC + pIdx->aSortOrder[0]; + + if( prRhsHasNull ){ +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + i64 mask = (1<nMem; + if( nExpr==1 ){ + sqlite3SetHasNullFlag(v, iTab, *prRhsHasNull); + } + } + sqlite3VdbeJumpHere(v, iAddr); + } + } /* End loop over indexes */ + } /* End if( affinity_ok ) */ + } /* End if not an rowid index */ + } /* End attempt to optimize using an index */ + + /* If no preexisting index is available for the IN clause + ** and IN_INDEX_NOOP is an allowed reply + ** and the RHS of the IN operator is a list, not a subquery + ** and the RHS is not constant or has two or fewer terms, + ** then it is not worth creating an ephemeral table to evaluate + ** the IN operator so return IN_INDEX_NOOP. + */ + if( eType==0 + && (inFlags & IN_INDEX_NOOP_OK) + && !ExprHasProperty(pX, EP_xIsSelect) + && (!sqlite3InRhsIsConstant(pX) || pX->x.pList->nExpr<=2) + ){ + eType = IN_INDEX_NOOP; + } + + if( eType==0 ){ + /* Could not find an existing table or index to use as the RHS b-tree. + ** We will have to generate an ephemeral table to do the job. + */ + u32 savedNQueryLoop = pParse->nQueryLoop; + int rMayHaveNull = 0; + eType = IN_INDEX_EPH; + if( inFlags & IN_INDEX_LOOP ){ + pParse->nQueryLoop = 0; + }else if( prRhsHasNull ){ + *prRhsHasNull = rMayHaveNull = ++pParse->nMem; + } + assert( pX->op==TK_IN ); + sqlite3CodeRhsOfIN(pParse, pX, iTab); + if( rMayHaveNull ){ + sqlite3SetHasNullFlag(v, iTab, rMayHaveNull); + } + pParse->nQueryLoop = savedNQueryLoop; + } + + if( aiMap && eType!=IN_INDEX_INDEX_ASC && eType!=IN_INDEX_INDEX_DESC ){ + int i, n; + n = sqlite3ExprVectorSize(pX->pLeft); + for(i=0; ipLeft; + int nVal = sqlite3ExprVectorSize(pLeft); + Select *pSelect = (pExpr->flags & EP_xIsSelect) ? pExpr->x.pSelect : 0; + char *zRet; + + assert( pExpr->op==TK_IN ); + zRet = sqlite3DbMallocRaw(pParse->db, nVal+1); + if( zRet ){ + int i; + for(i=0; ipEList->a[i].pExpr, a); + }else{ + zRet[i] = a; + } + } + zRet[nVal] = '\0'; + } + return zRet; +} +#endif + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Load the Parse object passed as the first argument with an error +** message of the form: +** +** "sub-select returns N columns - expected M" +*/ +SQLITE_PRIVATE void sqlite3SubselectError(Parse *pParse, int nActual, int nExpect){ + if( pParse->nErr==0 ){ + const char *zFmt = "sub-select returns %d columns - expected %d"; + sqlite3ErrorMsg(pParse, zFmt, nActual, nExpect); + } +} +#endif + +/* +** Expression pExpr is a vector that has been used in a context where +** it is not permitted. If pExpr is a sub-select vector, this routine +** loads the Parse object with a message of the form: +** +** "sub-select returns N columns - expected 1" +** +** Or, if it is a regular scalar vector: +** +** "row value misused" +*/ +SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ +#ifndef SQLITE_OMIT_SUBQUERY + if( pExpr->flags & EP_xIsSelect ){ + sqlite3SubselectError(pParse, pExpr->x.pSelect->pEList->nExpr, 1); + }else +#endif + { + sqlite3ErrorMsg(pParse, "row value misused"); + } +} + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Generate code that will construct an ephemeral table containing all terms +** in the RHS of an IN operator. The IN operator can be in either of two +** forms: +** +** x IN (4,5,11) -- IN operator with list on right-hand side +** x IN (SELECT a FROM b) -- IN operator with subquery on the right +** +** The pExpr parameter is the IN operator. The cursor number for the +** constructed ephermeral table is returned. The first time the ephemeral +** table is computed, the cursor number is also stored in pExpr->iTable, +** however the cursor number returned might not be the same, as it might +** have been duplicated using OP_OpenDup. +** +** If the LHS expression ("x" in the examples) is a column value, or +** the SELECT statement returns a column value, then the affinity of that +** column is used to build the index keys. If both 'x' and the +** SELECT... statement are columns, then numeric affinity is used +** if either column has NUMERIC or INTEGER affinity. If neither +** 'x' nor the SELECT... statement are columns, then numeric affinity +** is used. +*/ +SQLITE_PRIVATE void sqlite3CodeRhsOfIN( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The IN operator */ + int iTab /* Use this cursor number */ +){ + int addrOnce = 0; /* Address of the OP_Once instruction at top */ + int addr; /* Address of OP_OpenEphemeral instruction */ + Expr *pLeft; /* the LHS of the IN operator */ + KeyInfo *pKeyInfo = 0; /* Key information */ + int nVal; /* Size of vector pLeft */ + Vdbe *v; /* The prepared statement under construction */ + + v = pParse->pVdbe; + assert( v!=0 ); + + /* The evaluation of the IN must be repeated every time it + ** is encountered if any of the following is true: + ** + ** * The right-hand side is a correlated subquery + ** * The right-hand side is an expression list containing variables + ** * We are inside a trigger + ** + ** If all of the above are false, then we can compute the RHS just once + ** and reuse it many names. + */ + if( !ExprHasProperty(pExpr, EP_VarSelect) && pParse->iSelfTab==0 ){ + /* Reuse of the RHS is allowed */ + /* If this routine has already been coded, but the previous code + ** might not have been invoked yet, so invoke it now as a subroutine. + */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d", + pExpr->x.pSelect->selId)); + } + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); + sqlite3VdbeJumpHere(v, addrOnce); + return; + } + + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); + + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + + /* Check to see if this is a vector IN operator */ + pLeft = pExpr->pLeft; + nVal = sqlite3ExprVectorSize(pLeft); + + /* Construct the ephemeral table that will contain the content of + ** RHS of the IN operator. + */ + pExpr->iTable = iTab; + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); + }else{ + VdbeComment((v, "RHS of IN operator")); + } +#endif + pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + /* Case 1: expr IN (SELECT ...) + ** + ** Generate code to write the results of the select into the temporary + ** table allocated and opened above. + */ + Select *pSelect = pExpr->x.pSelect; + ExprList *pEList = pSelect->pEList; + + ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSelect->selId + )); + /* If the LHS and RHS of the IN operator do not match, that + ** error will have been caught long before we reach this point. */ + if( ALWAYS(pEList->nExpr==nVal) ){ + SelectDest dest; + int i; + sqlite3SelectDestInit(&dest, SRT_Set, iTab); + dest.zAffSdst = exprINAffinity(pParse, pExpr); + pSelect->iLimit = 0; + testcase( pSelect->selFlags & SF_Distinct ); + testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ + if( sqlite3Select(pParse, pSelect, &dest) ){ + sqlite3DbFree(pParse->db, dest.zAffSdst); + sqlite3KeyInfoUnref(pKeyInfo); + return; + } + sqlite3DbFree(pParse->db, dest.zAffSdst); + assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ + assert( pEList!=0 ); + assert( pEList->nExpr>0 ); + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( + pParse, p, pEList->a[i].pExpr + ); + } + } + }else if( ALWAYS(pExpr->x.pList!=0) ){ + /* Case 2: expr IN (exprlist) + ** + ** For each expression, build an index key from the evaluation and + ** store it in the temporary table. If is a column, then use + ** that columns affinity when building index keys. If is not + ** a column, use numeric affinity. + */ + char affinity; /* Affinity of the LHS of the IN */ + int i; + ExprList *pList = pExpr->x.pList; + struct ExprList_item *pItem; + int r1, r2; + affinity = sqlite3ExprAffinity(pLeft); + if( affinity<=SQLITE_AFF_NONE ){ + affinity = SQLITE_AFF_BLOB; + }else if( affinity==SQLITE_AFF_REAL ){ + affinity = SQLITE_AFF_NUMERIC; + } + if( pKeyInfo ){ + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + } + + /* Loop through each expression in . */ + r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3GetTempReg(pParse); + for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ + Expr *pE2 = pItem->pExpr; + + /* If the expression is not constant then we will need to + ** disable the test that was generated above that makes sure + ** this code only executes once. Because for a non-constant + ** expression we need to rerun this code each time. + */ + if( addrOnce && !sqlite3ExprIsConstant(pE2) ){ + sqlite3VdbeChangeToNoop(v, addrOnce); + ExprClearProperty(pExpr, EP_Subrtn); + addrOnce = 0; + } + + /* Evaluate the expression and insert it into the temp table */ + sqlite3ExprCode(pParse, pE2, r1); + sqlite3VdbeAddOp4(v, OP_MakeRecord, r1, 1, r2, &affinity, 1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r1, 1); + } + sqlite3ReleaseTempReg(pParse, r1); + sqlite3ReleaseTempReg(pParse, r2); + } + if( pKeyInfo ){ + sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); + } + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + sqlite3ClearTempRegCache(pParse); + } +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +/* +** Generate code for scalar subqueries used as a subquery expression +** or EXISTS operator: +** +** (SELECT a FROM b) -- subquery +** EXISTS (SELECT a FROM b) -- EXISTS subquery +** +** The pExpr parameter is the SELECT or EXISTS operator to be coded. +** +** Return the register that holds the result. For a multi-column SELECT, +** the result is stored in a contiguous array of registers and the +** return value is the register of the left-most result column. +** Return 0 if an error occurs. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ + int addrOnce = 0; /* Address of OP_Once at top of subroutine */ + int rReg = 0; /* Register storing resulting */ + Select *pSel; /* SELECT statement to encode */ + SelectDest dest; /* How to deal with SELECT result */ + int nReg; /* Registers to allocate */ + Expr *pLimit; /* New limit expression */ + + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + testcase( pExpr->op==TK_EXISTS ); + testcase( pExpr->op==TK_SELECT ); + assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); + assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + pSel = pExpr->x.pSelect; + + /* The evaluation of the EXISTS/SELECT must be repeated every time it + ** is encountered if any of the following is true: + ** + ** * The right-hand side is a correlated subquery + ** * The right-hand side is an expression list containing variables + ** * We are inside a trigger + ** + ** If all of the above are false, then we can run this code just once + ** save the results, and reuse the same result on subsequent invocations. + */ + if( !ExprHasProperty(pExpr, EP_VarSelect) ){ + /* If this routine has already been coded, then invoke it as a + ** subroutine. */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId)); + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + return pExpr->iTable; + } + + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); + + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + + /* For a SELECT, generate code to put the values for all columns of + ** the first row into an array of registers and return the index of + ** the first register. + ** + ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) + ** into a register and return that register number. + ** + ** In both cases, the query is augmented with "LIMIT 1". Any + ** preexisting limit is discarded in place of the new LIMIT 1. + */ + ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSel->selId)); + nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; + sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); + pParse->nMem += nReg; + if( pExpr->op==TK_SELECT ){ + dest.eDest = SRT_Mem; + dest.iSdst = dest.iSDParm; + dest.nSdst = nReg; + sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); + VdbeComment((v, "Init subquery result")); + }else{ + dest.eDest = SRT_Exists; + sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); + VdbeComment((v, "Init EXISTS result")); + } + if( pSel->pLimit ){ + /* The subquery already has a limit. If the pre-existing limit is X + ** then make the new limit X<>0 so that the new limit is either 1 or 0 */ + sqlite3 *db = pParse->db; + pLimit = sqlite3Expr(db, TK_INTEGER, "0"); + if( pLimit ){ + pLimit->affExpr = SQLITE_AFF_NUMERIC; + pLimit = sqlite3PExpr(pParse, TK_NE, + sqlite3ExprDup(db, pSel->pLimit->pLeft, 0), pLimit); + } + sqlite3ExprDelete(db, pSel->pLimit->pLeft); + pSel->pLimit->pLeft = pLimit; + }else{ + /* If there is no pre-existing limit add a limit of 1 */ + pLimit = sqlite3Expr(pParse->db, TK_INTEGER, "1"); + pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); + } + pSel->iLimit = 0; + if( sqlite3Select(pParse, pSel, &dest) ){ + return 0; + } + pExpr->iTable = rReg = dest.iSDParm; + ExprSetVVAProperty(pExpr, EP_NoReduce); + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); + + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + sqlite3ClearTempRegCache(pParse); + } + + return rReg; +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Expr pIn is an IN(...) expression. This function checks that the +** sub-select on the RHS of the IN() operator has the same number of +** columns as the vector on the LHS. Or, if the RHS of the IN() is not +** a sub-query, that the LHS is a vector of size 1. +*/ +SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){ + int nVector = sqlite3ExprVectorSize(pIn->pLeft); + if( (pIn->flags & EP_xIsSelect) ){ + if( nVector!=pIn->x.pSelect->pEList->nExpr ){ + sqlite3SubselectError(pParse, pIn->x.pSelect->pEList->nExpr, nVector); + return 1; + } + }else if( nVector!=1 ){ + sqlite3VectorErrorMsg(pParse, pIn->pLeft); + return 1; + } + return 0; +} +#endif + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Generate code for an IN expression. +** +** x IN (SELECT ...) +** x IN (value, value, ...) +** +** The left-hand side (LHS) is a scalar or vector expression. The +** right-hand side (RHS) is an array of zero or more scalar values, or a +** subquery. If the RHS is a subquery, the number of result columns must +** match the number of columns in the vector on the LHS. If the RHS is +** a list of values, the LHS must be a scalar. +** +** The IN operator is true if the LHS value is contained within the RHS. +** The result is false if the LHS is definitely not in the RHS. The +** result is NULL if the presence of the LHS in the RHS cannot be +** determined due to NULLs. +** +** This routine generates code that jumps to destIfFalse if the LHS is not +** contained within the RHS. If due to NULLs we cannot determine if the LHS +** is contained in the RHS then jump to destIfNull. If the LHS is contained +** within the RHS then fall through. +** +** See the separate in-operator.md documentation file in the canonical +** SQLite source tree for additional information. +*/ +static void sqlite3ExprCodeIN( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* The IN expression */ + int destIfFalse, /* Jump here if LHS is not contained in the RHS */ + int destIfNull /* Jump here if the results are unknown due to NULLs */ +){ + int rRhsHasNull = 0; /* Register that is true if RHS contains NULL values */ + int eType; /* Type of the RHS */ + int rLhs; /* Register(s) holding the LHS values */ + int rLhsOrig; /* LHS values prior to reordering by aiMap[] */ + Vdbe *v; /* Statement under construction */ + int *aiMap = 0; /* Map from vector field to index column */ + char *zAff = 0; /* Affinity string for comparisons */ + int nVector; /* Size of vectors for this IN operator */ + int iDummy; /* Dummy parameter to exprCodeVector() */ + Expr *pLeft; /* The LHS of the IN operator */ + int i; /* loop counter */ + int destStep2; /* Where to jump when NULLs seen in step 2 */ + int destStep6 = 0; /* Start of code for Step 6 */ + int addrTruthOp; /* Address of opcode that determines the IN is true */ + int destNotNull; /* Jump here if a comparison is not true in step 6 */ + int addrTop; /* Top of the step-6 loop */ + int iTab = 0; /* Index to use */ + u8 okConstFactor = pParse->okConstFactor; + + assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); + pLeft = pExpr->pLeft; + if( sqlite3ExprCheckIN(pParse, pExpr) ) return; + zAff = exprINAffinity(pParse, pExpr); + nVector = sqlite3ExprVectorSize(pExpr->pLeft); + aiMap = (int*)sqlite3DbMallocZero( + pParse->db, nVector*(sizeof(int) + sizeof(char)) + 1 + ); + if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error; + + /* Attempt to compute the RHS. After this step, if anything other than + ** IN_INDEX_NOOP is returned, the table opened with cursor iTab + ** contains the values that make up the RHS. If IN_INDEX_NOOP is returned, + ** the RHS has not yet been coded. */ + v = pParse->pVdbe; + assert( v!=0 ); /* OOM detected prior to this routine */ + VdbeNoopComment((v, "begin IN expr")); + eType = sqlite3FindInIndex(pParse, pExpr, + IN_INDEX_MEMBERSHIP | IN_INDEX_NOOP_OK, + destIfFalse==destIfNull ? 0 : &rRhsHasNull, + aiMap, &iTab); + + assert( pParse->nErr || nVector==1 || eType==IN_INDEX_EPH + || eType==IN_INDEX_INDEX_ASC || eType==IN_INDEX_INDEX_DESC + ); +#ifdef SQLITE_DEBUG + /* Confirm that aiMap[] contains nVector integer values between 0 and + ** nVector-1. */ + for(i=0; i from " IN (...)". If the LHS is a + ** vector, then it is stored in an array of nVector registers starting + ** at r1. + ** + ** sqlite3FindInIndex() might have reordered the fields of the LHS vector + ** so that the fields are in the same order as an existing index. The + ** aiMap[] array contains a mapping from the original LHS field order to + ** the field order that matches the RHS index. + ** + ** Avoid factoring the LHS of the IN(...) expression out of the loop, + ** even if it is constant, as OP_Affinity may be used on the register + ** by code generated below. */ + assert( pParse->okConstFactor==okConstFactor ); + pParse->okConstFactor = 0; + rLhsOrig = exprCodeVector(pParse, pLeft, &iDummy); + pParse->okConstFactor = okConstFactor; + for(i=0; ix.pList; + CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + int labelOk = sqlite3VdbeMakeLabel(pParse); + int r2, regToFree; + int regCkNull = 0; + int ii; + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + if( destIfNull!=destIfFalse ){ + regCkNull = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull); + } + for(ii=0; iinExpr; ii++){ + r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); + if( regCkNull && sqlite3ExprCanBeNull(pList->a[ii].pExpr) ){ + sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); + } + sqlite3ReleaseTempReg(pParse, regToFree); + if( iinExpr-1 || destIfNull!=destIfFalse ){ + int op = rLhs!=r2 ? OP_Eq : OP_NotNull; + sqlite3VdbeAddOp4(v, op, rLhs, labelOk, r2, + (void*)pColl, P4_COLLSEQ); + VdbeCoverageIf(v, iinExpr-1 && op==OP_Eq); + VdbeCoverageIf(v, ii==pList->nExpr-1 && op==OP_Eq); + VdbeCoverageIf(v, iinExpr-1 && op==OP_NotNull); + VdbeCoverageIf(v, ii==pList->nExpr-1 && op==OP_NotNull); + sqlite3VdbeChangeP5(v, zAff[0]); + }else{ + int op = rLhs!=r2 ? OP_Ne : OP_IsNull; + assert( destIfNull==destIfFalse ); + sqlite3VdbeAddOp4(v, op, rLhs, destIfFalse, r2, + (void*)pColl, P4_COLLSEQ); + VdbeCoverageIf(v, op==OP_Ne); + VdbeCoverageIf(v, op==OP_IsNull); + sqlite3VdbeChangeP5(v, zAff[0] | SQLITE_JUMPIFNULL); + } + } + if( regCkNull ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regCkNull, destIfNull); VdbeCoverage(v); + sqlite3VdbeGoto(v, destIfFalse); + } + sqlite3VdbeResolveLabel(v, labelOk); + sqlite3ReleaseTempReg(pParse, regCkNull); + goto sqlite3ExprCodeIN_finished; + } + + /* Step 2: Check to see if the LHS contains any NULL columns. If the + ** LHS does contain NULLs then the result must be either FALSE or NULL. + ** We will then skip the binary search of the RHS. + */ + if( destIfNull==destIfFalse ){ + destStep2 = destIfFalse; + }else{ + destStep2 = destStep6 = sqlite3VdbeMakeLabel(pParse); + } + if( pParse->nErr ) goto sqlite3ExprCodeIN_finished; + for(i=0; ipLeft, i); + if( sqlite3ExprCanBeNull(p) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, rLhs+i, destStep2); + VdbeCoverage(v); + } + } + + /* Step 3. The LHS is now known to be non-NULL. Do the binary search + ** of the RHS using the LHS as a probe. If found, the result is + ** true. + */ + if( eType==IN_INDEX_ROWID ){ + /* In this case, the RHS is the ROWID of table b-tree and so we also + ** know that the RHS is non-NULL. Hence, we combine steps 3 and 4 + ** into a single opcode. */ + sqlite3VdbeAddOp3(v, OP_SeekRowid, iTab, destIfFalse, rLhs); + VdbeCoverage(v); + addrTruthOp = sqlite3VdbeAddOp0(v, OP_Goto); /* Return True */ + }else{ + sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); + if( destIfFalse==destIfNull ){ + /* Combine Step 3 and Step 5 into a single opcode */ + sqlite3VdbeAddOp4Int(v, OP_NotFound, iTab, destIfFalse, + rLhs, nVector); VdbeCoverage(v); + goto sqlite3ExprCodeIN_finished; + } + /* Ordinary Step 3, for the case where FALSE and NULL are distinct */ + addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, iTab, 0, + rLhs, nVector); VdbeCoverage(v); + } + + /* Step 4. If the RHS is known to be non-NULL and we did not find + ** an match on the search above, then the result must be FALSE. + */ + if( rRhsHasNull && nVector==1 ){ + sqlite3VdbeAddOp2(v, OP_NotNull, rRhsHasNull, destIfFalse); + VdbeCoverage(v); + } + + /* Step 5. If we do not care about the difference between NULL and + ** FALSE, then just return false. + */ + if( destIfFalse==destIfNull ) sqlite3VdbeGoto(v, destIfFalse); + + /* Step 6: Loop through rows of the RHS. Compare each row to the LHS. + ** If any comparison is NULL, then the result is NULL. If all + ** comparisons are FALSE then the final result is FALSE. + ** + ** For a scalar LHS, it is sufficient to check just the first row + ** of the RHS. + */ + if( destStep6 ) sqlite3VdbeResolveLabel(v, destStep6); + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, destIfFalse); + VdbeCoverage(v); + if( nVector>1 ){ + destNotNull = sqlite3VdbeMakeLabel(pParse); + }else{ + /* For nVector==1, combine steps 6 and 7 by immediately returning + ** FALSE if the first comparison is not NULL */ + destNotNull = destIfFalse; + } + for(i=0; i1 ){ + sqlite3VdbeResolveLabel(v, destNotNull); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addrTop+1); + VdbeCoverage(v); + + /* Step 7: If we reach this point, we know that the result must + ** be false. */ + sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); + } + + /* Jumps here in order to return true. */ + sqlite3VdbeJumpHere(v, addrTruthOp); + +sqlite3ExprCodeIN_finished: + if( rLhs!=rLhsOrig ) sqlite3ReleaseTempReg(pParse, rLhs); + VdbeComment((v, "end IN expr")); +sqlite3ExprCodeIN_oom_error: + sqlite3DbFree(pParse->db, aiMap); + sqlite3DbFree(pParse->db, zAff); +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** Generate an instruction that will put the floating point +** value described by z[0..n-1] into register iMem. +** +** The z[] string will probably not be zero-terminated. But the +** z[n] character is guaranteed to be something that does not look +** like the continuation of the number. +*/ +static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){ + if( ALWAYS(z!=0) ){ + double value; + sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8); + assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */ + if( negateFlag ) value = -value; + sqlite3VdbeAddOp4Dup8(v, OP_Real, 0, iMem, 0, (u8*)&value, P4_REAL); + } +} +#endif + + +/* +** Generate an instruction that will put the integer describe by +** text z[0..n-1] into register iMem. +** +** Expr.u.zToken is always UTF8 and zero-terminated. +*/ +static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ + Vdbe *v = pParse->pVdbe; + if( pExpr->flags & EP_IntValue ){ + int i = pExpr->u.iValue; + assert( i>=0 ); + if( negFlag ) i = -i; + sqlite3VdbeAddOp2(v, OP_Integer, i, iMem); + }else{ + int c; + i64 value; + const char *z = pExpr->u.zToken; + assert( z!=0 ); + c = sqlite3DecOrHexToI64(z, &value); + if( (c==3 && !negFlag) || (c==2) || (negFlag && value==SMALLEST_INT64)){ +#ifdef SQLITE_OMIT_FLOATING_POINT + sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z); +#else +#ifndef SQLITE_OMIT_HEX_INTEGER + if( sqlite3_strnicmp(z,"0x",2)==0 ){ + sqlite3ErrorMsg(pParse, "hex literal too big: %s%s", negFlag?"-":"",z); + }else +#endif + { + codeReal(v, z, negFlag, iMem); + } +#endif + }else{ + if( negFlag ){ value = c==3 ? SMALLEST_INT64 : -value; } + sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, iMem, 0, (u8*)&value, P4_INT64); + } + } +} + + +/* Generate code that will load into register regOut a value that is +** appropriate for the iIdxCol-th column of index pIdx. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn( + Parse *pParse, /* The parsing context */ + Index *pIdx, /* The index whose column is to be loaded */ + int iTabCur, /* Cursor pointing to a table row */ + int iIdxCol, /* The column of the index to be loaded */ + int regOut /* Store the index column value in this register */ +){ + i16 iTabCol = pIdx->aiColumn[iIdxCol]; + if( iTabCol==XN_EXPR ){ + assert( pIdx->aColExpr ); + assert( pIdx->aColExpr->nExpr>iIdxCol ); + pParse->iSelfTab = iTabCur + 1; + sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[iIdxCol].pExpr, regOut); + pParse->iSelfTab = 0; + }else{ + sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pIdx->pTable, iTabCur, + iTabCol, regOut); + } +} + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* +** Generate code that will compute the value of generated column pCol +** and store the result in register regOut +*/ +SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn( + Parse *pParse, + Column *pCol, + int regOut +){ + int iAddr; + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + assert( pParse->iSelfTab!=0 ); + if( pParse->iSelfTab>0 ){ + iAddr = sqlite3VdbeAddOp3(v, OP_IfNullRow, pParse->iSelfTab-1, 0, regOut); + }else{ + iAddr = 0; + } + sqlite3ExprCodeCopy(pParse, pCol->pDflt, regOut); + if( pCol->affinity>=SQLITE_AFF_TEXT ){ + sqlite3VdbeAddOp4(v, OP_Affinity, regOut, 1, 0, &pCol->affinity, 1); + } + if( iAddr ) sqlite3VdbeJumpHere(v, iAddr); +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + +/* +** Generate code to extract the value of the iCol-th column of a table. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( + Vdbe *v, /* Parsing context */ + Table *pTab, /* The table containing the value */ + int iTabCur, /* The table cursor. Or the PK cursor for WITHOUT ROWID */ + int iCol, /* Index of the column to extract */ + int regOut /* Extract the value into this register */ +){ + Column *pCol; + assert( v!=0 ); + if( pTab==0 ){ + sqlite3VdbeAddOp3(v, OP_Column, iTabCur, iCol, regOut); + return; + } + if( iCol<0 || iCol==pTab->iPKey ){ + sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); + }else{ + int op; + int x; + if( IsVirtual(pTab) ){ + op = OP_VColumn; + x = iCol; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( (pCol = &pTab->aCol[iCol])->colFlags & COLFLAG_VIRTUAL ){ + Parse *pParse = sqlite3VdbeParser(v); + if( pCol->colFlags & COLFLAG_BUSY ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pCol->zName); + }else{ + int savedSelfTab = pParse->iSelfTab; + pCol->colFlags |= COLFLAG_BUSY; + pParse->iSelfTab = iTabCur+1; + sqlite3ExprCodeGeneratedColumn(pParse, pCol, regOut); + pParse->iSelfTab = savedSelfTab; + pCol->colFlags &= ~COLFLAG_BUSY; + } + return; +#endif + }else if( !HasRowid(pTab) ){ + testcase( iCol!=sqlite3TableColumnToStorage(pTab, iCol) ); + x = sqlite3TableColumnToIndex(sqlite3PrimaryKeyIndex(pTab), iCol); + op = OP_Column; + }else{ + x = sqlite3TableColumnToStorage(pTab,iCol); + testcase( x!=iCol ); + op = OP_Column; + } + sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); + sqlite3ColumnDefault(v, pTab, iCol, regOut); + } +} + +/* +** Generate code that will extract the iColumn-th column from +** table pTab and store the column value in register iReg. +** +** There must be an open cursor to pTab in iTable when this routine +** is called. If iColumn<0 then code is generated that extracts the rowid. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeGetColumn( + Parse *pParse, /* Parsing and code generating context */ + Table *pTab, /* Description of the table we are reading from */ + int iColumn, /* Index of the table column */ + int iTable, /* The cursor pointing to the table */ + int iReg, /* Store results here */ + u8 p5 /* P5 value for OP_Column + FLAGS */ +){ + assert( pParse->pVdbe!=0 ); + sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg); + if( p5 ){ + VdbeOp *pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1); + if( pOp->opcode==OP_Column ) pOp->p5 = p5; + } + return iReg; +} + +/* +** Generate code to move content from registers iFrom...iFrom+nReg-1 +** over to iTo..iTo+nReg-1. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){ + sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg); +} + +/* +** Convert a scalar expression node to a TK_REGISTER referencing +** register iReg. The caller must ensure that iReg already contains +** the correct value for the expression. +*/ +static void exprToRegister(Expr *pExpr, int iReg){ + Expr *p = sqlite3ExprSkipCollateAndLikely(pExpr); + p->op2 = p->op; + p->op = TK_REGISTER; + p->iTable = iReg; + ExprClearProperty(p, EP_Skip); +} + +/* +** Evaluate an expression (either a vector or a scalar expression) and store +** the result in continguous temporary registers. Return the index of +** the first register used to store the result. +** +** If the returned result register is a temporary scalar, then also write +** that register number into *piFreeable. If the returned result register +** is not a temporary or if the expression is a vector set *piFreeable +** to 0. +*/ +static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ + int iResult; + int nResult = sqlite3ExprVectorSize(p); + if( nResult==1 ){ + iResult = sqlite3ExprCodeTemp(pParse, p, piFreeable); + }else{ + *piFreeable = 0; + if( p->op==TK_SELECT ){ +#if SQLITE_OMIT_SUBQUERY + iResult = 0; +#else + iResult = sqlite3CodeSubselect(pParse, p); +#endif + }else{ + int i; + iResult = pParse->nMem+1; + pParse->nMem += nResult; + for(i=0; ix.pList->a[i].pExpr, i+iResult); + } + } + } + return iResult; +} + +/* +** If the last opcode is a OP_Copy, then set the do-not-merge flag (p5) +** so that a subsequent copy will not be merged into this one. +*/ +static void setDoNotMergeFlagOnCopy(Vdbe *v){ + if( sqlite3VdbeGetOp(v, -1)->opcode==OP_Copy ){ + sqlite3VdbeChangeP5(v, 1); /* Tag trailing OP_Copy as not mergable */ + } +} + +/* +** Generate code to implement special SQL functions that are implemented +** in-line rather than by using the usual callbacks. +*/ +static int exprCodeInlineFunction( + Parse *pParse, /* Parsing context */ + ExprList *pFarg, /* List of function arguments */ + int iFuncId, /* Function ID. One of the INTFUNC_... values */ + int target /* Store function result in this register */ +){ + int nFarg; + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + assert( pFarg!=0 ); + nFarg = pFarg->nExpr; + assert( nFarg>0 ); /* All in-line functions have at least one argument */ + switch( iFuncId ){ + case INLINEFUNC_coalesce: { + /* Attempt a direct implementation of the built-in COALESCE() and + ** IFNULL() functions. This avoids unnecessary evaluation of + ** arguments past the first non-NULL argument. + */ + int endCoalesce = sqlite3VdbeMakeLabel(pParse); + int i; + assert( nFarg>=2 ); + sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); + for(i=1; ia[i].pExpr, target); + } + setDoNotMergeFlagOnCopy(v); + sqlite3VdbeResolveLabel(v, endCoalesce); + break; + } + case INLINEFUNC_iif: { + Expr caseExpr; + memset(&caseExpr, 0, sizeof(caseExpr)); + caseExpr.op = TK_CASE; + caseExpr.x.pList = pFarg; + return sqlite3ExprCodeTarget(pParse, &caseExpr, target); + } + + default: { + /* The UNLIKELY() function is a no-op. The result is the value + ** of the first argument. + */ + assert( nFarg==1 || nFarg==2 ); + target = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); + break; + } + + /*********************************************************************** + ** Test-only SQL functions that are only usable if enabled + ** via SQLITE_TESTCTRL_INTERNAL_FUNCTIONS + */ + case INLINEFUNC_expr_compare: { + /* Compare two expressions using sqlite3ExprCompare() */ + assert( nFarg==2 ); + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprCompare(0,pFarg->a[0].pExpr, pFarg->a[1].pExpr,-1), + target); + break; + } + + case INLINEFUNC_expr_implies_expr: { + /* Compare two expressions using sqlite3ExprImpliesExpr() */ + assert( nFarg==2 ); + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprImpliesExpr(pParse,pFarg->a[0].pExpr, pFarg->a[1].pExpr,-1), + target); + break; + } + + case INLINEFUNC_implies_nonnull_row: { + /* REsult of sqlite3ExprImpliesNonNullRow() */ + Expr *pA1; + assert( nFarg==2 ); + pA1 = pFarg->a[1].pExpr; + if( pA1->op==TK_COLUMN ){ + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprImpliesNonNullRow(pFarg->a[0].pExpr,pA1->iTable), + target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + break; + } + +#ifdef SQLITE_DEBUG + case INLINEFUNC_affinity: { + /* The AFFINITY() function evaluates to a string that describes + ** the type affinity of the argument. This is used for testing of + ** the SQLite type logic. + */ + const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; + char aff; + assert( nFarg==1 ); + aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); + sqlite3VdbeLoadString(v, target, + (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); + break; + } +#endif + } + return target; +} + + +/* +** Generate code into the current Vdbe to evaluate the given +** expression. Attempt to store the results in register "target". +** Return the register where results are stored. +** +** With this routine, there is no guarantee that results will +** be stored in target. The result might be stored in some other +** register if it is convenient to do so. The calling function +** must check the return code and move the results to the desired +** register. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ + Vdbe *v = pParse->pVdbe; /* The VM under construction */ + int op; /* The opcode being coded */ + int inReg = target; /* Results stored in register inReg */ + int regFree1 = 0; /* If non-zero free this temporary register */ + int regFree2 = 0; /* If non-zero free this temporary register */ + int r1, r2; /* Various register numbers */ + Expr tempX; /* Temporary expression node */ + int p5 = 0; + + assert( target>0 && target<=pParse->nMem ); + if( v==0 ){ + assert( pParse->db->mallocFailed ); + return 0; + } + +expr_code_doover: + if( pExpr==0 ){ + op = TK_NULL; + }else{ + assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); + op = pExpr->op; + } + switch( op ){ + case TK_AGG_COLUMN: { + AggInfo *pAggInfo = pExpr->pAggInfo; + struct AggInfo_col *pCol; + assert( pAggInfo!=0 ); + assert( pExpr->iAgg>=0 && pExpr->iAggnColumn ); + pCol = &pAggInfo->aCol[pExpr->iAgg]; + if( !pAggInfo->directMode ){ + assert( pCol->iMem>0 ); + return pCol->iMem; + }else if( pAggInfo->useSortingIdx ){ + Table *pTab = pCol->pTab; + sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab, + pCol->iSorterColumn, target); + if( pCol->iColumn<0 ){ + VdbeComment((v,"%s.rowid",pTab->zName)); + }else{ + VdbeComment((v,"%s.%s",pTab->zName,pTab->aCol[pCol->iColumn].zName)); + if( pTab->aCol[pCol->iColumn].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, target); + } + } + return target; + } + /* Otherwise, fall thru into the TK_COLUMN case */ + } + case TK_COLUMN: { + int iTab = pExpr->iTable; + int iReg; + if( ExprHasProperty(pExpr, EP_FixedCol) ){ + /* This COLUMN expression is really a constant due to WHERE clause + ** constraints, and that constant is coded by the pExpr->pLeft + ** expresssion. However, make sure the constant has the correct + ** datatype by applying the Affinity of the table column to the + ** constant. + */ + int aff; + iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); + if( pExpr->y.pTab ){ + aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); + }else{ + aff = pExpr->affExpr; + } + if( aff>SQLITE_AFF_BLOB ){ + static const char zAff[] = "B\000C\000D\000E"; + assert( SQLITE_AFF_BLOB=='A' ); + assert( SQLITE_AFF_TEXT=='B' ); + sqlite3VdbeAddOp4(v, OP_Affinity, iReg, 1, 0, + &zAff[(aff-'B')*2], P4_STATIC); + } + return iReg; + } + if( iTab<0 ){ + if( pParse->iSelfTab<0 ){ + /* Other columns in the same row for CHECK constraints or + ** generated columns or for inserting into partial index. + ** The row is unpacked into registers beginning at + ** 0-(pParse->iSelfTab). The rowid (if any) is in a register + ** immediately prior to the first column. + */ + Column *pCol; + Table *pTab = pExpr->y.pTab; + int iSrc; + int iCol = pExpr->iColumn; + assert( pTab!=0 ); + assert( iCol>=XN_ROWID ); + assert( iColnCol ); + if( iCol<0 ){ + return -1-pParse->iSelfTab; + } + pCol = pTab->aCol + iCol; + testcase( iCol!=sqlite3TableColumnToStorage(pTab,iCol) ); + iSrc = sqlite3TableColumnToStorage(pTab, iCol) - pParse->iSelfTab; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pCol->colFlags & COLFLAG_GENERATED ){ + if( pCol->colFlags & COLFLAG_BUSY ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", + pCol->zName); + return 0; + } + pCol->colFlags |= COLFLAG_BUSY; + if( pCol->colFlags & COLFLAG_NOTAVAIL ){ + sqlite3ExprCodeGeneratedColumn(pParse, pCol, iSrc); + } + pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL); + return iSrc; + }else +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + if( pCol->affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp2(v, OP_SCopy, iSrc, target); + sqlite3VdbeAddOp1(v, OP_RealAffinity, target); + return target; + }else{ + return iSrc; + } + }else{ + /* Coding an expression that is part of an index where column names + ** in the index refer to the table to which the index belongs */ + iTab = pParse->iSelfTab - 1; + } + } + iReg = sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab, + pExpr->iColumn, iTab, target, + pExpr->op2); + if( pExpr->y.pTab==0 && pExpr->affExpr==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); + } + return iReg; + } + case TK_INTEGER: { + codeInteger(pParse, pExpr, 0, target); + return target; + } + case TK_TRUEFALSE: { + sqlite3VdbeAddOp2(v, OP_Integer, sqlite3ExprTruthValue(pExpr), target); + return target; + } +#ifndef SQLITE_OMIT_FLOATING_POINT + case TK_FLOAT: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + codeReal(v, pExpr->u.zToken, 0, target); + return target; + } +#endif + case TK_STRING: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3VdbeLoadString(v, target, pExpr->u.zToken); + return target; + } + default: { + /* Make NULL the default case so that if a bug causes an illegal + ** Expr node to be passed into this function, it will be handled + ** sanely and not crash. But keep the assert() to bring the problem + ** to the attention of the developers. */ + assert( op==TK_NULL ); + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + return target; + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + case TK_BLOB: { + int n; + const char *z; + char *zBlob; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' ); + assert( pExpr->u.zToken[1]=='\'' ); + z = &pExpr->u.zToken[2]; + n = sqlite3Strlen30(z) - 1; + assert( z[n]=='\'' ); + zBlob = sqlite3HexToBlob(sqlite3VdbeDb(v), z, n); + sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC); + return target; + } +#endif + case TK_VARIABLE: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( pExpr->u.zToken!=0 ); + assert( pExpr->u.zToken[0]!=0 ); + sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); + if( pExpr->u.zToken[1]!=0 ){ + const char *z = sqlite3VListNumToName(pParse->pVList, pExpr->iColumn); + assert( pExpr->u.zToken[0]=='?' || (z && !strcmp(pExpr->u.zToken, z)) ); + pParse->pVList[0] = 0; /* Indicate VList may no longer be enlarged */ + sqlite3VdbeAppendP4(v, (char*)z, P4_STATIC); + } + return target; + } + case TK_REGISTER: { + return pExpr->iTable; + } +#ifndef SQLITE_OMIT_CAST + case TK_CAST: { + /* Expressions of the form: CAST(pLeft AS token) */ + inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + if( inReg!=target ){ + sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); + inReg = target; + } + sqlite3VdbeAddOp2(v, OP_Cast, target, + sqlite3AffinityType(pExpr->u.zToken, 0)); + return inReg; + } +#endif /* SQLITE_OMIT_CAST */ + case TK_IS: + case TK_ISNOT: + op = (op==TK_IS) ? TK_EQ : TK_NE; + p5 = SQLITE_NULLEQ; + /* fall-through */ + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + Expr *pLeft = pExpr->pLeft; + if( sqlite3ExprIsVector(pLeft) ){ + codeVectorCompare(pParse, pExpr, target, op, p5); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + codeCompare(pParse, pLeft, pExpr->pRight, op, + r1, r2, inReg, SQLITE_STOREP2 | p5, + ExprHasProperty(pExpr,EP_Commuted)); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + } + break; + } + case TK_AND: + case TK_OR: + case TK_PLUS: + case TK_STAR: + case TK_MINUS: + case TK_REM: + case TK_BITAND: + case TK_BITOR: + case TK_SLASH: + case TK_LSHIFT: + case TK_RSHIFT: + case TK_CONCAT: { + assert( TK_AND==OP_And ); testcase( op==TK_AND ); + assert( TK_OR==OP_Or ); testcase( op==TK_OR ); + assert( TK_PLUS==OP_Add ); testcase( op==TK_PLUS ); + assert( TK_MINUS==OP_Subtract ); testcase( op==TK_MINUS ); + assert( TK_REM==OP_Remainder ); testcase( op==TK_REM ); + assert( TK_BITAND==OP_BitAnd ); testcase( op==TK_BITAND ); + assert( TK_BITOR==OP_BitOr ); testcase( op==TK_BITOR ); + assert( TK_SLASH==OP_Divide ); testcase( op==TK_SLASH ); + assert( TK_LSHIFT==OP_ShiftLeft ); testcase( op==TK_LSHIFT ); + assert( TK_RSHIFT==OP_ShiftRight ); testcase( op==TK_RSHIFT ); + assert( TK_CONCAT==OP_Concat ); testcase( op==TK_CONCAT ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + sqlite3VdbeAddOp3(v, op, r2, r1, target); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + break; + } + case TK_UMINUS: { + Expr *pLeft = pExpr->pLeft; + assert( pLeft ); + if( pLeft->op==TK_INTEGER ){ + codeInteger(pParse, pLeft, 1, target); + return target; +#ifndef SQLITE_OMIT_FLOATING_POINT + }else if( pLeft->op==TK_FLOAT ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + codeReal(v, pLeft->u.zToken, 1, target); + return target; +#endif + }else{ + tempX.op = TK_INTEGER; + tempX.flags = EP_IntValue|EP_TokenOnly; + tempX.u.iValue = 0; + ExprClearVVAProperties(&tempX); + r1 = sqlite3ExprCodeTemp(pParse, &tempX, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free2); + sqlite3VdbeAddOp3(v, OP_Subtract, r2, r1, target); + testcase( regFree2==0 ); + } + break; + } + case TK_BITNOT: + case TK_NOT: { + assert( TK_BITNOT==OP_BitNot ); testcase( op==TK_BITNOT ); + assert( TK_NOT==OP_Not ); testcase( op==TK_NOT ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + testcase( regFree1==0 ); + sqlite3VdbeAddOp2(v, op, r1, inReg); + break; + } + case TK_TRUTH: { + int isTrue; /* IS TRUE or IS NOT TRUE */ + int bNormal; /* IS TRUE or IS FALSE */ + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + testcase( regFree1==0 ); + isTrue = sqlite3ExprTruthValue(pExpr->pRight); + bNormal = pExpr->op2==TK_IS; + testcase( isTrue && bNormal); + testcase( !isTrue && bNormal); + sqlite3VdbeAddOp4Int(v, OP_IsTrue, r1, inReg, !isTrue, isTrue ^ bNormal); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + int addr; + assert( TK_ISNULL==OP_IsNull ); testcase( op==TK_ISNULL ); + assert( TK_NOTNULL==OP_NotNull ); testcase( op==TK_NOTNULL ); + sqlite3VdbeAddOp2(v, OP_Integer, 1, target); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + testcase( regFree1==0 ); + addr = sqlite3VdbeAddOp1(v, op, r1); + VdbeCoverageIf(v, op==TK_ISNULL); + VdbeCoverageIf(v, op==TK_NOTNULL); + sqlite3VdbeAddOp2(v, OP_Integer, 0, target); + sqlite3VdbeJumpHere(v, addr); + break; + } + case TK_AGG_FUNCTION: { + AggInfo *pInfo = pExpr->pAggInfo; + if( pInfo==0 + || NEVER(pExpr->iAgg<0) + || NEVER(pExpr->iAgg>=pInfo->nFunc) + ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken); + }else{ + return pInfo->aFunc[pExpr->iAgg].iMem; + } + break; + } + case TK_FUNCTION: { + ExprList *pFarg; /* List of function arguments */ + int nFarg; /* Number of function arguments */ + FuncDef *pDef; /* The function definition object */ + const char *zId; /* The function name */ + u32 constMask = 0; /* Mask of function arguments that are constant */ + int i; /* Loop counter */ + sqlite3 *db = pParse->db; /* The database connection */ + u8 enc = ENC(db); /* The text encoding used by this database */ + CollSeq *pColl = 0; /* A collating sequence */ + +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + return pExpr->y.pWin->regResult; + } +#endif + + if( ConstFactorOk(pParse) && sqlite3ExprIsConstantNotJoin(pExpr) ){ + /* SQL functions can be expensive. So try to avoid running them + ** multiple times if we know they always give the same result */ + return sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1); + } + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + assert( !ExprHasProperty(pExpr, EP_TokenOnly) ); + pFarg = pExpr->x.pList; + nFarg = pFarg ? pFarg->nExpr : 0; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + zId = pExpr->u.zToken; + pDef = sqlite3FindFunction(db, zId, nFarg, enc, 0); +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + if( pDef==0 && pParse->explain ){ + pDef = sqlite3FindFunction(db, "unknown", nFarg, enc, 0); + } +#endif + if( pDef==0 || pDef->xFinalize!=0 ){ + sqlite3ErrorMsg(pParse, "unknown function: %s()", zId); + break; + } + if( pDef->funcFlags & SQLITE_FUNC_INLINE ){ + assert( (pDef->funcFlags & SQLITE_FUNC_UNSAFE)==0 ); + assert( (pDef->funcFlags & SQLITE_FUNC_DIRECT)==0 ); + return exprCodeInlineFunction(pParse, pFarg, + SQLITE_PTR_TO_INT(pDef->pUserData), target); + }else if( pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE) ){ + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); + } + + for(i=0; ia[i].pExpr) ){ + testcase( i==31 ); + constMask |= MASKBIT32(i); + } + if( (pDef->funcFlags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){ + pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr); + } + } + if( pFarg ){ + if( constMask ){ + r1 = pParse->nMem+1; + pParse->nMem += nFarg; + }else{ + r1 = sqlite3GetTempRange(pParse, nFarg); + } + + /* For length() and typeof() functions with a column argument, + ** set the P5 parameter to the OP_Column opcode to OPFLAG_LENGTHARG + ** or OPFLAG_TYPEOFARG respectively, to avoid unnecessary data + ** loading. + */ + if( (pDef->funcFlags & (SQLITE_FUNC_LENGTH|SQLITE_FUNC_TYPEOF))!=0 ){ + u8 exprOp; + assert( nFarg==1 ); + assert( pFarg->a[0].pExpr!=0 ); + exprOp = pFarg->a[0].pExpr->op; + if( exprOp==TK_COLUMN || exprOp==TK_AGG_COLUMN ){ + assert( SQLITE_FUNC_LENGTH==OPFLAG_LENGTHARG ); + assert( SQLITE_FUNC_TYPEOF==OPFLAG_TYPEOFARG ); + testcase( pDef->funcFlags & OPFLAG_LENGTHARG ); + pFarg->a[0].pExpr->op2 = + pDef->funcFlags & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG); + } + } + + sqlite3ExprCodeExprList(pParse, pFarg, r1, 0, + SQLITE_ECEL_DUP|SQLITE_ECEL_FACTOR); + }else{ + r1 = 0; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Possibly overload the function if the first argument is + ** a virtual table column. + ** + ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the + ** second argument, not the first, as the argument to test to + ** see if it is a column in a virtual table. This is done because + ** the left operand of infix functions (the operand we want to + ** control overloading) ends up as the second argument to the + ** function. The expression "A glob B" is equivalent to + ** "glob(B,A). We want to use the A in "A glob B" to test + ** for function overloading. But we use the B term in "glob(B,A)". + */ + if( nFarg>=2 && ExprHasProperty(pExpr, EP_InfixFunc) ){ + pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr); + }else if( nFarg>0 ){ + pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr); + } +#endif + if( pDef->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + if( !pColl ) pColl = db->pDfltColl; + sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); + } +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + if( pDef->funcFlags & SQLITE_FUNC_OFFSET ){ + Expr *pArg = pFarg->a[0].pExpr; + if( pArg->op==TK_COLUMN ){ + sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + }else +#endif + { + sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, + pDef, pExpr->op2); + } + if( nFarg ){ + if( constMask==0 ){ + sqlite3ReleaseTempRange(pParse, r1, nFarg); + }else{ + sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask, 1); + } + } + return target; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: + case TK_SELECT: { + int nCol; + testcase( op==TK_EXISTS ); + testcase( op==TK_SELECT ); + if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 ){ + sqlite3SubselectError(pParse, nCol, 1); + }else{ + return sqlite3CodeSubselect(pParse, pExpr); + } + break; + } + case TK_SELECT_COLUMN: { + int n; + if( pExpr->pLeft->iTable==0 ){ + pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); + } + assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT ); + if( pExpr->iTable!=0 + && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) + ){ + sqlite3ErrorMsg(pParse, "%d columns assigned %d values", + pExpr->iTable, n); + } + return pExpr->pLeft->iTable + pExpr->iColumn; + } + case TK_IN: { + int destIfFalse = sqlite3VdbeMakeLabel(pParse); + int destIfNull = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); + sqlite3VdbeAddOp2(v, OP_Integer, 1, target); + sqlite3VdbeResolveLabel(v, destIfFalse); + sqlite3VdbeAddOp2(v, OP_AddImm, target, 0); + sqlite3VdbeResolveLabel(v, destIfNull); + return target; + } +#endif /* SQLITE_OMIT_SUBQUERY */ + + + /* + ** x BETWEEN y AND z + ** + ** This is equivalent to + ** + ** x>=y AND x<=z + ** + ** X is stored in pExpr->pLeft. + ** Y is stored in pExpr->pList->a[0].pExpr. + ** Z is stored in pExpr->pList->a[1].pExpr. + */ + case TK_BETWEEN: { + exprCodeBetween(pParse, pExpr, target, 0, 0); + return target; + } + case TK_SPAN: + case TK_COLLATE: + case TK_UPLUS: { + pExpr = pExpr->pLeft; + goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. OSSFuzz. */ + } + + case TK_TRIGGER: { + /* If the opcode is TK_TRIGGER, then the expression is a reference + ** to a column in the new.* or old.* pseudo-tables available to + ** trigger programs. In this case Expr.iTable is set to 1 for the + ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn + ** is set to the column of the pseudo-table to read, or to -1 to + ** read the rowid field. + ** + ** The expression is implemented using an OP_Param opcode. The p1 + ** parameter is set to 0 for an old.rowid reference, or to (i+1) + ** to reference another column of the old.* pseudo-table, where + ** i is the index of the column. For a new.rowid reference, p1 is + ** set to (n+1), where n is the number of columns in each pseudo-table. + ** For a reference to any other column in the new.* pseudo-table, p1 + ** is set to (n+2+i), where n and i are as defined previously. For + ** example, if the table on which triggers are being fired is + ** declared as: + ** + ** CREATE TABLE t1(a, b); + ** + ** Then p1 is interpreted as follows: + ** + ** p1==0 -> old.rowid p1==3 -> new.rowid + ** p1==1 -> old.a p1==4 -> new.a + ** p1==2 -> old.b p1==5 -> new.b + */ + Table *pTab = pExpr->y.pTab; + int iCol = pExpr->iColumn; + int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + + sqlite3TableColumnToStorage(pTab, iCol); + + assert( pExpr->iTable==0 || pExpr->iTable==1 ); + assert( iCol>=-1 && iColnCol ); + assert( pTab->iPKey<0 || iCol!=pTab->iPKey ); + assert( p1>=0 && p1<(pTab->nCol*2+2) ); + + sqlite3VdbeAddOp2(v, OP_Param, p1, target); + VdbeComment((v, "r[%d]=%s.%s", target, + (pExpr->iTable ? "new" : "old"), + (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[iCol].zName) + )); + +#ifndef SQLITE_OMIT_FLOATING_POINT + /* If the column has REAL affinity, it may currently be stored as an + ** integer. Use OP_RealAffinity to make sure it is really real. + ** + ** EVIDENCE-OF: R-60985-57662 SQLite will convert the value back to + ** floating point when extracting it from the record. */ + if( iCol>=0 && pTab->aCol[iCol].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, target); + } +#endif + break; + } + + case TK_VECTOR: { + sqlite3ErrorMsg(pParse, "row value misused"); + break; + } + + /* TK_IF_NULL_ROW Expr nodes are inserted ahead of expressions + ** that derive from the right-hand table of a LEFT JOIN. The + ** Expr.iTable value is the table number for the right-hand table. + ** The expression is only evaluated if that table is not currently + ** on a LEFT JOIN NULL row. + */ + case TK_IF_NULL_ROW: { + int addrINR; + u8 okConstFactor = pParse->okConstFactor; + addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable); + /* Temporarily disable factoring of constant expressions, since + ** even though expressions may appear to be constant, they are not + ** really constant because they originate from the right-hand side + ** of a LEFT JOIN. */ + pParse->okConstFactor = 0; + inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + pParse->okConstFactor = okConstFactor; + sqlite3VdbeJumpHere(v, addrINR); + sqlite3VdbeChangeP3(v, addrINR, inReg); + break; + } + + /* + ** Form A: + ** CASE x WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END + ** + ** Form B: + ** CASE WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END + ** + ** Form A is can be transformed into the equivalent form B as follows: + ** CASE WHEN x=e1 THEN r1 WHEN x=e2 THEN r2 ... + ** WHEN x=eN THEN rN ELSE y END + ** + ** X (if it exists) is in pExpr->pLeft. + ** Y is in the last element of pExpr->x.pList if pExpr->x.pList->nExpr is + ** odd. The Y is also optional. If the number of elements in x.pList + ** is even, then Y is omitted and the "otherwise" result is NULL. + ** Ei is in pExpr->pList->a[i*2] and Ri is pExpr->pList->a[i*2+1]. + ** + ** The result of the expression is the Ri for the first matching Ei, + ** or if there is no matching Ei, the ELSE term Y, or if there is + ** no ELSE term, NULL. + */ + case TK_CASE: { + int endLabel; /* GOTO label for end of CASE stmt */ + int nextCase; /* GOTO label for next WHEN clause */ + int nExpr; /* 2x number of WHEN terms */ + int i; /* Loop counter */ + ExprList *pEList; /* List of WHEN terms */ + struct ExprList_item *aListelem; /* Array of WHEN terms */ + Expr opCompare; /* The X==Ei expression */ + Expr *pX; /* The X expression */ + Expr *pTest = 0; /* X==Ei (form A) or just Ei (form B) */ + Expr *pDel = 0; + sqlite3 *db = pParse->db; + + assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList ); + assert(pExpr->x.pList->nExpr > 0); + pEList = pExpr->x.pList; + aListelem = pEList->a; + nExpr = pEList->nExpr; + endLabel = sqlite3VdbeMakeLabel(pParse); + if( (pX = pExpr->pLeft)!=0 ){ + pDel = sqlite3ExprDup(db, pX, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDel); + break; + } + testcase( pX->op==TK_COLUMN ); + exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); + testcase( regFree1==0 ); + memset(&opCompare, 0, sizeof(opCompare)); + opCompare.op = TK_EQ; + opCompare.pLeft = pDel; + pTest = &opCompare; + /* Ticket b351d95f9cd5ef17e9d9dbae18f5ca8611190001: + ** The value in regFree1 might get SCopy-ed into the file result. + ** So make sure that the regFree1 register is not reused for other + ** purposes and possibly overwritten. */ + regFree1 = 0; + } + for(i=0; iop==TK_COLUMN ); + sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); + testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); + sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target); + sqlite3VdbeGoto(v, endLabel); + sqlite3VdbeResolveLabel(v, nextCase); + } + if( (nExpr&1)!=0 ){ + sqlite3ExprCode(pParse, pEList->a[nExpr-1].pExpr, target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + sqlite3ExprDelete(db, pDel); + setDoNotMergeFlagOnCopy(v); + sqlite3VdbeResolveLabel(v, endLabel); + break; + } +#ifndef SQLITE_OMIT_TRIGGER + case TK_RAISE: { + assert( pExpr->affExpr==OE_Rollback + || pExpr->affExpr==OE_Abort + || pExpr->affExpr==OE_Fail + || pExpr->affExpr==OE_Ignore + ); + if( !pParse->pTriggerTab && !pParse->nested ){ + sqlite3ErrorMsg(pParse, + "RAISE() may only be used within a trigger-program"); + return 0; + } + if( pExpr->affExpr==OE_Abort ){ + sqlite3MayAbort(pParse); + } + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + if( pExpr->affExpr==OE_Ignore ){ + sqlite3VdbeAddOp4( + v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); + VdbeCoverage(v); + }else{ + sqlite3HaltConstraint(pParse, + pParse->pTriggerTab ? SQLITE_CONSTRAINT_TRIGGER : SQLITE_ERROR, + pExpr->affExpr, pExpr->u.zToken, 0, 0); + } + + break; + } +#endif + } + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); + return inReg; +} + +/* +** Generate code that will evaluate expression pExpr just one time +** per prepared statement execution. +** +** If the expression uses functions (that might throw an exception) then +** guard them with an OP_Once opcode to ensure that the code is only executed +** once. If no functions are involved, then factor the code out and put it at +** the end of the prepared statement in the initialization section. +** +** If regDest>=0 then the result is always stored in that register and the +** result is not reusable. If regDest<0 then this routine is free to +** store the value whereever it wants. The register where the expression +** is stored is returned. When regDest<0, two identical expressions might +** code to the same register, if they do not contain function calls and hence +** are factored out into the initialization section at the end of the +** prepared statement. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The expression to code when the VDBE initializes */ + int regDest /* Store the value in this register */ +){ + ExprList *p; + assert( ConstFactorOk(pParse) ); + p = pParse->pConstExpr; + if( regDest<0 && p ){ + struct ExprList_item *pItem; + int i; + for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){ + if( pItem->reusable && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 ){ + return pItem->u.iConstExprReg; + } + } + } + pExpr = sqlite3ExprDup(pParse->db, pExpr, 0); + if( pExpr!=0 && ExprHasProperty(pExpr, EP_HasFunc) ){ + Vdbe *v = pParse->pVdbe; + int addr; + assert( v ); + addr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + pParse->okConstFactor = 0; + if( !pParse->db->mallocFailed ){ + if( regDest<0 ) regDest = ++pParse->nMem; + sqlite3ExprCode(pParse, pExpr, regDest); + } + pParse->okConstFactor = 1; + sqlite3ExprDelete(pParse->db, pExpr); + sqlite3VdbeJumpHere(v, addr); + }else{ + p = sqlite3ExprListAppend(pParse, p, pExpr); + if( p ){ + struct ExprList_item *pItem = &p->a[p->nExpr-1]; + pItem->reusable = regDest<0; + if( regDest<0 ) regDest = ++pParse->nMem; + pItem->u.iConstExprReg = regDest; + } + pParse->pConstExpr = p; + } + return regDest; +} + +/* +** Generate code to evaluate an expression and store the results +** into a register. Return the register number where the results +** are stored. +** +** If the register is a temporary register that can be deallocated, +** then write its number into *pReg. If the result register is not +** a temporary, then set *pReg to zero. +** +** If pExpr is a constant, then this routine might generate this +** code to fill the register in the initialization section of the +** VDBE program, in order to factor it out of the evaluation loop. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ + int r2; + pExpr = sqlite3ExprSkipCollateAndLikely(pExpr); + if( ConstFactorOk(pParse) + && pExpr->op!=TK_REGISTER + && sqlite3ExprIsConstantNotJoin(pExpr) + ){ + *pReg = 0; + r2 = sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1); + }else{ + int r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); + if( r2==r1 ){ + *pReg = r1; + }else{ + sqlite3ReleaseTempReg(pParse, r1); + *pReg = 0; + } + } + return r2; +} + +/* +** Generate code that will evaluate expression pExpr and store the +** results in register target. The results are guaranteed to appear +** in register target. +*/ +SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ + int inReg; + + assert( pExpr==0 || !ExprHasVVAProperty(pExpr,EP_Immutable) ); + assert( target>0 && target<=pParse->nMem ); + inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); + assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); + if( inReg!=target && pParse->pVdbe ){ + u8 op; + if( ExprHasProperty(pExpr,EP_Subquery) ){ + op = OP_Copy; + }else{ + op = OP_SCopy; + } + sqlite3VdbeAddOp2(pParse->pVdbe, op, inReg, target); + } +} + +/* +** Make a transient copy of expression pExpr and then code it using +** sqlite3ExprCode(). This routine works just like sqlite3ExprCode() +** except that the input expression is guaranteed to be unchanged. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse *pParse, Expr *pExpr, int target){ + sqlite3 *db = pParse->db; + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( !db->mallocFailed ) sqlite3ExprCode(pParse, pExpr, target); + sqlite3ExprDelete(db, pExpr); +} + +/* +** Generate code that will evaluate expression pExpr and store the +** results in register target. The results are guaranteed to appear +** in register target. If the expression is constant, then this routine +** might choose to code the expression at initialization time. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ + if( pParse->okConstFactor && sqlite3ExprIsConstantNotJoin(pExpr) ){ + sqlite3ExprCodeRunJustOnce(pParse, pExpr, target); + }else{ + sqlite3ExprCodeCopy(pParse, pExpr, target); + } +} + +/* +** Generate code that pushes the value of every element of the given +** expression list into a sequence of registers beginning at target. +** +** Return the number of elements evaluated. The number returned will +** usually be pList->nExpr but might be reduced if SQLITE_ECEL_OMITREF +** is defined. +** +** The SQLITE_ECEL_DUP flag prevents the arguments from being +** filled using OP_SCopy. OP_Copy must be used instead. +** +** The SQLITE_ECEL_FACTOR argument allows constant arguments to be +** factored out into initialization code. +** +** The SQLITE_ECEL_REF flag means that expressions in the list with +** ExprList.a[].u.x.iOrderByCol>0 have already been evaluated and stored +** in registers at srcReg, and so the value can be copied from there. +** If SQLITE_ECEL_OMITREF is also set, then the values with u.x.iOrderByCol>0 +** are simply omitted rather than being copied from srcReg. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeExprList( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* The expression list to be coded */ + int target, /* Where to write results */ + int srcReg, /* Source registers if SQLITE_ECEL_REF */ + u8 flags /* SQLITE_ECEL_* flags */ +){ + struct ExprList_item *pItem; + int i, j, n; + u8 copyOp = (flags & SQLITE_ECEL_DUP) ? OP_Copy : OP_SCopy; + Vdbe *v = pParse->pVdbe; + assert( pList!=0 ); + assert( target>0 ); + assert( pParse->pVdbe!=0 ); /* Never gets this far otherwise */ + n = pList->nExpr; + if( !ConstFactorOk(pParse) ) flags &= ~SQLITE_ECEL_FACTOR; + for(pItem=pList->a, i=0; ipExpr; +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( pItem->bSorterRef ){ + i--; + n--; + }else +#endif + if( (flags & SQLITE_ECEL_REF)!=0 && (j = pItem->u.x.iOrderByCol)>0 ){ + if( flags & SQLITE_ECEL_OMITREF ){ + i--; + n--; + }else{ + sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i); + } + }else if( (flags & SQLITE_ECEL_FACTOR)!=0 + && sqlite3ExprIsConstantNotJoin(pExpr) + ){ + sqlite3ExprCodeRunJustOnce(pParse, pExpr, target+i); + }else{ + int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); + if( inReg!=target+i ){ + VdbeOp *pOp; + if( copyOp==OP_Copy + && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy + && pOp->p1+pOp->p3+1==inReg + && pOp->p2+pOp->p3+1==target+i + && pOp->p5==0 /* The do-not-merge flag must be clear */ + ){ + pOp->p3++; + }else{ + sqlite3VdbeAddOp2(v, copyOp, inReg, target+i); + } + } + } + } + return n; +} + +/* +** Generate code for a BETWEEN operator. +** +** x BETWEEN y AND z +** +** The above is equivalent to +** +** x>=y AND x<=z +** +** Code it as such, taking care to do the common subexpression +** elimination of x. +** +** The xJumpIf parameter determines details: +** +** NULL: Store the boolean result in reg[dest] +** sqlite3ExprIfTrue: Jump to dest if true +** sqlite3ExprIfFalse: Jump to dest if false +** +** The jumpIfNull parameter is ignored if xJumpIf is NULL. +*/ +static void exprCodeBetween( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* The BETWEEN expression */ + int dest, /* Jump destination or storage location */ + void (*xJump)(Parse*,Expr*,int,int), /* Action to take */ + int jumpIfNull /* Take the jump if the BETWEEN is NULL */ +){ + Expr exprAnd; /* The AND operator in x>=y AND x<=z */ + Expr compLeft; /* The x>=y term */ + Expr compRight; /* The x<=z term */ + int regFree1 = 0; /* Temporary use register */ + Expr *pDel = 0; + sqlite3 *db = pParse->db; + + memset(&compLeft, 0, sizeof(Expr)); + memset(&compRight, 0, sizeof(Expr)); + memset(&exprAnd, 0, sizeof(Expr)); + + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + pDel = sqlite3ExprDup(db, pExpr->pLeft, 0); + if( db->mallocFailed==0 ){ + exprAnd.op = TK_AND; + exprAnd.pLeft = &compLeft; + exprAnd.pRight = &compRight; + compLeft.op = TK_GE; + compLeft.pLeft = pDel; + compLeft.pRight = pExpr->x.pList->a[0].pExpr; + compRight.op = TK_LE; + compRight.pLeft = pDel; + compRight.pRight = pExpr->x.pList->a[1].pExpr; + exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); + if( xJump ){ + xJump(pParse, &exprAnd, dest, jumpIfNull); + }else{ + /* Mark the expression is being from the ON or USING clause of a join + ** so that the sqlite3ExprCodeTarget() routine will not attempt to move + ** it into the Parse.pConstExpr list. We should use a new bit for this, + ** for clarity, but we are out of bits in the Expr.flags field so we + ** have to reuse the EP_FromJoin bit. Bummer. */ + pDel->flags |= EP_FromJoin; + sqlite3ExprCodeTarget(pParse, &exprAnd, dest); + } + sqlite3ReleaseTempReg(pParse, regFree1); + } + sqlite3ExprDelete(db, pDel); + + /* Ensure adequate test coverage */ + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull!=0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull!=0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull==0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull==0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull!=0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull!=0 && regFree1!=0 ); + testcase( xJump==0 ); +} + +/* +** Generate code for a boolean expression such that a jump is made +** to the label "dest" if the expression is true but execution +** continues straight thru if the expression is false. +** +** If the expression evaluates to NULL (neither true nor false), then +** take the jump if the jumpIfNull flag is SQLITE_JUMPIFNULL. +** +** This code depends on the fact that certain token values (ex: TK_EQ) +** are the same as opcode values (ex: OP_Eq) that implement the corresponding +** operation. Special comments in vdbe.c and the mkopcodeh.awk script in +** the make process cause these values to align. Assert()s in the code +** below verify that the numbers are aligned correctly. +*/ +SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ + Vdbe *v = pParse->pVdbe; + int op = 0; + int regFree1 = 0; + int regFree2 = 0; + int r1, r2; + + assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); + if( NEVER(v==0) ) return; /* Existence of VDBE checked by caller */ + if( NEVER(pExpr==0) ) return; /* No way this can happen */ + assert( !ExprHasVVAProperty(pExpr, EP_Immutable) ); + op = pExpr->op; + switch( op ){ + case TK_AND: + case TK_OR: { + Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); + if( pAlt!=pExpr ){ + sqlite3ExprIfTrue(pParse, pAlt, dest, jumpIfNull); + }else if( op==TK_AND ){ + int d2 = sqlite3VdbeMakeLabel(pParse); + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, + jumpIfNull^SQLITE_JUMPIFNULL); + sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + }else{ + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); + sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + } + break; + } + case TK_NOT: { + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); + break; + } + case TK_TRUTH: { + int isNot; /* IS NOT TRUE or IS NOT FALSE */ + int isTrue; /* IS TRUE or IS NOT TRUE */ + testcase( jumpIfNull==0 ); + isNot = pExpr->op2==TK_ISNOT; + isTrue = sqlite3ExprTruthValue(pExpr->pRight); + testcase( isTrue && isNot ); + testcase( !isTrue && isNot ); + if( isTrue ^ isNot ){ + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, + isNot ? SQLITE_JUMPIFNULL : 0); + }else{ + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, + isNot ? SQLITE_JUMPIFNULL : 0); + } + break; + } + case TK_IS: + case TK_ISNOT: + testcase( op==TK_IS ); + testcase( op==TK_ISNOT ); + op = (op==TK_IS) ? TK_EQ : TK_NE; + jumpIfNull = SQLITE_NULLEQ; + /* Fall thru */ + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; + testcase( jumpIfNull==0 ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, + r1, r2, dest, jumpIfNull, ExprHasProperty(pExpr,EP_Commuted)); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull==SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull!=SQLITE_NULLEQ); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull==SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull!=SQLITE_NULLEQ); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + assert( TK_ISNULL==OP_IsNull ); testcase( op==TK_ISNULL ); + assert( TK_NOTNULL==OP_NotNull ); testcase( op==TK_NOTNULL ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + sqlite3VdbeAddOp2(v, op, r1, dest); + VdbeCoverageIf(v, op==TK_ISNULL); + VdbeCoverageIf(v, op==TK_NOTNULL); + testcase( regFree1==0 ); + break; + } + case TK_BETWEEN: { + testcase( jumpIfNull==0 ); + exprCodeBetween(pParse, pExpr, dest, sqlite3ExprIfTrue, jumpIfNull); + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_IN: { + int destIfFalse = sqlite3VdbeMakeLabel(pParse); + int destIfNull = jumpIfNull ? dest : destIfFalse; + sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); + sqlite3VdbeGoto(v, dest); + sqlite3VdbeResolveLabel(v, destIfFalse); + break; + } +#endif + default: { + default_expr: + if( ExprAlwaysTrue(pExpr) ){ + sqlite3VdbeGoto(v, dest); + }else if( ExprAlwaysFalse(pExpr) ){ + /* No-op */ + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); + sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0); + VdbeCoverage(v); + testcase( regFree1==0 ); + testcase( jumpIfNull==0 ); + } + break; + } + } + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); +} + +/* +** Generate code for a boolean expression such that a jump is made +** to the label "dest" if the expression is false but execution +** continues straight thru if the expression is true. +** +** If the expression evaluates to NULL (neither true nor false) then +** jump if jumpIfNull is SQLITE_JUMPIFNULL or fall through if jumpIfNull +** is 0. +*/ +SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ + Vdbe *v = pParse->pVdbe; + int op = 0; + int regFree1 = 0; + int regFree2 = 0; + int r1, r2; + + assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); + if( NEVER(v==0) ) return; /* Existence of VDBE checked by caller */ + if( pExpr==0 ) return; + assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); + + /* The value of pExpr->op and op are related as follows: + ** + ** pExpr->op op + ** --------- ---------- + ** TK_ISNULL OP_NotNull + ** TK_NOTNULL OP_IsNull + ** TK_NE OP_Eq + ** TK_EQ OP_Ne + ** TK_GT OP_Le + ** TK_LE OP_Gt + ** TK_GE OP_Lt + ** TK_LT OP_Ge + ** + ** For other values of pExpr->op, op is undefined and unused. + ** The value of TK_ and OP_ constants are arranged such that we + ** can compute the mapping above using the following expression. + ** Assert()s verify that the computation is correct. + */ + op = ((pExpr->op+(TK_ISNULL&1))^1)-(TK_ISNULL&1); + + /* Verify correct alignment of TK_ and OP_ constants + */ + assert( pExpr->op!=TK_ISNULL || op==OP_NotNull ); + assert( pExpr->op!=TK_NOTNULL || op==OP_IsNull ); + assert( pExpr->op!=TK_NE || op==OP_Eq ); + assert( pExpr->op!=TK_EQ || op==OP_Ne ); + assert( pExpr->op!=TK_LT || op==OP_Ge ); + assert( pExpr->op!=TK_LE || op==OP_Gt ); + assert( pExpr->op!=TK_GT || op==OP_Le ); + assert( pExpr->op!=TK_GE || op==OP_Lt ); + + switch( pExpr->op ){ + case TK_AND: + case TK_OR: { + Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); + if( pAlt!=pExpr ){ + sqlite3ExprIfFalse(pParse, pAlt, dest, jumpIfNull); + }else if( pExpr->op==TK_AND ){ + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); + sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); + }else{ + int d2 = sqlite3VdbeMakeLabel(pParse); + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, + jumpIfNull^SQLITE_JUMPIFNULL); + sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + } + break; + } + case TK_NOT: { + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); + break; + } + case TK_TRUTH: { + int isNot; /* IS NOT TRUE or IS NOT FALSE */ + int isTrue; /* IS TRUE or IS NOT TRUE */ + testcase( jumpIfNull==0 ); + isNot = pExpr->op2==TK_ISNOT; + isTrue = sqlite3ExprTruthValue(pExpr->pRight); + testcase( isTrue && isNot ); + testcase( !isTrue && isNot ); + if( isTrue ^ isNot ){ + /* IS TRUE and IS NOT FALSE */ + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, + isNot ? 0 : SQLITE_JUMPIFNULL); + + }else{ + /* IS FALSE and IS NOT TRUE */ + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, + isNot ? 0 : SQLITE_JUMPIFNULL); + } + break; + } + case TK_IS: + case TK_ISNOT: + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_ISNOT ); + op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ; + jumpIfNull = SQLITE_NULLEQ; + /* Fall thru */ + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; + testcase( jumpIfNull==0 ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, + r1, r2, dest, jumpIfNull,ExprHasProperty(pExpr,EP_Commuted)); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull!=SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull==SQLITE_NULLEQ); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull!=SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull==SQLITE_NULLEQ); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + sqlite3VdbeAddOp2(v, op, r1, dest); + testcase( op==TK_ISNULL ); VdbeCoverageIf(v, op==TK_ISNULL); + testcase( op==TK_NOTNULL ); VdbeCoverageIf(v, op==TK_NOTNULL); + testcase( regFree1==0 ); + break; + } + case TK_BETWEEN: { + testcase( jumpIfNull==0 ); + exprCodeBetween(pParse, pExpr, dest, sqlite3ExprIfFalse, jumpIfNull); + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_IN: { + if( jumpIfNull ){ + sqlite3ExprCodeIN(pParse, pExpr, dest, dest); + }else{ + int destIfNull = sqlite3VdbeMakeLabel(pParse); + sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); + sqlite3VdbeResolveLabel(v, destIfNull); + } + break; + } +#endif + default: { + default_expr: + if( ExprAlwaysFalse(pExpr) ){ + sqlite3VdbeGoto(v, dest); + }else if( ExprAlwaysTrue(pExpr) ){ + /* no-op */ + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); + sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0); + VdbeCoverage(v); + testcase( regFree1==0 ); + testcase( jumpIfNull==0 ); + } + break; + } + } + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); +} + +/* +** Like sqlite3ExprIfFalse() except that a copy is made of pExpr before +** code generation, and that copy is deleted after code generation. This +** ensures that the original pExpr is unchanged. +*/ +SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,int jumpIfNull){ + sqlite3 *db = pParse->db; + Expr *pCopy = sqlite3ExprDup(db, pExpr, 0); + if( db->mallocFailed==0 ){ + sqlite3ExprIfFalse(pParse, pCopy, dest, jumpIfNull); + } + sqlite3ExprDelete(db, pCopy); +} + +/* +** Expression pVar is guaranteed to be an SQL variable. pExpr may be any +** type of expression. +** +** If pExpr is a simple SQL value - an integer, real, string, blob +** or NULL value - then the VDBE currently being prepared is configured +** to re-prepare each time a new value is bound to variable pVar. +** +** Additionally, if pExpr is a simple SQL value and the value is the +** same as that currently bound to variable pVar, non-zero is returned. +** Otherwise, if the values are not the same or if pExpr is not a simple +** SQL value, zero is returned. +*/ +static int exprCompareVariable(Parse *pParse, Expr *pVar, Expr *pExpr){ + int res = 0; + int iVar; + sqlite3_value *pL, *pR = 0; + + sqlite3ValueFromExpr(pParse->db, pExpr, SQLITE_UTF8, SQLITE_AFF_BLOB, &pR); + if( pR ){ + iVar = pVar->iColumn; + sqlite3VdbeSetVarmask(pParse->pVdbe, iVar); + pL = sqlite3VdbeGetBoundValue(pParse->pReprepare, iVar, SQLITE_AFF_BLOB); + if( pL ){ + if( sqlite3_value_type(pL)==SQLITE_TEXT ){ + sqlite3_value_text(pL); /* Make sure the encoding is UTF-8 */ + } + res = 0==sqlite3MemCompare(pL, pR, 0); + } + sqlite3ValueFree(pR); + sqlite3ValueFree(pL); + } + + return res; +} + +/* +** Do a deep comparison of two expression trees. Return 0 if the two +** expressions are completely identical. Return 1 if they differ only +** by a COLLATE operator at the top level. Return 2 if there are differences +** other than the top-level COLLATE operator. +** +** If any subelement of pB has Expr.iTable==(-1) then it is allowed +** to compare equal to an equivalent element in pA with Expr.iTable==iTab. +** +** The pA side might be using TK_REGISTER. If that is the case and pB is +** not using TK_REGISTER but is otherwise equivalent, then still return 0. +** +** Sometimes this routine will return 2 even if the two expressions +** really are equivalent. If we cannot prove that the expressions are +** identical, we return 2 just to be safe. So if this routine +** returns 2, then you do not really know for certain if the two +** expressions are the same. But if you get a 0 or 1 return, then you +** can be sure the expressions are the same. In the places where +** this routine is used, it does not hurt to get an extra 2 - that +** just might result in some slightly slower code. But returning +** an incorrect 0 or 1 could lead to a malfunction. +** +** If pParse is not NULL then TK_VARIABLE terms in pA with bindings in +** pParse->pReprepare can be matched against literals in pB. The +** pParse->pVdbe->expmask bitmask is updated for each variable referenced. +** If pParse is NULL (the normal case) then any TK_VARIABLE term in +** Argument pParse should normally be NULL. If it is not NULL and pA or +** pB causes a return value of 2. +*/ +SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ + u32 combinedFlags; + if( pA==0 || pB==0 ){ + return pB==pA ? 0 : 2; + } + if( pParse && pA->op==TK_VARIABLE && exprCompareVariable(pParse, pA, pB) ){ + return 0; + } + combinedFlags = pA->flags | pB->flags; + if( combinedFlags & EP_IntValue ){ + if( (pA->flags&pB->flags&EP_IntValue)!=0 && pA->u.iValue==pB->u.iValue ){ + return 0; + } + return 2; + } + if( pA->op!=pB->op || pA->op==TK_RAISE ){ + if( pA->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA->pLeft,pB,iTab)<2 ){ + return 1; + } + if( pB->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA,pB->pLeft,iTab)<2 ){ + return 1; + } + return 2; + } + if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){ + if( pA->op==TK_FUNCTION || pA->op==TK_AGG_FUNCTION ){ + if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; +#ifndef SQLITE_OMIT_WINDOWFUNC + assert( pA->op==pB->op ); + if( ExprHasProperty(pA,EP_WinFunc)!=ExprHasProperty(pB,EP_WinFunc) ){ + return 2; + } + if( ExprHasProperty(pA,EP_WinFunc) ){ + if( sqlite3WindowCompare(pParse, pA->y.pWin, pB->y.pWin, 1)!=0 ){ + return 2; + } + } +#endif + }else if( pA->op==TK_NULL ){ + return 0; + }else if( pA->op==TK_COLLATE ){ + if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; + }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ + return 2; + } + } + if( (pA->flags & (EP_Distinct|EP_Commuted)) + != (pB->flags & (EP_Distinct|EP_Commuted)) ) return 2; + if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ + if( combinedFlags & EP_xIsSelect ) return 2; + if( (combinedFlags & EP_FixedCol)==0 + && sqlite3ExprCompare(pParse, pA->pLeft, pB->pLeft, iTab) ) return 2; + if( sqlite3ExprCompare(pParse, pA->pRight, pB->pRight, iTab) ) return 2; + if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; + if( pA->op!=TK_STRING + && pA->op!=TK_TRUEFALSE + && ALWAYS((combinedFlags & EP_Reduced)==0) + ){ + if( pA->iColumn!=pB->iColumn ) return 2; + if( pA->op2!=pB->op2 && pA->op==TK_TRUTH ) return 2; + if( pA->op!=TK_IN && pA->iTable!=pB->iTable && pA->iTable!=iTab ){ + return 2; + } + } + } + return 0; +} + +/* +** Compare two ExprList objects. Return 0 if they are identical, 1 +** if they are certainly different, or 2 if it is not possible to +** determine if they are identical or not. +** +** If any subelement of pB has Expr.iTable==(-1) then it is allowed +** to compare equal to an equivalent element in pA with Expr.iTable==iTab. +** +** This routine might return non-zero for equivalent ExprLists. The +** only consequence will be disabled optimizations. But this routine +** must never return 0 if the two ExprList objects are different, or +** a malfunction will result. +** +** Two NULL pointers are considered to be the same. But a NULL pointer +** always differs from a non-NULL pointer. +*/ +SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ + int i; + if( pA==0 && pB==0 ) return 0; + if( pA==0 || pB==0 ) return 1; + if( pA->nExpr!=pB->nExpr ) return 1; + for(i=0; inExpr; i++){ + int res; + Expr *pExprA = pA->a[i].pExpr; + Expr *pExprB = pB->a[i].pExpr; + if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1; + if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res; + } + return 0; +} + +/* +** Like sqlite3ExprCompare() except COLLATE operators at the top-level +** are ignored. +*/ +SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){ + return sqlite3ExprCompare(0, + sqlite3ExprSkipCollateAndLikely(pA), + sqlite3ExprSkipCollateAndLikely(pB), + iTab); +} + +/* +** Return non-zero if Expr p can only be true if pNN is not NULL. +** +** Or if seenNot is true, return non-zero if Expr p can only be +** non-NULL if pNN is not NULL +*/ +static int exprImpliesNotNull( + Parse *pParse, /* Parsing context */ + Expr *p, /* The expression to be checked */ + Expr *pNN, /* The expression that is NOT NULL */ + int iTab, /* Table being evaluated */ + int seenNot /* Return true only if p can be any non-NULL value */ +){ + assert( p ); + assert( pNN ); + if( sqlite3ExprCompare(pParse, p, pNN, iTab)==0 ){ + return pNN->op!=TK_NULL; + } + switch( p->op ){ + case TK_IN: { + if( seenNot && ExprHasProperty(p, EP_xIsSelect) ) return 0; + assert( ExprHasProperty(p,EP_xIsSelect) + || (p->x.pList!=0 && p->x.pList->nExpr>0) ); + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + case TK_BETWEEN: { + ExprList *pList = p->x.pList; + assert( pList!=0 ); + assert( pList->nExpr==2 ); + if( seenNot ) return 0; + if( exprImpliesNotNull(pParse, pList->a[0].pExpr, pNN, iTab, 1) + || exprImpliesNotNull(pParse, pList->a[1].pExpr, pNN, iTab, 1) + ){ + return 1; + } + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_PLUS: + case TK_MINUS: + case TK_BITOR: + case TK_LSHIFT: + case TK_RSHIFT: + case TK_CONCAT: + seenNot = 1; + /* Fall thru */ + case TK_STAR: + case TK_REM: + case TK_BITAND: + case TK_SLASH: { + if( exprImpliesNotNull(pParse, p->pRight, pNN, iTab, seenNot) ) return 1; + /* Fall thru into the next case */ + } + case TK_SPAN: + case TK_COLLATE: + case TK_UPLUS: + case TK_UMINUS: { + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); + } + case TK_TRUTH: { + if( seenNot ) return 0; + if( p->op2!=TK_IS ) return 0; + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + case TK_BITNOT: + case TK_NOT: { + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + } + return 0; +} + +/* +** Return true if we can prove the pE2 will always be true if pE1 is +** true. Return false if we cannot complete the proof or if pE2 might +** be false. Examples: +** +** pE1: x==5 pE2: x==5 Result: true +** pE1: x>0 pE2: x==5 Result: false +** pE1: x=21 pE2: x=21 OR y=43 Result: true +** pE1: x!=123 pE2: x IS NOT NULL Result: true +** pE1: x!=?1 pE2: x IS NOT NULL Result: true +** pE1: x IS NULL pE2: x IS NOT NULL Result: false +** pE1: x IS ?2 pE2: x IS NOT NULL Reuslt: false +** +** When comparing TK_COLUMN nodes between pE1 and pE2, if pE2 has +** Expr.iTable<0 then assume a table number given by iTab. +** +** If pParse is not NULL, then the values of bound variables in pE1 are +** compared against literal values in pE2 and pParse->pVdbe->expmask is +** modified to record which bound variables are referenced. If pParse +** is NULL, then false will be returned if pE1 contains any bound variables. +** +** When in doubt, return false. Returning true might give a performance +** improvement. Returning false might cause a performance reduction, but +** it will always give the correct answer and is hence always safe. +*/ +SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse *pParse, Expr *pE1, Expr *pE2, int iTab){ + if( sqlite3ExprCompare(pParse, pE1, pE2, iTab)==0 ){ + return 1; + } + if( pE2->op==TK_OR + && (sqlite3ExprImpliesExpr(pParse, pE1, pE2->pLeft, iTab) + || sqlite3ExprImpliesExpr(pParse, pE1, pE2->pRight, iTab) ) + ){ + return 1; + } + if( pE2->op==TK_NOTNULL + && exprImpliesNotNull(pParse, pE1, pE2->pLeft, iTab, 0) + ){ + return 1; + } + return 0; +} + +/* +** This is the Expr node callback for sqlite3ExprImpliesNonNullRow(). +** If the expression node requires that the table at pWalker->iCur +** have one or more non-NULL column, then set pWalker->eCode to 1 and abort. +** +** This routine controls an optimization. False positives (setting +** pWalker->eCode to 1 when it should not be) are deadly, but false-negatives +** (never setting pWalker->eCode) is a harmless missed optimization. +*/ +static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ + testcase( pExpr->op==TK_AGG_COLUMN ); + testcase( pExpr->op==TK_AGG_FUNCTION ); + if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune; + switch( pExpr->op ){ + case TK_ISNOT: + case TK_ISNULL: + case TK_NOTNULL: + case TK_IS: + case TK_OR: + case TK_VECTOR: + case TK_CASE: + case TK_IN: + case TK_FUNCTION: + case TK_TRUTH: + testcase( pExpr->op==TK_ISNOT ); + testcase( pExpr->op==TK_ISNULL ); + testcase( pExpr->op==TK_NOTNULL ); + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_OR ); + testcase( pExpr->op==TK_VECTOR ); + testcase( pExpr->op==TK_CASE ); + testcase( pExpr->op==TK_IN ); + testcase( pExpr->op==TK_FUNCTION ); + testcase( pExpr->op==TK_TRUTH ); + return WRC_Prune; + case TK_COLUMN: + if( pWalker->u.iCur==pExpr->iTable ){ + pWalker->eCode = 1; + return WRC_Abort; + } + return WRC_Prune; + + case TK_AND: + if( pWalker->eCode==0 ){ + sqlite3WalkExpr(pWalker, pExpr->pLeft); + if( pWalker->eCode ){ + pWalker->eCode = 0; + sqlite3WalkExpr(pWalker, pExpr->pRight); + } + } + return WRC_Prune; + + case TK_BETWEEN: + if( sqlite3WalkExpr(pWalker, pExpr->pLeft)==WRC_Abort ){ + assert( pWalker->eCode ); + return WRC_Abort; + } + return WRC_Prune; + + /* Virtual tables are allowed to use constraints like x=NULL. So + ** a term of the form x=y does not prove that y is not null if x + ** is the column of a virtual table */ + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: { + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pRight; + testcase( pExpr->op==TK_EQ ); + testcase( pExpr->op==TK_NE ); + testcase( pExpr->op==TK_LT ); + testcase( pExpr->op==TK_LE ); + testcase( pExpr->op==TK_GT ); + testcase( pExpr->op==TK_GE ); + /* The y.pTab=0 assignment in wherecode.c always happens after the + ** impliesNotNullRow() test */ + if( (pLeft->op==TK_COLUMN && ALWAYS(pLeft->y.pTab!=0) + && IsVirtual(pLeft->y.pTab)) + || (pRight->op==TK_COLUMN && ALWAYS(pRight->y.pTab!=0) + && IsVirtual(pRight->y.pTab)) + ){ + return WRC_Prune; + } + } + default: + return WRC_Continue; + } +} + +/* +** Return true (non-zero) if expression p can only be true if at least +** one column of table iTab is non-null. In other words, return true +** if expression p will always be NULL or false if every column of iTab +** is NULL. +** +** False negatives are acceptable. In other words, it is ok to return +** zero even if expression p will never be true of every column of iTab +** is NULL. A false negative is merely a missed optimization opportunity. +** +** False positives are not allowed, however. A false positive may result +** in an incorrect answer. +** +** Terms of p that are marked with EP_FromJoin (and hence that come from +** the ON or USING clauses of LEFT JOINS) are excluded from the analysis. +** +** This routine is used to check if a LEFT JOIN can be converted into +** an ordinary JOIN. The p argument is the WHERE clause. If the WHERE +** clause requires that some column of the right table of the LEFT JOIN +** be non-NULL, then the LEFT JOIN can be safely converted into an +** ordinary join. +*/ +SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ + Walker w; + p = sqlite3ExprSkipCollateAndLikely(p); + if( p==0 ) return 0; + if( p->op==TK_NOTNULL ){ + p = p->pLeft; + }else{ + while( p->op==TK_AND ){ + if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; + p = p->pRight; + } + } + w.xExprCallback = impliesNotNullRow; + w.xSelectCallback = 0; + w.xSelectCallback2 = 0; + w.eCode = 0; + w.u.iCur = iTab; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + +/* +** An instance of the following structure is used by the tree walker +** to determine if an expression can be evaluated by reference to the +** index only, without having to do a search for the corresponding +** table entry. The IdxCover.pIdx field is the index. IdxCover.iCur +** is the cursor for the table. +*/ +struct IdxCover { + Index *pIdx; /* The index to be tested for coverage */ + int iCur; /* Cursor number for the table corresponding to the index */ +}; + +/* +** Check to see if there are references to columns in table +** pWalker->u.pIdxCover->iCur can be satisfied using the index +** pWalker->u.pIdxCover->pIdx. +*/ +static int exprIdxCover(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN + && pExpr->iTable==pWalker->u.pIdxCover->iCur + && sqlite3TableColumnToIndex(pWalker->u.pIdxCover->pIdx, pExpr->iColumn)<0 + ){ + pWalker->eCode = 1; + return WRC_Abort; + } + return WRC_Continue; +} + +/* +** Determine if an index pIdx on table with cursor iCur contains will +** the expression pExpr. Return true if the index does cover the +** expression and false if the pExpr expression references table columns +** that are not found in the index pIdx. +** +** An index covering an expression means that the expression can be +** evaluated using only the index and without having to lookup the +** corresponding table entry. +*/ +SQLITE_PRIVATE int sqlite3ExprCoveredByIndex( + Expr *pExpr, /* The index to be tested */ + int iCur, /* The cursor number for the corresponding table */ + Index *pIdx /* The index that might be used for coverage */ +){ + Walker w; + struct IdxCover xcov; + memset(&w, 0, sizeof(w)); + xcov.iCur = iCur; + xcov.pIdx = pIdx; + w.xExprCallback = exprIdxCover; + w.u.pIdxCover = &xcov; + sqlite3WalkExpr(&w, pExpr); + return !w.eCode; +} + + +/* +** An instance of the following structure is used by the tree walker +** to count references to table columns in the arguments of an +** aggregate function, in order to implement the +** sqlite3FunctionThisSrc() routine. +*/ +struct SrcCount { + SrcList *pSrc; /* One particular FROM clause in a nested query */ + int iSrcInner; /* Smallest cursor number in this context */ + int nThis; /* Number of references to columns in pSrcList */ + int nOther; /* Number of references to columns in other FROM clauses */ +}; + +/* +** xSelect callback for sqlite3FunctionUsesThisSrc(). If this is the first +** SELECT with a FROM clause encountered during this iteration, set +** SrcCount.iSrcInner to the cursor number of the leftmost object in +** the FROM cause. +*/ +static int selectSrcCount(Walker *pWalker, Select *pSel){ + struct SrcCount *p = pWalker->u.pSrcCount; + if( p->iSrcInner==0x7FFFFFFF && ALWAYS(pSel->pSrc) && pSel->pSrc->nSrc ){ + pWalker->u.pSrcCount->iSrcInner = pSel->pSrc->a[0].iCursor; + } + return WRC_Continue; +} + +/* +** Count the number of references to columns. +*/ +static int exprSrcCount(Walker *pWalker, Expr *pExpr){ + /* There was once a NEVER() on the second term on the grounds that + ** sqlite3FunctionUsesThisSrc() was always called before + ** sqlite3ExprAnalyzeAggregates() and so the TK_COLUMNs have not yet + ** been converted into TK_AGG_COLUMN. But this is no longer true due + ** to window functions - sqlite3WindowRewrite() may now indirectly call + ** FunctionUsesThisSrc() when creating a new sub-select. */ + if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){ + int i; + struct SrcCount *p = pWalker->u.pSrcCount; + SrcList *pSrc = p->pSrc; + int nSrc = pSrc ? pSrc->nSrc : 0; + for(i=0; iiTable==pSrc->a[i].iCursor ) break; + } + if( inThis++; + }else if( pExpr->iTableiSrcInner ){ + /* In a well-formed parse tree (no name resolution errors), + ** TK_COLUMN nodes with smaller Expr.iTable values are in an + ** outer context. Those are the only ones to count as "other" */ + p->nOther++; + } + } + return WRC_Continue; +} + +/* +** Determine if any of the arguments to the pExpr Function reference +** pSrcList. Return true if they do. Also return true if the function +** has no arguments or has only constant arguments. Return false if pExpr +** references columns but not columns of tables found in pSrcList. +*/ +SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ + Walker w; + struct SrcCount cnt; + assert( pExpr->op==TK_AGG_FUNCTION ); + memset(&w, 0, sizeof(w)); + w.xExprCallback = exprSrcCount; + w.xSelectCallback = selectSrcCount; + w.u.pSrcCount = &cnt; + cnt.pSrc = pSrcList; + cnt.iSrcInner = (pSrcList&&pSrcList->nSrc)?pSrcList->a[0].iCursor:0x7FFFFFFF; + cnt.nThis = 0; + cnt.nOther = 0; + sqlite3WalkExprList(&w, pExpr->x.pList); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3WalkExpr(&w, pExpr->y.pWin->pFilter); + } +#endif + return cnt.nThis>0 || cnt.nOther==0; +} + +/* +** This is a Walker expression node callback. +** +** For Expr nodes that contain pAggInfo pointers, make sure the AggInfo +** object that is referenced does not refer directly to the Expr. If +** it does, make a copy. This is done because the pExpr argument is +** subject to change. +** +** The copy is stored on pParse->pConstExpr with a register number of 0. +** This will cause the expression to be deleted automatically when the +** Parse object is destroyed, but the zero register number means that it +** will not generate any code in the preamble. +*/ +static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ + if( ALWAYS(!ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced)) + && pExpr->pAggInfo!=0 + ){ + AggInfo *pAggInfo = pExpr->pAggInfo; + int iAgg = pExpr->iAgg; + Parse *pParse = pWalker->pParse; + sqlite3 *db = pParse->db; + assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_AGG_FUNCTION ); + if( pExpr->op==TK_AGG_COLUMN ){ + assert( iAgg>=0 && iAggnColumn ); + if( pAggInfo->aCol[iAgg].pExpr==pExpr ){ + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( pExpr ){ + pAggInfo->aCol[iAgg].pExpr = pExpr; + pParse->pConstExpr = + sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); + } + } + }else{ + assert( iAgg>=0 && iAggnFunc ); + if( pAggInfo->aFunc[iAgg].pExpr==pExpr ){ + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( pExpr ){ + pAggInfo->aFunc[iAgg].pExpr = pExpr; + pParse->pConstExpr = + sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); + } + } + } + } + return WRC_Continue; +} + +/* +** Initialize a Walker object so that will persist AggInfo entries referenced +** by the tree that is walked. +*/ +SQLITE_PRIVATE void sqlite3AggInfoPersistWalkerInit(Walker *pWalker, Parse *pParse){ + memset(pWalker, 0, sizeof(*pWalker)); + pWalker->pParse = pParse; + pWalker->xExprCallback = agginfoPersistExprCb; + pWalker->xSelectCallback = sqlite3SelectWalkNoop; +} + +/* +** Add a new element to the pAggInfo->aCol[] array. Return the index of +** the new element. Return a negative number if malloc fails. +*/ +static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){ + int i; + pInfo->aCol = sqlite3ArrayAllocate( + db, + pInfo->aCol, + sizeof(pInfo->aCol[0]), + &pInfo->nColumn, + &i + ); + return i; +} + +/* +** Add a new element to the pAggInfo->aFunc[] array. Return the index of +** the new element. Return a negative number if malloc fails. +*/ +static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ + int i; + pInfo->aFunc = sqlite3ArrayAllocate( + db, + pInfo->aFunc, + sizeof(pInfo->aFunc[0]), + &pInfo->nFunc, + &i + ); + return i; +} + +/* +** This is the xExprCallback for a tree walker. It is used to +** implement sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates +** for additional information. +*/ +static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ + int i; + NameContext *pNC = pWalker->u.pNC; + Parse *pParse = pNC->pParse; + SrcList *pSrcList = pNC->pSrcList; + AggInfo *pAggInfo = pNC->uNC.pAggInfo; + + assert( pNC->ncFlags & NC_UAggInfo ); + switch( pExpr->op ){ + case TK_AGG_COLUMN: + case TK_COLUMN: { + testcase( pExpr->op==TK_AGG_COLUMN ); + testcase( pExpr->op==TK_COLUMN ); + /* Check to see if the column is in one of the tables in the FROM + ** clause of the aggregate query */ + if( ALWAYS(pSrcList!=0) ){ + struct SrcList_item *pItem = pSrcList->a; + for(i=0; inSrc; i++, pItem++){ + struct AggInfo_col *pCol; + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + if( pExpr->iTable==pItem->iCursor ){ + /* If we reach this point, it means that pExpr refers to a table + ** that is in the FROM clause of the aggregate query. + ** + ** Make an entry for the column in pAggInfo->aCol[] if there + ** is not an entry there already. + */ + int k; + pCol = pAggInfo->aCol; + for(k=0; knColumn; k++, pCol++){ + if( pCol->iTable==pExpr->iTable && + pCol->iColumn==pExpr->iColumn ){ + break; + } + } + if( (k>=pAggInfo->nColumn) + && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 + ){ + pCol = &pAggInfo->aCol[k]; + pCol->pTab = pExpr->y.pTab; + pCol->iTable = pExpr->iTable; + pCol->iColumn = pExpr->iColumn; + pCol->iMem = ++pParse->nMem; + pCol->iSorterColumn = -1; + pCol->pExpr = pExpr; + if( pAggInfo->pGroupBy ){ + int j, n; + ExprList *pGB = pAggInfo->pGroupBy; + struct ExprList_item *pTerm = pGB->a; + n = pGB->nExpr; + for(j=0; jpExpr; + if( pE->op==TK_COLUMN && pE->iTable==pExpr->iTable && + pE->iColumn==pExpr->iColumn ){ + pCol->iSorterColumn = j; + break; + } + } + } + if( pCol->iSorterColumn<0 ){ + pCol->iSorterColumn = pAggInfo->nSortingColumn++; + } + } + /* There is now an entry for pExpr in pAggInfo->aCol[] (either + ** because it was there before or because we just created it). + ** Convert the pExpr to be a TK_AGG_COLUMN referring to that + ** pAggInfo->aCol[] entry. + */ + ExprSetVVAProperty(pExpr, EP_NoReduce); + pExpr->pAggInfo = pAggInfo; + pExpr->op = TK_AGG_COLUMN; + pExpr->iAgg = (i16)k; + break; + } /* endif pExpr->iTable==pItem->iCursor */ + } /* end loop over pSrcList */ + } + return WRC_Prune; + } + case TK_AGG_FUNCTION: { + if( (pNC->ncFlags & NC_InAggFunc)==0 + && pWalker->walkerDepth==pExpr->op2 + ){ + /* Check to see if pExpr is a duplicate of another aggregate + ** function that is already in the pAggInfo structure + */ + struct AggInfo_func *pItem = pAggInfo->aFunc; + for(i=0; inFunc; i++, pItem++){ + if( sqlite3ExprCompare(0, pItem->pExpr, pExpr, -1)==0 ){ + break; + } + } + if( i>=pAggInfo->nFunc ){ + /* pExpr is original. Make a new entry in pAggInfo->aFunc[] + */ + u8 enc = ENC(pParse->db); + i = addAggInfoFunc(pParse->db, pAggInfo); + if( i>=0 ){ + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + pItem = &pAggInfo->aFunc[i]; + pItem->pExpr = pExpr; + pItem->iMem = ++pParse->nMem; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + pItem->pFunc = sqlite3FindFunction(pParse->db, + pExpr->u.zToken, + pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0); + if( pExpr->flags & EP_Distinct ){ + pItem->iDistinct = pParse->nTab++; + }else{ + pItem->iDistinct = -1; + } + } + } + /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry + */ + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(pExpr, EP_NoReduce); + pExpr->iAgg = (i16)i; + pExpr->pAggInfo = pAggInfo; + return WRC_Prune; + }else{ + return WRC_Continue; + } + } + } + return WRC_Continue; +} + +/* +** Analyze the pExpr expression looking for aggregate functions and +** for variables that need to be added to AggInfo object that pNC->pAggInfo +** points to. Additional entries are made on the AggInfo object as +** necessary. +** +** This routine should only be called after the expression has been +** analyzed by sqlite3ResolveExprNames(). +*/ +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ + Walker w; + w.xExprCallback = analyzeAggregate; + w.xSelectCallback = sqlite3WalkerDepthIncrease; + w.xSelectCallback2 = sqlite3WalkerDepthDecrease; + w.walkerDepth = 0; + w.u.pNC = pNC; + w.pParse = 0; + assert( pNC->pSrcList!=0 ); + sqlite3WalkExpr(&w, pExpr); +} + +/* +** Call sqlite3ExprAnalyzeAggregates() for every expression in an +** expression list. Return the number of errors. +** +** If an error is found, the analysis is cut short. +*/ +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList){ + struct ExprList_item *pItem; + int i; + if( pList ){ + for(pItem=pList->a, i=0; inExpr; i++, pItem++){ + sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr); + } + } +} + +/* +** Allocate a single new register for use to hold some intermediate result. +*/ +SQLITE_PRIVATE int sqlite3GetTempReg(Parse *pParse){ + if( pParse->nTempReg==0 ){ + return ++pParse->nMem; + } + return pParse->aTempReg[--pParse->nTempReg]; +} + +/* +** Deallocate a register, making available for reuse for some other +** purpose. +*/ +SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ + if( iReg ){ + sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0, 0); + if( pParse->nTempRegaTempReg) ){ + pParse->aTempReg[pParse->nTempReg++] = iReg; + } + } +} + +/* +** Allocate or deallocate a block of nReg consecutive registers. +*/ +SQLITE_PRIVATE int sqlite3GetTempRange(Parse *pParse, int nReg){ + int i, n; + if( nReg==1 ) return sqlite3GetTempReg(pParse); + i = pParse->iRangeReg; + n = pParse->nRangeReg; + if( nReg<=n ){ + pParse->iRangeReg += nReg; + pParse->nRangeReg -= nReg; + }else{ + i = pParse->nMem+1; + pParse->nMem += nReg; + } + return i; +} +SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ + if( nReg==1 ){ + sqlite3ReleaseTempReg(pParse, iReg); + return; + } + sqlite3VdbeReleaseRegisters(pParse, iReg, nReg, 0, 0); + if( nReg>pParse->nRangeReg ){ + pParse->nRangeReg = nReg; + pParse->iRangeReg = iReg; + } +} + +/* +** Mark all temporary registers as being unavailable for reuse. +** +** Always invoke this procedure after coding a subroutine or co-routine +** that might be invoked from other parts of the code, to ensure that +** the sub/co-routine does not use registers in common with the code that +** invokes the sub/co-routine. +*/ +SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ + pParse->nTempReg = 0; + pParse->nRangeReg = 0; +} + +/* +** Validate that no temporary register falls within the range of +** iFirst..iLast, inclusive. This routine is only call from within assert() +** statements. +*/ +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ + int i; + if( pParse->nRangeReg>0 + && pParse->iRangeReg+pParse->nRangeReg > iFirst + && pParse->iRangeReg <= iLast + ){ + return 0; + } + for(i=0; inTempReg; i++){ + if( pParse->aTempReg[i]>=iFirst && pParse->aTempReg[i]<=iLast ){ + return 0; + } + } + return 1; +} +#endif /* SQLITE_DEBUG */ + +/************** End of expr.c ************************************************/ +/************** Begin file alter.c *******************************************/ +/* +** 2005 February 15 +** +** 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 C code routines that used to generate VDBE code +** that implements the ALTER TABLE command. +*/ +/* #include "sqliteInt.h" */ + +/* +** The code in this file only exists if we are not omitting the +** ALTER TABLE logic from the build. +*/ +#ifndef SQLITE_OMIT_ALTERTABLE + +/* +** Parameter zName is the name of a table that is about to be altered +** (either with ALTER TABLE ... RENAME TO or ALTER TABLE ... ADD COLUMN). +** If the table is a system table, this function leaves an error message +** in pParse->zErr (system tables may not be altered) and returns non-zero. +** +** Or, if zName is not a system table, zero is returned. +*/ +static int isAlterableTable(Parse *pParse, Table *pTab){ + if( 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) +#ifndef SQLITE_OMIT_VIRTUALTABLE + || ( (pTab->tabFlags & TF_Shadow)!=0 + && sqlite3ReadOnlyShadowTables(pParse->db) + ) +#endif + ){ + sqlite3ErrorMsg(pParse, "table %s may not be altered", pTab->zName); + return 1; + } + return 0; +} + +/* +** Generate code to verify that the schemas of database zDb and, if +** bTemp is not true, database "temp", can still be parsed. This is +** called at the end of the generation of an ALTER TABLE ... RENAME ... +** statement to ensure that the operation has not rendered any schema +** objects unusable. +*/ +static void renameTestSchema(Parse *pParse, const char *zDb, int bTemp){ + sqlite3NestedParse(pParse, + "SELECT 1 " + "FROM \"%w\".%s " + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" + " AND sql NOT LIKE 'create virtual%%'" + " AND sqlite_rename_test(%Q, sql, type, name, %d)=NULL ", + zDb, MASTER_NAME, + zDb, bTemp + ); + + if( bTemp==0 ){ + sqlite3NestedParse(pParse, + "SELECT 1 " + "FROM temp.%s " + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" + " AND sql NOT LIKE 'create virtual%%'" + " AND sqlite_rename_test(%Q, sql, type, name, 1)=NULL ", + MASTER_NAME, zDb + ); + } +} + +/* +** Generate code to reload the schema for database iDb. And, if iDb!=1, for +** the temp database as well. +*/ +static void renameReloadSchema(Parse *pParse, int iDb){ + Vdbe *v = pParse->pVdbe; + if( v ){ + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddParseSchemaOp(pParse->pVdbe, iDb, 0); + if( iDb!=1 ) sqlite3VdbeAddParseSchemaOp(pParse->pVdbe, 1, 0); + } +} + +/* +** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy" +** command. +*/ +SQLITE_PRIVATE void sqlite3AlterRenameTable( + Parse *pParse, /* Parser context. */ + SrcList *pSrc, /* The table to rename. */ + Token *pName /* The new table name. */ +){ + int iDb; /* Database that contains the table */ + char *zDb; /* Name of database iDb */ + Table *pTab; /* Table being renamed */ + char *zName = 0; /* NULL-terminated version of pName */ + sqlite3 *db = pParse->db; /* Database connection */ + int nTabName; /* Number of UTF-8 characters in zTabName */ + const char *zTabName; /* Original name of the table */ + Vdbe *v; + VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */ + u32 savedDbFlags; /* Saved value of db->mDbFlags */ + + savedDbFlags = db->mDbFlags; + if( NEVER(db->mallocFailed) ) goto exit_rename_table; + assert( pSrc->nSrc==1 ); + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + + pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); + if( !pTab ) goto exit_rename_table; + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + zDb = db->aDb[iDb].zDbSName; + db->mDbFlags |= DBFLAG_PreferBuiltin; + + /* Get a NULL terminated version of the new table name. */ + zName = sqlite3NameFromToken(db, pName); + if( !zName ) goto exit_rename_table; + + /* Check that a table or index named 'zName' does not already exist + ** in database iDb. If so, this is an error. + */ + if( sqlite3FindTable(db, zName, zDb) + || sqlite3FindIndex(db, zName, zDb) + || sqlite3IsShadowTableOf(db, pTab, zName) + ){ + sqlite3ErrorMsg(pParse, + "there is already another table or index with this name: %s", zName); + goto exit_rename_table; + } + + /* Make sure it is not a system table being altered, or a reserved name + ** that the table is being renamed to. + */ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ + goto exit_rename_table; + } + if( SQLITE_OK!=sqlite3CheckObjectName(pParse,zName,"table",zName) ){ + goto exit_rename_table; + } + +#ifndef SQLITE_OMIT_VIEW + if( pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "view %s may not be altered", pTab->zName); + goto exit_rename_table; + } +#endif + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + goto exit_rename_table; + } +#endif + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto exit_rename_table; + } + if( IsVirtual(pTab) ){ + pVTab = sqlite3GetVTable(db, pTab); + if( pVTab->pVtab->pModule->xRename==0 ){ + pVTab = 0; + } + } +#endif + + /* Begin a transaction for database iDb. Then modify the schema cookie + ** (since the ALTER TABLE modifies the schema). Call sqlite3MayAbort(), + ** as the scalar functions (e.g. sqlite_rename_table()) invoked by the + ** nested SQL may raise an exception. */ + v = sqlite3GetVdbe(pParse); + if( v==0 ){ + goto exit_rename_table; + } + sqlite3MayAbort(pParse); + + /* figure out how many UTF-8 characters are in zName */ + zTabName = pTab->zName; + nTabName = sqlite3Utf8CharLen(zTabName, -1); + + /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in + ** the schema to use the new table name. */ + sqlite3NestedParse(pParse, + "UPDATE \"%w\".%s SET " + "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) " + "WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)" + "AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" + , zDb, MASTER_NAME, zDb, zTabName, zName, (iDb==1), zTabName + ); + + /* Update the tbl_name and name columns of the sqlite_master table + ** as required. */ + sqlite3NestedParse(pParse, + "UPDATE %Q.%s SET " + "tbl_name = %Q, " + "name = CASE " + "WHEN type='table' THEN %Q " + "WHEN name LIKE 'sqliteX_autoindex%%' ESCAPE 'X' " + " AND type='index' THEN " + "'sqlite_autoindex_' || %Q || substr(name,%d+18) " + "ELSE name END " + "WHERE tbl_name=%Q COLLATE nocase AND " + "(type='table' OR type='index' OR type='trigger');", + zDb, MASTER_NAME, + zName, zName, zName, + nTabName, zTabName + ); + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* If the sqlite_sequence table exists in this database, then update + ** it with the new table name. + */ + if( sqlite3FindTable(db, "sqlite_sequence", zDb) ){ + sqlite3NestedParse(pParse, + "UPDATE \"%w\".sqlite_sequence set name = %Q WHERE name = %Q", + zDb, zName, pTab->zName); + } +#endif + + /* If the table being renamed is not itself part of the temp database, + ** edit view and trigger definitions within the temp database + ** as required. */ + if( iDb!=1 ){ + sqlite3NestedParse(pParse, + "UPDATE sqlite_temp_master SET " + "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, 1), " + "tbl_name = " + "CASE WHEN tbl_name=%Q COLLATE nocase AND " + " sqlite_rename_test(%Q, sql, type, name, 1) " + "THEN %Q ELSE tbl_name END " + "WHERE type IN ('view', 'trigger')" + , zDb, zTabName, zName, zTabName, zDb, zName); + } + + /* If this is a virtual table, invoke the xRename() function if + ** one is defined. The xRename() callback will modify the names + ** of any resources used by the v-table implementation (including other + ** SQLite tables) that are identified by the name of the virtual table. + */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pVTab ){ + int i = ++pParse->nMem; + sqlite3VdbeLoadString(v, i, zName); + sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB); + } +#endif + + renameReloadSchema(pParse, iDb); + renameTestSchema(pParse, zDb, iDb==1); + +exit_rename_table: + sqlite3SrcListDelete(db, pSrc); + sqlite3DbFree(db, zName); + db->mDbFlags = savedDbFlags; +} + +/* +** Write code that will raise an error if the table described by +** zDb and zTab is not empty. +*/ +static void sqlite3ErrorIfNotEmpty( + Parse *pParse, /* Parsing context */ + const char *zDb, /* Schema holding the table */ + const char *zTab, /* Table to check for empty */ + const char *zErr /* Error message text */ +){ + sqlite3NestedParse(pParse, + "SELECT raise(ABORT,%Q) FROM \"%w\".\"%w\"", + zErr, zDb, zTab + ); +} + +/* +** This function is called after an "ALTER TABLE ... ADD" statement +** has been parsed. Argument pColDef contains the text of the new +** column definition. +** +** The Table structure pParse->pNewTable was extended to include +** the new column during parsing. +*/ +SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ + Table *pNew; /* Copy of pParse->pNewTable */ + Table *pTab; /* Table being altered */ + int iDb; /* Database number */ + const char *zDb; /* Database name */ + const char *zTab; /* Table name */ + char *zCol; /* Null-terminated column definition */ + Column *pCol; /* The new column */ + Expr *pDflt; /* Default value for the new column */ + sqlite3 *db; /* The database connection; */ + Vdbe *v; /* The prepared statement under construction */ + int r1; /* Temporary registers */ + + db = pParse->db; + if( pParse->nErr || db->mallocFailed ) return; + pNew = pParse->pNewTable; + assert( pNew ); + + assert( sqlite3BtreeHoldsAllMutexes(db) ); + iDb = sqlite3SchemaToIndex(db, pNew->pSchema); + zDb = db->aDb[iDb].zDbSName; + zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */ + pCol = &pNew->aCol[pNew->nCol-1]; + pDflt = pCol->pDflt; + pTab = sqlite3FindTable(db, zTab, zDb); + assert( pTab ); + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + return; + } +#endif + + + /* Check that the new column is not specified as PRIMARY KEY or UNIQUE. + ** If there is a NOT NULL constraint, then the default value for the + ** column must not be NULL. + */ + if( pCol->colFlags & COLFLAG_PRIMKEY ){ + sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column"); + return; + } + if( pNew->pIndex ){ + sqlite3ErrorMsg(pParse, + "Cannot add a UNIQUE column"); + return; + } + if( (pCol->colFlags & COLFLAG_GENERATED)==0 ){ + /* If the default value for the new column was specified with a + ** literal NULL, then set pDflt to 0. This simplifies checking + ** for an SQL NULL default below. + */ + assert( pDflt==0 || pDflt->op==TK_SPAN ); + if( pDflt && pDflt->pLeft->op==TK_NULL ){ + pDflt = 0; + } + if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){ + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, + "Cannot add a REFERENCES column with non-NULL default value"); + } + if( pCol->notNull && !pDflt ){ + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, + "Cannot add a NOT NULL column with default value NULL"); + } + + + /* Ensure the default expression is something that sqlite3ValueFromExpr() + ** can handle (i.e. not CURRENT_TIME etc.) + */ + if( pDflt ){ + sqlite3_value *pVal = 0; + int rc; + rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + if( rc!=SQLITE_OK ){ + assert( db->mallocFailed == 1 ); + return; + } + if( !pVal ){ + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, + "Cannot add a column with non-constant default"); + } + sqlite3ValueFree(pVal); + } + }else if( pCol->colFlags & COLFLAG_STORED ){ + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "cannot add a STORED column"); + } + + + /* Modify the CREATE TABLE statement. */ + zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n); + if( zCol ){ + char *zEnd = &zCol[pColDef->n-1]; + u32 savedDbFlags = db->mDbFlags; + while( zEnd>zCol && (*zEnd==';' || sqlite3Isspace(*zEnd)) ){ + *zEnd-- = '\0'; + } + db->mDbFlags |= DBFLAG_PreferBuiltin; + sqlite3NestedParse(pParse, + "UPDATE \"%w\".%s SET " + "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) " + "WHERE type = 'table' AND name = %Q", + zDb, MASTER_NAME, pNew->addColOffset, zCol, pNew->addColOffset+1, + zTab + ); + sqlite3DbFree(db, zCol); + db->mDbFlags = savedDbFlags; + } + + /* Make sure the schema version is at least 3. But do not upgrade + ** from less than 3 to 4, as that will corrupt any preexisting DESC + ** index. + */ + v = sqlite3GetVdbe(pParse); + if( v ){ + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT); + sqlite3VdbeUsesBtree(v, iDb); + sqlite3VdbeAddOp2(v, OP_AddImm, r1, -2); + sqlite3VdbeAddOp2(v, OP_IfPos, r1, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3); + sqlite3ReleaseTempReg(pParse, r1); + } + + /* Reload the table definition */ + renameReloadSchema(pParse, iDb); +} + +/* +** This function is called by the parser after the table-name in +** an "ALTER TABLE ADD" statement is parsed. Argument +** pSrc is the full-name of the table being altered. +** +** This routine makes a (partial) copy of the Table structure +** for the table being altered and sets Parse.pNewTable to point +** to it. Routines called by the parser as the column definition +** is parsed (i.e. sqlite3AddColumn()) add the new Column data to +** the copy. The copy of the Table structure is deleted by tokenize.c +** after parsing is finished. +** +** Routine sqlite3AlterFinishAddColumn() will be called to complete +** coding the "ALTER TABLE ... ADD" statement. +*/ +SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ + Table *pNew; + Table *pTab; + int iDb; + int i; + int nAlloc; + sqlite3 *db = pParse->db; + + /* Look up the table being altered. */ + assert( pParse->pNewTable==0 ); + assert( sqlite3BtreeHoldsAllMutexes(db) ); + if( db->mallocFailed ) goto exit_begin_add_column; + pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); + if( !pTab ) goto exit_begin_add_column; + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "virtual tables may not be altered"); + goto exit_begin_add_column; + } +#endif + + /* Make sure this is not an attempt to ALTER a view. */ + if( pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); + goto exit_begin_add_column; + } + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ + goto exit_begin_add_column; + } + + sqlite3MayAbort(pParse); + assert( pTab->addColOffset>0 ); + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + + /* Put a copy of the Table struct in Parse.pNewTable for the + ** sqlite3AddColumn() function and friends to modify. But modify + ** the name by adding an "sqlite_altertab_" prefix. By adding this + ** prefix, we insure that the name will not collide with an existing + ** table because user table are not allowed to have the "sqlite_" + ** prefix on their name. + */ + pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); + if( !pNew ) goto exit_begin_add_column; + pParse->pNewTable = pNew; + pNew->nTabRef = 1; + pNew->nCol = pTab->nCol; + assert( pNew->nCol>0 ); + nAlloc = (((pNew->nCol-1)/8)*8)+8; + assert( nAlloc>=pNew->nCol && nAlloc%8==0 && nAlloc-pNew->nCol<8 ); + pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc); + pNew->zName = sqlite3MPrintf(db, "sqlite_altertab_%s", pTab->zName); + if( !pNew->aCol || !pNew->zName ){ + assert( db->mallocFailed ); + goto exit_begin_add_column; + } + memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol); + for(i=0; inCol; i++){ + Column *pCol = &pNew->aCol[i]; + pCol->zName = sqlite3DbStrDup(db, pCol->zName); + pCol->hName = sqlite3StrIHash(pCol->zName); + pCol->zColl = 0; + pCol->pDflt = 0; + } + pNew->pSchema = db->aDb[iDb].pSchema; + pNew->addColOffset = pTab->addColOffset; + pNew->nTabRef = 1; + +exit_begin_add_column: + sqlite3SrcListDelete(db, pSrc); + return; +} + +/* +** Parameter pTab is the subject of an ALTER TABLE ... RENAME COLUMN +** command. This function checks if the table is a view or virtual +** table (columns of views or virtual tables may not be renamed). If so, +** it loads an error message into pParse and returns non-zero. +** +** Or, if pTab is not a view or virtual table, zero is returned. +*/ +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) +static int isRealTable(Parse *pParse, Table *pTab){ + const char *zType = 0; +#ifndef SQLITE_OMIT_VIEW + if( pTab->pSelect ){ + zType = "view"; + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + zType = "virtual table"; + } +#endif + if( zType ){ + sqlite3ErrorMsg( + pParse, "cannot rename columns of %s \"%s\"", zType, pTab->zName + ); + return 1; + } + return 0; +} +#else /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */ +# define isRealTable(x,y) (0) +#endif + +/* +** Handles the following parser reduction: +** +** cmd ::= ALTER TABLE pSrc RENAME COLUMN pOld TO pNew +*/ +SQLITE_PRIVATE void sqlite3AlterRenameColumn( + Parse *pParse, /* Parsing context */ + SrcList *pSrc, /* Table being altered. pSrc->nSrc==1 */ + Token *pOld, /* Name of column being changed */ + Token *pNew /* New column name */ +){ + sqlite3 *db = pParse->db; /* Database connection */ + Table *pTab; /* Table being updated */ + int iCol; /* Index of column being renamed */ + char *zOld = 0; /* Old column name */ + char *zNew = 0; /* New column name */ + const char *zDb; /* Name of schema containing the table */ + int iSchema; /* Index of the schema */ + int bQuote; /* True to quote the new name */ + + /* Locate the table to be altered */ + pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); + if( !pTab ) goto exit_rename_column; + + /* Cannot alter a system table */ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ) goto exit_rename_column; + if( SQLITE_OK!=isRealTable(pParse, pTab) ) goto exit_rename_column; + + /* Which schema holds the table to be altered */ + iSchema = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iSchema>=0 ); + zDb = db->aDb[iSchema].zDbSName; + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + goto exit_rename_column; + } +#endif + + /* Make sure the old name really is a column name in the table to be + ** altered. Set iCol to be the index of the column being renamed */ + zOld = sqlite3NameFromToken(db, pOld); + if( !zOld ) goto exit_rename_column; + for(iCol=0; iColnCol; iCol++){ + if( 0==sqlite3StrICmp(pTab->aCol[iCol].zName, zOld) ) break; + } + if( iCol==pTab->nCol ){ + sqlite3ErrorMsg(pParse, "no such column: \"%s\"", zOld); + goto exit_rename_column; + } + + /* Do the rename operation using a recursive UPDATE statement that + ** uses the sqlite_rename_column() SQL function to compute the new + ** CREATE statement text for the sqlite_master table. + */ + sqlite3MayAbort(pParse); + zNew = sqlite3NameFromToken(db, pNew); + if( !zNew ) goto exit_rename_column; + assert( pNew->n>0 ); + bQuote = sqlite3Isquote(pNew->z[0]); + sqlite3NestedParse(pParse, + "UPDATE \"%w\".%s SET " + "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) " + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' " + " AND (type != 'index' OR tbl_name = %Q)" + " AND sql NOT LIKE 'create virtual%%'", + zDb, MASTER_NAME, + zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1, + pTab->zName + ); + + sqlite3NestedParse(pParse, + "UPDATE temp.%s SET " + "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) " + "WHERE type IN ('trigger', 'view')", + MASTER_NAME, + zDb, pTab->zName, iCol, zNew, bQuote + ); + + /* Drop and reload the database schema. */ + renameReloadSchema(pParse, iSchema); + renameTestSchema(pParse, zDb, iSchema==1); + + exit_rename_column: + sqlite3SrcListDelete(db, pSrc); + sqlite3DbFree(db, zOld); + sqlite3DbFree(db, zNew); + return; +} + +/* +** Each RenameToken object maps an element of the parse tree into +** the token that generated that element. The parse tree element +** might be one of: +** +** * A pointer to an Expr that represents an ID +** * The name of a table column in Column.zName +** +** A list of RenameToken objects can be constructed during parsing. +** Each new object is created by sqlite3RenameTokenMap(). +** As the parse tree is transformed, the sqlite3RenameTokenRemap() +** routine is used to keep the mapping current. +** +** After the parse finishes, renameTokenFind() routine can be used +** to look up the actual token value that created some element in +** the parse tree. +*/ +struct RenameToken { + void *p; /* Parse tree element created by token t */ + Token t; /* The token that created parse tree element p */ + RenameToken *pNext; /* Next is a list of all RenameToken objects */ +}; + +/* +** The context of an ALTER TABLE RENAME COLUMN operation that gets passed +** down into the Walker. +*/ +typedef struct RenameCtx RenameCtx; +struct RenameCtx { + RenameToken *pList; /* List of tokens to overwrite */ + int nList; /* Number of tokens in pList */ + int iCol; /* Index of column being renamed */ + Table *pTab; /* Table being ALTERed */ + const char *zOld; /* Old column name */ +}; + +#ifdef SQLITE_DEBUG +/* +** This function is only for debugging. It performs two tasks: +** +** 1. Checks that pointer pPtr does not already appear in the +** rename-token list. +** +** 2. Dereferences each pointer in the rename-token list. +** +** The second is most effective when debugging under valgrind or +** address-sanitizer or similar. If any of these pointers no longer +** point to valid objects, an exception is raised by the memory-checking +** tool. +** +** The point of this is to prevent comparisons of invalid pointer values. +** Even though this always seems to work, it is undefined according to the +** C standard. Example of undefined comparison: +** +** sqlite3_free(x); +** if( x==y ) ... +** +** Technically, as x no longer points into a valid object or to the byte +** following a valid object, it may not be used in comparison operations. +*/ +static void renameTokenCheckAll(Parse *pParse, void *pPtr){ + if( pParse->nErr==0 && pParse->db->mallocFailed==0 ){ + RenameToken *p; + u8 i = 0; + for(p=pParse->pRename; p; p=p->pNext){ + if( p->p ){ + assert( p->p!=pPtr ); + i += *(u8*)(p->p); + } + } + } +} +#else +# define renameTokenCheckAll(x,y) +#endif + +/* +** Remember that the parser tree element pPtr was created using +** the token pToken. +** +** In other words, construct a new RenameToken object and add it +** to the list of RenameToken objects currently being built up +** in pParse->pRename. +** +** The pPtr argument is returned so that this routine can be used +** with tail recursion in tokenExpr() routine, for a small performance +** improvement. +*/ +SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse *pParse, void *pPtr, Token *pToken){ + RenameToken *pNew; + assert( pPtr || pParse->db->mallocFailed ); + renameTokenCheckAll(pParse, pPtr); + if( ALWAYS(pParse->eParseMode!=PARSE_MODE_UNMAP) ){ + pNew = sqlite3DbMallocZero(pParse->db, sizeof(RenameToken)); + if( pNew ){ + pNew->p = pPtr; + pNew->t = *pToken; + pNew->pNext = pParse->pRename; + pParse->pRename = pNew; + } + } + + return pPtr; +} + +/* +** It is assumed that there is already a RenameToken object associated +** with parse tree element pFrom. This function remaps the associated token +** to parse tree element pTo. +*/ +SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse *pParse, void *pTo, void *pFrom){ + RenameToken *p; + renameTokenCheckAll(pParse, pTo); + for(p=pParse->pRename; p; p=p->pNext){ + if( p->p==pFrom ){ + p->p = pTo; + break; + } + } +} + +/* +** Walker callback used by sqlite3RenameExprUnmap(). +*/ +static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ + Parse *pParse = pWalker->pParse; + sqlite3RenameTokenRemap(pParse, 0, (void*)pExpr); + return WRC_Continue; +} + +/* +** Iterate through the Select objects that are part of WITH clauses attached +** to select statement pSelect. +*/ +static void renameWalkWith(Walker *pWalker, Select *pSelect){ + With *pWith = pSelect->pWith; + if( pWith ){ + int i; + for(i=0; inCte; i++){ + Select *p = pWith->a[i].pSelect; + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pWalker->pParse; + sqlite3SelectPrep(sNC.pParse, p, &sNC); + sqlite3WalkSelect(pWalker, p); + sqlite3RenameExprlistUnmap(pWalker->pParse, pWith->a[i].pCols); + } + } +} + +/* +** Unmap all tokens in the IdList object passed as the second argument. +*/ +static void unmapColumnIdlistNames( + Parse *pParse, + IdList *pIdList +){ + if( pIdList ){ + int ii; + for(ii=0; iinId; ii++){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pIdList->a[ii].zName); + } + } +} + +/* +** Walker callback used by sqlite3RenameExprUnmap(). +*/ +static int renameUnmapSelectCb(Walker *pWalker, Select *p){ + Parse *pParse = pWalker->pParse; + int i; + if( pParse->nErr ) return WRC_Abort; + if( NEVER(p->selFlags & SF_View) ) return WRC_Prune; + if( ALWAYS(p->pEList) ){ + ExprList *pList = p->pEList; + for(i=0; inExpr; i++){ + if( pList->a[i].zEName && pList->a[i].eEName==ENAME_NAME ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName); + } + } + } + if( ALWAYS(p->pSrc) ){ /* Every Select as a SrcList, even if it is empty */ + SrcList *pSrc = p->pSrc; + for(i=0; inSrc; i++){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); + if( sqlite3WalkExpr(pWalker, pSrc->a[i].pOn) ) return WRC_Abort; + unmapColumnIdlistNames(pParse, pSrc->a[i].pUsing); + } + } + + renameWalkWith(pWalker, p); + return WRC_Continue; +} + +/* +** Remove all nodes that are part of expression pExpr from the rename list. +*/ +SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse *pParse, Expr *pExpr){ + u8 eMode = pParse->eParseMode; + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.pParse = pParse; + sWalker.xExprCallback = renameUnmapExprCb; + sWalker.xSelectCallback = renameUnmapSelectCb; + pParse->eParseMode = PARSE_MODE_UNMAP; + sqlite3WalkExpr(&sWalker, pExpr); + pParse->eParseMode = eMode; +} + +/* +** Remove all nodes that are part of expression-list pEList from the +** rename list. +*/ +SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ + if( pEList ){ + int i; + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.pParse = pParse; + sWalker.xExprCallback = renameUnmapExprCb; + sqlite3WalkExprList(&sWalker, pEList); + for(i=0; inExpr; i++){ + if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); + } + } + } +} + +/* +** Free the list of RenameToken objects given in the second argument +*/ +static void renameTokenFree(sqlite3 *db, RenameToken *pToken){ + RenameToken *pNext; + RenameToken *p; + for(p=pToken; p; p=pNext){ + pNext = p->pNext; + sqlite3DbFree(db, p); + } +} + +/* +** Search the Parse object passed as the first argument for a RenameToken +** object associated with parse tree element pPtr. If found, remove it +** from the Parse object and add it to the list maintained by the +** RenameCtx object passed as the second argument. +*/ +static void renameTokenFind(Parse *pParse, struct RenameCtx *pCtx, void *pPtr){ + RenameToken **pp; + assert( pPtr!=0 ); + for(pp=&pParse->pRename; (*pp); pp=&(*pp)->pNext){ + if( (*pp)->p==pPtr ){ + RenameToken *pToken = *pp; + *pp = pToken->pNext; + pToken->pNext = pCtx->pList; + pCtx->pList = pToken; + pCtx->nList++; + break; + } + } +} + +/* +** This is a Walker select callback. It does nothing. It is only required +** because without a dummy callback, sqlite3WalkExpr() and similar do not +** descend into sub-select statements. +*/ +static int renameColumnSelectCb(Walker *pWalker, Select *p){ + if( p->selFlags & SF_View ) return WRC_Prune; + renameWalkWith(pWalker, p); + return WRC_Continue; +} + +/* +** This is a Walker expression callback. +** +** For every TK_COLUMN node in the expression tree, search to see +** if the column being references is the column being renamed by an +** ALTER TABLE statement. If it is, then attach its associated +** RenameToken object to the list of RenameToken objects being +** constructed in RenameCtx object at pWalker->u.pRename. +*/ +static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){ + RenameCtx *p = pWalker->u.pRename; + if( pExpr->op==TK_TRIGGER + && pExpr->iColumn==p->iCol + && pWalker->pParse->pTriggerTab==p->pTab + ){ + renameTokenFind(pWalker->pParse, p, (void*)pExpr); + }else if( pExpr->op==TK_COLUMN + && pExpr->iColumn==p->iCol + && p->pTab==pExpr->y.pTab + ){ + renameTokenFind(pWalker->pParse, p, (void*)pExpr); + } + return WRC_Continue; +} + +/* +** The RenameCtx contains a list of tokens that reference a column that +** is being renamed by an ALTER TABLE statement. Return the "last" +** RenameToken in the RenameCtx and remove that RenameToken from the +** RenameContext. "Last" means the last RenameToken encountered when +** the input SQL is parsed from left to right. Repeated calls to this routine +** return all column name tokens in the order that they are encountered +** in the SQL statement. +*/ +static RenameToken *renameColumnTokenNext(RenameCtx *pCtx){ + RenameToken *pBest = pCtx->pList; + RenameToken *pToken; + RenameToken **pp; + + for(pToken=pBest->pNext; pToken; pToken=pToken->pNext){ + if( pToken->t.z>pBest->t.z ) pBest = pToken; + } + for(pp=&pCtx->pList; *pp!=pBest; pp=&(*pp)->pNext); + *pp = pBest->pNext; + + return pBest; +} + +/* +** An error occured while parsing or otherwise processing a database +** object (either pParse->pNewTable, pNewIndex or pNewTrigger) as part of an +** ALTER TABLE RENAME COLUMN program. The error message emitted by the +** sub-routine is currently stored in pParse->zErrMsg. This function +** adds context to the error message and then stores it in pCtx. +*/ +static void renameColumnParseError( + sqlite3_context *pCtx, + int bPost, + sqlite3_value *pType, + sqlite3_value *pObject, + Parse *pParse +){ + const char *zT = (const char*)sqlite3_value_text(pType); + const char *zN = (const char*)sqlite3_value_text(pObject); + char *zErr; + + zErr = sqlite3_mprintf("error in %s %s%s: %s", + zT, zN, (bPost ? " after rename" : ""), + pParse->zErrMsg + ); + sqlite3_result_error(pCtx, zErr, -1); + sqlite3_free(zErr); +} + +/* +** For each name in the the expression-list pEList (i.e. each +** pEList->a[i].zName) that matches the string in zOld, extract the +** corresponding rename-token from Parse object pParse and add it +** to the RenameCtx pCtx. +*/ +static void renameColumnElistNames( + Parse *pParse, + RenameCtx *pCtx, + ExprList *pEList, + const char *zOld +){ + if( pEList ){ + int i; + for(i=0; inExpr; i++){ + char *zName = pEList->a[i].zEName; + if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) + && ALWAYS(zName!=0) + && 0==sqlite3_stricmp(zName, zOld) + ){ + renameTokenFind(pParse, pCtx, (void*)zName); + } + } + } +} + +/* +** For each name in the the id-list pIdList (i.e. each pIdList->a[i].zName) +** that matches the string in zOld, extract the corresponding rename-token +** from Parse object pParse and add it to the RenameCtx pCtx. +*/ +static void renameColumnIdlistNames( + Parse *pParse, + RenameCtx *pCtx, + IdList *pIdList, + const char *zOld +){ + if( pIdList ){ + int i; + for(i=0; inId; i++){ + char *zName = pIdList->a[i].zName; + if( 0==sqlite3_stricmp(zName, zOld) ){ + renameTokenFind(pParse, pCtx, (void*)zName); + } + } + } +} + + +/* +** Parse the SQL statement zSql using Parse object (*p). The Parse object +** is initialized by this function before it is used. +*/ +static int renameParseSql( + Parse *p, /* Memory to use for Parse object */ + const char *zDb, /* Name of schema SQL belongs to */ + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL to parse */ + int bTemp /* True if SQL is from temp schema */ +){ + int rc; + char *zErr = 0; + + db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb); + + /* Parse the SQL statement passed as the first argument. If no error + ** occurs and the parse does not result in a new table, index or + ** trigger object, the database must be corrupt. */ + memset(p, 0, sizeof(Parse)); + p->eParseMode = PARSE_MODE_RENAME; + p->db = db; + p->nQueryLoop = 1; + rc = sqlite3RunParser(p, zSql, &zErr); + assert( p->zErrMsg==0 ); + assert( rc!=SQLITE_OK || zErr==0 ); + p->zErrMsg = zErr; + if( db->mallocFailed ) rc = SQLITE_NOMEM; + if( rc==SQLITE_OK + && p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0 + ){ + rc = SQLITE_CORRUPT_BKPT; + } + +#ifdef SQLITE_DEBUG + /* Ensure that all mappings in the Parse.pRename list really do map to + ** a part of the input string. */ + if( rc==SQLITE_OK ){ + int nSql = sqlite3Strlen30(zSql); + RenameToken *pToken; + for(pToken=p->pRename; pToken; pToken=pToken->pNext){ + assert( pToken->t.z>=zSql && &pToken->t.z[pToken->t.n]<=&zSql[nSql] ); + } + } +#endif + + db->init.iDb = 0; + return rc; +} + +/* +** This function edits SQL statement zSql, replacing each token identified +** by the linked list pRename with the text of zNew. If argument bQuote is +** true, then zNew is always quoted first. If no error occurs, the result +** is loaded into context object pCtx as the result. +** +** Or, if an error occurs (i.e. an OOM condition), an error is left in +** pCtx and an SQLite error code returned. +*/ +static int renameEditSql( + sqlite3_context *pCtx, /* Return result here */ + RenameCtx *pRename, /* Rename context */ + const char *zSql, /* SQL statement to edit */ + const char *zNew, /* New token text */ + int bQuote /* True to always quote token */ +){ + int nNew = sqlite3Strlen30(zNew); + int nSql = sqlite3Strlen30(zSql); + sqlite3 *db = sqlite3_context_db_handle(pCtx); + int rc = SQLITE_OK; + char *zQuot; + char *zOut; + int nQuot; + + /* Set zQuot to point to a buffer containing a quoted copy of the + ** identifier zNew. If the corresponding identifier in the original + ** ALTER TABLE statement was quoted (bQuote==1), then set zNew to + ** point to zQuot so that all substitutions are made using the + ** quoted version of the new column name. */ + zQuot = sqlite3MPrintf(db, "\"%w\"", zNew); + if( zQuot==0 ){ + return SQLITE_NOMEM; + }else{ + nQuot = sqlite3Strlen30(zQuot); + } + if( bQuote ){ + zNew = zQuot; + nNew = nQuot; + } + + /* At this point pRename->pList contains a list of RenameToken objects + ** corresponding to all tokens in the input SQL that must be replaced + ** with the new column name. All that remains is to construct and + ** return the edited SQL string. */ + assert( nQuot>=nNew ); + zOut = sqlite3DbMallocZero(db, nSql + pRename->nList*nQuot + 1); + if( zOut ){ + int nOut = nSql; + memcpy(zOut, zSql, nSql); + while( pRename->pList ){ + int iOff; /* Offset of token to replace in zOut */ + RenameToken *pBest = renameColumnTokenNext(pRename); + + u32 nReplace; + const char *zReplace; + if( sqlite3IsIdChar(*pBest->t.z) ){ + nReplace = nNew; + zReplace = zNew; + }else{ + nReplace = nQuot; + zReplace = zQuot; + } + + iOff = pBest->t.z - zSql; + if( pBest->t.n!=nReplace ){ + memmove(&zOut[iOff + nReplace], &zOut[iOff + pBest->t.n], + nOut - (iOff + pBest->t.n) + ); + nOut += nReplace - pBest->t.n; + zOut[nOut] = '\0'; + } + memcpy(&zOut[iOff], zReplace, nReplace); + sqlite3DbFree(db, pBest); + } + + sqlite3_result_text(pCtx, zOut, -1, SQLITE_TRANSIENT); + sqlite3DbFree(db, zOut); + }else{ + rc = SQLITE_NOMEM; + } + + sqlite3_free(zQuot); + return rc; +} + +/* +** Resolve all symbols in the trigger at pParse->pNewTrigger, assuming +** it was read from the schema of database zDb. Return SQLITE_OK if +** successful. Otherwise, return an SQLite error code and leave an error +** message in the Parse object. +*/ +static int renameResolveTrigger(Parse *pParse, const char *zDb){ + sqlite3 *db = pParse->db; + Trigger *pNew = pParse->pNewTrigger; + TriggerStep *pStep; + NameContext sNC; + int rc = SQLITE_OK; + + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + assert( pNew->pTabSchema ); + pParse->pTriggerTab = sqlite3FindTable(db, pNew->table, + db->aDb[sqlite3SchemaToIndex(db, pNew->pTabSchema)].zDbSName + ); + pParse->eTriggerOp = pNew->op; + /* ALWAYS() because if the table of the trigger does not exist, the + ** error would have been hit before this point */ + if( ALWAYS(pParse->pTriggerTab) ){ + rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab); + } + + /* Resolve symbols in WHEN clause */ + if( rc==SQLITE_OK && pNew->pWhen ){ + rc = sqlite3ResolveExprNames(&sNC, pNew->pWhen); + } + + for(pStep=pNew->step_list; rc==SQLITE_OK && pStep; pStep=pStep->pNext){ + if( pStep->pSelect ){ + sqlite3SelectPrep(pParse, pStep->pSelect, &sNC); + if( pParse->nErr ) rc = pParse->rc; + } + if( rc==SQLITE_OK && pStep->zTarget ){ + Table *pTarget = sqlite3LocateTable(pParse, 0, pStep->zTarget, zDb); + if( pTarget==0 ){ + rc = SQLITE_ERROR; + }else if( SQLITE_OK==(rc = sqlite3ViewGetColumnNames(pParse, pTarget)) ){ + SrcList sSrc; + memset(&sSrc, 0, sizeof(sSrc)); + sSrc.nSrc = 1; + sSrc.a[0].zName = pStep->zTarget; + sSrc.a[0].pTab = pTarget; + sNC.pSrcList = &sSrc; + if( pStep->pWhere ){ + rc = sqlite3ResolveExprNames(&sNC, pStep->pWhere); + } + if( rc==SQLITE_OK ){ + rc = sqlite3ResolveExprListNames(&sNC, pStep->pExprList); + } + assert( !pStep->pUpsert || (!pStep->pWhere && !pStep->pExprList) ); + if( pStep->pUpsert ){ + Upsert *pUpsert = pStep->pUpsert; + assert( rc==SQLITE_OK ); + pUpsert->pUpsertSrc = &sSrc; + sNC.uNC.pUpsert = pUpsert; + sNC.ncFlags = NC_UUpsert; + rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget); + if( rc==SQLITE_OK ){ + ExprList *pUpsertSet = pUpsert->pUpsertSet; + rc = sqlite3ResolveExprListNames(&sNC, pUpsertSet); + } + if( rc==SQLITE_OK ){ + rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertWhere); + } + if( rc==SQLITE_OK ){ + rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere); + } + sNC.ncFlags = 0; + } + sNC.pSrcList = 0; + } + } + } + return rc; +} + +/* +** Invoke sqlite3WalkExpr() or sqlite3WalkSelect() on all Select or Expr +** objects that are part of the trigger passed as the second argument. +*/ +static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){ + TriggerStep *pStep; + + /* Find tokens to edit in WHEN clause */ + sqlite3WalkExpr(pWalker, pTrigger->pWhen); + + /* Find tokens to edit in trigger steps */ + for(pStep=pTrigger->step_list; pStep; pStep=pStep->pNext){ + sqlite3WalkSelect(pWalker, pStep->pSelect); + sqlite3WalkExpr(pWalker, pStep->pWhere); + sqlite3WalkExprList(pWalker, pStep->pExprList); + if( pStep->pUpsert ){ + Upsert *pUpsert = pStep->pUpsert; + sqlite3WalkExprList(pWalker, pUpsert->pUpsertTarget); + sqlite3WalkExprList(pWalker, pUpsert->pUpsertSet); + sqlite3WalkExpr(pWalker, pUpsert->pUpsertWhere); + sqlite3WalkExpr(pWalker, pUpsert->pUpsertTargetWhere); + } + } +} + +/* +** Free the contents of Parse object (*pParse). Do not free the memory +** occupied by the Parse object itself. +*/ +static void renameParseCleanup(Parse *pParse){ + sqlite3 *db = pParse->db; + Index *pIdx; + if( pParse->pVdbe ){ + sqlite3VdbeFinalize(pParse->pVdbe); + } + sqlite3DeleteTable(db, pParse->pNewTable); + while( (pIdx = pParse->pNewIndex)!=0 ){ + pParse->pNewIndex = pIdx->pNext; + sqlite3FreeIndex(db, pIdx); + } + sqlite3DeleteTrigger(db, pParse->pNewTrigger); + sqlite3DbFree(db, pParse->zErrMsg); + renameTokenFree(db, pParse->pRename); + sqlite3ParserReset(pParse); +} + +/* +** SQL function: +** +** sqlite_rename_column(zSql, iCol, bQuote, zNew, zTable, zOld) +** +** 0. zSql: SQL statement to rewrite +** 1. type: Type of object ("table", "view" etc.) +** 2. object: Name of object +** 3. Database: Database name (e.g. "main") +** 4. Table: Table name +** 5. iCol: Index of column to rename +** 6. zNew: New column name +** 7. bQuote: Non-zero if the new column name should be quoted. +** 8. bTemp: True if zSql comes from temp schema +** +** Do a column rename operation on the CREATE statement given in zSql. +** The iCol-th column (left-most is 0) of table zTable is renamed from zCol +** into zNew. The name should be quoted if bQuote is true. +** +** This function is used internally by the ALTER TABLE RENAME COLUMN command. +** It is only accessible to SQL created using sqlite3NestedParse(). It is +** not reachable from ordinary SQL passed into sqlite3_prepare(). +*/ +static void renameColumnFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + RenameCtx sCtx; + const char *zSql = (const char*)sqlite3_value_text(argv[0]); + const char *zDb = (const char*)sqlite3_value_text(argv[3]); + const char *zTable = (const char*)sqlite3_value_text(argv[4]); + int iCol = sqlite3_value_int(argv[5]); + const char *zNew = (const char*)sqlite3_value_text(argv[6]); + int bQuote = sqlite3_value_int(argv[7]); + int bTemp = sqlite3_value_int(argv[8]); + const char *zOld; + int rc; + Parse sParse; + Walker sWalker; + Index *pIdx; + int i; + Table *pTab; +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; +#endif + + UNUSED_PARAMETER(NotUsed); + if( zSql==0 ) return; + if( zTable==0 ) return; + if( zNew==0 ) return; + if( iCol<0 ) return; + sqlite3BtreeEnterAll(db); + pTab = sqlite3FindTable(db, zTable, zDb); + if( pTab==0 || iCol>=pTab->nCol ){ + sqlite3BtreeLeaveAll(db); + return; + } + zOld = pTab->aCol[iCol].zName; + memset(&sCtx, 0, sizeof(sCtx)); + sCtx.iCol = ((iCol==pTab->iPKey) ? -1 : iCol); + +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = 0; +#endif + rc = renameParseSql(&sParse, zDb, db, zSql, bTemp); + + /* Find tokens that need to be replaced. */ + memset(&sWalker, 0, sizeof(Walker)); + sWalker.pParse = &sParse; + sWalker.xExprCallback = renameColumnExprCb; + sWalker.xSelectCallback = renameColumnSelectCb; + sWalker.u.pRename = &sCtx; + + sCtx.pTab = pTab; + if( rc!=SQLITE_OK ) goto renameColumnFunc_done; + if( sParse.pNewTable ){ + Select *pSelect = sParse.pNewTable->pSelect; + if( pSelect ){ + pSelect->selFlags &= ~SF_View; + sParse.rc = SQLITE_OK; + sqlite3SelectPrep(&sParse, pSelect, 0); + rc = (db->mallocFailed ? SQLITE_NOMEM : sParse.rc); + if( rc==SQLITE_OK ){ + sqlite3WalkSelect(&sWalker, pSelect); + } + if( rc!=SQLITE_OK ) goto renameColumnFunc_done; + }else{ + /* A regular table */ + int bFKOnly = sqlite3_stricmp(zTable, sParse.pNewTable->zName); + FKey *pFKey; + assert( sParse.pNewTable->pSelect==0 ); + sCtx.pTab = sParse.pNewTable; + if( bFKOnly==0 ){ + renameTokenFind( + &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zName + ); + if( sCtx.iCol<0 ){ + renameTokenFind(&sParse, &sCtx, (void*)&sParse.pNewTable->iPKey); + } + sqlite3WalkExprList(&sWalker, sParse.pNewTable->pCheck); + for(pIdx=sParse.pNewTable->pIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3WalkExprList(&sWalker, pIdx->aColExpr); + } + for(pIdx=sParse.pNewIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3WalkExprList(&sWalker, pIdx->aColExpr); + } + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + for(i=0; inCol; i++){ + sqlite3WalkExpr(&sWalker, sParse.pNewTable->aCol[i].pDflt); + } +#endif + + for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + for(i=0; inCol; i++){ + if( bFKOnly==0 && pFKey->aCol[i].iFrom==iCol ){ + renameTokenFind(&sParse, &sCtx, (void*)&pFKey->aCol[i]); + } + if( 0==sqlite3_stricmp(pFKey->zTo, zTable) + && 0==sqlite3_stricmp(pFKey->aCol[i].zCol, zOld) + ){ + renameTokenFind(&sParse, &sCtx, (void*)pFKey->aCol[i].zCol); + } + } + } + } + }else if( sParse.pNewIndex ){ + sqlite3WalkExprList(&sWalker, sParse.pNewIndex->aColExpr); + sqlite3WalkExpr(&sWalker, sParse.pNewIndex->pPartIdxWhere); + }else{ + /* A trigger */ + TriggerStep *pStep; + rc = renameResolveTrigger(&sParse, (bTemp ? 0 : zDb)); + if( rc!=SQLITE_OK ) goto renameColumnFunc_done; + + for(pStep=sParse.pNewTrigger->step_list; pStep; pStep=pStep->pNext){ + if( pStep->zTarget ){ + Table *pTarget = sqlite3LocateTable(&sParse, 0, pStep->zTarget, zDb); + if( pTarget==pTab ){ + if( pStep->pUpsert ){ + ExprList *pUpsertSet = pStep->pUpsert->pUpsertSet; + renameColumnElistNames(&sParse, &sCtx, pUpsertSet, zOld); + } + renameColumnIdlistNames(&sParse, &sCtx, pStep->pIdList, zOld); + renameColumnElistNames(&sParse, &sCtx, pStep->pExprList, zOld); + } + } + } + + + /* Find tokens to edit in UPDATE OF clause */ + if( sParse.pTriggerTab==pTab ){ + renameColumnIdlistNames(&sParse, &sCtx,sParse.pNewTrigger->pColumns,zOld); + } + + /* Find tokens to edit in various expressions and selects */ + renameWalkTrigger(&sWalker, sParse.pNewTrigger); + } + + assert( rc==SQLITE_OK ); + rc = renameEditSql(context, &sCtx, zSql, zNew, bQuote); + +renameColumnFunc_done: + if( rc!=SQLITE_OK ){ + if( sParse.zErrMsg ){ + renameColumnParseError(context, 0, argv[1], argv[2], &sParse); + }else{ + sqlite3_result_error_code(context, rc); + } + } + + renameParseCleanup(&sParse); + renameTokenFree(db, sCtx.pList); +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif + sqlite3BtreeLeaveAll(db); +} + +/* +** Walker expression callback used by "RENAME TABLE". +*/ +static int renameTableExprCb(Walker *pWalker, Expr *pExpr){ + RenameCtx *p = pWalker->u.pRename; + if( pExpr->op==TK_COLUMN && p->pTab==pExpr->y.pTab ){ + renameTokenFind(pWalker->pParse, p, (void*)&pExpr->y.pTab); + } + return WRC_Continue; +} + +/* +** Walker select callback used by "RENAME TABLE". +*/ +static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ + int i; + RenameCtx *p = pWalker->u.pRename; + SrcList *pSrc = pSelect->pSrc; + if( pSelect->selFlags & SF_View ) return WRC_Prune; + if( pSrc==0 ){ + assert( pWalker->pParse->db->mallocFailed ); + return WRC_Abort; + } + for(i=0; inSrc; i++){ + struct SrcList_item *pItem = &pSrc->a[i]; + if( pItem->pTab==p->pTab ){ + renameTokenFind(pWalker->pParse, p, pItem->zName); + } + } + renameWalkWith(pWalker, pSelect); + + return WRC_Continue; +} + + +/* +** This C function implements an SQL user function that is used by SQL code +** generated by the ALTER TABLE ... RENAME command to modify the definition +** of any foreign key constraints that use the table being renamed as the +** parent table. It is passed three arguments: +** +** 0: The database containing the table being renamed. +** 1. type: Type of object ("table", "view" etc.) +** 2. object: Name of object +** 3: The complete text of the schema statement being modified, +** 4: The old name of the table being renamed, and +** 5: The new name of the table being renamed. +** 6: True if the schema statement comes from the temp db. +** +** It returns the new schema statement. For example: +** +** sqlite_rename_table('main', 'CREATE TABLE t1(a REFERENCES t2)','t2','t3',0) +** -> 'CREATE TABLE t1(a REFERENCES t3)' +*/ +static void renameTableFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zDb = (const char*)sqlite3_value_text(argv[0]); + const char *zInput = (const char*)sqlite3_value_text(argv[3]); + const char *zOld = (const char*)sqlite3_value_text(argv[4]); + const char *zNew = (const char*)sqlite3_value_text(argv[5]); + int bTemp = sqlite3_value_int(argv[6]); + UNUSED_PARAMETER(NotUsed); + + if( zInput && zOld && zNew ){ + Parse sParse; + int rc; + int bQuote = 1; + RenameCtx sCtx; + Walker sWalker; + +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; + db->xAuth = 0; +#endif + + sqlite3BtreeEnterAll(db); + + memset(&sCtx, 0, sizeof(RenameCtx)); + sCtx.pTab = sqlite3FindTable(db, zOld, zDb); + memset(&sWalker, 0, sizeof(Walker)); + sWalker.pParse = &sParse; + sWalker.xExprCallback = renameTableExprCb; + sWalker.xSelectCallback = renameTableSelectCb; + sWalker.u.pRename = &sCtx; + + rc = renameParseSql(&sParse, zDb, db, zInput, bTemp); + + if( rc==SQLITE_OK ){ + int isLegacy = (db->flags & SQLITE_LegacyAlter); + if( sParse.pNewTable ){ + Table *pTab = sParse.pNewTable; + + if( pTab->pSelect ){ + if( isLegacy==0 ){ + Select *pSelect = pTab->pSelect; + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = &sParse; + + assert( pSelect->selFlags & SF_View ); + pSelect->selFlags &= ~SF_View; + sqlite3SelectPrep(&sParse, pTab->pSelect, &sNC); + if( sParse.nErr ){ + rc = sParse.rc; + }else{ + sqlite3WalkSelect(&sWalker, pTab->pSelect); + } + } + }else{ + /* Modify any FK definitions to point to the new table. */ +#ifndef SQLITE_OMIT_FOREIGN_KEY + if( isLegacy==0 || (db->flags & SQLITE_ForeignKeys) ){ + FKey *pFKey; + for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + if( sqlite3_stricmp(pFKey->zTo, zOld)==0 ){ + renameTokenFind(&sParse, &sCtx, (void*)pFKey->zTo); + } + } + } +#endif + + /* If this is the table being altered, fix any table refs in CHECK + ** expressions. Also update the name that appears right after the + ** "CREATE [VIRTUAL] TABLE" bit. */ + if( sqlite3_stricmp(zOld, pTab->zName)==0 ){ + sCtx.pTab = pTab; + if( isLegacy==0 ){ + sqlite3WalkExprList(&sWalker, pTab->pCheck); + } + renameTokenFind(&sParse, &sCtx, pTab->zName); + } + } + } + + else if( sParse.pNewIndex ){ + renameTokenFind(&sParse, &sCtx, sParse.pNewIndex->zName); + if( isLegacy==0 ){ + sqlite3WalkExpr(&sWalker, sParse.pNewIndex->pPartIdxWhere); + } + } + +#ifndef SQLITE_OMIT_TRIGGER + else{ + Trigger *pTrigger = sParse.pNewTrigger; + TriggerStep *pStep; + if( 0==sqlite3_stricmp(sParse.pNewTrigger->table, zOld) + && sCtx.pTab->pSchema==pTrigger->pTabSchema + ){ + renameTokenFind(&sParse, &sCtx, sParse.pNewTrigger->table); + } + + if( isLegacy==0 ){ + rc = renameResolveTrigger(&sParse, bTemp ? 0 : zDb); + if( rc==SQLITE_OK ){ + renameWalkTrigger(&sWalker, pTrigger); + for(pStep=pTrigger->step_list; pStep; pStep=pStep->pNext){ + if( pStep->zTarget && 0==sqlite3_stricmp(pStep->zTarget, zOld) ){ + renameTokenFind(&sParse, &sCtx, pStep->zTarget); + } + } + } + } + } +#endif + } + + if( rc==SQLITE_OK ){ + rc = renameEditSql(context, &sCtx, zInput, zNew, bQuote); + } + if( rc!=SQLITE_OK ){ + if( sParse.zErrMsg ){ + renameColumnParseError(context, 0, argv[1], argv[2], &sParse); + }else{ + sqlite3_result_error_code(context, rc); + } + } + + renameParseCleanup(&sParse); + renameTokenFree(db, sCtx.pList); + sqlite3BtreeLeaveAll(db); +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif + } + + return; +} + +/* +** An SQL user function that checks that there are no parse or symbol +** resolution problems in a CREATE TRIGGER|TABLE|VIEW|INDEX statement. +** After an ALTER TABLE .. RENAME operation is performed and the schema +** reloaded, this function is called on each SQL statement in the schema +** to ensure that it is still usable. +** +** 0: Database name ("main", "temp" etc.). +** 1: SQL statement. +** 2: Object type ("view", "table", "trigger" or "index"). +** 3: Object name. +** 4: True if object is from temp schema. +** +** Unless it finds an error, this function normally returns NULL. However, it +** returns integer value 1 if: +** +** * the SQL argument creates a trigger, and +** * the table that the trigger is attached to is in database zDb. +*/ +static void renameTableTest( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + char const *zDb = (const char*)sqlite3_value_text(argv[0]); + char const *zInput = (const char*)sqlite3_value_text(argv[1]); + int bTemp = sqlite3_value_int(argv[4]); + int isLegacy = (db->flags & SQLITE_LegacyAlter); + +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; + db->xAuth = 0; +#endif + + UNUSED_PARAMETER(NotUsed); + if( zDb && zInput ){ + int rc; + Parse sParse; + rc = renameParseSql(&sParse, zDb, db, zInput, bTemp); + if( rc==SQLITE_OK ){ + if( isLegacy==0 && sParse.pNewTable && sParse.pNewTable->pSelect ){ + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = &sParse; + sqlite3SelectPrep(&sParse, sParse.pNewTable->pSelect, &sNC); + if( sParse.nErr ) rc = sParse.rc; + } + + else if( sParse.pNewTrigger ){ + if( isLegacy==0 ){ + rc = renameResolveTrigger(&sParse, bTemp ? 0 : zDb); + } + if( rc==SQLITE_OK ){ + int i1 = sqlite3SchemaToIndex(db, sParse.pNewTrigger->pTabSchema); + int i2 = sqlite3FindDbName(db, zDb); + if( i1==i2 ) sqlite3_result_int(context, 1); + } + } + } + + if( rc!=SQLITE_OK ){ + renameColumnParseError(context, 1, argv[2], argv[3], &sParse); + } + renameParseCleanup(&sParse); + } + +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif +} + +/* +** Register built-in functions used to help implement ALTER TABLE +*/ +SQLITE_PRIVATE void sqlite3AlterFunctions(void){ + static FuncDef aAlterTableFuncs[] = { + INTERNAL_FUNCTION(sqlite_rename_column, 9, renameColumnFunc), + INTERNAL_FUNCTION(sqlite_rename_table, 7, renameTableFunc), + INTERNAL_FUNCTION(sqlite_rename_test, 5, renameTableTest), + }; + sqlite3InsertBuiltinFuncs(aAlterTableFuncs, ArraySize(aAlterTableFuncs)); +} +#endif /* SQLITE_ALTER_TABLE */ + +/************** End of alter.c ***********************************************/ +/************** Begin file analyze.c *****************************************/ +/* +** 2005-07-08 +** +** 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 code associated with the ANALYZE command. +** +** The ANALYZE command gather statistics about the content of tables +** and indices. These statistics are made available to the query planner +** to help it make better decisions about how to perform queries. +** +** The following system tables are or have been supported: +** +** CREATE TABLE sqlite_stat1(tbl, idx, stat); +** CREATE TABLE sqlite_stat2(tbl, idx, sampleno, sample); +** CREATE TABLE sqlite_stat3(tbl, idx, nEq, nLt, nDLt, sample); +** CREATE TABLE sqlite_stat4(tbl, idx, nEq, nLt, nDLt, sample); +** +** Additional tables might be added in future releases of SQLite. +** The sqlite_stat2 table is not created or used unless the SQLite version +** is between 3.6.18 and 3.7.8, inclusive, and unless SQLite is compiled +** with SQLITE_ENABLE_STAT2. The sqlite_stat2 table is deprecated. +** The sqlite_stat2 table is superseded by sqlite_stat3, which is only +** created and used by SQLite versions 3.7.9 through 3.29.0 when +** SQLITE_ENABLE_STAT3 defined. The functionality of sqlite_stat3 +** is a superset of sqlite_stat2 and is also now deprecated. The +** sqlite_stat4 is an enhanced version of sqlite_stat3 and is only +** available when compiled with SQLITE_ENABLE_STAT4 and in SQLite +** versions 3.8.1 and later. STAT4 is the only variant that is still +** supported. +** +** For most applications, sqlite_stat1 provides all the statistics required +** for the query planner to make good choices. +** +** Format of sqlite_stat1: +** +** There is normally one row per index, with the index identified by the +** name in the idx column. The tbl column is the name of the table to +** which the index belongs. In each such row, the stat column will be +** a string consisting of a list of integers. The first integer in this +** list is the number of rows in the index. (This is the same as the +** number of rows in the table, except for partial indices.) The second +** integer is the average number of rows in the index that have the same +** value in the first column of the index. The third integer is the average +** number of rows in the index that have the same value for the first two +** columns. The N-th integer (for N>1) is the average number of rows in +** the index which have the same value for the first N-1 columns. For +** a K-column index, there will be K+1 integers in the stat column. If +** the index is unique, then the last integer will be 1. +** +** The list of integers in the stat column can optionally be followed +** by the keyword "unordered". The "unordered" keyword, if it is present, +** must be separated from the last integer by a single space. If the +** "unordered" keyword is present, then the query planner assumes that +** the index is unordered and will not use the index for a range query. +** +** If the sqlite_stat1.idx column is NULL, then the sqlite_stat1.stat +** column contains a single integer which is the (estimated) number of +** rows in the table identified by sqlite_stat1.tbl. +** +** Format of sqlite_stat2: +** +** The sqlite_stat2 is only created and is only used if SQLite is compiled +** with SQLITE_ENABLE_STAT2 and if the SQLite version number is between +** 3.6.18 and 3.7.8. The "stat2" table contains additional information +** about the distribution of keys within an index. The index is identified by +** the "idx" column and the "tbl" column is the name of the table to which +** the index belongs. There are usually 10 rows in the sqlite_stat2 +** table for each index. +** +** The sqlite_stat2 entries for an index that have sampleno between 0 and 9 +** inclusive are samples of the left-most key value in the index taken at +** evenly spaced points along the index. Let the number of samples be S +** (10 in the standard build) and let C be the number of rows in the index. +** Then the sampled rows are given by: +** +** rownumber = (i*C*2 + C)/(S*2) +** +** For i between 0 and S-1. Conceptually, the index space is divided into +** S uniform buckets and the samples are the middle row from each bucket. +** +** The format for sqlite_stat2 is recorded here for legacy reference. This +** version of SQLite does not support sqlite_stat2. It neither reads nor +** writes the sqlite_stat2 table. This version of SQLite only supports +** sqlite_stat3. +** +** Format for sqlite_stat3: +** +** The sqlite_stat3 format is a subset of sqlite_stat4. Hence, the +** sqlite_stat4 format will be described first. Further information +** about sqlite_stat3 follows the sqlite_stat4 description. +** +** Format for sqlite_stat4: +** +** As with sqlite_stat2, the sqlite_stat4 table contains histogram data +** to aid the query planner in choosing good indices based on the values +** that indexed columns are compared against in the WHERE clauses of +** queries. +** +** The sqlite_stat4 table contains multiple entries for each index. +** The idx column names the index and the tbl column is the table of the +** index. If the idx and tbl columns are the same, then the sample is +** of the INTEGER PRIMARY KEY. The sample column is a blob which is the +** binary encoding of a key from the index. The nEq column is a +** list of integers. The first integer is the approximate number +** of entries in the index whose left-most column exactly matches +** the left-most column of the sample. The second integer in nEq +** is the approximate number of entries in the index where the +** first two columns match the first two columns of the sample. +** And so forth. nLt is another list of integers that show the approximate +** number of entries that are strictly less than the sample. The first +** integer in nLt contains the number of entries in the index where the +** left-most column is less than the left-most column of the sample. +** The K-th integer in the nLt entry is the number of index entries +** where the first K columns are less than the first K columns of the +** sample. The nDLt column is like nLt except that it contains the +** number of distinct entries in the index that are less than the +** sample. +** +** There can be an arbitrary number of sqlite_stat4 entries per index. +** The ANALYZE command will typically generate sqlite_stat4 tables +** that contain between 10 and 40 samples which are distributed across +** the key space, though not uniformly, and which include samples with +** large nEq values. +** +** Format for sqlite_stat3 redux: +** +** The sqlite_stat3 table is like sqlite_stat4 except that it only +** looks at the left-most column of the index. The sqlite_stat3.sample +** column contains the actual value of the left-most column instead +** of a blob encoding of the complete index key as is found in +** sqlite_stat4.sample. The nEq, nLt, and nDLt entries of sqlite_stat3 +** all contain just a single integer which is the same as the first +** integer in the equivalent columns in sqlite_stat4. +*/ +#ifndef SQLITE_OMIT_ANALYZE +/* #include "sqliteInt.h" */ + +#if defined(SQLITE_ENABLE_STAT4) +# define IsStat4 1 +#else +# define IsStat4 0 +# undef SQLITE_STAT4_SAMPLES +# define SQLITE_STAT4_SAMPLES 1 +#endif + +/* +** This routine generates code that opens the sqlite_statN tables. +** The sqlite_stat1 table is always relevant. sqlite_stat2 is now +** obsolete. sqlite_stat3 and sqlite_stat4 are only opened when +** appropriate compile-time options are provided. +** +** If the sqlite_statN tables do not previously exist, it is created. +** +** Argument zWhere may be a pointer to a buffer containing a table name, +** or it may be a NULL pointer. If it is not NULL, then all entries in +** the sqlite_statN tables associated with the named table are deleted. +** If zWhere==0, then code is generated to delete all stat table entries. +*/ +static void openStatTable( + Parse *pParse, /* Parsing context */ + int iDb, /* The database we are looking in */ + int iStatCur, /* Open the sqlite_stat1 table on this cursor */ + const char *zWhere, /* Delete entries for this table or index */ + const char *zWhereType /* Either "tbl" or "idx" */ +){ + static const struct { + const char *zName; + const char *zCols; + } aTable[] = { + { "sqlite_stat1", "tbl,idx,stat" }, +#if defined(SQLITE_ENABLE_STAT4) + { "sqlite_stat4", "tbl,idx,neq,nlt,ndlt,sample" }, +#else + { "sqlite_stat4", 0 }, +#endif + { "sqlite_stat3", 0 }, + }; + int i; + sqlite3 *db = pParse->db; + Db *pDb; + Vdbe *v = sqlite3GetVdbe(pParse); + int aRoot[ArraySize(aTable)]; + u8 aCreateTbl[ArraySize(aTable)]; +#ifdef SQLITE_ENABLE_STAT4 + const int nToOpen = OptimizationEnabled(db,SQLITE_Stat4) ? 2 : 1; +#else + const int nToOpen = 1; +#endif + + if( v==0 ) return; + assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert( sqlite3VdbeDb(v)==db ); + pDb = &db->aDb[iDb]; + + /* Create new statistic tables if they do not exist, or clear them + ** if they do already exist. + */ + for(i=0; izDbSName))==0 ){ + if( iregRoot. This is important + ** because the OpenWrite opcode below will be needing it. */ + sqlite3NestedParse(pParse, + "CREATE TABLE %Q.%s(%s)", pDb->zDbSName, zTab, aTable[i].zCols + ); + aRoot[i] = pParse->regRoot; + aCreateTbl[i] = OPFLAG_P2ISREG; + } + }else{ + /* The table already exists. If zWhere is not NULL, delete all entries + ** associated with the table zWhere. If zWhere is NULL, delete the + ** entire contents of the table. */ + aRoot[i] = pStat->tnum; + sqlite3TableLock(pParse, iDb, aRoot[i], 1, zTab); + if( zWhere ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE %s=%Q", + pDb->zDbSName, zTab, zWhereType, zWhere + ); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + }else if( db->xPreUpdateCallback ){ + sqlite3NestedParse(pParse, "DELETE FROM %Q.%s", pDb->zDbSName, zTab); +#endif + }else{ + /* The sqlite_stat[134] table already exists. Delete all rows. */ + sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb); + } + } + } + + /* Open the sqlite_stat[134] tables for writing. */ + for(i=0; inRowid ){ + sqlite3DbFree(db, p->u.aRowid); + p->nRowid = 0; + } +} +#endif + +/* Initialize the BLOB value of a ROWID +*/ +#ifdef SQLITE_ENABLE_STAT4 +static void sampleSetRowid(sqlite3 *db, StatSample *p, int n, const u8 *pData){ + assert( db!=0 ); + if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); + p->u.aRowid = sqlite3DbMallocRawNN(db, n); + if( p->u.aRowid ){ + p->nRowid = n; + memcpy(p->u.aRowid, pData, n); + }else{ + p->nRowid = 0; + } +} +#endif + +/* Initialize the INTEGER value of a ROWID. +*/ +#ifdef SQLITE_ENABLE_STAT4 +static void sampleSetRowidInt64(sqlite3 *db, StatSample *p, i64 iRowid){ + assert( db!=0 ); + if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); + p->nRowid = 0; + p->u.iRowid = iRowid; +} +#endif + + +/* +** Copy the contents of object (*pFrom) into (*pTo). +*/ +#ifdef SQLITE_ENABLE_STAT4 +static void sampleCopy(StatAccum *p, StatSample *pTo, StatSample *pFrom){ + pTo->isPSample = pFrom->isPSample; + pTo->iCol = pFrom->iCol; + pTo->iHash = pFrom->iHash; + memcpy(pTo->anEq, pFrom->anEq, sizeof(tRowcnt)*p->nCol); + memcpy(pTo->anLt, pFrom->anLt, sizeof(tRowcnt)*p->nCol); + memcpy(pTo->anDLt, pFrom->anDLt, sizeof(tRowcnt)*p->nCol); + if( pFrom->nRowid ){ + sampleSetRowid(p->db, pTo, pFrom->nRowid, pFrom->u.aRowid); + }else{ + sampleSetRowidInt64(p->db, pTo, pFrom->u.iRowid); + } +} +#endif + +/* +** Reclaim all memory of a StatAccum structure. +*/ +static void statAccumDestructor(void *pOld){ + StatAccum *p = (StatAccum*)pOld; +#ifdef SQLITE_ENABLE_STAT4 + if( p->mxSample ){ + int i; + for(i=0; inCol; i++) sampleClear(p->db, p->aBest+i); + for(i=0; imxSample; i++) sampleClear(p->db, p->a+i); + sampleClear(p->db, &p->current); + } +#endif + sqlite3DbFree(p->db, p); +} + +/* +** Implementation of the stat_init(N,K,C,L) SQL function. The four parameters +** are: +** N: The number of columns in the index including the rowid/pk (note 1) +** K: The number of columns in the index excluding the rowid/pk. +** C: Estimated number of rows in the index +** L: A limit on the number of rows to scan, or 0 for no-limit +** +** Note 1: In the special case of the covering index that implements a +** WITHOUT ROWID table, N is the number of PRIMARY KEY columns, not the +** total number of columns in the table. +** +** For indexes on ordinary rowid tables, N==K+1. But for indexes on +** WITHOUT ROWID tables, N=K+P where P is the number of columns in the +** PRIMARY KEY of the table. The covering index that implements the +** original WITHOUT ROWID table as N==K as a special case. +** +** This routine allocates the StatAccum object in heap memory. The return +** value is a pointer to the StatAccum object. The datatype of the +** return value is BLOB, but it is really just a pointer to the StatAccum +** object. +*/ +static void statInit( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + StatAccum *p; + int nCol; /* Number of columns in index being sampled */ + int nKeyCol; /* Number of key columns */ + int nColUp; /* nCol rounded up for alignment */ + int n; /* Bytes of space to allocate */ + sqlite3 *db = sqlite3_context_db_handle(context); /* Database connection */ +#ifdef SQLITE_ENABLE_STAT4 + /* Maximum number of samples. 0 if STAT4 data is not collected */ + int mxSample = OptimizationEnabled(db,SQLITE_Stat4) ?SQLITE_STAT4_SAMPLES :0; +#endif + + /* Decode the three function arguments */ + UNUSED_PARAMETER(argc); + nCol = sqlite3_value_int(argv[0]); + assert( nCol>0 ); + nColUp = sizeof(tRowcnt)<8 ? (nCol+1)&~1 : nCol; + nKeyCol = sqlite3_value_int(argv[1]); + assert( nKeyCol<=nCol ); + assert( nKeyCol>0 ); + + /* Allocate the space required for the StatAccum object */ + n = sizeof(*p) + + sizeof(tRowcnt)*nColUp /* StatAccum.anEq */ + + sizeof(tRowcnt)*nColUp; /* StatAccum.anDLt */ +#ifdef SQLITE_ENABLE_STAT4 + if( mxSample ){ + n += sizeof(tRowcnt)*nColUp /* StatAccum.anLt */ + + sizeof(StatSample)*(nCol+mxSample) /* StatAccum.aBest[], a[] */ + + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample); + } +#endif + db = sqlite3_context_db_handle(context); + p = sqlite3DbMallocZero(db, n); + if( p==0 ){ + sqlite3_result_error_nomem(context); + return; + } + + p->db = db; + p->nEst = sqlite3_value_int64(argv[2]); + p->nRow = 0; + p->nLimit = sqlite3_value_int64(argv[3]); + p->nCol = nCol; + p->nKeyCol = nKeyCol; + p->nSkipAhead = 0; + p->current.anDLt = (tRowcnt*)&p[1]; + p->current.anEq = &p->current.anDLt[nColUp]; + +#ifdef SQLITE_ENABLE_STAT4 + p->mxSample = p->nLimit==0 ? mxSample : 0; + if( mxSample ){ + u8 *pSpace; /* Allocated space not yet assigned */ + int i; /* Used to iterate through p->aSample[] */ + + p->iGet = -1; + p->nPSample = (tRowcnt)(p->nEst/(mxSample/3+1) + 1); + p->current.anLt = &p->current.anEq[nColUp]; + p->iPrn = 0x689e962d*(u32)nCol ^ 0xd0944565*(u32)sqlite3_value_int(argv[2]); + + /* Set up the StatAccum.a[] and aBest[] arrays */ + p->a = (struct StatSample*)&p->current.anLt[nColUp]; + p->aBest = &p->a[mxSample]; + pSpace = (u8*)(&p->a[mxSample+nCol]); + for(i=0; i<(mxSample+nCol); i++){ + p->a[i].anEq = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); + p->a[i].anLt = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); + p->a[i].anDLt = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); + } + assert( (pSpace - (u8*)p)==n ); + + for(i=0; iaBest[i].iCol = i; + } + } +#endif + + /* Return a pointer to the allocated object to the caller. Note that + ** only the pointer (the 2nd parameter) matters. The size of the object + ** (given by the 3rd parameter) is never used and can be any positive + ** value. */ + sqlite3_result_blob(context, p, sizeof(*p), statAccumDestructor); +} +static const FuncDef statInitFuncdef = { + 4, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + statInit, /* xSFunc */ + 0, /* xFinalize */ + 0, 0, /* xValue, xInverse */ + "stat_init", /* zName */ + {0} +}; + +#ifdef SQLITE_ENABLE_STAT4 +/* +** pNew and pOld are both candidate non-periodic samples selected for +** the same column (pNew->iCol==pOld->iCol). Ignoring this column and +** considering only any trailing columns and the sample hash value, this +** function returns true if sample pNew is to be preferred over pOld. +** In other words, if we assume that the cardinalities of the selected +** column for pNew and pOld are equal, is pNew to be preferred over pOld. +** +** This function assumes that for each argument sample, the contents of +** the anEq[] array from pSample->anEq[pSample->iCol+1] onwards are valid. +*/ +static int sampleIsBetterPost( + StatAccum *pAccum, + StatSample *pNew, + StatSample *pOld +){ + int nCol = pAccum->nCol; + int i; + assert( pNew->iCol==pOld->iCol ); + for(i=pNew->iCol+1; ianEq[i]>pOld->anEq[i] ) return 1; + if( pNew->anEq[i]anEq[i] ) return 0; + } + if( pNew->iHash>pOld->iHash ) return 1; + return 0; +} +#endif + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Return true if pNew is to be preferred over pOld. +** +** This function assumes that for each argument sample, the contents of +** the anEq[] array from pSample->anEq[pSample->iCol] onwards are valid. +*/ +static int sampleIsBetter( + StatAccum *pAccum, + StatSample *pNew, + StatSample *pOld +){ + tRowcnt nEqNew = pNew->anEq[pNew->iCol]; + tRowcnt nEqOld = pOld->anEq[pOld->iCol]; + + assert( pOld->isPSample==0 && pNew->isPSample==0 ); + assert( IsStat4 || (pNew->iCol==0 && pOld->iCol==0) ); + + if( (nEqNew>nEqOld) ) return 1; + if( nEqNew==nEqOld ){ + if( pNew->iColiCol ) return 1; + return (pNew->iCol==pOld->iCol && sampleIsBetterPost(pAccum, pNew, pOld)); + } + return 0; +} + +/* +** Copy the contents of sample *pNew into the p->a[] array. If necessary, +** remove the least desirable sample from p->a[] to make room. +*/ +static void sampleInsert(StatAccum *p, StatSample *pNew, int nEqZero){ + StatSample *pSample = 0; + int i; + + assert( IsStat4 || nEqZero==0 ); + + /* StatAccum.nMaxEqZero is set to the maximum number of leading 0 + ** values in the anEq[] array of any sample in StatAccum.a[]. In + ** other words, if nMaxEqZero is n, then it is guaranteed that there + ** are no samples with StatSample.anEq[m]==0 for (m>=n). */ + if( nEqZero>p->nMaxEqZero ){ + p->nMaxEqZero = nEqZero; + } + if( pNew->isPSample==0 ){ + StatSample *pUpgrade = 0; + assert( pNew->anEq[pNew->iCol]>0 ); + + /* This sample is being added because the prefix that ends in column + ** iCol occurs many times in the table. However, if we have already + ** added a sample that shares this prefix, there is no need to add + ** this one. Instead, upgrade the priority of the highest priority + ** existing sample that shares this prefix. */ + for(i=p->nSample-1; i>=0; i--){ + StatSample *pOld = &p->a[i]; + if( pOld->anEq[pNew->iCol]==0 ){ + if( pOld->isPSample ) return; + assert( pOld->iCol>pNew->iCol ); + assert( sampleIsBetter(p, pNew, pOld) ); + if( pUpgrade==0 || sampleIsBetter(p, pOld, pUpgrade) ){ + pUpgrade = pOld; + } + } + } + if( pUpgrade ){ + pUpgrade->iCol = pNew->iCol; + pUpgrade->anEq[pUpgrade->iCol] = pNew->anEq[pUpgrade->iCol]; + goto find_new_min; + } + } + + /* If necessary, remove sample iMin to make room for the new sample. */ + if( p->nSample>=p->mxSample ){ + StatSample *pMin = &p->a[p->iMin]; + tRowcnt *anEq = pMin->anEq; + tRowcnt *anLt = pMin->anLt; + tRowcnt *anDLt = pMin->anDLt; + sampleClear(p->db, pMin); + memmove(pMin, &pMin[1], sizeof(p->a[0])*(p->nSample-p->iMin-1)); + pSample = &p->a[p->nSample-1]; + pSample->nRowid = 0; + pSample->anEq = anEq; + pSample->anDLt = anDLt; + pSample->anLt = anLt; + p->nSample = p->mxSample-1; + } + + /* The "rows less-than" for the rowid column must be greater than that + ** for the last sample in the p->a[] array. Otherwise, the samples would + ** be out of order. */ + assert( p->nSample==0 + || pNew->anLt[p->nCol-1] > p->a[p->nSample-1].anLt[p->nCol-1] ); + + /* Insert the new sample */ + pSample = &p->a[p->nSample]; + sampleCopy(p, pSample, pNew); + p->nSample++; + + /* Zero the first nEqZero entries in the anEq[] array. */ + memset(pSample->anEq, 0, sizeof(tRowcnt)*nEqZero); + +find_new_min: + if( p->nSample>=p->mxSample ){ + int iMin = -1; + for(i=0; imxSample; i++){ + if( p->a[i].isPSample ) continue; + if( iMin<0 || sampleIsBetter(p, &p->a[iMin], &p->a[i]) ){ + iMin = i; + } + } + assert( iMin>=0 ); + p->iMin = iMin; + } +} +#endif /* SQLITE_ENABLE_STAT4 */ + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Field iChng of the index being scanned has changed. So at this point +** p->current contains a sample that reflects the previous row of the +** index. The value of anEq[iChng] and subsequent anEq[] elements are +** correct at this point. +*/ +static void samplePushPrevious(StatAccum *p, int iChng){ + int i; + + /* Check if any samples from the aBest[] array should be pushed + ** into IndexSample.a[] at this point. */ + for(i=(p->nCol-2); i>=iChng; i--){ + StatSample *pBest = &p->aBest[i]; + pBest->anEq[i] = p->current.anEq[i]; + if( p->nSamplemxSample || sampleIsBetter(p, pBest, &p->a[p->iMin]) ){ + sampleInsert(p, pBest, i); + } + } + + /* Check that no sample contains an anEq[] entry with an index of + ** p->nMaxEqZero or greater set to zero. */ + for(i=p->nSample-1; i>=0; i--){ + int j; + for(j=p->nMaxEqZero; jnCol; j++) assert( p->a[i].anEq[j]>0 ); + } + + /* Update the anEq[] fields of any samples already collected. */ + if( iChngnMaxEqZero ){ + for(i=p->nSample-1; i>=0; i--){ + int j; + for(j=iChng; jnCol; j++){ + if( p->a[i].anEq[j]==0 ) p->a[i].anEq[j] = p->current.anEq[j]; + } + } + p->nMaxEqZero = iChng; + } +} +#endif /* SQLITE_ENABLE_STAT4 */ + +/* +** Implementation of the stat_push SQL function: stat_push(P,C,R) +** Arguments: +** +** P Pointer to the StatAccum object created by stat_init() +** C Index of left-most column to differ from previous row +** R Rowid for the current row. Might be a key record for +** WITHOUT ROWID tables. +** +** The purpose of this routine is to collect statistical data and/or +** samples from the index being analyzed into the StatAccum object. +** The stat_get() SQL function will be used afterwards to +** retrieve the information gathered. +** +** This SQL function usually returns NULL, but might return an integer +** if it wants the byte-code to do special processing. +** +** The R parameter is only used for STAT4 +*/ +static void statPush( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i; + + /* The three function arguments */ + StatAccum *p = (StatAccum*)sqlite3_value_blob(argv[0]); + int iChng = sqlite3_value_int(argv[1]); + + UNUSED_PARAMETER( argc ); + UNUSED_PARAMETER( context ); + assert( p->nCol>0 ); + assert( iChngnCol ); + + if( p->nRow==0 ){ + /* This is the first call to this function. Do initialization. */ + for(i=0; inCol; i++) p->current.anEq[i] = 1; + }else{ + /* Second and subsequent calls get processed here */ +#ifdef SQLITE_ENABLE_STAT4 + if( p->mxSample ) samplePushPrevious(p, iChng); +#endif + + /* Update anDLt[], anLt[] and anEq[] to reflect the values that apply + ** to the current row of the index. */ + for(i=0; icurrent.anEq[i]++; + } + for(i=iChng; inCol; i++){ + p->current.anDLt[i]++; +#ifdef SQLITE_ENABLE_STAT4 + if( p->mxSample ) p->current.anLt[i] += p->current.anEq[i]; +#endif + p->current.anEq[i] = 1; + } + } + + p->nRow++; +#ifdef SQLITE_ENABLE_STAT4 + if( p->mxSample ){ + tRowcnt nLt; + if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){ + sampleSetRowidInt64(p->db, &p->current, sqlite3_value_int64(argv[2])); + }else{ + sampleSetRowid(p->db, &p->current, sqlite3_value_bytes(argv[2]), + sqlite3_value_blob(argv[2])); + } + p->current.iHash = p->iPrn = p->iPrn*1103515245 + 12345; + + nLt = p->current.anLt[p->nCol-1]; + /* Check if this is to be a periodic sample. If so, add it. */ + if( (nLt/p->nPSample)!=(nLt+1)/p->nPSample ){ + p->current.isPSample = 1; + p->current.iCol = 0; + sampleInsert(p, &p->current, p->nCol-1); + p->current.isPSample = 0; + } + + /* Update the aBest[] array. */ + for(i=0; i<(p->nCol-1); i++){ + p->current.iCol = i; + if( i>=iChng || sampleIsBetterPost(p, &p->current, &p->aBest[i]) ){ + sampleCopy(p, &p->aBest[i], &p->current); + } + } + }else +#endif + if( p->nLimit && p->nRow>(tRowcnt)p->nLimit*(p->nSkipAhead+1) ){ + p->nSkipAhead++; + sqlite3_result_int(context, p->current.anDLt[0]>0); + } +} + +static const FuncDef statPushFuncdef = { + 2+IsStat4, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + statPush, /* xSFunc */ + 0, /* xFinalize */ + 0, 0, /* xValue, xInverse */ + "stat_push", /* zName */ + {0} +}; + +#define STAT_GET_STAT1 0 /* "stat" column of stat1 table */ +#define STAT_GET_ROWID 1 /* "rowid" column of stat[34] entry */ +#define STAT_GET_NEQ 2 /* "neq" column of stat[34] entry */ +#define STAT_GET_NLT 3 /* "nlt" column of stat[34] entry */ +#define STAT_GET_NDLT 4 /* "ndlt" column of stat[34] entry */ + +/* +** Implementation of the stat_get(P,J) SQL function. This routine is +** used to query statistical information that has been gathered into +** the StatAccum object by prior calls to stat_push(). The P parameter +** has type BLOB but it is really just a pointer to the StatAccum object. +** The content to returned is determined by the parameter J +** which is one of the STAT_GET_xxxx values defined above. +** +** The stat_get(P,J) function is not available to generic SQL. It is +** inserted as part of a manually constructed bytecode program. (See +** the callStatGet() routine below.) It is guaranteed that the P +** parameter will always be a pointer to a StatAccum object, never a +** NULL. +** +** If STAT4 is not enabled, then J is always +** STAT_GET_STAT1 and is hence omitted and this routine becomes +** a one-parameter function, stat_get(P), that always returns the +** stat1 table entry information. +*/ +static void statGet( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + StatAccum *p = (StatAccum*)sqlite3_value_blob(argv[0]); +#ifdef SQLITE_ENABLE_STAT4 + /* STAT4 has a parameter on this routine. */ + int eCall = sqlite3_value_int(argv[1]); + assert( argc==2 ); + assert( eCall==STAT_GET_STAT1 || eCall==STAT_GET_NEQ + || eCall==STAT_GET_ROWID || eCall==STAT_GET_NLT + || eCall==STAT_GET_NDLT + ); + assert( eCall==STAT_GET_STAT1 || p->mxSample ); + if( eCall==STAT_GET_STAT1 ) +#else + assert( argc==1 ); +#endif + { + /* Return the value to store in the "stat" column of the sqlite_stat1 + ** table for this index. + ** + ** The value is a string composed of a list of integers describing + ** the index. The first integer in the list is the total number of + ** entries in the index. There is one additional integer in the list + ** for each indexed column. This additional integer is an estimate of + ** the number of rows matched by a equality query on the index using + ** a key with the corresponding number of fields. In other words, + ** if the index is on columns (a,b) and the sqlite_stat1 value is + ** "100 10 2", then SQLite estimates that: + ** + ** * the index contains 100 rows, + ** * "WHERE a=?" matches 10 rows, and + ** * "WHERE a=? AND b=?" matches 2 rows. + ** + ** If D is the count of distinct values and K is the total number of + ** rows, then each estimate is computed as: + ** + ** I = (K+D-1)/D + */ + char *z; + int i; + + char *zRet = sqlite3MallocZero( (p->nKeyCol+1)*25 ); + if( zRet==0 ){ + sqlite3_result_error_nomem(context); + return; + } + + sqlite3_snprintf(24, zRet, "%llu", + p->nSkipAhead ? (u64)p->nEst : (u64)p->nRow); + z = zRet + sqlite3Strlen30(zRet); + for(i=0; inKeyCol; i++){ + u64 nDistinct = p->current.anDLt[i] + 1; + u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; + sqlite3_snprintf(24, z, " %llu", iVal); + z += sqlite3Strlen30(z); + assert( p->current.anEq[i] ); + } + assert( z[0]=='\0' && z>zRet ); + + sqlite3_result_text(context, zRet, -1, sqlite3_free); + } +#ifdef SQLITE_ENABLE_STAT4 + else if( eCall==STAT_GET_ROWID ){ + if( p->iGet<0 ){ + samplePushPrevious(p, 0); + p->iGet = 0; + } + if( p->iGetnSample ){ + StatSample *pS = p->a + p->iGet; + if( pS->nRowid==0 ){ + sqlite3_result_int64(context, pS->u.iRowid); + }else{ + sqlite3_result_blob(context, pS->u.aRowid, pS->nRowid, + SQLITE_TRANSIENT); + } + } + }else{ + tRowcnt *aCnt = 0; + + assert( p->iGetnSample ); + switch( eCall ){ + case STAT_GET_NEQ: aCnt = p->a[p->iGet].anEq; break; + case STAT_GET_NLT: aCnt = p->a[p->iGet].anLt; break; + default: { + aCnt = p->a[p->iGet].anDLt; + p->iGet++; + break; + } + } + + { + char *zRet = sqlite3MallocZero(p->nCol * 25); + if( zRet==0 ){ + sqlite3_result_error_nomem(context); + }else{ + int i; + char *z = zRet; + for(i=0; inCol; i++){ + sqlite3_snprintf(24, z, "%llu ", (u64)aCnt[i]); + z += sqlite3Strlen30(z); + } + assert( z[0]=='\0' && z>zRet ); + z[-1] = '\0'; + sqlite3_result_text(context, zRet, -1, sqlite3_free); + } + } + } +#endif /* SQLITE_ENABLE_STAT4 */ +#ifndef SQLITE_DEBUG + UNUSED_PARAMETER( argc ); +#endif +} +static const FuncDef statGetFuncdef = { + 1+IsStat4, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + statGet, /* xSFunc */ + 0, /* xFinalize */ + 0, 0, /* xValue, xInverse */ + "stat_get", /* zName */ + {0} +}; + +static void callStatGet(Parse *pParse, int regStat, int iParam, int regOut){ +#ifdef SQLITE_ENABLE_STAT4 + sqlite3VdbeAddOp2(pParse->pVdbe, OP_Integer, iParam, regStat+1); +#elif SQLITE_DEBUG + assert( iParam==STAT_GET_STAT1 ); +#else + UNUSED_PARAMETER( iParam ); +#endif + assert( regOut!=regStat && regOut!=regStat+1 ); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat, regOut, 1+IsStat4, + &statGetFuncdef, 0); +} + +/* +** Generate code to do an analysis of all indices associated with +** a single table. +*/ +static void analyzeOneTable( + Parse *pParse, /* Parser context */ + Table *pTab, /* Table whose indices are to be analyzed */ + Index *pOnlyIdx, /* If not NULL, only analyze this one index */ + int iStatCur, /* Index of VdbeCursor that writes the sqlite_stat1 table */ + int iMem, /* Available memory locations begin here */ + int iTab /* Next available cursor */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + Index *pIdx; /* An index to being analyzed */ + int iIdxCur; /* Cursor open on index being analyzed */ + int iTabCur; /* Table cursor */ + Vdbe *v; /* The virtual machine being built up */ + int i; /* Loop counter */ + int jZeroRows = -1; /* Jump from here if number of rows is zero */ + int iDb; /* Index of database containing pTab */ + u8 needTableCnt = 1; /* True to count the table */ + int regNewRowid = iMem++; /* Rowid for the inserted record */ + int regStat = iMem++; /* Register to hold StatAccum object */ + int regChng = iMem++; /* Index of changed index field */ + int regRowid = iMem++; /* Rowid argument passed to stat_push() */ + int regTemp = iMem++; /* Temporary use register */ + int regTemp2 = iMem++; /* Second temporary use register */ + int regTabname = iMem++; /* Register containing table name */ + int regIdxname = iMem++; /* Register containing index name */ + int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */ + int regPrev = iMem; /* MUST BE LAST (see below) */ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + Table *pStat1 = 0; +#endif + + pParse->nMem = MAX(pParse->nMem, iMem); + v = sqlite3GetVdbe(pParse); + if( v==0 || NEVER(pTab==0) ){ + return; + } + if( pTab->tnum==0 ){ + /* Do not gather statistics on views or virtual tables */ + return; + } + if( sqlite3_strlike("sqlite\\_%", pTab->zName, '\\')==0 ){ + /* Do not gather statistics on system tables */ + return; + } + assert( sqlite3BtreeHoldsAllMutexes(db) ); + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 ); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); +#ifndef SQLITE_OMIT_AUTHORIZATION + if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, + db->aDb[iDb].zDbSName ) ){ + return; + } +#endif + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( db->xPreUpdateCallback ){ + pStat1 = (Table*)sqlite3DbMallocZero(db, sizeof(Table) + 13); + if( pStat1==0 ) return; + pStat1->zName = (char*)&pStat1[1]; + memcpy(pStat1->zName, "sqlite_stat1", 13); + pStat1->nCol = 3; + pStat1->iPKey = -1; + sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNBLOB); + } +#endif + + /* Establish a read-lock on the table at the shared-cache level. + ** Open a read-only cursor on the table. Also allocate a cursor number + ** to use for scanning indexes (iIdxCur). No index cursor is opened at + ** this time though. */ + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + iTabCur = iTab++; + iIdxCur = iTab++; + pParse->nTab = MAX(pParse->nTab, iTab); + sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); + sqlite3VdbeLoadString(v, regTabname, pTab->zName); + + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int nCol; /* Number of columns in pIdx. "N" */ + int addrRewind; /* Address of "OP_Rewind iIdxCur" */ + int addrNextRow; /* Address of "next_row:" */ + const char *zIdxName; /* Name of the index */ + int nColTest; /* Number of columns to test for changes */ + + if( pOnlyIdx && pOnlyIdx!=pIdx ) continue; + if( pIdx->pPartIdxWhere==0 ) needTableCnt = 0; + if( !HasRowid(pTab) && IsPrimaryKeyIndex(pIdx) ){ + nCol = pIdx->nKeyCol; + zIdxName = pTab->zName; + nColTest = nCol - 1; + }else{ + nCol = pIdx->nColumn; + zIdxName = pIdx->zName; + nColTest = pIdx->uniqNotNull ? pIdx->nKeyCol-1 : nCol-1; + } + + /* Populate the register containing the index name. */ + sqlite3VdbeLoadString(v, regIdxname, zIdxName); + VdbeComment((v, "Analysis for %s.%s", pTab->zName, zIdxName)); + + /* + ** Pseudo-code for loop that calls stat_push(): + ** + ** Rewind csr + ** if eof(csr) goto end_of_scan; + ** regChng = 0 + ** goto chng_addr_0; + ** + ** next_row: + ** regChng = 0 + ** if( idx(0) != regPrev(0) ) goto chng_addr_0 + ** regChng = 1 + ** if( idx(1) != regPrev(1) ) goto chng_addr_1 + ** ... + ** regChng = N + ** goto chng_addr_N + ** + ** chng_addr_0: + ** regPrev(0) = idx(0) + ** chng_addr_1: + ** regPrev(1) = idx(1) + ** ... + ** + ** endDistinctTest: + ** regRowid = idx(rowid) + ** stat_push(P, regChng, regRowid) + ** Next csr + ** if !eof(csr) goto next_row; + ** + ** end_of_scan: + */ + + /* Make sure there are enough memory cells allocated to accommodate + ** the regPrev array and a trailing rowid (the rowid slot is required + ** when building a record to insert into the sample column of + ** the sqlite_stat4 table. */ + pParse->nMem = MAX(pParse->nMem, regPrev+nColTest); + + /* Open a read-only cursor on the index being analyzed. */ + assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) ); + sqlite3VdbeAddOp3(v, OP_OpenRead, iIdxCur, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + VdbeComment((v, "%s", pIdx->zName)); + + /* Invoke the stat_init() function. The arguments are: + ** + ** (1) the number of columns in the index including the rowid + ** (or for a WITHOUT ROWID table, the number of PK columns), + ** (2) the number of columns in the key without the rowid/pk + ** (3) estimated number of rows in the index, + */ + sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat+1); + assert( regRowid==regStat+2 ); + sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regRowid); +#ifdef SQLITE_ENABLE_STAT4 + if( OptimizationEnabled(db, SQLITE_Stat4) ){ + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regTemp); + addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); + VdbeCoverage(v); + }else +#endif + { + addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Count, iIdxCur, regTemp, 1); + } + assert( regTemp2==regStat+4 ); + sqlite3VdbeAddOp2(v, OP_Integer, db->nAnalysisLimit, regTemp2); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat+1, regStat, 4, + &statInitFuncdef, 0); + + /* Implementation of the following: + ** + ** Rewind csr + ** if eof(csr) goto end_of_scan; + ** regChng = 0 + ** goto next_push_0; + ** + */ + sqlite3VdbeAddOp2(v, OP_Integer, 0, regChng); + addrNextRow = sqlite3VdbeCurrentAddr(v); + + if( nColTest>0 ){ + int endDistinctTest = sqlite3VdbeMakeLabel(pParse); + int *aGotoChng; /* Array of jump instruction addresses */ + aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest); + if( aGotoChng==0 ) continue; + + /* + ** next_row: + ** regChng = 0 + ** if( idx(0) != regPrev(0) ) goto chng_addr_0 + ** regChng = 1 + ** if( idx(1) != regPrev(1) ) goto chng_addr_1 + ** ... + ** regChng = N + ** goto endDistinctTest + */ + sqlite3VdbeAddOp0(v, OP_Goto); + addrNextRow = sqlite3VdbeCurrentAddr(v); + if( nColTest==1 && pIdx->nKeyCol==1 && IsUniqueIndex(pIdx) ){ + /* For a single-column UNIQUE index, once we have found a non-NULL + ** row, we know that all the rest will be distinct, so skip + ** subsequent distinctness tests. */ + sqlite3VdbeAddOp2(v, OP_NotNull, regPrev, endDistinctTest); + VdbeCoverage(v); + } + for(i=0; iazColl[i]); + sqlite3VdbeAddOp2(v, OP_Integer, i, regChng); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regTemp); + VdbeComment((v, "%s.column(%d)", pIdx->zName, i)); + aGotoChng[i] = + sqlite3VdbeAddOp4(v, OP_Ne, regTemp, 0, regPrev+i, pColl, P4_COLLSEQ); + sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); + VdbeCoverage(v); + } + sqlite3VdbeAddOp2(v, OP_Integer, nColTest, regChng); + sqlite3VdbeGoto(v, endDistinctTest); + + + /* + ** chng_addr_0: + ** regPrev(0) = idx(0) + ** chng_addr_1: + ** regPrev(1) = idx(1) + ** ... + */ + sqlite3VdbeJumpHere(v, addrNextRow-1); + for(i=0; izName, i)); + } + sqlite3VdbeResolveLabel(v, endDistinctTest); + sqlite3DbFree(db, aGotoChng); + } + + /* + ** chng_addr_N: + ** regRowid = idx(rowid) // STAT4 only + ** stat_push(P, regChng, regRowid) // 3rd parameter STAT4 only + ** Next csr + ** if !eof(csr) goto next_row; + */ +#ifdef SQLITE_ENABLE_STAT4 + if( OptimizationEnabled(db, SQLITE_Stat4) ){ + assert( regRowid==(regStat+2) ); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, regRowid); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); + int j, k, regKey; + regKey = sqlite3GetTempRange(pParse, pPk->nKeyCol); + for(j=0; jnKeyCol; j++){ + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); + assert( k>=0 && knColumn ); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); + VdbeComment((v, "%s.column(%d)", pIdx->zName, i)); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regKey, pPk->nKeyCol, regRowid); + sqlite3ReleaseTempRange(pParse, regKey, pPk->nKeyCol); + } + } +#endif + assert( regChng==(regStat+1) ); + { + sqlite3VdbeAddFunctionCall(pParse, 1, regStat, regTemp, 2+IsStat4, + &statPushFuncdef, 0); + if( db->nAnalysisLimit ){ + int j1, j2, j3; + j1 = sqlite3VdbeAddOp1(v, OP_IsNull, regTemp); VdbeCoverage(v); + j2 = sqlite3VdbeAddOp1(v, OP_If, regTemp); VdbeCoverage(v); + j3 = sqlite3VdbeAddOp4Int(v, OP_SeekGT, iIdxCur, 0, regPrev, 1); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, j2); + sqlite3VdbeJumpHere(v, j3); + }else{ + sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); + } + } + + /* Add the entry to the stat1 table. */ + callStatGet(pParse, regStat, STAT_GET_STAT1, regStat1); + assert( "BBB"[0]==SQLITE_AFF_TEXT ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); + sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); + sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE); +#endif + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + + /* Add the entries to the stat4 table. */ +#ifdef SQLITE_ENABLE_STAT4 + if( OptimizationEnabled(db, SQLITE_Stat4) && db->nAnalysisLimit==0 ){ + int regEq = regStat1; + int regLt = regStat1+1; + int regDLt = regStat1+2; + int regSample = regStat1+3; + int regCol = regStat1+4; + int regSampleRowid = regCol + nCol; + int addrNext; + int addrIsNull; + u8 seekOp = HasRowid(pTab) ? OP_NotExists : OP_NotFound; + + pParse->nMem = MAX(pParse->nMem, regCol+nCol); + + addrNext = sqlite3VdbeCurrentAddr(v); + callStatGet(pParse, regStat, STAT_GET_ROWID, regSampleRowid); + addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regSampleRowid); + VdbeCoverage(v); + callStatGet(pParse, regStat, STAT_GET_NEQ, regEq); + callStatGet(pParse, regStat, STAT_GET_NLT, regLt); + callStatGet(pParse, regStat, STAT_GET_NDLT, regDLt); + sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); + VdbeCoverage(v); + for(i=0; izName)); + sqlite3VdbeAddOp2(v, OP_Count, iTabCur, regStat1); + jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, regStat1); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Null, 0, regIdxname); + assert( "BBB"[0]==SQLITE_AFF_TEXT ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); + sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); + sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE); +#endif + sqlite3VdbeJumpHere(v, jZeroRows); + } +} + + +/* +** Generate code that will cause the most recent index analysis to +** be loaded into internal hash tables where is can be used. +*/ +static void loadAnalysis(Parse *pParse, int iDb){ + Vdbe *v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp1(v, OP_LoadAnalysis, iDb); + } +} + +/* +** Generate code that will do an analysis of an entire database +*/ +static void analyzeDatabase(Parse *pParse, int iDb){ + sqlite3 *db = pParse->db; + Schema *pSchema = db->aDb[iDb].pSchema; /* Schema of database iDb */ + HashElem *k; + int iStatCur; + int iMem; + int iTab; + + sqlite3BeginWriteOperation(pParse, 0, iDb); + iStatCur = pParse->nTab; + pParse->nTab += 3; + openStatTable(pParse, iDb, iStatCur, 0, 0); + iMem = pParse->nMem+1; + iTab = pParse->nTab; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ + Table *pTab = (Table*)sqliteHashData(k); + analyzeOneTable(pParse, pTab, 0, iStatCur, iMem, iTab); + } + loadAnalysis(pParse, iDb); +} + +/* +** Generate code that will do an analysis of a single table in +** a database. If pOnlyIdx is not NULL then it is a single index +** in pTab that should be analyzed. +*/ +static void analyzeTable(Parse *pParse, Table *pTab, Index *pOnlyIdx){ + int iDb; + int iStatCur; + + assert( pTab!=0 ); + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + iStatCur = pParse->nTab; + pParse->nTab += 3; + if( pOnlyIdx ){ + openStatTable(pParse, iDb, iStatCur, pOnlyIdx->zName, "idx"); + }else{ + openStatTable(pParse, iDb, iStatCur, pTab->zName, "tbl"); + } + analyzeOneTable(pParse, pTab, pOnlyIdx, iStatCur,pParse->nMem+1,pParse->nTab); + loadAnalysis(pParse, iDb); +} + +/* +** Generate code for the ANALYZE command. The parser calls this routine +** when it recognizes an ANALYZE command. +** +** ANALYZE -- 1 +** ANALYZE -- 2 +** ANALYZE ?.? -- 3 +** +** Form 1 causes all indices in all attached databases to be analyzed. +** Form 2 analyzes all indices the single database named. +** Form 3 analyzes all indices associated with the named table. +*/ +SQLITE_PRIVATE void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){ + sqlite3 *db = pParse->db; + int iDb; + int i; + char *z, *zDb; + Table *pTab; + Index *pIdx; + Token *pTableName; + Vdbe *v; + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + return; + } + + assert( pName2!=0 || pName1==0 ); + if( pName1==0 ){ + /* Form 1: Analyze everything */ + for(i=0; inDb; i++){ + if( i==1 ) continue; /* Do not analyze the TEMP database */ + analyzeDatabase(pParse, i); + } + }else if( pName2->n==0 && (iDb = sqlite3FindDb(db, pName1))>=0 ){ + /* Analyze the schema named as the argument */ + analyzeDatabase(pParse, iDb); + }else{ + /* Form 3: Analyze the table or index named as an argument */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName); + if( iDb>=0 ){ + zDb = pName2->n ? db->aDb[iDb].zDbSName : 0; + z = sqlite3NameFromToken(db, pTableName); + if( z ){ + if( (pIdx = sqlite3FindIndex(db, z, zDb))!=0 ){ + analyzeTable(pParse, pIdx->pTable, pIdx); + }else if( (pTab = sqlite3LocateTable(pParse, 0, z, zDb))!=0 ){ + analyzeTable(pParse, pTab, 0); + } + sqlite3DbFree(db, z); + } + } + } + if( db->nSqlExec==0 && (v = sqlite3GetVdbe(pParse))!=0 ){ + sqlite3VdbeAddOp0(v, OP_Expire); + } +} + +/* +** Used to pass information from the analyzer reader through to the +** callback routine. +*/ +typedef struct analysisInfo analysisInfo; +struct analysisInfo { + sqlite3 *db; + const char *zDatabase; +}; + +/* +** The first argument points to a nul-terminated string containing a +** list of space separated integers. Read the first nOut of these into +** the array aOut[]. +*/ +static void decodeIntArray( + char *zIntArray, /* String containing int array to decode */ + int nOut, /* Number of slots in aOut[] */ + tRowcnt *aOut, /* Store integers here */ + LogEst *aLog, /* Or, if aOut==0, here */ + Index *pIndex /* Handle extra flags for this index, if not NULL */ +){ + char *z = zIntArray; + int c; + int i; + tRowcnt v; + +#ifdef SQLITE_ENABLE_STAT4 + if( z==0 ) z = ""; +#else + assert( z!=0 ); +#endif + for(i=0; *z && i='0' && c<='9' ){ + v = v*10 + c - '0'; + z++; + } +#ifdef SQLITE_ENABLE_STAT4 + if( aOut ) aOut[i] = v; + if( aLog ) aLog[i] = sqlite3LogEst(v); +#else + assert( aOut==0 ); + UNUSED_PARAMETER(aOut); + assert( aLog!=0 ); + aLog[i] = sqlite3LogEst(v); +#endif + if( *z==' ' ) z++; + } +#ifndef SQLITE_ENABLE_STAT4 + assert( pIndex!=0 ); { +#else + if( pIndex ){ +#endif + pIndex->bUnordered = 0; + pIndex->noSkipScan = 0; + while( z[0] ){ + if( sqlite3_strglob("unordered*", z)==0 ){ + pIndex->bUnordered = 1; + }else if( sqlite3_strglob("sz=[0-9]*", z)==0 ){ + int sz = sqlite3Atoi(z+3); + if( sz<2 ) sz = 2; + pIndex->szIdxRow = sqlite3LogEst(sz); + }else if( sqlite3_strglob("noskipscan*", z)==0 ){ + pIndex->noSkipScan = 1; + } +#ifdef SQLITE_ENABLE_COSTMULT + else if( sqlite3_strglob("costmult=[0-9]*",z)==0 ){ + pIndex->pTable->costMult = sqlite3LogEst(sqlite3Atoi(z+9)); + } +#endif + while( z[0]!=0 && z[0]!=' ' ) z++; + while( z[0]==' ' ) z++; + } + } +} + +/* +** This callback is invoked once for each index when reading the +** sqlite_stat1 table. +** +** argv[0] = name of the table +** argv[1] = name of the index (might be NULL) +** argv[2] = results of analysis - on integer for each column +** +** Entries for which argv[1]==NULL simply record the number of rows in +** the table. +*/ +static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ + analysisInfo *pInfo = (analysisInfo*)pData; + Index *pIndex; + Table *pTable; + const char *z; + + assert( argc==3 ); + UNUSED_PARAMETER2(NotUsed, argc); + + if( argv==0 || argv[0]==0 || argv[2]==0 ){ + return 0; + } + pTable = sqlite3FindTable(pInfo->db, argv[0], pInfo->zDatabase); + if( pTable==0 ){ + return 0; + } + if( argv[1]==0 ){ + pIndex = 0; + }else if( sqlite3_stricmp(argv[0],argv[1])==0 ){ + pIndex = sqlite3PrimaryKeyIndex(pTable); + }else{ + pIndex = sqlite3FindIndex(pInfo->db, argv[1], pInfo->zDatabase); + } + z = argv[2]; + + if( pIndex ){ + tRowcnt *aiRowEst = 0; + int nCol = pIndex->nKeyCol+1; +#ifdef SQLITE_ENABLE_STAT4 + /* Index.aiRowEst may already be set here if there are duplicate + ** sqlite_stat1 entries for this index. In that case just clobber + ** the old data with the new instead of allocating a new array. */ + if( pIndex->aiRowEst==0 ){ + pIndex->aiRowEst = (tRowcnt*)sqlite3MallocZero(sizeof(tRowcnt) * nCol); + if( pIndex->aiRowEst==0 ) sqlite3OomFault(pInfo->db); + } + aiRowEst = pIndex->aiRowEst; +#endif + pIndex->bUnordered = 0; + decodeIntArray((char*)z, nCol, aiRowEst, pIndex->aiRowLogEst, pIndex); + pIndex->hasStat1 = 1; + if( pIndex->pPartIdxWhere==0 ){ + pTable->nRowLogEst = pIndex->aiRowLogEst[0]; + pTable->tabFlags |= TF_HasStat1; + } + }else{ + Index fakeIdx; + fakeIdx.szIdxRow = pTable->szTabRow; +#ifdef SQLITE_ENABLE_COSTMULT + fakeIdx.pTable = pTable; +#endif + decodeIntArray((char*)z, 1, 0, &pTable->nRowLogEst, &fakeIdx); + pTable->szTabRow = fakeIdx.szIdxRow; + pTable->tabFlags |= TF_HasStat1; + } + + return 0; +} + +/* +** If the Index.aSample variable is not NULL, delete the aSample[] array +** and its contents. +*/ +SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ +#ifdef SQLITE_ENABLE_STAT4 + if( pIdx->aSample ){ + int j; + for(j=0; jnSample; j++){ + IndexSample *p = &pIdx->aSample[j]; + sqlite3DbFree(db, p->p); + } + sqlite3DbFree(db, pIdx->aSample); + } + if( db && db->pnBytesFreed==0 ){ + pIdx->nSample = 0; + pIdx->aSample = 0; + } +#else + UNUSED_PARAMETER(db); + UNUSED_PARAMETER(pIdx); +#endif /* SQLITE_ENABLE_STAT4 */ +} + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Populate the pIdx->aAvgEq[] array based on the samples currently +** stored in pIdx->aSample[]. +*/ +static void initAvgEq(Index *pIdx){ + if( pIdx ){ + IndexSample *aSample = pIdx->aSample; + IndexSample *pFinal = &aSample[pIdx->nSample-1]; + int iCol; + int nCol = 1; + if( pIdx->nSampleCol>1 ){ + /* If this is stat4 data, then calculate aAvgEq[] values for all + ** sample columns except the last. The last is always set to 1, as + ** once the trailing PK fields are considered all index keys are + ** unique. */ + nCol = pIdx->nSampleCol-1; + pIdx->aAvgEq[nCol] = 1; + } + for(iCol=0; iColnSample; + int i; /* Used to iterate through samples */ + tRowcnt sumEq = 0; /* Sum of the nEq values */ + tRowcnt avgEq = 0; + tRowcnt nRow; /* Number of rows in index */ + i64 nSum100 = 0; /* Number of terms contributing to sumEq */ + i64 nDist100; /* Number of distinct values in index */ + + if( !pIdx->aiRowEst || iCol>=pIdx->nKeyCol || pIdx->aiRowEst[iCol+1]==0 ){ + nRow = pFinal->anLt[iCol]; + nDist100 = (i64)100 * pFinal->anDLt[iCol]; + nSample--; + }else{ + nRow = pIdx->aiRowEst[0]; + nDist100 = ((i64)100 * pIdx->aiRowEst[0]) / pIdx->aiRowEst[iCol+1]; + } + pIdx->nRowEst0 = nRow; + + /* Set nSum to the number of distinct (iCol+1) field prefixes that + ** occur in the stat4 table for this index. Set sumEq to the sum of + ** the nEq values for column iCol for the same set (adding the value + ** only once where there exist duplicate prefixes). */ + for(i=0; inSample-1) + || aSample[i].anDLt[iCol]!=aSample[i+1].anDLt[iCol] + ){ + sumEq += aSample[i].anEq[iCol]; + nSum100 += 100; + } + } + + if( nDist100>nSum100 && sumEqaAvgEq[iCol] = avgEq; + } + } +} + +/* +** Look up an index by name. Or, if the name of a WITHOUT ROWID table +** is supplied instead, find the PRIMARY KEY index for that table. +*/ +static Index *findIndexOrPrimaryKey( + sqlite3 *db, + const char *zName, + const char *zDb +){ + Index *pIdx = sqlite3FindIndex(db, zName, zDb); + if( pIdx==0 ){ + Table *pTab = sqlite3FindTable(db, zName, zDb); + if( pTab && !HasRowid(pTab) ) pIdx = sqlite3PrimaryKeyIndex(pTab); + } + return pIdx; +} + +/* +** Load the content from either the sqlite_stat4 +** into the relevant Index.aSample[] arrays. +** +** Arguments zSql1 and zSql2 must point to SQL statements that return +** data equivalent to the following: +** +** zSql1: SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx +** zSql2: SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4 +** +** where %Q is replaced with the database name before the SQL is executed. +*/ +static int loadStatTbl( + sqlite3 *db, /* Database handle */ + const char *zSql1, /* SQL statement 1 (see above) */ + const char *zSql2, /* SQL statement 2 (see above) */ + const char *zDb /* Database name (e.g. "main") */ +){ + int rc; /* Result codes from subroutines */ + sqlite3_stmt *pStmt = 0; /* An SQL statement being run */ + char *zSql; /* Text of the SQL statement */ + Index *pPrevIdx = 0; /* Previous index in the loop */ + IndexSample *pSample; /* A slot in pIdx->aSample[] */ + + assert( db->lookaside.bDisable ); + zSql = sqlite3MPrintf(db, zSql1, zDb); + if( !zSql ){ + return SQLITE_NOMEM_BKPT; + } + rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + sqlite3DbFree(db, zSql); + if( rc ) return rc; + + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + int nIdxCol = 1; /* Number of columns in stat4 records */ + + char *zIndex; /* Index name */ + Index *pIdx; /* Pointer to the index object */ + int nSample; /* Number of samples */ + int nByte; /* Bytes of space required */ + int i; /* Bytes of space required */ + tRowcnt *pSpace; + + zIndex = (char *)sqlite3_column_text(pStmt, 0); + if( zIndex==0 ) continue; + nSample = sqlite3_column_int(pStmt, 1); + pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); + assert( pIdx==0 || pIdx->nSample==0 ); + if( pIdx==0 ) continue; + assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); + if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ + nIdxCol = pIdx->nKeyCol; + }else{ + nIdxCol = pIdx->nColumn; + } + pIdx->nSampleCol = nIdxCol; + nByte = sizeof(IndexSample) * nSample; + nByte += sizeof(tRowcnt) * nIdxCol * 3 * nSample; + nByte += nIdxCol * sizeof(tRowcnt); /* Space for Index.aAvgEq[] */ + + pIdx->aSample = sqlite3DbMallocZero(db, nByte); + if( pIdx->aSample==0 ){ + sqlite3_finalize(pStmt); + return SQLITE_NOMEM_BKPT; + } + pSpace = (tRowcnt*)&pIdx->aSample[nSample]; + pIdx->aAvgEq = pSpace; pSpace += nIdxCol; + for(i=0; iaSample[i].anEq = pSpace; pSpace += nIdxCol; + pIdx->aSample[i].anLt = pSpace; pSpace += nIdxCol; + pIdx->aSample[i].anDLt = pSpace; pSpace += nIdxCol; + } + assert( ((u8*)pSpace)-nByte==(u8*)(pIdx->aSample) ); + } + rc = sqlite3_finalize(pStmt); + if( rc ) return rc; + + zSql = sqlite3MPrintf(db, zSql2, zDb); + if( !zSql ){ + return SQLITE_NOMEM_BKPT; + } + rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + sqlite3DbFree(db, zSql); + if( rc ) return rc; + + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + char *zIndex; /* Index name */ + Index *pIdx; /* Pointer to the index object */ + int nCol = 1; /* Number of columns in index */ + + zIndex = (char *)sqlite3_column_text(pStmt, 0); + if( zIndex==0 ) continue; + pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); + if( pIdx==0 ) continue; + /* This next condition is true if data has already been loaded from + ** the sqlite_stat4 table. */ + nCol = pIdx->nSampleCol; + if( pIdx!=pPrevIdx ){ + initAvgEq(pPrevIdx); + pPrevIdx = pIdx; + } + pSample = &pIdx->aSample[pIdx->nSample]; + decodeIntArray((char*)sqlite3_column_text(pStmt,1),nCol,pSample->anEq,0,0); + decodeIntArray((char*)sqlite3_column_text(pStmt,2),nCol,pSample->anLt,0,0); + decodeIntArray((char*)sqlite3_column_text(pStmt,3),nCol,pSample->anDLt,0,0); + + /* Take a copy of the sample. Add two 0x00 bytes the end of the buffer. + ** This is in case the sample record is corrupted. In that case, the + ** sqlite3VdbeRecordCompare() may read up to two varints past the + ** end of the allocated buffer before it realizes it is dealing with + ** a corrupt record. Adding the two 0x00 bytes prevents this from causing + ** a buffer overread. */ + pSample->n = sqlite3_column_bytes(pStmt, 4); + pSample->p = sqlite3DbMallocZero(db, pSample->n + 2); + if( pSample->p==0 ){ + sqlite3_finalize(pStmt); + return SQLITE_NOMEM_BKPT; + } + if( pSample->n ){ + memcpy(pSample->p, sqlite3_column_blob(pStmt, 4), pSample->n); + } + pIdx->nSample++; + } + rc = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) initAvgEq(pPrevIdx); + return rc; +} + +/* +** Load content from the sqlite_stat4 table into +** the Index.aSample[] arrays of all indices. +*/ +static int loadStat4(sqlite3 *db, const char *zDb){ + int rc = SQLITE_OK; /* Result codes from subroutines */ + + assert( db->lookaside.bDisable ); + if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){ + rc = loadStatTbl(db, + "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", + "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4", + zDb + ); + } + return rc; +} +#endif /* SQLITE_ENABLE_STAT4 */ + +/* +** Load the content of the sqlite_stat1 and sqlite_stat4 tables. The +** contents of sqlite_stat1 are used to populate the Index.aiRowEst[] +** arrays. The contents of sqlite_stat4 are used to populate the +** Index.aSample[] arrays. +** +** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR +** is returned. In this case, even if SQLITE_ENABLE_STAT4 was defined +** during compilation and the sqlite_stat4 table is present, no data is +** read from it. +** +** If SQLITE_ENABLE_STAT4 was defined during compilation and the +** sqlite_stat4 table is not present in the database, SQLITE_ERROR is +** returned. However, in this case, data is read from the sqlite_stat1 +** table (if it is present) before returning. +** +** If an OOM error occurs, this function always sets db->mallocFailed. +** This means if the caller does not care about other errors, the return +** code may be ignored. +*/ +SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ + analysisInfo sInfo; + HashElem *i; + char *zSql; + int rc = SQLITE_OK; + Schema *pSchema = db->aDb[iDb].pSchema; + + assert( iDb>=0 && iDbnDb ); + assert( db->aDb[iDb].pBt!=0 ); + + /* Clear any prior statistics */ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + for(i=sqliteHashFirst(&pSchema->tblHash); i; i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + pTab->tabFlags &= ~TF_HasStat1; + } + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + pIdx->hasStat1 = 0; +#ifdef SQLITE_ENABLE_STAT4 + sqlite3DeleteIndexSamples(db, pIdx); + pIdx->aSample = 0; +#endif + } + + /* Load new statistics out of the sqlite_stat1 table */ + sInfo.db = db; + sInfo.zDatabase = db->aDb[iDb].zDbSName; + if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)!=0 ){ + zSql = sqlite3MPrintf(db, + "SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase); + if( zSql==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0); + sqlite3DbFree(db, zSql); + } + } + + /* Set appropriate defaults on all indexes not in the sqlite_stat1 table */ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + if( !pIdx->hasStat1 ) sqlite3DefaultRowEst(pIdx); + } + + /* Load the statistics from the sqlite_stat4 table. */ +#ifdef SQLITE_ENABLE_STAT4 + if( rc==SQLITE_OK ){ + DisableLookaside; + rc = loadStat4(db, sInfo.zDatabase); + EnableLookaside; + } + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + sqlite3_free(pIdx->aiRowEst); + pIdx->aiRowEst = 0; + } +#endif + + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } + return rc; +} + + +#endif /* SQLITE_OMIT_ANALYZE */ + +/************** End of analyze.c *********************************************/ +/************** Begin file attach.c ******************************************/ +/* +** 2003 April 6 +** +** 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 code used to implement the ATTACH and DETACH commands. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_ATTACH +/* +** Resolve an expression that was part of an ATTACH or DETACH statement. This +** is slightly different from resolving a normal SQL expression, because simple +** identifiers are treated as strings, not possible column names or aliases. +** +** i.e. if the parser sees: +** +** ATTACH DATABASE abc AS def +** +** it treats the two expressions as literal strings 'abc' and 'def' instead of +** looking for columns of the same name. +** +** This only applies to the root node of pExpr, so the statement: +** +** ATTACH DATABASE abc||def AS 'db2' +** +** will fail because neither abc or def can be resolved. +*/ +static int resolveAttachExpr(NameContext *pName, Expr *pExpr) +{ + int rc = SQLITE_OK; + if( pExpr ){ + if( pExpr->op!=TK_ID ){ + rc = sqlite3ResolveExprNames(pName, pExpr); + }else{ + pExpr->op = TK_STRING; + } + } + return rc; +} + +/* +** Return true if zName points to a name that may be used to refer to +** database iDb attached to handle db. +*/ +SQLITE_PRIVATE int sqlite3DbIsNamed(sqlite3 *db, int iDb, const char *zName){ + return ( + sqlite3StrICmp(db->aDb[iDb].zDbSName, zName)==0 + || (iDb==0 && sqlite3StrICmp("main", zName)==0) + ); +} + +/* +** An SQL user-function registered to do the work of an ATTACH statement. The +** three arguments to the function come directly from an attach statement: +** +** ATTACH DATABASE x AS y KEY z +** +** SELECT sqlite_attach(x, y, z) +** +** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the +** third argument. +** +** If the db->init.reopenMemdb flags is set, then instead of attaching a +** new database, close the database on db->init.iDb and reopen it as an +** empty MemDB. +*/ +static void attachFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + int i; + int rc = 0; + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zName; + const char *zFile; + char *zPath = 0; + char *zErr = 0; + unsigned int flags; + Db *aNew; /* New array of Db pointers */ + Db *pNew; /* Db object for the newly attached database */ + char *zErrDyn = 0; + sqlite3_vfs *pVfs; + + UNUSED_PARAMETER(NotUsed); + zFile = (const char *)sqlite3_value_text(argv[0]); + zName = (const char *)sqlite3_value_text(argv[1]); + if( zFile==0 ) zFile = ""; + if( zName==0 ) zName = ""; + +#ifdef SQLITE_ENABLE_DESERIALIZE +# define REOPEN_AS_MEMDB(db) (db->init.reopenMemdb) +#else +# define REOPEN_AS_MEMDB(db) (0) +#endif + + if( REOPEN_AS_MEMDB(db) ){ + /* This is not a real ATTACH. Instead, this routine is being called + ** from sqlite3_deserialize() to close database db->init.iDb and + ** reopen it as a MemDB */ + pVfs = sqlite3_vfs_find("memdb"); + if( pVfs==0 ) return; + pNew = &db->aDb[db->init.iDb]; + if( pNew->pBt ) sqlite3BtreeClose(pNew->pBt); + pNew->pBt = 0; + pNew->pSchema = 0; + rc = sqlite3BtreeOpen(pVfs, "x\0", db, &pNew->pBt, 0, SQLITE_OPEN_MAIN_DB); + }else{ + /* This is a real ATTACH + ** + ** Check for the following errors: + ** + ** * Too many attached databases, + ** * Transaction currently open + ** * Specified database name already being used. + */ + if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){ + zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d", + db->aLimit[SQLITE_LIMIT_ATTACHED] + ); + goto attach_error; + } + for(i=0; inDb; i++){ + assert( zName ); + if( sqlite3DbIsNamed(db, i, zName) ){ + zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName); + goto attach_error; + } + } + + /* Allocate the new entry in the db->aDb[] array and initialize the schema + ** hash tables. + */ + if( db->aDb==db->aDbStatic ){ + aNew = sqlite3DbMallocRawNN(db, sizeof(db->aDb[0])*3 ); + if( aNew==0 ) return; + memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2); + }else{ + aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) ); + if( aNew==0 ) return; + } + db->aDb = aNew; + pNew = &db->aDb[db->nDb]; + memset(pNew, 0, sizeof(*pNew)); + + /* Open the database file. If the btree is successfully opened, use + ** it to obtain the database schema. At this point the schema may + ** or may not be initialized. + */ + flags = db->openFlags; + rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + assert( pVfs ); + flags |= SQLITE_OPEN_MAIN_DB; + rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags); + db->nDb++; + pNew->zDbSName = sqlite3DbStrDup(db, zName); + } + db->noSharedCache = 0; + if( rc==SQLITE_CONSTRAINT ){ + rc = SQLITE_ERROR; + zErrDyn = sqlite3MPrintf(db, "database is already attached"); + }else if( rc==SQLITE_OK ){ + Pager *pPager; + pNew->pSchema = sqlite3SchemaGet(db, pNew->pBt); + if( !pNew->pSchema ){ + rc = SQLITE_NOMEM_BKPT; + }else if( pNew->pSchema->file_format && pNew->pSchema->enc!=ENC(db) ){ + zErrDyn = sqlite3MPrintf(db, + "attached databases must use the same text encoding as main database"); + rc = SQLITE_ERROR; + } + sqlite3BtreeEnter(pNew->pBt); + pPager = sqlite3BtreePager(pNew->pBt); + sqlite3PagerLockingMode(pPager, db->dfltLockMode); + sqlite3BtreeSecureDelete(pNew->pBt, + sqlite3BtreeSecureDelete(db->aDb[0].pBt,-1) ); +#ifndef SQLITE_OMIT_PAGER_PRAGMAS + sqlite3BtreeSetPagerFlags(pNew->pBt, + PAGER_SYNCHRONOUS_FULL | (db->flags & PAGER_FLAGS_MASK)); +#endif + sqlite3BtreeLeave(pNew->pBt); + } + pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; + if( rc==SQLITE_OK && pNew->zDbSName==0 ){ + rc = SQLITE_NOMEM_BKPT; + } + sqlite3_free_filename( zPath ); + + /* If the file was opened successfully, read the schema for the new database. + ** If this fails, or if opening the file failed, then close the file and + ** remove the entry from the db->aDb[] array. i.e. put everything back the + ** way we found it. + */ + if( rc==SQLITE_OK ){ + sqlite3BtreeEnterAll(db); + db->init.iDb = 0; + db->mDbFlags &= ~(DBFLAG_SchemaKnownOk); + if( !REOPEN_AS_MEMDB(db) ){ + rc = sqlite3Init(db, &zErrDyn); + } + sqlite3BtreeLeaveAll(db); + assert( zErrDyn==0 || rc!=SQLITE_OK ); + } +#ifdef SQLITE_USER_AUTHENTICATION + if( rc==SQLITE_OK && !REOPEN_AS_MEMDB(db) ){ + u8 newAuth = 0; + rc = sqlite3UserAuthCheckLogin(db, zName, &newAuth); + if( newAuthauth.authLevel ){ + rc = SQLITE_AUTH_USER; + } + } +#endif + if( rc ){ + if( !REOPEN_AS_MEMDB(db) ){ + int iDb = db->nDb - 1; + assert( iDb>=2 ); + if( db->aDb[iDb].pBt ){ + sqlite3BtreeClose(db->aDb[iDb].pBt); + db->aDb[iDb].pBt = 0; + db->aDb[iDb].pSchema = 0; + } + sqlite3ResetAllSchemasOfConnection(db); + db->nDb = iDb; + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + sqlite3DbFree(db, zErrDyn); + zErrDyn = sqlite3MPrintf(db, "out of memory"); + }else if( zErrDyn==0 ){ + zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile); + } + } + goto attach_error; + } + + return; + +attach_error: + /* Return an error if we get here */ + if( zErrDyn ){ + sqlite3_result_error(context, zErrDyn, -1); + sqlite3DbFree(db, zErrDyn); + } + if( rc ) sqlite3_result_error_code(context, rc); +} + +/* +** An SQL user-function registered to do the work of an DETACH statement. The +** three arguments to the function come directly from a detach statement: +** +** DETACH DATABASE x +** +** SELECT sqlite_detach(x) +*/ +static void detachFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + const char *zName = (const char *)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + int i; + Db *pDb = 0; + HashElem *pEntry; + char zErr[128]; + + UNUSED_PARAMETER(NotUsed); + + if( zName==0 ) zName = ""; + for(i=0; inDb; i++){ + pDb = &db->aDb[i]; + if( pDb->pBt==0 ) continue; + if( sqlite3DbIsNamed(db, i, zName) ) break; + } + + if( i>=db->nDb ){ + sqlite3_snprintf(sizeof(zErr),zErr, "no such database: %s", zName); + goto detach_error; + } + if( i<2 ){ + sqlite3_snprintf(sizeof(zErr),zErr, "cannot detach database %s", zName); + goto detach_error; + } + if( sqlite3BtreeIsInReadTrans(pDb->pBt) || sqlite3BtreeIsInBackup(pDb->pBt) ){ + sqlite3_snprintf(sizeof(zErr),zErr, "database %s is locked", zName); + goto detach_error; + } + + /* If any TEMP triggers reference the schema being detached, move those + ** triggers to reference the TEMP schema itself. */ + assert( db->aDb[1].pSchema ); + pEntry = sqliteHashFirst(&db->aDb[1].pSchema->trigHash); + while( pEntry ){ + Trigger *pTrig = (Trigger*)sqliteHashData(pEntry); + if( pTrig->pTabSchema==pDb->pSchema ){ + pTrig->pTabSchema = pTrig->pSchema; + } + pEntry = sqliteHashNext(pEntry); + } + + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + pDb->pSchema = 0; + sqlite3CollapseDatabaseArray(db); + return; + +detach_error: + sqlite3_result_error(context, zErr, -1); +} + +/* +** This procedure generates VDBE code for a single invocation of either the +** sqlite_detach() or sqlite_attach() SQL user functions. +*/ +static void codeAttach( + Parse *pParse, /* The parser context */ + int type, /* Either SQLITE_ATTACH or SQLITE_DETACH */ + FuncDef const *pFunc,/* FuncDef wrapper for detachFunc() or attachFunc() */ + Expr *pAuthArg, /* Expression to pass to authorization callback */ + Expr *pFilename, /* Name of database file */ + Expr *pDbname, /* Name of the database to use internally */ + Expr *pKey /* Database key for encryption extension */ +){ + int rc; + NameContext sName; + Vdbe *v; + sqlite3* db = pParse->db; + int regArgs; + + if( pParse->nErr ) goto attach_end; + memset(&sName, 0, sizeof(NameContext)); + sName.pParse = pParse; + + if( + SQLITE_OK!=(rc = resolveAttachExpr(&sName, pFilename)) || + SQLITE_OK!=(rc = resolveAttachExpr(&sName, pDbname)) || + SQLITE_OK!=(rc = resolveAttachExpr(&sName, pKey)) + ){ + goto attach_end; + } + +#ifndef SQLITE_OMIT_AUTHORIZATION + if( pAuthArg ){ + char *zAuthArg; + if( pAuthArg->op==TK_STRING ){ + zAuthArg = pAuthArg->u.zToken; + }else{ + zAuthArg = 0; + } + rc = sqlite3AuthCheck(pParse, type, zAuthArg, 0, 0); + if(rc!=SQLITE_OK ){ + goto attach_end; + } + } +#endif /* SQLITE_OMIT_AUTHORIZATION */ + + + v = sqlite3GetVdbe(pParse); + regArgs = sqlite3GetTempRange(pParse, 4); + sqlite3ExprCode(pParse, pFilename, regArgs); + sqlite3ExprCode(pParse, pDbname, regArgs+1); + sqlite3ExprCode(pParse, pKey, regArgs+2); + + assert( v || db->mallocFailed ); + if( v ){ + sqlite3VdbeAddFunctionCall(pParse, 0, regArgs+3-pFunc->nArg, regArgs+3, + pFunc->nArg, pFunc, 0); + /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this + ** statement only). For DETACH, set it to false (expire all existing + ** statements). + */ + sqlite3VdbeAddOp1(v, OP_Expire, (type==SQLITE_ATTACH)); + } + +attach_end: + sqlite3ExprDelete(db, pFilename); + sqlite3ExprDelete(db, pDbname); + sqlite3ExprDelete(db, pKey); +} + +/* +** Called by the parser to compile a DETACH statement. +** +** DETACH pDbname +*/ +SQLITE_PRIVATE void sqlite3Detach(Parse *pParse, Expr *pDbname){ + static const FuncDef detach_func = { + 1, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + detachFunc, /* xSFunc */ + 0, /* xFinalize */ + 0, 0, /* xValue, xInverse */ + "sqlite_detach", /* zName */ + {0} + }; + codeAttach(pParse, SQLITE_DETACH, &detach_func, pDbname, 0, 0, pDbname); +} + +/* +** Called by the parser to compile an ATTACH statement. +** +** ATTACH p AS pDbname KEY pKey +*/ +SQLITE_PRIVATE void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){ + static const FuncDef attach_func = { + 3, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + attachFunc, /* xSFunc */ + 0, /* xFinalize */ + 0, 0, /* xValue, xInverse */ + "sqlite_attach", /* zName */ + {0} + }; + codeAttach(pParse, SQLITE_ATTACH, &attach_func, p, p, pDbname, pKey); +} +#endif /* SQLITE_OMIT_ATTACH */ + +/* +** Initialize a DbFixer structure. This routine must be called prior +** to passing the structure to one of the sqliteFixAAAA() routines below. +*/ +SQLITE_PRIVATE void sqlite3FixInit( + DbFixer *pFix, /* The fixer to be initialized */ + Parse *pParse, /* Error messages will be written here */ + int iDb, /* This is the database that must be used */ + const char *zType, /* "view", "trigger", or "index" */ + const Token *pName /* Name of the view, trigger, or index */ +){ + sqlite3 *db; + + db = pParse->db; + assert( db->nDb>iDb ); + pFix->pParse = pParse; + pFix->zDb = db->aDb[iDb].zDbSName; + pFix->pSchema = db->aDb[iDb].pSchema; + pFix->zType = zType; + pFix->pName = pName; + pFix->bTemp = (iDb==1); +} + +/* +** The following set of routines walk through the parse tree and assign +** a specific database to all table references where the database name +** was left unspecified in the original SQL statement. The pFix structure +** must have been initialized by a prior call to sqlite3FixInit(). +** +** These routines are used to make sure that an index, trigger, or +** view in one database does not refer to objects in a different database. +** (Exception: indices, triggers, and views in the TEMP database are +** allowed to refer to anything.) If a reference is explicitly made +** to an object in a different database, an error message is added to +** pParse->zErrMsg and these routines return non-zero. If everything +** checks out, these routines return 0. +*/ +SQLITE_PRIVATE int sqlite3FixSrcList( + DbFixer *pFix, /* Context of the fixation */ + SrcList *pList /* The Source list to check and modify */ +){ + int i; + struct SrcList_item *pItem; + sqlite3 *db = pFix->pParse->db; + int iDb = sqlite3FindDbName(db, pFix->zDb); + + if( NEVER(pList==0) ) return 0; + + for(i=0, pItem=pList->a; inSrc; i++, pItem++){ + if( pFix->bTemp==0 ){ + if( pItem->zDatabase && iDb!=sqlite3FindDbName(db, pItem->zDatabase) ){ + sqlite3ErrorMsg(pFix->pParse, + "%s %T cannot reference objects in database %s", + pFix->zType, pFix->pName, pItem->zDatabase); + return 1; + } + sqlite3DbFree(db, pItem->zDatabase); + pItem->zDatabase = 0; + pItem->pSchema = pFix->pSchema; + pItem->fg.fromDDL = 1; + } +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) + if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1; + if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1; +#endif + if( pItem->fg.isTabFunc && sqlite3FixExprList(pFix, pItem->u1.pFuncArg) ){ + return 1; + } + } + return 0; +} +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) +SQLITE_PRIVATE int sqlite3FixSelect( + DbFixer *pFix, /* Context of the fixation */ + Select *pSelect /* The SELECT statement to be fixed to one database */ +){ + while( pSelect ){ + if( sqlite3FixExprList(pFix, pSelect->pEList) ){ + return 1; + } + if( sqlite3FixSrcList(pFix, pSelect->pSrc) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pSelect->pWhere) ){ + return 1; + } + if( sqlite3FixExprList(pFix, pSelect->pGroupBy) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pSelect->pHaving) ){ + return 1; + } + if( sqlite3FixExprList(pFix, pSelect->pOrderBy) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pSelect->pLimit) ){ + return 1; + } + if( pSelect->pWith ){ + int i; + for(i=0; ipWith->nCte; i++){ + if( sqlite3FixSelect(pFix, pSelect->pWith->a[i].pSelect) ){ + return 1; + } + } + } + pSelect = pSelect->pPrior; + } + return 0; +} +SQLITE_PRIVATE int sqlite3FixExpr( + DbFixer *pFix, /* Context of the fixation */ + Expr *pExpr /* The expression to be fixed to one database */ +){ + while( pExpr ){ + if( !pFix->bTemp ) ExprSetProperty(pExpr, EP_FromDDL); + if( pExpr->op==TK_VARIABLE ){ + if( pFix->pParse->db->init.busy ){ + pExpr->op = TK_NULL; + }else{ + sqlite3ErrorMsg(pFix->pParse, "%s cannot use variables", pFix->zType); + return 1; + } + } + if( ExprHasProperty(pExpr, EP_TokenOnly|EP_Leaf) ) break; + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( sqlite3FixSelect(pFix, pExpr->x.pSelect) ) return 1; + }else{ + if( sqlite3FixExprList(pFix, pExpr->x.pList) ) return 1; + } + if( sqlite3FixExpr(pFix, pExpr->pRight) ){ + return 1; + } + pExpr = pExpr->pLeft; + } + return 0; +} +SQLITE_PRIVATE int sqlite3FixExprList( + DbFixer *pFix, /* Context of the fixation */ + ExprList *pList /* The expression to be fixed to one database */ +){ + int i; + struct ExprList_item *pItem; + if( pList==0 ) return 0; + for(i=0, pItem=pList->a; inExpr; i++, pItem++){ + if( sqlite3FixExpr(pFix, pItem->pExpr) ){ + return 1; + } + } + return 0; +} +#endif + +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE int sqlite3FixTriggerStep( + DbFixer *pFix, /* Context of the fixation */ + TriggerStep *pStep /* The trigger step be fixed to one database */ +){ + while( pStep ){ + if( sqlite3FixSelect(pFix, pStep->pSelect) ){ + return 1; + } + if( sqlite3FixExpr(pFix, pStep->pWhere) ){ + return 1; + } + if( sqlite3FixExprList(pFix, pStep->pExprList) ){ + return 1; + } +#ifndef SQLITE_OMIT_UPSERT + if( pStep->pUpsert ){ + Upsert *pUp = pStep->pUpsert; + if( sqlite3FixExprList(pFix, pUp->pUpsertTarget) + || sqlite3FixExpr(pFix, pUp->pUpsertTargetWhere) + || sqlite3FixExprList(pFix, pUp->pUpsertSet) + || sqlite3FixExpr(pFix, pUp->pUpsertWhere) + ){ + return 1; + } + } +#endif + pStep = pStep->pNext; + } + return 0; +} +#endif + +/************** End of attach.c **********************************************/ +/************** Begin file auth.c ********************************************/ +/* +** 2003 January 11 +** +** 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 code used to implement the sqlite3_set_authorizer() +** API. This facility is an optional feature of the library. Embedded +** systems that do not need this facility may omit it by recompiling +** the library with -DSQLITE_OMIT_AUTHORIZATION=1 +*/ +/* #include "sqliteInt.h" */ + +/* +** All of the code in this file may be omitted by defining a single +** macro. +*/ +#ifndef SQLITE_OMIT_AUTHORIZATION + +/* +** Set or clear the access authorization function. +** +** The access authorization function is be called during the compilation +** phase to verify that the user has read and/or write access permission on +** various fields of the database. The first argument to the auth function +** is a copy of the 3rd argument to this routine. The second argument +** to the auth function is one of these constants: +** +** SQLITE_CREATE_INDEX +** SQLITE_CREATE_TABLE +** SQLITE_CREATE_TEMP_INDEX +** SQLITE_CREATE_TEMP_TABLE +** SQLITE_CREATE_TEMP_TRIGGER +** SQLITE_CREATE_TEMP_VIEW +** SQLITE_CREATE_TRIGGER +** SQLITE_CREATE_VIEW +** SQLITE_DELETE +** SQLITE_DROP_INDEX +** SQLITE_DROP_TABLE +** SQLITE_DROP_TEMP_INDEX +** SQLITE_DROP_TEMP_TABLE +** SQLITE_DROP_TEMP_TRIGGER +** SQLITE_DROP_TEMP_VIEW +** SQLITE_DROP_TRIGGER +** SQLITE_DROP_VIEW +** SQLITE_INSERT +** SQLITE_PRAGMA +** SQLITE_READ +** SQLITE_SELECT +** SQLITE_TRANSACTION +** SQLITE_UPDATE +** +** The third and fourth arguments to the auth function are the name of +** the table and the column that are being accessed. The auth function +** should return either SQLITE_OK, SQLITE_DENY, or SQLITE_IGNORE. If +** SQLITE_OK is returned, it means that access is allowed. SQLITE_DENY +** means that the SQL statement will never-run - the sqlite3_exec() call +** will return with an error. SQLITE_IGNORE means that the SQL statement +** should run but attempts to read the specified column will return NULL +** and attempts to write the column will be ignored. +** +** Setting the auth function to NULL disables this hook. The default +** setting of the auth function is NULL. +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3 *db, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pArg +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->xAuth = (sqlite3_xauth)xAuth; + db->pAuthArg = pArg; + if( db->xAuth ) sqlite3ExpirePreparedStatements(db, 1); + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Write an error message into pParse->zErrMsg that explains that the +** user-supplied authorization function returned an illegal value. +*/ +static void sqliteAuthBadReturnCode(Parse *pParse){ + sqlite3ErrorMsg(pParse, "authorizer malfunction"); + pParse->rc = SQLITE_ERROR; +} + +/* +** Invoke the authorization callback for permission to read column zCol from +** table zTab in database zDb. This function assumes that an authorization +** callback has been registered (i.e. that sqlite3.xAuth is not NULL). +** +** If SQLITE_IGNORE is returned and pExpr is not NULL, then pExpr is changed +** to an SQL NULL expression. Otherwise, if pExpr is NULL, then SQLITE_IGNORE +** is treated as SQLITE_DENY. In this case an error is left in pParse. +*/ +SQLITE_PRIVATE int sqlite3AuthReadCol( + Parse *pParse, /* The parser context */ + const char *zTab, /* Table name */ + const char *zCol, /* Column name */ + int iDb /* Index of containing database. */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + char *zDb = db->aDb[iDb].zDbSName; /* Schema name of attached database */ + int rc; /* Auth callback return code */ + + if( db->init.busy ) return SQLITE_OK; + rc = db->xAuth(db->pAuthArg, SQLITE_READ, zTab,zCol,zDb,pParse->zAuthContext +#ifdef SQLITE_USER_AUTHENTICATION + ,db->auth.zAuthUser +#endif + ); + if( rc==SQLITE_DENY ){ + char *z = sqlite3_mprintf("%s.%s", zTab, zCol); + if( db->nDb>2 || iDb!=0 ) z = sqlite3_mprintf("%s.%z", zDb, z); + sqlite3ErrorMsg(pParse, "access to %z is prohibited", z); + pParse->rc = SQLITE_AUTH; + }else if( rc!=SQLITE_IGNORE && rc!=SQLITE_OK ){ + sqliteAuthBadReturnCode(pParse); + } + return rc; +} + +/* +** The pExpr should be a TK_COLUMN expression. The table referred to +** is in pTabList or else it is the NEW or OLD table of a trigger. +** Check to see if it is OK to read this particular column. +** +** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN +** instruction into a TK_NULL. If the auth function returns SQLITE_DENY, +** then generate an error. +*/ +SQLITE_PRIVATE void sqlite3AuthRead( + Parse *pParse, /* The parser context */ + Expr *pExpr, /* The expression to check authorization on */ + Schema *pSchema, /* The schema of the expression */ + SrcList *pTabList /* All table that pExpr might refer to */ +){ + sqlite3 *db = pParse->db; + Table *pTab = 0; /* The table being read */ + const char *zCol; /* Name of the column of the table */ + int iSrc; /* Index in pTabList->a[] of table being read */ + int iDb; /* The index of the database the expression refers to */ + int iCol; /* Index of column in table */ + + assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER ); + assert( !IN_RENAME_OBJECT || db->xAuth==0 ); + if( db->xAuth==0 ) return; + iDb = sqlite3SchemaToIndex(pParse->db, pSchema); + if( iDb<0 ){ + /* An attempt to read a column out of a subquery or other + ** temporary table. */ + return; + } + + if( pExpr->op==TK_TRIGGER ){ + pTab = pParse->pTriggerTab; + }else{ + assert( pTabList ); + for(iSrc=0; ALWAYS(iSrcnSrc); iSrc++){ + if( pExpr->iTable==pTabList->a[iSrc].iCursor ){ + pTab = pTabList->a[iSrc].pTab; + break; + } + } + } + iCol = pExpr->iColumn; + if( NEVER(pTab==0) ) return; + + if( iCol>=0 ){ + assert( iColnCol ); + zCol = pTab->aCol[iCol].zName; + }else if( pTab->iPKey>=0 ){ + assert( pTab->iPKeynCol ); + zCol = pTab->aCol[pTab->iPKey].zName; + }else{ + zCol = "ROWID"; + } + assert( iDb>=0 && iDbnDb ); + if( SQLITE_IGNORE==sqlite3AuthReadCol(pParse, pTab->zName, zCol, iDb) ){ + pExpr->op = TK_NULL; + } +} + +/* +** Do an authorization check using the code and arguments given. Return +** either SQLITE_OK (zero) or SQLITE_IGNORE or SQLITE_DENY. If SQLITE_DENY +** is returned, then the error count and error message in pParse are +** modified appropriately. +*/ +SQLITE_PRIVATE int sqlite3AuthCheck( + Parse *pParse, + int code, + const char *zArg1, + const char *zArg2, + const char *zArg3 +){ + sqlite3 *db = pParse->db; + int rc; + + /* Don't do any authorization checks if the database is initialising + ** or if the parser is being invoked from within sqlite3_declare_vtab. + */ + assert( !IN_RENAME_OBJECT || db->xAuth==0 ); + if( db->init.busy || IN_SPECIAL_PARSE ){ + return SQLITE_OK; + } + + if( db->xAuth==0 ){ + return SQLITE_OK; + } + + /* EVIDENCE-OF: R-43249-19882 The third through sixth parameters to the + ** callback are either NULL pointers or zero-terminated strings that + ** contain additional details about the action to be authorized. + ** + ** The following testcase() macros show that any of the 3rd through 6th + ** parameters can be either NULL or a string. */ + testcase( zArg1==0 ); + testcase( zArg2==0 ); + testcase( zArg3==0 ); + testcase( pParse->zAuthContext==0 ); + + rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2, zArg3, pParse->zAuthContext +#ifdef SQLITE_USER_AUTHENTICATION + ,db->auth.zAuthUser +#endif + ); + if( rc==SQLITE_DENY ){ + sqlite3ErrorMsg(pParse, "not authorized"); + pParse->rc = SQLITE_AUTH; + }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ + rc = SQLITE_DENY; + sqliteAuthBadReturnCode(pParse); + } + return rc; +} + +/* +** Push an authorization context. After this routine is called, the +** zArg3 argument to authorization callbacks will be zContext until +** popped. Or if pParse==0, this routine is a no-op. +*/ +SQLITE_PRIVATE void sqlite3AuthContextPush( + Parse *pParse, + AuthContext *pContext, + const char *zContext +){ + assert( pParse ); + pContext->pParse = pParse; + pContext->zAuthContext = pParse->zAuthContext; + pParse->zAuthContext = zContext; +} + +/* +** Pop an authorization context that was previously pushed +** by sqlite3AuthContextPush +*/ +SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext *pContext){ + if( pContext->pParse ){ + pContext->pParse->zAuthContext = pContext->zAuthContext; + pContext->pParse = 0; + } +} + +#endif /* SQLITE_OMIT_AUTHORIZATION */ + +/************** End of auth.c ************************************************/ +/************** Begin file build.c *******************************************/ +/* +** 2001 September 15 +** +** 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 C code routines that are called by the SQLite parser +** when syntax rules are reduced. The routines in this file handle the +** following kinds of SQL syntax: +** +** CREATE TABLE +** DROP TABLE +** CREATE INDEX +** DROP INDEX +** creating ID lists +** BEGIN TRANSACTION +** COMMIT +** ROLLBACK +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** The TableLock structure is only used by the sqlite3TableLock() and +** codeTableLocks() functions. +*/ +struct TableLock { + int iDb; /* The database containing the table to be locked */ + int iTab; /* The root page of the table to be locked */ + u8 isWriteLock; /* True for write lock. False for a read lock */ + const char *zLockName; /* Name of the table */ +}; + +/* +** Record the fact that we want to lock a table at run-time. +** +** The table to be locked has root page iTab and is found in database iDb. +** A read or a write lock can be taken depending on isWritelock. +** +** This routine just records the fact that the lock is desired. The +** code to make the lock occur is generated by a later call to +** codeTableLocks() which occurs during sqlite3FinishCoding(). +*/ +SQLITE_PRIVATE void sqlite3TableLock( + Parse *pParse, /* Parsing context */ + int iDb, /* Index of the database containing the table to lock */ + int iTab, /* Root page number of the table to be locked */ + u8 isWriteLock, /* True for a write lock */ + const char *zName /* Name of the table to be locked */ +){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + int i; + int nBytes; + TableLock *p; + assert( iDb>=0 ); + + if( iDb==1 ) return; + if( !sqlite3BtreeSharable(pParse->db->aDb[iDb].pBt) ) return; + for(i=0; inTableLock; i++){ + p = &pToplevel->aTableLock[i]; + if( p->iDb==iDb && p->iTab==iTab ){ + p->isWriteLock = (p->isWriteLock || isWriteLock); + return; + } + } + + nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1); + pToplevel->aTableLock = + sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes); + if( pToplevel->aTableLock ){ + p = &pToplevel->aTableLock[pToplevel->nTableLock++]; + p->iDb = iDb; + p->iTab = iTab; + p->isWriteLock = isWriteLock; + p->zLockName = zName; + }else{ + pToplevel->nTableLock = 0; + sqlite3OomFault(pToplevel->db); + } +} + +/* +** Code an OP_TableLock instruction for each table locked by the +** statement (configured by calls to sqlite3TableLock()). +*/ +static void codeTableLocks(Parse *pParse){ + int i; + Vdbe *pVdbe; + + pVdbe = sqlite3GetVdbe(pParse); + assert( pVdbe!=0 ); /* sqlite3GetVdbe cannot fail: VDBE already allocated */ + + for(i=0; inTableLock; i++){ + TableLock *p = &pParse->aTableLock[i]; + int p1 = p->iDb; + sqlite3VdbeAddOp4(pVdbe, OP_TableLock, p1, p->iTab, p->isWriteLock, + p->zLockName, P4_STATIC); + } +} +#else + #define codeTableLocks(x) +#endif + +/* +** Return TRUE if the given yDbMask object is empty - if it contains no +** 1 bits. This routine is used by the DbMaskAllZero() and DbMaskNotZero() +** macros when SQLITE_MAX_ATTACHED is greater than 30. +*/ +#if SQLITE_MAX_ATTACHED>30 +SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask m){ + int i; + for(i=0; ipToplevel==0 ); + db = pParse->db; + if( pParse->nested ) return; + if( db->mallocFailed || pParse->nErr ){ + if( pParse->rc==SQLITE_OK ) pParse->rc = SQLITE_ERROR; + return; + } + + /* Begin by generating some termination code at the end of the + ** vdbe program + */ + v = sqlite3GetVdbe(pParse); + assert( !pParse->isMultiWrite + || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort)); + if( v ){ + sqlite3VdbeAddOp0(v, OP_Halt); + +#if SQLITE_USER_AUTHENTICATION + if( pParse->nTableLock>0 && db->init.busy==0 ){ + sqlite3UserAuthInit(db); + if( db->auth.authLevelrc = SQLITE_AUTH_USER; + return; + } + } +#endif + + /* The cookie mask contains one bit for each database file open. + ** (Bit 0 is for main, bit 1 is for temp, and so forth.) Bits are + ** set for each database that is used. Generate code to start a + ** transaction on each used database and to verify the schema cookie + ** on each used database. + */ + if( db->mallocFailed==0 + && (DbMaskNonZero(pParse->cookieMask) || pParse->pConstExpr) + ){ + int iDb, i; + assert( sqlite3VdbeGetOp(v, 0)->opcode==OP_Init ); + sqlite3VdbeJumpHere(v, 0); + for(iDb=0; iDbnDb; iDb++){ + Schema *pSchema; + if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue; + sqlite3VdbeUsesBtree(v, iDb); + pSchema = db->aDb[iDb].pSchema; + sqlite3VdbeAddOp4Int(v, + OP_Transaction, /* Opcode */ + iDb, /* P1 */ + DbMaskTest(pParse->writeMask,iDb), /* P2 */ + pSchema->schema_cookie, /* P3 */ + pSchema->iGeneration /* P4 */ + ); + if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1); + VdbeComment((v, + "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite)); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + for(i=0; inVtabLock; i++){ + char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]); + sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB); + } + pParse->nVtabLock = 0; +#endif + + /* Once all the cookies have been verified and transactions opened, + ** obtain the required table-locks. This is a no-op unless the + ** shared-cache feature is enabled. + */ + codeTableLocks(pParse); + + /* Initialize any AUTOINCREMENT data structures required. + */ + sqlite3AutoincrementBegin(pParse); + + /* Code constant expressions that where factored out of inner loops. + ** + ** The pConstExpr list might also contain expressions that we simply + ** want to keep around until the Parse object is deleted. Such + ** expressions have iConstExprReg==0. Do not generate code for + ** those expressions, of course. + */ + if( pParse->pConstExpr ){ + ExprList *pEL = pParse->pConstExpr; + pParse->okConstFactor = 0; + for(i=0; inExpr; i++){ + int iReg = pEL->a[i].u.iConstExprReg; + if( iReg>0 ){ + sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); + } + } + } + + /* Finally, jump back to the beginning of the executable code. */ + sqlite3VdbeGoto(v, 1); + } + } + + + /* Get the VDBE program ready for execution + */ + if( v && pParse->nErr==0 && !db->mallocFailed ){ + /* A minimum of one cursor is required if autoincrement is used + * See ticket [a696379c1f08866] */ + assert( pParse->pAinc==0 || pParse->nTab>0 ); + sqlite3VdbeMakeReady(v, pParse); + pParse->rc = SQLITE_DONE; + }else{ + pParse->rc = SQLITE_ERROR; + } +} + +/* +** Run the parser and code generator recursively in order to generate +** code for the SQL statement given onto the end of the pParse context +** currently under construction. When the parser is run recursively +** this way, the final OP_Halt is not appended and other initialization +** and finalization steps are omitted because those are handling by the +** outermost parser. +** +** Not everything is nestable. This facility is designed to permit +** INSERT, UPDATE, and DELETE operations against SQLITE_MASTER. Use +** care if you decide to try to use this routine for some other purposes. +*/ +SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ + va_list ap; + char *zSql; + char *zErrMsg = 0; + sqlite3 *db = pParse->db; + char saveBuf[PARSE_TAIL_SZ]; + + if( pParse->nErr ) return; + assert( pParse->nested<10 ); /* Nesting should only be of limited depth */ + va_start(ap, zFormat); + zSql = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + if( zSql==0 ){ + /* This can result either from an OOM or because the formatted string + ** exceeds SQLITE_LIMIT_LENGTH. In the latter case, we need to set + ** an error */ + if( !db->mallocFailed ) pParse->rc = SQLITE_TOOBIG; + pParse->nErr++; + return; + } + pParse->nested++; + memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ); + memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ); + sqlite3RunParser(pParse, zSql, &zErrMsg); + sqlite3DbFree(db, zErrMsg); + sqlite3DbFree(db, zSql); + memcpy(PARSE_TAIL(pParse), saveBuf, PARSE_TAIL_SZ); + pParse->nested--; +} + +#if SQLITE_USER_AUTHENTICATION +/* +** Return TRUE if zTable is the name of the system table that stores the +** list of users and their access credentials. +*/ +SQLITE_PRIVATE int sqlite3UserAuthTable(const char *zTable){ + return sqlite3_stricmp(zTable, "sqlite_user")==0; +} +#endif + +/* +** Locate the in-memory structure that describes a particular database +** table given the name of that table and (optionally) the name of the +** database containing the table. Return NULL if not found. +** +** If zDatabase is 0, all databases are searched for the table and the +** first matching table is returned. (No checking for duplicate table +** names is done.) The search order is TEMP first, then MAIN, then any +** auxiliary databases added using the ATTACH command. +** +** See also sqlite3LocateTable(). +*/ +SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ + Table *p = 0; + int i; + + /* All mutexes are required for schema access. Make sure we hold them. */ + assert( zDatabase!=0 || sqlite3BtreeHoldsAllMutexes(db) ); +#if SQLITE_USER_AUTHENTICATION + /* Only the admin user is allowed to know that the sqlite_user table + ** exists */ + if( db->auth.authLevelnDb; i++){ + if( sqlite3StrICmp(zDatabase, db->aDb[i].zDbSName)==0 ) break; + } + if( i>=db->nDb ){ + /* No match against the official names. But always match "main" + ** to schema 0 as a legacy fallback. */ + if( sqlite3StrICmp(zDatabase,"main")==0 ){ + i = 0; + }else{ + return 0; + } + } + p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); + if( p==0 && i==1 && sqlite3StrICmp(zName, MASTER_NAME)==0 ){ + /* All temp.sqlite_master to be an alias for sqlite_temp_master */ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, TEMP_MASTER_NAME); + } + }else{ + /* Match against TEMP first */ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, zName); + if( p ) return p; + /* The main database is second */ + p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, zName); + if( p ) return p; + /* Attached databases are in order of attachment */ + for(i=2; inDb; i++){ + assert( sqlite3SchemaMutexHeld(db, i, 0) ); + p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); + if( p ) break; + } + } + return p; +} + +/* +** Locate the in-memory structure that describes a particular database +** table given the name of that table and (optionally) the name of the +** database containing the table. Return NULL if not found. Also leave an +** error message in pParse->zErrMsg. +** +** The difference between this routine and sqlite3FindTable() is that this +** routine leaves an error message in pParse->zErrMsg where +** sqlite3FindTable() does not. +*/ +SQLITE_PRIVATE Table *sqlite3LocateTable( + Parse *pParse, /* context in which to report errors */ + u32 flags, /* LOCATE_VIEW or LOCATE_NOERR */ + const char *zName, /* Name of the table we are looking for */ + const char *zDbase /* Name of the database. Might be NULL */ +){ + Table *p; + sqlite3 *db = pParse->db; + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + if( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 + && SQLITE_OK!=sqlite3ReadSchema(pParse) + ){ + return 0; + } + + p = sqlite3FindTable(db, zName, zDbase); + if( p==0 ){ +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* If zName is the not the name of a table in the schema created using + ** CREATE, then check to see if it is the name of an virtual table that + ** can be an eponymous virtual table. */ + if( pParse->disableVtab==0 ){ + Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); + if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ + pMod = sqlite3PragmaVtabRegister(db, zName); + } + if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ + return pMod->pEpoTab; + } + } +#endif + if( flags & LOCATE_NOERR ) return 0; + pParse->checkSchema = 1; + }else if( IsVirtual(p) && pParse->disableVtab ){ + p = 0; + } + + if( p==0 ){ + const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; + if( zDbase ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); + } + } + + return p; +} + +/* +** Locate the table identified by *p. +** +** This is a wrapper around sqlite3LocateTable(). The difference between +** sqlite3LocateTable() and this function is that this function restricts +** the search to schema (p->pSchema) if it is not NULL. p->pSchema may be +** non-NULL if it is part of a view or trigger program definition. See +** sqlite3FixSrcList() for details. +*/ +SQLITE_PRIVATE Table *sqlite3LocateTableItem( + Parse *pParse, + u32 flags, + struct SrcList_item *p +){ + const char *zDb; + assert( p->pSchema==0 || p->zDatabase==0 ); + if( p->pSchema ){ + int iDb = sqlite3SchemaToIndex(pParse->db, p->pSchema); + zDb = pParse->db->aDb[iDb].zDbSName; + }else{ + zDb = p->zDatabase; + } + return sqlite3LocateTable(pParse, flags, p->zName, zDb); +} + +/* +** Locate the in-memory structure that describes +** a particular index given the name of that index +** and the name of the database that contains the index. +** Return NULL if not found. +** +** If zDatabase is 0, all databases are searched for the +** table and the first matching index is returned. (No checking +** for duplicate index names is done.) The search order is +** TEMP first, then MAIN, then any auxiliary databases added +** using the ATTACH command. +*/ +SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){ + Index *p = 0; + int i; + /* All mutexes are required for schema access. Make sure we hold them. */ + assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); + for(i=OMIT_TEMPDB; inDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + Schema *pSchema = db->aDb[j].pSchema; + assert( pSchema ); + if( zDb && sqlite3DbIsNamed(db, j, zDb)==0 ) continue; + assert( sqlite3SchemaMutexHeld(db, j, 0) ); + p = sqlite3HashFind(&pSchema->idxHash, zName); + if( p ) break; + } + return p; +} + +/* +** Reclaim the memory used by an index +*/ +SQLITE_PRIVATE void sqlite3FreeIndex(sqlite3 *db, Index *p){ +#ifndef SQLITE_OMIT_ANALYZE + sqlite3DeleteIndexSamples(db, p); +#endif + sqlite3ExprDelete(db, p->pPartIdxWhere); + sqlite3ExprListDelete(db, p->aColExpr); + sqlite3DbFree(db, p->zColAff); + if( p->isResized ) sqlite3DbFree(db, (void *)p->azColl); +#ifdef SQLITE_ENABLE_STAT4 + sqlite3_free(p->aiRowEst); +#endif + sqlite3DbFree(db, p); +} + +/* +** For the index called zIdxName which is found in the database iDb, +** unlike that index from its Table then remove the index from +** the index hash table and free all memory structures associated +** with the index. +*/ +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){ + Index *pIndex; + Hash *pHash; + + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pHash = &db->aDb[iDb].pSchema->idxHash; + pIndex = sqlite3HashInsert(pHash, zIdxName, 0); + if( ALWAYS(pIndex) ){ + if( pIndex->pTable->pIndex==pIndex ){ + pIndex->pTable->pIndex = pIndex->pNext; + }else{ + Index *p; + /* Justification of ALWAYS(); The index must be on the list of + ** indices. */ + p = pIndex->pTable->pIndex; + while( ALWAYS(p) && p->pNext!=pIndex ){ p = p->pNext; } + if( ALWAYS(p && p->pNext==pIndex) ){ + p->pNext = pIndex->pNext; + } + } + sqlite3FreeIndex(db, pIndex); + } + db->mDbFlags |= DBFLAG_SchemaChange; +} + +/* +** Look through the list of open database files in db->aDb[] and if +** any have been closed, remove them from the list. Reallocate the +** db->aDb[] structure to a smaller size, if possible. +** +** Entry 0 (the "main" database) and entry 1 (the "temp" database) +** are never candidates for being collapsed. +*/ +SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3 *db){ + int i, j; + for(i=j=2; inDb; i++){ + struct Db *pDb = &db->aDb[i]; + if( pDb->pBt==0 ){ + sqlite3DbFree(db, pDb->zDbSName); + pDb->zDbSName = 0; + continue; + } + if( jaDb[j] = db->aDb[i]; + } + j++; + } + db->nDb = j; + if( db->nDb<=2 && db->aDb!=db->aDbStatic ){ + memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0])); + sqlite3DbFree(db, db->aDb); + db->aDb = db->aDbStatic; + } +} + +/* +** Reset the schema for the database at index iDb. Also reset the +** TEMP schema. The reset is deferred if db->nSchemaLock is not zero. +** Deferred resets may be run by calling with iDb<0. +*/ +SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){ + int i; + assert( iDbnDb ); + + if( iDb>=0 ){ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + DbSetProperty(db, iDb, DB_ResetWanted); + DbSetProperty(db, 1, DB_ResetWanted); + db->mDbFlags &= ~DBFLAG_SchemaKnownOk; + } + + if( db->nSchemaLock==0 ){ + for(i=0; inDb; i++){ + if( DbHasProperty(db, i, DB_ResetWanted) ){ + sqlite3SchemaClear(db->aDb[i].pSchema); + } + } + } +} + +/* +** Erase all schema information from all attached databases (including +** "main" and "temp") for a single database connection. +*/ +SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){ + int i; + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Db *pDb = &db->aDb[i]; + if( pDb->pSchema ){ + if( db->nSchemaLock==0 ){ + sqlite3SchemaClear(pDb->pSchema); + }else{ + DbSetProperty(db, i, DB_ResetWanted); + } + } + } + db->mDbFlags &= ~(DBFLAG_SchemaChange|DBFLAG_SchemaKnownOk); + sqlite3VtabUnlockList(db); + sqlite3BtreeLeaveAll(db); + if( db->nSchemaLock==0 ){ + sqlite3CollapseDatabaseArray(db); + } +} + +/* +** This routine is called when a commit occurs. +*/ +SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3 *db){ + db->mDbFlags &= ~DBFLAG_SchemaChange; +} + +/* +** Delete memory allocated for the column names of a table or view (the +** Table.aCol[] array). +*/ +SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ + int i; + Column *pCol; + assert( pTable!=0 ); + if( (pCol = pTable->aCol)!=0 ){ + for(i=0; inCol; i++, pCol++){ + assert( pCol->zName==0 || pCol->hName==sqlite3StrIHash(pCol->zName) ); + sqlite3DbFree(db, pCol->zName); + sqlite3ExprDelete(db, pCol->pDflt); + sqlite3DbFree(db, pCol->zColl); + } + sqlite3DbFree(db, pTable->aCol); + } +} + +/* +** Remove the memory data structures associated with the given +** Table. No changes are made to disk by this routine. +** +** This routine just deletes the data structure. It does not unlink +** the table data structure from the hash table. But it does destroy +** memory structures of the indices and foreign keys associated with +** the table. +** +** The db parameter is optional. It is needed if the Table object +** contains lookaside memory. (Table objects in the schema do not use +** lookaside memory, but some ephemeral Table objects do.) Or the +** db parameter can be used with db->pnBytesFreed to measure the memory +** used by the Table object. +*/ +static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ + Index *pIndex, *pNext; + +#ifdef SQLITE_DEBUG + /* Record the number of outstanding lookaside allocations in schema Tables + ** prior to doing any free() operations. Since schema Tables do not use + ** lookaside, this number should not change. + ** + ** If malloc has already failed, it may be that it failed while allocating + ** a Table object that was going to be marked ephemeral. So do not check + ** that no lookaside memory is used in this case either. */ + int nLookaside = 0; + if( db && !db->mallocFailed && (pTable->tabFlags & TF_Ephemeral)==0 ){ + nLookaside = sqlite3LookasideUsed(db, 0); + } +#endif + + /* Delete all indices associated with this table. */ + for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){ + pNext = pIndex->pNext; + assert( pIndex->pSchema==pTable->pSchema + || (IsVirtual(pTable) && pIndex->idxType!=SQLITE_IDXTYPE_APPDEF) ); + if( (db==0 || db->pnBytesFreed==0) && !IsVirtual(pTable) ){ + char *zName = pIndex->zName; + TESTONLY ( Index *pOld = ) sqlite3HashInsert( + &pIndex->pSchema->idxHash, zName, 0 + ); + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); + assert( pOld==pIndex || pOld==0 ); + } + sqlite3FreeIndex(db, pIndex); + } + + /* Delete any foreign keys attached to this table. */ + sqlite3FkDelete(db, pTable); + + /* Delete the Table structure itself. + */ + sqlite3DeleteColumnNames(db, pTable); + sqlite3DbFree(db, pTable->zName); + sqlite3DbFree(db, pTable->zColAff); + sqlite3SelectDelete(db, pTable->pSelect); + sqlite3ExprListDelete(db, pTable->pCheck); +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3VtabClear(db, pTable); +#endif + sqlite3DbFree(db, pTable); + + /* Verify that no lookaside memory was used by schema tables */ + assert( nLookaside==0 || nLookaside==sqlite3LookasideUsed(db,0) ); +} +SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ + /* Do not delete the table until the reference count reaches zero. */ + if( !pTable ) return; + if( ((!db || db->pnBytesFreed==0) && (--pTable->nTabRef)>0) ) return; + deleteTable(db, pTable); +} + + +/* +** Unlink the given table from the hash tables and the delete the +** table structure with all its indices and foreign keys. +*/ +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){ + Table *p; + Db *pDb; + + assert( db!=0 ); + assert( iDb>=0 && iDbnDb ); + assert( zTabName ); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + testcase( zTabName[0]==0 ); /* Zero-length table names are allowed */ + pDb = &db->aDb[iDb]; + p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName, 0); + sqlite3DeleteTable(db, p); + db->mDbFlags |= DBFLAG_SchemaChange; +} + +/* +** Given a token, return a string that consists of the text of that +** token. Space to hold the returned string +** is obtained from sqliteMalloc() and must be freed by the calling +** function. +** +** Any quotation marks (ex: "name", 'name', [name], or `name`) that +** surround the body of the token are removed. +** +** Tokens are often just pointers into the original SQL text and so +** are not \000 terminated and are not persistent. The returned string +** is \000 terminated and is persistent. +*/ +SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3 *db, Token *pName){ + char *zName; + if( pName ){ + zName = sqlite3DbStrNDup(db, (char*)pName->z, pName->n); + sqlite3Dequote(zName); + }else{ + zName = 0; + } + return zName; +} + +/* +** Open the sqlite_master table stored in database number iDb for +** writing. The table is opened using cursor 0. +*/ +SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *p, int iDb){ + Vdbe *v = sqlite3GetVdbe(p); + sqlite3TableLock(p, iDb, MASTER_ROOT, 1, MASTER_NAME); + sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, MASTER_ROOT, iDb, 5); + if( p->nTab==0 ){ + p->nTab = 1; + } +} + +/* +** Parameter zName points to a nul-terminated buffer containing the name +** of a database ("main", "temp" or the name of an attached db). This +** function returns the index of the named database in db->aDb[], or +** -1 if the named db cannot be found. +*/ +SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *db, const char *zName){ + int i = -1; /* Database number */ + if( zName ){ + Db *pDb; + for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){ + if( 0==sqlite3_stricmp(pDb->zDbSName, zName) ) break; + /* "main" is always an acceptable alias for the primary database + ** even if it has been renamed using SQLITE_DBCONFIG_MAINDBNAME. */ + if( i==0 && 0==sqlite3_stricmp("main", zName) ) break; + } + } + return i; +} + +/* +** The token *pName contains the name of a database (either "main" or +** "temp" or the name of an attached db). This routine returns the +** index of the named database in db->aDb[], or -1 if the named db +** does not exist. +*/ +SQLITE_PRIVATE int sqlite3FindDb(sqlite3 *db, Token *pName){ + int i; /* Database number */ + char *zName; /* Name we are searching for */ + zName = sqlite3NameFromToken(db, pName); + i = sqlite3FindDbName(db, zName); + sqlite3DbFree(db, zName); + return i; +} + +/* The table or view or trigger name is passed to this routine via tokens +** pName1 and pName2. If the table name was fully qualified, for example: +** +** CREATE TABLE xxx.yyy (...); +** +** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if +** the table name is not fully qualified, i.e.: +** +** CREATE TABLE yyy(...); +** +** Then pName1 is set to "yyy" and pName2 is "". +** +** This routine sets the *ppUnqual pointer to point at the token (pName1 or +** pName2) that stores the unqualified table name. The index of the +** database "xxx" is returned. +*/ +SQLITE_PRIVATE int sqlite3TwoPartName( + Parse *pParse, /* Parsing and code generating context */ + Token *pName1, /* The "xxx" in the name "xxx.yyy" or "xxx" */ + Token *pName2, /* The "yyy" in the name "xxx.yyy" */ + Token **pUnqual /* Write the unqualified object name here */ +){ + int iDb; /* Database holding the object */ + sqlite3 *db = pParse->db; + + assert( pName2!=0 ); + if( pName2->n>0 ){ + if( db->init.busy ) { + sqlite3ErrorMsg(pParse, "corrupt database"); + return -1; + } + *pUnqual = pName2; + iDb = sqlite3FindDb(db, pName1); + if( iDb<0 ){ + sqlite3ErrorMsg(pParse, "unknown database %T", pName1); + return -1; + } + }else{ + assert( db->init.iDb==0 || db->init.busy || IN_RENAME_OBJECT + || (db->mDbFlags & DBFLAG_Vacuum)!=0); + iDb = db->init.iDb; + *pUnqual = pName1; + } + return iDb; +} + +/* +** True if PRAGMA writable_schema is ON +*/ +SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3 *db){ + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==0 ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + SQLITE_WriteSchema ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + SQLITE_Defensive ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + (SQLITE_WriteSchema|SQLITE_Defensive) ); + return (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==SQLITE_WriteSchema; +} + +/* +** This routine is used to check if the UTF-8 string zName is a legal +** unqualified name for a new schema object (table, index, view or +** trigger). All names are legal except those that begin with the string +** "sqlite_" (in upper, lower or mixed case). This portion of the namespace +** is reserved for internal use. +** +** When parsing the sqlite_master table, this routine also checks to +** make sure the "type", "name", and "tbl_name" columns are consistent +** with the SQL. +*/ +SQLITE_PRIVATE int sqlite3CheckObjectName( + Parse *pParse, /* Parsing context */ + const char *zName, /* Name of the object to check */ + const char *zType, /* Type of this object */ + const char *zTblName /* Parent table name for triggers and indexes */ +){ + sqlite3 *db = pParse->db; + if( sqlite3WritableSchema(db) || db->init.imposterTable ){ + /* Skip these error checks for writable_schema=ON */ + return SQLITE_OK; + } + if( db->init.busy ){ + if( sqlite3_stricmp(zType, db->init.azInit[0]) + || sqlite3_stricmp(zName, db->init.azInit[1]) + || sqlite3_stricmp(zTblName, db->init.azInit[2]) + ){ + if( sqlite3Config.bExtraSchemaChecks ){ + sqlite3ErrorMsg(pParse, ""); /* corruptSchema() will supply the error */ + return SQLITE_ERROR; + } + } + }else{ + if( (pParse->nested==0 && 0==sqlite3StrNICmp(zName, "sqlite_", 7)) + || (sqlite3ReadOnlyShadowTables(db) && sqlite3ShadowTableName(db, zName)) + ){ + sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", + zName); + return SQLITE_ERROR; + } + + } + return SQLITE_OK; +} + +/* +** Return the PRIMARY KEY index of a table +*/ +SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table *pTab){ + Index *p; + for(p=pTab->pIndex; p && !IsPrimaryKeyIndex(p); p=p->pNext){} + return p; +} + +/* +** Convert an table column number into a index column number. That is, +** for the column iCol in the table (as defined by the CREATE TABLE statement) +** find the (first) offset of that column in index pIdx. Or return -1 +** if column iCol is not used in index pIdx. +*/ +SQLITE_PRIVATE i16 sqlite3TableColumnToIndex(Index *pIdx, i16 iCol){ + int i; + for(i=0; inColumn; i++){ + if( iCol==pIdx->aiColumn[i] ) return i; + } + return -1; +} + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* Convert a storage column number into a table column number. +** +** The storage column number (0,1,2,....) is the index of the value +** as it appears in the record on disk. The true column number +** is the index (0,1,2,...) of the column in the CREATE TABLE statement. +** +** The storage column number is less than the table column number if +** and only there are VIRTUAL columns to the left. +** +** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro. +*/ +SQLITE_PRIVATE i16 sqlite3StorageColumnToTable(Table *pTab, i16 iCol){ + if( pTab->tabFlags & TF_HasVirtual ){ + int i; + for(i=0; i<=iCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) iCol++; + } + } + return iCol; +} +#endif + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* Convert a table column number into a storage column number. +** +** The storage column number (0,1,2,....) is the index of the value +** as it appears in the record on disk. Or, if the input column is +** the N-th virtual column (zero-based) then the storage number is +** the number of non-virtual columns in the table plus N. +** +** The true column number is the index (0,1,2,...) of the column in +** the CREATE TABLE statement. +** +** If the input column is a VIRTUAL column, then it should not appear +** in storage. But the value sometimes is cached in registers that +** follow the range of registers used to construct storage. This +** avoids computing the same VIRTUAL column multiple times, and provides +** values for use by OP_Param opcodes in triggers. Hence, if the +** input column is a VIRTUAL table, put it after all the other columns. +** +** In the following, N means "normal column", S means STORED, and +** V means VIRTUAL. Suppose the CREATE TABLE has columns like this: +** +** CREATE TABLE ex(N,S,V,N,S,V,N,S,V); +** -- 0 1 2 3 4 5 6 7 8 +** +** Then the mapping from this function is as follows: +** +** INPUTS: 0 1 2 3 4 5 6 7 8 +** OUTPUTS: 0 1 6 2 3 7 4 5 8 +** +** So, in other words, this routine shifts all the virtual columns to +** the end. +** +** If SQLITE_OMIT_GENERATED_COLUMNS then there are no virtual columns and +** this routine is a no-op macro. If the pTab does not have any virtual +** columns, then this routine is no-op that always return iCol. If iCol +** is negative (indicating the ROWID column) then this routine return iCol. +*/ +SQLITE_PRIVATE i16 sqlite3TableColumnToStorage(Table *pTab, i16 iCol){ + int i; + i16 n; + assert( iColnCol ); + if( (pTab->tabFlags & TF_HasVirtual)==0 || iCol<0 ) return iCol; + for(i=0, n=0; iaCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) n++; + } + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + /* iCol is a virtual column itself */ + return pTab->nNVCol + i - n; + }else{ + /* iCol is a normal or stored column */ + return n; + } +} +#endif + +/* +** Begin constructing a new table representation in memory. This is +** the first of several action routines that get called in response +** to a CREATE TABLE statement. In particular, this routine is called +** after seeing tokens "CREATE" and "TABLE" and the table name. The isTemp +** flag is true if the table should be stored in the auxiliary database +** file instead of in the main database file. This is normally the case +** when the "TEMP" or "TEMPORARY" keyword occurs in between +** CREATE and TABLE. +** +** The new table record is initialized and put in pParse->pNewTable. +** As more of the CREATE TABLE statement is parsed, additional action +** routines will be called to add more information to this record. +** At the end of the CREATE TABLE statement, the sqlite3EndTable() routine +** is called to complete the construction of the new table record. +*/ +SQLITE_PRIVATE void sqlite3StartTable( + Parse *pParse, /* Parser context */ + Token *pName1, /* First part of the name of the table or view */ + Token *pName2, /* Second part of the name of the table or view */ + int isTemp, /* True if this is a TEMP table */ + int isView, /* True if this is a VIEW */ + int isVirtual, /* True if this is a VIRTUAL table */ + int noErr /* Do nothing if table already exists */ +){ + Table *pTable; + char *zName = 0; /* The name of the new table */ + sqlite3 *db = pParse->db; + Vdbe *v; + int iDb; /* Database number to create the table in */ + Token *pName; /* Unqualified name of the table to create */ + + if( db->init.busy && db->init.newTnum==1 ){ + /* Special case: Parsing the sqlite_master or sqlite_temp_master schema */ + iDb = db->init.iDb; + zName = sqlite3DbStrDup(db, SCHEMA_TABLE(iDb)); + pName = pName1; + }else{ + /* The common case */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ) return; + if( !OMIT_TEMPDB && isTemp && pName2->n>0 && iDb!=1 ){ + /* If creating a temp table, the name may not be qualified. Unless + ** the database name is "temp" anyway. */ + sqlite3ErrorMsg(pParse, "temporary table name must be unqualified"); + return; + } + if( !OMIT_TEMPDB && isTemp ) iDb = 1; + zName = sqlite3NameFromToken(db, pName); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenMap(pParse, (void*)zName, pName); + } + } + pParse->sNameToken = *pName; + if( zName==0 ) return; + if( sqlite3CheckObjectName(pParse, zName, isView?"view":"table", zName) ){ + goto begin_table_error; + } + if( db->init.iDb==1 ) isTemp = 1; +#ifndef SQLITE_OMIT_AUTHORIZATION + assert( isTemp==0 || isTemp==1 ); + assert( isView==0 || isView==1 ); + { + static const u8 aCode[] = { + SQLITE_CREATE_TABLE, + SQLITE_CREATE_TEMP_TABLE, + SQLITE_CREATE_VIEW, + SQLITE_CREATE_TEMP_VIEW + }; + char *zDb = db->aDb[iDb].zDbSName; + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){ + goto begin_table_error; + } + if( !isVirtual && sqlite3AuthCheck(pParse, (int)aCode[isTemp+2*isView], + zName, 0, zDb) ){ + goto begin_table_error; + } + } +#endif + + /* Make sure the new table name does not collide with an existing + ** index or table name in the same database. Issue an error message if + ** it does. The exception is if the statement being parsed was passed + ** to an sqlite3_declare_vtab() call. In that case only the column names + ** and types will be used, so there is no need to test for namespace + ** collisions. + */ + if( !IN_SPECIAL_PARSE ){ + char *zDb = db->aDb[iDb].zDbSName; + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto begin_table_error; + } + pTable = sqlite3FindTable(db, zName, zDb); + if( pTable ){ + if( !noErr ){ + sqlite3ErrorMsg(pParse, "table %T already exists", pName); + }else{ + assert( !db->init.busy || CORRUPT_DB ); + sqlite3CodeVerifySchema(pParse, iDb); + } + goto begin_table_error; + } + if( sqlite3FindIndex(db, zName, zDb)!=0 ){ + sqlite3ErrorMsg(pParse, "there is already an index named %s", zName); + goto begin_table_error; + } + } + + pTable = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTable==0 ){ + assert( db->mallocFailed ); + pParse->rc = SQLITE_NOMEM_BKPT; + pParse->nErr++; + goto begin_table_error; + } + pTable->zName = zName; + pTable->iPKey = -1; + pTable->pSchema = db->aDb[iDb].pSchema; + pTable->nTabRef = 1; +#ifdef SQLITE_DEFAULT_ROWEST + pTable->nRowLogEst = sqlite3LogEst(SQLITE_DEFAULT_ROWEST); +#else + pTable->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); +#endif + assert( pParse->pNewTable==0 ); + pParse->pNewTable = pTable; + + /* If this is the magic sqlite_sequence table used by autoincrement, + ** then record a pointer to this table in the main database structure + ** so that INSERT can find the table easily. + */ +#ifndef SQLITE_OMIT_AUTOINCREMENT + if( !pParse->nested && strcmp(zName, "sqlite_sequence")==0 ){ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pTable->pSchema->pSeqTab = pTable; + } +#endif + + /* Begin generating the code that will insert the table record into + ** the SQLITE_MASTER table. Note in particular that we must go ahead + ** and allocate the record number for the table entry now. Before any + ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause + ** indices to be created and the table record must come before the + ** indices. Hence, the record number for the table must be allocated + ** now. + */ + if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){ + int addr1; + int fileFormat; + int reg1, reg2, reg3; + /* nullRow[] is an OP_Record encoding of a row containing 5 NULLs */ + static const char nullRow[] = { 6, 0, 0, 0, 0, 0 }; + sqlite3BeginWriteOperation(pParse, 1, iDb); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( isVirtual ){ + sqlite3VdbeAddOp0(v, OP_VBegin); + } +#endif + + /* If the file format and encoding in the database have not been set, + ** set them now. + */ + reg1 = pParse->regRowid = ++pParse->nMem; + reg2 = pParse->regRoot = ++pParse->nMem; + reg3 = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT); + sqlite3VdbeUsesBtree(v, iDb); + addr1 = sqlite3VdbeAddOp1(v, OP_If, reg3); VdbeCoverage(v); + fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ? + 1 : SQLITE_MAX_FILE_FORMAT; + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, fileFormat); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, ENC(db)); + sqlite3VdbeJumpHere(v, addr1); + + /* This just creates a place-holder record in the sqlite_master table. + ** The record created does not contain anything yet. It will be replaced + ** by the real entry in code generated at sqlite3EndTable(). + ** + ** The rowid for the new entry is left in register pParse->regRowid. + ** The root page number of the new table is left in reg pParse->regRoot. + ** The rowid and root page number values are needed by the code that + ** sqlite3EndTable will generate. + */ +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) + if( isView || isVirtual ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, reg2); + }else +#endif + { + pParse->addrCrTab = + sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, reg2, BTREE_INTKEY); + } + sqlite3OpenMasterTable(pParse, iDb); + sqlite3VdbeAddOp2(v, OP_NewRowid, 0, reg1); + sqlite3VdbeAddOp4(v, OP_Blob, 6, reg3, 0, nullRow, P4_STATIC); + sqlite3VdbeAddOp3(v, OP_Insert, 0, reg3, reg1); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + sqlite3VdbeAddOp0(v, OP_Close); + } + + /* Normal (non-error) return. */ + return; + + /* If an error occurs, we jump here */ +begin_table_error: + sqlite3DbFree(db, zName); + return; +} + +/* Set properties of a table column based on the (magical) +** name of the column. +*/ +#if SQLITE_ENABLE_HIDDEN_COLUMNS +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){ + if( sqlite3_strnicmp(pCol->zName, "__hidden__", 10)==0 ){ + pCol->colFlags |= COLFLAG_HIDDEN; + }else if( pTab && pCol!=pTab->aCol && (pCol[-1].colFlags & COLFLAG_HIDDEN) ){ + pTab->tabFlags |= TF_OOOHidden; + } +} +#endif + + +/* +** Add a new column to the table currently being constructed. +** +** The parser calls this routine once for each column declaration +** in a CREATE TABLE statement. sqlite3StartTable() gets called +** first to get things going. Then this routine is called for each +** column. +*/ +SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ + Table *p; + int i; + char *z; + char *zType; + Column *pCol; + sqlite3 *db = pParse->db; + if( (p = pParse->pNewTable)==0 ) return; + if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName); + return; + } + z = sqlite3DbMallocRaw(db, pName->n + pType->n + 2); + if( z==0 ) return; + if( IN_RENAME_OBJECT ) sqlite3RenameTokenMap(pParse, (void*)z, pName); + memcpy(z, pName->z, pName->n); + z[pName->n] = 0; + sqlite3Dequote(z); + for(i=0; inCol; i++){ + if( sqlite3_stricmp(z, p->aCol[i].zName)==0 ){ + sqlite3ErrorMsg(pParse, "duplicate column name: %s", z); + sqlite3DbFree(db, z); + return; + } + } + if( (p->nCol & 0x7)==0 ){ + Column *aNew; + aNew = sqlite3DbRealloc(db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0])); + if( aNew==0 ){ + sqlite3DbFree(db, z); + return; + } + p->aCol = aNew; + } + pCol = &p->aCol[p->nCol]; + memset(pCol, 0, sizeof(p->aCol[0])); + pCol->zName = z; + pCol->hName = sqlite3StrIHash(z); + sqlite3ColumnPropertiesFromName(p, pCol); + + if( pType->n==0 ){ + /* If there is no type specified, columns have the default affinity + ** 'BLOB' with a default size of 4 bytes. */ + pCol->affinity = SQLITE_AFF_BLOB; + pCol->szEst = 1; +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( 4>=sqlite3GlobalConfig.szSorterRef ){ + pCol->colFlags |= COLFLAG_SORTERREF; + } +#endif + }else{ + zType = z + sqlite3Strlen30(z) + 1; + memcpy(zType, pType->z, pType->n); + zType[pType->n] = 0; + sqlite3Dequote(zType); + pCol->affinity = sqlite3AffinityType(zType, pCol); + pCol->colFlags |= COLFLAG_HASTYPE; + } + p->nCol++; + p->nNVCol++; + pParse->constraintName.n = 0; +} + +/* +** This routine is called by the parser while in the middle of +** parsing a CREATE TABLE statement. A "NOT NULL" constraint has +** been seen on a column. This routine sets the notNull flag on +** the column currently under construction. +*/ +SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){ + Table *p; + Column *pCol; + p = pParse->pNewTable; + if( p==0 || NEVER(p->nCol<1) ) return; + pCol = &p->aCol[p->nCol-1]; + pCol->notNull = (u8)onError; + p->tabFlags |= TF_HasNotNull; + + /* Set the uniqNotNull flag on any UNIQUE or PK indexes already created + ** on this column. */ + if( pCol->colFlags & COLFLAG_UNIQUE ){ + Index *pIdx; + for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->nKeyCol==1 && pIdx->onError!=OE_None ); + if( pIdx->aiColumn[0]==p->nCol-1 ){ + pIdx->uniqNotNull = 1; + } + } + } +} + +/* +** Scan the column type name zType (length nType) and return the +** associated affinity type. +** +** This routine does a case-independent search of zType for the +** substrings in the following table. If one of the substrings is +** found, the corresponding affinity is returned. If zType contains +** more than one of the substrings, entries toward the top of +** the table take priority. For example, if zType is 'BLOBINT', +** SQLITE_AFF_INTEGER is returned. +** +** Substring | Affinity +** -------------------------------- +** 'INT' | SQLITE_AFF_INTEGER +** 'CHAR' | SQLITE_AFF_TEXT +** 'CLOB' | SQLITE_AFF_TEXT +** 'TEXT' | SQLITE_AFF_TEXT +** 'BLOB' | SQLITE_AFF_BLOB +** 'REAL' | SQLITE_AFF_REAL +** 'FLOA' | SQLITE_AFF_REAL +** 'DOUB' | SQLITE_AFF_REAL +** +** If none of the substrings in the above table are found, +** SQLITE_AFF_NUMERIC is returned. +*/ +SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, Column *pCol){ + u32 h = 0; + char aff = SQLITE_AFF_NUMERIC; + const char *zChar = 0; + + assert( zIn!=0 ); + while( zIn[0] ){ + h = (h<<8) + sqlite3UpperToLower[(*zIn)&0xff]; + zIn++; + if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){ /* CHAR */ + aff = SQLITE_AFF_TEXT; + zChar = zIn; + }else if( h==(('c'<<24)+('l'<<16)+('o'<<8)+'b') ){ /* CLOB */ + aff = SQLITE_AFF_TEXT; + }else if( h==(('t'<<24)+('e'<<16)+('x'<<8)+'t') ){ /* TEXT */ + aff = SQLITE_AFF_TEXT; + }else if( h==(('b'<<24)+('l'<<16)+('o'<<8)+'b') /* BLOB */ + && (aff==SQLITE_AFF_NUMERIC || aff==SQLITE_AFF_REAL) ){ + aff = SQLITE_AFF_BLOB; + if( zIn[0]=='(' ) zChar = zIn; +#ifndef SQLITE_OMIT_FLOATING_POINT + }else if( h==(('r'<<24)+('e'<<16)+('a'<<8)+'l') /* REAL */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; + }else if( h==(('f'<<24)+('l'<<16)+('o'<<8)+'a') /* FLOA */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; + }else if( h==(('d'<<24)+('o'<<16)+('u'<<8)+'b') /* DOUB */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; +#endif + }else if( (h&0x00FFFFFF)==(('i'<<16)+('n'<<8)+'t') ){ /* INT */ + aff = SQLITE_AFF_INTEGER; + break; + } + } + + /* If pCol is not NULL, store an estimate of the field size. The + ** estimate is scaled so that the size of an integer is 1. */ + if( pCol ){ + int v = 0; /* default size is approx 4 bytes */ + if( aff r=(k/4+1) */ + sqlite3GetInt32(zChar, &v); + break; + } + zChar++; + } + }else{ + v = 16; /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/ + } + } +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( v>=sqlite3GlobalConfig.szSorterRef ){ + pCol->colFlags |= COLFLAG_SORTERREF; + } +#endif + v = v/4 + 1; + if( v>255 ) v = 255; + pCol->szEst = v; + } + return aff; +} + +/* +** The expression is the default value for the most recently added column +** of the table currently under construction. +** +** Default value expressions must be constant. Raise an exception if this +** is not the case. +** +** This routine is called by the parser while in the middle of +** parsing a CREATE TABLE statement. +*/ +SQLITE_PRIVATE void sqlite3AddDefaultValue( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The parsed expression of the default value */ + const char *zStart, /* Start of the default value text */ + const char *zEnd /* First character past end of defaut value text */ +){ + Table *p; + Column *pCol; + sqlite3 *db = pParse->db; + p = pParse->pNewTable; + if( p!=0 ){ + int isInit = db->init.busy && db->init.iDb!=1; + pCol = &(p->aCol[p->nCol-1]); + if( !sqlite3ExprIsConstantOrFunction(pExpr, isInit) ){ + sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant", + pCol->zName); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, "cannot use DEFAULT on a generated column"); +#endif + }else{ + /* A copy of pExpr is used instead of the original, as pExpr contains + ** tokens that point to volatile memory. + */ + Expr x; + sqlite3ExprDelete(db, pCol->pDflt); + memset(&x, 0, sizeof(x)); + x.op = TK_SPAN; + x.u.zToken = sqlite3DbSpanDup(db, zStart, zEnd); + x.pLeft = pExpr; + x.flags = EP_Skip; + pCol->pDflt = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE); + sqlite3DbFree(db, x.u.zToken); + } + } + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, pExpr); + } + sqlite3ExprDelete(db, pExpr); +} + +/* +** Backwards Compatibility Hack: +** +** Historical versions of SQLite accepted strings as column names in +** indexes and PRIMARY KEY constraints and in UNIQUE constraints. Example: +** +** CREATE TABLE xyz(a,b,c,d,e,PRIMARY KEY('a'),UNIQUE('b','c' COLLATE trim) +** CREATE INDEX abc ON xyz('c','d' DESC,'e' COLLATE nocase DESC); +** +** This is goofy. But to preserve backwards compatibility we continue to +** accept it. This routine does the necessary conversion. It converts +** the expression given in its argument from a TK_STRING into a TK_ID +** if the expression is just a TK_STRING with an optional COLLATE clause. +** If the expression is anything other than TK_STRING, the expression is +** unchanged. +*/ +static void sqlite3StringToId(Expr *p){ + if( p->op==TK_STRING ){ + p->op = TK_ID; + }else if( p->op==TK_COLLATE && p->pLeft->op==TK_STRING ){ + p->pLeft->op = TK_ID; + } +} + +/* +** Tag the given column as being part of the PRIMARY KEY +*/ +static void makeColumnPartOfPrimaryKey(Parse *pParse, Column *pCol){ + pCol->colFlags |= COLFLAG_PRIMKEY; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, + "generated columns cannot be part of the PRIMARY KEY"); + } +#endif +} + +/* +** Designate the PRIMARY KEY for the table. pList is a list of names +** of columns that form the primary key. If pList is NULL, then the +** most recently added column of the table is the primary key. +** +** A table can have at most one primary key. If the table already has +** a primary key (and this is the second primary key) then create an +** error. +** +** If the PRIMARY KEY is on a single column whose datatype is INTEGER, +** then we will try to use that column as the rowid. Set the Table.iPKey +** field of the table under construction to be the index of the +** INTEGER PRIMARY KEY column. Table.iPKey is set to -1 if there is +** no INTEGER PRIMARY KEY. +** +** If the key is not an INTEGER PRIMARY KEY, then create a unique +** index for the key. No index is created for INTEGER PRIMARY KEYs. +*/ +SQLITE_PRIVATE void sqlite3AddPrimaryKey( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List of field names to be indexed */ + int onError, /* What to do with a uniqueness conflict */ + int autoInc, /* True if the AUTOINCREMENT keyword is present */ + int sortOrder /* SQLITE_SO_ASC or SQLITE_SO_DESC */ +){ + Table *pTab = pParse->pNewTable; + Column *pCol = 0; + int iCol = -1, i; + int nTerm; + if( pTab==0 ) goto primary_key_exit; + if( pTab->tabFlags & TF_HasPrimaryKey ){ + sqlite3ErrorMsg(pParse, + "table \"%s\" has more than one primary key", pTab->zName); + goto primary_key_exit; + } + pTab->tabFlags |= TF_HasPrimaryKey; + if( pList==0 ){ + iCol = pTab->nCol - 1; + pCol = &pTab->aCol[iCol]; + makeColumnPartOfPrimaryKey(pParse, pCol); + nTerm = 1; + }else{ + nTerm = pList->nExpr; + for(i=0; ia[i].pExpr); + assert( pCExpr!=0 ); + sqlite3StringToId(pCExpr); + if( pCExpr->op==TK_ID ){ + const char *zCName = pCExpr->u.zToken; + for(iCol=0; iColnCol; iCol++){ + if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zName)==0 ){ + pCol = &pTab->aCol[iCol]; + makeColumnPartOfPrimaryKey(pParse, pCol); + break; + } + } + } + } + } + if( nTerm==1 + && pCol + && sqlite3StrICmp(sqlite3ColumnType(pCol,""), "INTEGER")==0 + && sortOrder!=SQLITE_SO_DESC + ){ + if( IN_RENAME_OBJECT && pList ){ + Expr *pCExpr = sqlite3ExprSkipCollate(pList->a[0].pExpr); + sqlite3RenameTokenRemap(pParse, &pTab->iPKey, pCExpr); + } + pTab->iPKey = iCol; + pTab->keyConf = (u8)onError; + assert( autoInc==0 || autoInc==1 ); + pTab->tabFlags |= autoInc*TF_Autoincrement; + if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags; + (void)sqlite3HasExplicitNulls(pParse, pList); + }else if( autoInc ){ +#ifndef SQLITE_OMIT_AUTOINCREMENT + sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " + "INTEGER PRIMARY KEY"); +#endif + }else{ + sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, + 0, sortOrder, 0, SQLITE_IDXTYPE_PRIMARYKEY); + pList = 0; + } + +primary_key_exit: + sqlite3ExprListDelete(pParse->db, pList); + return; +} + +/* +** Add a new CHECK constraint to the table currently under construction. +*/ +SQLITE_PRIVATE void sqlite3AddCheckConstraint( + Parse *pParse, /* Parsing context */ + Expr *pCheckExpr /* The check expression */ +){ +#ifndef SQLITE_OMIT_CHECK + Table *pTab = pParse->pNewTable; + sqlite3 *db = pParse->db; + if( pTab && !IN_DECLARE_VTAB + && !sqlite3BtreeIsReadonly(db->aDb[db->init.iDb].pBt) + ){ + pTab->pCheck = sqlite3ExprListAppend(pParse, pTab->pCheck, pCheckExpr); + if( pParse->constraintName.n ){ + sqlite3ExprListSetName(pParse, pTab->pCheck, &pParse->constraintName, 1); + } + }else +#endif + { + sqlite3ExprDelete(pParse->db, pCheckExpr); + } +} + +/* +** Set the collation function of the most recently parsed table column +** to the CollSeq given. +*/ +SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){ + Table *p; + int i; + char *zColl; /* Dequoted name of collation sequence */ + sqlite3 *db; + + if( (p = pParse->pNewTable)==0 ) return; + i = p->nCol-1; + db = pParse->db; + zColl = sqlite3NameFromToken(db, pToken); + if( !zColl ) return; + + if( sqlite3LocateCollSeq(pParse, zColl) ){ + Index *pIdx; + sqlite3DbFree(db, p->aCol[i].zColl); + p->aCol[i].zColl = zColl; + + /* If the column is declared as " PRIMARY KEY COLLATE ", + ** then an index may have been created on this column before the + ** collation type was added. Correct this if it is the case. + */ + for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->nKeyCol==1 ); + if( pIdx->aiColumn[0]==i ){ + pIdx->azColl[0] = p->aCol[i].zColl; + } + } + }else{ + sqlite3DbFree(db, zColl); + } +} + +/* Change the most recently parsed column to be a GENERATED ALWAYS AS +** column. +*/ +SQLITE_PRIVATE void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + u8 eType = COLFLAG_VIRTUAL; + Table *pTab = pParse->pNewTable; + Column *pCol; + if( pTab==0 ){ + /* generated column in an CREATE TABLE IF NOT EXISTS that already exists */ + goto generated_done; + } + pCol = &(pTab->aCol[pTab->nCol-1]); + if( IN_DECLARE_VTAB ){ + sqlite3ErrorMsg(pParse, "virtual tables cannot use computed columns"); + goto generated_done; + } + if( pCol->pDflt ) goto generated_error; + if( pType ){ + if( pType->n==7 && sqlite3StrNICmp("virtual",pType->z,7)==0 ){ + /* no-op */ + }else if( pType->n==6 && sqlite3StrNICmp("stored",pType->z,6)==0 ){ + eType = COLFLAG_STORED; + }else{ + goto generated_error; + } + } + if( eType==COLFLAG_VIRTUAL ) pTab->nNVCol--; + pCol->colFlags |= eType; + assert( TF_HasVirtual==COLFLAG_VIRTUAL ); + assert( TF_HasStored==COLFLAG_STORED ); + pTab->tabFlags |= eType; + if( pCol->colFlags & COLFLAG_PRIMKEY ){ + makeColumnPartOfPrimaryKey(pParse, pCol); /* For the error message */ + } + pCol->pDflt = pExpr; + pExpr = 0; + goto generated_done; + +generated_error: + sqlite3ErrorMsg(pParse, "error in generated column \"%s\"", + pCol->zName); +generated_done: + sqlite3ExprDelete(pParse->db, pExpr); +#else + /* Throw and error for the GENERATED ALWAYS AS clause if the + ** SQLITE_OMIT_GENERATED_COLUMNS compile-time option is used. */ + sqlite3ErrorMsg(pParse, "generated columns not supported"); + sqlite3ExprDelete(pParse->db, pExpr); +#endif +} + +/* +** Generate code that will increment the schema cookie. +** +** The schema cookie is used to determine when the schema for the +** database changes. After each schema change, the cookie value +** changes. When a process first reads the schema it records the +** cookie. Thereafter, whenever it goes to access the database, +** it checks the cookie to make sure the schema has not changed +** since it was last read. +** +** This plan is not completely bullet-proof. It is possible for +** the schema to change multiple times and for the cookie to be +** set back to prior value. But schema changes are infrequent +** and the probability of hitting the same cookie value is only +** 1 chance in 2^32. So we're safe enough. +** +** IMPLEMENTATION-OF: R-34230-56049 SQLite automatically increments +** the schema-version whenever the schema changes. +*/ +SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){ + sqlite3 *db = pParse->db; + Vdbe *v = pParse->pVdbe; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, + (int)(1+(unsigned)db->aDb[iDb].pSchema->schema_cookie)); +} + +/* +** Measure the number of characters needed to output the given +** identifier. The number returned includes any quotes used +** but does not include the null terminator. +** +** The estimate is conservative. It might be larger that what is +** really needed. +*/ +static int identLength(const char *z){ + int n; + for(n=0; *z; n++, z++){ + if( *z=='"' ){ n++; } + } + return n + 2; +} + +/* +** The first parameter is a pointer to an output buffer. The second +** parameter is a pointer to an integer that contains the offset at +** which to write into the output buffer. This function copies the +** nul-terminated string pointed to by the third parameter, zSignedIdent, +** to the specified offset in the buffer and updates *pIdx to refer +** to the first byte after the last byte written before returning. +** +** If the string zSignedIdent consists entirely of alpha-numeric +** characters, does not begin with a digit and is not an SQL keyword, +** then it is copied to the output buffer exactly as it is. Otherwise, +** it is quoted using double-quotes. +*/ +static void identPut(char *z, int *pIdx, char *zSignedIdent){ + unsigned char *zIdent = (unsigned char*)zSignedIdent; + int i, j, needQuote; + i = *pIdx; + + for(j=0; zIdent[j]; j++){ + if( !sqlite3Isalnum(zIdent[j]) && zIdent[j]!='_' ) break; + } + needQuote = sqlite3Isdigit(zIdent[0]) + || sqlite3KeywordCode(zIdent, j)!=TK_ID + || zIdent[j]!=0 + || j==0; + + if( needQuote ) z[i++] = '"'; + for(j=0; zIdent[j]; j++){ + z[i++] = zIdent[j]; + if( zIdent[j]=='"' ) z[i++] = '"'; + } + if( needQuote ) z[i++] = '"'; + z[i] = 0; + *pIdx = i; +} + +/* +** Generate a CREATE TABLE statement appropriate for the given +** table. Memory to hold the text of the statement is obtained +** from sqliteMalloc() and must be freed by the calling function. +*/ +static char *createTableStmt(sqlite3 *db, Table *p){ + int i, k, n; + char *zStmt; + char *zSep, *zSep2, *zEnd; + Column *pCol; + n = 0; + for(pCol = p->aCol, i=0; inCol; i++, pCol++){ + n += identLength(pCol->zName) + 5; + } + n += identLength(p->zName); + if( n<50 ){ + zSep = ""; + zSep2 = ","; + zEnd = ")"; + }else{ + zSep = "\n "; + zSep2 = ",\n "; + zEnd = "\n)"; + } + n += 35 + 6*p->nCol; + zStmt = sqlite3DbMallocRaw(0, n); + if( zStmt==0 ){ + sqlite3OomFault(db); + return 0; + } + sqlite3_snprintf(n, zStmt, "CREATE TABLE "); + k = sqlite3Strlen30(zStmt); + identPut(zStmt, &k, p->zName); + zStmt[k++] = '('; + for(pCol=p->aCol, i=0; inCol; i++, pCol++){ + static const char * const azType[] = { + /* SQLITE_AFF_BLOB */ "", + /* SQLITE_AFF_TEXT */ " TEXT", + /* SQLITE_AFF_NUMERIC */ " NUM", + /* SQLITE_AFF_INTEGER */ " INT", + /* SQLITE_AFF_REAL */ " REAL" + }; + int len; + const char *zType; + + sqlite3_snprintf(n-k, &zStmt[k], zSep); + k += sqlite3Strlen30(&zStmt[k]); + zSep = zSep2; + identPut(zStmt, &k, pCol->zName); + assert( pCol->affinity-SQLITE_AFF_BLOB >= 0 ); + assert( pCol->affinity-SQLITE_AFF_BLOB < ArraySize(azType) ); + testcase( pCol->affinity==SQLITE_AFF_BLOB ); + testcase( pCol->affinity==SQLITE_AFF_TEXT ); + testcase( pCol->affinity==SQLITE_AFF_NUMERIC ); + testcase( pCol->affinity==SQLITE_AFF_INTEGER ); + testcase( pCol->affinity==SQLITE_AFF_REAL ); + + zType = azType[pCol->affinity - SQLITE_AFF_BLOB]; + len = sqlite3Strlen30(zType); + assert( pCol->affinity==SQLITE_AFF_BLOB + || pCol->affinity==sqlite3AffinityType(zType, 0) ); + memcpy(&zStmt[k], zType, len); + k += len; + assert( k<=n ); + } + sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd); + return zStmt; +} + +/* +** Resize an Index object to hold N columns total. Return SQLITE_OK +** on success and SQLITE_NOMEM on an OOM error. +*/ +static int resizeIndexObject(sqlite3 *db, Index *pIdx, int N){ + char *zExtra; + int nByte; + if( pIdx->nColumn>=N ) return SQLITE_OK; + assert( pIdx->isResized==0 ); + nByte = (sizeof(char*) + sizeof(i16) + 1)*N; + zExtra = sqlite3DbMallocZero(db, nByte); + if( zExtra==0 ) return SQLITE_NOMEM_BKPT; + memcpy(zExtra, pIdx->azColl, sizeof(char*)*pIdx->nColumn); + pIdx->azColl = (const char**)zExtra; + zExtra += sizeof(char*)*N; + memcpy(zExtra, pIdx->aiColumn, sizeof(i16)*pIdx->nColumn); + pIdx->aiColumn = (i16*)zExtra; + zExtra += sizeof(i16)*N; + memcpy(zExtra, pIdx->aSortOrder, pIdx->nColumn); + pIdx->aSortOrder = (u8*)zExtra; + pIdx->nColumn = N; + pIdx->isResized = 1; + return SQLITE_OK; +} + +/* +** Estimate the total row width for a table. +*/ +static void estimateTableWidth(Table *pTab){ + unsigned wTable = 0; + const Column *pTabCol; + int i; + for(i=pTab->nCol, pTabCol=pTab->aCol; i>0; i--, pTabCol++){ + wTable += pTabCol->szEst; + } + if( pTab->iPKey<0 ) wTable++; + pTab->szTabRow = sqlite3LogEst(wTable*4); +} + +/* +** Estimate the average size of a row for an index. +*/ +static void estimateIndexWidth(Index *pIdx){ + unsigned wIndex = 0; + int i; + const Column *aCol = pIdx->pTable->aCol; + for(i=0; inColumn; i++){ + i16 x = pIdx->aiColumn[i]; + assert( xpTable->nCol ); + wIndex += x<0 ? 1 : aCol[pIdx->aiColumn[i]].szEst; + } + pIdx->szIdxRow = sqlite3LogEst(wIndex*4); +} + +/* Return true if column number x is any of the first nCol entries of aiCol[]. +** This is used to determine if the column number x appears in any of the +** first nCol entries of an index. +*/ +static int hasColumn(const i16 *aiCol, int nCol, int x){ + while( nCol-- > 0 ){ + assert( aiCol[0]>=0 ); + if( x==*(aiCol++) ){ + return 1; + } + } + return 0; +} + +/* +** Return true if any of the first nKey entries of index pIdx exactly +** match the iCol-th entry of pPk. pPk is always a WITHOUT ROWID +** PRIMARY KEY index. pIdx is an index on the same table. pIdx may +** or may not be the same index as pPk. +** +** The first nKey entries of pIdx are guaranteed to be ordinary columns, +** not a rowid or expression. +** +** This routine differs from hasColumn() in that both the column and the +** collating sequence must match for this routine, but for hasColumn() only +** the column name must match. +*/ +static int isDupColumn(Index *pIdx, int nKey, Index *pPk, int iCol){ + int i, j; + assert( nKey<=pIdx->nColumn ); + assert( iColnColumn,pPk->nKeyCol) ); + assert( pPk->idxType==SQLITE_IDXTYPE_PRIMARYKEY ); + assert( pPk->pTable->tabFlags & TF_WithoutRowid ); + assert( pPk->pTable==pIdx->pTable ); + testcase( pPk==pIdx ); + j = pPk->aiColumn[iCol]; + assert( j!=XN_ROWID && j!=XN_EXPR ); + for(i=0; iaiColumn[i]>=0 || j>=0 ); + if( pIdx->aiColumn[i]==j + && sqlite3StrICmp(pIdx->azColl[i], pPk->azColl[iCol])==0 + ){ + return 1; + } + } + return 0; +} + +/* Recompute the colNotIdxed field of the Index. +** +** colNotIdxed is a bitmask that has a 0 bit representing each indexed +** columns that are within the first 63 columns of the table. The +** high-order bit of colNotIdxed is always 1. All unindexed columns +** of the table have a 1. +** +** 2019-10-24: For the purpose of this computation, virtual columns are +** not considered to be covered by the index, even if they are in the +** index, because we do not trust the logic in whereIndexExprTrans() to be +** able to find all instances of a reference to the indexed table column +** and convert them into references to the index. Hence we always want +** the actual table at hand in order to recompute the virtual column, if +** necessary. +** +** The colNotIdxed mask is AND-ed with the SrcList.a[].colUsed mask +** to determine if the index is covering index. +*/ +static void recomputeColumnsNotIndexed(Index *pIdx){ + Bitmask m = 0; + int j; + Table *pTab = pIdx->pTable; + for(j=pIdx->nColumn-1; j>=0; j--){ + int x = pIdx->aiColumn[j]; + if( x>=0 && (pTab->aCol[x].colFlags & COLFLAG_VIRTUAL)==0 ){ + testcase( x==BMS-1 ); + testcase( x==BMS-2 ); + if( xcolNotIdxed = ~m; + assert( (pIdx->colNotIdxed>>63)==1 ); +} + +/* +** This routine runs at the end of parsing a CREATE TABLE statement that +** has a WITHOUT ROWID clause. The job of this routine is to convert both +** internal schema data structures and the generated VDBE code so that they +** are appropriate for a WITHOUT ROWID table instead of a rowid table. +** Changes include: +** +** (1) Set all columns of the PRIMARY KEY schema object to be NOT NULL. +** (2) Convert P3 parameter of the OP_CreateBtree from BTREE_INTKEY +** into BTREE_BLOBKEY. +** (3) Bypass the creation of the sqlite_master table entry +** for the PRIMARY KEY as the primary key index is now +** identified by the sqlite_master table entry of the table itself. +** (4) Set the Index.tnum of the PRIMARY KEY Index object in the +** schema to the rootpage from the main table. +** (5) Add all table columns to the PRIMARY KEY Index object +** so that the PRIMARY KEY is a covering index. The surplus +** columns are part of KeyInfo.nAllField and are not used for +** sorting or lookup or uniqueness checks. +** (6) Replace the rowid tail on all automatically generated UNIQUE +** indices with the PRIMARY KEY columns. +** +** For virtual tables, only (1) is performed. +*/ +static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ + Index *pIdx; + Index *pPk; + int nPk; + int nExtra; + int i, j; + sqlite3 *db = pParse->db; + Vdbe *v = pParse->pVdbe; + + /* Mark every PRIMARY KEY column as NOT NULL (except for imposter tables) + */ + if( !db->init.imposterTable ){ + for(i=0; inCol; i++){ + if( (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 ){ + pTab->aCol[i].notNull = OE_Abort; + } + } + pTab->tabFlags |= TF_HasNotNull; + } + + /* Convert the P3 operand of the OP_CreateBtree opcode from BTREE_INTKEY + ** into BTREE_BLOBKEY. + */ + if( pParse->addrCrTab ){ + assert( v ); + sqlite3VdbeChangeP3(v, pParse->addrCrTab, BTREE_BLOBKEY); + } + + /* Locate the PRIMARY KEY index. Or, if this table was originally + ** an INTEGER PRIMARY KEY table, create a new PRIMARY KEY index. + */ + if( pTab->iPKey>=0 ){ + ExprList *pList; + Token ipkToken; + sqlite3TokenInit(&ipkToken, pTab->aCol[pTab->iPKey].zName); + pList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0)); + if( pList==0 ) return; + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); + } + pList->a[0].sortFlags = pParse->iPkSortOrder; + assert( pParse->pNewTable==pTab ); + pTab->iPKey = -1; + sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, + SQLITE_IDXTYPE_PRIMARYKEY); + if( db->mallocFailed || pParse->nErr ) return; + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk->nKeyCol==1 ); + }else{ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + + /* + ** Remove all redundant columns from the PRIMARY KEY. For example, change + ** "PRIMARY KEY(a,b,a,b,c,b,c,d)" into just "PRIMARY KEY(a,b,c,d)". Later + ** code assumes the PRIMARY KEY contains no repeated columns. + */ + for(i=j=1; inKeyCol; i++){ + if( isDupColumn(pPk, j, pPk, i) ){ + pPk->nColumn--; + }else{ + testcase( hasColumn(pPk->aiColumn, j, pPk->aiColumn[i]) ); + pPk->azColl[j] = pPk->azColl[i]; + pPk->aSortOrder[j] = pPk->aSortOrder[i]; + pPk->aiColumn[j++] = pPk->aiColumn[i]; + } + } + pPk->nKeyCol = j; + } + assert( pPk!=0 ); + pPk->isCovering = 1; + if( !db->init.imposterTable ) pPk->uniqNotNull = 1; + nPk = pPk->nColumn = pPk->nKeyCol; + + /* Bypass the creation of the PRIMARY KEY btree and the sqlite_master + ** table entry. This is only required if currently generating VDBE + ** code for a CREATE TABLE (not when parsing one as part of reading + ** a database schema). */ + if( v && pPk->tnum>0 ){ + assert( db->init.busy==0 ); + sqlite3VdbeChangeOpcode(v, pPk->tnum, OP_Goto); + } + + /* The root page of the PRIMARY KEY is the table root page */ + pPk->tnum = pTab->tnum; + + /* Update the in-memory representation of all UNIQUE indices by converting + ** the final rowid column into one or more columns of the PRIMARY KEY. + */ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int n; + if( IsPrimaryKeyIndex(pIdx) ) continue; + for(i=n=0; inKeyCol, pPk, i) ){ + testcase( hasColumn(pIdx->aiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ); + n++; + } + } + if( n==0 ){ + /* This index is a superset of the primary key */ + pIdx->nColumn = pIdx->nKeyCol; + continue; + } + if( resizeIndexObject(db, pIdx, pIdx->nKeyCol+n) ) return; + for(i=0, j=pIdx->nKeyCol; inKeyCol, pPk, i) ){ + testcase( hasColumn(pIdx->aiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ); + pIdx->aiColumn[j] = pPk->aiColumn[i]; + pIdx->azColl[j] = pPk->azColl[i]; + if( pPk->aSortOrder[i] ){ + /* See ticket https://www.sqlite.org/src/info/bba7b69f9849b5bf */ + pIdx->bAscKeyBug = 1; + } + j++; + } + } + assert( pIdx->nColumn>=pIdx->nKeyCol+n ); + assert( pIdx->nColumn>=j ); + } + + /* Add all table columns to the PRIMARY KEY index + */ + nExtra = 0; + for(i=0; inCol; i++){ + if( !hasColumn(pPk->aiColumn, nPk, i) + && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) nExtra++; + } + if( resizeIndexObject(db, pPk, nPk+nExtra) ) return; + for(i=0, j=nPk; inCol; i++){ + if( !hasColumn(pPk->aiColumn, j, i) + && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 + ){ + assert( jnColumn ); + pPk->aiColumn[j] = i; + pPk->azColl[j] = sqlite3StrBINARY; + j++; + } + } + assert( pPk->nColumn==j ); + assert( pTab->nNVCol<=j ); + recomputeColumnsNotIndexed(pPk); +} + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Return true if pTab is a virtual table and zName is a shadow table name +** for that virtual table. +*/ +SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char *zName){ + int nName; /* Length of zName */ + Module *pMod; /* Module for the virtual table */ + + if( !IsVirtual(pTab) ) return 0; + nName = sqlite3Strlen30(pTab->zName); + if( sqlite3_strnicmp(zName, pTab->zName, nName)!=0 ) return 0; + if( zName[nName]!='_' ) return 0; + pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]); + if( pMod==0 ) return 0; + if( pMod->pModule->iVersion<3 ) return 0; + if( pMod->pModule->xShadowName==0 ) return 0; + return pMod->pModule->xShadowName(zName+nName+1); +} +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Return true if zName is a shadow table name in the current database +** connection. +** +** zName is temporarily modified while this routine is running, but is +** restored to its original value prior to this routine returning. +*/ +SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName){ + char *zTail; /* Pointer to the last "_" in zName */ + Table *pTab; /* Table that zName is a shadow of */ + zTail = strrchr(zName, '_'); + if( zTail==0 ) return 0; + *zTail = 0; + pTab = sqlite3FindTable(db, zName, 0); + *zTail = '_'; + if( pTab==0 ) return 0; + if( !IsVirtual(pTab) ) return 0; + return sqlite3IsShadowTableOf(db, pTab, zName); +} +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + + +#ifdef SQLITE_DEBUG +/* +** Mark all nodes of an expression as EP_Immutable, indicating that +** they should not be changed. Expressions attached to a table or +** index definition are tagged this way to help ensure that we do +** not pass them into code generator routines by mistake. +*/ +static int markImmutableExprStep(Walker *pWalker, Expr *pExpr){ + ExprSetVVAProperty(pExpr, EP_Immutable); + return WRC_Continue; +} +static void markExprListImmutable(ExprList *pList){ + if( pList ){ + Walker w; + memset(&w, 0, sizeof(w)); + w.xExprCallback = markImmutableExprStep; + w.xSelectCallback = sqlite3SelectWalkNoop; + w.xSelectCallback2 = 0; + sqlite3WalkExprList(&w, pList); + } +} +#else +#define markExprListImmutable(X) /* no-op */ +#endif /* SQLITE_DEBUG */ + + +/* +** This routine is called to report the final ")" that terminates +** a CREATE TABLE statement. +** +** The table structure that other action routines have been building +** is added to the internal hash tables, assuming no errors have +** occurred. +** +** An entry for the table is made in the master table on disk, unless +** this is a temporary table or db->init.busy==1. When db->init.busy==1 +** it means we are reading the sqlite_master table because we just +** connected to the database or because the sqlite_master table has +** recently changed, so the entry for this table already exists in +** the sqlite_master table. We do not want to create it again. +** +** If the pSelect argument is not NULL, it means that this routine +** was called to create a table generated from a +** "CREATE TABLE ... AS SELECT ..." statement. The column names of +** the new table will match the result set of the SELECT. +*/ +SQLITE_PRIVATE void sqlite3EndTable( + Parse *pParse, /* Parse context */ + Token *pCons, /* The ',' token after the last column defn. */ + Token *pEnd, /* The ')' before options in the CREATE TABLE */ + u8 tabOpts, /* Extra table options. Usually 0. */ + Select *pSelect /* Select from a "CREATE ... AS SELECT" */ +){ + Table *p; /* The new table */ + sqlite3 *db = pParse->db; /* The database connection */ + int iDb; /* Database in which the table lives */ + Index *pIdx; /* An implied index of the table */ + + if( pEnd==0 && pSelect==0 ){ + return; + } + assert( !db->mallocFailed ); + p = pParse->pNewTable; + if( p==0 ) return; + + if( pSelect==0 && sqlite3ShadowTableName(db, p->zName) ){ + p->tabFlags |= TF_Shadow; + } + + /* If the db->init.busy is 1 it means we are reading the SQL off the + ** "sqlite_master" or "sqlite_temp_master" table on the disk. + ** So do not write to the disk again. Extract the root page number + ** for the table from the db->init.newTnum field. (The page number + ** should have been put there by the sqliteOpenCb routine.) + ** + ** If the root page number is 1, that means this is the sqlite_master + ** table itself. So mark it read-only. + */ + if( db->init.busy ){ + if( pSelect ){ + sqlite3ErrorMsg(pParse, ""); + return; + } + p->tnum = db->init.newTnum; + if( p->tnum==1 ) p->tabFlags |= TF_Readonly; + } + + assert( (p->tabFlags & TF_HasPrimaryKey)==0 + || p->iPKey>=0 || sqlite3PrimaryKeyIndex(p)!=0 ); + assert( (p->tabFlags & TF_HasPrimaryKey)!=0 + || (p->iPKey<0 && sqlite3PrimaryKeyIndex(p)==0) ); + + /* Special processing for WITHOUT ROWID Tables */ + if( tabOpts & TF_WithoutRowid ){ + if( (p->tabFlags & TF_Autoincrement) ){ + sqlite3ErrorMsg(pParse, + "AUTOINCREMENT not allowed on WITHOUT ROWID tables"); + return; + } + if( (p->tabFlags & TF_HasPrimaryKey)==0 ){ + sqlite3ErrorMsg(pParse, "PRIMARY KEY missing on table %s", p->zName); + return; + } + p->tabFlags |= TF_WithoutRowid | TF_NoVisibleRowid; + convertToWithoutRowidTable(pParse, p); + } + iDb = sqlite3SchemaToIndex(db, p->pSchema); + +#ifndef SQLITE_OMIT_CHECK + /* Resolve names in all CHECK constraint expressions. + */ + if( p->pCheck ){ + sqlite3ResolveSelfReference(pParse, p, NC_IsCheck, 0, p->pCheck); + if( pParse->nErr ){ + /* If errors are seen, delete the CHECK constraints now, else they might + ** actually be used if PRAGMA writable_schema=ON is set. */ + sqlite3ExprListDelete(db, p->pCheck); + p->pCheck = 0; + }else{ + markExprListImmutable(p->pCheck); + } + } +#endif /* !defined(SQLITE_OMIT_CHECK) */ +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( p->tabFlags & TF_HasGenerated ){ + int ii, nNG = 0; + testcase( p->tabFlags & TF_HasVirtual ); + testcase( p->tabFlags & TF_HasStored ); + for(ii=0; iinCol; ii++){ + u32 colFlags = p->aCol[ii].colFlags; + if( (colFlags & COLFLAG_GENERATED)!=0 ){ + Expr *pX = p->aCol[ii].pDflt; + testcase( colFlags & COLFLAG_VIRTUAL ); + testcase( colFlags & COLFLAG_STORED ); + if( sqlite3ResolveSelfReference(pParse, p, NC_GenCol, pX, 0) ){ + /* If there are errors in resolving the expression, change the + ** expression to a NULL. This prevents code generators that operate + ** on the expression from inserting extra parts into the expression + ** tree that have been allocated from lookaside memory, which is + ** illegal in a schema and will lead to errors or heap corruption + ** when the database connection closes. */ + sqlite3ExprDelete(db, pX); + p->aCol[ii].pDflt = sqlite3ExprAlloc(db, TK_NULL, 0, 0); + } + }else{ + nNG++; + } + } + if( nNG==0 ){ + sqlite3ErrorMsg(pParse, "must have at least one non-generated column"); + return; + } + } +#endif + + /* Estimate the average row size for the table and for all implied indices */ + estimateTableWidth(p); + for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + estimateIndexWidth(pIdx); + } + + /* If not initializing, then create a record for the new table + ** in the SQLITE_MASTER table of the database. + ** + ** If this is a TEMPORARY table, write the entry into the auxiliary + ** file instead of into the main database file. + */ + if( !db->init.busy ){ + int n; + Vdbe *v; + char *zType; /* "view" or "table" */ + char *zType2; /* "VIEW" or "TABLE" */ + char *zStmt; /* Text of the CREATE TABLE or CREATE VIEW statement */ + + v = sqlite3GetVdbe(pParse); + if( NEVER(v==0) ) return; + + sqlite3VdbeAddOp1(v, OP_Close, 0); + + /* + ** Initialize zType for the new view or table. + */ + if( p->pSelect==0 ){ + /* A regular table */ + zType = "table"; + zType2 = "TABLE"; +#ifndef SQLITE_OMIT_VIEW + }else{ + /* A view */ + zType = "view"; + zType2 = "VIEW"; +#endif + } + + /* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT + ** statement to populate the new table. The root-page number for the + ** new table is in register pParse->regRoot. + ** + ** Once the SELECT has been coded by sqlite3Select(), it is in a + ** suitable state to query for the column names and types to be used + ** by the new table. + ** + ** A shared-cache write-lock is not required to write to the new table, + ** as a schema-lock must have already been obtained to create it. Since + ** a schema-lock excludes all other database users, the write-lock would + ** be redundant. + */ + if( pSelect ){ + SelectDest dest; /* Where the SELECT should store results */ + int regYield; /* Register holding co-routine entry-point */ + int addrTop; /* Top of the co-routine */ + int regRec; /* A record to be insert into the new table */ + int regRowid; /* Rowid of the next row to insert */ + int addrInsLoop; /* Top of the loop for inserting rows */ + Table *pSelTab; /* A table that describes the SELECT results */ + + regYield = ++pParse->nMem; + regRec = ++pParse->nMem; + regRowid = ++pParse->nMem; + assert(pParse->nTab==1); + sqlite3MayAbort(pParse); + sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb); + sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG); + pParse->nTab = 2; + addrTop = sqlite3VdbeCurrentAddr(v) + 1; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); + if( pParse->nErr ) return; + pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect, SQLITE_AFF_BLOB); + if( pSelTab==0 ) return; + assert( p->aCol==0 ); + p->nCol = p->nNVCol = pSelTab->nCol; + p->aCol = pSelTab->aCol; + pSelTab->nCol = 0; + pSelTab->aCol = 0; + sqlite3DeleteTable(db, pSelTab); + sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); + sqlite3Select(pParse, pSelect, &dest); + if( pParse->nErr ) return; + sqlite3VdbeEndCoroutine(v, regYield); + sqlite3VdbeJumpHere(v, addrTop - 1); + addrInsLoop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, dest.iSdst, dest.nSdst, regRec); + sqlite3TableAffinity(v, p, 0); + sqlite3VdbeAddOp2(v, OP_NewRowid, 1, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, 1, regRec, regRowid); + sqlite3VdbeGoto(v, addrInsLoop); + sqlite3VdbeJumpHere(v, addrInsLoop); + sqlite3VdbeAddOp1(v, OP_Close, 1); + } + + /* Compute the complete text of the CREATE statement */ + if( pSelect ){ + zStmt = createTableStmt(db, p); + }else{ + Token *pEnd2 = tabOpts ? &pParse->sLastToken : pEnd; + n = (int)(pEnd2->z - pParse->sNameToken.z); + if( pEnd2->z[0]!=';' ) n += pEnd2->n; + zStmt = sqlite3MPrintf(db, + "CREATE %s %.*s", zType2, n, pParse->sNameToken.z + ); + } + + /* A slot for the record has already been allocated in the + ** SQLITE_MASTER table. We just need to update that slot with all + ** the information we've collected. + */ + sqlite3NestedParse(pParse, + "UPDATE %Q.%s " + "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q " + "WHERE rowid=#%d", + db->aDb[iDb].zDbSName, MASTER_NAME, + zType, + p->zName, + p->zName, + pParse->regRoot, + zStmt, + pParse->regRowid + ); + sqlite3DbFree(db, zStmt); + sqlite3ChangeCookie(pParse, iDb); + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* Check to see if we need to create an sqlite_sequence table for + ** keeping track of autoincrement keys. + */ + if( (p->tabFlags & TF_Autoincrement)!=0 ){ + Db *pDb = &db->aDb[iDb]; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( pDb->pSchema->pSeqTab==0 ){ + sqlite3NestedParse(pParse, + "CREATE TABLE %Q.sqlite_sequence(name,seq)", + pDb->zDbSName + ); + } + } +#endif + + /* Reparse everything to update our internal data structures */ + sqlite3VdbeAddParseSchemaOp(v, iDb, + sqlite3MPrintf(db, "tbl_name='%q' AND type!='trigger'", p->zName)); + } + + /* Add the table to the in-memory representation of the database. + */ + if( db->init.busy ){ + Table *pOld; + Schema *pSchema = p->pSchema; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName, p); + if( pOld ){ + assert( p==pOld ); /* Malloc must have failed inside HashInsert() */ + sqlite3OomFault(db); + return; + } + pParse->pNewTable = 0; + db->mDbFlags |= DBFLAG_SchemaChange; + +#ifndef SQLITE_OMIT_ALTERTABLE + if( !p->pSelect ){ + const char *zName = (const char *)pParse->sNameToken.z; + int nName; + assert( !pSelect && pCons && pEnd ); + if( pCons->z==0 ){ + pCons = pEnd; + } + nName = (int)((const char *)pCons->z - zName); + p->addColOffset = 13 + sqlite3Utf8CharLen(zName, nName); + } +#endif + } +} + +#ifndef SQLITE_OMIT_VIEW +/* +** The parser calls this routine in order to create a new VIEW +*/ +SQLITE_PRIVATE void sqlite3CreateView( + Parse *pParse, /* The parsing context */ + Token *pBegin, /* The CREATE token that begins the statement */ + Token *pName1, /* The token that holds the name of the view */ + Token *pName2, /* The token that holds the name of the view */ + ExprList *pCNames, /* Optional list of view column names */ + Select *pSelect, /* A SELECT statement that will become the new view */ + int isTemp, /* TRUE for a TEMPORARY view */ + int noErr /* Suppress error messages if VIEW already exists */ +){ + Table *p; + int n; + const char *z; + Token sEnd; + DbFixer sFix; + Token *pName = 0; + int iDb; + sqlite3 *db = pParse->db; + + if( pParse->nVar>0 ){ + sqlite3ErrorMsg(pParse, "parameters are not allowed in views"); + goto create_view_fail; + } + sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr); + p = pParse->pNewTable; + if( p==0 || pParse->nErr ) goto create_view_fail; + sqlite3TwoPartName(pParse, pName1, pName2, &pName); + iDb = sqlite3SchemaToIndex(db, p->pSchema); + sqlite3FixInit(&sFix, pParse, iDb, "view", pName); + if( sqlite3FixSelect(&sFix, pSelect) ) goto create_view_fail; + + /* Make a copy of the entire SELECT statement that defines the view. + ** This will force all the Expr.token.z values to be dynamically + ** allocated rather than point to the input string - which means that + ** they will persist after the current sqlite3_exec() call returns. + */ + pSelect->selFlags |= SF_View; + if( IN_RENAME_OBJECT ){ + p->pSelect = pSelect; + pSelect = 0; + }else{ + p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); + } + p->pCheck = sqlite3ExprListDup(db, pCNames, EXPRDUP_REDUCE); + if( db->mallocFailed ) goto create_view_fail; + + /* Locate the end of the CREATE VIEW statement. Make sEnd point to + ** the end. + */ + sEnd = pParse->sLastToken; + assert( sEnd.z[0]!=0 || sEnd.n==0 ); + if( sEnd.z[0]!=';' ){ + sEnd.z += sEnd.n; + } + sEnd.n = 0; + n = (int)(sEnd.z - pBegin->z); + assert( n>0 ); + z = pBegin->z; + while( sqlite3Isspace(z[n-1]) ){ n--; } + sEnd.z = &z[n-1]; + sEnd.n = 1; + + /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */ + sqlite3EndTable(pParse, 0, &sEnd, 0, 0); + +create_view_fail: + sqlite3SelectDelete(db, pSelect); + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprlistUnmap(pParse, pCNames); + } + sqlite3ExprListDelete(db, pCNames); + return; +} +#endif /* SQLITE_OMIT_VIEW */ + +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) +/* +** The Table structure pTable is really a VIEW. Fill in the names of +** the columns of the view in the pTable structure. Return the number +** of errors. If an error is seen leave an error message in pParse->zErrMsg. +*/ +SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ + Table *pSelTab; /* A fake table from which we get the result set */ + Select *pSel; /* Copy of the SELECT that implements the view */ + int nErr = 0; /* Number of errors encountered */ + int n; /* Temporarily holds the number of cursors assigned */ + sqlite3 *db = pParse->db; /* Database connection for malloc errors */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + int rc; +#endif +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth; /* Saved xAuth pointer */ +#endif + + assert( pTable ); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + db->nSchemaLock++; + rc = sqlite3VtabCallConnect(pParse, pTable); + db->nSchemaLock--; + if( rc ){ + return 1; + } + if( IsVirtual(pTable) ) return 0; +#endif + +#ifndef SQLITE_OMIT_VIEW + /* A positive nCol means the columns names for this view are + ** already known. + */ + if( pTable->nCol>0 ) return 0; + + /* A negative nCol is a special marker meaning that we are currently + ** trying to compute the column names. If we enter this routine with + ** a negative nCol, it means two or more views form a loop, like this: + ** + ** CREATE VIEW one AS SELECT * FROM two; + ** CREATE VIEW two AS SELECT * FROM one; + ** + ** Actually, the error above is now caught prior to reaching this point. + ** But the following test is still important as it does come up + ** in the following: + ** + ** CREATE TABLE main.ex1(a); + ** CREATE TEMP VIEW ex1 AS SELECT a FROM ex1; + ** SELECT * FROM temp.ex1; + */ + if( pTable->nCol<0 ){ + sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName); + return 1; + } + assert( pTable->nCol>=0 ); + + /* If we get this far, it means we need to compute the table names. + ** Note that the call to sqlite3ResultSetOfSelect() will expand any + ** "*" elements in the results set of the view and will assign cursors + ** to the elements of the FROM clause. But we do not want these changes + ** to be permanent. So the computation is done on a copy of the SELECT + ** statement that defines the view. + */ + assert( pTable->pSelect ); + pSel = sqlite3SelectDup(db, pTable->pSelect, 0); + if( pSel ){ +#ifndef SQLITE_OMIT_ALTERTABLE + u8 eParseMode = pParse->eParseMode; + pParse->eParseMode = PARSE_MODE_NORMAL; +#endif + n = pParse->nTab; + sqlite3SrcListAssignCursors(pParse, pSel->pSrc); + pTable->nCol = -1; + DisableLookaside; +#ifndef SQLITE_OMIT_AUTHORIZATION + xAuth = db->xAuth; + db->xAuth = 0; + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); + db->xAuth = xAuth; +#else + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); +#endif + pParse->nTab = n; + if( pSelTab==0 ){ + pTable->nCol = 0; + nErr++; + }else if( pTable->pCheck ){ + /* CREATE VIEW name(arglist) AS ... + ** The names of the columns in the table are taken from + ** arglist which is stored in pTable->pCheck. The pCheck field + ** normally holds CHECK constraints on an ordinary table, but for + ** a VIEW it holds the list of column names. + */ + sqlite3ColumnsFromExprList(pParse, pTable->pCheck, + &pTable->nCol, &pTable->aCol); + if( db->mallocFailed==0 + && pParse->nErr==0 + && pTable->nCol==pSel->pEList->nExpr + ){ + sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel, + SQLITE_AFF_NONE); + } + }else{ + /* CREATE VIEW name AS... without an argument list. Construct + ** the column names from the SELECT statement that defines the view. + */ + assert( pTable->aCol==0 ); + pTable->nCol = pSelTab->nCol; + pTable->aCol = pSelTab->aCol; + pSelTab->nCol = 0; + pSelTab->aCol = 0; + assert( sqlite3SchemaMutexHeld(db, 0, pTable->pSchema) ); + } + pTable->nNVCol = pTable->nCol; + sqlite3DeleteTable(db, pSelTab); + sqlite3SelectDelete(db, pSel); + EnableLookaside; +#ifndef SQLITE_OMIT_ALTERTABLE + pParse->eParseMode = eParseMode; +#endif + } else { + nErr++; + } + pTable->pSchema->schemaFlags |= DB_UnresetViews; + if( db->mallocFailed ){ + sqlite3DeleteColumnNames(db, pTable); + pTable->aCol = 0; + pTable->nCol = 0; + } +#endif /* SQLITE_OMIT_VIEW */ + return nErr; +} +#endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */ + +#ifndef SQLITE_OMIT_VIEW +/* +** Clear the column names from every VIEW in database idx. +*/ +static void sqliteViewResetAll(sqlite3 *db, int idx){ + HashElem *i; + assert( sqlite3SchemaMutexHeld(db, idx, 0) ); + if( !DbHasProperty(db, idx, DB_UnresetViews) ) return; + for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + if( pTab->pSelect ){ + sqlite3DeleteColumnNames(db, pTab); + pTab->aCol = 0; + pTab->nCol = 0; + } + } + DbClearProperty(db, idx, DB_UnresetViews); +} +#else +# define sqliteViewResetAll(A,B) +#endif /* SQLITE_OMIT_VIEW */ + +/* +** This function is called by the VDBE to adjust the internal schema +** used by SQLite when the btree layer moves a table root page. The +** root-page of a table or index in database iDb has changed from iFrom +** to iTo. +** +** Ticket #1728: The symbol table might still contain information +** on tables and/or indices that are the process of being deleted. +** If you are unlucky, one of those deleted indices or tables might +** have the same rootpage number as the real table or index that is +** being moved. So we cannot stop searching after the first match +** because the first match might be for one of the deleted indices +** or tables and not the table/index that is actually being moved. +** We must continue looping until all tables and indices with +** rootpage==iFrom have been converted to have a rootpage of iTo +** in order to be certain that we got the right one. +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iTo){ + HashElem *pElem; + Hash *pHash; + Db *pDb; + + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pDb = &db->aDb[iDb]; + pHash = &pDb->pSchema->tblHash; + for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ + Table *pTab = sqliteHashData(pElem); + if( pTab->tnum==iFrom ){ + pTab->tnum = iTo; + } + } + pHash = &pDb->pSchema->idxHash; + for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ + Index *pIdx = sqliteHashData(pElem); + if( pIdx->tnum==iFrom ){ + pIdx->tnum = iTo; + } + } +} +#endif + +/* +** Write code to erase the table with root-page iTable from database iDb. +** Also write code to modify the sqlite_master table and internal schema +** if a root-page of another table is moved by the btree-layer whilst +** erasing iTable (this can happen with an auto-vacuum database). +*/ +static void destroyRootPage(Parse *pParse, int iTable, int iDb){ + Vdbe *v = sqlite3GetVdbe(pParse); + int r1 = sqlite3GetTempReg(pParse); + if( iTable<2 ) sqlite3ErrorMsg(pParse, "corrupt schema"); + sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb); + sqlite3MayAbort(pParse); +#ifndef SQLITE_OMIT_AUTOVACUUM + /* OP_Destroy stores an in integer r1. If this integer + ** is non-zero, then it is the root page number of a table moved to + ** location iTable. The following code modifies the sqlite_master table to + ** reflect this. + ** + ** The "#NNN" in the SQL is a special constant that means whatever value + ** is in register NNN. See grammar rules associated with the TK_REGISTER + ** token for additional information. + */ + sqlite3NestedParse(pParse, + "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d", + pParse->db->aDb[iDb].zDbSName, MASTER_NAME, iTable, r1, r1); +#endif + sqlite3ReleaseTempReg(pParse, r1); +} + +/* +** Write VDBE code to erase table pTab and all associated indices on disk. +** Code to update the sqlite_master tables and internal schema definitions +** in case a root-page belonging to another table is moved by the btree layer +** is also added (this can happen with an auto-vacuum database). +*/ +static void destroyTable(Parse *pParse, Table *pTab){ + /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM + ** is not defined), then it is important to call OP_Destroy on the + ** table and index root-pages in order, starting with the numerically + ** largest root-page number. This guarantees that none of the root-pages + ** to be destroyed is relocated by an earlier OP_Destroy. i.e. if the + ** following were coded: + ** + ** OP_Destroy 4 0 + ** ... + ** OP_Destroy 5 0 + ** + ** and root page 5 happened to be the largest root-page number in the + ** database, then root page 5 would be moved to page 4 by the + ** "OP_Destroy 4 0" opcode. The subsequent "OP_Destroy 5 0" would hit + ** a free-list page. + */ + int iTab = pTab->tnum; + int iDestroyed = 0; + + while( 1 ){ + Index *pIdx; + int iLargest = 0; + + if( iDestroyed==0 || iTabpIndex; pIdx; pIdx=pIdx->pNext){ + int iIdx = pIdx->tnum; + assert( pIdx->pSchema==pTab->pSchema ); + if( (iDestroyed==0 || (iIdxiLargest ){ + iLargest = iIdx; + } + } + if( iLargest==0 ){ + return; + }else{ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + assert( iDb>=0 && iDbdb->nDb ); + destroyRootPage(pParse, iLargest, iDb); + iDestroyed = iLargest; + } + } +} + +/* +** Remove entries from the sqlite_statN tables (for N in (1,2,3)) +** after a DROP INDEX or DROP TABLE command. +*/ +static void sqlite3ClearStatTables( + Parse *pParse, /* The parsing context */ + int iDb, /* The database number */ + const char *zType, /* "idx" or "tbl" */ + const char *zName /* Name of index or table */ +){ + int i; + const char *zDbName = pParse->db->aDb[iDb].zDbSName; + for(i=1; i<=4; i++){ + char zTab[24]; + sqlite3_snprintf(sizeof(zTab),zTab,"sqlite_stat%d",i); + if( sqlite3FindTable(pParse->db, zTab, zDbName) ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE %s=%Q", + zDbName, zTab, zType, zName + ); + } + } +} + +/* +** Generate code to drop a table. +*/ +SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){ + Vdbe *v; + sqlite3 *db = pParse->db; + Trigger *pTrigger; + Db *pDb = &db->aDb[iDb]; + + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + sqlite3BeginWriteOperation(pParse, 1, iDb); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp0(v, OP_VBegin); + } +#endif + + /* Drop all triggers associated with the table being dropped. Code + ** is generated to remove entries from sqlite_master and/or + ** sqlite_temp_master if required. + */ + pTrigger = sqlite3TriggerList(pParse, pTab); + while( pTrigger ){ + assert( pTrigger->pSchema==pTab->pSchema || + pTrigger->pSchema==db->aDb[1].pSchema ); + sqlite3DropTriggerPtr(pParse, pTrigger); + pTrigger = pTrigger->pNext; + } + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* Remove any entries of the sqlite_sequence table associated with + ** the table being dropped. This is done before the table is dropped + ** at the btree level, in case the sqlite_sequence table needs to + ** move as a result of the drop (can happen in auto-vacuum mode). + */ + if( pTab->tabFlags & TF_Autoincrement ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.sqlite_sequence WHERE name=%Q", + pDb->zDbSName, pTab->zName + ); + } +#endif + + /* Drop all SQLITE_MASTER table and index entries that refer to the + ** table. The program name loops through the master table and deletes + ** every row that refers to a table of the same name as the one being + ** dropped. Triggers are handled separately because a trigger can be + ** created in the temp database that refers to a table in another + ** database. + */ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'", + pDb->zDbSName, MASTER_NAME, pTab->zName); + if( !isView && !IsVirtual(pTab) ){ + destroyTable(pParse, pTab); + } + + /* Remove the table entry from SQLite's internal schema and modify + ** the schema cookie. + */ + if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0); + sqlite3MayAbort(pParse); + } + sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0); + sqlite3ChangeCookie(pParse, iDb); + sqliteViewResetAll(db, iDb); +} + +/* +** Return TRUE if shadow tables should be read-only in the current +** context. +*/ +SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db){ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (db->flags & SQLITE_Defensive)!=0 + && db->pVtabCtx==0 + && db->nVdbeExec==0 + ){ + return 1; + } +#endif + return 0; +} + +/* +** Return true if it is not allowed to drop the given table +*/ +static int tableMayNotBeDropped(sqlite3 *db, Table *pTab){ + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){ + if( sqlite3StrNICmp(pTab->zName+7, "stat", 4)==0 ) return 0; + if( sqlite3StrNICmp(pTab->zName+7, "parameters", 10)==0 ) return 0; + return 1; + } + if( (pTab->tabFlags & TF_Shadow)!=0 && sqlite3ReadOnlyShadowTables(db) ){ + return 1; + } + return 0; +} + +/* +** This routine is called to do the work of a DROP TABLE statement. +** pName is the name of the table to be dropped. +*/ +SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){ + Table *pTab; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + if( db->mallocFailed ){ + goto exit_drop_table; + } + assert( pParse->nErr==0 ); + assert( pName->nSrc==1 ); + if( sqlite3ReadSchema(pParse) ) goto exit_drop_table; + if( noErr ) db->suppressErr++; + assert( isView==0 || isView==LOCATE_VIEW ); + pTab = sqlite3LocateTableItem(pParse, isView, &pName->a[0]); + if( noErr ) db->suppressErr--; + + if( pTab==0 ){ + if( noErr ) sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase); + goto exit_drop_table; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 && iDbnDb ); + + /* If pTab is a virtual table, call ViewGetColumnNames() to ensure + ** it is initialized. + */ + if( IsVirtual(pTab) && sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto exit_drop_table; + } +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code; + const char *zTab = SCHEMA_TABLE(iDb); + const char *zDb = db->aDb[iDb].zDbSName; + const char *zArg2 = 0; + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){ + goto exit_drop_table; + } + if( isView ){ + if( !OMIT_TEMPDB && iDb==1 ){ + code = SQLITE_DROP_TEMP_VIEW; + }else{ + code = SQLITE_DROP_VIEW; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + }else if( IsVirtual(pTab) ){ + code = SQLITE_DROP_VTABLE; + zArg2 = sqlite3GetVTable(db, pTab)->pMod->zName; +#endif + }else{ + if( !OMIT_TEMPDB && iDb==1 ){ + code = SQLITE_DROP_TEMP_TABLE; + }else{ + code = SQLITE_DROP_TABLE; + } + } + if( sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb) ){ + goto exit_drop_table; + } + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){ + goto exit_drop_table; + } + } +#endif + if( tableMayNotBeDropped(db, pTab) ){ + sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName); + goto exit_drop_table; + } + +#ifndef SQLITE_OMIT_VIEW + /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used + ** on a table. + */ + if( isView && pTab->pSelect==0 ){ + sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName); + goto exit_drop_table; + } + if( !isView && pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName); + goto exit_drop_table; + } +#endif + + /* Generate code to remove the table from the master table + ** on disk. + */ + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3BeginWriteOperation(pParse, 1, iDb); + if( !isView ){ + sqlite3ClearStatTables(pParse, iDb, "tbl", pTab->zName); + sqlite3FkDropTable(pParse, pName, pTab); + } + sqlite3CodeDropTable(pParse, pTab, iDb, isView); + } + +exit_drop_table: + sqlite3SrcListDelete(db, pName); +} + +/* +** This routine is called to create a new foreign key on the table +** currently under construction. pFromCol determines which columns +** in the current table point to the foreign key. If pFromCol==0 then +** connect the key to the last column inserted. pTo is the name of +** the table referred to (a.k.a the "parent" table). pToCol is a list +** of tables in the parent pTo table. flags contains all +** information about the conflict resolution algorithms specified +** in the ON DELETE, ON UPDATE and ON INSERT clauses. +** +** An FKey structure is created and added to the table currently +** under construction in the pParse->pNewTable field. +** +** The foreign key is set for IMMEDIATE processing. A subsequent call +** to sqlite3DeferForeignKey() might change this to DEFERRED. +*/ +SQLITE_PRIVATE void sqlite3CreateForeignKey( + Parse *pParse, /* Parsing context */ + ExprList *pFromCol, /* Columns in this table that point to other table */ + Token *pTo, /* Name of the other table */ + ExprList *pToCol, /* Columns in the other table */ + int flags /* Conflict resolution algorithms. */ +){ + sqlite3 *db = pParse->db; +#ifndef SQLITE_OMIT_FOREIGN_KEY + FKey *pFKey = 0; + FKey *pNextTo; + Table *p = pParse->pNewTable; + int nByte; + int i; + int nCol; + char *z; + + assert( pTo!=0 ); + if( p==0 || IN_DECLARE_VTAB ) goto fk_end; + if( pFromCol==0 ){ + int iCol = p->nCol-1; + if( NEVER(iCol<0) ) goto fk_end; + if( pToCol && pToCol->nExpr!=1 ){ + sqlite3ErrorMsg(pParse, "foreign key on %s" + " should reference only one column of table %T", + p->aCol[iCol].zName, pTo); + goto fk_end; + } + nCol = 1; + }else if( pToCol && pToCol->nExpr!=pFromCol->nExpr ){ + sqlite3ErrorMsg(pParse, + "number of columns in foreign key does not match the number of " + "columns in the referenced table"); + goto fk_end; + }else{ + nCol = pFromCol->nExpr; + } + nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1; + if( pToCol ){ + for(i=0; inExpr; i++){ + nByte += sqlite3Strlen30(pToCol->a[i].zEName) + 1; + } + } + pFKey = sqlite3DbMallocZero(db, nByte ); + if( pFKey==0 ){ + goto fk_end; + } + pFKey->pFrom = p; + pFKey->pNextFrom = p->pFKey; + z = (char*)&pFKey->aCol[nCol]; + pFKey->zTo = z; + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenMap(pParse, (void*)z, pTo); + } + memcpy(z, pTo->z, pTo->n); + z[pTo->n] = 0; + sqlite3Dequote(z); + z += pTo->n+1; + pFKey->nCol = nCol; + if( pFromCol==0 ){ + pFKey->aCol[0].iFrom = p->nCol-1; + }else{ + for(i=0; inCol; j++){ + if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zEName)==0 ){ + pFKey->aCol[i].iFrom = j; + break; + } + } + if( j>=p->nCol ){ + sqlite3ErrorMsg(pParse, + "unknown column \"%s\" in foreign key definition", + pFromCol->a[i].zEName); + goto fk_end; + } + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, &pFKey->aCol[i], pFromCol->a[i].zEName); + } + } + } + if( pToCol ){ + for(i=0; ia[i].zEName); + pFKey->aCol[i].zCol = z; + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, z, pToCol->a[i].zEName); + } + memcpy(z, pToCol->a[i].zEName, n); + z[n] = 0; + z += n+1; + } + } + pFKey->isDeferred = 0; + pFKey->aAction[0] = (u8)(flags & 0xff); /* ON DELETE action */ + pFKey->aAction[1] = (u8)((flags >> 8 ) & 0xff); /* ON UPDATE action */ + + assert( sqlite3SchemaMutexHeld(db, 0, p->pSchema) ); + pNextTo = (FKey *)sqlite3HashInsert(&p->pSchema->fkeyHash, + pFKey->zTo, (void *)pFKey + ); + if( pNextTo==pFKey ){ + sqlite3OomFault(db); + goto fk_end; + } + if( pNextTo ){ + assert( pNextTo->pPrevTo==0 ); + pFKey->pNextTo = pNextTo; + pNextTo->pPrevTo = pFKey; + } + + /* Link the foreign key to the table as the last step. + */ + p->pFKey = pFKey; + pFKey = 0; + +fk_end: + sqlite3DbFree(db, pFKey); +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + sqlite3ExprListDelete(db, pFromCol); + sqlite3ExprListDelete(db, pToCol); +} + +/* +** This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED +** clause is seen as part of a foreign key definition. The isDeferred +** parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE. +** The behavior of the most recently created foreign key is adjusted +** accordingly. +*/ +SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){ +#ifndef SQLITE_OMIT_FOREIGN_KEY + Table *pTab; + FKey *pFKey; + if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return; + assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */ + pFKey->isDeferred = (u8)isDeferred; +#endif +} + +/* +** Generate code that will erase and refill index *pIdx. This is +** used to initialize a newly created index or to recompute the +** content of an index in response to a REINDEX command. +** +** if memRootPage is not negative, it means that the index is newly +** created. The register specified by memRootPage contains the +** root page number of the index. If memRootPage is negative, then +** the index already exists and must be cleared before being refilled and +** the root page number of the index is taken from pIndex->tnum. +*/ +static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ + Table *pTab = pIndex->pTable; /* The table that is indexed */ + int iTab = pParse->nTab++; /* Btree cursor used for pTab */ + int iIdx = pParse->nTab++; /* Btree cursor used for pIndex */ + int iSorter; /* Cursor opened by OpenSorter (if in use) */ + int addr1; /* Address of top of loop */ + int addr2; /* Address to jump to for next iteration */ + int tnum; /* Root page of index */ + int iPartIdxLabel; /* Jump to this label to skip a row */ + Vdbe *v; /* Generate code into this virtual machine */ + KeyInfo *pKey; /* KeyInfo for index */ + int regRecord; /* Register holding assembled index record */ + sqlite3 *db = pParse->db; /* The database connection */ + int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); + +#ifndef SQLITE_OMIT_AUTHORIZATION + if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0, + db->aDb[iDb].zDbSName ) ){ + return; + } +#endif + + /* Require a write-lock on the table to perform this operation */ + sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName); + + v = sqlite3GetVdbe(pParse); + if( v==0 ) return; + if( memRootPage>=0 ){ + tnum = memRootPage; + }else{ + tnum = pIndex->tnum; + } + pKey = sqlite3KeyInfoOfIndex(pParse, pIndex); + assert( pKey!=0 || db->mallocFailed || pParse->nErr ); + + /* Open the sorter cursor if we are to use one. */ + iSorter = pParse->nTab++; + sqlite3VdbeAddOp4(v, OP_SorterOpen, iSorter, 0, pIndex->nKeyCol, (char*) + sqlite3KeyInfoRef(pKey), P4_KEYINFO); + + /* Open the table. Loop through all rows of the table, inserting index + ** records into the sorter. */ + sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); VdbeCoverage(v); + regRecord = sqlite3GetTempReg(pParse); + sqlite3MultiWrite(pParse); + + sqlite3GenerateIndexKey(pParse,pIndex,iTab,regRecord,0,&iPartIdxLabel,0,0); + sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord); + sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + if( memRootPage<0 ) sqlite3VdbeAddOp2(v, OP_Clear, tnum, iDb); + sqlite3VdbeAddOp4(v, OP_OpenWrite, iIdx, tnum, iDb, + (char *)pKey, P4_KEYINFO); + sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR|((memRootPage>=0)?OPFLAG_P2ISREG:0)); + + addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0); VdbeCoverage(v); + if( IsUniqueIndex(pIndex) ){ + int j2 = sqlite3VdbeGoto(v, 1); + addr2 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeVerifyAbortable(v, OE_Abort); + sqlite3VdbeAddOp4Int(v, OP_SorterCompare, iSorter, j2, regRecord, + pIndex->nKeyCol); VdbeCoverage(v); + sqlite3UniqueConstraint(pParse, OE_Abort, pIndex); + sqlite3VdbeJumpHere(v, j2); + }else{ + /* Most CREATE INDEX and REINDEX statements that are not UNIQUE can not + ** abort. The exception is if one of the indexed expressions contains a + ** user function that throws an exception when it is evaluated. But the + ** overhead of adding a statement journal to a CREATE INDEX statement is + ** very small (since most of the pages written do not contain content that + ** needs to be restored if the statement aborts), so we call + ** sqlite3MayAbort() for all CREATE INDEX statements. */ + sqlite3MayAbort(pParse); + addr2 = sqlite3VdbeCurrentAddr(v); + } + sqlite3VdbeAddOp3(v, OP_SorterData, iSorter, regRecord, iIdx); + if( !pIndex->bAscKeyBug ){ + /* This OP_SeekEnd opcode makes index insert for a REINDEX go much + ** faster by avoiding unnecessary seeks. But the optimization does + ** not work for UNIQUE constraint indexes on WITHOUT ROWID tables + ** with DESC primary keys, since those indexes have there keys in + ** a different order from the main table. + ** See ticket: https://www.sqlite.org/src/info/bba7b69f9849b5bf + */ + sqlite3VdbeAddOp1(v, OP_SeekEnd, iIdx); + } + sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdx, regRecord); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + sqlite3ReleaseTempReg(pParse, regRecord); + sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + + sqlite3VdbeAddOp1(v, OP_Close, iTab); + sqlite3VdbeAddOp1(v, OP_Close, iIdx); + sqlite3VdbeAddOp1(v, OP_Close, iSorter); +} + +/* +** Allocate heap space to hold an Index object with nCol columns. +** +** Increase the allocation size to provide an extra nExtra bytes +** of 8-byte aligned space after the Index object and return a +** pointer to this extra space in *ppExtra. +*/ +SQLITE_PRIVATE Index *sqlite3AllocateIndexObject( + sqlite3 *db, /* Database connection */ + i16 nCol, /* Total number of columns in the index */ + int nExtra, /* Number of bytes of extra space to alloc */ + char **ppExtra /* Pointer to the "extra" space */ +){ + Index *p; /* Allocated index object */ + int nByte; /* Bytes of space for Index object + arrays */ + + nByte = ROUND8(sizeof(Index)) + /* Index structure */ + ROUND8(sizeof(char*)*nCol) + /* Index.azColl */ + ROUND8(sizeof(LogEst)*(nCol+1) + /* Index.aiRowLogEst */ + sizeof(i16)*nCol + /* Index.aiColumn */ + sizeof(u8)*nCol); /* Index.aSortOrder */ + p = sqlite3DbMallocZero(db, nByte + nExtra); + if( p ){ + char *pExtra = ((char*)p)+ROUND8(sizeof(Index)); + p->azColl = (const char**)pExtra; pExtra += ROUND8(sizeof(char*)*nCol); + p->aiRowLogEst = (LogEst*)pExtra; pExtra += sizeof(LogEst)*(nCol+1); + p->aiColumn = (i16*)pExtra; pExtra += sizeof(i16)*nCol; + p->aSortOrder = (u8*)pExtra; + p->nColumn = nCol; + p->nKeyCol = nCol - 1; + *ppExtra = ((char*)p) + nByte; + } + return p; +} + +/* +** If expression list pList contains an expression that was parsed with +** an explicit "NULLS FIRST" or "NULLS LAST" clause, leave an error in +** pParse and return non-zero. Otherwise, return zero. +*/ +SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ + if( pList ){ + int i; + for(i=0; inExpr; i++){ + if( pList->a[i].bNulls ){ + u8 sf = pList->a[i].sortFlags; + sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", + (sf==0 || sf==3) ? "FIRST" : "LAST" + ); + return 1; + } + } + } + return 0; +} + +/* +** Create a new index for an SQL table. pName1.pName2 is the name of the index +** and pTblList is the name of the table that is to be indexed. Both will +** be NULL for a primary key or an index that is created to satisfy a +** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable +** as the table to be indexed. pParse->pNewTable is a table that is +** currently being constructed by a CREATE TABLE statement. +** +** pList is a list of columns to be indexed. pList will be NULL if this +** is a primary key or unique-constraint on the most recent column added +** to the table currently under construction. +*/ +SQLITE_PRIVATE void sqlite3CreateIndex( + Parse *pParse, /* All information about this parse */ + Token *pName1, /* First part of index name. May be NULL */ + Token *pName2, /* Second part of index name. May be NULL */ + SrcList *pTblName, /* Table to index. Use pParse->pNewTable if 0 */ + ExprList *pList, /* A list of columns to be indexed */ + int onError, /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + Token *pStart, /* The CREATE token that begins this statement */ + Expr *pPIWhere, /* WHERE clause for partial indices */ + int sortOrder, /* Sort order of primary key when pList==NULL */ + int ifNotExist, /* Omit error if index already exists */ + u8 idxType /* The index type */ +){ + Table *pTab = 0; /* Table to be indexed */ + Index *pIndex = 0; /* The index to be created */ + char *zName = 0; /* Name of the index */ + int nName; /* Number of characters in zName */ + int i, j; + DbFixer sFix; /* For assigning database names to pTable */ + int sortOrderMask; /* 1 to honor DESC in index. 0 to ignore. */ + sqlite3 *db = pParse->db; + Db *pDb; /* The specific table containing the indexed database */ + int iDb; /* Index of the database that is being written */ + Token *pName = 0; /* Unqualified name of the index to create */ + struct ExprList_item *pListItem; /* For looping over pList */ + int nExtra = 0; /* Space allocated for zExtra[] */ + int nExtraCol; /* Number of extra columns needed */ + char *zExtra = 0; /* Extra space after the Index object */ + Index *pPk = 0; /* PRIMARY KEY index for WITHOUT ROWID tables */ + + if( db->mallocFailed || pParse->nErr>0 ){ + goto exit_create_index; + } + if( IN_DECLARE_VTAB && idxType!=SQLITE_IDXTYPE_PRIMARYKEY ){ + goto exit_create_index; + } + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto exit_create_index; + } + if( sqlite3HasExplicitNulls(pParse, pList) ){ + goto exit_create_index; + } + + /* + ** Find the table that is to be indexed. Return early if not found. + */ + if( pTblName!=0 ){ + + /* Use the two-part index name to determine the database + ** to search for the table. 'Fix' the table name to this db + ** before looking up the table. + */ + assert( pName1 && pName2 ); + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ) goto exit_create_index; + assert( pName && pName->z ); + +#ifndef SQLITE_OMIT_TEMPDB + /* If the index name was unqualified, check if the table + ** is a temp table. If so, set the database to 1. Do not do this + ** if initialising a database schema. + */ + if( !db->init.busy ){ + pTab = sqlite3SrcListLookup(pParse, pTblName); + if( pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){ + iDb = 1; + } + } +#endif + + sqlite3FixInit(&sFix, pParse, iDb, "index", pName); + if( sqlite3FixSrcList(&sFix, pTblName) ){ + /* Because the parser constructs pTblName from a single identifier, + ** sqlite3FixSrcList can never fail. */ + assert(0); + } + pTab = sqlite3LocateTableItem(pParse, 0, &pTblName->a[0]); + assert( db->mallocFailed==0 || pTab==0 ); + if( pTab==0 ) goto exit_create_index; + if( iDb==1 && db->aDb[iDb].pSchema!=pTab->pSchema ){ + sqlite3ErrorMsg(pParse, + "cannot create a TEMP index on non-TEMP table \"%s\"", + pTab->zName); + goto exit_create_index; + } + if( !HasRowid(pTab) ) pPk = sqlite3PrimaryKeyIndex(pTab); + }else{ + assert( pName==0 ); + assert( pStart==0 ); + pTab = pParse->pNewTable; + if( !pTab ) goto exit_create_index; + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + } + pDb = &db->aDb[iDb]; + + assert( pTab!=0 ); + assert( pParse->nErr==0 ); + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 + && db->init.busy==0 + && pTblName!=0 +#if SQLITE_USER_AUTHENTICATION + && sqlite3UserAuthTable(pTab->zName)==0 +#endif +#ifdef SQLITE_ALLOW_SQLITE_MASTER_INDEX + && sqlite3StrICmp(&pTab->zName[7],"master")!=0 +#endif + ){ + sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName); + goto exit_create_index; + } +#ifndef SQLITE_OMIT_VIEW + if( pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "views may not be indexed"); + goto exit_create_index; + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "virtual tables may not be indexed"); + goto exit_create_index; + } +#endif + + /* + ** Find the name of the index. Make sure there is not already another + ** index or table with the same name. + ** + ** Exception: If we are reading the names of permanent indices from the + ** sqlite_master table (because some other process changed the schema) and + ** one of the index names collides with the name of a temporary table or + ** index, then we will continue to process this index. + ** + ** If pName==0 it means that we are + ** dealing with a primary key or UNIQUE constraint. We have to invent our + ** own name. + */ + if( pName ){ + zName = sqlite3NameFromToken(db, pName); + if( zName==0 ) goto exit_create_index; + assert( pName->z!=0 ); + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName,"index",pTab->zName) ){ + goto exit_create_index; + } + if( !IN_RENAME_OBJECT ){ + if( !db->init.busy ){ + if( sqlite3FindTable(db, zName, 0)!=0 ){ + sqlite3ErrorMsg(pParse, "there is already a table named %s", zName); + goto exit_create_index; + } + } + if( sqlite3FindIndex(db, zName, pDb->zDbSName)!=0 ){ + if( !ifNotExist ){ + sqlite3ErrorMsg(pParse, "index %s already exists", zName); + }else{ + assert( !db->init.busy ); + sqlite3CodeVerifySchema(pParse, iDb); + } + goto exit_create_index; + } + } + }else{ + int n; + Index *pLoop; + for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){} + zName = sqlite3MPrintf(db, "sqlite_autoindex_%s_%d", pTab->zName, n); + if( zName==0 ){ + goto exit_create_index; + } + + /* Automatic index names generated from within sqlite3_declare_vtab() + ** must have names that are distinct from normal automatic index names. + ** The following statement converts "sqlite3_autoindex..." into + ** "sqlite3_butoindex..." in order to make the names distinct. + ** The "vtab_err.test" test demonstrates the need of this statement. */ + if( IN_SPECIAL_PARSE ) zName[7]++; + } + + /* Check for authorization to create an index. + */ +#ifndef SQLITE_OMIT_AUTHORIZATION + if( !IN_RENAME_OBJECT ){ + const char *zDb = pDb->zDbSName; + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){ + goto exit_create_index; + } + i = SQLITE_CREATE_INDEX; + if( !OMIT_TEMPDB && iDb==1 ) i = SQLITE_CREATE_TEMP_INDEX; + if( sqlite3AuthCheck(pParse, i, zName, pTab->zName, zDb) ){ + goto exit_create_index; + } + } +#endif + + /* If pList==0, it means this routine was called to make a primary + ** key out of the last column added to the table under construction. + ** So create a fake list to simulate this. + */ + if( pList==0 ){ + Token prevCol; + Column *pCol = &pTab->aCol[pTab->nCol-1]; + pCol->colFlags |= COLFLAG_UNIQUE; + sqlite3TokenInit(&prevCol, pCol->zName); + pList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(db, TK_ID, &prevCol, 0)); + if( pList==0 ) goto exit_create_index; + assert( pList->nExpr==1 ); + sqlite3ExprListSetSortOrder(pList, sortOrder, SQLITE_SO_UNDEFINED); + }else{ + sqlite3ExprListCheckLength(pParse, pList, "index"); + if( pParse->nErr ) goto exit_create_index; + } + + /* Figure out how many bytes of space are required to store explicitly + ** specified collation sequence names. + */ + for(i=0; inExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + assert( pExpr!=0 ); + if( pExpr->op==TK_COLLATE ){ + nExtra += (1 + sqlite3Strlen30(pExpr->u.zToken)); + } + } + + /* + ** Allocate the index structure. + */ + nName = sqlite3Strlen30(zName); + nExtraCol = pPk ? pPk->nKeyCol : 1; + assert( pList->nExpr + nExtraCol <= 32767 /* Fits in i16 */ ); + pIndex = sqlite3AllocateIndexObject(db, pList->nExpr + nExtraCol, + nName + nExtra + 1, &zExtra); + if( db->mallocFailed ){ + goto exit_create_index; + } + assert( EIGHT_BYTE_ALIGNMENT(pIndex->aiRowLogEst) ); + assert( EIGHT_BYTE_ALIGNMENT(pIndex->azColl) ); + pIndex->zName = zExtra; + zExtra += nName + 1; + memcpy(pIndex->zName, zName, nName+1); + pIndex->pTable = pTab; + pIndex->onError = (u8)onError; + pIndex->uniqNotNull = onError!=OE_None; + pIndex->idxType = idxType; + pIndex->pSchema = db->aDb[iDb].pSchema; + pIndex->nKeyCol = pList->nExpr; + if( pPIWhere ){ + sqlite3ResolveSelfReference(pParse, pTab, NC_PartIdx, pPIWhere, 0); + pIndex->pPartIdxWhere = pPIWhere; + pPIWhere = 0; + } + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + + /* Check to see if we should honor DESC requests on index columns + */ + if( pDb->pSchema->file_format>=4 ){ + sortOrderMask = -1; /* Honor DESC */ + }else{ + sortOrderMask = 0; /* Ignore DESC */ + } + + /* Analyze the list of expressions that form the terms of the index and + ** report any errors. In the common case where the expression is exactly + ** a table column, store that column in aiColumn[]. For general expressions, + ** populate pIndex->aColExpr and store XN_EXPR (-2) in aiColumn[]. + ** + ** TODO: Issue a warning if two or more columns of the index are identical. + ** TODO: Issue a warning if the table primary key is used as part of the + ** index key. + */ + pListItem = pList->a; + if( IN_RENAME_OBJECT ){ + pIndex->aColExpr = pList; + pList = 0; + } + for(i=0; inKeyCol; i++, pListItem++){ + Expr *pCExpr; /* The i-th index expression */ + int requestedSortOrder; /* ASC or DESC on the i-th expression */ + const char *zColl; /* Collation sequence name */ + + sqlite3StringToId(pListItem->pExpr); + sqlite3ResolveSelfReference(pParse, pTab, NC_IdxExpr, pListItem->pExpr, 0); + if( pParse->nErr ) goto exit_create_index; + pCExpr = sqlite3ExprSkipCollate(pListItem->pExpr); + if( pCExpr->op!=TK_COLUMN ){ + if( pTab==pParse->pNewTable ){ + sqlite3ErrorMsg(pParse, "expressions prohibited in PRIMARY KEY and " + "UNIQUE constraints"); + goto exit_create_index; + } + if( pIndex->aColExpr==0 ){ + pIndex->aColExpr = pList; + pList = 0; + } + j = XN_EXPR; + pIndex->aiColumn[i] = XN_EXPR; + pIndex->uniqNotNull = 0; + }else{ + j = pCExpr->iColumn; + assert( j<=0x7fff ); + if( j<0 ){ + j = pTab->iPKey; + }else{ + if( pTab->aCol[j].notNull==0 ){ + pIndex->uniqNotNull = 0; + } + if( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ){ + pIndex->bHasVCol = 1; + } + } + pIndex->aiColumn[i] = (i16)j; + } + zColl = 0; + if( pListItem->pExpr->op==TK_COLLATE ){ + int nColl; + zColl = pListItem->pExpr->u.zToken; + nColl = sqlite3Strlen30(zColl) + 1; + assert( nExtra>=nColl ); + memcpy(zExtra, zColl, nColl); + zColl = zExtra; + zExtra += nColl; + nExtra -= nColl; + }else if( j>=0 ){ + zColl = pTab->aCol[j].zColl; + } + if( !zColl ) zColl = sqlite3StrBINARY; + if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ + goto exit_create_index; + } + pIndex->azColl[i] = zColl; + requestedSortOrder = pListItem->sortFlags & sortOrderMask; + pIndex->aSortOrder[i] = (u8)requestedSortOrder; + } + + /* Append the table key to the end of the index. For WITHOUT ROWID + ** tables (when pPk!=0) this will be the declared PRIMARY KEY. For + ** normal tables (when pPk==0) this will be the rowid. + */ + if( pPk ){ + for(j=0; jnKeyCol; j++){ + int x = pPk->aiColumn[j]; + assert( x>=0 ); + if( isDupColumn(pIndex, pIndex->nKeyCol, pPk, j) ){ + pIndex->nColumn--; + }else{ + testcase( hasColumn(pIndex->aiColumn,pIndex->nKeyCol,x) ); + pIndex->aiColumn[i] = x; + pIndex->azColl[i] = pPk->azColl[j]; + pIndex->aSortOrder[i] = pPk->aSortOrder[j]; + i++; + } + } + assert( i==pIndex->nColumn ); + }else{ + pIndex->aiColumn[i] = XN_ROWID; + pIndex->azColl[i] = sqlite3StrBINARY; + } + sqlite3DefaultRowEst(pIndex); + if( pParse->pNewTable==0 ) estimateIndexWidth(pIndex); + + /* If this index contains every column of its table, then mark + ** it as a covering index */ + assert( HasRowid(pTab) + || pTab->iPKey<0 || sqlite3TableColumnToIndex(pIndex, pTab->iPKey)>=0 ); + recomputeColumnsNotIndexed(pIndex); + if( pTblName!=0 && pIndex->nColumn>=pTab->nCol ){ + pIndex->isCovering = 1; + for(j=0; jnCol; j++){ + if( j==pTab->iPKey ) continue; + if( sqlite3TableColumnToIndex(pIndex,j)>=0 ) continue; + pIndex->isCovering = 0; + break; + } + } + + if( pTab==pParse->pNewTable ){ + /* This routine has been called to create an automatic index as a + ** result of a PRIMARY KEY or UNIQUE clause on a column definition, or + ** a PRIMARY KEY or UNIQUE clause following the column definitions. + ** i.e. one of: + ** + ** CREATE TABLE t(x PRIMARY KEY, y); + ** CREATE TABLE t(x, y, UNIQUE(x, y)); + ** + ** Either way, check to see if the table already has such an index. If + ** so, don't bother creating this one. This only applies to + ** automatically created indices. Users can do as they wish with + ** explicit indices. + ** + ** Two UNIQUE or PRIMARY KEY constraints are considered equivalent + ** (and thus suppressing the second one) even if they have different + ** sort orders. + ** + ** If there are different collating sequences or if the columns of + ** the constraint occur in different orders, then the constraints are + ** considered distinct and both result in separate indices. + */ + Index *pIdx; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int k; + assert( IsUniqueIndex(pIdx) ); + assert( pIdx->idxType!=SQLITE_IDXTYPE_APPDEF ); + assert( IsUniqueIndex(pIndex) ); + + if( pIdx->nKeyCol!=pIndex->nKeyCol ) continue; + for(k=0; knKeyCol; k++){ + const char *z1; + const char *z2; + assert( pIdx->aiColumn[k]>=0 ); + if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break; + z1 = pIdx->azColl[k]; + z2 = pIndex->azColl[k]; + if( sqlite3StrICmp(z1, z2) ) break; + } + if( k==pIdx->nKeyCol ){ + if( pIdx->onError!=pIndex->onError ){ + /* This constraint creates the same index as a previous + ** constraint specified somewhere in the CREATE TABLE statement. + ** However the ON CONFLICT clauses are different. If both this + ** constraint and the previous equivalent constraint have explicit + ** ON CONFLICT clauses this is an error. Otherwise, use the + ** explicitly specified behavior for the index. + */ + if( !(pIdx->onError==OE_Default || pIndex->onError==OE_Default) ){ + sqlite3ErrorMsg(pParse, + "conflicting ON CONFLICT clauses specified", 0); + } + if( pIdx->onError==OE_Default ){ + pIdx->onError = pIndex->onError; + } + } + if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType; + if( IN_RENAME_OBJECT ){ + pIndex->pNext = pParse->pNewIndex; + pParse->pNewIndex = pIndex; + pIndex = 0; + } + goto exit_create_index; + } + } + } + + if( !IN_RENAME_OBJECT ){ + + /* Link the new Index structure to its table and to the other + ** in-memory database structures. + */ + assert( pParse->nErr==0 ); + if( db->init.busy ){ + Index *p; + assert( !IN_SPECIAL_PARSE ); + assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); + if( pTblName!=0 ){ + pIndex->tnum = db->init.newTnum; + if( sqlite3IndexHasDuplicateRootPage(pIndex) ){ + sqlite3ErrorMsg(pParse, "invalid rootpage"); + pParse->rc = SQLITE_CORRUPT_BKPT; + goto exit_create_index; + } + } + p = sqlite3HashInsert(&pIndex->pSchema->idxHash, + pIndex->zName, pIndex); + if( p ){ + assert( p==pIndex ); /* Malloc must have failed */ + sqlite3OomFault(db); + goto exit_create_index; + } + db->mDbFlags |= DBFLAG_SchemaChange; + } + + /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the + ** index is an implied index for a UNIQUE or PRIMARY KEY constraint) then + ** emit code to allocate the index rootpage on disk and make an entry for + ** the index in the sqlite_master table and populate the index with + ** content. But, do not do this if we are simply reading the sqlite_master + ** table to parse the schema, or if this index is the PRIMARY KEY index + ** of a WITHOUT ROWID table. + ** + ** If pTblName==0 it means this index is generated as an implied PRIMARY KEY + ** or UNIQUE index in a CREATE TABLE statement. Since the table + ** has just been created, it contains no data and the index initialization + ** step can be skipped. + */ + else if( HasRowid(pTab) || pTblName!=0 ){ + Vdbe *v; + char *zStmt; + int iMem = ++pParse->nMem; + + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto exit_create_index; + + sqlite3BeginWriteOperation(pParse, 1, iDb); + + /* Create the rootpage for the index using CreateIndex. But before + ** doing so, code a Noop instruction and store its address in + ** Index.tnum. This is required in case this index is actually a + ** PRIMARY KEY and the table is actually a WITHOUT ROWID table. In + ** that case the convertToWithoutRowidTable() routine will replace + ** the Noop with a Goto to jump over the VDBE code generated below. */ + pIndex->tnum = sqlite3VdbeAddOp0(v, OP_Noop); + sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, iMem, BTREE_BLOBKEY); + + /* Gather the complete text of the CREATE INDEX statement into + ** the zStmt variable + */ + assert( pName!=0 || pStart==0 ); + if( pStart ){ + int n = (int)(pParse->sLastToken.z - pName->z) + pParse->sLastToken.n; + if( pName->z[n-1]==';' ) n--; + /* A named index with an explicit CREATE INDEX statement */ + zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s", + onError==OE_None ? "" : " UNIQUE", n, pName->z); + }else{ + /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */ + /* zStmt = sqlite3MPrintf(""); */ + zStmt = 0; + } + + /* Add an entry in sqlite_master for this index + */ + sqlite3NestedParse(pParse, + "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);", + db->aDb[iDb].zDbSName, MASTER_NAME, + pIndex->zName, + pTab->zName, + iMem, + zStmt + ); + sqlite3DbFree(db, zStmt); + + /* Fill the index with data and reparse the schema. Code an OP_Expire + ** to invalidate all pre-compiled statements. + */ + if( pTblName ){ + sqlite3RefillIndex(pParse, pIndex, iMem); + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddParseSchemaOp(v, iDb, + sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName)); + sqlite3VdbeAddOp2(v, OP_Expire, 0, 1); + } + + sqlite3VdbeJumpHere(v, pIndex->tnum); + } + } + if( db->init.busy || pTblName==0 ){ + pIndex->pNext = pTab->pIndex; + pTab->pIndex = pIndex; + pIndex = 0; + } + else if( IN_RENAME_OBJECT ){ + assert( pParse->pNewIndex==0 ); + pParse->pNewIndex = pIndex; + pIndex = 0; + } + + /* Clean up before exiting */ +exit_create_index: + if( pIndex ) sqlite3FreeIndex(db, pIndex); + if( pTab ){ /* Ensure all REPLACE indexes are at the end of the list */ + Index **ppFrom = &pTab->pIndex; + Index *pThis; + for(ppFrom=&pTab->pIndex; (pThis = *ppFrom)!=0; ppFrom=&pThis->pNext){ + Index *pNext; + if( pThis->onError!=OE_Replace ) continue; + while( (pNext = pThis->pNext)!=0 && pNext->onError!=OE_Replace ){ + *ppFrom = pNext; + pThis->pNext = pNext->pNext; + pNext->pNext = pThis; + ppFrom = &pNext->pNext; + } + break; + } + } + sqlite3ExprDelete(db, pPIWhere); + sqlite3ExprListDelete(db, pList); + sqlite3SrcListDelete(db, pTblName); + sqlite3DbFree(db, zName); +} + +/* +** Fill the Index.aiRowEst[] array with default information - information +** to be used when we have not run the ANALYZE command. +** +** aiRowEst[0] is supposed to contain the number of elements in the index. +** Since we do not know, guess 1 million. aiRowEst[1] is an estimate of the +** number of rows in the table that match any particular value of the +** first column of the index. aiRowEst[2] is an estimate of the number +** of rows that match any particular combination of the first 2 columns +** of the index. And so forth. It must always be the case that +* +** aiRowEst[N]<=aiRowEst[N-1] +** aiRowEst[N]>=1 +** +** Apart from that, we have little to go on besides intuition as to +** how aiRowEst[] should be initialized. The numbers generated here +** are based on typical values found in actual indices. +*/ +SQLITE_PRIVATE void sqlite3DefaultRowEst(Index *pIdx){ + /* 10, 9, 8, 7, 6 */ + LogEst aVal[] = { 33, 32, 30, 28, 26 }; + LogEst *a = pIdx->aiRowLogEst; + int nCopy = MIN(ArraySize(aVal), pIdx->nKeyCol); + int i; + + /* Indexes with default row estimates should not have stat1 data */ + assert( !pIdx->hasStat1 ); + + /* Set the first entry (number of rows in the index) to the estimated + ** number of rows in the table, or half the number of rows in the table + ** for a partial index. But do not let the estimate drop below 10. */ + a[0] = pIdx->pTable->nRowLogEst; + if( pIdx->pPartIdxWhere!=0 ) a[0] -= 10; assert( 10==sqlite3LogEst(2) ); + if( a[0]<33 ) a[0] = 33; assert( 33==sqlite3LogEst(10) ); + + /* Estimate that a[1] is 10, a[2] is 9, a[3] is 8, a[4] is 7, a[5] is + ** 6 and each subsequent value (if any) is 5. */ + memcpy(&a[1], aVal, nCopy*sizeof(LogEst)); + for(i=nCopy+1; i<=pIdx->nKeyCol; i++){ + a[i] = 23; assert( 23==sqlite3LogEst(5) ); + } + + assert( 0==sqlite3LogEst(1) ); + if( IsUniqueIndex(pIdx) ) a[pIdx->nKeyCol] = 0; +} + +/* +** This routine will drop an existing named index. This routine +** implements the DROP INDEX statement. +*/ +SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){ + Index *pIndex; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + assert( pParse->nErr==0 ); /* Never called with prior errors */ + if( db->mallocFailed ){ + goto exit_drop_index; + } + assert( pName->nSrc==1 ); + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto exit_drop_index; + } + pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase); + if( pIndex==0 ){ + if( !ifExists ){ + sqlite3ErrorMsg(pParse, "no such index: %S", pName, 0); + }else{ + sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase); + } + pParse->checkSchema = 1; + goto exit_drop_index; + } + if( pIndex->idxType!=SQLITE_IDXTYPE_APPDEF ){ + sqlite3ErrorMsg(pParse, "index associated with UNIQUE " + "or PRIMARY KEY constraint cannot be dropped", 0); + goto exit_drop_index; + } + iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code = SQLITE_DROP_INDEX; + Table *pTab = pIndex->pTable; + const char *zDb = db->aDb[iDb].zDbSName; + const char *zTab = SCHEMA_TABLE(iDb); + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ + goto exit_drop_index; + } + if( !OMIT_TEMPDB && iDb ) code = SQLITE_DROP_TEMP_INDEX; + if( sqlite3AuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){ + goto exit_drop_index; + } + } +#endif + + /* Generate code to remove the index and from the master table */ + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3BeginWriteOperation(pParse, 1, iDb); + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE name=%Q AND type='index'", + db->aDb[iDb].zDbSName, MASTER_NAME, pIndex->zName + ); + sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); + sqlite3ChangeCookie(pParse, iDb); + destroyRootPage(pParse, pIndex->tnum, iDb); + sqlite3VdbeAddOp4(v, OP_DropIndex, iDb, 0, 0, pIndex->zName, 0); + } + +exit_drop_index: + sqlite3SrcListDelete(db, pName); +} + +/* +** pArray is a pointer to an array of objects. Each object in the +** array is szEntry bytes in size. This routine uses sqlite3DbRealloc() +** to extend the array so that there is space for a new object at the end. +** +** When this function is called, *pnEntry contains the current size of +** the array (in entries - so the allocation is ((*pnEntry) * szEntry) bytes +** in total). +** +** If the realloc() is successful (i.e. if no OOM condition occurs), the +** space allocated for the new object is zeroed, *pnEntry updated to +** reflect the new size of the array and a pointer to the new allocation +** returned. *pIdx is set to the index of the new array entry in this case. +** +** Otherwise, if the realloc() fails, *pIdx is set to -1, *pnEntry remains +** unchanged and a copy of pArray returned. +*/ +SQLITE_PRIVATE void *sqlite3ArrayAllocate( + sqlite3 *db, /* Connection to notify of malloc failures */ + void *pArray, /* Array of objects. Might be reallocated */ + int szEntry, /* Size of each object in the array */ + int *pnEntry, /* Number of objects currently in use */ + int *pIdx /* Write the index of a new slot here */ +){ + char *z; + sqlite3_int64 n = *pIdx = *pnEntry; + if( (n & (n-1))==0 ){ + sqlite3_int64 sz = (n==0) ? 1 : 2*n; + void *pNew = sqlite3DbRealloc(db, pArray, sz*szEntry); + if( pNew==0 ){ + *pIdx = -1; + return pArray; + } + pArray = pNew; + } + z = (char*)pArray; + memset(&z[n * szEntry], 0, szEntry); + ++*pnEntry; + return pArray; +} + +/* +** Append a new element to the given IdList. Create a new IdList if +** need be. +** +** A new IdList is returned, or NULL if malloc() fails. +*/ +SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token *pToken){ + sqlite3 *db = pParse->db; + int i; + if( pList==0 ){ + pList = sqlite3DbMallocZero(db, sizeof(IdList) ); + if( pList==0 ) return 0; + } + pList->a = sqlite3ArrayAllocate( + db, + pList->a, + sizeof(pList->a[0]), + &pList->nId, + &i + ); + if( i<0 ){ + sqlite3IdListDelete(db, pList); + return 0; + } + pList->a[i].zName = sqlite3NameFromToken(db, pToken); + if( IN_RENAME_OBJECT && pList->a[i].zName ){ + sqlite3RenameTokenMap(pParse, (void*)pList->a[i].zName, pToken); + } + return pList; +} + +/* +** Delete an IdList. +*/ +SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ + int i; + if( pList==0 ) return; + for(i=0; inId; i++){ + sqlite3DbFree(db, pList->a[i].zName); + } + sqlite3DbFree(db, pList->a); + sqlite3DbFreeNN(db, pList); +} + +/* +** Return the index in pList of the identifier named zId. Return -1 +** if not found. +*/ +SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ + int i; + if( pList==0 ) return -1; + for(i=0; inId; i++){ + if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i; + } + return -1; +} + +/* +** Maximum size of a SrcList object. +** The SrcList object is used to represent the FROM clause of a +** SELECT statement, and the query planner cannot deal with more +** than 64 tables in a join. So any value larger than 64 here +** is sufficient for most uses. Smaller values, like say 10, are +** appropriate for small and memory-limited applications. +*/ +#ifndef SQLITE_MAX_SRCLIST +# define SQLITE_MAX_SRCLIST 200 +#endif + +/* +** Expand the space allocated for the given SrcList object by +** creating nExtra new slots beginning at iStart. iStart is zero based. +** New slots are zeroed. +** +** For example, suppose a SrcList initially contains two entries: A,B. +** To append 3 new entries onto the end, do this: +** +** sqlite3SrcListEnlarge(db, pSrclist, 3, 2); +** +** After the call above it would contain: A, B, nil, nil, nil. +** If the iStart argument had been 1 instead of 2, then the result +** would have been: A, nil, nil, nil, B. To prepend the new slots, +** the iStart value would be 0. The result then would +** be: nil, nil, nil, A, B. +** +** If a memory allocation fails or the SrcList becomes too large, leave +** the original SrcList unchanged, return NULL, and leave an error message +** in pParse. +*/ +SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( + Parse *pParse, /* Parsing context into which errors are reported */ + SrcList *pSrc, /* The SrcList to be enlarged */ + int nExtra, /* Number of new slots to add to pSrc->a[] */ + int iStart /* Index in pSrc->a[] of first new slot */ +){ + int i; + + /* Sanity checking on calling parameters */ + assert( iStart>=0 ); + assert( nExtra>=1 ); + assert( pSrc!=0 ); + assert( iStart<=pSrc->nSrc ); + + /* Allocate additional space if needed */ + if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ + SrcList *pNew; + sqlite3_int64 nAlloc = 2*(sqlite3_int64)pSrc->nSrc+nExtra; + sqlite3 *db = pParse->db; + + if( pSrc->nSrc+nExtra>=SQLITE_MAX_SRCLIST ){ + sqlite3ErrorMsg(pParse, "too many FROM clause terms, max: %d", + SQLITE_MAX_SRCLIST); + return 0; + } + if( nAlloc>SQLITE_MAX_SRCLIST ) nAlloc = SQLITE_MAX_SRCLIST; + pNew = sqlite3DbRealloc(db, pSrc, + sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); + if( pNew==0 ){ + assert( db->mallocFailed ); + return 0; + } + pSrc = pNew; + pSrc->nAlloc = nAlloc; + } + + /* Move existing slots that come after the newly inserted slots + ** out of the way */ + for(i=pSrc->nSrc-1; i>=iStart; i--){ + pSrc->a[i+nExtra] = pSrc->a[i]; + } + pSrc->nSrc += nExtra; + + /* Zero the newly allocated slots */ + memset(&pSrc->a[iStart], 0, sizeof(pSrc->a[0])*nExtra); + for(i=iStart; ia[i].iCursor = -1; + } + + /* Return a pointer to the enlarged SrcList */ + return pSrc; +} + + +/* +** Append a new table name to the given SrcList. Create a new SrcList if +** need be. A new entry is created in the SrcList even if pTable is NULL. +** +** A SrcList is returned, or NULL if there is an OOM error or if the +** SrcList grows to large. The returned +** SrcList might be the same as the SrcList that was input or it might be +** a new one. If an OOM error does occurs, then the prior value of pList +** that is input to this routine is automatically freed. +** +** If pDatabase is not null, it means that the table has an optional +** database name prefix. Like this: "database.table". The pDatabase +** points to the table name and the pTable points to the database name. +** The SrcList.a[].zName field is filled with the table name which might +** come from pTable (if pDatabase is NULL) or from pDatabase. +** SrcList.a[].zDatabase is filled with the database name from pTable, +** or with NULL if no database is specified. +** +** In other words, if call like this: +** +** sqlite3SrcListAppend(D,A,B,0); +** +** Then B is a table name and the database name is unspecified. If called +** like this: +** +** sqlite3SrcListAppend(D,A,B,C); +** +** Then C is the table name and B is the database name. If C is defined +** then so is B. In other words, we never have a case where: +** +** sqlite3SrcListAppend(D,A,0,C); +** +** Both pTable and pDatabase are assumed to be quoted. They are dequoted +** before being added to the SrcList. +*/ +SQLITE_PRIVATE SrcList *sqlite3SrcListAppend( + Parse *pParse, /* Parsing context, in which errors are reported */ + SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */ + Token *pTable, /* Table to append */ + Token *pDatabase /* Database of the table */ +){ + struct SrcList_item *pItem; + sqlite3 *db; + assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */ + assert( pParse!=0 ); + assert( pParse->db!=0 ); + db = pParse->db; + if( pList==0 ){ + pList = sqlite3DbMallocRawNN(pParse->db, sizeof(SrcList) ); + if( pList==0 ) return 0; + pList->nAlloc = 1; + pList->nSrc = 1; + memset(&pList->a[0], 0, sizeof(pList->a[0])); + pList->a[0].iCursor = -1; + }else{ + SrcList *pNew = sqlite3SrcListEnlarge(pParse, pList, 1, pList->nSrc); + if( pNew==0 ){ + sqlite3SrcListDelete(db, pList); + return 0; + }else{ + pList = pNew; + } + } + pItem = &pList->a[pList->nSrc-1]; + if( pDatabase && pDatabase->z==0 ){ + pDatabase = 0; + } + if( pDatabase ){ + pItem->zName = sqlite3NameFromToken(db, pDatabase); + pItem->zDatabase = sqlite3NameFromToken(db, pTable); + }else{ + pItem->zName = sqlite3NameFromToken(db, pTable); + pItem->zDatabase = 0; + } + return pList; +} + +/* +** Assign VdbeCursor index numbers to all tables in a SrcList +*/ +SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ + int i; + struct SrcList_item *pItem; + assert(pList || pParse->db->mallocFailed ); + if( pList ){ + for(i=0, pItem=pList->a; inSrc; i++, pItem++){ + if( pItem->iCursor>=0 ) break; + pItem->iCursor = pParse->nTab++; + if( pItem->pSelect ){ + sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc); + } + } + } +} + +/* +** Delete an entire SrcList including all its substructure. +*/ +SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ + int i; + struct SrcList_item *pItem; + if( pList==0 ) return; + for(pItem=pList->a, i=0; inSrc; i++, pItem++){ + sqlite3DbFree(db, pItem->zDatabase); + sqlite3DbFree(db, pItem->zName); + sqlite3DbFree(db, pItem->zAlias); + if( pItem->fg.isIndexedBy ) sqlite3DbFree(db, pItem->u1.zIndexedBy); + if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg); + sqlite3DeleteTable(db, pItem->pTab); + sqlite3SelectDelete(db, pItem->pSelect); + sqlite3ExprDelete(db, pItem->pOn); + sqlite3IdListDelete(db, pItem->pUsing); + } + sqlite3DbFreeNN(db, pList); +} + +/* +** This routine is called by the parser to add a new term to the +** end of a growing FROM clause. The "p" parameter is the part of +** the FROM clause that has already been constructed. "p" is NULL +** if this is the first term of the FROM clause. pTable and pDatabase +** are the name of the table and database named in the FROM clause term. +** pDatabase is NULL if the database name qualifier is missing - the +** usual case. If the term has an alias, then pAlias points to the +** alias token. If the term is a subquery, then pSubquery is the +** SELECT statement that the subquery encodes. The pTable and +** pDatabase parameters are NULL for subqueries. The pOn and pUsing +** parameters are the content of the ON and USING clauses. +** +** Return a new SrcList which encodes is the FROM with the new +** term added. +*/ +SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( + Parse *pParse, /* Parsing context */ + SrcList *p, /* The left part of the FROM clause already seen */ + Token *pTable, /* Name of the table to add to the FROM clause */ + Token *pDatabase, /* Name of the database containing pTable */ + Token *pAlias, /* The right-hand side of the AS subexpression */ + Select *pSubquery, /* A subquery used in place of a table name */ + Expr *pOn, /* The ON clause of a join */ + IdList *pUsing /* The USING clause of a join */ +){ + struct SrcList_item *pItem; + sqlite3 *db = pParse->db; + if( !p && (pOn || pUsing) ){ + sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s", + (pOn ? "ON" : "USING") + ); + goto append_from_error; + } + p = sqlite3SrcListAppend(pParse, p, pTable, pDatabase); + if( p==0 ){ + goto append_from_error; + } + assert( p->nSrc>0 ); + pItem = &p->a[p->nSrc-1]; + assert( (pTable==0)==(pDatabase==0) ); + assert( pItem->zName==0 || pDatabase!=0 ); + if( IN_RENAME_OBJECT && pItem->zName ){ + Token *pToken = (ALWAYS(pDatabase) && pDatabase->z) ? pDatabase : pTable; + sqlite3RenameTokenMap(pParse, pItem->zName, pToken); + } + assert( pAlias!=0 ); + if( pAlias->n ){ + pItem->zAlias = sqlite3NameFromToken(db, pAlias); + } + pItem->pSelect = pSubquery; + pItem->pOn = pOn; + pItem->pUsing = pUsing; + return p; + + append_from_error: + assert( p==0 ); + sqlite3ExprDelete(db, pOn); + sqlite3IdListDelete(db, pUsing); + sqlite3SelectDelete(db, pSubquery); + return 0; +} + +/* +** Add an INDEXED BY or NOT INDEXED clause to the most recently added +** element of the source-list passed as the second argument. +*/ +SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){ + assert( pIndexedBy!=0 ); + if( p && pIndexedBy->n>0 ){ + struct SrcList_item *pItem; + assert( p->nSrc>0 ); + pItem = &p->a[p->nSrc-1]; + assert( pItem->fg.notIndexed==0 ); + assert( pItem->fg.isIndexedBy==0 ); + assert( pItem->fg.isTabFunc==0 ); + if( pIndexedBy->n==1 && !pIndexedBy->z ){ + /* A "NOT INDEXED" clause was supplied. See parse.y + ** construct "indexed_opt" for details. */ + pItem->fg.notIndexed = 1; + }else{ + pItem->u1.zIndexedBy = sqlite3NameFromToken(pParse->db, pIndexedBy); + pItem->fg.isIndexedBy = 1; + } + } +} + +/* +** Add the list of function arguments to the SrcList entry for a +** table-valued-function. +*/ +SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse *pParse, SrcList *p, ExprList *pList){ + if( p ){ + struct SrcList_item *pItem = &p->a[p->nSrc-1]; + assert( pItem->fg.notIndexed==0 ); + assert( pItem->fg.isIndexedBy==0 ); + assert( pItem->fg.isTabFunc==0 ); + pItem->u1.pFuncArg = pList; + pItem->fg.isTabFunc = 1; + }else{ + sqlite3ExprListDelete(pParse->db, pList); + } +} + +/* +** When building up a FROM clause in the parser, the join operator +** is initially attached to the left operand. But the code generator +** expects the join operator to be on the right operand. This routine +** Shifts all join operators from left to right for an entire FROM +** clause. +** +** Example: Suppose the join is like this: +** +** A natural cross join B +** +** The operator is "natural cross join". The A and B operands are stored +** in p->a[0] and p->a[1], respectively. The parser initially stores the +** operator with A. This routine shifts that operator over to B. +*/ +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList *p){ + if( p ){ + int i; + for(i=p->nSrc-1; i>0; i--){ + p->a[i].fg.jointype = p->a[i-1].fg.jointype; + } + p->a[0].fg.jointype = 0; + } +} + +/* +** Generate VDBE code for a BEGIN statement. +*/ +SQLITE_PRIVATE void sqlite3BeginTransaction(Parse *pParse, int type){ + sqlite3 *db; + Vdbe *v; + int i; + + assert( pParse!=0 ); + db = pParse->db; + assert( db!=0 ); + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ){ + return; + } + v = sqlite3GetVdbe(pParse); + if( !v ) return; + if( type!=TK_DEFERRED ){ + for(i=0; inDb; i++){ + sqlite3VdbeAddOp2(v, OP_Transaction, i, (type==TK_EXCLUSIVE)+1); + sqlite3VdbeUsesBtree(v, i); + } + } + sqlite3VdbeAddOp0(v, OP_AutoCommit); +} + +/* +** Generate VDBE code for a COMMIT or ROLLBACK statement. +** Code for ROLLBACK is generated if eType==TK_ROLLBACK. Otherwise +** code is generated for a COMMIT. +*/ +SQLITE_PRIVATE void sqlite3EndTransaction(Parse *pParse, int eType){ + Vdbe *v; + int isRollback; + + assert( pParse!=0 ); + assert( pParse->db!=0 ); + assert( eType==TK_COMMIT || eType==TK_END || eType==TK_ROLLBACK ); + isRollback = eType==TK_ROLLBACK; + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, + isRollback ? "ROLLBACK" : "COMMIT", 0, 0) ){ + return; + } + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, isRollback); + } +} + +/* +** This function is called by the parser when it parses a command to create, +** release or rollback an SQL savepoint. +*/ +SQLITE_PRIVATE void sqlite3Savepoint(Parse *pParse, int op, Token *pName){ + char *zName = sqlite3NameFromToken(pParse->db, pName); + if( zName ){ + Vdbe *v = sqlite3GetVdbe(pParse); +#ifndef SQLITE_OMIT_AUTHORIZATION + static const char * const az[] = { "BEGIN", "RELEASE", "ROLLBACK" }; + assert( !SAVEPOINT_BEGIN && SAVEPOINT_RELEASE==1 && SAVEPOINT_ROLLBACK==2 ); +#endif + if( !v || sqlite3AuthCheck(pParse, SQLITE_SAVEPOINT, az[op], zName, 0) ){ + sqlite3DbFree(pParse->db, zName); + return; + } + sqlite3VdbeAddOp4(v, OP_Savepoint, op, 0, 0, zName, P4_DYNAMIC); + } +} + +/* +** Make sure the TEMP database is open and available for use. Return +** the number of errors. Leave any error messages in the pParse structure. +*/ +SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){ + sqlite3 *db = pParse->db; + if( db->aDb[1].pBt==0 && !pParse->explain ){ + int rc; + Btree *pBt; + static const int flags = + SQLITE_OPEN_READWRITE | + SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | + SQLITE_OPEN_DELETEONCLOSE | + SQLITE_OPEN_TEMP_DB; + + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pBt, 0, flags); + if( rc!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "unable to open a temporary database " + "file for storing temporary tables"); + pParse->rc = rc; + return 1; + } + db->aDb[1].pBt = pBt; + assert( db->aDb[1].pSchema ); + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, 0, 0) ){ + sqlite3OomFault(db); + return 1; + } + } + return 0; +} + +/* +** Record the fact that the schema cookie will need to be verified +** for database iDb. The code to actually verify the schema cookie +** will occur at the end of the top-level VDBE and will be generated +** later, by sqlite3FinishCoding(). +*/ +SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse *pParse, int iDb){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + + assert( iDb>=0 && iDbdb->nDb ); + assert( pParse->db->aDb[iDb].pBt!=0 || iDb==1 ); + assert( iDbdb, iDb, 0) ); + if( DbMaskTest(pToplevel->cookieMask, iDb)==0 ){ + DbMaskSet(pToplevel->cookieMask, iDb); + if( !OMIT_TEMPDB && iDb==1 ){ + sqlite3OpenTempDatabase(pToplevel); + } + } +} + +/* +** If argument zDb is NULL, then call sqlite3CodeVerifySchema() for each +** attached database. Otherwise, invoke it for the database named zDb only. +*/ +SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse *pParse, const char *zDb){ + sqlite3 *db = pParse->db; + int i; + for(i=0; inDb; i++){ + Db *pDb = &db->aDb[i]; + if( pDb->pBt && (!zDb || 0==sqlite3StrICmp(zDb, pDb->zDbSName)) ){ + sqlite3CodeVerifySchema(pParse, i); + } + } +} + +/* +** Generate VDBE code that prepares for doing an operation that +** might change the database. +** +** This routine starts a new transaction if we are not already within +** a transaction. If we are already within a transaction, then a checkpoint +** is set if the setStatement parameter is true. A checkpoint should +** be set for operations that might fail (due to a constraint) part of +** the way through and which will need to undo some writes without having to +** rollback the whole transaction. For operations where all constraints +** can be checked before any changes are made to the database, it is never +** necessary to undo a write and the checkpoint should not be set. +*/ +SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + sqlite3CodeVerifySchema(pParse, iDb); + DbMaskSet(pToplevel->writeMask, iDb); + pToplevel->isMultiWrite |= setStatement; +} + +/* +** Indicate that the statement currently under construction might write +** more than one entry (example: deleting one row then inserting another, +** inserting multiple rows in a table, or inserting a row and index entries.) +** If an abort occurs after some of these writes have completed, then it will +** be necessary to undo the completed writes. +*/ +SQLITE_PRIVATE void sqlite3MultiWrite(Parse *pParse){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + pToplevel->isMultiWrite = 1; +} + +/* +** The code generator calls this routine if is discovers that it is +** possible to abort a statement prior to completion. In order to +** perform this abort without corrupting the database, we need to make +** sure that the statement is protected by a statement transaction. +** +** Technically, we only need to set the mayAbort flag if the +** isMultiWrite flag was previously set. There is a time dependency +** such that the abort must occur after the multiwrite. This makes +** some statements involving the REPLACE conflict resolution algorithm +** go a little faster. But taking advantage of this time dependency +** makes it more difficult to prove that the code is correct (in +** particular, it prevents us from writing an effective +** implementation of sqlite3AssertMayAbort()) and so we have chosen +** to take the safe route and skip the optimization. +*/ +SQLITE_PRIVATE void sqlite3MayAbort(Parse *pParse){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + pToplevel->mayAbort = 1; +} + +/* +** Code an OP_Halt that causes the vdbe to return an SQLITE_CONSTRAINT +** error. The onError parameter determines which (if any) of the statement +** and/or current transaction is rolled back. +*/ +SQLITE_PRIVATE void sqlite3HaltConstraint( + Parse *pParse, /* Parsing context */ + int errCode, /* extended error code */ + int onError, /* Constraint type */ + char *p4, /* Error message */ + i8 p4type, /* P4_STATIC or P4_TRANSIENT */ + u8 p5Errmsg /* P5_ErrMsg type */ +){ + Vdbe *v = sqlite3GetVdbe(pParse); + assert( (errCode&0xff)==SQLITE_CONSTRAINT || pParse->nested ); + if( onError==OE_Abort ){ + sqlite3MayAbort(pParse); + } + sqlite3VdbeAddOp4(v, OP_Halt, errCode, onError, 0, p4, p4type); + sqlite3VdbeChangeP5(v, p5Errmsg); +} + +/* +** Code an OP_Halt due to UNIQUE or PRIMARY KEY constraint violation. +*/ +SQLITE_PRIVATE void sqlite3UniqueConstraint( + Parse *pParse, /* Parsing context */ + int onError, /* Constraint type */ + Index *pIdx /* The index that triggers the constraint */ +){ + char *zErr; + int j; + StrAccum errMsg; + Table *pTab = pIdx->pTable; + + sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, + pParse->db->aLimit[SQLITE_LIMIT_LENGTH]); + if( pIdx->aColExpr ){ + sqlite3_str_appendf(&errMsg, "index '%q'", pIdx->zName); + }else{ + for(j=0; jnKeyCol; j++){ + char *zCol; + assert( pIdx->aiColumn[j]>=0 ); + zCol = pTab->aCol[pIdx->aiColumn[j]].zName; + if( j ) sqlite3_str_append(&errMsg, ", ", 2); + sqlite3_str_appendall(&errMsg, pTab->zName); + sqlite3_str_append(&errMsg, ".", 1); + sqlite3_str_appendall(&errMsg, zCol); + } + } + zErr = sqlite3StrAccumFinish(&errMsg); + sqlite3HaltConstraint(pParse, + IsPrimaryKeyIndex(pIdx) ? SQLITE_CONSTRAINT_PRIMARYKEY + : SQLITE_CONSTRAINT_UNIQUE, + onError, zErr, P4_DYNAMIC, P5_ConstraintUnique); +} + + +/* +** Code an OP_Halt due to non-unique rowid. +*/ +SQLITE_PRIVATE void sqlite3RowidConstraint( + Parse *pParse, /* Parsing context */ + int onError, /* Conflict resolution algorithm */ + Table *pTab /* The table with the non-unique rowid */ +){ + char *zMsg; + int rc; + if( pTab->iPKey>=0 ){ + zMsg = sqlite3MPrintf(pParse->db, "%s.%s", pTab->zName, + pTab->aCol[pTab->iPKey].zName); + rc = SQLITE_CONSTRAINT_PRIMARYKEY; + }else{ + zMsg = sqlite3MPrintf(pParse->db, "%s.rowid", pTab->zName); + rc = SQLITE_CONSTRAINT_ROWID; + } + sqlite3HaltConstraint(pParse, rc, onError, zMsg, P4_DYNAMIC, + P5_ConstraintUnique); +} + +/* +** Check to see if pIndex uses the collating sequence pColl. Return +** true if it does and false if it does not. +*/ +#ifndef SQLITE_OMIT_REINDEX +static int collationMatch(const char *zColl, Index *pIndex){ + int i; + assert( zColl!=0 ); + for(i=0; inColumn; i++){ + const char *z = pIndex->azColl[i]; + assert( z!=0 || pIndex->aiColumn[i]<0 ); + if( pIndex->aiColumn[i]>=0 && 0==sqlite3StrICmp(z, zColl) ){ + return 1; + } + } + return 0; +} +#endif + +/* +** Recompute all indices of pTab that use the collating sequence pColl. +** If pColl==0 then recompute all indices of pTab. +*/ +#ifndef SQLITE_OMIT_REINDEX +static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ + if( !IsVirtual(pTab) ){ + Index *pIndex; /* An index associated with pTab */ + + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( zColl==0 || collationMatch(zColl, pIndex) ){ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + } + } + } +} +#endif + +/* +** Recompute all indices of all tables in all databases where the +** indices use the collating sequence pColl. If pColl==0 then recompute +** all indices everywhere. +*/ +#ifndef SQLITE_OMIT_REINDEX +static void reindexDatabases(Parse *pParse, char const *zColl){ + Db *pDb; /* A single database */ + int iDb; /* The database index number */ + sqlite3 *db = pParse->db; /* The database connection */ + HashElem *k; /* For looping over tables in pDb */ + Table *pTab; /* A table in the database */ + + assert( sqlite3BtreeHoldsAllMutexes(db) ); /* Needed for schema access */ + for(iDb=0, pDb=db->aDb; iDbnDb; iDb++, pDb++){ + assert( pDb!=0 ); + for(k=sqliteHashFirst(&pDb->pSchema->tblHash); k; k=sqliteHashNext(k)){ + pTab = (Table*)sqliteHashData(k); + reindexTable(pParse, pTab, zColl); + } + } +} +#endif + +/* +** Generate code for the REINDEX command. +** +** REINDEX -- 1 +** REINDEX -- 2 +** REINDEX ?.? -- 3 +** REINDEX ?.? -- 4 +** +** Form 1 causes all indices in all attached databases to be rebuilt. +** Form 2 rebuilds all indices in all databases that use the named +** collating function. Forms 3 and 4 rebuild the named index or all +** indices associated with the named table. +*/ +#ifndef SQLITE_OMIT_REINDEX +SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ + CollSeq *pColl; /* Collating sequence to be reindexed, or NULL */ + char *z; /* Name of a table or index */ + const char *zDb; /* Name of the database */ + Table *pTab; /* A table in the database */ + Index *pIndex; /* An index associated with pTab */ + int iDb; /* The database index number */ + sqlite3 *db = pParse->db; /* The database connection */ + Token *pObjName; /* Name of the table or index to be reindexed */ + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + return; + } + + if( pName1==0 ){ + reindexDatabases(pParse, 0); + return; + }else if( NEVER(pName2==0) || pName2->z==0 ){ + char *zColl; + assert( pName1->z ); + zColl = sqlite3NameFromToken(pParse->db, pName1); + if( !zColl ) return; + pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); + if( pColl ){ + reindexDatabases(pParse, zColl); + sqlite3DbFree(db, zColl); + return; + } + sqlite3DbFree(db, zColl); + } + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName); + if( iDb<0 ) return; + z = sqlite3NameFromToken(db, pObjName); + if( z==0 ) return; + zDb = db->aDb[iDb].zDbSName; + pTab = sqlite3FindTable(db, z, zDb); + if( pTab ){ + reindexTable(pParse, pTab, 0); + sqlite3DbFree(db, z); + return; + } + pIndex = sqlite3FindIndex(db, z, zDb); + sqlite3DbFree(db, z); + if( pIndex ){ + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + return; + } + sqlite3ErrorMsg(pParse, "unable to identify the object to be reindexed"); +} +#endif + +/* +** Return a KeyInfo structure that is appropriate for the given Index. +** +** The caller should invoke sqlite3KeyInfoUnref() on the returned object +** when it has finished using it. +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ + int i; + int nCol = pIdx->nColumn; + int nKey = pIdx->nKeyCol; + KeyInfo *pKey; + if( pParse->nErr ) return 0; + if( pIdx->uniqNotNull ){ + pKey = sqlite3KeyInfoAlloc(pParse->db, nKey, nCol-nKey); + }else{ + pKey = sqlite3KeyInfoAlloc(pParse->db, nCol, 0); + } + if( pKey ){ + assert( sqlite3KeyInfoIsWriteable(pKey) ); + for(i=0; iazColl[i]; + pKey->aColl[i] = zColl==sqlite3StrBINARY ? 0 : + sqlite3LocateCollSeq(pParse, zColl); + pKey->aSortFlags[i] = pIdx->aSortOrder[i]; + assert( 0==(pKey->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) ); + } + if( pParse->nErr ){ + assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ ); + if( pIdx->bNoQuery==0 ){ + /* Deactivate the index because it contains an unknown collating + ** sequence. The only way to reactive the index is to reload the + ** schema. Adding the missing collating sequence later does not + ** reactive the index. The application had the chance to register + ** the missing index using the collation-needed callback. For + ** simplicity, SQLite will not give the application a second chance. + */ + pIdx->bNoQuery = 1; + pParse->rc = SQLITE_ERROR_RETRY; + } + sqlite3KeyInfoUnref(pKey); + pKey = 0; + } + } + return pKey; +} + +#ifndef SQLITE_OMIT_CTE +/* +** This routine is invoked once per CTE by the parser while parsing a +** WITH clause. +*/ +SQLITE_PRIVATE With *sqlite3WithAdd( + Parse *pParse, /* Parsing context */ + With *pWith, /* Existing WITH clause, or NULL */ + Token *pName, /* Name of the common-table */ + ExprList *pArglist, /* Optional column name list for the table */ + Select *pQuery /* Query used to initialize the table */ +){ + sqlite3 *db = pParse->db; + With *pNew; + char *zName; + + /* Check that the CTE name is unique within this WITH clause. If + ** not, store an error in the Parse structure. */ + zName = sqlite3NameFromToken(pParse->db, pName); + if( zName && pWith ){ + int i; + for(i=0; inCte; i++){ + if( sqlite3StrICmp(zName, pWith->a[i].zName)==0 ){ + sqlite3ErrorMsg(pParse, "duplicate WITH table name: %s", zName); + } + } + } + + if( pWith ){ + sqlite3_int64 nByte = sizeof(*pWith) + (sizeof(pWith->a[1]) * pWith->nCte); + pNew = sqlite3DbRealloc(db, pWith, nByte); + }else{ + pNew = sqlite3DbMallocZero(db, sizeof(*pWith)); + } + assert( (pNew!=0 && zName!=0) || db->mallocFailed ); + + if( db->mallocFailed ){ + sqlite3ExprListDelete(db, pArglist); + sqlite3SelectDelete(db, pQuery); + sqlite3DbFree(db, zName); + pNew = pWith; + }else{ + pNew->a[pNew->nCte].pSelect = pQuery; + pNew->a[pNew->nCte].pCols = pArglist; + pNew->a[pNew->nCte].zName = zName; + pNew->a[pNew->nCte].zCteErr = 0; + pNew->nCte++; + } + + return pNew; +} + +/* +** Free the contents of the With object passed as the second argument. +*/ +SQLITE_PRIVATE void sqlite3WithDelete(sqlite3 *db, With *pWith){ + if( pWith ){ + int i; + for(i=0; inCte; i++){ + struct Cte *pCte = &pWith->a[i]; + sqlite3ExprListDelete(db, pCte->pCols); + sqlite3SelectDelete(db, pCte->pSelect); + sqlite3DbFree(db, pCte->zName); + } + sqlite3DbFree(db, pWith); + } +} +#endif /* !defined(SQLITE_OMIT_CTE) */ + +/************** End of build.c ***********************************************/ +/************** Begin file callback.c ****************************************/ +/* +** 2005 May 23 +** +** 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 functions used to access the internal hash tables +** of user defined functions and collation sequences. +*/ + +/* #include "sqliteInt.h" */ + +/* +** Invoke the 'collation needed' callback to request a collation sequence +** in the encoding enc of name zName, length nName. +*/ +static void callCollNeeded(sqlite3 *db, int enc, const char *zName){ + assert( !db->xCollNeeded || !db->xCollNeeded16 ); + if( db->xCollNeeded ){ + char *zExternal = sqlite3DbStrDup(db, zName); + if( !zExternal ) return; + db->xCollNeeded(db->pCollNeededArg, db, enc, zExternal); + sqlite3DbFree(db, zExternal); + } +#ifndef SQLITE_OMIT_UTF16 + if( db->xCollNeeded16 ){ + char const *zExternal; + sqlite3_value *pTmp = sqlite3ValueNew(db); + sqlite3ValueSetStr(pTmp, -1, zName, SQLITE_UTF8, SQLITE_STATIC); + zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE); + if( zExternal ){ + db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal); + } + sqlite3ValueFree(pTmp); + } +#endif +} + +/* +** This routine is called if the collation factory fails to deliver a +** collation function in the best encoding but there may be other versions +** of this collation function (for other text encodings) available. Use one +** of these instead if they exist. Avoid a UTF-8 <-> UTF-16 conversion if +** possible. +*/ +static int synthCollSeq(sqlite3 *db, CollSeq *pColl){ + CollSeq *pColl2; + char *z = pColl->zName; + int i; + static const u8 aEnc[] = { SQLITE_UTF16BE, SQLITE_UTF16LE, SQLITE_UTF8 }; + for(i=0; i<3; i++){ + pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, 0); + if( pColl2->xCmp!=0 ){ + memcpy(pColl, pColl2, sizeof(CollSeq)); + pColl->xDel = 0; /* Do not copy the destructor */ + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +/* +** This routine is called on a collation sequence before it is used to +** check that it is defined. An undefined collation sequence exists when +** a database is loaded that contains references to collation sequences +** that have not been defined by sqlite3_create_collation() etc. +** +** If required, this routine calls the 'collation needed' callback to +** request a definition of the collating sequence. If this doesn't work, +** an equivalent collating sequence that uses a text encoding different +** from the main database is substituted, if one is available. +*/ +SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){ + if( pColl && pColl->xCmp==0 ){ + const char *zName = pColl->zName; + sqlite3 *db = pParse->db; + CollSeq *p = sqlite3GetCollSeq(pParse, ENC(db), pColl, zName); + if( !p ){ + return SQLITE_ERROR; + } + assert( p==pColl ); + } + return SQLITE_OK; +} + + + +/* +** Locate and return an entry from the db.aCollSeq hash table. If the entry +** specified by zName and nName is not found and parameter 'create' is +** true, then create a new entry. Otherwise return NULL. +** +** Each pointer stored in the sqlite3.aCollSeq hash table contains an +** array of three CollSeq structures. The first is the collation sequence +** preferred for UTF-8, the second UTF-16le, and the third UTF-16be. +** +** Stored immediately after the three collation sequences is a copy of +** the collation sequence name. A pointer to this string is stored in +** each collation sequence structure. +*/ +static CollSeq *findCollSeqEntry( + sqlite3 *db, /* Database connection */ + const char *zName, /* Name of the collating sequence */ + int create /* Create a new entry if true */ +){ + CollSeq *pColl; + pColl = sqlite3HashFind(&db->aCollSeq, zName); + + if( 0==pColl && create ){ + int nName = sqlite3Strlen30(zName) + 1; + pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName); + if( pColl ){ + CollSeq *pDel = 0; + pColl[0].zName = (char*)&pColl[3]; + pColl[0].enc = SQLITE_UTF8; + pColl[1].zName = (char*)&pColl[3]; + pColl[1].enc = SQLITE_UTF16LE; + pColl[2].zName = (char*)&pColl[3]; + pColl[2].enc = SQLITE_UTF16BE; + memcpy(pColl[0].zName, zName, nName); + pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, pColl); + + /* If a malloc() failure occurred in sqlite3HashInsert(), it will + ** return the pColl pointer to be deleted (because it wasn't added + ** to the hash table). + */ + assert( pDel==0 || pDel==pColl ); + if( pDel!=0 ){ + sqlite3OomFault(db); + sqlite3DbFree(db, pDel); + pColl = 0; + } + } + } + return pColl; +} + +/* +** Parameter zName points to a UTF-8 encoded string nName bytes long. +** Return the CollSeq* pointer for the collation sequence named zName +** for the encoding 'enc' from the database 'db'. +** +** If the entry specified is not found and 'create' is true, then create a +** new entry. Otherwise return NULL. +** +** A separate function sqlite3LocateCollSeq() is a wrapper around +** this routine. sqlite3LocateCollSeq() invokes the collation factory +** if necessary and generates an error message if the collating sequence +** cannot be found. +** +** See also: sqlite3LocateCollSeq(), sqlite3GetCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq( + sqlite3 *db, /* Database connection to search */ + u8 enc, /* Desired text encoding */ + const char *zName, /* Name of the collating sequence. Might be NULL */ + int create /* True to create CollSeq if doesn't already exist */ +){ + CollSeq *pColl; + assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE ); + if( zName ){ + pColl = findCollSeqEntry(db, zName, create); + if( pColl ) pColl += enc-1; + }else{ + pColl = db->pDfltColl; + } + return pColl; +} + +/* +** Change the text encoding for a database connection. This means that +** the pDfltColl must change as well. +*/ +SQLITE_PRIVATE void sqlite3SetTextEncoding(sqlite3 *db, u8 enc){ + assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); + db->enc = enc; + /* EVIDENCE-OF: R-08308-17224 The default collating function for all + ** strings is BINARY. + */ + db->pDfltColl = sqlite3FindCollSeq(db, enc, sqlite3StrBINARY, 0); +} + +/* +** This function is responsible for invoking the collation factory callback +** or substituting a collation sequence of a different encoding when the +** requested collation sequence is not available in the desired encoding. +** +** If it is not NULL, then pColl must point to the database native encoding +** collation sequence with name zName, length nName. +** +** The return value is either the collation sequence to be used in database +** db for collation type name zName, length nName, or NULL, if no collation +** sequence can be found. If no collation is found, leave an error message. +** +** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq( + Parse *pParse, /* Parsing context */ + u8 enc, /* The desired encoding for the collating sequence */ + CollSeq *pColl, /* Collating sequence with native encoding, or NULL */ + const char *zName /* Collating sequence name */ +){ + CollSeq *p; + sqlite3 *db = pParse->db; + + p = pColl; + if( !p ){ + p = sqlite3FindCollSeq(db, enc, zName, 0); + } + if( !p || !p->xCmp ){ + /* No collation sequence of this type for this encoding is registered. + ** Call the collation factory to see if it can supply us with one. + */ + callCollNeeded(db, enc, zName); + p = sqlite3FindCollSeq(db, enc, zName, 0); + } + if( p && !p->xCmp && synthCollSeq(db, p) ){ + p = 0; + } + assert( !p || p->xCmp ); + if( p==0 ){ + sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); + pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ; + } + return p; +} + +/* +** This function returns the collation sequence for database native text +** encoding identified by the string zName. +** +** If the requested collation sequence is not available, or not available +** in the database native encoding, the collation factory is invoked to +** request it. If the collation factory does not supply such a sequence, +** and the sequence is available in another text encoding, then that is +** returned instead. +** +** If no versions of the requested collations sequence are available, or +** another error occurs, NULL is returned and an error message written into +** pParse. +** +** This routine is a wrapper around sqlite3FindCollSeq(). This routine +** invokes the collation factory if the named collation cannot be found +** and generates an error message. +** +** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ + sqlite3 *db = pParse->db; + u8 enc = ENC(db); + u8 initbusy = db->init.busy; + CollSeq *pColl; + + pColl = sqlite3FindCollSeq(db, enc, zName, initbusy); + if( !initbusy && (!pColl || !pColl->xCmp) ){ + pColl = sqlite3GetCollSeq(pParse, enc, pColl, zName); + } + + return pColl; +} + +/* During the search for the best function definition, this procedure +** is called to test how well the function passed as the first argument +** matches the request for a function with nArg arguments in a system +** that uses encoding enc. The value returned indicates how well the +** request is matched. A higher value indicates a better match. +** +** If nArg is -1 that means to only return a match (non-zero) if p->nArg +** is also -1. In other words, we are searching for a function that +** takes a variable number of arguments. +** +** If nArg is -2 that means that we are searching for any function +** regardless of the number of arguments it uses, so return a positive +** match score for any +** +** The returned value is always between 0 and 6, as follows: +** +** 0: Not a match. +** 1: UTF8/16 conversion required and function takes any number of arguments. +** 2: UTF16 byte order change required and function takes any number of args. +** 3: encoding matches and function takes any number of arguments +** 4: UTF8/16 conversion required - argument count matches exactly +** 5: UTF16 byte order conversion required - argument count matches exactly +** 6: Perfect match: encoding and argument count match exactly. +** +** If nArg==(-2) then any function with a non-null xSFunc is +** a perfect match and any function with xSFunc NULL is +** a non-match. +*/ +#define FUNC_PERFECT_MATCH 6 /* The score for a perfect match */ +static int matchQuality( + FuncDef *p, /* The function we are evaluating for match quality */ + int nArg, /* Desired number of arguments. (-1)==any */ + u8 enc /* Desired text encoding */ +){ + int match; + assert( p->nArg>=-1 ); + + /* Wrong number of arguments means "no match" */ + if( p->nArg!=nArg ){ + if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; + if( p->nArg>=0 ) return 0; + } + + /* Give a better score to a function with a specific number of arguments + ** than to function that accepts any number of arguments. */ + if( p->nArg==nArg ){ + match = 4; + }else{ + match = 1; + } + + /* Bonus points if the text encoding matches */ + if( enc==(p->funcFlags & SQLITE_FUNC_ENCMASK) ){ + match += 2; /* Exact encoding match */ + }else if( (enc & p->funcFlags & 2)!=0 ){ + match += 1; /* Both are UTF16, but with different byte orders */ + } + + return match; +} + +/* +** Search a FuncDefHash for a function with the given name. Return +** a pointer to the matching FuncDef if found, or 0 if there is no match. +*/ +SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch( + int h, /* Hash of the name */ + const char *zFunc /* Name of function */ +){ + FuncDef *p; + for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){ + if( sqlite3StrICmp(p->zName, zFunc)==0 ){ + return p; + } + } + return 0; +} + +/* +** Insert a new FuncDef into a FuncDefHash hash table. +*/ +SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs( + FuncDef *aDef, /* List of global functions to be inserted */ + int nDef /* Length of the apDef[] list */ +){ + int i; + for(i=0; i='a' && zName[0]<='z' ); + pOther = sqlite3FunctionSearch(h, zName); + if( pOther ){ + assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] ); + aDef[i].pNext = pOther->pNext; + pOther->pNext = &aDef[i]; + }else{ + aDef[i].pNext = 0; + aDef[i].u.pHash = sqlite3BuiltinFunctions.a[h]; + sqlite3BuiltinFunctions.a[h] = &aDef[i]; + } + } +} + + + +/* +** Locate a user function given a name, a number of arguments and a flag +** indicating whether the function prefers UTF-16 over UTF-8. Return a +** pointer to the FuncDef structure that defines that function, or return +** NULL if the function does not exist. +** +** If the createFlag argument is true, then a new (blank) FuncDef +** structure is created and liked into the "db" structure if a +** no matching function previously existed. +** +** If nArg is -2, then the first valid function found is returned. A +** function is valid if xSFunc is non-zero. The nArg==(-2) +** case is used to see if zName is a valid function name for some number +** of arguments. If nArg is -2, then createFlag must be 0. +** +** If createFlag is false, then a function with the required name and +** number of arguments may be returned even if the eTextRep flag does not +** match that requested. +*/ +SQLITE_PRIVATE FuncDef *sqlite3FindFunction( + sqlite3 *db, /* An open database */ + const char *zName, /* Name of the function. zero-terminated */ + int nArg, /* Number of arguments. -1 means any number */ + u8 enc, /* Preferred text encoding */ + u8 createFlag /* Create new entry if true and does not otherwise exist */ +){ + FuncDef *p; /* Iterator variable */ + FuncDef *pBest = 0; /* Best match found so far */ + int bestScore = 0; /* Score of best match */ + int h; /* Hash value */ + int nName; /* Length of the name */ + + assert( nArg>=(-2) ); + assert( nArg>=(-1) || createFlag==0 ); + nName = sqlite3Strlen30(zName); + + /* First search for a match amongst the application-defined functions. + */ + p = (FuncDef*)sqlite3HashFind(&db->aFunc, zName); + while( p ){ + int score = matchQuality(p, nArg, enc); + if( score>bestScore ){ + pBest = p; + bestScore = score; + } + p = p->pNext; + } + + /* If no match is found, search the built-in functions. + ** + ** If the DBFLAG_PreferBuiltin flag is set, then search the built-in + ** functions even if a prior app-defined function was found. And give + ** priority to built-in functions. + ** + ** Except, if createFlag is true, that means that we are trying to + ** install a new function. Whatever FuncDef structure is returned it will + ** have fields overwritten with new information appropriate for the + ** new function. But the FuncDefs for built-in functions are read-only. + ** So we must not search for built-ins when creating a new function. + */ + if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){ + bestScore = 0; + h = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zName[0]], nName); + p = sqlite3FunctionSearch(h, zName); + while( p ){ + int score = matchQuality(p, nArg, enc); + if( score>bestScore ){ + pBest = p; + bestScore = score; + } + p = p->pNext; + } + } + + /* If the createFlag parameter is true and the search did not reveal an + ** exact match for the name, number of arguments and encoding, then add a + ** new entry to the hash table and return it. + */ + if( createFlag && bestScorezName = (const char*)&pBest[1]; + pBest->nArg = (u16)nArg; + pBest->funcFlags = enc; + memcpy((char*)&pBest[1], zName, nName+1); + for(z=(u8*)pBest->zName; *z; z++) *z = sqlite3UpperToLower[*z]; + pOther = (FuncDef*)sqlite3HashInsert(&db->aFunc, pBest->zName, pBest); + if( pOther==pBest ){ + sqlite3DbFree(db, pBest); + sqlite3OomFault(db); + return 0; + }else{ + pBest->pNext = pOther; + } + } + + if( pBest && (pBest->xSFunc || createFlag) ){ + return pBest; + } + return 0; +} + +/* +** Free all resources held by the schema structure. The void* argument points +** at a Schema struct. This function does not call sqlite3DbFree(db, ) on the +** pointer itself, it just cleans up subsidiary resources (i.e. the contents +** of the schema hash tables). +** +** The Schema.cache_size variable is not cleared. +*/ +SQLITE_PRIVATE void sqlite3SchemaClear(void *p){ + Hash temp1; + Hash temp2; + HashElem *pElem; + Schema *pSchema = (Schema *)p; + + temp1 = pSchema->tblHash; + temp2 = pSchema->trigHash; + sqlite3HashInit(&pSchema->trigHash); + sqlite3HashClear(&pSchema->idxHash); + for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){ + sqlite3DeleteTrigger(0, (Trigger*)sqliteHashData(pElem)); + } + sqlite3HashClear(&temp2); + sqlite3HashInit(&pSchema->tblHash); + for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){ + Table *pTab = sqliteHashData(pElem); + sqlite3DeleteTable(0, pTab); + } + sqlite3HashClear(&temp1); + sqlite3HashClear(&pSchema->fkeyHash); + pSchema->pSeqTab = 0; + if( pSchema->schemaFlags & DB_SchemaLoaded ){ + pSchema->iGeneration++; + } + pSchema->schemaFlags &= ~(DB_SchemaLoaded|DB_ResetWanted); +} + +/* +** Find and return the schema associated with a BTree. Create +** a new one if necessary. +*/ +SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ + Schema * p; + if( pBt ){ + p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaClear); + }else{ + p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema)); + } + if( !p ){ + sqlite3OomFault(db); + }else if ( 0==p->file_format ){ + sqlite3HashInit(&p->tblHash); + sqlite3HashInit(&p->idxHash); + sqlite3HashInit(&p->trigHash); + sqlite3HashInit(&p->fkeyHash); + p->enc = SQLITE_UTF8; + } + return p; +} + +/************** End of callback.c ********************************************/ +/************** Begin file delete.c ******************************************/ +/* +** 2001 September 15 +** +** 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 C code routines that are called by the parser +** in order to generate code for DELETE FROM statements. +*/ +/* #include "sqliteInt.h" */ + +/* +** While a SrcList can in general represent multiple tables and subqueries +** (as in the FROM clause of a SELECT statement) in this case it contains +** the name of a single table, as one might find in an INSERT, DELETE, +** or UPDATE statement. Look up that table in the symbol table and +** return a pointer. Set an error message and return NULL if the table +** name is not found or if any other error occurs. +** +** The following fields are initialized appropriate in pSrc: +** +** pSrc->a[0].pTab Pointer to the Table object +** pSrc->a[0].pIndex Pointer to the INDEXED BY index, if there is one +** +*/ +SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ + struct SrcList_item *pItem = pSrc->a; + Table *pTab; + assert( pItem && pSrc->nSrc==1 ); + pTab = sqlite3LocateTableItem(pParse, 0, pItem); + sqlite3DeleteTable(pParse->db, pItem->pTab); + pItem->pTab = pTab; + if( pTab ){ + pTab->nTabRef++; + } + if( sqlite3IndexedByLookup(pParse, pItem) ){ + pTab = 0; + } + return pTab; +} + +/* Return true if table pTab is read-only. +** +** A table is read-only if any of the following are true: +** +** 1) It is a virtual table and no implementation of the xUpdate method +** has been provided +** +** 2) It is a system table (i.e. sqlite_master), this call is not +** part of a nested parse and writable_schema pragma has not +** been specified +** +** 3) The table is a shadow table, the database connection is in +** defensive mode, and the current sqlite3_prepare() +** is for a top-level SQL statement. +*/ +static int tabIsReadOnly(Parse *pParse, Table *pTab){ + sqlite3 *db; + if( IsVirtual(pTab) ){ + return sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0; + } + if( (pTab->tabFlags & (TF_Readonly|TF_Shadow))==0 ) return 0; + db = pParse->db; + if( (pTab->tabFlags & TF_Readonly)!=0 ){ + return sqlite3WritableSchema(db)==0 && pParse->nested==0; + } + assert( pTab->tabFlags & TF_Shadow ); + return sqlite3ReadOnlyShadowTables(db); +} + +/* +** Check to make sure the given table is writable. If it is not +** writable, generate an error message and return 1. If it is +** writable return 0; +*/ +SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ + if( tabIsReadOnly(pParse, pTab) ){ + sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); + return 1; + } +#ifndef SQLITE_OMIT_VIEW + if( !viewOk && pTab->pSelect ){ + sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); + return 1; + } +#endif + return 0; +} + + +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) +/* +** Evaluate a view and store its result in an ephemeral table. The +** pWhere argument is an optional WHERE clause that restricts the +** set of rows in the view that are to be added to the ephemeral table. +*/ +SQLITE_PRIVATE void sqlite3MaterializeView( + Parse *pParse, /* Parsing context */ + Table *pView, /* View definition */ + Expr *pWhere, /* Optional WHERE clause to be added */ + ExprList *pOrderBy, /* Optional ORDER BY clause */ + Expr *pLimit, /* Optional LIMIT clause */ + int iCur /* Cursor number for ephemeral table */ +){ + SelectDest dest; + Select *pSel; + SrcList *pFrom; + sqlite3 *db = pParse->db; + int iDb = sqlite3SchemaToIndex(db, pView->pSchema); + pWhere = sqlite3ExprDup(db, pWhere, 0); + pFrom = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pFrom ){ + assert( pFrom->nSrc==1 ); + pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); + pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName); + assert( pFrom->a[0].pOn==0 ); + assert( pFrom->a[0].pUsing==0 ); + } + pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy, + SF_IncludeHidden, pLimit); + sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur); + sqlite3Select(pParse, pSel, &dest); + sqlite3SelectDelete(db, pSel); +} +#endif /* !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) */ + +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) +/* +** Generate an expression tree to implement the WHERE, ORDER BY, +** and LIMIT/OFFSET portion of DELETE and UPDATE statements. +** +** DELETE FROM table_wxyz WHERE a<5 ORDER BY a LIMIT 1; +** \__________________________/ +** pLimitWhere (pInClause) +*/ +SQLITE_PRIVATE Expr *sqlite3LimitWhere( + Parse *pParse, /* The parser context */ + SrcList *pSrc, /* the FROM clause -- which tables to scan */ + Expr *pWhere, /* The WHERE clause. May be null */ + ExprList *pOrderBy, /* The ORDER BY clause. May be null */ + Expr *pLimit, /* The LIMIT clause. May be null */ + char *zStmtType /* Either DELETE or UPDATE. For err msgs. */ +){ + sqlite3 *db = pParse->db; + Expr *pLhs = NULL; /* LHS of IN(SELECT...) operator */ + Expr *pInClause = NULL; /* WHERE rowid IN ( select ) */ + ExprList *pEList = NULL; /* Expression list contaning only pSelectRowid */ + SrcList *pSelectSrc = NULL; /* SELECT rowid FROM x ... (dup of pSrc) */ + Select *pSelect = NULL; /* Complete SELECT tree */ + Table *pTab; + + /* Check that there isn't an ORDER BY without a LIMIT clause. + */ + if( pOrderBy && pLimit==0 ) { + sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType); + sqlite3ExprDelete(pParse->db, pWhere); + sqlite3ExprListDelete(pParse->db, pOrderBy); + return 0; + } + + /* We only need to generate a select expression if there + ** is a limit/offset term to enforce. + */ + if( pLimit == 0 ) { + return pWhere; + } + + /* Generate a select expression tree to enforce the limit/offset + ** term for the DELETE or UPDATE statement. For example: + ** DELETE FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1 + ** becomes: + ** DELETE FROM table_a WHERE rowid IN ( + ** SELECT rowid FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1 + ** ); + */ + + pTab = pSrc->a[0].pTab; + if( HasRowid(pTab) ){ + pLhs = sqlite3PExpr(pParse, TK_ROW, 0, 0); + pEList = sqlite3ExprListAppend( + pParse, 0, sqlite3PExpr(pParse, TK_ROW, 0, 0) + ); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + if( pPk->nKeyCol==1 ){ + const char *zName = pTab->aCol[pPk->aiColumn[0]].zName; + pLhs = sqlite3Expr(db, TK_ID, zName); + pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, zName)); + }else{ + int i; + for(i=0; inKeyCol; i++){ + Expr *p = sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zName); + pEList = sqlite3ExprListAppend(pParse, pEList, p); + } + pLhs = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); + if( pLhs ){ + pLhs->x.pList = sqlite3ExprListDup(db, pEList, 0); + } + } + } + + /* duplicate the FROM clause as it is needed by both the DELETE/UPDATE tree + ** and the SELECT subtree. */ + pSrc->a[0].pTab = 0; + pSelectSrc = sqlite3SrcListDup(pParse->db, pSrc, 0); + pSrc->a[0].pTab = pTab; + pSrc->a[0].pIBIndex = 0; + + /* generate the SELECT expression tree. */ + pSelect = sqlite3SelectNew(pParse, pEList, pSelectSrc, pWhere, 0 ,0, + pOrderBy,0,pLimit + ); + + /* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */ + pInClause = sqlite3PExpr(pParse, TK_IN, pLhs, 0); + sqlite3PExprAddSelect(pParse, pInClause, pSelect); + return pInClause; +} +#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) */ + /* && !defined(SQLITE_OMIT_SUBQUERY) */ + +/* +** Generate code for a DELETE FROM statement. +** +** DELETE FROM table_wxyz WHERE a<5 AND b NOT NULL; +** \________/ \________________/ +** pTabList pWhere +*/ +SQLITE_PRIVATE void sqlite3DeleteFrom( + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* The table from which we should delete things */ + Expr *pWhere, /* The WHERE clause. May be null */ + ExprList *pOrderBy, /* ORDER BY clause. May be null */ + Expr *pLimit /* LIMIT clause. May be null */ +){ + Vdbe *v; /* The virtual database engine */ + Table *pTab; /* The table from which records will be deleted */ + int i; /* Loop counter */ + WhereInfo *pWInfo; /* Information about the WHERE clause */ + Index *pIdx; /* For looping over indices of the table */ + int iTabCur; /* Cursor number for the table */ + int iDataCur = 0; /* VDBE cursor for the canonical data source */ + int iIdxCur = 0; /* Cursor number of the first index */ + int nIdx; /* Number of indices */ + sqlite3 *db; /* Main database structure */ + AuthContext sContext; /* Authorization context */ + NameContext sNC; /* Name context to resolve expressions in */ + int iDb; /* Database number */ + int memCnt = 0; /* Memory cell used for change counting */ + int rcauth; /* Value returned by authorization callback */ + int eOnePass; /* ONEPASS_OFF or _SINGLE or _MULTI */ + int aiCurOnePass[2]; /* The write cursors opened by WHERE_ONEPASS */ + u8 *aToOpen = 0; /* Open cursor iTabCur+j if aToOpen[j] is true */ + Index *pPk; /* The PRIMARY KEY index on the table */ + int iPk = 0; /* First of nPk registers holding PRIMARY KEY value */ + i16 nPk = 1; /* Number of columns in the PRIMARY KEY */ + int iKey; /* Memory cell holding key of row to be deleted */ + i16 nKey; /* Number of memory cells in the row key */ + int iEphCur = 0; /* Ephemeral table holding all primary key values */ + int iRowSet = 0; /* Register for rowset of rows to delete */ + int addrBypass = 0; /* Address of jump over the delete logic */ + int addrLoop = 0; /* Top of the delete loop */ + int addrEphOpen = 0; /* Instruction to open the Ephemeral table */ + int bComplex; /* True if there are triggers or FKs or + ** subqueries in the WHERE clause */ + +#ifndef SQLITE_OMIT_TRIGGER + int isView; /* True if attempting to delete from a view */ + Trigger *pTrigger; /* List of table triggers, if required */ +#endif + + memset(&sContext, 0, sizeof(sContext)); + db = pParse->db; + if( pParse->nErr || db->mallocFailed ){ + goto delete_from_cleanup; + } + assert( pTabList->nSrc==1 ); + + + /* Locate the table which we want to delete. This table has to be + ** put in an SrcList structure because some of the subroutines we + ** will be calling are designed to work with multiple tables and expect + ** an SrcList* parameter instead of just a Table* parameter. + */ + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ) goto delete_from_cleanup; + + /* Figure out if we have any triggers and if the table being + ** deleted from is a view + */ +#ifndef SQLITE_OMIT_TRIGGER + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); + isView = pTab->pSelect!=0; +#else +# define pTrigger 0 +# define isView 0 +#endif + bComplex = pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0); +#ifdef SQLITE_OMIT_VIEW +# undef isView +# define isView 0 +#endif + +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( !isView ){ + pWhere = sqlite3LimitWhere( + pParse, pTabList, pWhere, pOrderBy, pLimit, "DELETE" + ); + pOrderBy = 0; + pLimit = 0; + } +#endif + + /* If pTab is really a view, make sure it has been initialized. + */ + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto delete_from_cleanup; + } + + if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){ + goto delete_from_cleanup; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDbnDb ); + rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, + db->aDb[iDb].zDbSName); + assert( rcauth==SQLITE_OK || rcauth==SQLITE_DENY || rcauth==SQLITE_IGNORE ); + if( rcauth==SQLITE_DENY ){ + goto delete_from_cleanup; + } + assert(!isView || pTrigger); + + /* Assign cursor numbers to the table and all its indices. + */ + assert( pTabList->nSrc==1 ); + iTabCur = pTabList->a[0].iCursor = pParse->nTab++; + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ + pParse->nTab++; + } + + /* Start the view context + */ + if( isView ){ + sqlite3AuthContextPush(pParse, &sContext, pTab->zName); + } + + /* Begin generating code. + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ){ + goto delete_from_cleanup; + } + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, bComplex, iDb); + + /* If we are trying to delete from a view, realize that view into + ** an ephemeral table. + */ +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) + if( isView ){ + sqlite3MaterializeView(pParse, pTab, + pWhere, pOrderBy, pLimit, iTabCur + ); + iDataCur = iIdxCur = iTabCur; + pOrderBy = 0; + pLimit = 0; + } +#endif + + /* Resolve the column names in the WHERE clause. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + if( sqlite3ResolveExprNames(&sNC, pWhere) ){ + goto delete_from_cleanup; + } + + /* Initialize the counter of the number of rows deleted, if + ** we are counting rows. + */ + if( (db->flags & SQLITE_CountRows)!=0 + && !pParse->nested + && !pParse->pTriggerTab + ){ + memCnt = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt); + } + +#ifndef SQLITE_OMIT_TRUNCATE_OPTIMIZATION + /* Special case: A DELETE without a WHERE clause deletes everything. + ** It is easier just to erase the whole table. Prior to version 3.6.5, + ** this optimization caused the row change count (the value returned by + ** API function sqlite3_count_changes) to be set incorrectly. + ** + ** The "rcauth==SQLITE_OK" terms is the + ** IMPLEMENTATION-OF: R-17228-37124 If the action code is SQLITE_DELETE and + ** the callback returns SQLITE_IGNORE then the DELETE operation proceeds but + ** the truncate optimization is disabled and all rows are deleted + ** individually. + */ + if( rcauth==SQLITE_OK + && pWhere==0 + && !bComplex + && !IsVirtual(pTab) +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + && db->xPreUpdateCallback==0 +#endif + ){ + assert( !isView ); + sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt ? memCnt : -1, + pTab->zName, P4_STATIC); + } + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->pSchema==pTab->pSchema ); + sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb); + } + }else +#endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */ + { + u16 wcf = WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK|WHERE_SEEK_TABLE; + if( sNC.ncFlags & NC_VarSelect ) bComplex = 1; + wcf |= (bComplex ? 0 : WHERE_ONEPASS_MULTIROW); + if( HasRowid(pTab) ){ + /* For a rowid table, initialize the RowSet to an empty set */ + pPk = 0; + nPk = 1; + iRowSet = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, iRowSet); + }else{ + /* For a WITHOUT ROWID table, create an ephemeral table used to + ** hold all primary keys for rows to be deleted. */ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + nPk = pPk->nKeyCol; + iPk = pParse->nMem+1; + pParse->nMem += nPk; + iEphCur = pParse->nTab++; + addrEphOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEphCur, nPk); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + + /* Construct a query to find the rowid or primary key for every row + ** to be deleted, based on the WHERE clause. Set variable eOnePass + ** to indicate the strategy used to implement this delete: + ** + ** ONEPASS_OFF: Two-pass approach - use a FIFO for rowids/PK values. + ** ONEPASS_SINGLE: One-pass approach - at most one row deleted. + ** ONEPASS_MULTI: One-pass approach - any number of rows may be deleted. + */ + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, wcf, iTabCur+1); + 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 ); + if( eOnePass!=ONEPASS_SINGLE ) sqlite3MultiWrite(pParse); + + /* Keep track of the number of rows to be deleted */ + if( memCnt ){ + sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1); + } + + /* Extract the rowid or primary key for the current row */ + if( pPk ){ + for(i=0; iaiColumn[i]>=0 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, + pPk->aiColumn[i], iPk+i); + } + iKey = iPk; + }else{ + iKey = ++pParse->nMem; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, -1, iKey); + } + + if( eOnePass!=ONEPASS_OFF ){ + /* For ONEPASS, no need to store the rowid/primary-key. There is only + ** one, so just keep it in its register(s) and fall through to the + ** delete code. */ + nKey = nPk; /* OP_Found will use an unpacked key */ + aToOpen = sqlite3DbMallocRawNN(db, nIdx+2); + if( aToOpen==0 ){ + sqlite3WhereEnd(pWInfo); + goto delete_from_cleanup; + } + memset(aToOpen, 1, nIdx+1); + aToOpen[nIdx+1] = 0; + if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iTabCur] = 0; + if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iTabCur] = 0; + if( addrEphOpen ) sqlite3VdbeChangeToNoop(v, addrEphOpen); + }else{ + if( pPk ){ + /* Add the PK key for this row to the temporary table */ + iKey = ++pParse->nMem; + nKey = 0; /* Zero tells OP_Found to use a composite key */ + sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, iKey, + sqlite3IndexAffinityStr(pParse->db, pPk), nPk); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEphCur, iKey, iPk, nPk); + }else{ + /* Add the rowid of the row to be deleted to the RowSet */ + nKey = 1; /* OP_DeferredSeek always uses a single rowid */ + sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, iKey); + } + } + + /* If this DELETE cannot use the ONEPASS strategy, this is the + ** end of the WHERE loop */ + if( eOnePass!=ONEPASS_OFF ){ + addrBypass = sqlite3VdbeMakeLabel(pParse); + }else{ + sqlite3WhereEnd(pWInfo); + } + + /* Unless this is a view, open cursors for the table we are + ** deleting from and all its indices. If this is a view, then the + ** only effect this statement has is to fire the INSTEAD OF + ** triggers. + */ + if( !isView ){ + int iAddrOnce = 0; + if( eOnePass==ONEPASS_MULTI ){ + iAddrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + testcase( IsVirtual(pTab) ); + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, OPFLAG_FORDELETE, + iTabCur, aToOpen, &iDataCur, &iIdxCur); + assert( pPk || IsVirtual(pTab) || iDataCur==iTabCur ); + assert( pPk || IsVirtual(pTab) || iIdxCur==iDataCur+1 ); + if( eOnePass==ONEPASS_MULTI ){ + sqlite3VdbeJumpHereOrPopInst(v, iAddrOnce); + } + } + + /* Set up a loop over the rowids/primary-keys that were found in the + ** where-clause loop above. + */ + if( eOnePass!=ONEPASS_OFF ){ + assert( nKey==nPk ); /* OP_Found will use an unpacked key */ + if( !IsVirtual(pTab) && aToOpen[iDataCur-iTabCur] ){ + assert( pPk!=0 || pTab->pSelect!=0 ); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey); + VdbeCoverage(v); + } + }else if( pPk ){ + addrLoop = sqlite3VdbeAddOp1(v, OP_Rewind, iEphCur); VdbeCoverage(v); + if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp3(v, OP_Column, iEphCur, 0, iKey); + }else{ + sqlite3VdbeAddOp2(v, OP_RowData, iEphCur, iKey); + } + assert( nKey==0 ); /* OP_Found will use a composite key */ + }else{ + addrLoop = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, 0, iKey); + VdbeCoverage(v); + assert( nKey==1 ); + } + + /* Delete the row */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + sqlite3VtabMakeWritable(pParse, pTab); + assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); + sqlite3MayAbort(pParse); + if( eOnePass==ONEPASS_SINGLE ){ + sqlite3VdbeAddOp1(v, OP_Close, iTabCur); + if( sqlite3IsToplevel(pParse) ){ + pParse->isMultiWrite = 0; + } + } + sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB); + sqlite3VdbeChangeP5(v, OE_Abort); + }else +#endif + { + int count = (pParse->nested==0); /* True to count changes */ + sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, + iKey, nKey, count, OE_Default, eOnePass, aiCurOnePass[1]); + } + + /* End of the loop over all rowids/primary-keys. */ + if( eOnePass!=ONEPASS_OFF ){ + sqlite3VdbeResolveLabel(v, addrBypass); + sqlite3WhereEnd(pWInfo); + }else if( pPk ){ + sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrLoop); + }else{ + sqlite3VdbeGoto(v, addrLoop); + sqlite3VdbeJumpHere(v, addrLoop); + } + } /* End non-truncate path */ + + /* Update the sqlite_sequence table by storing the content of the + ** maximum rowid counter values recorded while inserting into + ** autoincrement tables. + */ + if( pParse->nested==0 && pParse->pTriggerTab==0 ){ + sqlite3AutoincrementEnd(pParse); + } + + /* Return the number of rows that were deleted. If this routine is + ** generating code because of a call to sqlite3NestedParse(), do not + ** invoke the callback function. + */ + if( memCnt ){ + sqlite3VdbeAddOp2(v, OP_ResultRow, memCnt, 1); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", SQLITE_STATIC); + } + +delete_from_cleanup: + sqlite3AuthContextPop(&sContext); + sqlite3SrcListDelete(db, pTabList); + sqlite3ExprDelete(db, pWhere); +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) + sqlite3ExprListDelete(db, pOrderBy); + sqlite3ExprDelete(db, pLimit); +#endif + sqlite3DbFree(db, aToOpen); + return; +} +/* Make sure "isView" and other macros defined above are undefined. Otherwise +** they may interfere with compilation of other functions in this file +** (or in another file, if this file becomes part of the amalgamation). */ +#ifdef isView + #undef isView +#endif +#ifdef pTrigger + #undef pTrigger +#endif + +/* +** This routine generates VDBE code that causes a single row of a +** single table to be deleted. Both the original table entry and +** all indices are removed. +** +** Preconditions: +** +** 1. iDataCur is an open cursor on the btree that is the canonical data +** store for the table. (This will be either the table itself, +** in the case of a rowid table, or the PRIMARY KEY index in the case +** of a WITHOUT ROWID table.) +** +** 2. Read/write cursors for all indices of pTab must be open as +** cursor number iIdxCur+i for the i-th index. +** +** 3. The primary key for the row to be deleted must be stored in a +** sequence of nPk memory cells starting at iPk. If nPk==0 that means +** that a search record formed from OP_MakeRecord is contained in the +** single memory location iPk. +** +** eMode: +** Parameter eMode may be passed either ONEPASS_OFF (0), ONEPASS_SINGLE, or +** ONEPASS_MULTI. If eMode is not ONEPASS_OFF, then the cursor +** iDataCur already points to the row to delete. If eMode is ONEPASS_OFF +** then this function must seek iDataCur to the entry identified by iPk +** and nPk before reading from it. +** +** If eMode is ONEPASS_MULTI, then this call is being made as part +** of a ONEPASS delete that affects multiple rows. In this case, if +** iIdxNoSeek is a valid cursor number (>=0) and is not the same as +** iDataCur, then its position should be preserved following the delete +** operation. Or, if iIdxNoSeek is not a valid cursor number, the +** position of iDataCur should be preserved instead. +** +** iIdxNoSeek: +** If iIdxNoSeek is a valid cursor number (>=0) not equal to iDataCur, +** then it identifies an index cursor (from within array of cursors +** starting at iIdxCur) that already points to the index entry to be deleted. +** Except, this optimization is disabled if there are BEFORE triggers since +** the trigger body might have moved the cursor. +*/ +SQLITE_PRIVATE void sqlite3GenerateRowDelete( + Parse *pParse, /* Parsing context */ + Table *pTab, /* Table containing the row to be deleted */ + Trigger *pTrigger, /* List of triggers to (potentially) fire */ + int iDataCur, /* Cursor from which column data is extracted */ + int iIdxCur, /* First index cursor */ + int iPk, /* First memory cell containing the PRIMARY KEY */ + i16 nPk, /* Number of PRIMARY KEY memory cells */ + u8 count, /* If non-zero, increment the row change counter */ + u8 onconf, /* Default ON CONFLICT policy for triggers */ + u8 eMode, /* ONEPASS_OFF, _SINGLE, or _MULTI. See above */ + int iIdxNoSeek /* Cursor number of cursor that does not need seeking */ +){ + Vdbe *v = pParse->pVdbe; /* Vdbe */ + int iOld = 0; /* First register in OLD.* array */ + int iLabel; /* Label resolved to end of generated code */ + u8 opSeek; /* Seek opcode */ + + /* Vdbe is guaranteed to have been allocated by this stage. */ + assert( v ); + VdbeModuleComment((v, "BEGIN: GenRowDel(%d,%d,%d,%d)", + iDataCur, iIdxCur, iPk, (int)nPk)); + + /* Seek cursor iCur to the row to delete. If this row no longer exists + ** (this can happen if a trigger program has already deleted it), do + ** not attempt to delete it or fire any DELETE triggers. */ + iLabel = sqlite3VdbeMakeLabel(pParse); + opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound; + if( eMode==ONEPASS_OFF ){ + sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); + VdbeCoverageIf(v, opSeek==OP_NotExists); + VdbeCoverageIf(v, opSeek==OP_NotFound); + } + + /* If there are any triggers to fire, allocate a range of registers to + ** use for the old.* references in the triggers. */ + if( sqlite3FkRequired(pParse, pTab, 0, 0) || pTrigger ){ + u32 mask; /* Mask of OLD.* columns in use */ + int iCol; /* Iterator used while populating OLD.* */ + int addrStart; /* Start of BEFORE trigger programs */ + + /* TODO: Could use temporary registers here. Also could attempt to + ** avoid copying the contents of the rowid register. */ + mask = sqlite3TriggerColmask( + pParse, pTrigger, 0, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onconf + ); + mask |= sqlite3FkOldmask(pParse, pTab); + iOld = pParse->nMem+1; + pParse->nMem += (1 + pTab->nCol); + + /* Populate the OLD.* pseudo-table register array. These values will be + ** used by any BEFORE and AFTER triggers that exist. */ + sqlite3VdbeAddOp2(v, OP_Copy, iPk, iOld); + for(iCol=0; iColnCol; iCol++){ + testcase( mask!=0xffffffff && iCol==31 ); + testcase( mask!=0xffffffff && iCol==32 ); + if( mask==0xffffffff || (iCol<=31 && (mask & MASKBIT32(iCol))!=0) ){ + int kk = sqlite3TableColumnToStorage(pTab, iCol); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, iCol, iOld+kk+1); + } + } + + /* Invoke BEFORE DELETE trigger programs. */ + addrStart = sqlite3VdbeCurrentAddr(v); + sqlite3CodeRowTrigger(pParse, pTrigger, + TK_DELETE, 0, TRIGGER_BEFORE, pTab, iOld, onconf, iLabel + ); + + /* If any BEFORE triggers were coded, then seek the cursor to the + ** row to be deleted again. It may be that the BEFORE triggers moved + ** the cursor or already deleted the row that the cursor was + ** pointing to. + ** + ** Also disable the iIdxNoSeek optimization since the BEFORE trigger + ** may have moved that cursor. + */ + if( addrStart=0 ); + iIdxNoSeek = -1; + } + + /* Do FK processing. This call checks that any FK constraints that + ** refer to this table (i.e. constraints attached to other tables) + ** are not violated by deleting this row. */ + sqlite3FkCheck(pParse, pTab, iOld, 0, 0, 0); + } + + /* Delete the index and table entries. Skip this step if pTab is really + ** a view (in which case the only effect of the DELETE statement is to + ** fire the INSTEAD OF triggers). + ** + ** If variable 'count' is non-zero, then this OP_Delete instruction should + ** invoke the update-hook. The pre-update-hook, on the other hand should + ** be invoked unless table pTab is a system table. The difference is that + ** the update-hook is not invoked for rows removed by REPLACE, but the + ** pre-update-hook is. + */ + if( pTab->pSelect==0 ){ + u8 p5 = 0; + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,iIdxNoSeek); + sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0)); + if( pParse->nested==0 || 0==sqlite3_stricmp(pTab->zName, "sqlite_stat1") ){ + sqlite3VdbeAppendP4(v, (char*)pTab, P4_TABLE); + } + if( eMode!=ONEPASS_OFF ){ + sqlite3VdbeChangeP5(v, OPFLAG_AUXDELETE); + } + if( iIdxNoSeek>=0 && iIdxNoSeek!=iDataCur ){ + sqlite3VdbeAddOp1(v, OP_Delete, iIdxNoSeek); + } + if( eMode==ONEPASS_MULTI ) p5 |= OPFLAG_SAVEPOSITION; + sqlite3VdbeChangeP5(v, p5); + } + + /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to + ** handle rows (possibly in other tables) that refer via a foreign key + ** to the row just deleted. */ + sqlite3FkActions(pParse, pTab, 0, iOld, 0, 0); + + /* Invoke AFTER DELETE trigger programs. */ + sqlite3CodeRowTrigger(pParse, pTrigger, + TK_DELETE, 0, TRIGGER_AFTER, pTab, iOld, onconf, iLabel + ); + + /* Jump here if the row had already been deleted before any BEFORE + ** trigger programs were invoked. Or if a trigger program throws a + ** RAISE(IGNORE) exception. */ + sqlite3VdbeResolveLabel(v, iLabel); + VdbeModuleComment((v, "END: GenRowDel()")); +} + +/* +** This routine generates VDBE code that causes the deletion of all +** index entries associated with a single row of a single table, pTab +** +** Preconditions: +** +** 1. A read/write cursor "iDataCur" must be open on the canonical storage +** btree for the table pTab. (This will be either the table itself +** for rowid tables or to the primary key index for WITHOUT ROWID +** tables.) +** +** 2. Read/write cursors for all indices of pTab must be open as +** cursor number iIdxCur+i for the i-th index. (The pTab->pIndex +** index is the 0-th index.) +** +** 3. The "iDataCur" cursor must be already be positioned on the row +** that is to be deleted. +*/ +SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete( + Parse *pParse, /* Parsing and code generating context */ + Table *pTab, /* Table containing the row to be deleted */ + int iDataCur, /* Cursor of table holding data. */ + int iIdxCur, /* First index cursor */ + int *aRegIdx, /* Only delete if aRegIdx!=0 && aRegIdx[i]>0 */ + int iIdxNoSeek /* Do not delete from this cursor */ +){ + int i; /* Index loop counter */ + int r1 = -1; /* Register holding an index key */ + int iPartIdxLabel; /* Jump destination for skipping partial index entries */ + Index *pIdx; /* Current index */ + Index *pPrior = 0; /* Prior index */ + Vdbe *v; /* The prepared statement under construction */ + Index *pPk; /* PRIMARY KEY index, or NULL for rowid tables */ + + v = pParse->pVdbe; + pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); + for(i=0, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ + assert( iIdxCur+i!=iDataCur || pPk==pIdx ); + if( aRegIdx!=0 && aRegIdx[i]==0 ) continue; + if( pIdx==pPk ) continue; + if( iIdxCur+i==iIdxNoSeek ) continue; + VdbeModuleComment((v, "GenRowIdxDel for %s", pIdx->zName)); + r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 1, + &iPartIdxLabel, pPrior, r1); + sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1, + pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn); + sqlite3VdbeChangeP5(v, 1); /* Cause IdxDelete to error if no entry found */ + sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel); + pPrior = pIdx; + } +} + +/* +** Generate code that will assemble an index key and stores it in register +** regOut. The key with be for index pIdx which is an index on pTab. +** iCur is the index of a cursor open on the pTab table and pointing to +** the entry that needs indexing. If pTab is a WITHOUT ROWID table, then +** iCur must be the cursor of the PRIMARY KEY index. +** +** Return a register number which is the first in a block of +** registers that holds the elements of the index key. The +** block of registers has already been deallocated by the time +** this routine returns. +** +** If *piPartIdxLabel is not NULL, fill it in with a label and jump +** to that label if pIdx is a partial index that should be skipped. +** The label should be resolved using sqlite3ResolvePartIdxLabel(). +** A partial index should be skipped if its WHERE clause evaluates +** to false or null. If pIdx is not a partial index, *piPartIdxLabel +** will be set to zero which is an empty label that is ignored by +** sqlite3ResolvePartIdxLabel(). +** +** The pPrior and regPrior parameters are used to implement a cache to +** avoid unnecessary register loads. If pPrior is not NULL, then it is +** a pointer to a different index for which an index key has just been +** computed into register regPrior. If the current pIdx index is generating +** its key into the same sequence of registers and if pPrior and pIdx share +** a column in common, then the register corresponding to that column already +** holds the correct value and the loading of that register is skipped. +** This optimization is helpful when doing a DELETE or an INTEGRITY_CHECK +** on a table with multiple indices, and especially with the ROWID or +** PRIMARY KEY columns of the index. +*/ +SQLITE_PRIVATE int sqlite3GenerateIndexKey( + Parse *pParse, /* Parsing context */ + Index *pIdx, /* The index for which to generate a key */ + int iDataCur, /* Cursor number from which to take column data */ + int regOut, /* Put the new key into this register if not 0 */ + int prefixOnly, /* Compute only a unique prefix of the key */ + int *piPartIdxLabel, /* OUT: Jump to this label to skip partial index */ + Index *pPrior, /* Previously generated index key */ + int regPrior /* Register holding previous generated key */ +){ + Vdbe *v = pParse->pVdbe; + int j; + int regBase; + int nCol; + + if( piPartIdxLabel ){ + if( pIdx->pPartIdxWhere ){ + *piPartIdxLabel = sqlite3VdbeMakeLabel(pParse); + pParse->iSelfTab = iDataCur + 1; + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, + SQLITE_JUMPIFNULL); + pParse->iSelfTab = 0; + pPrior = 0; /* Ticket a9efb42811fa41ee 2019-11-02; + ** pPartIdxWhere may have corrupted regPrior registers */ + }else{ + *piPartIdxLabel = 0; + } + } + nCol = (prefixOnly && pIdx->uniqNotNull) ? pIdx->nKeyCol : pIdx->nColumn; + regBase = sqlite3GetTempRange(pParse, nCol); + if( pPrior && (regBase!=regPrior || pPrior->pPartIdxWhere) ) pPrior = 0; + for(j=0; jaiColumn[j]==pIdx->aiColumn[j] + && pPrior->aiColumn[j]!=XN_EXPR + ){ + /* This column was already computed by the previous index */ + continue; + } + sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iDataCur, j, regBase+j); + /* If the column affinity is REAL but the number is an integer, then it + ** might be stored in the table as an integer (using a compact + ** representation) then converted to REAL by an OP_RealAffinity opcode. + ** But we are getting ready to store this value back into an index, where + ** it should be converted by to INTEGER again. So omit the OP_RealAffinity + ** opcode if it is present */ + sqlite3VdbeDeletePriorOpcode(v, OP_RealAffinity); + } + if( regOut ){ + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regOut); + if( pIdx->pTable->pSelect ){ + const char *zAff = sqlite3IndexAffinityStr(pParse->db, pIdx); + sqlite3VdbeChangeP4(v, -1, zAff, P4_TRANSIENT); + } + } + sqlite3ReleaseTempRange(pParse, regBase, nCol); + return regBase; +} + +/* +** If a prior call to sqlite3GenerateIndexKey() generated a jump-over label +** because it was a partial index, then this routine should be called to +** resolve that label. +*/ +SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse *pParse, int iLabel){ + if( iLabel ){ + sqlite3VdbeResolveLabel(pParse->pVdbe, iLabel); + } +} + +/************** End of delete.c **********************************************/ +/************** Begin file func.c ********************************************/ +/* +** 2002 February 23 +** +** 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 the C-language implementations for many of the SQL +** functions of SQLite. (Some function, and in particular the date and +** time functions, are implemented separately.) +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ +#ifndef SQLITE_OMIT_FLOATING_POINT +/* #include */ +#endif +/* #include "vdbeInt.h" */ + +/* +** Return the collating function associated with a function. +*/ +static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){ + VdbeOp *pOp; + assert( context->pVdbe!=0 ); + pOp = &context->pVdbe->aOp[context->iOp-1]; + assert( pOp->opcode==OP_CollSeq ); + assert( pOp->p4type==P4_COLLSEQ ); + return pOp->p4.pColl; +} + +/* +** Indicate that the accumulator load should be skipped on this +** iteration of the aggregate loop. +*/ +static void sqlite3SkipAccumulatorLoad(sqlite3_context *context){ + assert( context->isError<=0 ); + context->isError = -1; + context->skipFlag = 1; +} + +/* +** Implementation of the non-aggregate min() and max() functions +*/ +static void minmaxFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i; + int mask; /* 0 for min() or 0xffffffff for max() */ + int iBest; + CollSeq *pColl; + + assert( argc>1 ); + mask = sqlite3_user_data(context)==0 ? 0 : -1; + pColl = sqlite3GetFuncCollSeq(context); + assert( pColl ); + assert( mask==-1 || mask==0 ); + iBest = 0; + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + for(i=1; i=0 ){ + testcase( mask==0 ); + iBest = i; + } + } + sqlite3_result_value(context, argv[iBest]); +} + +/* +** Return the type of the argument. +*/ +static void typeofFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + static const char *azType[] = { "integer", "real", "text", "blob", "null" }; + int i = sqlite3_value_type(argv[0]) - 1; + UNUSED_PARAMETER(NotUsed); + assert( i>=0 && i=0xc0 ){ + while( (*z & 0xc0)==0x80 ){ z++; z0++; } + } + } + sqlite3_result_int(context, (int)(z-z0)); + break; + } + default: { + sqlite3_result_null(context); + break; + } + } +} + +/* +** Implementation of the abs() function. +** +** IMP: R-23979-26855 The abs(X) function returns the absolute value of +** the numeric argument X. +*/ +static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + assert( argc==1 ); + UNUSED_PARAMETER(argc); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_INTEGER: { + i64 iVal = sqlite3_value_int64(argv[0]); + if( iVal<0 ){ + if( iVal==SMALLEST_INT64 ){ + /* IMP: R-31676-45509 If X is the integer -9223372036854775808 + ** then abs(X) throws an integer overflow error since there is no + ** equivalent positive 64-bit two complement value. */ + sqlite3_result_error(context, "integer overflow", -1); + return; + } + iVal = -iVal; + } + sqlite3_result_int64(context, iVal); + break; + } + case SQLITE_NULL: { + /* IMP: R-37434-19929 Abs(X) returns NULL if X is NULL. */ + sqlite3_result_null(context); + break; + } + default: { + /* Because sqlite3_value_double() returns 0.0 if the argument is not + ** something that can be converted into a number, we have: + ** IMP: R-01992-00519 Abs(X) returns 0.0 if X is a string or blob + ** that cannot be converted to a numeric value. + */ + double rVal = sqlite3_value_double(argv[0]); + if( rVal<0 ) rVal = -rVal; + sqlite3_result_double(context, rVal); + break; + } + } +} + +/* +** Implementation of the instr() function. +** +** instr(haystack,needle) finds the first occurrence of needle +** in haystack and returns the number of previous characters plus 1, +** or 0 if needle does not occur within haystack. +** +** If both haystack and needle are BLOBs, then the result is one more than +** the number of bytes in haystack prior to the first occurrence of needle, +** or 0 if needle never occurs in haystack. +*/ +static void instrFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zHaystack; + const unsigned char *zNeedle; + int nHaystack; + int nNeedle; + int typeHaystack, typeNeedle; + int N = 1; + int isText; + unsigned char firstChar; + sqlite3_value *pC1 = 0; + sqlite3_value *pC2 = 0; + + UNUSED_PARAMETER(argc); + typeHaystack = sqlite3_value_type(argv[0]); + typeNeedle = sqlite3_value_type(argv[1]); + if( typeHaystack==SQLITE_NULL || typeNeedle==SQLITE_NULL ) return; + nHaystack = sqlite3_value_bytes(argv[0]); + nNeedle = sqlite3_value_bytes(argv[1]); + if( nNeedle>0 ){ + if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){ + zHaystack = sqlite3_value_blob(argv[0]); + zNeedle = sqlite3_value_blob(argv[1]); + isText = 0; + }else if( typeHaystack!=SQLITE_BLOB && typeNeedle!=SQLITE_BLOB ){ + zHaystack = sqlite3_value_text(argv[0]); + zNeedle = sqlite3_value_text(argv[1]); + isText = 1; + }else{ + pC1 = sqlite3_value_dup(argv[0]); + zHaystack = sqlite3_value_text(pC1); + if( zHaystack==0 ) goto endInstrOOM; + nHaystack = sqlite3_value_bytes(pC1); + pC2 = sqlite3_value_dup(argv[1]); + zNeedle = sqlite3_value_text(pC2); + if( zNeedle==0 ) goto endInstrOOM; + nNeedle = sqlite3_value_bytes(pC2); + isText = 1; + } + if( zNeedle==0 || (nHaystack && zHaystack==0) ) goto endInstrOOM; + firstChar = zNeedle[0]; + while( nNeedle<=nHaystack + && (zHaystack[0]!=firstChar || memcmp(zHaystack, zNeedle, nNeedle)!=0) + ){ + N++; + do{ + nHaystack--; + zHaystack++; + }while( isText && (zHaystack[0]&0xc0)==0x80 ); + } + if( nNeedle>nHaystack ) N = 0; + } + sqlite3_result_int(context, N); +endInstr: + sqlite3_value_free(pC1); + sqlite3_value_free(pC2); + return; +endInstrOOM: + sqlite3_result_error_nomem(context); + goto endInstr; +} + +/* +** Implementation of the printf() function. +*/ +static void printfFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + PrintfArguments x; + StrAccum str; + const char *zFormat; + int n; + sqlite3 *db = sqlite3_context_db_handle(context); + + if( argc>=1 && (zFormat = (const char*)sqlite3_value_text(argv[0]))!=0 ){ + x.nArg = argc-1; + x.nUsed = 0; + x.apArg = argv+1; + sqlite3StrAccumInit(&str, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]); + str.printfFlags = SQLITE_PRINTF_SQLFUNC; + sqlite3_str_appendf(&str, zFormat, &x); + n = str.nChar; + sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n, + SQLITE_DYNAMIC); + } +} + +/* +** Implementation of the substr() function. +** +** substr(x,p1,p2) returns p2 characters of x[] beginning with p1. +** p1 is 1-indexed. So substr(x,1,1) returns the first character +** of x. If x is text, then we actually count UTF-8 characters. +** If x is a blob, then we count bytes. +** +** If p1 is negative, then we begin abs(p1) from the end of x[]. +** +** If p2 is negative, return the p2 characters preceding p1. +*/ +static void substrFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *z; + const unsigned char *z2; + int len; + int p0type; + i64 p1, p2; + int negP2 = 0; + + assert( argc==3 || argc==2 ); + if( sqlite3_value_type(argv[1])==SQLITE_NULL + || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL) + ){ + return; + } + p0type = sqlite3_value_type(argv[0]); + p1 = sqlite3_value_int(argv[1]); + if( p0type==SQLITE_BLOB ){ + len = sqlite3_value_bytes(argv[0]); + z = sqlite3_value_blob(argv[0]); + if( z==0 ) return; + assert( len==sqlite3_value_bytes(argv[0]) ); + }else{ + z = sqlite3_value_text(argv[0]); + if( z==0 ) return; + len = 0; + if( p1<0 ){ + for(z2=z; *z2; len++){ + SQLITE_SKIP_UTF8(z2); + } + } + } +#ifdef SQLITE_SUBSTR_COMPATIBILITY + /* If SUBSTR_COMPATIBILITY is defined then substr(X,0,N) work the same as + ** as substr(X,1,N) - it returns the first N characters of X. This + ** is essentially a back-out of the bug-fix in check-in [5fc125d362df4b8] + ** from 2009-02-02 for compatibility of applications that exploited the + ** old buggy behavior. */ + if( p1==0 ) p1 = 1; /* */ +#endif + if( argc==3 ){ + p2 = sqlite3_value_int(argv[2]); + if( p2<0 ){ + p2 = -p2; + negP2 = 1; + } + }else{ + p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH]; + } + if( p1<0 ){ + p1 += len; + if( p1<0 ){ + p2 += p1; + if( p2<0 ) p2 = 0; + p1 = 0; + } + }else if( p1>0 ){ + p1--; + }else if( p2>0 ){ + p2--; + } + if( negP2 ){ + p1 -= p2; + if( p1<0 ){ + p2 += p1; + p1 = 0; + } + } + assert( p1>=0 && p2>=0 ); + if( p0type!=SQLITE_BLOB ){ + while( *z && p1 ){ + SQLITE_SKIP_UTF8(z); + p1--; + } + for(z2=z; *z2 && p2; p2--){ + SQLITE_SKIP_UTF8(z2); + } + sqlite3_result_text64(context, (char*)z, z2-z, SQLITE_TRANSIENT, + SQLITE_UTF8); + }else{ + if( p1+p2>len ){ + p2 = len-p1; + if( p2<0 ) p2 = 0; + } + sqlite3_result_blob64(context, (char*)&z[p1], (u64)p2, SQLITE_TRANSIENT); + } +} + +/* +** Implementation of the round() function +*/ +#ifndef SQLITE_OMIT_FLOATING_POINT +static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + int n = 0; + double r; + char *zBuf; + assert( argc==1 || argc==2 ); + if( argc==2 ){ + if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return; + n = sqlite3_value_int(argv[1]); + if( n>30 ) n = 30; + if( n<0 ) n = 0; + } + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + r = sqlite3_value_double(argv[0]); + /* If Y==0 and X will fit in a 64-bit int, + ** handle the rounding directly, + ** otherwise use printf. + */ + if( r<-4503599627370496.0 || r>+4503599627370496.0 ){ + /* The value has no fractional part so there is nothing to round */ + }else if( n==0 ){ + r = (double)((sqlite_int64)(r+(r<0?-0.5:+0.5))); + }else{ + zBuf = sqlite3_mprintf("%.*f",n,r); + if( zBuf==0 ){ + sqlite3_result_error_nomem(context); + return; + } + sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8); + sqlite3_free(zBuf); + } + sqlite3_result_double(context, r); +} +#endif + +/* +** Allocate nByte bytes of space using sqlite3Malloc(). If the +** allocation fails, call sqlite3_result_error_nomem() to notify +** the database handle that malloc() has failed and return NULL. +** If nByte is larger than the maximum string or blob length, then +** raise an SQLITE_TOOBIG exception and return NULL. +*/ +static void *contextMalloc(sqlite3_context *context, i64 nByte){ + char *z; + sqlite3 *db = sqlite3_context_db_handle(context); + assert( nByte>0 ); + testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] ); + testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 ); + if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(context); + z = 0; + }else{ + z = sqlite3Malloc(nByte); + if( !z ){ + sqlite3_result_error_nomem(context); + } + } + return z; +} + +/* +** Implementation of the upper() and lower() SQL functions. +*/ +static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + char *z1; + const char *z2; + int i, n; + UNUSED_PARAMETER(argc); + z2 = (char*)sqlite3_value_text(argv[0]); + n = sqlite3_value_bytes(argv[0]); + /* Verify that the call to _bytes() does not invalidate the _text() pointer */ + assert( z2==(char*)sqlite3_value_text(argv[0]) ); + if( z2 ){ + z1 = contextMalloc(context, ((i64)n)+1); + if( z1 ){ + for(i=0; imatchOne; /* "?" or "_" */ + u32 matchAll = pInfo->matchAll; /* "*" or "%" */ + u8 noCase = pInfo->noCase; /* True if uppercase==lowercase */ + const u8 *zEscaped = 0; /* One past the last escaped input char */ + + while( (c = Utf8Read(zPattern))!=0 ){ + if( c==matchAll ){ /* Match "*" */ + /* Skip over multiple "*" characters in the pattern. If there + ** are also "?" characters, skip those as well, but consume a + ** single character of the input string for each "?" skipped */ + while( (c=Utf8Read(zPattern)) == matchAll || c == matchOne ){ + if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){ + return SQLITE_NOWILDCARDMATCH; + } + } + if( c==0 ){ + return SQLITE_MATCH; /* "*" at the end of the pattern matches */ + }else if( c==matchOther ){ + if( pInfo->matchSet==0 ){ + c = sqlite3Utf8Read(&zPattern); + if( c==0 ) return SQLITE_NOWILDCARDMATCH; + }else{ + /* "[...]" immediately follows the "*". We have to do a slow + ** recursive search in this case, but it is an unusual case. */ + assert( matchOther<0x80 ); /* '[' is a single-byte character */ + while( *zString ){ + int bMatch = patternCompare(&zPattern[-1],zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; + SQLITE_SKIP_UTF8(zString); + } + return SQLITE_NOWILDCARDMATCH; + } + } + + /* At this point variable c contains the first character of the + ** pattern string past the "*". Search in the input string for the + ** first matching character and recursively continue the match from + ** that point. + ** + ** For a case-insensitive search, set variable cx to be the same as + ** c but in the other case and search the input string for either + ** c or cx. + */ + if( c<=0x80 ){ + char zStop[3]; + int bMatch; + if( noCase ){ + zStop[0] = sqlite3Toupper(c); + zStop[1] = sqlite3Tolower(c); + zStop[2] = 0; + }else{ + zStop[0] = c; + zStop[1] = 0; + } + while(1){ + zString += strcspn((const char*)zString, zStop); + if( zString[0]==0 ) break; + zString++; + bMatch = patternCompare(zPattern,zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; + } + }else{ + int bMatch; + while( (c2 = Utf8Read(zString))!=0 ){ + if( c2!=c ) continue; + bMatch = patternCompare(zPattern,zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; + } + } + return SQLITE_NOWILDCARDMATCH; + } + if( c==matchOther ){ + if( pInfo->matchSet==0 ){ + c = sqlite3Utf8Read(&zPattern); + if( c==0 ) return SQLITE_NOMATCH; + zEscaped = zPattern; + }else{ + u32 prior_c = 0; + int seen = 0; + int invert = 0; + c = sqlite3Utf8Read(&zString); + if( c==0 ) return SQLITE_NOMATCH; + c2 = sqlite3Utf8Read(&zPattern); + if( c2=='^' ){ + invert = 1; + c2 = sqlite3Utf8Read(&zPattern); + } + if( c2==']' ){ + if( c==']' ) seen = 1; + c2 = sqlite3Utf8Read(&zPattern); + } + while( c2 && c2!=']' ){ + if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){ + c2 = sqlite3Utf8Read(&zPattern); + if( c>=prior_c && c<=c2 ) seen = 1; + prior_c = 0; + }else{ + if( c==c2 ){ + seen = 1; + } + prior_c = c2; + } + c2 = sqlite3Utf8Read(&zPattern); + } + if( c2==0 || (seen ^ invert)==0 ){ + return SQLITE_NOMATCH; + } + continue; + } + } + c2 = Utf8Read(zString); + if( c==c2 ) continue; + if( noCase && sqlite3Tolower(c)==sqlite3Tolower(c2) && c<0x80 && c2<0x80 ){ + continue; + } + if( c==matchOne && zPattern!=zEscaped && c2!=0 ) continue; + return SQLITE_NOMATCH; + } + return *zString==0 ? SQLITE_MATCH : SQLITE_NOMATCH; +} + +/* +** The sqlite3_strglob() interface. Return 0 on a match (like strcmp()) and +** non-zero if there is no match. +*/ +SQLITE_API int sqlite3_strglob(const char *zGlobPattern, const char *zString){ + return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, '['); +} + +/* +** The sqlite3_strlike() interface. Return 0 on a match and non-zero for +** a miss - like strcmp(). +*/ +SQLITE_API int sqlite3_strlike(const char *zPattern, const char *zStr, unsigned int esc){ + return patternCompare((u8*)zPattern, (u8*)zStr, &likeInfoNorm, esc); +} + +/* +** Count the number of times that the LIKE operator (or GLOB which is +** just a variation of LIKE) gets called. This is used for testing +** only. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_like_count = 0; +#endif + + +/* +** Implementation of the like() SQL function. This function implements +** the build-in LIKE operator. The first argument to the function is the +** pattern and the second argument is the string. So, the SQL statements: +** +** A LIKE B +** +** is implemented as like(B,A). +** +** This same function (with a different compareInfo structure) computes +** the GLOB operator. +*/ +static void likeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zA, *zB; + u32 escape; + int nPat; + sqlite3 *db = sqlite3_context_db_handle(context); + struct compareInfo *pInfo = sqlite3_user_data(context); + struct compareInfo backupInfo; + +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( sqlite3_value_type(argv[0])==SQLITE_BLOB + || sqlite3_value_type(argv[1])==SQLITE_BLOB + ){ +#ifdef SQLITE_TEST + sqlite3_like_count++; +#endif + sqlite3_result_int(context, 0); + return; + } +#endif + + /* Limit the length of the LIKE or GLOB pattern to avoid problems + ** of deep recursion and N*N behavior in patternCompare(). + */ + nPat = sqlite3_value_bytes(argv[0]); + testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ); + testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 ); + if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){ + sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); + return; + } + if( argc==3 ){ + /* The escape character string must consist of a single UTF-8 character. + ** Otherwise, return an error. + */ + const unsigned char *zEsc = sqlite3_value_text(argv[2]); + if( zEsc==0 ) return; + if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){ + sqlite3_result_error(context, + "ESCAPE expression must be a single character", -1); + return; + } + escape = sqlite3Utf8Read(&zEsc); + if( escape==pInfo->matchAll || escape==pInfo->matchOne ){ + memcpy(&backupInfo, pInfo, sizeof(backupInfo)); + pInfo = &backupInfo; + if( escape==pInfo->matchAll ) pInfo->matchAll = 0; + if( escape==pInfo->matchOne ) pInfo->matchOne = 0; + } + }else{ + escape = pInfo->matchSet; + } + zB = sqlite3_value_text(argv[0]); + zA = sqlite3_value_text(argv[1]); + if( zA && zB ){ +#ifdef SQLITE_TEST + sqlite3_like_count++; +#endif + sqlite3_result_int(context, + patternCompare(zB, zA, pInfo, escape)==SQLITE_MATCH); + } +} + +/* +** Implementation of the NULLIF(x,y) function. The result is the first +** argument if the arguments are different. The result is NULL if the +** arguments are equal to each other. +*/ +static void nullifFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + CollSeq *pColl = sqlite3GetFuncCollSeq(context); + UNUSED_PARAMETER(NotUsed); + if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){ + sqlite3_result_value(context, argv[0]); + } +} + +/* +** Implementation of the sqlite_version() function. The result is the version +** of the SQLite library that is running. +*/ +static void versionFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + /* IMP: R-48699-48617 This function is an SQL wrapper around the + ** sqlite3_libversion() C-interface. */ + sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC); +} + +/* +** Implementation of the sqlite_source_id() function. The result is a string +** that identifies the particular version of the source code used to build +** SQLite. +*/ +static void sourceidFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + /* IMP: R-24470-31136 This function is an SQL wrapper around the + ** sqlite3_sourceid() C interface. */ + sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC); +} + +/* +** Implementation of the sqlite_log() function. This is a wrapper around +** sqlite3_log(). The return value is NULL. The function exists purely for +** its side-effects. +*/ +static void errlogFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(context); + sqlite3_log(sqlite3_value_int(argv[0]), "%s", sqlite3_value_text(argv[1])); +} + +/* +** Implementation of the sqlite_compileoption_used() function. +** The result is an integer that identifies if the compiler option +** was used to build SQLite. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +static void compileoptionusedFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zOptName; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL + ** function is a wrapper around the sqlite3_compileoption_used() C/C++ + ** function. + */ + if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){ + sqlite3_result_int(context, sqlite3_compileoption_used(zOptName)); + } +} +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +/* +** Implementation of the sqlite_compileoption_get() function. +** The result is a string that identifies the compiler options +** used to build SQLite. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +static void compileoptiongetFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int n; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function + ** is a wrapper around the sqlite3_compileoption_get() C/C++ function. + */ + n = sqlite3_value_int(argv[0]); + sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC); +} +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +/* Array for converting from half-bytes (nybbles) into ASCII hex +** digits. */ +static const char hexdigits[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' +}; + +/* +** Implementation of the QUOTE() function. This function takes a single +** argument. If the argument is numeric, the return value is the same as +** the argument. If the argument is NULL, the return value is the string +** "NULL". Otherwise, the argument is enclosed in single quotes with +** single-quote escapes. +*/ +static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + assert( argc==1 ); + UNUSED_PARAMETER(argc); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_FLOAT: { + double r1, r2; + char zBuf[50]; + r1 = sqlite3_value_double(argv[0]); + sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.15g", r1); + sqlite3AtoF(zBuf, &r2, 20, SQLITE_UTF8); + if( r1!=r2 ){ + sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.20e", r1); + } + sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + break; + } + case SQLITE_INTEGER: { + sqlite3_result_value(context, argv[0]); + break; + } + case SQLITE_BLOB: { + char *zText = 0; + char const *zBlob = sqlite3_value_blob(argv[0]); + int nBlob = sqlite3_value_bytes(argv[0]); + assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ + zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4); + if( zText ){ + int i; + for(i=0; i>4)&0x0F]; + zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F]; + } + zText[(nBlob*2)+2] = '\''; + zText[(nBlob*2)+3] = '\0'; + zText[0] = 'X'; + zText[1] = '\''; + sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT); + sqlite3_free(zText); + } + break; + } + case SQLITE_TEXT: { + int i,j; + u64 n; + const unsigned char *zArg = sqlite3_value_text(argv[0]); + char *z; + + if( zArg==0 ) return; + for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; } + z = contextMalloc(context, ((i64)i)+((i64)n)+3); + if( z ){ + z[0] = '\''; + for(i=0, j=1; zArg[i]; i++){ + z[j++] = zArg[i]; + if( zArg[i]=='\'' ){ + z[j++] = '\''; + } + } + z[j++] = '\''; + z[j] = 0; + sqlite3_result_text(context, z, j, sqlite3_free); + } + break; + } + default: { + assert( sqlite3_value_type(argv[0])==SQLITE_NULL ); + sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC); + break; + } + } +} + +/* +** The unicode() function. Return the integer unicode code-point value +** for the first character of the input string. +*/ +static void unicodeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *z = sqlite3_value_text(argv[0]); + (void)argc; + if( z && z[0] ) sqlite3_result_int(context, sqlite3Utf8Read(&z)); +} + +/* +** The char() function takes zero or more arguments, each of which is +** an integer. It constructs a string where each character of the string +** is the unicode character for the corresponding integer argument. +*/ +static void charFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + unsigned char *z, *zOut; + int i; + zOut = z = sqlite3_malloc64( argc*4+1 ); + if( z==0 ){ + sqlite3_result_error_nomem(context); + return; + } + for(i=0; i0x10ffff ) x = 0xfffd; + c = (unsigned)(x & 0x1fffff); + if( c<0x00080 ){ + *zOut++ = (u8)(c&0xFF); + }else if( c<0x00800 ){ + *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); + *zOut++ = 0x80 + (u8)(c & 0x3F); + }else if( c<0x10000 ){ + *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); + *zOut++ = 0x80 + (u8)(c & 0x3F); + }else{ + *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); + *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); + *zOut++ = 0x80 + (u8)(c & 0x3F); + } \ + } + sqlite3_result_text64(context, (char*)z, zOut-z, sqlite3_free, SQLITE_UTF8); +} + +/* +** The hex() function. Interpret the argument as a blob. Return +** a hexadecimal rendering as text. +*/ +static void hexFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i, n; + const unsigned char *pBlob; + char *zHex, *z; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + pBlob = sqlite3_value_blob(argv[0]); + n = sqlite3_value_bytes(argv[0]); + assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ + z = zHex = contextMalloc(context, ((i64)n)*2 + 1); + if( zHex ){ + for(i=0; i>4)&0xf]; + *(z++) = hexdigits[c&0xf]; + } + *z = 0; + sqlite3_result_text(context, zHex, n*2, sqlite3_free); + } +} + +/* +** The zeroblob(N) function returns a zero-filled blob of size N bytes. +*/ +static void zeroblobFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + i64 n; + int rc; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + n = sqlite3_value_int64(argv[0]); + if( n<0 ) n = 0; + rc = sqlite3_result_zeroblob64(context, n); /* IMP: R-00293-64994 */ + if( rc ){ + sqlite3_result_error_code(context, rc); + } +} + +/* +** The replace() function. Three arguments are all strings: call +** them A, B, and C. The result is also a string which is derived +** from A by replacing every occurrence of B with C. The match +** must be exact. Collating sequences are not used. +*/ +static void replaceFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zStr; /* The input string A */ + const unsigned char *zPattern; /* The pattern string B */ + const unsigned char *zRep; /* The replacement string C */ + unsigned char *zOut; /* The output */ + int nStr; /* Size of zStr */ + int nPattern; /* Size of zPattern */ + int nRep; /* Size of zRep */ + i64 nOut; /* Maximum size of zOut */ + int loopLimit; /* Last zStr[] that might match zPattern[] */ + int i, j; /* Loop counters */ + unsigned cntExpand; /* Number zOut expansions */ + sqlite3 *db = sqlite3_context_db_handle(context); + + assert( argc==3 ); + UNUSED_PARAMETER(argc); + zStr = sqlite3_value_text(argv[0]); + if( zStr==0 ) return; + nStr = sqlite3_value_bytes(argv[0]); + assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */ + zPattern = sqlite3_value_text(argv[1]); + if( zPattern==0 ){ + assert( sqlite3_value_type(argv[1])==SQLITE_NULL + || sqlite3_context_db_handle(context)->mallocFailed ); + return; + } + if( zPattern[0]==0 ){ + assert( sqlite3_value_type(argv[1])!=SQLITE_NULL ); + sqlite3_result_value(context, argv[0]); + return; + } + nPattern = sqlite3_value_bytes(argv[1]); + assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */ + zRep = sqlite3_value_text(argv[2]); + if( zRep==0 ) return; + nRep = sqlite3_value_bytes(argv[2]); + assert( zRep==sqlite3_value_text(argv[2]) ); + nOut = nStr + 1; + assert( nOutnPattern ){ + nOut += nRep - nPattern; + testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] ); + testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] ); + if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(context); + sqlite3_free(zOut); + return; + } + cntExpand++; + if( (cntExpand&(cntExpand-1))==0 ){ + /* Grow the size of the output buffer only on substitutions + ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */ + u8 *zOld; + zOld = zOut; + zOut = sqlite3Realloc(zOut, (int)nOut + (nOut - nStr - 1)); + if( zOut==0 ){ + sqlite3_result_error_nomem(context); + sqlite3_free(zOld); + return; + } + } + } + memcpy(&zOut[j], zRep, nRep); + j += nRep; + i += nPattern-1; + } + } + assert( j+nStr-i+1<=nOut ); + memcpy(&zOut[j], &zStr[i], nStr-i); + j += nStr - i; + assert( j<=nOut ); + zOut[j] = 0; + sqlite3_result_text(context, (char*)zOut, j, sqlite3_free); +} + +/* +** Implementation of the TRIM(), LTRIM(), and RTRIM() functions. +** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both. +*/ +static void trimFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zIn; /* Input string */ + const unsigned char *zCharSet; /* Set of characters to trim */ + int nIn; /* Number of bytes in input */ + int flags; /* 1: trimleft 2: trimright 3: trim */ + int i; /* Loop counter */ + unsigned char *aLen = 0; /* Length of each character in zCharSet */ + unsigned char **azChar = 0; /* Individual characters in zCharSet */ + int nChar; /* Number of characters in zCharSet */ + + if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ + return; + } + zIn = sqlite3_value_text(argv[0]); + if( zIn==0 ) return; + nIn = sqlite3_value_bytes(argv[0]); + assert( zIn==sqlite3_value_text(argv[0]) ); + if( argc==1 ){ + static const unsigned char lenOne[] = { 1 }; + static unsigned char * const azOne[] = { (u8*)" " }; + nChar = 1; + aLen = (u8*)lenOne; + azChar = (unsigned char **)azOne; + zCharSet = 0; + }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){ + return; + }else{ + const unsigned char *z; + for(z=zCharSet, nChar=0; *z; nChar++){ + SQLITE_SKIP_UTF8(z); + } + if( nChar>0 ){ + azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1)); + if( azChar==0 ){ + return; + } + aLen = (unsigned char*)&azChar[nChar]; + for(z=zCharSet, nChar=0; *z; nChar++){ + azChar[nChar] = (unsigned char *)z; + SQLITE_SKIP_UTF8(z); + aLen[nChar] = (u8)(z - azChar[nChar]); + } + } + } + if( nChar>0 ){ + flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context)); + if( flags & 1 ){ + while( nIn>0 ){ + int len = 0; + for(i=0; i=nChar ) break; + zIn += len; + nIn -= len; + } + } + if( flags & 2 ){ + while( nIn>0 ){ + int len = 0; + for(i=0; i=nChar ) break; + nIn -= len; + } + } + if( zCharSet ){ + sqlite3_free(azChar); + } + } + sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT); +} + + +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION +/* +** The "unknown" function is automatically substituted in place of +** any unrecognized function name when doing an EXPLAIN or EXPLAIN QUERY PLAN +** when the SQLITE_ENABLE_UNKNOWN_FUNCTION compile-time option is used. +** When the "sqlite3" command-line shell is built using this functionality, +** that allows an EXPLAIN or EXPLAIN QUERY PLAN for complex queries +** involving application-defined functions to be examined in a generic +** sqlite3 shell. +*/ +static void unknownFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + /* no-op */ +} +#endif /*SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION*/ + + +/* IMP: R-25361-16150 This function is omitted from SQLite by default. It +** is only available if the SQLITE_SOUNDEX compile-time option is used +** when SQLite is built. +*/ +#ifdef SQLITE_SOUNDEX +/* +** Compute the soundex encoding of a word. +** +** IMP: R-59782-00072 The soundex(X) function returns a string that is the +** soundex encoding of the string X. +*/ +static void soundexFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + char zResult[8]; + const u8 *zIn; + int i, j; + static const unsigned char iCode[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + }; + assert( argc==1 ); + zIn = (u8*)sqlite3_value_text(argv[0]); + if( zIn==0 ) zIn = (u8*)""; + for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){} + if( zIn[i] ){ + u8 prevcode = iCode[zIn[i]&0x7f]; + zResult[0] = sqlite3Toupper(zIn[i]); + for(j=1; j<4 && zIn[i]; i++){ + int code = iCode[zIn[i]&0x7f]; + if( code>0 ){ + if( code!=prevcode ){ + prevcode = code; + zResult[j++] = code + '0'; + } + }else{ + prevcode = 0; + } + } + while( j<4 ){ + zResult[j++] = '0'; + } + zResult[j] = 0; + sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT); + }else{ + /* IMP: R-64894-50321 The string "?000" is returned if the argument + ** is NULL or contains no ASCII alphabetic characters. */ + sqlite3_result_text(context, "?000", 4, SQLITE_STATIC); + } +} +#endif /* SQLITE_SOUNDEX */ + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** A function that loads a shared-library extension then returns NULL. +*/ +static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *zFile = (const char *)sqlite3_value_text(argv[0]); + const char *zProc; + sqlite3 *db = sqlite3_context_db_handle(context); + char *zErrMsg = 0; + + /* Disallow the load_extension() SQL function unless the SQLITE_LoadExtFunc + ** flag is set. See the sqlite3_enable_load_extension() API. + */ + if( (db->flags & SQLITE_LoadExtFunc)==0 ){ + sqlite3_result_error(context, "not authorized", -1); + return; + } + + if( argc==2 ){ + zProc = (const char *)sqlite3_value_text(argv[1]); + }else{ + zProc = 0; + } + if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){ + sqlite3_result_error(context, zErrMsg, -1); + sqlite3_free(zErrMsg); + } +} +#endif + + +/* +** An instance of the following structure holds the context of a +** sum() or avg() aggregate computation. +*/ +typedef struct SumCtx SumCtx; +struct SumCtx { + double rSum; /* Floating point sum */ + i64 iSum; /* Integer sum */ + i64 cnt; /* Number of elements summed */ + u8 overflow; /* True if integer overflow seen */ + u8 approx; /* True if non-integer value was input to the sum */ +}; + +/* +** Routines used to compute the sum, average, and total. +** +** The SUM() function follows the (broken) SQL standard which means +** that it returns NULL if it sums over no inputs. TOTAL returns +** 0.0 in that case. In addition, TOTAL always returns a float where +** SUM might return an integer if it never encounters a floating point +** value. TOTAL never fails, but SUM might through an exception if +** it overflows an integer. +*/ +static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + SumCtx *p; + int type; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + p = sqlite3_aggregate_context(context, sizeof(*p)); + type = sqlite3_value_numeric_type(argv[0]); + if( p && type!=SQLITE_NULL ){ + p->cnt++; + if( type==SQLITE_INTEGER ){ + i64 v = sqlite3_value_int64(argv[0]); + p->rSum += v; + if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){ + p->approx = p->overflow = 1; + } + }else{ + p->rSum += sqlite3_value_double(argv[0]); + p->approx = 1; + } + } +} +#ifndef SQLITE_OMIT_WINDOWFUNC +static void sumInverse(sqlite3_context *context, int argc, sqlite3_value**argv){ + SumCtx *p; + int type; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + p = sqlite3_aggregate_context(context, sizeof(*p)); + type = sqlite3_value_numeric_type(argv[0]); + /* p is always non-NULL because sumStep() will have been called first + ** to initialize it */ + if( ALWAYS(p) && type!=SQLITE_NULL ){ + assert( p->cnt>0 ); + p->cnt--; + assert( type==SQLITE_INTEGER || p->approx ); + if( type==SQLITE_INTEGER && p->approx==0 ){ + i64 v = sqlite3_value_int64(argv[0]); + p->rSum -= v; + p->iSum -= v; + }else{ + p->rSum -= sqlite3_value_double(argv[0]); + } + } +} +#else +# define sumInverse 0 +#endif /* SQLITE_OMIT_WINDOWFUNC */ +static void sumFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>0 ){ + if( p->overflow ){ + sqlite3_result_error(context,"integer overflow",-1); + }else if( p->approx ){ + sqlite3_result_double(context, p->rSum); + }else{ + sqlite3_result_int64(context, p->iSum); + } + } +} +static void avgFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>0 ){ + sqlite3_result_double(context, p->rSum/(double)p->cnt); + } +} +static void totalFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + sqlite3_result_double(context, p ? p->rSum : (double)0); +} + +/* +** The following structure keeps track of state information for the +** count() aggregate function. +*/ +typedef struct CountCtx CountCtx; +struct CountCtx { + i64 n; +#ifdef SQLITE_DEBUG + int bInverse; /* True if xInverse() ever called */ +#endif +}; + +/* +** Routines to implement the count() aggregate function. +*/ +static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + CountCtx *p; + p = sqlite3_aggregate_context(context, sizeof(*p)); + if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){ + p->n++; + } + +#ifndef SQLITE_OMIT_DEPRECATED + /* The sqlite3_aggregate_count() function is deprecated. But just to make + ** sure it still operates correctly, verify that its count agrees with our + ** internal count when using count(*) and when the total count can be + ** expressed as a 32-bit integer. */ + assert( argc==1 || p==0 || p->n>0x7fffffff || p->bInverse + || p->n==sqlite3_aggregate_count(context) ); +#endif +} +static void countFinalize(sqlite3_context *context){ + CountCtx *p; + p = sqlite3_aggregate_context(context, 0); + sqlite3_result_int64(context, p ? p->n : 0); +} +#ifndef SQLITE_OMIT_WINDOWFUNC +static void countInverse(sqlite3_context *ctx, int argc, sqlite3_value **argv){ + CountCtx *p; + p = sqlite3_aggregate_context(ctx, sizeof(*p)); + /* p is always non-NULL since countStep() will have been called first */ + if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && ALWAYS(p) ){ + p->n--; +#ifdef SQLITE_DEBUG + p->bInverse = 1; +#endif + } +} +#else +# define countInverse 0 +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** Routines to implement min() and max() aggregate functions. +*/ +static void minmaxStep( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + Mem *pArg = (Mem *)argv[0]; + Mem *pBest; + UNUSED_PARAMETER(NotUsed); + + pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest)); + if( !pBest ) return; + + if( sqlite3_value_type(pArg)==SQLITE_NULL ){ + if( pBest->flags ) sqlite3SkipAccumulatorLoad(context); + }else if( pBest->flags ){ + int max; + int cmp; + CollSeq *pColl = sqlite3GetFuncCollSeq(context); + /* This step function is used for both the min() and max() aggregates, + ** the only difference between the two being that the sense of the + ** comparison is inverted. For the max() aggregate, the + ** sqlite3_user_data() function returns (void *)-1. For min() it + ** returns (void *)db, where db is the sqlite3* database pointer. + ** Therefore the next statement sets variable 'max' to 1 for the max() + ** aggregate, or 0 for min(). + */ + max = sqlite3_user_data(context)!=0; + cmp = sqlite3MemCompare(pBest, pArg, pColl); + if( (max && cmp<0) || (!max && cmp>0) ){ + sqlite3VdbeMemCopy(pBest, pArg); + }else{ + sqlite3SkipAccumulatorLoad(context); + } + }else{ + pBest->db = sqlite3_context_db_handle(context); + sqlite3VdbeMemCopy(pBest, pArg); + } +} +static void minMaxValueFinalize(sqlite3_context *context, int bValue){ + sqlite3_value *pRes; + pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0); + if( pRes ){ + if( pRes->flags ){ + sqlite3_result_value(context, pRes); + } + if( bValue==0 ) sqlite3VdbeMemRelease(pRes); + } +} +#ifndef SQLITE_OMIT_WINDOWFUNC +static void minMaxValue(sqlite3_context *context){ + minMaxValueFinalize(context, 1); +} +#else +# define minMaxValue 0 +#endif /* SQLITE_OMIT_WINDOWFUNC */ +static void minMaxFinalize(sqlite3_context *context){ + minMaxValueFinalize(context, 0); +} + +/* +** group_concat(EXPR, ?SEPARATOR?) +*/ +static void groupConcatStep( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zVal; + StrAccum *pAccum; + const char *zSep; + int nVal, nSep; + assert( argc==1 || argc==2 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum)); + + if( pAccum ){ + sqlite3 *db = sqlite3_context_db_handle(context); + int firstTerm = pAccum->mxAlloc==0; + pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH]; + if( !firstTerm ){ + if( argc==2 ){ + zSep = (char*)sqlite3_value_text(argv[1]); + nSep = sqlite3_value_bytes(argv[1]); + }else{ + zSep = ","; + nSep = 1; + } + if( zSep ) sqlite3_str_append(pAccum, zSep, nSep); + } + zVal = (char*)sqlite3_value_text(argv[0]); + nVal = sqlite3_value_bytes(argv[0]); + if( zVal ) sqlite3_str_append(pAccum, zVal, nVal); + } +} +#ifndef SQLITE_OMIT_WINDOWFUNC +static void groupConcatInverse( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int n; + StrAccum *pAccum; + assert( argc==1 || argc==2 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum)); + /* pAccum is always non-NULL since groupConcatStep() will have always + ** run frist to initialize it */ + if( ALWAYS(pAccum) ){ + n = sqlite3_value_bytes(argv[0]); + if( argc==2 ){ + n += sqlite3_value_bytes(argv[1]); + }else{ + n++; + } + if( n>=(int)pAccum->nChar ){ + pAccum->nChar = 0; + }else{ + pAccum->nChar -= n; + memmove(pAccum->zText, &pAccum->zText[n], pAccum->nChar); + } + if( pAccum->nChar==0 ) pAccum->mxAlloc = 0; + } +} +#else +# define groupConcatInverse 0 +#endif /* SQLITE_OMIT_WINDOWFUNC */ +static void groupConcatFinalize(sqlite3_context *context){ + StrAccum *pAccum; + pAccum = sqlite3_aggregate_context(context, 0); + if( pAccum ){ + if( pAccum->accError==SQLITE_TOOBIG ){ + sqlite3_result_error_toobig(context); + }else if( pAccum->accError==SQLITE_NOMEM ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1, + sqlite3_free); + } + } +} +#ifndef SQLITE_OMIT_WINDOWFUNC +static void groupConcatValue(sqlite3_context *context){ + sqlite3_str *pAccum; + pAccum = (sqlite3_str*)sqlite3_aggregate_context(context, 0); + if( pAccum ){ + if( pAccum->accError==SQLITE_TOOBIG ){ + sqlite3_result_error_toobig(context); + }else if( pAccum->accError==SQLITE_NOMEM ){ + sqlite3_result_error_nomem(context); + }else{ + const char *zText = sqlite3_str_value(pAccum); + sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT); + } + } +} +#else +# define groupConcatValue 0 +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** This routine does per-connection function registration. Most +** of the built-in functions above are part of the global function set. +** This routine only deals with those that are not global. +*/ +SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3 *db){ + int rc = sqlite3_overload_function(db, "MATCH", 2); + assert( rc==SQLITE_NOMEM || rc==SQLITE_OK ); + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } +} + +/* +** Re-register the built-in LIKE functions. The caseSensitive +** parameter determines whether or not the LIKE operator is case +** sensitive. +*/ +SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){ + struct compareInfo *pInfo; + int flags; + if( caseSensitive ){ + pInfo = (struct compareInfo*)&likeInfoAlt; + flags = SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE; + }else{ + pInfo = (struct compareInfo*)&likeInfoNorm; + flags = SQLITE_FUNC_LIKE; + } + sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0); + sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0); + sqlite3FindFunction(db, "like", 2, SQLITE_UTF8, 0)->funcFlags |= flags; + sqlite3FindFunction(db, "like", 3, SQLITE_UTF8, 0)->funcFlags |= flags; +} + +/* +** pExpr points to an expression which implements a function. If +** it is appropriate to apply the LIKE optimization to that function +** then set aWc[0] through aWc[2] to the wildcard characters and the +** escape character and then return TRUE. If the function is not a +** LIKE-style function then return FALSE. +** +** The expression "a LIKE b ESCAPE c" is only considered a valid LIKE +** operator if c is a string literal that is exactly one byte in length. +** That one byte is stored in aWc[3]. aWc[3] is set to zero if there is +** no ESCAPE clause. +** +** *pIsNocase is set to true if uppercase and lowercase are equivalent for +** the function (default for LIKE). If the function makes the distinction +** between uppercase and lowercase (as does GLOB) then *pIsNocase is set to +** false. +*/ +SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ + FuncDef *pDef; + int nExpr; + if( pExpr->op!=TK_FUNCTION || !pExpr->x.pList ){ + return 0; + } + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + nExpr = pExpr->x.pList->nExpr; + pDef = sqlite3FindFunction(db, pExpr->u.zToken, nExpr, SQLITE_UTF8, 0); +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + if( pDef==0 ) return 0; +#endif + if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_LIKE)==0 ){ + return 0; + } + + /* The memcpy() statement assumes that the wildcard characters are + ** the first three statements in the compareInfo structure. The + ** asserts() that follow verify that assumption + */ + memcpy(aWc, pDef->pUserData, 3); + assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll ); + assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne ); + assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet ); + + if( nExpr<3 ){ + aWc[3] = 0; + }else{ + Expr *pEscape = pExpr->x.pList->a[2].pExpr; + char *zEscape; + if( pEscape->op!=TK_STRING ) return 0; + zEscape = pEscape->u.zToken; + if( zEscape[0]==0 || zEscape[1]!=0 ) return 0; + if( zEscape[0]==aWc[0] ) return 0; + if( zEscape[0]==aWc[1] ) return 0; + aWc[3] = zEscape[0]; + } + + *pIsNocase = (pDef->funcFlags & SQLITE_FUNC_CASE)==0; + return 1; +} + +/* +** All of the FuncDef structures in the aBuiltinFunc[] array above +** to the global function hash table. This occurs at start-time (as +** a consequence of calling sqlite3_initialize()). +** +** After this routine runs +*/ +SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ + /* + ** The following array holds FuncDef structures for all of the functions + ** defined in this file. + ** + ** The array cannot be constant since changes are made to the + ** FuncDef.pHash elements at start-time. The elements of this array + ** are read-only after initialization is complete. + ** + ** For peak efficiency, put the most frequently used function last. + */ + static FuncDef aBuiltinFunc[] = { +/***** Functions only available with SQLITE_TESTCTRL_INTERNAL_FUNCTIONS *****/ + TEST_FUNC(implies_nonnull_row, 2, INLINEFUNC_implies_nonnull_row, 0), + TEST_FUNC(expr_compare, 2, INLINEFUNC_expr_compare, 0), + TEST_FUNC(expr_implies_expr, 2, INLINEFUNC_expr_implies_expr, 0), +#ifdef SQLITE_DEBUG + TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0), +#endif +/***** Regular functions *****/ +#ifdef SQLITE_SOUNDEX + FUNCTION(soundex, 1, 0, 0, soundexFunc ), +#endif +#ifndef SQLITE_OMIT_LOAD_EXTENSION + SFUNCTION(load_extension, 1, 0, 0, loadExt ), + SFUNCTION(load_extension, 2, 0, 0, loadExt ), +#endif +#if SQLITE_USER_AUTHENTICATION + FUNCTION(sqlite_crypt, 2, 0, 0, sqlite3CryptFunc ), +#endif +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + DFUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ), + DFUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ), +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + INLINE_FUNC(unlikely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET| + SQLITE_FUNC_TYPEOF), +#endif + FUNCTION(ltrim, 1, 1, 0, trimFunc ), + FUNCTION(ltrim, 2, 1, 0, trimFunc ), + FUNCTION(rtrim, 1, 2, 0, trimFunc ), + FUNCTION(rtrim, 2, 2, 0, trimFunc ), + FUNCTION(trim, 1, 3, 0, trimFunc ), + FUNCTION(trim, 2, 3, 0, trimFunc ), + FUNCTION(min, -1, 0, 1, minmaxFunc ), + FUNCTION(min, 0, 0, 1, 0 ), + WAGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize, minMaxValue, 0, + SQLITE_FUNC_MINMAX ), + FUNCTION(max, -1, 1, 1, minmaxFunc ), + FUNCTION(max, 0, 1, 1, 0 ), + WAGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize, minMaxValue, 0, + SQLITE_FUNC_MINMAX ), + FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF), + FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH), + FUNCTION(instr, 2, 0, 0, instrFunc ), + FUNCTION(printf, -1, 0, 0, printfFunc ), + FUNCTION(unicode, 1, 0, 0, unicodeFunc ), + FUNCTION(char, -1, 0, 0, charFunc ), + FUNCTION(abs, 1, 0, 0, absFunc ), +#ifndef SQLITE_OMIT_FLOATING_POINT + FUNCTION(round, 1, 0, 0, roundFunc ), + FUNCTION(round, 2, 0, 0, roundFunc ), +#endif + FUNCTION(upper, 1, 0, 0, upperFunc ), + FUNCTION(lower, 1, 0, 0, lowerFunc ), + FUNCTION(hex, 1, 0, 0, hexFunc ), + INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, 0 ), + VFUNCTION(random, 0, 0, 0, randomFunc ), + VFUNCTION(randomblob, 1, 0, 0, randomBlob ), + FUNCTION(nullif, 2, 0, 1, nullifFunc ), + DFUNCTION(sqlite_version, 0, 0, 0, versionFunc ), + DFUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ), + FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ), + FUNCTION(quote, 1, 0, 0, quoteFunc ), + VFUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid), + VFUNCTION(changes, 0, 0, 0, changes ), + VFUNCTION(total_changes, 0, 0, 0, total_changes ), + FUNCTION(replace, 3, 0, 0, replaceFunc ), + FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ), + FUNCTION(substr, 2, 0, 0, substrFunc ), + FUNCTION(substr, 3, 0, 0, substrFunc ), + WAGGREGATE(sum, 1,0,0, sumStep, sumFinalize, sumFinalize, sumInverse, 0), + WAGGREGATE(total, 1,0,0, sumStep,totalFinalize,totalFinalize,sumInverse, 0), + WAGGREGATE(avg, 1,0,0, sumStep, avgFinalize, avgFinalize, sumInverse, 0), + WAGGREGATE(count, 0,0,0, countStep, + countFinalize, countFinalize, countInverse, SQLITE_FUNC_COUNT ), + WAGGREGATE(count, 1,0,0, countStep, + countFinalize, countFinalize, countInverse, 0 ), + WAGGREGATE(group_concat, 1, 0, 0, groupConcatStep, + groupConcatFinalize, groupConcatValue, groupConcatInverse, 0), + WAGGREGATE(group_concat, 2, 0, 0, groupConcatStep, + groupConcatFinalize, groupConcatValue, groupConcatInverse, 0), + + LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), +#ifdef SQLITE_CASE_SENSITIVE_LIKE + LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), + LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), +#else + LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE), + LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE), +#endif +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + FUNCTION(unknown, -1, 0, 0, unknownFunc ), +#endif + FUNCTION(coalesce, 1, 0, 0, 0 ), + FUNCTION(coalesce, 0, 0, 0, 0 ), + INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, 0 ), + INLINE_FUNC(iif, 3, INLINEFUNC_iif, 0 ), + }; +#ifndef SQLITE_OMIT_ALTERTABLE + sqlite3AlterFunctions(); +#endif + sqlite3WindowFunctions(); + sqlite3RegisterDateTimeFunctions(); + sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc)); + +#if 0 /* Enable to print out how the built-in functions are hashed */ + { + int i; + FuncDef *p; + for(i=0; iu.pHash){ + int n = sqlite3Strlen30(p->zName); + int h = p->zName[0] + n; + printf(" %s(%d)", p->zName, h); + } + printf("\n"); + } + } +#endif +} + +/************** End of func.c ************************************************/ +/************** Begin file fkey.c ********************************************/ +/* +** +** 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 code used by the compiler to add foreign key +** support to compiled SQL statements. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY +#ifndef SQLITE_OMIT_TRIGGER + +/* +** Deferred and Immediate FKs +** -------------------------- +** +** Foreign keys in SQLite come in two flavours: deferred and immediate. +** If an immediate foreign key constraint is violated, +** SQLITE_CONSTRAINT_FOREIGNKEY is returned and the current +** statement transaction rolled back. If a +** deferred foreign key constraint is violated, no action is taken +** immediately. However if the application attempts to commit the +** transaction before fixing the constraint violation, the attempt fails. +** +** Deferred constraints are implemented using a simple counter associated +** with the database handle. The counter is set to zero each time a +** database transaction is opened. Each time a statement is executed +** that causes a foreign key violation, the counter is incremented. Each +** time a statement is executed that removes an existing violation from +** the database, the counter is decremented. When the transaction is +** committed, the commit fails if the current value of the counter is +** greater than zero. This scheme has two big drawbacks: +** +** * When a commit fails due to a deferred foreign key constraint, +** there is no way to tell which foreign constraint is not satisfied, +** or which row it is not satisfied for. +** +** * If the database contains foreign key violations when the +** transaction is opened, this may cause the mechanism to malfunction. +** +** Despite these problems, this approach is adopted as it seems simpler +** than the alternatives. +** +** INSERT operations: +** +** I.1) For each FK for which the table is the child table, search +** the parent table for a match. If none is found increment the +** constraint counter. +** +** I.2) For each FK for which the table is the parent table, +** search the child table for rows that correspond to the new +** row in the parent table. Decrement the counter for each row +** found (as the constraint is now satisfied). +** +** DELETE operations: +** +** D.1) For each FK for which the table is the child table, +** search the parent table for a row that corresponds to the +** deleted row in the child table. If such a row is not found, +** decrement the counter. +** +** D.2) For each FK for which the table is the parent table, search +** the child table for rows that correspond to the deleted row +** in the parent table. For each found increment the counter. +** +** UPDATE operations: +** +** An UPDATE command requires that all 4 steps above are taken, but only +** for FK constraints for which the affected columns are actually +** modified (values must be compared at runtime). +** +** Note that I.1 and D.1 are very similar operations, as are I.2 and D.2. +** This simplifies the implementation a bit. +** +** For the purposes of immediate FK constraints, the OR REPLACE conflict +** resolution is considered to delete rows before the new row is inserted. +** If a delete caused by OR REPLACE violates an FK constraint, an exception +** is thrown, even if the FK constraint would be satisfied after the new +** row is inserted. +** +** Immediate constraints are usually handled similarly. The only difference +** is that the counter used is stored as part of each individual statement +** object (struct Vdbe). If, after the statement has run, its immediate +** constraint counter is greater than zero, +** it returns SQLITE_CONSTRAINT_FOREIGNKEY +** and the statement transaction is rolled back. An exception is an INSERT +** statement that inserts a single row only (no triggers). In this case, +** instead of using a counter, an exception is thrown immediately if the +** INSERT violates a foreign key constraint. This is necessary as such +** an INSERT does not open a statement transaction. +** +** TODO: How should dropping a table be handled? How should renaming a +** table be handled? +** +** +** Query API Notes +** --------------- +** +** Before coding an UPDATE or DELETE row operation, the code-generator +** for those two operations needs to know whether or not the operation +** requires any FK processing and, if so, which columns of the original +** row are required by the FK processing VDBE code (i.e. if FKs were +** implemented using triggers, which of the old.* columns would be +** accessed). No information is required by the code-generator before +** coding an INSERT operation. The functions used by the UPDATE/DELETE +** generation code to query for this information are: +** +** sqlite3FkRequired() - Test to see if FK processing is required. +** sqlite3FkOldmask() - Query for the set of required old.* columns. +** +** +** Externally accessible module functions +** -------------------------------------- +** +** sqlite3FkCheck() - Check for foreign key violations. +** sqlite3FkActions() - Code triggers for ON UPDATE/ON DELETE actions. +** sqlite3FkDelete() - Delete an FKey structure. +*/ + +/* +** VDBE Calling Convention +** ----------------------- +** +** Example: +** +** For the following INSERT statement: +** +** CREATE TABLE t1(a, b INTEGER PRIMARY KEY, c); +** INSERT INTO t1 VALUES(1, 2, 3.1); +** +** Register (x): 2 (type integer) +** Register (x+1): 1 (type integer) +** Register (x+2): NULL (type NULL) +** Register (x+3): 3.1 (type real) +*/ + +/* +** A foreign key constraint requires that the key columns in the parent +** table are collectively subject to a UNIQUE or PRIMARY KEY constraint. +** Given that pParent is the parent table for foreign key constraint pFKey, +** search the schema for a unique index on the parent key columns. +** +** If successful, zero is returned. If the parent key is an INTEGER PRIMARY +** KEY column, then output variable *ppIdx is set to NULL. Otherwise, *ppIdx +** is set to point to the unique index. +** +** If the parent key consists of a single column (the foreign key constraint +** is not a composite foreign key), output variable *paiCol is set to NULL. +** Otherwise, it is set to point to an allocated array of size N, where +** N is the number of columns in the parent key. The first element of the +** array is the index of the child table column that is mapped by the FK +** constraint to the parent table column stored in the left-most column +** of index *ppIdx. The second element of the array is the index of the +** child table column that corresponds to the second left-most column of +** *ppIdx, and so on. +** +** If the required index cannot be found, either because: +** +** 1) The named parent key columns do not exist, or +** +** 2) The named parent key columns do exist, but are not subject to a +** UNIQUE or PRIMARY KEY constraint, or +** +** 3) No parent key columns were provided explicitly as part of the +** foreign key definition, and the parent table does not have a +** PRIMARY KEY, or +** +** 4) No parent key columns were provided explicitly as part of the +** foreign key definition, and the PRIMARY KEY of the parent table +** consists of a different number of columns to the child key in +** the child table. +** +** then non-zero is returned, and a "foreign key mismatch" error loaded +** into pParse. If an OOM error occurs, non-zero is returned and the +** pParse->db->mallocFailed flag is set. +*/ +SQLITE_PRIVATE int sqlite3FkLocateIndex( + Parse *pParse, /* Parse context to store any error in */ + Table *pParent, /* Parent table of FK constraint pFKey */ + FKey *pFKey, /* Foreign key to find index for */ + Index **ppIdx, /* OUT: Unique index on parent table */ + int **paiCol /* OUT: Map of index columns in pFKey */ +){ + Index *pIdx = 0; /* Value to return via *ppIdx */ + int *aiCol = 0; /* Value to return via *paiCol */ + int nCol = pFKey->nCol; /* Number of columns in parent key */ + char *zKey = pFKey->aCol[0].zCol; /* Name of left-most parent key column */ + + /* The caller is responsible for zeroing output parameters. */ + assert( ppIdx && *ppIdx==0 ); + assert( !paiCol || *paiCol==0 ); + assert( pParse ); + + /* If this is a non-composite (single column) foreign key, check if it + ** maps to the INTEGER PRIMARY KEY of table pParent. If so, leave *ppIdx + ** and *paiCol set to zero and return early. + ** + ** Otherwise, for a composite foreign key (more than one column), allocate + ** space for the aiCol array (returned via output parameter *paiCol). + ** Non-composite foreign keys do not require the aiCol array. + */ + if( nCol==1 ){ + /* The FK maps to the IPK if any of the following are true: + ** + ** 1) There is an INTEGER PRIMARY KEY column and the FK is implicitly + ** mapped to the primary key of table pParent, or + ** 2) The FK is explicitly mapped to a column declared as INTEGER + ** PRIMARY KEY. + */ + if( pParent->iPKey>=0 ){ + if( !zKey ) return 0; + if( !sqlite3StrICmp(pParent->aCol[pParent->iPKey].zName, zKey) ) return 0; + } + }else if( paiCol ){ + assert( nCol>1 ); + aiCol = (int *)sqlite3DbMallocRawNN(pParse->db, nCol*sizeof(int)); + if( !aiCol ) return 1; + *paiCol = aiCol; + } + + for(pIdx=pParent->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->nKeyCol==nCol && IsUniqueIndex(pIdx) && pIdx->pPartIdxWhere==0 ){ + /* pIdx is a UNIQUE index (or a PRIMARY KEY) and has the right number + ** of columns. If each indexed column corresponds to a foreign key + ** column of pFKey, then this index is a winner. */ + + if( zKey==0 ){ + /* If zKey is NULL, then this foreign key is implicitly mapped to + ** the PRIMARY KEY of table pParent. The PRIMARY KEY index may be + ** identified by the test. */ + if( IsPrimaryKeyIndex(pIdx) ){ + if( aiCol ){ + int i; + for(i=0; iaCol[i].iFrom; + } + break; + } + }else{ + /* If zKey is non-NULL, then this foreign key was declared to + ** map to an explicit list of columns in table pParent. Check if this + ** index matches those columns. Also, check that the index uses + ** the default collation sequences for each column. */ + int i, j; + for(i=0; iaiColumn[i]; /* Index of column in parent tbl */ + const char *zDfltColl; /* Def. collation for column */ + char *zIdxCol; /* Name of indexed column */ + + if( iCol<0 ) break; /* No foreign keys against expression indexes */ + + /* If the index uses a collation sequence that is different from + ** the default collation sequence for the column, this index is + ** unusable. Bail out early in this case. */ + zDfltColl = pParent->aCol[iCol].zColl; + if( !zDfltColl ) zDfltColl = sqlite3StrBINARY; + if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break; + + zIdxCol = pParent->aCol[iCol].zName; + for(j=0; jaCol[j].zCol, zIdxCol)==0 ){ + if( aiCol ) aiCol[i] = pFKey->aCol[j].iFrom; + break; + } + } + if( j==nCol ) break; + } + if( i==nCol ) break; /* pIdx is usable */ + } + } + } + + if( !pIdx ){ + if( !pParse->disableTriggers ){ + sqlite3ErrorMsg(pParse, + "foreign key mismatch - \"%w\" referencing \"%w\"", + pFKey->pFrom->zName, pFKey->zTo); + } + sqlite3DbFree(pParse->db, aiCol); + return 1; + } + + *ppIdx = pIdx; + return 0; +} + +/* +** This function is called when a row is inserted into or deleted from the +** child table of foreign key constraint pFKey. If an SQL UPDATE is executed +** on the child table of pFKey, this function is invoked twice for each row +** affected - once to "delete" the old row, and then again to "insert" the +** new row. +** +** Each time it is called, this function generates VDBE code to locate the +** row in the parent table that corresponds to the row being inserted into +** or deleted from the child table. If the parent row can be found, no +** special action is taken. Otherwise, if the parent row can *not* be +** found in the parent table: +** +** Operation | FK type | Action taken +** -------------------------------------------------------------------------- +** INSERT immediate Increment the "immediate constraint counter". +** +** DELETE immediate Decrement the "immediate constraint counter". +** +** INSERT deferred Increment the "deferred constraint counter". +** +** DELETE deferred Decrement the "deferred constraint counter". +** +** These operations are identified in the comment at the top of this file +** (fkey.c) as "I.1" and "D.1". +*/ +static void fkLookupParent( + Parse *pParse, /* Parse context */ + int iDb, /* Index of database housing pTab */ + Table *pTab, /* Parent table of FK pFKey */ + Index *pIdx, /* Unique index on parent key columns in pTab */ + FKey *pFKey, /* Foreign key constraint */ + int *aiCol, /* Map from parent key columns to child table columns */ + int regData, /* Address of array containing child table row */ + int nIncr, /* Increment constraint counter by this */ + int isIgnore /* If true, pretend pTab contains all NULL values */ +){ + int i; /* Iterator variable */ + Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */ + int iCur = pParse->nTab - 1; /* Cursor number to use */ + int iOk = sqlite3VdbeMakeLabel(pParse); /* jump here if parent key found */ + + sqlite3VdbeVerifyAbortable(v, + (!pFKey->isDeferred + && !(pParse->db->flags & SQLITE_DeferFKs) + && !pParse->pToplevel + && !pParse->isMultiWrite) ? OE_Abort : OE_Ignore); + + /* If nIncr is less than zero, then check at runtime if there are any + ** outstanding constraints to resolve. If there are not, there is no need + ** to check if deleting this row resolves any outstanding violations. + ** + ** Check if any of the key columns in the child table row are NULL. If + ** any are, then the constraint is considered satisfied. No need to + ** search for a matching row in the parent table. */ + if( nIncr<0 ){ + sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, iOk); + VdbeCoverage(v); + } + for(i=0; inCol; i++){ + int iReg = sqlite3TableColumnToStorage(pFKey->pFrom,aiCol[i]) + regData + 1; + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iOk); VdbeCoverage(v); + } + + if( isIgnore==0 ){ + if( pIdx==0 ){ + /* If pIdx is NULL, then the parent key is the INTEGER PRIMARY KEY + ** column of the parent table (table pTab). */ + int iMustBeInt; /* Address of MustBeInt instruction */ + int regTemp = sqlite3GetTempReg(pParse); + + /* Invoke MustBeInt to coerce the child key value to an integer (i.e. + ** apply the affinity of the parent key). If this fails, then there + ** is no matching parent key. Before using MustBeInt, make a copy of + ** the value. Otherwise, the value inserted into the child key column + ** will have INTEGER affinity applied to it, which may not be correct. */ + sqlite3VdbeAddOp2(v, OP_SCopy, + sqlite3TableColumnToStorage(pFKey->pFrom,aiCol[0])+1+regData, regTemp); + iMustBeInt = sqlite3VdbeAddOp2(v, OP_MustBeInt, regTemp, 0); + VdbeCoverage(v); + + /* If the parent table is the same as the child table, and we are about + ** to increment the constraint-counter (i.e. this is an INSERT operation), + ** then check if the row being inserted matches itself. If so, do not + ** increment the constraint-counter. */ + if( pTab==pFKey->pFrom && nIncr==1 ){ + sqlite3VdbeAddOp3(v, OP_Eq, regData, iOk, regTemp); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + } + + sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); + sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regTemp); VdbeCoverage(v); + sqlite3VdbeGoto(v, iOk); + sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); + sqlite3VdbeJumpHere(v, iMustBeInt); + sqlite3ReleaseTempReg(pParse, regTemp); + }else{ + int nCol = pFKey->nCol; + int regTemp = sqlite3GetTempRange(pParse, nCol); + int regRec = sqlite3GetTempReg(pParse); + + sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + for(i=0; ipFrom, aiCol[i])+1+regData, + regTemp+i); + } + + /* If the parent table is the same as the child table, and we are about + ** to increment the constraint-counter (i.e. this is an INSERT operation), + ** then check if the row being inserted matches itself. If so, do not + ** increment the constraint-counter. + ** + ** If any of the parent-key values are NULL, then the row cannot match + ** itself. So set JUMPIFNULL to make sure we do the OP_Found if any + ** of the parent-key values are NULL (at this point it is known that + ** none of the child key values are). + */ + if( pTab==pFKey->pFrom && nIncr==1 ){ + int iJump = sqlite3VdbeCurrentAddr(v) + nCol + 1; + for(i=0; ipFrom,aiCol[i]) + +1+regData; + int iParent = 1+regData; + iParent += sqlite3TableColumnToStorage(pIdx->pTable, + pIdx->aiColumn[i]); + assert( pIdx->aiColumn[i]>=0 ); + assert( aiCol[i]!=pTab->iPKey ); + if( pIdx->aiColumn[i]==pTab->iPKey ){ + /* The parent key is a composite key that includes the IPK column */ + iParent = regData; + } + sqlite3VdbeAddOp3(v, OP_Ne, iChild, iJump, iParent); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); + } + sqlite3VdbeGoto(v, iOk); + } + + sqlite3VdbeAddOp4(v, OP_MakeRecord, regTemp, nCol, regRec, + sqlite3IndexAffinityStr(pParse->db,pIdx), nCol); + sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); VdbeCoverage(v); + + sqlite3ReleaseTempReg(pParse, regRec); + sqlite3ReleaseTempRange(pParse, regTemp, nCol); + } + } + + if( !pFKey->isDeferred && !(pParse->db->flags & SQLITE_DeferFKs) + && !pParse->pToplevel + && !pParse->isMultiWrite + ){ + /* Special case: If this is an INSERT statement that will insert exactly + ** one row into the table, raise a constraint immediately instead of + ** incrementing a counter. This is necessary as the VM code is being + ** generated for will not open a statement transaction. */ + assert( nIncr==1 ); + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY, + OE_Abort, 0, P4_STATIC, P5_ConstraintFK); + }else{ + if( nIncr>0 && pFKey->isDeferred==0 ){ + sqlite3MayAbort(pParse); + } + sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr); + } + + sqlite3VdbeResolveLabel(v, iOk); + sqlite3VdbeAddOp1(v, OP_Close, iCur); +} + + +/* +** Return an Expr object that refers to a memory register corresponding +** to column iCol of table pTab. +** +** regBase is the first of an array of register that contains the data +** for pTab. regBase itself holds the rowid. regBase+1 holds the first +** column. regBase+2 holds the second column, and so forth. +*/ +static Expr *exprTableRegister( + Parse *pParse, /* Parsing and code generating context */ + Table *pTab, /* The table whose content is at r[regBase]... */ + int regBase, /* Contents of table pTab */ + i16 iCol /* Which column of pTab is desired */ +){ + Expr *pExpr; + Column *pCol; + const char *zColl; + sqlite3 *db = pParse->db; + + pExpr = sqlite3Expr(db, TK_REGISTER, 0); + if( pExpr ){ + if( iCol>=0 && iCol!=pTab->iPKey ){ + pCol = &pTab->aCol[iCol]; + pExpr->iTable = regBase + sqlite3TableColumnToStorage(pTab,iCol) + 1; + pExpr->affExpr = pCol->affinity; + zColl = pCol->zColl; + if( zColl==0 ) zColl = db->pDfltColl->zName; + pExpr = sqlite3ExprAddCollateString(pParse, pExpr, zColl); + }else{ + pExpr->iTable = regBase; + pExpr->affExpr = SQLITE_AFF_INTEGER; + } + } + return pExpr; +} + +/* +** Return an Expr object that refers to column iCol of table pTab which +** has cursor iCur. +*/ +static Expr *exprTableColumn( + sqlite3 *db, /* The database connection */ + Table *pTab, /* The table whose column is desired */ + int iCursor, /* The open cursor on the table */ + i16 iCol /* The column that is wanted */ +){ + Expr *pExpr = sqlite3Expr(db, TK_COLUMN, 0); + if( pExpr ){ + pExpr->y.pTab = pTab; + pExpr->iTable = iCursor; + pExpr->iColumn = iCol; + } + return pExpr; +} + +/* +** This function is called to generate code executed when a row is deleted +** from the parent table of foreign key constraint pFKey and, if pFKey is +** deferred, when a row is inserted into the same table. When generating +** code for an SQL UPDATE operation, this function may be called twice - +** once to "delete" the old row and once to "insert" the new row. +** +** Parameter nIncr is passed -1 when inserting a row (as this may decrease +** the number of FK violations in the db) or +1 when deleting one (as this +** may increase the number of FK constraint problems). +** +** The code generated by this function scans through the rows in the child +** table that correspond to the parent table row being deleted or inserted. +** For each child row found, one of the following actions is taken: +** +** Operation | FK type | Action taken +** -------------------------------------------------------------------------- +** DELETE immediate Increment the "immediate constraint counter". +** Or, if the ON (UPDATE|DELETE) action is RESTRICT, +** throw a "FOREIGN KEY constraint failed" exception. +** +** INSERT immediate Decrement the "immediate constraint counter". +** +** DELETE deferred Increment the "deferred constraint counter". +** Or, if the ON (UPDATE|DELETE) action is RESTRICT, +** throw a "FOREIGN KEY constraint failed" exception. +** +** INSERT deferred Decrement the "deferred constraint counter". +** +** These operations are identified in the comment at the top of this file +** (fkey.c) as "I.2" and "D.2". +*/ +static void fkScanChildren( + Parse *pParse, /* Parse context */ + SrcList *pSrc, /* The child table to be scanned */ + Table *pTab, /* The parent table */ + Index *pIdx, /* Index on parent covering the foreign key */ + FKey *pFKey, /* The foreign key linking pSrc to pTab */ + int *aiCol, /* Map from pIdx cols to child table cols */ + int regData, /* Parent row data starts here */ + int nIncr /* Amount to increment deferred counter by */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + int i; /* Iterator variable */ + Expr *pWhere = 0; /* WHERE clause to scan with */ + NameContext sNameContext; /* Context used to resolve WHERE clause */ + WhereInfo *pWInfo; /* Context used by sqlite3WhereXXX() */ + int iFkIfZero = 0; /* Address of OP_FkIfZero */ + Vdbe *v = sqlite3GetVdbe(pParse); + + assert( pIdx==0 || pIdx->pTable==pTab ); + assert( pIdx==0 || pIdx->nKeyCol==pFKey->nCol ); + assert( pIdx!=0 || pFKey->nCol==1 ); + assert( pIdx!=0 || HasRowid(pTab) ); + + if( nIncr<0 ){ + iFkIfZero = sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, 0); + VdbeCoverage(v); + } + + /* Create an Expr object representing an SQL expression like: + ** + ** = AND = ... + ** + ** The collation sequence used for the comparison should be that of + ** the parent key columns. The affinity of the parent key column should + ** be applied to each child key value before the comparison takes place. + */ + for(i=0; inCol; i++){ + Expr *pLeft; /* Value from parent table row */ + Expr *pRight; /* Column ref to child table */ + Expr *pEq; /* Expression (pLeft = pRight) */ + i16 iCol; /* Index of column in child table */ + const char *zCol; /* Name of column in child table */ + + iCol = pIdx ? pIdx->aiColumn[i] : -1; + pLeft = exprTableRegister(pParse, pTab, regData, iCol); + iCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom; + assert( iCol>=0 ); + zCol = pFKey->pFrom->aCol[iCol].zName; + pRight = sqlite3Expr(db, TK_ID, zCol); + pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); + pWhere = sqlite3ExprAnd(pParse, pWhere, pEq); + } + + /* If the child table is the same as the parent table, then add terms + ** to the WHERE clause that prevent this entry from being scanned. + ** The added WHERE clause terms are like this: + ** + ** $current_rowid!=rowid + ** NOT( $current_a==a AND $current_b==b AND ... ) + ** + ** The first form is used for rowid tables. The second form is used + ** for WITHOUT ROWID tables. In the second form, the *parent* key is + ** (a,b,...). Either the parent or primary key could be used to + ** uniquely identify the current row, but the parent key is more convenient + ** as the required values have already been loaded into registers + ** by the caller. + */ + if( pTab==pFKey->pFrom && nIncr>0 ){ + Expr *pNe; /* Expression (pLeft != pRight) */ + Expr *pLeft; /* Value from parent table row */ + Expr *pRight; /* Column ref to child table */ + if( HasRowid(pTab) ){ + pLeft = exprTableRegister(pParse, pTab, regData, -1); + pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, -1); + pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight); + }else{ + Expr *pEq, *pAll = 0; + assert( pIdx!=0 ); + for(i=0; inKeyCol; i++){ + i16 iCol = pIdx->aiColumn[i]; + assert( iCol>=0 ); + pLeft = exprTableRegister(pParse, pTab, regData, iCol); + pRight = sqlite3Expr(db, TK_ID, pTab->aCol[iCol].zName); + pEq = sqlite3PExpr(pParse, TK_IS, pLeft, pRight); + pAll = sqlite3ExprAnd(pParse, pAll, pEq); + } + pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0); + } + pWhere = sqlite3ExprAnd(pParse, pWhere, pNe); + } + + /* Resolve the references in the WHERE clause. */ + memset(&sNameContext, 0, sizeof(NameContext)); + sNameContext.pSrcList = pSrc; + sNameContext.pParse = pParse; + sqlite3ResolveExprNames(&sNameContext, pWhere); + + /* Create VDBE to loop through the entries in pSrc that match the WHERE + ** clause. For each row found, increment either the deferred or immediate + ** foreign key constraint counter. */ + if( pParse->nErr==0 ){ + pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0); + sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr); + if( pWInfo ){ + sqlite3WhereEnd(pWInfo); + } + } + + /* Clean up the WHERE clause constructed above. */ + sqlite3ExprDelete(db, pWhere); + if( iFkIfZero ){ + sqlite3VdbeJumpHereOrPopInst(v, iFkIfZero); + } +} + +/* +** This function returns a linked list of FKey objects (connected by +** FKey.pNextTo) holding all children of table pTab. For example, +** given the following schema: +** +** CREATE TABLE t1(a PRIMARY KEY); +** CREATE TABLE t2(b REFERENCES t1(a); +** +** Calling this function with table "t1" as an argument returns a pointer +** to the FKey structure representing the foreign key constraint on table +** "t2". Calling this function with "t2" as the argument would return a +** NULL pointer (as there are no FK constraints for which t2 is the parent +** table). +*/ +SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *pTab){ + return (FKey *)sqlite3HashFind(&pTab->pSchema->fkeyHash, pTab->zName); +} + +/* +** The second argument is a Trigger structure allocated by the +** fkActionTrigger() routine. This function deletes the Trigger structure +** and all of its sub-components. +** +** The Trigger structure or any of its sub-components may be allocated from +** the lookaside buffer belonging to database handle dbMem. +*/ +static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){ + if( p ){ + TriggerStep *pStep = p->step_list; + sqlite3ExprDelete(dbMem, pStep->pWhere); + sqlite3ExprListDelete(dbMem, pStep->pExprList); + sqlite3SelectDelete(dbMem, pStep->pSelect); + sqlite3ExprDelete(dbMem, p->pWhen); + sqlite3DbFree(dbMem, p); + } +} + +/* +** This function is called to generate code that runs when table pTab is +** being dropped from the database. The SrcList passed as the second argument +** to this function contains a single entry guaranteed to resolve to +** table pTab. +** +** Normally, no code is required. However, if either +** +** (a) The table is the parent table of a FK constraint, or +** (b) The table is the child table of a deferred FK constraint and it is +** determined at runtime that there are outstanding deferred FK +** constraint violations in the database, +** +** then the equivalent of "DELETE FROM " is executed before dropping +** the table from the database. Triggers are disabled while running this +** DELETE, but foreign key actions are not. +*/ +SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){ + sqlite3 *db = pParse->db; + if( (db->flags&SQLITE_ForeignKeys) && !IsVirtual(pTab) ){ + int iSkip = 0; + Vdbe *v = sqlite3GetVdbe(pParse); + + assert( v ); /* VDBE has already been allocated */ + assert( pTab->pSelect==0 ); /* Not a view */ + if( sqlite3FkReferences(pTab)==0 ){ + /* Search for a deferred foreign key constraint for which this table + ** is the child table. If one cannot be found, return without + ** generating any VDBE code. If one can be found, then jump over + ** the entire DELETE if there are no outstanding deferred constraints + ** when this statement is run. */ + FKey *p; + for(p=pTab->pFKey; p; p=p->pNextFrom){ + if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break; + } + if( !p ) return; + iSkip = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v); + } + + pParse->disableTriggers = 1; + sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0, 0, 0); + pParse->disableTriggers = 0; + + /* If the DELETE has generated immediate foreign key constraint + ** violations, halt the VDBE and return an error at this point, before + ** any modifications to the schema are made. This is because statement + ** transactions are not able to rollback schema changes. + ** + ** If the SQLITE_DeferFKs flag is set, then this is not required, as + ** the statement transaction will not be rolled back even if FK + ** constraints are violated. + */ + if( (db->flags & SQLITE_DeferFKs)==0 ){ + sqlite3VdbeVerifyAbortable(v, OE_Abort); + sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY, + OE_Abort, 0, P4_STATIC, P5_ConstraintFK); + } + + if( iSkip ){ + sqlite3VdbeResolveLabel(v, iSkip); + } + } +} + + +/* +** The second argument points to an FKey object representing a foreign key +** for which pTab is the child table. An UPDATE statement against pTab +** is currently being processed. For each column of the table that is +** actually updated, the corresponding element in the aChange[] array +** is zero or greater (if a column is unmodified the corresponding element +** is set to -1). If the rowid column is modified by the UPDATE statement +** the bChngRowid argument is non-zero. +** +** This function returns true if any of the columns that are part of the +** child key for FK constraint *p are modified. +*/ +static int fkChildIsModified( + Table *pTab, /* Table being updated */ + FKey *p, /* Foreign key for which pTab is the child */ + int *aChange, /* Array indicating modified columns */ + int bChngRowid /* True if rowid is modified by this update */ +){ + int i; + for(i=0; inCol; i++){ + int iChildKey = p->aCol[i].iFrom; + if( aChange[iChildKey]>=0 ) return 1; + if( iChildKey==pTab->iPKey && bChngRowid ) return 1; + } + return 0; +} + +/* +** The second argument points to an FKey object representing a foreign key +** for which pTab is the parent table. An UPDATE statement against pTab +** is currently being processed. For each column of the table that is +** actually updated, the corresponding element in the aChange[] array +** is zero or greater (if a column is unmodified the corresponding element +** is set to -1). If the rowid column is modified by the UPDATE statement +** the bChngRowid argument is non-zero. +** +** This function returns true if any of the columns that are part of the +** parent key for FK constraint *p are modified. +*/ +static int fkParentIsModified( + Table *pTab, + FKey *p, + int *aChange, + int bChngRowid +){ + int i; + for(i=0; inCol; i++){ + char *zKey = p->aCol[i].zCol; + int iKey; + for(iKey=0; iKeynCol; iKey++){ + if( aChange[iKey]>=0 || (iKey==pTab->iPKey && bChngRowid) ){ + Column *pCol = &pTab->aCol[iKey]; + if( zKey ){ + if( 0==sqlite3StrICmp(pCol->zName, zKey) ) return 1; + }else if( pCol->colFlags & COLFLAG_PRIMKEY ){ + return 1; + } + } + } + } + return 0; +} + +/* +** Return true if the parser passed as the first argument is being +** used to code a trigger that is really a "SET NULL" action belonging +** to trigger pFKey. +*/ +static int isSetNullAction(Parse *pParse, FKey *pFKey){ + Parse *pTop = sqlite3ParseToplevel(pParse); + if( pTop->pTriggerPrg ){ + Trigger *p = pTop->pTriggerPrg->pTrigger; + if( (p==pFKey->apTrigger[0] && pFKey->aAction[0]==OE_SetNull) + || (p==pFKey->apTrigger[1] && pFKey->aAction[1]==OE_SetNull) + ){ + return 1; + } + } + return 0; +} + +/* +** This function is called when inserting, deleting or updating a row of +** table pTab to generate VDBE code to perform foreign key constraint +** processing for the operation. +** +** For a DELETE operation, parameter regOld is passed the index of the +** first register in an array of (pTab->nCol+1) registers containing the +** rowid of the row being deleted, followed by each of the column values +** of the row being deleted, from left to right. Parameter regNew is passed +** zero in this case. +** +** For an INSERT operation, regOld is passed zero and regNew is passed the +** first register of an array of (pTab->nCol+1) registers containing the new +** row data. +** +** For an UPDATE operation, this function is called twice. Once before +** the original record is deleted from the table using the calling convention +** described for DELETE. Then again after the original record is deleted +** but before the new record is inserted using the INSERT convention. +*/ +SQLITE_PRIVATE void sqlite3FkCheck( + Parse *pParse, /* Parse context */ + Table *pTab, /* Row is being deleted from this table */ + int regOld, /* Previous row data is stored here */ + int regNew, /* New row data is stored here */ + int *aChange, /* Array indicating UPDATEd columns (or 0) */ + int bChngRowid /* True if rowid is UPDATEd */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + FKey *pFKey; /* Used to iterate through FKs */ + int iDb; /* Index of database containing pTab */ + const char *zDb; /* Name of database containing pTab */ + int isIgnoreErrors = pParse->disableTriggers; + + /* Exactly one of regOld and regNew should be non-zero. */ + assert( (regOld==0)!=(regNew==0) ); + + /* If foreign-keys are disabled, this function is a no-op. */ + if( (db->flags&SQLITE_ForeignKeys)==0 ) return; + + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + zDb = db->aDb[iDb].zDbSName; + + /* Loop through all the foreign key constraints for which pTab is the + ** child table (the table that the foreign key definition is part of). */ + for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + Table *pTo; /* Parent table of foreign key pFKey */ + Index *pIdx = 0; /* Index on key columns in pTo */ + int *aiFree = 0; + int *aiCol; + int iCol; + int i; + int bIgnore = 0; + + if( aChange + && sqlite3_stricmp(pTab->zName, pFKey->zTo)!=0 + && fkChildIsModified(pTab, pFKey, aChange, bChngRowid)==0 + ){ + continue; + } + + /* Find the parent table of this foreign key. Also find a unique index + ** on the parent key columns in the parent table. If either of these + ** schema items cannot be located, set an error in pParse and return + ** early. */ + if( pParse->disableTriggers ){ + pTo = sqlite3FindTable(db, pFKey->zTo, zDb); + }else{ + pTo = sqlite3LocateTable(pParse, 0, pFKey->zTo, zDb); + } + if( !pTo || sqlite3FkLocateIndex(pParse, pTo, pFKey, &pIdx, &aiFree) ){ + assert( isIgnoreErrors==0 || (regOld!=0 && regNew==0) ); + if( !isIgnoreErrors || db->mallocFailed ) return; + if( pTo==0 ){ + /* If isIgnoreErrors is true, then a table is being dropped. In this + ** case SQLite runs a "DELETE FROM xxx" on the table being dropped + ** before actually dropping it in order to check FK constraints. + ** If the parent table of an FK constraint on the current table is + ** missing, behave as if it is empty. i.e. decrement the relevant + ** FK counter for each row of the current table with non-NULL keys. + */ + Vdbe *v = sqlite3GetVdbe(pParse); + int iJump = sqlite3VdbeCurrentAddr(v) + pFKey->nCol + 1; + for(i=0; inCol; i++){ + int iFromCol, iReg; + iFromCol = pFKey->aCol[i].iFrom; + iReg = sqlite3TableColumnToStorage(pFKey->pFrom,iFromCol) + regOld+1; + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iJump); VdbeCoverage(v); + } + sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, -1); + } + continue; + } + assert( pFKey->nCol==1 || (aiFree && pIdx) ); + + if( aiFree ){ + aiCol = aiFree; + }else{ + iCol = pFKey->aCol[0].iFrom; + aiCol = &iCol; + } + for(i=0; inCol; i++){ + if( aiCol[i]==pTab->iPKey ){ + aiCol[i] = -1; + } + assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Request permission to read the parent key columns. If the + ** authorization callback returns SQLITE_IGNORE, behave as if any + ** values read from the parent table are NULL. */ + if( db->xAuth ){ + int rcauth; + char *zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zName; + rcauth = sqlite3AuthReadCol(pParse, pTo->zName, zCol, iDb); + bIgnore = (rcauth==SQLITE_IGNORE); + } +#endif + } + + /* Take a shared-cache advisory read-lock on the parent table. Allocate + ** a cursor to use to search the unique index on the parent key columns + ** in the parent table. */ + sqlite3TableLock(pParse, iDb, pTo->tnum, 0, pTo->zName); + pParse->nTab++; + + if( regOld!=0 ){ + /* A row is being removed from the child table. Search for the parent. + ** If the parent does not exist, removing the child row resolves an + ** outstanding foreign key constraint violation. */ + fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regOld, -1, bIgnore); + } + if( regNew!=0 && !isSetNullAction(pParse, pFKey) ){ + /* A row is being added to the child table. If a parent row cannot + ** be found, adding the child row has violated the FK constraint. + ** + ** If this operation is being performed as part of a trigger program + ** that is actually a "SET NULL" action belonging to this very + ** foreign key, then omit this scan altogether. As all child key + ** values are guaranteed to be NULL, it is not possible for adding + ** this row to cause an FK violation. */ + fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regNew, +1, bIgnore); + } + + sqlite3DbFree(db, aiFree); + } + + /* Loop through all the foreign key constraints that refer to this table. + ** (the "child" constraints) */ + for(pFKey = sqlite3FkReferences(pTab); pFKey; pFKey=pFKey->pNextTo){ + Index *pIdx = 0; /* Foreign key index for pFKey */ + SrcList *pSrc; + int *aiCol = 0; + + if( aChange && fkParentIsModified(pTab, pFKey, aChange, bChngRowid)==0 ){ + continue; + } + + if( !pFKey->isDeferred && !(db->flags & SQLITE_DeferFKs) + && !pParse->pToplevel && !pParse->isMultiWrite + ){ + assert( regOld==0 && regNew!=0 ); + /* Inserting a single row into a parent table cannot cause (or fix) + ** an immediate foreign key violation. So do nothing in this case. */ + continue; + } + + if( sqlite3FkLocateIndex(pParse, pTab, pFKey, &pIdx, &aiCol) ){ + if( !isIgnoreErrors || db->mallocFailed ) return; + continue; + } + assert( aiCol || pFKey->nCol==1 ); + + /* Create a SrcList structure containing the child table. We need the + ** child table as a SrcList for sqlite3WhereBegin() */ + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pSrc ){ + struct SrcList_item *pItem = pSrc->a; + pItem->pTab = pFKey->pFrom; + pItem->zName = pFKey->pFrom->zName; + pItem->pTab->nTabRef++; + pItem->iCursor = pParse->nTab++; + + if( regNew!=0 ){ + fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regNew, -1); + } + if( regOld!=0 ){ + int eAction = pFKey->aAction[aChange!=0]; + fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regOld, 1); + /* If this is a deferred FK constraint, or a CASCADE or SET NULL + ** action applies, then any foreign key violations caused by + ** removing the parent key will be rectified by the action trigger. + ** So do not set the "may-abort" flag in this case. + ** + ** Note 1: If the FK is declared "ON UPDATE CASCADE", then the + ** may-abort flag will eventually be set on this statement anyway + ** (when this function is called as part of processing the UPDATE + ** within the action trigger). + ** + ** Note 2: At first glance it may seem like SQLite could simply omit + ** all OP_FkCounter related scans when either CASCADE or SET NULL + ** applies. The trouble starts if the CASCADE or SET NULL action + ** trigger causes other triggers or action rules attached to the + ** child table to fire. In these cases the fk constraint counters + ** might be set incorrectly if any OP_FkCounter related scans are + ** omitted. */ + if( !pFKey->isDeferred && eAction!=OE_Cascade && eAction!=OE_SetNull ){ + sqlite3MayAbort(pParse); + } + } + pItem->zName = 0; + sqlite3SrcListDelete(db, pSrc); + } + sqlite3DbFree(db, aiCol); + } +} + +#define COLUMN_MASK(x) (((x)>31) ? 0xffffffff : ((u32)1<<(x))) + +/* +** This function is called before generating code to update or delete a +** row contained in table pTab. +*/ +SQLITE_PRIVATE u32 sqlite3FkOldmask( + Parse *pParse, /* Parse context */ + Table *pTab /* Table being modified */ +){ + u32 mask = 0; + if( pParse->db->flags&SQLITE_ForeignKeys ){ + FKey *p; + int i; + for(p=pTab->pFKey; p; p=p->pNextFrom){ + for(i=0; inCol; i++) mask |= COLUMN_MASK(p->aCol[i].iFrom); + } + for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ + Index *pIdx = 0; + sqlite3FkLocateIndex(pParse, pTab, p, &pIdx, 0); + if( pIdx ){ + for(i=0; inKeyCol; i++){ + assert( pIdx->aiColumn[i]>=0 ); + mask |= COLUMN_MASK(pIdx->aiColumn[i]); + } + } + } + } + return mask; +} + + +/* +** This function is called before generating code to update or delete a +** row contained in table pTab. If the operation is a DELETE, then +** parameter aChange is passed a NULL value. For an UPDATE, aChange points +** to an array of size N, where N is the number of columns in table pTab. +** If the i'th column is not modified by the UPDATE, then the corresponding +** entry in the aChange[] array is set to -1. If the column is modified, +** the value is 0 or greater. Parameter chngRowid is set to true if the +** UPDATE statement modifies the rowid fields of the table. +** +** If any foreign key processing will be required, this function returns +** non-zero. If there is no foreign key related processing, this function +** returns zero. +** +** For an UPDATE, this function returns 2 if: +** +** * There are any FKs for which pTab is the child and the parent table, or +** * the UPDATE modifies one or more parent keys for which the action is +** not "NO ACTION" (i.e. is CASCADE, SET DEFAULT or SET NULL). +** +** Or, assuming some other foreign key processing is required, 1. +*/ +SQLITE_PRIVATE int sqlite3FkRequired( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being modified */ + int *aChange, /* Non-NULL for UPDATE operations */ + int chngRowid /* True for UPDATE that affects rowid */ +){ + int eRet = 0; + if( pParse->db->flags&SQLITE_ForeignKeys ){ + if( !aChange ){ + /* A DELETE operation. Foreign key processing is required if the + ** table in question is either the child or parent table for any + ** foreign key constraint. */ + eRet = (sqlite3FkReferences(pTab) || pTab->pFKey); + }else{ + /* This is an UPDATE. Foreign key processing is only required if the + ** operation modifies one or more child or parent key columns. */ + FKey *p; + + /* Check if any child key columns are being modified. */ + for(p=pTab->pFKey; p; p=p->pNextFrom){ + if( 0==sqlite3_stricmp(pTab->zName, p->zTo) ) return 2; + if( fkChildIsModified(pTab, p, aChange, chngRowid) ){ + eRet = 1; + } + } + + /* Check if any parent key columns are being modified. */ + for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ + if( fkParentIsModified(pTab, p, aChange, chngRowid) ){ + if( p->aAction[1]!=OE_None ) return 2; + eRet = 1; + } + } + } + } + return eRet; +} + +/* +** This function is called when an UPDATE or DELETE operation is being +** compiled on table pTab, which is the parent table of foreign-key pFKey. +** If the current operation is an UPDATE, then the pChanges parameter is +** passed a pointer to the list of columns being modified. If it is a +** DELETE, pChanges is passed a NULL pointer. +** +** It returns a pointer to a Trigger structure containing a trigger +** equivalent to the ON UPDATE or ON DELETE action specified by pFKey. +** If the action is "NO ACTION" or "RESTRICT", then a NULL pointer is +** returned (these actions require no special handling by the triggers +** sub-system, code for them is created by fkScanChildren()). +** +** For example, if pFKey is the foreign key and pTab is table "p" in +** the following schema: +** +** CREATE TABLE p(pk PRIMARY KEY); +** CREATE TABLE c(ck REFERENCES p ON DELETE CASCADE); +** +** then the returned trigger structure is equivalent to: +** +** CREATE TRIGGER ... DELETE ON p BEGIN +** DELETE FROM c WHERE ck = old.pk; +** END; +** +** The returned pointer is cached as part of the foreign key object. It +** is eventually freed along with the rest of the foreign key object by +** sqlite3FkDelete(). +*/ +static Trigger *fkActionTrigger( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being updated or deleted from */ + FKey *pFKey, /* Foreign key to get action for */ + ExprList *pChanges /* Change-list for UPDATE, NULL for DELETE */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + int action; /* One of OE_None, OE_Cascade etc. */ + Trigger *pTrigger; /* Trigger definition to return */ + int iAction = (pChanges!=0); /* 1 for UPDATE, 0 for DELETE */ + + action = pFKey->aAction[iAction]; + if( action==OE_Restrict && (db->flags & SQLITE_DeferFKs) ){ + return 0; + } + pTrigger = pFKey->apTrigger[iAction]; + + if( action!=OE_None && !pTrigger ){ + char const *zFrom; /* Name of child table */ + int nFrom; /* Length in bytes of zFrom */ + Index *pIdx = 0; /* Parent key index for this FK */ + int *aiCol = 0; /* child table cols -> parent key cols */ + TriggerStep *pStep = 0; /* First (only) step of trigger program */ + Expr *pWhere = 0; /* WHERE clause of trigger step */ + ExprList *pList = 0; /* Changes list if ON UPDATE CASCADE */ + Select *pSelect = 0; /* If RESTRICT, "SELECT RAISE(...)" */ + int i; /* Iterator variable */ + Expr *pWhen = 0; /* WHEN clause for the trigger */ + + if( sqlite3FkLocateIndex(pParse, pTab, pFKey, &pIdx, &aiCol) ) return 0; + assert( aiCol || pFKey->nCol==1 ); + + for(i=0; inCol; i++){ + Token tOld = { "old", 3 }; /* Literal "old" token */ + Token tNew = { "new", 3 }; /* Literal "new" token */ + Token tFromCol; /* Name of column in child table */ + Token tToCol; /* Name of column in parent table */ + int iFromCol; /* Idx of column in child table */ + Expr *pEq; /* tFromCol = OLD.tToCol */ + + iFromCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom; + assert( iFromCol>=0 ); + assert( pIdx!=0 || (pTab->iPKey>=0 && pTab->iPKeynCol) ); + assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); + sqlite3TokenInit(&tToCol, + pTab->aCol[pIdx ? pIdx->aiColumn[i] : pTab->iPKey].zName); + sqlite3TokenInit(&tFromCol, pFKey->pFrom->aCol[iFromCol].zName); + + /* Create the expression "OLD.zToCol = zFromCol". It is important + ** that the "OLD.zToCol" term is on the LHS of the = operator, so + ** that the affinity and collation sequence associated with the + ** parent table are used for the comparison. */ + pEq = sqlite3PExpr(pParse, TK_EQ, + sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tOld, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), + sqlite3ExprAlloc(db, TK_ID, &tFromCol, 0) + ); + pWhere = sqlite3ExprAnd(pParse, pWhere, pEq); + + /* For ON UPDATE, construct the next term of the WHEN clause. + ** The final WHEN clause will be like this: + ** + ** WHEN NOT(old.col1 IS new.col1 AND ... AND old.colN IS new.colN) + */ + if( pChanges ){ + pEq = sqlite3PExpr(pParse, TK_IS, + sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tOld, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), + sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tNew, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)) + ); + pWhen = sqlite3ExprAnd(pParse, pWhen, pEq); + } + + if( action!=OE_Restrict && (action!=OE_Cascade || pChanges) ){ + Expr *pNew; + if( action==OE_Cascade ){ + pNew = sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tNew, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)); + }else if( action==OE_SetDflt ){ + Column *pCol = pFKey->pFrom->aCol + iFromCol; + Expr *pDflt; + if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + pDflt = 0; + }else{ + pDflt = pCol->pDflt; + } + if( pDflt ){ + pNew = sqlite3ExprDup(db, pDflt, 0); + }else{ + pNew = sqlite3ExprAlloc(db, TK_NULL, 0, 0); + } + }else{ + pNew = sqlite3ExprAlloc(db, TK_NULL, 0, 0); + } + pList = sqlite3ExprListAppend(pParse, pList, pNew); + sqlite3ExprListSetName(pParse, pList, &tFromCol, 0); + } + } + sqlite3DbFree(db, aiCol); + + zFrom = pFKey->pFrom->zName; + nFrom = sqlite3Strlen30(zFrom); + + if( action==OE_Restrict ){ + Token tFrom; + Expr *pRaise; + + tFrom.z = zFrom; + tFrom.n = nFrom; + pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed"); + if( pRaise ){ + pRaise->affExpr = OE_Abort; + } + pSelect = sqlite3SelectNew(pParse, + sqlite3ExprListAppend(pParse, 0, pRaise), + sqlite3SrcListAppend(pParse, 0, &tFrom, 0), + pWhere, + 0, 0, 0, 0, 0 + ); + pWhere = 0; + } + + /* Disable lookaside memory allocation */ + DisableLookaside; + + pTrigger = (Trigger *)sqlite3DbMallocZero(db, + sizeof(Trigger) + /* struct Trigger */ + sizeof(TriggerStep) + /* Single step in trigger program */ + nFrom + 1 /* Space for pStep->zTarget */ + ); + if( pTrigger ){ + pStep = pTrigger->step_list = (TriggerStep *)&pTrigger[1]; + pStep->zTarget = (char *)&pStep[1]; + memcpy((char *)pStep->zTarget, zFrom, nFrom); + + pStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); + pStep->pExprList = sqlite3ExprListDup(db, pList, EXPRDUP_REDUCE); + pStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); + if( pWhen ){ + pWhen = sqlite3PExpr(pParse, TK_NOT, pWhen, 0); + pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE); + } + } + + /* Re-enable the lookaside buffer, if it was disabled earlier. */ + EnableLookaside; + + sqlite3ExprDelete(db, pWhere); + sqlite3ExprDelete(db, pWhen); + sqlite3ExprListDelete(db, pList); + sqlite3SelectDelete(db, pSelect); + if( db->mallocFailed==1 ){ + fkTriggerDelete(db, pTrigger); + return 0; + } + assert( pStep!=0 ); + assert( pTrigger!=0 ); + + switch( action ){ + case OE_Restrict: + pStep->op = TK_SELECT; + break; + case OE_Cascade: + if( !pChanges ){ + pStep->op = TK_DELETE; + break; + } + default: + pStep->op = TK_UPDATE; + } + pStep->pTrig = pTrigger; + pTrigger->pSchema = pTab->pSchema; + pTrigger->pTabSchema = pTab->pSchema; + pFKey->apTrigger[iAction] = pTrigger; + pTrigger->op = (pChanges ? TK_UPDATE : TK_DELETE); + } + + return pTrigger; +} + +/* +** This function is called when deleting or updating a row to implement +** any required CASCADE, SET NULL or SET DEFAULT actions. +*/ +SQLITE_PRIVATE void sqlite3FkActions( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being updated or deleted from */ + ExprList *pChanges, /* Change-list for UPDATE, NULL for DELETE */ + int regOld, /* Address of array containing old row */ + int *aChange, /* Array indicating UPDATEd columns (or 0) */ + int bChngRowid /* True if rowid is UPDATEd */ +){ + /* If foreign-key support is enabled, iterate through all FKs that + ** refer to table pTab. If there is an action associated with the FK + ** for this operation (either update or delete), invoke the associated + ** trigger sub-program. */ + if( pParse->db->flags&SQLITE_ForeignKeys ){ + FKey *pFKey; /* Iterator variable */ + for(pFKey = sqlite3FkReferences(pTab); pFKey; pFKey=pFKey->pNextTo){ + if( aChange==0 || fkParentIsModified(pTab, pFKey, aChange, bChngRowid) ){ + Trigger *pAct = fkActionTrigger(pParse, pTab, pFKey, pChanges); + if( pAct ){ + sqlite3CodeRowTriggerDirect(pParse, pAct, pTab, regOld, OE_Abort, 0); + } + } + } + } +} + +#endif /* ifndef SQLITE_OMIT_TRIGGER */ + +/* +** Free all memory associated with foreign key definitions attached to +** table pTab. Remove the deleted foreign keys from the Schema.fkeyHash +** hash table. +*/ +SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){ + FKey *pFKey; /* Iterator variable */ + FKey *pNext; /* Copy of pFKey->pNextFrom */ + + assert( db==0 || IsVirtual(pTab) + || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) ); + for(pFKey=pTab->pFKey; pFKey; pFKey=pNext){ + + /* Remove the FK from the fkeyHash hash table. */ + if( !db || db->pnBytesFreed==0 ){ + if( pFKey->pPrevTo ){ + pFKey->pPrevTo->pNextTo = pFKey->pNextTo; + }else{ + void *p = (void *)pFKey->pNextTo; + const char *z = (p ? pFKey->pNextTo->zTo : pFKey->zTo); + sqlite3HashInsert(&pTab->pSchema->fkeyHash, z, p); + } + if( pFKey->pNextTo ){ + pFKey->pNextTo->pPrevTo = pFKey->pPrevTo; + } + } + + /* EV: R-30323-21917 Each foreign key constraint in SQLite is + ** classified as either immediate or deferred. + */ + assert( pFKey->isDeferred==0 || pFKey->isDeferred==1 ); + + /* Delete any triggers created to implement actions for this FK. */ +#ifndef SQLITE_OMIT_TRIGGER + fkTriggerDelete(db, pFKey->apTrigger[0]); + fkTriggerDelete(db, pFKey->apTrigger[1]); +#endif + + pNext = pFKey->pNextFrom; + sqlite3DbFree(db, pFKey); + } +} +#endif /* ifndef SQLITE_OMIT_FOREIGN_KEY */ + +/************** End of fkey.c ************************************************/ +/************** Begin file insert.c ******************************************/ +/* +** 2001 September 15 +** +** 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 C code routines that are called by the parser +** to handle INSERT statements in SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* +** Generate code that will +** +** (1) acquire a lock for table pTab then +** (2) open pTab as cursor iCur. +** +** If pTab is a WITHOUT ROWID table, then it is the PRIMARY KEY index +** for that table that is actually opened. +*/ +SQLITE_PRIVATE void sqlite3OpenTable( + Parse *pParse, /* Generate code into this VDBE */ + int iCur, /* The cursor number of the table */ + int iDb, /* The database index in sqlite3.aDb[] */ + Table *pTab, /* The table to be opened */ + int opcode /* OP_OpenRead or OP_OpenWrite */ +){ + Vdbe *v; + assert( !IsVirtual(pTab) ); + v = sqlite3GetVdbe(pParse); + assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); + sqlite3TableLock(pParse, iDb, pTab->tnum, + (opcode==OP_OpenWrite)?1:0, pTab->zName); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nNVCol); + VdbeComment((v, "%s", pTab->zName)); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->tnum==pTab->tnum ); + sqlite3VdbeAddOp3(v, opcode, iCur, pPk->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + VdbeComment((v, "%s", pTab->zName)); + } +} + +/* +** Return a pointer to the column affinity string associated with index +** pIdx. A column affinity string has one character for each column in +** the table, according to the affinity of the column: +** +** Character Column affinity +** ------------------------------ +** 'A' BLOB +** 'B' TEXT +** 'C' NUMERIC +** 'D' INTEGER +** 'F' REAL +** +** An extra 'D' is appended to the end of the string to cover the +** rowid that appears as the last column in every index. +** +** Memory for the buffer containing the column index affinity string +** is managed along with the rest of the Index structure. It will be +** released when sqlite3DeleteIndex() is called. +*/ +SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ + if( !pIdx->zColAff ){ + /* The first time a column affinity string for a particular index is + ** required, it is allocated and populated here. It is then stored as + ** a member of the Index structure for subsequent use. + ** + ** The column affinity string will eventually be deleted by + ** sqliteDeleteIndex() when the Index structure itself is cleaned + ** up. + */ + int n; + Table *pTab = pIdx->pTable; + pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+1); + if( !pIdx->zColAff ){ + sqlite3OomFault(db); + return 0; + } + for(n=0; nnColumn; n++){ + i16 x = pIdx->aiColumn[n]; + char aff; + if( x>=0 ){ + aff = pTab->aCol[x].affinity; + }else if( x==XN_ROWID ){ + aff = SQLITE_AFF_INTEGER; + }else{ + assert( x==XN_EXPR ); + assert( pIdx->aColExpr!=0 ); + aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); + } + if( affSQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC; + pIdx->zColAff[n] = aff; + } + pIdx->zColAff[n] = 0; + } + + return pIdx->zColAff; +} + +/* +** Compute the affinity string for table pTab, if it has not already been +** computed. As an optimization, omit trailing SQLITE_AFF_BLOB affinities. +** +** If the affinity exists (if it is no entirely SQLITE_AFF_BLOB values) and +** if iReg>0 then code an OP_Affinity opcode that will set the affinities +** for register iReg and following. Or if affinities exists and iReg==0, +** then just set the P4 operand of the previous opcode (which should be +** an OP_MakeRecord) to the affinity string. +** +** A column affinity string has one character per column: +** +** Character Column affinity +** ------------------------------ +** 'A' BLOB +** 'B' TEXT +** 'C' NUMERIC +** 'D' INTEGER +** 'E' REAL +*/ +SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ + int i, j; + char *zColAff = pTab->zColAff; + if( zColAff==0 ){ + sqlite3 *db = sqlite3VdbeDb(v); + zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1); + if( !zColAff ){ + sqlite3OomFault(db); + return; + } + + for(i=j=0; inCol; i++){ + assert( pTab->aCol[i].affinity!=0 ); + if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){ + zColAff[j++] = pTab->aCol[i].affinity; + } + } + do{ + zColAff[j--] = 0; + }while( j>=0 && zColAff[j]<=SQLITE_AFF_BLOB ); + pTab->zColAff = zColAff; + } + assert( zColAff!=0 ); + i = sqlite3Strlen30NN(zColAff); + if( i ){ + if( iReg ){ + sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i); + }else{ + sqlite3VdbeChangeP4(v, -1, zColAff, i); + } + } +} + +/* +** Return non-zero if the table pTab in database iDb or any of its indices +** have been opened at any point in the VDBE program. This is used to see if +** a statement of the form "INSERT INTO SELECT ..." can +** run without using a temporary table for the results of the SELECT. +*/ +static int readsTable(Parse *p, int iDb, Table *pTab){ + Vdbe *v = sqlite3GetVdbe(p); + int i; + int iEnd = sqlite3VdbeCurrentAddr(v); +#ifndef SQLITE_OMIT_VIRTUALTABLE + VTable *pVTab = IsVirtual(pTab) ? sqlite3GetVTable(p->db, pTab) : 0; +#endif + + for(i=1; iopcode==OP_OpenRead && pOp->p3==iDb ){ + Index *pIndex; + int tnum = pOp->p2; + if( tnum==pTab->tnum ){ + return 1; + } + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( tnum==pIndex->tnum ){ + return 1; + } + } + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pOp->opcode==OP_VOpen && pOp->p4.pVtab==pVTab ){ + assert( pOp->p4.pVtab!=0 ); + assert( pOp->p4type==P4_VTAB ); + return 1; + } +#endif + } + return 0; +} + +/* This walker callback will compute the union of colFlags flags for all +** referenced columns in a CHECK constraint or generated column expression. +*/ +static int exprColumnFlagUnion(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 ){ + assert( pExpr->iColumn < pWalker->u.pTab->nCol ); + pWalker->eCode |= pWalker->u.pTab->aCol[pExpr->iColumn].colFlags; + } + return WRC_Continue; +} + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* +** All regular columns for table pTab have been puts into registers +** starting with iRegStore. The registers that correspond to STORED +** or VIRTUAL columns have not yet been initialized. This routine goes +** back and computes the values for those columns based on the previously +** computed normal columns. +*/ +SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns( + Parse *pParse, /* Parsing context */ + int iRegStore, /* Register holding the first column */ + Table *pTab /* The table */ +){ + int i; + Walker w; + Column *pRedo; + int eProgress; + VdbeOp *pOp; + + assert( pTab->tabFlags & TF_HasGenerated ); + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + + /* Before computing generated columns, first go through and make sure + ** that appropriate affinity has been applied to the regular columns + */ + sqlite3TableAffinity(pParse->pVdbe, pTab, iRegStore); + if( (pTab->tabFlags & TF_HasStored)!=0 + && (pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1))->opcode==OP_Affinity + ){ + /* Change the OP_Affinity argument to '@' (NONE) for all stored + ** columns. '@' is the no-op affinity and those columns have not + ** yet been computed. */ + int ii, jj; + char *zP4 = pOp->p4.z; + assert( zP4!=0 ); + assert( pOp->p4type==P4_DYNAMIC ); + for(ii=jj=0; zP4[jj]; ii++){ + if( pTab->aCol[ii].colFlags & COLFLAG_VIRTUAL ){ + continue; + } + if( pTab->aCol[ii].colFlags & COLFLAG_STORED ){ + zP4[jj] = SQLITE_AFF_NONE; + } + jj++; + } + } + + /* Because there can be multiple generated columns that refer to one another, + ** this is a two-pass algorithm. On the first pass, mark all generated + ** columns as "not available". + */ + for(i=0; inCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); + pTab->aCol[i].colFlags |= COLFLAG_NOTAVAIL; + } + } + + w.u.pTab = pTab; + w.xExprCallback = exprColumnFlagUnion; + w.xSelectCallback = 0; + w.xSelectCallback2 = 0; + + /* On the second pass, compute the value of each NOT-AVAILABLE column. + ** Companion code in the TK_COLUMN case of sqlite3ExprCodeTarget() will + ** compute dependencies and mark remove the COLSPAN_NOTAVAIL mark, as + ** they are needed. + */ + pParse->iSelfTab = -iRegStore; + do{ + eProgress = 0; + pRedo = 0; + for(i=0; inCol; i++){ + Column *pCol = pTab->aCol + i; + if( (pCol->colFlags & COLFLAG_NOTAVAIL)!=0 ){ + int x; + pCol->colFlags |= COLFLAG_BUSY; + w.eCode = 0; + sqlite3WalkExpr(&w, pCol->pDflt); + pCol->colFlags &= ~COLFLAG_BUSY; + if( w.eCode & COLFLAG_NOTAVAIL ){ + pRedo = pCol; + continue; + } + eProgress = 1; + assert( pCol->colFlags & COLFLAG_GENERATED ); + x = sqlite3TableColumnToStorage(pTab, i) + iRegStore; + sqlite3ExprCodeGeneratedColumn(pParse, pCol, x); + pCol->colFlags &= ~COLFLAG_NOTAVAIL; + } + } + }while( pRedo && eProgress ); + if( pRedo ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pRedo->zName); + } + pParse->iSelfTab = 0; +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + + +#ifndef SQLITE_OMIT_AUTOINCREMENT +/* +** Locate or create an AutoincInfo structure associated with table pTab +** which is in database iDb. Return the register number for the register +** that holds the maximum rowid. Return zero if pTab is not an AUTOINCREMENT +** table. (Also return zero when doing a VACUUM since we do not want to +** update the AUTOINCREMENT counters during a VACUUM.) +** +** There is at most one AutoincInfo structure per table even if the +** same table is autoincremented multiple times due to inserts within +** triggers. A new AutoincInfo structure is created if this is the +** first use of table pTab. On 2nd and subsequent uses, the original +** AutoincInfo structure is used. +** +** Four consecutive registers are allocated: +** +** (1) The name of the pTab table. +** (2) The maximum ROWID of pTab. +** (3) The rowid in sqlite_sequence of pTab +** (4) The original value of the max ROWID in pTab, or NULL if none +** +** The 2nd register is the one that is returned. That is all the +** insert routine needs to know about. +*/ +static int autoIncBegin( + Parse *pParse, /* Parsing context */ + int iDb, /* Index of the database holding pTab */ + Table *pTab /* The table we are writing to */ +){ + int memId = 0; /* Register holding maximum rowid */ + assert( pParse->db->aDb[iDb].pSchema!=0 ); + if( (pTab->tabFlags & TF_Autoincrement)!=0 + && (pParse->db->mDbFlags & DBFLAG_Vacuum)==0 + ){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + AutoincInfo *pInfo; + Table *pSeqTab = pParse->db->aDb[iDb].pSchema->pSeqTab; + + /* Verify that the sqlite_sequence table exists and is an ordinary + ** rowid table with exactly two columns. + ** Ticket d8dc2b3a58cd5dc2918a1d4acb 2018-05-23 */ + if( pSeqTab==0 + || !HasRowid(pSeqTab) + || IsVirtual(pSeqTab) + || pSeqTab->nCol!=2 + ){ + pParse->nErr++; + pParse->rc = SQLITE_CORRUPT_SEQUENCE; + return 0; + } + + pInfo = pToplevel->pAinc; + while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; } + if( pInfo==0 ){ + pInfo = sqlite3DbMallocRawNN(pParse->db, sizeof(*pInfo)); + if( pInfo==0 ) return 0; + pInfo->pNext = pToplevel->pAinc; + pToplevel->pAinc = pInfo; + pInfo->pTab = pTab; + pInfo->iDb = iDb; + pToplevel->nMem++; /* Register to hold name of table */ + pInfo->regCtr = ++pToplevel->nMem; /* Max rowid register */ + pToplevel->nMem +=2; /* Rowid in sqlite_sequence + orig max val */ + } + memId = pInfo->regCtr; + } + return memId; +} + +/* +** This routine generates code that will initialize all of the +** register used by the autoincrement tracker. +*/ +SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){ + AutoincInfo *p; /* Information about an AUTOINCREMENT */ + sqlite3 *db = pParse->db; /* The database connection */ + Db *pDb; /* Database only autoinc table */ + int memId; /* Register holding max rowid */ + Vdbe *v = pParse->pVdbe; /* VDBE under construction */ + + /* This routine is never called during trigger-generation. It is + ** only called from the top-level */ + assert( pParse->pTriggerTab==0 ); + assert( sqlite3IsToplevel(pParse) ); + + assert( v ); /* We failed long ago if this is not so */ + for(p = pParse->pAinc; p; p = p->pNext){ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList autoInc[] = { + /* 0 */ {OP_Null, 0, 0, 0}, + /* 1 */ {OP_Rewind, 0, 10, 0}, + /* 2 */ {OP_Column, 0, 0, 0}, + /* 3 */ {OP_Ne, 0, 9, 0}, + /* 4 */ {OP_Rowid, 0, 0, 0}, + /* 5 */ {OP_Column, 0, 1, 0}, + /* 6 */ {OP_AddImm, 0, 0, 0}, + /* 7 */ {OP_Copy, 0, 0, 0}, + /* 8 */ {OP_Goto, 0, 11, 0}, + /* 9 */ {OP_Next, 0, 2, 0}, + /* 10 */ {OP_Integer, 0, 0, 0}, + /* 11 */ {OP_Close, 0, 0, 0} + }; + VdbeOp *aOp; + pDb = &db->aDb[p->iDb]; + memId = p->regCtr; + assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); + sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead); + sqlite3VdbeLoadString(v, memId-1, p->pTab->zName); + aOp = sqlite3VdbeAddOpList(v, ArraySize(autoInc), autoInc, iLn); + if( aOp==0 ) break; + aOp[0].p2 = memId; + aOp[0].p3 = memId+2; + aOp[2].p3 = memId; + aOp[3].p1 = memId-1; + aOp[3].p3 = memId; + aOp[3].p5 = SQLITE_JUMPIFNULL; + aOp[4].p2 = memId+1; + aOp[5].p3 = memId; + aOp[6].p1 = memId; + aOp[7].p2 = memId+2; + aOp[7].p1 = memId; + aOp[10].p2 = memId; + if( pParse->nTab==0 ) pParse->nTab = 1; + } +} + +/* +** Update the maximum rowid for an autoincrement calculation. +** +** This routine should be called when the regRowid register holds a +** new rowid that is about to be inserted. If that new rowid is +** larger than the maximum rowid in the memId memory cell, then the +** memory cell is updated. +*/ +static void autoIncStep(Parse *pParse, int memId, int regRowid){ + if( memId>0 ){ + sqlite3VdbeAddOp2(pParse->pVdbe, OP_MemMax, memId, regRowid); + } +} + +/* +** This routine generates the code needed to write autoincrement +** maximum rowid values back into the sqlite_sequence register. +** Every statement that might do an INSERT into an autoincrement +** table (either directly or through triggers) needs to call this +** routine just before the "exit" code. +*/ +static SQLITE_NOINLINE void autoIncrementEnd(Parse *pParse){ + AutoincInfo *p; + Vdbe *v = pParse->pVdbe; + sqlite3 *db = pParse->db; + + assert( v ); + for(p = pParse->pAinc; p; p = p->pNext){ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList autoIncEnd[] = { + /* 0 */ {OP_NotNull, 0, 2, 0}, + /* 1 */ {OP_NewRowid, 0, 0, 0}, + /* 2 */ {OP_MakeRecord, 0, 2, 0}, + /* 3 */ {OP_Insert, 0, 0, 0}, + /* 4 */ {OP_Close, 0, 0, 0} + }; + VdbeOp *aOp; + Db *pDb = &db->aDb[p->iDb]; + int iRec; + int memId = p->regCtr; + + iRec = sqlite3GetTempReg(pParse); + assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); + sqlite3VdbeAddOp3(v, OP_Le, memId+2, sqlite3VdbeCurrentAddr(v)+7, memId); + VdbeCoverage(v); + sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); + aOp = sqlite3VdbeAddOpList(v, ArraySize(autoIncEnd), autoIncEnd, iLn); + if( aOp==0 ) break; + aOp[0].p1 = memId+1; + aOp[1].p2 = memId+1; + aOp[2].p1 = memId-1; + aOp[2].p3 = iRec; + aOp[3].p2 = iRec; + aOp[3].p3 = memId+1; + aOp[3].p5 = OPFLAG_APPEND; + sqlite3ReleaseTempReg(pParse, iRec); + } +} +SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){ + if( pParse->pAinc ) autoIncrementEnd(pParse); +} +#else +/* +** If SQLITE_OMIT_AUTOINCREMENT is defined, then the three routines +** above are all no-ops +*/ +# define autoIncBegin(A,B,C) (0) +# define autoIncStep(A,B,C) +#endif /* SQLITE_OMIT_AUTOINCREMENT */ + + +/* Forward declaration */ +static int xferOptimization( + Parse *pParse, /* Parser context */ + Table *pDest, /* The table we are inserting into */ + Select *pSelect, /* A SELECT statement to use as the data source */ + int onError, /* How to handle constraint errors */ + int iDbDest /* The database of pDest */ +); + +/* +** This routine is called to handle SQL of the following forms: +** +** insert into TABLE (IDLIST) values(EXPRLIST),(EXPRLIST),... +** insert into TABLE (IDLIST) select +** insert into TABLE (IDLIST) default values +** +** The IDLIST following the table name is always optional. If omitted, +** then a list of all (non-hidden) columns for the table is substituted. +** The IDLIST appears in the pColumn parameter. pColumn is NULL if IDLIST +** is omitted. +** +** For the pSelect parameter holds the values to be inserted for the +** first two forms shown above. A VALUES clause is really just short-hand +** for a SELECT statement that omits the FROM clause and everything else +** that follows. If the pSelect parameter is NULL, that means that the +** DEFAULT VALUES form of the INSERT statement is intended. +** +** The code generated follows one of four templates. For a simple +** insert with data coming from a single-row VALUES clause, the code executes +** once straight down through. Pseudo-code follows (we call this +** the "1st template"): +** +** open write cursor to
    and its indices +** put VALUES clause expressions into registers +** write the resulting record into
    +** cleanup +** +** The three remaining templates assume the statement is of the form +** +** INSERT INTO
    SELECT ... +** +** If the SELECT clause is of the restricted form "SELECT * FROM " - +** in other words if the SELECT pulls all columns from a single table +** and there is no WHERE or LIMIT or GROUP BY or ORDER BY clauses, and +** if and are distinct tables but have identical +** schemas, including all the same indices, then a special optimization +** is invoked that copies raw records from over to . +** See the xferOptimization() function for the implementation of this +** template. This is the 2nd template. +** +** open a write cursor to
    +** open read cursor on +** transfer all records in over to
    +** close cursors +** foreach index on
    +** open a write cursor on the
    index +** open a read cursor on the corresponding index +** transfer all records from the read to the write cursors +** close cursors +** end foreach +** +** The 3rd template is for when the second template does not apply +** and the SELECT clause does not read from
    at any time. +** The generated code follows this template: +** +** X <- A +** goto B +** A: setup for the SELECT +** loop over the rows in the SELECT +** load values into registers R..R+n +** yield X +** end loop +** cleanup after the SELECT +** end-coroutine X +** B: open write cursor to
    and its indices +** C: yield X, at EOF goto D +** insert the select result into
    from R..R+n +** goto C +** D: cleanup +** +** The 4th template is used if the insert statement takes its +** values from a SELECT but the data is being inserted into a table +** that is also read as part of the SELECT. In the third form, +** we have to use an intermediate table to store the results of +** the select. The template is like this: +** +** X <- A +** goto B +** A: setup for the SELECT +** loop over the tables in the SELECT +** load value into register R..R+n +** yield X +** end loop +** cleanup after the SELECT +** end co-routine R +** B: open temp table +** L: yield X, at EOF goto M +** insert row from R..R+n into temp table +** goto L +** M: open write cursor to
    and its indices +** rewind temp table +** C: loop over rows of intermediate table +** transfer values form intermediate table into
    +** end loop +** D: cleanup +*/ +SQLITE_PRIVATE void sqlite3Insert( + Parse *pParse, /* Parser context */ + SrcList *pTabList, /* Name of table into which we are inserting */ + Select *pSelect, /* A SELECT statement to use as the data source */ + IdList *pColumn, /* Column names corresponding to IDLIST, or NULL. */ + int onError, /* How to handle constraint errors */ + Upsert *pUpsert /* ON CONFLICT clauses for upsert, or NULL */ +){ + sqlite3 *db; /* The main database structure */ + Table *pTab; /* The table to insert into. aka TABLE */ + int i, j; /* Loop counters */ + Vdbe *v; /* Generate code into this virtual machine */ + Index *pIdx; /* For looping over indices of the table */ + int nColumn; /* Number of columns in the data */ + int nHidden = 0; /* Number of hidden columns if TABLE is virtual */ + int iDataCur = 0; /* VDBE cursor that is the main data repository */ + int iIdxCur = 0; /* First index cursor */ + int ipkColumn = -1; /* Column that is the INTEGER PRIMARY KEY */ + int endOfLoop; /* Label for the end of the insertion loop */ + int srcTab = 0; /* Data comes from this temporary cursor if >=0 */ + int addrInsTop = 0; /* Jump to label "D" */ + int addrCont = 0; /* Top of insert loop. Label "C" in templates 3 and 4 */ + SelectDest dest; /* Destination for SELECT on rhs of INSERT */ + int iDb; /* Index of database holding TABLE */ + u8 useTempTable = 0; /* Store SELECT results in intermediate table */ + u8 appendFlag = 0; /* True if the insert is likely to be an append */ + u8 withoutRowid; /* 0 for normal table. 1 for WITHOUT ROWID table */ + u8 bIdListInOrder; /* True if IDLIST is in table order */ + ExprList *pList = 0; /* List of VALUES() to be inserted */ + int iRegStore; /* Register in which to store next column */ + + /* Register allocations */ + int regFromSelect = 0;/* Base register for data coming from SELECT */ + int regAutoinc = 0; /* Register holding the AUTOINCREMENT counter */ + int regRowCount = 0; /* Memory cell used for the row counter */ + int regIns; /* Block of regs holding rowid+data being inserted */ + int regRowid; /* registers holding insert rowid */ + int regData; /* register holding first column to insert */ + int *aRegIdx = 0; /* One register allocated to each index */ + +#ifndef SQLITE_OMIT_TRIGGER + int isView; /* True if attempting to insert into a view */ + Trigger *pTrigger; /* List of triggers on pTab, if required */ + int tmask; /* Mask of trigger times */ +#endif + + db = pParse->db; + if( pParse->nErr || db->mallocFailed ){ + goto insert_cleanup; + } + dest.iSDParm = 0; /* Suppress a harmless compiler warning */ + + /* If the Select object is really just a simple VALUES() list with a + ** single row (the common case) then keep that one row of values + ** and discard the other (unused) parts of the pSelect object + */ + if( pSelect && (pSelect->selFlags & SF_Values)!=0 && pSelect->pPrior==0 ){ + pList = pSelect->pEList; + pSelect->pEList = 0; + sqlite3SelectDelete(db, pSelect); + pSelect = 0; + } + + /* Locate the table into which we will be inserting new information. + */ + assert( pTabList->nSrc==1 ); + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ){ + goto insert_cleanup; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDbnDb ); + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, + db->aDb[iDb].zDbSName) ){ + goto insert_cleanup; + } + withoutRowid = !HasRowid(pTab); + + /* Figure out if we have any triggers and if the table being + ** inserted into is a view + */ +#ifndef SQLITE_OMIT_TRIGGER + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0, &tmask); + isView = pTab->pSelect!=0; +#else +# define pTrigger 0 +# define tmask 0 +# define isView 0 +#endif +#ifdef SQLITE_OMIT_VIEW +# undef isView +# define isView 0 +#endif + assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) ); + + /* If pTab is really a view, make sure it has been initialized. + ** ViewGetColumnNames() is a no-op if pTab is not a view. + */ + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto insert_cleanup; + } + + /* Cannot insert into a read-only table. + */ + if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ + goto insert_cleanup; + } + + /* Allocate a VDBE + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto insert_cleanup; + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, pSelect || pTrigger, iDb); + +#ifndef SQLITE_OMIT_XFER_OPT + /* If the statement is of the form + ** + ** INSERT INTO SELECT * FROM ; + ** + ** Then special optimizations can be applied that make the transfer + ** very fast and which reduce fragmentation of indices. + ** + ** This is the 2nd template. + */ + if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){ + assert( !pTrigger ); + assert( pList==0 ); + goto insert_end; + } +#endif /* SQLITE_OMIT_XFER_OPT */ + + /* If this is an AUTOINCREMENT table, look up the sequence number in the + ** sqlite_sequence table and store it in memory cell regAutoinc. + */ + regAutoinc = autoIncBegin(pParse, iDb, pTab); + + /* Allocate a block registers to hold the rowid and the values + ** for all columns of the new row. + */ + regRowid = regIns = pParse->nMem+1; + pParse->nMem += pTab->nCol + 1; + if( IsVirtual(pTab) ){ + regRowid++; + pParse->nMem++; + } + regData = regRowid+1; + + /* If the INSERT statement included an IDLIST term, then make sure + ** all elements of the IDLIST really are columns of the table and + ** remember the column indices. + ** + ** If the table has an INTEGER PRIMARY KEY column and that column + ** is named in the IDLIST, then record in the ipkColumn variable + ** the index into IDLIST of the primary key column. ipkColumn is + ** the index of the primary key as it appears in IDLIST, not as + ** is appears in the original table. (The index of the INTEGER + ** PRIMARY KEY in the original table is pTab->iPKey.) After this + ** loop, if ipkColumn==(-1), that means that integer primary key + ** is unspecified, and hence the table is either WITHOUT ROWID or + ** it will automatically generated an integer primary key. + ** + ** bIdListInOrder is true if the columns in IDLIST are in storage + ** order. This enables an optimization that avoids shuffling the + ** columns into storage order. False negatives are harmless, + ** but false positives will cause database corruption. + */ + bIdListInOrder = (pTab->tabFlags & (TF_OOOHidden|TF_HasStored))==0; + if( pColumn ){ + for(i=0; inId; i++){ + pColumn->a[i].idx = -1; + } + for(i=0; inId; i++){ + for(j=0; jnCol; j++){ + if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){ + pColumn->a[i].idx = j; + if( i!=j ) bIdListInOrder = 0; + if( j==pTab->iPKey ){ + ipkColumn = i; assert( !withoutRowid ); + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){ + sqlite3ErrorMsg(pParse, + "cannot INSERT into generated column \"%s\"", + pTab->aCol[j].zName); + goto insert_cleanup; + } +#endif + break; + } + } + if( j>=pTab->nCol ){ + if( sqlite3IsRowid(pColumn->a[i].zName) && !withoutRowid ){ + ipkColumn = i; + bIdListInOrder = 0; + }else{ + sqlite3ErrorMsg(pParse, "table %S has no column named %s", + pTabList, 0, pColumn->a[i].zName); + pParse->checkSchema = 1; + goto insert_cleanup; + } + } + } + } + + /* Figure out how many columns of data are supplied. If the data + ** is coming from a SELECT statement, then generate a co-routine that + ** produces a single row of the SELECT on each invocation. The + ** co-routine is the common header to the 3rd and 4th templates. + */ + if( pSelect ){ + /* Data is coming from a SELECT or from a multi-row VALUES clause. + ** Generate a co-routine to run the SELECT. */ + int regYield; /* Register holding co-routine entry-point */ + int addrTop; /* Top of the co-routine */ + int rc; /* Result code */ + + regYield = ++pParse->nMem; + addrTop = sqlite3VdbeCurrentAddr(v) + 1; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); + sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); + dest.iSdst = bIdListInOrder ? regData : 0; + dest.nSdst = pTab->nCol; + rc = sqlite3Select(pParse, pSelect, &dest); + regFromSelect = dest.iSdst; + if( rc || db->mallocFailed || pParse->nErr ) goto insert_cleanup; + sqlite3VdbeEndCoroutine(v, regYield); + sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ + assert( pSelect->pEList ); + nColumn = pSelect->pEList->nExpr; + + /* Set useTempTable to TRUE if the result of the SELECT statement + ** should be written into a temporary table (template 4). Set to + ** FALSE if each output row of the SELECT can be written directly into + ** the destination table (template 3). + ** + ** A temp table must be used if the table being updated is also one + ** of the tables being read by the SELECT statement. Also use a + ** temp table in the case of row triggers. + */ + if( pTrigger || readsTable(pParse, iDb, pTab) ){ + useTempTable = 1; + } + + if( useTempTable ){ + /* Invoke the coroutine to extract information from the SELECT + ** and add it to a transient table srcTab. The code generated + ** here is from the 4th template: + ** + ** B: open temp table + ** L: yield X, goto M at EOF + ** insert row from R..R+n into temp table + ** goto L + ** M: ... + */ + int regRec; /* Register to hold packed record */ + int regTempRowid; /* Register to hold temp table ROWID */ + int addrL; /* Label "L" */ + + srcTab = pParse->nTab++; + regRec = sqlite3GetTempReg(pParse); + regTempRowid = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, srcTab, nColumn); + addrL = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regFromSelect, nColumn, regRec); + sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regTempRowid); + sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regTempRowid); + sqlite3VdbeGoto(v, addrL); + sqlite3VdbeJumpHere(v, addrL); + sqlite3ReleaseTempReg(pParse, regRec); + sqlite3ReleaseTempReg(pParse, regTempRowid); + } + }else{ + /* This is the case if the data for the INSERT is coming from a + ** single-row VALUES clause + */ + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + srcTab = -1; + assert( useTempTable==0 ); + if( pList ){ + nColumn = pList->nExpr; + if( sqlite3ResolveExprListNames(&sNC, pList) ){ + goto insert_cleanup; + } + }else{ + nColumn = 0; + } + } + + /* If there is no IDLIST term but the table has an integer primary + ** key, the set the ipkColumn variable to the integer primary key + ** column index in the original table definition. + */ + if( pColumn==0 && nColumn>0 ){ + ipkColumn = pTab->iPKey; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( ipkColumn>=0 && (pTab->tabFlags & TF_HasGenerated)!=0 ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + for(i=ipkColumn-1; i>=0; i--){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); + ipkColumn--; + } + } + } +#endif + } + + /* Make sure the number of columns in the source data matches the number + ** of columns to be inserted into the table. + */ + for(i=0; inCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_NOINSERT ) nHidden++; + } + if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ + sqlite3ErrorMsg(pParse, + "table %S has %d columns but %d values were supplied", + pTabList, 0, pTab->nCol-nHidden, nColumn); + goto insert_cleanup; + } + if( pColumn!=0 && nColumn!=pColumn->nId ){ + sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); + goto insert_cleanup; + } + + /* Initialize the count of rows to be inserted + */ + if( (db->flags & SQLITE_CountRows)!=0 + && !pParse->nested + && !pParse->pTriggerTab + ){ + regRowCount = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); + } + + /* If this is not a view, open the table and and all indices */ + if( !isView ){ + int nIdx; + nIdx = sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, -1, 0, + &iDataCur, &iIdxCur); + aRegIdx = sqlite3DbMallocRawNN(db, sizeof(int)*(nIdx+2)); + if( aRegIdx==0 ){ + goto insert_cleanup; + } + for(i=0, pIdx=pTab->pIndex; ipNext, i++){ + assert( pIdx ); + aRegIdx[i] = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; + } + aRegIdx[i] = ++pParse->nMem; /* Register to store the table record */ + } +#ifndef SQLITE_OMIT_UPSERT + if( pUpsert ){ + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "UPSERT not implemented for virtual table \"%s\"", + pTab->zName); + goto insert_cleanup; + } + if( pTab->pSelect ){ + sqlite3ErrorMsg(pParse, "cannot UPSERT a view"); + goto insert_cleanup; + } + if( sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget) ){ + goto insert_cleanup; + } + pTabList->a[0].iCursor = iDataCur; + pUpsert->pUpsertSrc = pTabList; + pUpsert->regData = regData; + pUpsert->iDataCur = iDataCur; + pUpsert->iIdxCur = iIdxCur; + if( pUpsert->pUpsertTarget ){ + sqlite3UpsertAnalyzeTarget(pParse, pTabList, pUpsert); + } + } +#endif + + + /* This is the top of the main insertion loop */ + if( useTempTable ){ + /* This block codes the top of loop only. The complete loop is the + ** following pseudocode (template 4): + ** + ** rewind temp table, if empty goto D + ** C: loop over rows of intermediate table + ** transfer values form intermediate table into
    + ** end loop + ** D: ... + */ + addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab); VdbeCoverage(v); + addrCont = sqlite3VdbeCurrentAddr(v); + }else if( pSelect ){ + /* This block codes the top of loop only. The complete loop is the + ** following pseudocode (template 3): + ** + ** C: yield X, at EOF goto D + ** insert the select result into
    from R..R+n + ** goto C + ** D: ... + */ + sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0, 0); + addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); + VdbeCoverage(v); + if( ipkColumn>=0 ){ + /* tag-20191021-001: If the INTEGER PRIMARY KEY is being generated by the + ** SELECT, go ahead and copy the value into the rowid slot now, so that + ** the value does not get overwritten by a NULL at tag-20191021-002. */ + sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); + } + } + + /* Compute data for ordinary columns of the new entry. Values + ** are written in storage order into registers starting with regData. + ** Only ordinary columns are computed in this loop. The rowid + ** (if there is one) is computed later and generated columns are + ** computed after the rowid since they might depend on the value + ** of the rowid. + */ + nHidden = 0; + iRegStore = regData; assert( regData==regRowid+1 ); + for(i=0; inCol; i++, iRegStore++){ + int k; + u32 colFlags; + assert( i>=nHidden ); + if( i==pTab->iPKey ){ + /* tag-20191021-002: References to the INTEGER PRIMARY KEY are filled + ** using the rowid. So put a NULL in the IPK slot of the record to avoid + ** using excess space. The file format definition requires this extra + ** NULL - we cannot optimize further by skipping the column completely */ + sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); + continue; + } + if( ((colFlags = pTab->aCol[i].colFlags) & COLFLAG_NOINSERT)!=0 ){ + nHidden++; + if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ + /* Virtual columns do not participate in OP_MakeRecord. So back up + ** iRegStore by one slot to compensate for the iRegStore++ in the + ** outer for() loop */ + iRegStore--; + continue; + }else if( (colFlags & COLFLAG_STORED)!=0 ){ + /* Stored columns are computed later. But if there are BEFORE + ** triggers, the slots used for stored columns will be OP_Copy-ed + ** to a second block of registers, so the register needs to be + ** initialized to NULL to avoid an uninitialized register read */ + if( tmask & TRIGGER_BEFORE ){ + sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); + } + continue; + }else if( pColumn==0 ){ + /* Hidden columns that are not explicitly named in the INSERT + ** get there default value */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; + } + } + if( pColumn ){ + for(j=0; jnId && pColumn->a[j].idx!=i; j++){} + if( j>=pColumn->nId ){ + /* A column not named in the insert column list gets its + ** default value */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; + } + k = j; + }else if( nColumn==0 ){ + /* This is INSERT INTO ... DEFAULT VALUES. Load the default value. */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; + }else{ + k = i - nHidden; + } + + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, k, iRegStore); + }else if( pSelect ){ + if( regFromSelect!=regData ){ + sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+k, iRegStore); + } + }else{ + sqlite3ExprCode(pParse, pList->a[k].pExpr, iRegStore); + } + } + + + /* Run the BEFORE and INSTEAD OF triggers, if there are any + */ + endOfLoop = sqlite3VdbeMakeLabel(pParse); + if( tmask & TRIGGER_BEFORE ){ + int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1); + + /* build the NEW.* reference row. Note that if there is an INTEGER + ** PRIMARY KEY into which a NULL is being inserted, that NULL will be + ** translated into a unique ID for the row. But on a BEFORE trigger, + ** we do not know what the unique ID will be (because the insert has + ** not happened yet) so we substitute a rowid of -1 + */ + if( ipkColumn<0 ){ + sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); + }else{ + int addr1; + assert( !withoutRowid ); + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regCols); + }else{ + assert( pSelect==0 ); /* Otherwise useTempTable is true */ + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regCols); + } + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); VdbeCoverage(v); + } + + /* Cannot have triggers on a virtual table. If it were possible, + ** this block would have to account for hidden column. + */ + assert( !IsVirtual(pTab) ); + + /* Copy the new data already generated. */ + assert( pTab->nNVCol>0 ); + sqlite3VdbeAddOp3(v, OP_Copy, regRowid+1, regCols+1, pTab->nNVCol-1); + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Compute the new value for generated columns after all other + ** columns have already been computed. This must be done after + ** computing the ROWID in case one of the generated columns + ** refers to the ROWID. */ + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + sqlite3ComputeGeneratedColumns(pParse, regCols+1, pTab); + } +#endif + + /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, + ** do not attempt any conversions before assembling the record. + ** If this is a real table, attempt conversions as required by the + ** table column affinities. + */ + if( !isView ){ + sqlite3TableAffinity(v, pTab, regCols+1); + } + + /* Fire BEFORE or INSTEAD OF triggers */ + sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_BEFORE, + pTab, regCols-pTab->nCol-1, onError, endOfLoop); + + sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1); + } + + if( !isView ){ + if( IsVirtual(pTab) ){ + /* The row that the VUpdate opcode will delete: none */ + sqlite3VdbeAddOp2(v, OP_Null, 0, regIns); + } + if( ipkColumn>=0 ){ + /* Compute the new rowid */ + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regRowid); + }else if( pSelect ){ + /* Rowid already initialized at tag-20191021-001 */ + }else{ + Expr *pIpk = pList->a[ipkColumn].pExpr; + if( pIpk->op==TK_NULL && !IsVirtual(pTab) ){ + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); + appendFlag = 1; + }else{ + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); + } + } + /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid + ** to generate a unique primary key value. + */ + if( !appendFlag ){ + int addr1; + if( !IsVirtual(pTab) ){ + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); + sqlite3VdbeJumpHere(v, addr1); + }else{ + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, addr1+2); VdbeCoverage(v); + } + sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); VdbeCoverage(v); + } + }else if( IsVirtual(pTab) || withoutRowid ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regRowid); + }else{ + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); + appendFlag = 1; + } + autoIncStep(pParse, regAutoinc, regRowid); + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Compute the new value for generated columns after all other + ** columns have already been computed. This must be done after + ** computing the ROWID in case one of the generated columns + ** is derived from the INTEGER PRIMARY KEY. */ + if( pTab->tabFlags & TF_HasGenerated ){ + sqlite3ComputeGeneratedColumns(pParse, regRowid+1, pTab); + } +#endif + + /* Generate code to check constraints and generate index keys and + ** do the insertion. + */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + sqlite3VtabMakeWritable(pParse, pTab); + sqlite3VdbeAddOp4(v, OP_VUpdate, 1, pTab->nCol+2, regIns, pVTab, P4_VTAB); + sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError); + sqlite3MayAbort(pParse); + }else +#endif + { + int isReplace; /* Set to true if constraints may cause a replace */ + int bUseSeek; /* True to use OPFLAG_SEEKRESULT */ + sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, + regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0, pUpsert + ); + sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0); + + /* Set the OPFLAG_USESEEKRESULT flag if either (a) there are no REPLACE + ** constraints or (b) there are no triggers and this table is not a + ** parent table in a foreign key constraint. It is safe to set the + ** flag in the second case as if any REPLACE constraint is hit, an + ** OP_Delete or OP_IdxDelete instruction will be executed on each + ** cursor that is disturbed. And these instructions both clear the + ** VdbeCursor.seekResult variable, disabling the OPFLAG_USESEEKRESULT + ** functionality. */ + bUseSeek = (isReplace==0 || !sqlite3VdbeHasSubProgram(v)); + sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, + regIns, aRegIdx, 0, appendFlag, bUseSeek + ); + } + } + + /* Update the count of rows that are inserted + */ + if( regRowCount ){ + sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); + } + + if( pTrigger ){ + /* Code AFTER triggers */ + sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_AFTER, + pTab, regData-2-pTab->nCol, onError, endOfLoop); + } + + /* The bottom of the main insertion loop, if the data source + ** is a SELECT statement. + */ + sqlite3VdbeResolveLabel(v, endOfLoop); + if( useTempTable ){ + sqlite3VdbeAddOp2(v, OP_Next, srcTab, addrCont); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrInsTop); + sqlite3VdbeAddOp1(v, OP_Close, srcTab); + }else if( pSelect ){ + sqlite3VdbeGoto(v, addrCont); +#ifdef SQLITE_DEBUG + /* If we are jumping back to an OP_Yield that is preceded by an + ** OP_ReleaseReg, set the p5 flag on the OP_Goto so that the + ** OP_ReleaseReg will be included in the loop. */ + if( sqlite3VdbeGetOp(v, addrCont-1)->opcode==OP_ReleaseReg ){ + assert( sqlite3VdbeGetOp(v, addrCont)->opcode==OP_Yield ); + sqlite3VdbeChangeP5(v, 1); + } +#endif + sqlite3VdbeJumpHere(v, addrInsTop); + } + +insert_end: + /* Update the sqlite_sequence table by storing the content of the + ** maximum rowid counter values recorded while inserting into + ** autoincrement tables. + */ + if( pParse->nested==0 && pParse->pTriggerTab==0 ){ + sqlite3AutoincrementEnd(pParse); + } + + /* + ** Return the number of rows inserted. If this routine is + ** generating code because of a call to sqlite3NestedParse(), do not + ** invoke the callback function. + */ + if( regRowCount ){ + sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC); + } + +insert_cleanup: + sqlite3SrcListDelete(db, pTabList); + sqlite3ExprListDelete(db, pList); + sqlite3UpsertDelete(db, pUpsert); + sqlite3SelectDelete(db, pSelect); + sqlite3IdListDelete(db, pColumn); + sqlite3DbFree(db, aRegIdx); +} + +/* Make sure "isView" and other macros defined above are undefined. Otherwise +** they may interfere with compilation of other functions in this file +** (or in another file, if this file becomes part of the amalgamation). */ +#ifdef isView + #undef isView +#endif +#ifdef pTrigger + #undef pTrigger +#endif +#ifdef tmask + #undef tmask +#endif + +/* +** Meanings of bits in of pWalker->eCode for +** sqlite3ExprReferencesUpdatedColumn() +*/ +#define CKCNSTRNT_COLUMN 0x01 /* CHECK constraint uses a changing column */ +#define CKCNSTRNT_ROWID 0x02 /* CHECK constraint references the ROWID */ + +/* This is the Walker callback from sqlite3ExprReferencesUpdatedColumn(). +* Set bit 0x01 of pWalker->eCode if pWalker->eCode to 0 and if this +** expression node references any of the +** columns that are being modifed by an UPDATE statement. +*/ +static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN ){ + assert( pExpr->iColumn>=0 || pExpr->iColumn==-1 ); + if( pExpr->iColumn>=0 ){ + if( pWalker->u.aiCol[pExpr->iColumn]>=0 ){ + pWalker->eCode |= CKCNSTRNT_COLUMN; + } + }else{ + pWalker->eCode |= CKCNSTRNT_ROWID; + } + } + return WRC_Continue; +} + +/* +** pExpr is a CHECK constraint on a row that is being UPDATE-ed. The +** only columns that are modified by the UPDATE are those for which +** aiChng[i]>=0, and also the ROWID is modified if chngRowid is true. +** +** Return true if CHECK constraint pExpr uses any of the +** changing columns (or the rowid if it is changing). In other words, +** return true if this CHECK constraint must be validated for +** the new row in the UPDATE statement. +** +** 2018-09-15: pExpr might also be an expression for an index-on-expressions. +** The operation of this routine is the same - return true if an only if +** the expression uses one or more of columns identified by the second and +** third arguments. +*/ +SQLITE_PRIVATE int sqlite3ExprReferencesUpdatedColumn( + Expr *pExpr, /* The expression to be checked */ + int *aiChng, /* aiChng[x]>=0 if column x changed by the UPDATE */ + int chngRowid /* True if UPDATE changes the rowid */ +){ + Walker w; + memset(&w, 0, sizeof(w)); + w.eCode = 0; + w.xExprCallback = checkConstraintExprNode; + w.u.aiCol = aiChng; + sqlite3WalkExpr(&w, pExpr); + if( !chngRowid ){ + testcase( (w.eCode & CKCNSTRNT_ROWID)!=0 ); + w.eCode &= ~CKCNSTRNT_ROWID; + } + testcase( w.eCode==0 ); + testcase( w.eCode==CKCNSTRNT_COLUMN ); + testcase( w.eCode==CKCNSTRNT_ROWID ); + testcase( w.eCode==(CKCNSTRNT_ROWID|CKCNSTRNT_COLUMN) ); + return w.eCode!=0; +} + +/* +** Generate code to do constraint checks prior to an INSERT or an UPDATE +** on table pTab. +** +** The regNewData parameter is the first register in a range that contains +** the data to be inserted or the data after the update. There will be +** pTab->nCol+1 registers in this range. The first register (the one +** that regNewData points to) will contain the new rowid, or NULL in the +** case of a WITHOUT ROWID table. The second register in the range will +** contain the content of the first table column. The third register will +** contain the content of the second table column. And so forth. +** +** The regOldData parameter is similar to regNewData except that it contains +** the data prior to an UPDATE rather than afterwards. regOldData is zero +** for an INSERT. This routine can distinguish between UPDATE and INSERT by +** checking regOldData for zero. +** +** For an UPDATE, the pkChng boolean is true if the true primary key (the +** rowid for a normal table or the PRIMARY KEY for a WITHOUT ROWID table) +** might be modified by the UPDATE. If pkChng is false, then the key of +** the iDataCur content table is guaranteed to be unchanged by the UPDATE. +** +** For an INSERT, the pkChng boolean indicates whether or not the rowid +** was explicitly specified as part of the INSERT statement. If pkChng +** is zero, it means that the either rowid is computed automatically or +** that the table is a WITHOUT ROWID table and has no rowid. On an INSERT, +** pkChng will only be true if the INSERT statement provides an integer +** value for either the rowid column or its INTEGER PRIMARY KEY alias. +** +** The code generated by this routine will store new index entries into +** registers identified by aRegIdx[]. No index entry is created for +** indices where aRegIdx[i]==0. The order of indices in aRegIdx[] is +** the same as the order of indices on the linked list of indices +** at pTab->pIndex. +** +** (2019-05-07) The generated code also creates a new record for the +** main table, if pTab is a rowid table, and stores that record in the +** register identified by aRegIdx[nIdx] - in other words in the first +** entry of aRegIdx[] past the last index. It is important that the +** record be generated during constraint checks to avoid affinity changes +** to the register content that occur after constraint checks but before +** the new record is inserted. +** +** The caller must have already opened writeable cursors on the main +** table and all applicable indices (that is to say, all indices for which +** aRegIdx[] is not zero). iDataCur is the cursor for the main table when +** inserting or updating a rowid table, or the cursor for the PRIMARY KEY +** index when operating on a WITHOUT ROWID table. iIdxCur is the cursor +** for the first index in the pTab->pIndex list. Cursors for other indices +** are at iIdxCur+N for the N-th element of the pTab->pIndex list. +** +** This routine also generates code to check constraints. NOT NULL, +** CHECK, and UNIQUE constraints are all checked. If a constraint fails, +** then the appropriate action is performed. There are five possible +** actions: ROLLBACK, ABORT, FAIL, REPLACE, and IGNORE. +** +** Constraint type Action What Happens +** --------------- ---------- ---------------------------------------- +** any ROLLBACK The current transaction is rolled back and +** sqlite3_step() returns immediately with a +** return code of SQLITE_CONSTRAINT. +** +** any ABORT Back out changes from the current command +** only (do not do a complete rollback) then +** cause sqlite3_step() to return immediately +** with SQLITE_CONSTRAINT. +** +** any FAIL Sqlite3_step() returns immediately with a +** return code of SQLITE_CONSTRAINT. The +** transaction is not rolled back and any +** changes to prior rows are retained. +** +** any IGNORE The attempt in insert or update the current +** row is skipped, without throwing an error. +** Processing continues with the next row. +** (There is an immediate jump to ignoreDest.) +** +** NOT NULL REPLACE The NULL value is replace by the default +** value for that column. If the default value +** is NULL, the action is the same as ABORT. +** +** UNIQUE REPLACE The other row that conflicts with the row +** being inserted is removed. +** +** CHECK REPLACE Illegal. The results in an exception. +** +** Which action to take is determined by the overrideError parameter. +** Or if overrideError==OE_Default, then the pParse->onError parameter +** is used. Or if pParse->onError==OE_Default then the onError value +** for the constraint is used. +*/ +SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( + Parse *pParse, /* The parser context */ + Table *pTab, /* The table being inserted or updated */ + int *aRegIdx, /* Use register aRegIdx[i] for index i. 0 for unused */ + int iDataCur, /* Canonical data cursor (main table or PK index) */ + int iIdxCur, /* First index cursor */ + int regNewData, /* First register in a range holding values to insert */ + int regOldData, /* Previous content. 0 for INSERTs */ + u8 pkChng, /* Non-zero if the rowid or PRIMARY KEY changed */ + u8 overrideError, /* Override onError to this if not OE_Default */ + int ignoreDest, /* Jump to this label on an OE_Ignore resolution */ + int *pbMayReplace, /* OUT: Set to true if constraint may cause a replace */ + int *aiChng, /* column i is unchanged if aiChng[i]<0 */ + Upsert *pUpsert /* ON CONFLICT clauses, if any. NULL otherwise */ +){ + Vdbe *v; /* VDBE under constrution */ + Index *pIdx; /* Pointer to one of the indices */ + Index *pPk = 0; /* The PRIMARY KEY index */ + sqlite3 *db; /* Database connection */ + int i; /* loop counter */ + int ix; /* Index loop counter */ + int nCol; /* Number of columns */ + int onError; /* Conflict resolution strategy */ + int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */ + int nPkField; /* Number of fields in PRIMARY KEY. 1 for ROWID tables */ + Index *pUpIdx = 0; /* Index to which to apply the upsert */ + u8 isUpdate; /* True if this is an UPDATE operation */ + u8 bAffinityDone = 0; /* True if the OP_Affinity operation has been run */ + int upsertBypass = 0; /* Address of Goto to bypass upsert subroutine */ + int upsertJump = 0; /* Address of Goto that jumps into upsert subroutine */ + int ipkTop = 0; /* Top of the IPK uniqueness check */ + int ipkBottom = 0; /* OP_Goto at the end of the IPK uniqueness check */ + /* Variables associated with retesting uniqueness constraints after + ** replace triggers fire have run */ + int regTrigCnt; /* Register used to count replace trigger invocations */ + int addrRecheck = 0; /* Jump here to recheck all uniqueness constraints */ + int lblRecheckOk = 0; /* Each recheck jumps to this label if it passes */ + Trigger *pTrigger; /* List of DELETE triggers on the table pTab */ + int nReplaceTrig = 0; /* Number of replace triggers coded */ + + isUpdate = regOldData!=0; + db = pParse->db; + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + assert( pTab->pSelect==0 ); /* This table is not a VIEW */ + nCol = pTab->nCol; + + /* pPk is the PRIMARY KEY index for WITHOUT ROWID tables and NULL for + ** normal rowid tables. nPkField is the number of key fields in the + ** pPk index or 1 for a rowid table. In other words, nPkField is the + ** number of fields in the true primary key of the table. */ + if( HasRowid(pTab) ){ + pPk = 0; + nPkField = 1; + }else{ + pPk = sqlite3PrimaryKeyIndex(pTab); + nPkField = pPk->nKeyCol; + } + + /* Record that this module has started */ + VdbeModuleComment((v, "BEGIN: GenCnstCks(%d,%d,%d,%d,%d)", + iDataCur, iIdxCur, regNewData, regOldData, pkChng)); + + /* Test all NOT NULL constraints. + */ + if( pTab->tabFlags & TF_HasNotNull ){ + int b2ndPass = 0; /* True if currently running 2nd pass */ + int nSeenReplace = 0; /* Number of ON CONFLICT REPLACE operations */ + int nGenerated = 0; /* Number of generated columns with NOT NULL */ + while(1){ /* Make 2 passes over columns. Exit loop via "break" */ + for(i=0; iaCol[i]; /* The column to check for NOT NULL */ + int isGenerated; /* non-zero if column is generated */ + onError = pCol->notNull; + if( onError==OE_None ) continue; /* No NOT NULL on this column */ + if( i==pTab->iPKey ){ + continue; /* ROWID is never NULL */ + } + isGenerated = pCol->colFlags & COLFLAG_GENERATED; + if( isGenerated && !b2ndPass ){ + nGenerated++; + continue; /* Generated columns processed on 2nd pass */ + } + if( aiChng && aiChng[i]<0 && !isGenerated ){ + /* Do not check NOT NULL on columns that do not change */ + continue; + } + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + if( onError==OE_Replace ){ + if( b2ndPass /* REPLACE becomes ABORT on the 2nd pass */ + || pCol->pDflt==0 /* REPLACE is ABORT if no DEFAULT value */ + ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + testcase( pCol->colFlags & COLFLAG_GENERATED ); + onError = OE_Abort; + }else{ + assert( !isGenerated ); + } + }else if( b2ndPass && !isGenerated ){ + continue; + } + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace ); + testcase( i!=sqlite3TableColumnToStorage(pTab, i) ); + iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1; + switch( onError ){ + case OE_Replace: { + int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, iReg); + VdbeCoverage(v); + assert( (pCol->colFlags & COLFLAG_GENERATED)==0 ); + nSeenReplace++; + sqlite3ExprCodeCopy(pParse, pCol->pDflt, iReg); + sqlite3VdbeJumpHere(v, addr1); + break; + } + case OE_Abort: + sqlite3MayAbort(pParse); + /* Fall through */ + case OE_Rollback: + case OE_Fail: { + char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, + pCol->zName); + sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, + onError, iReg); + sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); + sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); + VdbeCoverage(v); + break; + } + default: { + assert( onError==OE_Ignore ); + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, ignoreDest); + VdbeCoverage(v); + break; + } + } /* end switch(onError) */ + } /* end loop i over columns */ + if( nGenerated==0 && nSeenReplace==0 ){ + /* If there are no generated columns with NOT NULL constraints + ** and no NOT NULL ON CONFLICT REPLACE constraints, then a single + ** pass is sufficient */ + break; + } + if( b2ndPass ) break; /* Never need more than 2 passes */ + b2ndPass = 1; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( nSeenReplace>0 && (pTab->tabFlags & TF_HasGenerated)!=0 ){ + /* If any NOT NULL ON CONFLICT REPLACE constraints fired on the + ** first pass, recomputed values for all generated columns, as + ** those values might depend on columns affected by the REPLACE. + */ + sqlite3ComputeGeneratedColumns(pParse, regNewData+1, pTab); + } +#endif + } /* end of 2-pass loop */ + } /* end if( has-not-null-constraints ) */ + + /* Test all CHECK constraints + */ +#ifndef SQLITE_OMIT_CHECK + if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ + ExprList *pCheck = pTab->pCheck; + pParse->iSelfTab = -(regNewData+1); + onError = overrideError!=OE_Default ? overrideError : OE_Abort; + for(i=0; inExpr; i++){ + int allOk; + Expr *pCopy; + Expr *pExpr = pCheck->a[i].pExpr; + if( aiChng + && !sqlite3ExprReferencesUpdatedColumn(pExpr, aiChng, pkChng) + ){ + /* The check constraints do not reference any of the columns being + ** updated so there is no point it verifying the check constraint */ + continue; + } + if( bAffinityDone==0 ){ + sqlite3TableAffinity(v, pTab, regNewData+1); + bAffinityDone = 1; + } + allOk = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeVerifyAbortable(v, onError); + pCopy = sqlite3ExprDup(db, pExpr, 0); + if( !db->mallocFailed ){ + sqlite3ExprIfTrue(pParse, pCopy, allOk, SQLITE_JUMPIFNULL); + } + sqlite3ExprDelete(db, pCopy); + if( onError==OE_Ignore ){ + sqlite3VdbeGoto(v, ignoreDest); + }else{ + char *zName = pCheck->a[i].zEName; + if( zName==0 ) zName = pTab->zName; + if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-26383-51744 */ + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_CHECK, + onError, zName, P4_TRANSIENT, + P5_ConstraintCheck); + } + sqlite3VdbeResolveLabel(v, allOk); + } + pParse->iSelfTab = 0; + } +#endif /* !defined(SQLITE_OMIT_CHECK) */ + + /* UNIQUE and PRIMARY KEY constraints should be handled in the following + ** order: + ** + ** (1) OE_Update + ** (2) OE_Abort, OE_Fail, OE_Rollback, OE_Ignore + ** (3) OE_Replace + ** + ** OE_Fail and OE_Ignore must happen before any changes are made. + ** OE_Update guarantees that only a single row will change, so it + ** must happen before OE_Replace. Technically, OE_Abort and OE_Rollback + ** could happen in any order, but they are grouped up front for + ** convenience. + ** + ** 2018-08-14: Ticket https://www.sqlite.org/src/info/908f001483982c43 + ** The order of constraints used to have OE_Update as (2) and OE_Abort + ** and so forth as (1). But apparently PostgreSQL checks the OE_Update + ** constraint before any others, so it had to be moved. + ** + ** Constraint checking code is generated in this order: + ** (A) The rowid constraint + ** (B) Unique index constraints that do not have OE_Replace as their + ** default conflict resolution strategy + ** (C) Unique index that do use OE_Replace by default. + ** + ** The ordering of (2) and (3) is accomplished by making sure the linked + ** list of indexes attached to a table puts all OE_Replace indexes last + ** in the list. See sqlite3CreateIndex() for where that happens. + */ + + if( pUpsert ){ + if( pUpsert->pUpsertTarget==0 ){ + /* An ON CONFLICT DO NOTHING clause, without a constraint-target. + ** Make all unique constraint resolution be OE_Ignore */ + assert( pUpsert->pUpsertSet==0 ); + overrideError = OE_Ignore; + pUpsert = 0; + }else if( (pUpIdx = pUpsert->pUpsertIdx)!=0 ){ + /* If the constraint-target uniqueness check must be run first. + ** Jump to that uniqueness check now */ + upsertJump = sqlite3VdbeAddOp0(v, OP_Goto); + VdbeComment((v, "UPSERT constraint goes first")); + } + } + + /* Determine if it is possible that triggers (either explicitly coded + ** triggers or FK resolution actions) might run as a result of deletes + ** that happen when OE_Replace conflict resolution occurs. (Call these + ** "replace triggers".) If any replace triggers run, we will need to + ** recheck all of the uniqueness constraints after they have all run. + ** But on the recheck, the resolution is OE_Abort instead of OE_Replace. + ** + ** If replace triggers are a possibility, then + ** + ** (1) Allocate register regTrigCnt and initialize it to zero. + ** That register will count the number of replace triggers that + ** fire. Constraint recheck only occurs if the number is positive. + ** (2) Initialize pTrigger to the list of all DELETE triggers on pTab. + ** (3) Initialize addrRecheck and lblRecheckOk + ** + ** The uniqueness rechecking code will create a series of tests to run + ** in a second pass. The addrRecheck and lblRecheckOk variables are + ** used to link together these tests which are separated from each other + ** in the generate bytecode. + */ + if( (db->flags & (SQLITE_RecTriggers|SQLITE_ForeignKeys))==0 ){ + /* There are not DELETE triggers nor FK constraints. No constraint + ** rechecks are needed. */ + pTrigger = 0; + regTrigCnt = 0; + }else{ + if( db->flags&SQLITE_RecTriggers ){ + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); + regTrigCnt = pTrigger!=0 || sqlite3FkRequired(pParse, pTab, 0, 0); + }else{ + pTrigger = 0; + regTrigCnt = sqlite3FkRequired(pParse, pTab, 0, 0); + } + if( regTrigCnt ){ + /* Replace triggers might exist. Allocate the counter and + ** initialize it to zero. */ + regTrigCnt = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regTrigCnt); + VdbeComment((v, "trigger count")); + lblRecheckOk = sqlite3VdbeMakeLabel(pParse); + addrRecheck = lblRecheckOk; + } + } + + /* If rowid is changing, make sure the new rowid does not previously + ** exist in the table. + */ + if( pkChng && pPk==0 ){ + int addrRowidOk = sqlite3VdbeMakeLabel(pParse); + + /* Figure out what action to take in case of a rowid collision */ + onError = pTab->keyConf; + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + + /* figure out whether or not upsert applies in this case */ + if( pUpsert && pUpsert->pUpsertIdx==0 ){ + if( pUpsert->pUpsertSet==0 ){ + onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */ + }else{ + onError = OE_Update; /* DO UPDATE */ + } + } + + /* If the response to a rowid conflict is REPLACE but the response + ** to some other UNIQUE constraint is FAIL or IGNORE, then we need + ** to defer the running of the rowid conflict checking until after + ** the UNIQUE constraints have run. + */ + if( onError==OE_Replace /* IPK rule is REPLACE */ + && onError!=overrideError /* Rules for other contraints are different */ + && pTab->pIndex /* There exist other constraints */ + ){ + ipkTop = sqlite3VdbeAddOp0(v, OP_Goto)+1; + VdbeComment((v, "defer IPK REPLACE until last")); + } + + if( isUpdate ){ + /* pkChng!=0 does not mean that the rowid has changed, only that + ** it might have changed. Skip the conflict logic below if the rowid + ** is unchanged. */ + sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); + } + + /* Check to see if the new rowid already exists in the table. Skip + ** the following conflict logic if it does not. */ + VdbeNoopComment((v, "uniqueness check for ROWID")); + sqlite3VdbeVerifyAbortable(v, onError); + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData); + VdbeCoverage(v); + + switch( onError ){ + default: { + onError = OE_Abort; + /* Fall thru into the next case */ + } + case OE_Rollback: + case OE_Abort: + case OE_Fail: { + testcase( onError==OE_Rollback ); + testcase( onError==OE_Abort ); + testcase( onError==OE_Fail ); + sqlite3RowidConstraint(pParse, onError, pTab); + break; + } + case OE_Replace: { + /* If there are DELETE triggers on this table and the + ** recursive-triggers flag is set, call GenerateRowDelete() to + ** remove the conflicting row from the table. This will fire + ** the triggers and remove both the table and index b-tree entries. + ** + ** Otherwise, if there are no triggers or the recursive-triggers + ** flag is not set, but the table has one or more indexes, call + ** GenerateRowIndexDelete(). This removes the index b-tree entries + ** only. The table b-tree entry will be replaced by the new entry + ** when it is inserted. + ** + ** If either GenerateRowDelete() or GenerateRowIndexDelete() is called, + ** also invoke MultiWrite() to indicate that this VDBE may require + ** statement rollback (if the statement is aborted after the delete + ** takes place). Earlier versions called sqlite3MultiWrite() regardless, + ** but being more selective here allows statements like: + ** + ** REPLACE INTO t(rowid) VALUES($newrowid) + ** + ** to run without a statement journal if there are no indexes on the + ** table. + */ + if( regTrigCnt ){ + sqlite3MultiWrite(pParse); + sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, + regNewData, 1, 0, OE_Replace, 1, -1); + sqlite3VdbeAddOp2(v, OP_AddImm, regTrigCnt, 1); /* incr trigger cnt */ + nReplaceTrig++; + }else{ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + assert( HasRowid(pTab) ); + /* This OP_Delete opcode fires the pre-update-hook only. It does + ** not modify the b-tree. It is more efficient to let the coming + ** OP_Insert replace the existing entry than it is to delete the + ** existing entry and then insert a new one. */ + sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP); + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + if( pTab->pIndex ){ + sqlite3MultiWrite(pParse); + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,-1); + } + } + seenReplace = 1; + break; + } +#ifndef SQLITE_OMIT_UPSERT + case OE_Update: { + sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, 0, iDataCur); + /* Fall through */ + } +#endif + case OE_Ignore: { + testcase( onError==OE_Ignore ); + sqlite3VdbeGoto(v, ignoreDest); + break; + } + } + sqlite3VdbeResolveLabel(v, addrRowidOk); + if( ipkTop ){ + ipkBottom = sqlite3VdbeAddOp0(v, OP_Goto); + sqlite3VdbeJumpHere(v, ipkTop-1); + } + } + + /* Test all UNIQUE constraints by creating entries for each UNIQUE + ** index and making sure that duplicate entries do not already exist. + ** Compute the revised record entries for indices as we go. + ** + ** This loop also handles the case of the PRIMARY KEY index for a + ** WITHOUT ROWID table. + */ + for(ix=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, ix++){ + int regIdx; /* Range of registers hold conent for pIdx */ + int regR; /* Range of registers holding conflicting PK */ + int iThisCur; /* Cursor for this UNIQUE index */ + int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */ + int addrConflictCk; /* First opcode in the conflict check logic */ + + if( aRegIdx[ix]==0 ) continue; /* Skip indices that do not change */ + if( pUpIdx==pIdx ){ + addrUniqueOk = upsertJump+1; + upsertBypass = sqlite3VdbeGoto(v, 0); + VdbeComment((v, "Skip upsert subroutine")); + sqlite3VdbeJumpHere(v, upsertJump); + }else{ + addrUniqueOk = sqlite3VdbeMakeLabel(pParse); + } + if( bAffinityDone==0 && (pUpIdx==0 || pUpIdx==pIdx) ){ + sqlite3TableAffinity(v, pTab, regNewData+1); + bAffinityDone = 1; + } + VdbeNoopComment((v, "prep index %s", pIdx->zName)); + iThisCur = iIdxCur+ix; + + + /* Skip partial indices for which the WHERE clause is not true */ + if( pIdx->pPartIdxWhere ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, aRegIdx[ix]); + pParse->iSelfTab = -(regNewData+1); + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, addrUniqueOk, + SQLITE_JUMPIFNULL); + pParse->iSelfTab = 0; + } + + /* Create a record for this index entry as it should appear after + ** the insert or update. Store that record in the aRegIdx[ix] register + */ + regIdx = aRegIdx[ix]+1; + for(i=0; inColumn; i++){ + int iField = pIdx->aiColumn[i]; + int x; + if( iField==XN_EXPR ){ + pParse->iSelfTab = -(regNewData+1); + sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[i].pExpr, regIdx+i); + pParse->iSelfTab = 0; + VdbeComment((v, "%s column %d", pIdx->zName, i)); + }else if( iField==XN_ROWID || iField==pTab->iPKey ){ + x = regNewData; + sqlite3VdbeAddOp2(v, OP_IntCopy, x, regIdx+i); + VdbeComment((v, "rowid")); + }else{ + testcase( sqlite3TableColumnToStorage(pTab, iField)!=iField ); + x = sqlite3TableColumnToStorage(pTab, iField) + regNewData + 1; + sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i); + VdbeComment((v, "%s", pTab->aCol[iField].zName)); + } + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); + VdbeComment((v, "for %s", pIdx->zName)); +#ifdef SQLITE_ENABLE_NULL_TRIM + if( pIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ + sqlite3SetMakeRecordP5(v, pIdx->pTable); + } +#endif + sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0, 0); + + /* In an UPDATE operation, if this index is the PRIMARY KEY index + ** of a WITHOUT ROWID table and there has been no change the + ** primary key, then no collision is possible. The collision detection + ** logic below can all be skipped. */ + if( isUpdate && pPk==pIdx && pkChng==0 ){ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + continue; + } + + /* Find out what action to take in case there is a uniqueness conflict */ + onError = pIdx->onError; + if( onError==OE_None ){ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + continue; /* pIdx is not a UNIQUE index */ + } + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + + /* Figure out if the upsert clause applies to this index */ + if( pUpIdx==pIdx ){ + if( pUpsert->pUpsertSet==0 ){ + onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */ + }else{ + onError = OE_Update; /* DO UPDATE */ + } + } + + /* Collision detection may be omitted if all of the following are true: + ** (1) The conflict resolution algorithm is REPLACE + ** (2) The table is a WITHOUT ROWID table + ** (3) There are no secondary indexes on the table + ** (4) No delete triggers need to be fired if there is a conflict + ** (5) No FK constraint counters need to be updated if a conflict occurs. + ** + ** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row + ** must be explicitly deleted in order to ensure any pre-update hook + ** is invoked. */ +#ifndef SQLITE_ENABLE_PREUPDATE_HOOK + if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ + && pPk==pIdx /* Condition 2 */ + && onError==OE_Replace /* Condition 1 */ + && ( 0==(db->flags&SQLITE_RecTriggers) || /* Condition 4 */ + 0==sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0)) + && ( 0==(db->flags&SQLITE_ForeignKeys) || /* Condition 5 */ + (0==pTab->pFKey && 0==sqlite3FkReferences(pTab))) + ){ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + continue; + } +#endif /* ifndef SQLITE_ENABLE_PREUPDATE_HOOK */ + + /* Check to see if the new index entry will be unique */ + sqlite3VdbeVerifyAbortable(v, onError); + addrConflictCk = + sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, + regIdx, pIdx->nKeyCol); VdbeCoverage(v); + + /* Generate code to handle collisions */ + regR = (pIdx==pPk) ? regIdx : sqlite3GetTempRange(pParse, nPkField); + if( isUpdate || onError==OE_Replace ){ + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_IdxRowid, iThisCur, regR); + /* Conflict only if the rowid of the existing index entry + ** is different from old-rowid */ + if( isUpdate ){ + sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); + } + }else{ + int x; + /* Extract the PRIMARY KEY from the end of the index entry and + ** store it in registers regR..regR+nPk-1 */ + if( pIdx!=pPk ){ + for(i=0; inKeyCol; i++){ + assert( pPk->aiColumn[i]>=0 ); + x = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]); + sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); + VdbeComment((v, "%s.%s", pTab->zName, + pTab->aCol[pPk->aiColumn[i]].zName)); + } + } + if( isUpdate ){ + /* If currently processing the PRIMARY KEY of a WITHOUT ROWID + ** table, only conflict if the new PRIMARY KEY values are actually + ** different from the old. + ** + ** For a UNIQUE index, only conflict if the PRIMARY KEY values + ** of the matched index row are different from the original PRIMARY + ** KEY values of this row before the update. */ + int addrJump = sqlite3VdbeCurrentAddr(v)+pPk->nKeyCol; + int op = OP_Ne; + int regCmp = (IsPrimaryKeyIndex(pIdx) ? regIdx : regR); + + for(i=0; inKeyCol; i++){ + char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); + x = pPk->aiColumn[i]; + assert( x>=0 ); + if( i==(pPk->nKeyCol-1) ){ + addrJump = addrUniqueOk; + op = OP_Eq; + } + x = sqlite3TableColumnToStorage(pTab, x); + sqlite3VdbeAddOp4(v, op, + regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ + ); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverageIf(v, op==OP_Eq); + VdbeCoverageIf(v, op==OP_Ne); + } + } + } + } + + /* Generate code that executes if the new index entry is not unique */ + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace || onError==OE_Update ); + switch( onError ){ + case OE_Rollback: + case OE_Abort: + case OE_Fail: { + testcase( onError==OE_Rollback ); + testcase( onError==OE_Abort ); + testcase( onError==OE_Fail ); + sqlite3UniqueConstraint(pParse, onError, pIdx); + break; + } +#ifndef SQLITE_OMIT_UPSERT + case OE_Update: { + sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, pIdx, iIdxCur+ix); + /* Fall through */ + } +#endif + case OE_Ignore: { + testcase( onError==OE_Ignore ); + sqlite3VdbeGoto(v, ignoreDest); + break; + } + default: { + int nConflictCk; /* Number of opcodes in conflict check logic */ + + assert( onError==OE_Replace ); + nConflictCk = sqlite3VdbeCurrentAddr(v) - addrConflictCk; + assert( nConflictCk>0 ); + testcase( nConflictCk>1 ); + if( regTrigCnt ){ + sqlite3MultiWrite(pParse); + nReplaceTrig++; + } + if( pTrigger && isUpdate ){ + sqlite3VdbeAddOp1(v, OP_CursorLock, iDataCur); + } + sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, + regR, nPkField, 0, OE_Replace, + (pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur); + if( pTrigger && isUpdate ){ + sqlite3VdbeAddOp1(v, OP_CursorUnlock, iDataCur); + } + if( regTrigCnt ){ + int addrBypass; /* Jump destination to bypass recheck logic */ + + sqlite3VdbeAddOp2(v, OP_AddImm, regTrigCnt, 1); /* incr trigger cnt */ + addrBypass = sqlite3VdbeAddOp0(v, OP_Goto); /* Bypass recheck */ + VdbeComment((v, "bypass recheck")); + + /* Here we insert code that will be invoked after all constraint + ** checks have run, if and only if one or more replace triggers + ** fired. */ + sqlite3VdbeResolveLabel(v, lblRecheckOk); + lblRecheckOk = sqlite3VdbeMakeLabel(pParse); + if( pIdx->pPartIdxWhere ){ + /* Bypass the recheck if this partial index is not defined + ** for the current row */ + sqlite3VdbeAddOp2(v, OP_IsNull, regIdx-1, lblRecheckOk); + VdbeCoverage(v); + } + /* Copy the constraint check code from above, except change + ** the constraint-ok jump destination to be the address of + ** the next retest block */ + while( nConflictCk>0 ){ + VdbeOp x; /* Conflict check opcode to copy */ + /* The sqlite3VdbeAddOp4() call might reallocate the opcode array. + ** Hence, make a complete copy of the opcode, rather than using + ** a pointer to the opcode. */ + x = *sqlite3VdbeGetOp(v, addrConflictCk); + if( x.opcode!=OP_IdxRowid ){ + int p2; /* New P2 value for copied conflict check opcode */ + const char *zP4; + if( sqlite3OpcodeProperty[x.opcode]&OPFLG_JUMP ){ + p2 = lblRecheckOk; + }else{ + p2 = x.p2; + } + zP4 = x.p4type==P4_INT32 ? SQLITE_INT_TO_PTR(x.p4.i) : x.p4.z; + sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, zP4, x.p4type); + sqlite3VdbeChangeP5(v, x.p5); + VdbeCoverageIf(v, p2!=x.p2); + } + nConflictCk--; + addrConflictCk++; + } + /* If the retest fails, issue an abort */ + sqlite3UniqueConstraint(pParse, OE_Abort, pIdx); + + sqlite3VdbeJumpHere(v, addrBypass); /* Terminate the recheck bypass */ + } + seenReplace = 1; + break; + } + } + if( pUpIdx==pIdx ){ + sqlite3VdbeGoto(v, upsertJump+1); + sqlite3VdbeJumpHere(v, upsertBypass); + }else{ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + } + if( regR!=regIdx ) sqlite3ReleaseTempRange(pParse, regR, nPkField); + } + + /* If the IPK constraint is a REPLACE, run it last */ + if( ipkTop ){ + sqlite3VdbeGoto(v, ipkTop); + VdbeComment((v, "Do IPK REPLACE")); + sqlite3VdbeJumpHere(v, ipkBottom); + } + + /* Recheck all uniqueness constraints after replace triggers have run */ + testcase( regTrigCnt!=0 && nReplaceTrig==0 ); + assert( regTrigCnt!=0 || nReplaceTrig==0 ); + if( nReplaceTrig ){ + sqlite3VdbeAddOp2(v, OP_IfNot, regTrigCnt, lblRecheckOk);VdbeCoverage(v); + if( !pPk ){ + if( isUpdate ){ + sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRecheck, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRecheck, regNewData); + VdbeCoverage(v); + sqlite3RowidConstraint(pParse, OE_Abort, pTab); + }else{ + sqlite3VdbeGoto(v, addrRecheck); + } + sqlite3VdbeResolveLabel(v, lblRecheckOk); + } + + /* Generate the table record */ + if( HasRowid(pTab) ){ + int regRec = aRegIdx[ix]; + sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData+1, pTab->nNVCol, regRec); + sqlite3SetMakeRecordP5(v, pTab); + if( !bAffinityDone ){ + sqlite3TableAffinity(v, pTab, 0); + } + } + + *pbMayReplace = seenReplace; + VdbeModuleComment((v, "END: GenCnstCks(%d)", seenReplace)); +} + +#ifdef SQLITE_ENABLE_NULL_TRIM +/* +** Change the P5 operand on the last opcode (which should be an OP_MakeRecord) +** to be the number of columns in table pTab that must not be NULL-trimmed. +** +** Or if no columns of pTab may be NULL-trimmed, leave P5 at zero. +*/ +SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe *v, Table *pTab){ + u16 i; + + /* Records with omitted columns are only allowed for schema format + ** version 2 and later (SQLite version 3.1.4, 2005-02-20). */ + if( pTab->pSchema->file_format<2 ) return; + + for(i=pTab->nCol-1; i>0; i--){ + if( pTab->aCol[i].pDflt!=0 ) break; + if( pTab->aCol[i].colFlags & COLFLAG_PRIMKEY ) break; + } + sqlite3VdbeChangeP5(v, i+1); +} +#endif + +/* +** This routine generates code to finish the INSERT or UPDATE operation +** that was started by a prior call to sqlite3GenerateConstraintChecks. +** A consecutive range of registers starting at regNewData contains the +** rowid and the content to be inserted. +** +** The arguments to this routine should be the same as the first six +** arguments to sqlite3GenerateConstraintChecks. +*/ +SQLITE_PRIVATE void sqlite3CompleteInsertion( + Parse *pParse, /* The parser context */ + Table *pTab, /* the table into which we are inserting */ + int iDataCur, /* Cursor of the canonical data source */ + int iIdxCur, /* First index cursor */ + int regNewData, /* Range of content */ + int *aRegIdx, /* Register used by each index. 0 for unused indices */ + int update_flags, /* True for UPDATE, False for INSERT */ + int appendBias, /* True if this is likely to be an append */ + int useSeekResult /* True to set the USESEEKRESULT flag on OP_[Idx]Insert */ +){ + Vdbe *v; /* Prepared statements under construction */ + Index *pIdx; /* An index being inserted or updated */ + u8 pik_flags; /* flag values passed to the btree insert */ + int i; /* Loop counter */ + + assert( update_flags==0 + || update_flags==OPFLAG_ISUPDATE + || update_flags==(OPFLAG_ISUPDATE|OPFLAG_SAVEPOSITION) + ); + + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + assert( pTab->pSelect==0 ); /* This table is not a VIEW */ + for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + /* All REPLACE indexes are at the end of the list */ + assert( pIdx->onError!=OE_Replace + || pIdx->pNext==0 + || pIdx->pNext->onError==OE_Replace ); + if( aRegIdx[i]==0 ) continue; + if( pIdx->pPartIdxWhere ){ + sqlite3VdbeAddOp2(v, OP_IsNull, aRegIdx[i], sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + } + pik_flags = (useSeekResult ? OPFLAG_USESEEKRESULT : 0); + if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ + assert( pParse->nested==0 ); + pik_flags |= OPFLAG_NCHANGE; + pik_flags |= (update_flags & OPFLAG_SAVEPOSITION); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( update_flags==0 ){ + int r = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Integer, 0, r); + sqlite3VdbeAddOp4(v, OP_Insert, + iIdxCur+i, aRegIdx[i], r, (char*)pTab, P4_TABLE + ); + sqlite3VdbeChangeP5(v, OPFLAG_ISNOOP); + sqlite3ReleaseTempReg(pParse, r); + } +#endif + } + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iIdxCur+i, aRegIdx[i], + aRegIdx[i]+1, + pIdx->uniqNotNull ? pIdx->nKeyCol: pIdx->nColumn); + sqlite3VdbeChangeP5(v, pik_flags); + } + if( !HasRowid(pTab) ) return; + if( pParse->nested ){ + pik_flags = 0; + }else{ + pik_flags = OPFLAG_NCHANGE; + pik_flags |= (update_flags?update_flags:OPFLAG_LASTROWID); + } + if( appendBias ){ + pik_flags |= OPFLAG_APPEND; + } + if( useSeekResult ){ + pik_flags |= OPFLAG_USESEEKRESULT; + } + sqlite3VdbeAddOp3(v, OP_Insert, iDataCur, aRegIdx[i], regNewData); + if( !pParse->nested ){ + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); + } + sqlite3VdbeChangeP5(v, pik_flags); +} + +/* +** Allocate cursors for the pTab table and all its indices and generate +** code to open and initialized those cursors. +** +** The cursor for the object that contains the complete data (normally +** the table itself, but the PRIMARY KEY index in the case of a WITHOUT +** ROWID table) is returned in *piDataCur. The first index cursor is +** returned in *piIdxCur. The number of indices is returned. +** +** Use iBase as the first cursor (either the *piDataCur for rowid tables +** or the first index for WITHOUT ROWID tables) if it is non-negative. +** If iBase is negative, then allocate the next available cursor. +** +** For a rowid table, *piDataCur will be exactly one less than *piIdxCur. +** For a WITHOUT ROWID table, *piDataCur will be somewhere in the range +** of *piIdxCurs, depending on where the PRIMARY KEY index appears on the +** pTab->pIndex list. +** +** If pTab is a virtual table, then this routine is a no-op and the +** *piDataCur and *piIdxCur values are left uninitialized. +*/ +SQLITE_PRIVATE int sqlite3OpenTableAndIndices( + Parse *pParse, /* Parsing context */ + Table *pTab, /* Table to be opened */ + int op, /* OP_OpenRead or OP_OpenWrite */ + u8 p5, /* P5 value for OP_Open* opcodes (except on WITHOUT ROWID) */ + int iBase, /* Use this for the table cursor, if there is one */ + u8 *aToOpen, /* If not NULL: boolean for each table and index */ + int *piDataCur, /* Write the database source cursor number here */ + int *piIdxCur /* Write the first index cursor number here */ +){ + int i; + int iDb; + int iDataCur; + Index *pIdx; + Vdbe *v; + + assert( op==OP_OpenRead || op==OP_OpenWrite ); + assert( op==OP_OpenWrite || p5==0 ); + if( IsVirtual(pTab) ){ + /* This routine is a no-op for virtual tables. Leave the output + ** variables *piDataCur and *piIdxCur uninitialized so that valgrind + ** can detect if they are used by mistake in the caller. */ + return 0; + } + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + if( iBase<0 ) iBase = pParse->nTab; + iDataCur = iBase++; + if( piDataCur ) *piDataCur = iDataCur; + if( HasRowid(pTab) && (aToOpen==0 || aToOpen[0]) ){ + sqlite3OpenTable(pParse, iDataCur, iDb, pTab, op); + }else{ + sqlite3TableLock(pParse, iDb, pTab->tnum, op==OP_OpenWrite, pTab->zName); + } + if( piIdxCur ) *piIdxCur = iBase; + for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + int iIdxCur = iBase++; + assert( pIdx->pSchema==pTab->pSchema ); + if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ + if( piDataCur ) *piDataCur = iIdxCur; + p5 = 0; + } + if( aToOpen==0 || aToOpen[i+1] ){ + sqlite3VdbeAddOp3(v, op, iIdxCur, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + sqlite3VdbeChangeP5(v, p5); + VdbeComment((v, "%s", pIdx->zName)); + } + } + if( iBase>pParse->nTab ) pParse->nTab = iBase; + return i; +} + + +#ifdef SQLITE_TEST +/* +** The following global variable is incremented whenever the +** transfer optimization is used. This is used for testing +** purposes only - to make sure the transfer optimization really +** is happening when it is supposed to. +*/ +SQLITE_API int sqlite3_xferopt_count; +#endif /* SQLITE_TEST */ + + +#ifndef SQLITE_OMIT_XFER_OPT +/* +** Check to see if index pSrc is compatible as a source of data +** for index pDest in an insert transfer optimization. The rules +** for a compatible index: +** +** * The index is over the same set of columns +** * The same DESC and ASC markings occurs on all columns +** * The same onError processing (OE_Abort, OE_Ignore, etc) +** * The same collating sequence on each column +** * The index has the exact same WHERE clause +*/ +static int xferCompatibleIndex(Index *pDest, Index *pSrc){ + int i; + assert( pDest && pSrc ); + assert( pDest->pTable!=pSrc->pTable ); + if( pDest->nKeyCol!=pSrc->nKeyCol || pDest->nColumn!=pSrc->nColumn ){ + return 0; /* Different number of columns */ + } + if( pDest->onError!=pSrc->onError ){ + return 0; /* Different conflict resolution strategies */ + } + for(i=0; inKeyCol; i++){ + if( pSrc->aiColumn[i]!=pDest->aiColumn[i] ){ + return 0; /* Different columns indexed */ + } + if( pSrc->aiColumn[i]==XN_EXPR ){ + assert( pSrc->aColExpr!=0 && pDest->aColExpr!=0 ); + if( sqlite3ExprCompare(0, pSrc->aColExpr->a[i].pExpr, + pDest->aColExpr->a[i].pExpr, -1)!=0 ){ + return 0; /* Different expressions in the index */ + } + } + if( pSrc->aSortOrder[i]!=pDest->aSortOrder[i] ){ + return 0; /* Different sort orders */ + } + if( sqlite3_stricmp(pSrc->azColl[i],pDest->azColl[i])!=0 ){ + return 0; /* Different collating sequences */ + } + } + if( sqlite3ExprCompare(0, pSrc->pPartIdxWhere, pDest->pPartIdxWhere, -1) ){ + return 0; /* Different WHERE clauses */ + } + + /* If no test above fails then the indices must be compatible */ + return 1; +} + +/* +** Attempt the transfer optimization on INSERTs of the form +** +** INSERT INTO tab1 SELECT * FROM tab2; +** +** The xfer optimization transfers raw records from tab2 over to tab1. +** Columns are not decoded and reassembled, which greatly improves +** performance. Raw index records are transferred in the same way. +** +** The xfer optimization is only attempted if tab1 and tab2 are compatible. +** There are lots of rules for determining compatibility - see comments +** embedded in the code for details. +** +** This routine returns TRUE if the optimization is guaranteed to be used. +** Sometimes the xfer optimization will only work if the destination table +** is empty - a factor that can only be determined at run-time. In that +** case, this routine generates code for the xfer optimization but also +** does a test to see if the destination table is empty and jumps over the +** xfer optimization code if the test fails. In that case, this routine +** returns FALSE so that the caller will know to go ahead and generate +** an unoptimized transfer. This routine also returns FALSE if there +** is no chance that the xfer optimization can be applied. +** +** This optimization is particularly useful at making VACUUM run faster. +*/ +static int xferOptimization( + Parse *pParse, /* Parser context */ + Table *pDest, /* The table we are inserting into */ + Select *pSelect, /* A SELECT statement to use as the data source */ + int onError, /* How to handle constraint errors */ + int iDbDest /* The database of pDest */ +){ + sqlite3 *db = pParse->db; + ExprList *pEList; /* The result set of the SELECT */ + Table *pSrc; /* The table in the FROM clause of SELECT */ + Index *pSrcIdx, *pDestIdx; /* Source and destination indices */ + struct SrcList_item *pItem; /* An element of pSelect->pSrc */ + int i; /* Loop counter */ + int iDbSrc; /* The database of pSrc */ + int iSrc, iDest; /* Cursors from source and destination */ + int addr1, addr2; /* Loop addresses */ + int emptyDestTest = 0; /* Address of test for empty pDest */ + int emptySrcTest = 0; /* Address of test for empty pSrc */ + Vdbe *v; /* The VDBE we are building */ + int regAutoinc; /* Memory register used by AUTOINC */ + int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */ + int regData, regRowid; /* Registers holding data and rowid */ + + if( pSelect==0 ){ + return 0; /* Must be of the form INSERT INTO ... SELECT ... */ + } + if( pParse->pWith || pSelect->pWith ){ + /* Do not attempt to process this query if there are an WITH clauses + ** attached to it. Proceeding may generate a false "no such table: xxx" + ** error if pSelect reads from a CTE named "xxx". */ + return 0; + } + if( sqlite3TriggerList(pParse, pDest) ){ + return 0; /* tab1 must not have triggers */ + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pDest) ){ + return 0; /* tab1 must not be a virtual table */ + } +#endif + if( onError==OE_Default ){ + if( pDest->iPKey>=0 ) onError = pDest->keyConf; + if( onError==OE_Default ) onError = OE_Abort; + } + assert(pSelect->pSrc); /* allocated even if there is no FROM clause */ + if( pSelect->pSrc->nSrc!=1 ){ + return 0; /* FROM clause must have exactly one term */ + } + if( pSelect->pSrc->a[0].pSelect ){ + return 0; /* FROM clause cannot contain a subquery */ + } + if( pSelect->pWhere ){ + return 0; /* SELECT may not have a WHERE clause */ + } + if( pSelect->pOrderBy ){ + return 0; /* SELECT may not have an ORDER BY clause */ + } + /* Do not need to test for a HAVING clause. If HAVING is present but + ** there is no ORDER BY, we will get an error. */ + if( pSelect->pGroupBy ){ + return 0; /* SELECT may not have a GROUP BY clause */ + } + if( pSelect->pLimit ){ + return 0; /* SELECT may not have a LIMIT clause */ + } + if( pSelect->pPrior ){ + return 0; /* SELECT may not be a compound query */ + } + if( pSelect->selFlags & SF_Distinct ){ + return 0; /* SELECT may not be DISTINCT */ + } + pEList = pSelect->pEList; + assert( pEList!=0 ); + if( pEList->nExpr!=1 ){ + return 0; /* The result set must have exactly one column */ + } + assert( pEList->a[0].pExpr ); + if( pEList->a[0].pExpr->op!=TK_ASTERISK ){ + return 0; /* The result set must be the special operator "*" */ + } + + /* At this point we have established that the statement is of the + ** correct syntactic form to participate in this optimization. Now + ** we have to check the semantics. + */ + pItem = pSelect->pSrc->a; + pSrc = sqlite3LocateTableItem(pParse, 0, pItem); + if( pSrc==0 ){ + return 0; /* FROM clause does not contain a real table */ + } + if( pSrc->tnum==pDest->tnum && pSrc->pSchema==pDest->pSchema ){ + testcase( pSrc!=pDest ); /* Possible due to bad sqlite_master.rootpage */ + return 0; /* tab1 and tab2 may not be the same table */ + } + if( HasRowid(pDest)!=HasRowid(pSrc) ){ + return 0; /* source and destination must both be WITHOUT ROWID or not */ + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pSrc) ){ + return 0; /* tab2 must not be a virtual table */ + } +#endif + if( pSrc->pSelect ){ + return 0; /* tab2 may not be a view */ + } + if( pDest->nCol!=pSrc->nCol ){ + return 0; /* Number of columns must be the same in tab1 and tab2 */ + } + if( pDest->iPKey!=pSrc->iPKey ){ + return 0; /* Both tables must have the same INTEGER PRIMARY KEY */ + } + for(i=0; inCol; i++){ + Column *pDestCol = &pDest->aCol[i]; + Column *pSrcCol = &pSrc->aCol[i]; +#ifdef SQLITE_ENABLE_HIDDEN_COLUMNS + if( (db->mDbFlags & DBFLAG_Vacuum)==0 + && (pDestCol->colFlags | pSrcCol->colFlags) & COLFLAG_HIDDEN + ){ + return 0; /* Neither table may have __hidden__ columns */ + } +#endif +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Even if tables t1 and t2 have identical schemas, if they contain + ** generated columns, then this statement is semantically incorrect: + ** + ** INSERT INTO t2 SELECT * FROM t1; + ** + ** The reason is that generated column values are returned by the + ** the SELECT statement on the right but the INSERT statement on the + ** left wants them to be omitted. + ** + ** Nevertheless, this is a useful notational shorthand to tell SQLite + ** to do a bulk transfer all of the content from t1 over to t2. + ** + ** We could, in theory, disable this (except for internal use by the + ** VACUUM command where it is actually needed). But why do that? It + ** seems harmless enough, and provides a useful service. + */ + if( (pDestCol->colFlags & COLFLAG_GENERATED) != + (pSrcCol->colFlags & COLFLAG_GENERATED) ){ + return 0; /* Both columns have the same generated-column type */ + } + /* But the transfer is only allowed if both the source and destination + ** tables have the exact same expressions for generated columns. + ** This requirement could be relaxed for VIRTUAL columns, I suppose. + */ + if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){ + if( sqlite3ExprCompare(0, pSrcCol->pDflt, pDestCol->pDflt, -1)!=0 ){ + testcase( pDestCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pDestCol->colFlags & COLFLAG_STORED ); + return 0; /* Different generator expressions */ + } + } +#endif + if( pDestCol->affinity!=pSrcCol->affinity ){ + return 0; /* Affinity must be the same on all columns */ + } + if( sqlite3_stricmp(pDestCol->zColl, pSrcCol->zColl)!=0 ){ + return 0; /* Collating sequence must be the same on all columns */ + } + if( pDestCol->notNull && !pSrcCol->notNull ){ + return 0; /* tab2 must be NOT NULL if tab1 is */ + } + /* Default values for second and subsequent columns need to match. */ + if( (pDestCol->colFlags & COLFLAG_GENERATED)==0 && i>0 ){ + assert( pDestCol->pDflt==0 || pDestCol->pDflt->op==TK_SPAN ); + assert( pSrcCol->pDflt==0 || pSrcCol->pDflt->op==TK_SPAN ); + if( (pDestCol->pDflt==0)!=(pSrcCol->pDflt==0) + || (pDestCol->pDflt && strcmp(pDestCol->pDflt->u.zToken, + pSrcCol->pDflt->u.zToken)!=0) + ){ + return 0; /* Default values must be the same for all columns */ + } + } + } + for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ + if( IsUniqueIndex(pDestIdx) ){ + destHasUniqueIdx = 1; + } + for(pSrcIdx=pSrc->pIndex; pSrcIdx; pSrcIdx=pSrcIdx->pNext){ + if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; + } + if( pSrcIdx==0 ){ + return 0; /* pDestIdx has no corresponding index in pSrc */ + } + if( pSrcIdx->tnum==pDestIdx->tnum && pSrc->pSchema==pDest->pSchema + && sqlite3FaultSim(411)==SQLITE_OK ){ + /* The sqlite3FaultSim() call allows this corruption test to be + ** bypassed during testing, in order to exercise other corruption tests + ** further downstream. */ + return 0; /* Corrupt schema - two indexes on the same btree */ + } + } +#ifndef SQLITE_OMIT_CHECK + if( pDest->pCheck && sqlite3ExprListCompare(pSrc->pCheck,pDest->pCheck,-1) ){ + return 0; /* Tables have different CHECK constraints. Ticket #2252 */ + } +#endif +#ifndef SQLITE_OMIT_FOREIGN_KEY + /* Disallow the transfer optimization if the destination table constains + ** any foreign key constraints. This is more restrictive than necessary. + ** But the main beneficiary of the transfer optimization is the VACUUM + ** command, and the VACUUM command disables foreign key constraints. So + ** the extra complication to make this rule less restrictive is probably + ** not worth the effort. Ticket [6284df89debdfa61db8073e062908af0c9b6118e] + */ + if( (db->flags & SQLITE_ForeignKeys)!=0 && pDest->pFKey!=0 ){ + return 0; + } +#endif + if( (db->flags & SQLITE_CountRows)!=0 ){ + return 0; /* xfer opt does not play well with PRAGMA count_changes */ + } + + /* If we get this far, it means that the xfer optimization is at + ** least a possibility, though it might only work if the destination + ** table (tab1) is initially empty. + */ +#ifdef SQLITE_TEST + sqlite3_xferopt_count++; +#endif + iDbSrc = sqlite3SchemaToIndex(db, pSrc->pSchema); + v = sqlite3GetVdbe(pParse); + sqlite3CodeVerifySchema(pParse, iDbSrc); + iSrc = pParse->nTab++; + iDest = pParse->nTab++; + regAutoinc = autoIncBegin(pParse, iDbDest, pDest); + regData = sqlite3GetTempReg(pParse); + regRowid = sqlite3GetTempReg(pParse); + sqlite3OpenTable(pParse, iDest, iDbDest, pDest, OP_OpenWrite); + assert( HasRowid(pDest) || destHasUniqueIdx ); + if( (db->mDbFlags & DBFLAG_Vacuum)==0 && ( + (pDest->iPKey<0 && pDest->pIndex!=0) /* (1) */ + || destHasUniqueIdx /* (2) */ + || (onError!=OE_Abort && onError!=OE_Rollback) /* (3) */ + )){ + /* In some circumstances, we are able to run the xfer optimization + ** only if the destination table is initially empty. Unless the + ** DBFLAG_Vacuum flag is set, this block generates code to make + ** that determination. If DBFLAG_Vacuum is set, then the destination + ** table is always empty. + ** + ** Conditions under which the destination must be empty: + ** + ** (1) There is no INTEGER PRIMARY KEY but there are indices. + ** (If the destination is not initially empty, the rowid fields + ** of index entries might need to change.) + ** + ** (2) The destination has a unique index. (The xfer optimization + ** is unable to test uniqueness.) + ** + ** (3) onError is something other than OE_Abort and OE_Rollback. + */ + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0); VdbeCoverage(v); + emptyDestTest = sqlite3VdbeAddOp0(v, OP_Goto); + sqlite3VdbeJumpHere(v, addr1); + } + if( HasRowid(pSrc) ){ + u8 insFlags; + sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead); + emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); + if( pDest->iPKey>=0 ){ + addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); + sqlite3VdbeVerifyAbortable(v, onError); + addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid); + VdbeCoverage(v); + sqlite3RowidConstraint(pParse, onError, pDest); + sqlite3VdbeJumpHere(v, addr2); + autoIncStep(pParse, regAutoinc, regRowid); + }else if( pDest->pIndex==0 && !(db->mDbFlags & DBFLAG_VacuumInto) ){ + addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); + }else{ + addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); + assert( (pDest->tabFlags & TF_Autoincrement)==0 ); + } + if( db->mDbFlags & DBFLAG_Vacuum ){ + sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); + insFlags = OPFLAG_APPEND|OPFLAG_USESEEKRESULT; + }else{ + insFlags = OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND; + } + sqlite3VdbeAddOp3(v, OP_RowData, iSrc, regData, 1); + sqlite3VdbeAddOp4(v, OP_Insert, iDest, regData, regRowid, + (char*)pDest, P4_TABLE); + sqlite3VdbeChangeP5(v, insFlags); + sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); + sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); + }else{ + sqlite3TableLock(pParse, iDbDest, pDest->tnum, 1, pDest->zName); + sqlite3TableLock(pParse, iDbSrc, pSrc->tnum, 0, pSrc->zName); + } + for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ + u8 idxInsFlags = 0; + for(pSrcIdx=pSrc->pIndex; ALWAYS(pSrcIdx); pSrcIdx=pSrcIdx->pNext){ + if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; + } + assert( pSrcIdx ); + sqlite3VdbeAddOp3(v, OP_OpenRead, iSrc, pSrcIdx->tnum, iDbSrc); + sqlite3VdbeSetP4KeyInfo(pParse, pSrcIdx); + VdbeComment((v, "%s", pSrcIdx->zName)); + sqlite3VdbeAddOp3(v, OP_OpenWrite, iDest, pDestIdx->tnum, iDbDest); + sqlite3VdbeSetP4KeyInfo(pParse, pDestIdx); + sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR); + VdbeComment((v, "%s", pDestIdx->zName)); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); + if( db->mDbFlags & DBFLAG_Vacuum ){ + /* This INSERT command is part of a VACUUM operation, which guarantees + ** that the destination table is empty. If all indexed columns use + ** collation sequence BINARY, then it can also be assumed that the + ** index will be populated by inserting keys in strictly sorted + ** order. In this case, instead of seeking within the b-tree as part + ** of every OP_IdxInsert opcode, an OP_SeekEnd is added before the + ** OP_IdxInsert to seek to the point within the b-tree where each key + ** should be inserted. This is faster. + ** + ** If any of the indexed columns use a collation sequence other than + ** BINARY, this optimization is disabled. This is because the user + ** might change the definition of a collation sequence and then run + ** a VACUUM command. In that case keys may not be written in strictly + ** sorted order. */ + for(i=0; inColumn; i++){ + const char *zColl = pSrcIdx->azColl[i]; + if( sqlite3_stricmp(sqlite3StrBINARY, zColl) ) break; + } + if( i==pSrcIdx->nColumn ){ + idxInsFlags = OPFLAG_USESEEKRESULT; + sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); + } + }else if( !HasRowid(pSrc) && pDestIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ + idxInsFlags |= OPFLAG_NCHANGE; + } + sqlite3VdbeAddOp3(v, OP_RowData, iSrc, regData, 1); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iDest, regData); + sqlite3VdbeChangeP5(v, idxInsFlags|OPFLAG_APPEND); + sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); + sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); + } + if( emptySrcTest ) sqlite3VdbeJumpHere(v, emptySrcTest); + sqlite3ReleaseTempReg(pParse, regRowid); + sqlite3ReleaseTempReg(pParse, regData); + if( emptyDestTest ){ + sqlite3AutoincrementEnd(pParse); + sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_OK, 0); + sqlite3VdbeJumpHere(v, emptyDestTest); + sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); + return 0; + }else{ + return 1; + } +} +#endif /* SQLITE_OMIT_XFER_OPT */ + +/************** End of insert.c **********************************************/ +/************** Begin file legacy.c ******************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Main file for the SQLite library. The routines in this file +** implement the programmer interface to the library. Routines in +** other files are for internal use by SQLite and should not be +** accessed by users of the library. +*/ + +/* #include "sqliteInt.h" */ + +/* +** Execute SQL code. Return one of the SQLITE_ success/failure +** codes. Also write an error message into memory obtained from +** malloc() and make *pzErrMsg point to that message. +** +** If the SQL is a query, then for each row in the query result +** the xCallback() function is called. pArg becomes the first +** argument to xCallback(). If xCallback=NULL then no callback +** is invoked, even for queries. +*/ +SQLITE_API int sqlite3_exec( + sqlite3 *db, /* The database on which the SQL executes */ + const char *zSql, /* The SQL to be executed */ + sqlite3_callback xCallback, /* Invoke this callback routine */ + void *pArg, /* First argument to xCallback() */ + char **pzErrMsg /* Write error messages here */ +){ + int rc = SQLITE_OK; /* Return code */ + const char *zLeftover; /* Tail of unprocessed SQL */ + sqlite3_stmt *pStmt = 0; /* The current SQL statement */ + char **azCols = 0; /* Names of result columns */ + int callbackIsInit; /* True if callback data is initialized */ + + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; + if( zSql==0 ) zSql = ""; + + sqlite3_mutex_enter(db->mutex); + sqlite3Error(db, SQLITE_OK); + while( rc==SQLITE_OK && zSql[0] ){ + int nCol = 0; + char **azVals = 0; + + pStmt = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); + assert( rc==SQLITE_OK || pStmt==0 ); + if( rc!=SQLITE_OK ){ + continue; + } + if( !pStmt ){ + /* this happens for a comment or white-space */ + zSql = zLeftover; + continue; + } + callbackIsInit = 0; + + while( 1 ){ + int i; + rc = sqlite3_step(pStmt); + + /* Invoke the callback function if required */ + if( xCallback && (SQLITE_ROW==rc || + (SQLITE_DONE==rc && !callbackIsInit + && db->flags&SQLITE_NullCallback)) ){ + if( !callbackIsInit ){ + nCol = sqlite3_column_count(pStmt); + azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*)); + if( azCols==0 ){ + goto exec_out; + } + for(i=0; ierrMask)==rc ); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/************** End of legacy.c **********************************************/ +/************** Begin file loadext.c *****************************************/ +/* +** 2006 June 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 code used to dynamically load extensions into +** the SQLite library. +*/ + +#ifndef SQLITE_CORE + #define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */ +#endif +/************** Include sqlite3ext.h in the middle of loadext.c **************/ +/************** Begin file sqlite3ext.h **************************************/ +/* +** 2006 June 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 header file defines the SQLite interface for use by +** shared libraries that want to be imported as extensions into +** an SQLite instance. Shared libraries that intend to be loaded +** as extensions by SQLite should #include this file instead of +** sqlite3.h. +*/ +#ifndef SQLITE3EXT_H +#define SQLITE3EXT_H +/* #include "sqlite3.h" */ + +/* +** The following structure holds pointers to all of the SQLite API +** routines. +** +** WARNING: In order to maintain backwards compatibility, add new +** interfaces to the end of this structure only. If you insert new +** interfaces in the middle of this structure, then older different +** versions of SQLite will not be able to load each other's shared +** libraries! +*/ +struct sqlite3_api_routines { + void * (*aggregate_context)(sqlite3_context*,int nBytes); + int (*aggregate_count)(sqlite3_context*); + int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*)); + int (*bind_double)(sqlite3_stmt*,int,double); + int (*bind_int)(sqlite3_stmt*,int,int); + int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64); + int (*bind_null)(sqlite3_stmt*,int); + int (*bind_parameter_count)(sqlite3_stmt*); + int (*bind_parameter_index)(sqlite3_stmt*,const char*zName); + const char * (*bind_parameter_name)(sqlite3_stmt*,int); + int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*)); + int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*)); + int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*); + int (*busy_handler)(sqlite3*,int(*)(void*,int),void*); + int (*busy_timeout)(sqlite3*,int ms); + int (*changes)(sqlite3*); + int (*close)(sqlite3*); + int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const char*)); + int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const void*)); + const void * (*column_blob)(sqlite3_stmt*,int iCol); + int (*column_bytes)(sqlite3_stmt*,int iCol); + int (*column_bytes16)(sqlite3_stmt*,int iCol); + int (*column_count)(sqlite3_stmt*pStmt); + const char * (*column_database_name)(sqlite3_stmt*,int); + const void * (*column_database_name16)(sqlite3_stmt*,int); + const char * (*column_decltype)(sqlite3_stmt*,int i); + const void * (*column_decltype16)(sqlite3_stmt*,int); + double (*column_double)(sqlite3_stmt*,int iCol); + int (*column_int)(sqlite3_stmt*,int iCol); + sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol); + const char * (*column_name)(sqlite3_stmt*,int); + const void * (*column_name16)(sqlite3_stmt*,int); + const char * (*column_origin_name)(sqlite3_stmt*,int); + const void * (*column_origin_name16)(sqlite3_stmt*,int); + const char * (*column_table_name)(sqlite3_stmt*,int); + const void * (*column_table_name16)(sqlite3_stmt*,int); + const unsigned char * (*column_text)(sqlite3_stmt*,int iCol); + const void * (*column_text16)(sqlite3_stmt*,int iCol); + int (*column_type)(sqlite3_stmt*,int iCol); + sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol); + void * (*commit_hook)(sqlite3*,int(*)(void*),void*); + int (*complete)(const char*sql); + int (*complete16)(const void*sql); + int (*create_collation)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_collation16)(sqlite3*,const void*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_function)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_function16)(sqlite3*,const void*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*); + int (*data_count)(sqlite3_stmt*pStmt); + sqlite3 * (*db_handle)(sqlite3_stmt*); + int (*declare_vtab)(sqlite3*,const char*); + int (*enable_shared_cache)(int); + int (*errcode)(sqlite3*db); + const char * (*errmsg)(sqlite3*); + const void * (*errmsg16)(sqlite3*); + int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**); + int (*expired)(sqlite3_stmt*); + int (*finalize)(sqlite3_stmt*pStmt); + void (*free)(void*); + void (*free_table)(char**result); + int (*get_autocommit)(sqlite3*); + void * (*get_auxdata)(sqlite3_context*,int); + int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**); + int (*global_recover)(void); + void (*interruptx)(sqlite3*); + sqlite_int64 (*last_insert_rowid)(sqlite3*); + const char * (*libversion)(void); + int (*libversion_number)(void); + void *(*malloc)(int); + char * (*mprintf)(const char*,...); + int (*open)(const char*,sqlite3**); + int (*open16)(const void*,sqlite3**); + int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*); + void (*progress_handler)(sqlite3*,int,int(*)(void*),void*); + void *(*realloc)(void*,int); + int (*reset)(sqlite3_stmt*pStmt); + void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_double)(sqlite3_context*,double); + void (*result_error)(sqlite3_context*,const char*,int); + void (*result_error16)(sqlite3_context*,const void*,int); + void (*result_int)(sqlite3_context*,int); + void (*result_int64)(sqlite3_context*,sqlite_int64); + void (*result_null)(sqlite3_context*); + void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*)); + void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_value)(sqlite3_context*,sqlite3_value*); + void * (*rollback_hook)(sqlite3*,void(*)(void*),void*); + int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*, + const char*,const char*),void*); + void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*)); + char * (*xsnprintf)(int,char*,const char*,...); + int (*step)(sqlite3_stmt*); + int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*, + char const**,char const**,int*,int*,int*); + void (*thread_cleanup)(void); + int (*total_changes)(sqlite3*); + void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*); + int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*); + void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*, + sqlite_int64),void*); + void * (*user_data)(sqlite3_context*); + const void * (*value_blob)(sqlite3_value*); + int (*value_bytes)(sqlite3_value*); + int (*value_bytes16)(sqlite3_value*); + double (*value_double)(sqlite3_value*); + int (*value_int)(sqlite3_value*); + sqlite_int64 (*value_int64)(sqlite3_value*); + int (*value_numeric_type)(sqlite3_value*); + const unsigned char * (*value_text)(sqlite3_value*); + const void * (*value_text16)(sqlite3_value*); + const void * (*value_text16be)(sqlite3_value*); + const void * (*value_text16le)(sqlite3_value*); + int (*value_type)(sqlite3_value*); + char *(*vmprintf)(const char*,va_list); + /* Added ??? */ + int (*overload_function)(sqlite3*, const char *zFuncName, int nArg); + /* Added by 3.3.13 */ + int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + int (*clear_bindings)(sqlite3_stmt*); + /* Added by 3.4.1 */ + int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*, + void (*xDestroy)(void *)); + /* Added by 3.5.0 */ + int (*bind_zeroblob)(sqlite3_stmt*,int,int); + int (*blob_bytes)(sqlite3_blob*); + int (*blob_close)(sqlite3_blob*); + int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64, + int,sqlite3_blob**); + int (*blob_read)(sqlite3_blob*,void*,int,int); + int (*blob_write)(sqlite3_blob*,const void*,int,int); + int (*create_collation_v2)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*), + void(*)(void*)); + int (*file_control)(sqlite3*,const char*,int,void*); + sqlite3_int64 (*memory_highwater)(int); + sqlite3_int64 (*memory_used)(void); + sqlite3_mutex *(*mutex_alloc)(int); + void (*mutex_enter)(sqlite3_mutex*); + void (*mutex_free)(sqlite3_mutex*); + void (*mutex_leave)(sqlite3_mutex*); + int (*mutex_try)(sqlite3_mutex*); + int (*open_v2)(const char*,sqlite3**,int,const char*); + int (*release_memory)(int); + void (*result_error_nomem)(sqlite3_context*); + void (*result_error_toobig)(sqlite3_context*); + int (*sleep)(int); + void (*soft_heap_limit)(int); + sqlite3_vfs *(*vfs_find)(const char*); + int (*vfs_register)(sqlite3_vfs*,int); + int (*vfs_unregister)(sqlite3_vfs*); + int (*xthreadsafe)(void); + void (*result_zeroblob)(sqlite3_context*,int); + void (*result_error_code)(sqlite3_context*,int); + int (*test_control)(int, ...); + void (*randomness)(int,void*); + sqlite3 *(*context_db_handle)(sqlite3_context*); + int (*extended_result_codes)(sqlite3*,int); + int (*limit)(sqlite3*,int,int); + sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*); + const char *(*sql)(sqlite3_stmt*); + int (*status)(int,int*,int*,int); + int (*backup_finish)(sqlite3_backup*); + sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*); + int (*backup_pagecount)(sqlite3_backup*); + int (*backup_remaining)(sqlite3_backup*); + int (*backup_step)(sqlite3_backup*,int); + const char *(*compileoption_get)(int); + int (*compileoption_used)(const char*); + int (*create_function_v2)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*)); + int (*db_config)(sqlite3*,int,...); + sqlite3_mutex *(*db_mutex)(sqlite3*); + int (*db_status)(sqlite3*,int,int*,int*,int); + int (*extended_errcode)(sqlite3*); + void (*log)(int,const char*,...); + sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64); + const char *(*sourceid)(void); + int (*stmt_status)(sqlite3_stmt*,int,int); + int (*strnicmp)(const char*,const char*,int); + int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*); + int (*wal_autocheckpoint)(sqlite3*,int); + int (*wal_checkpoint)(sqlite3*,const char*); + void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*); + int (*blob_reopen)(sqlite3_blob*,sqlite3_int64); + int (*vtab_config)(sqlite3*,int op,...); + int (*vtab_on_conflict)(sqlite3*); + /* Version 3.7.16 and later */ + int (*close_v2)(sqlite3*); + const char *(*db_filename)(sqlite3*,const char*); + int (*db_readonly)(sqlite3*,const char*); + int (*db_release_memory)(sqlite3*); + const char *(*errstr)(int); + int (*stmt_busy)(sqlite3_stmt*); + int (*stmt_readonly)(sqlite3_stmt*); + int (*stricmp)(const char*,const char*); + int (*uri_boolean)(const char*,const char*,int); + sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64); + const char *(*uri_parameter)(const char*,const char*); + char *(*xvsnprintf)(int,char*,const char*,va_list); + int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*); + /* Version 3.8.7 and later */ + int (*auto_extension)(void(*)(void)); + int (*bind_blob64)(sqlite3_stmt*,int,const void*,sqlite3_uint64, + void(*)(void*)); + int (*bind_text64)(sqlite3_stmt*,int,const char*,sqlite3_uint64, + void(*)(void*),unsigned char); + int (*cancel_auto_extension)(void(*)(void)); + int (*load_extension)(sqlite3*,const char*,const char*,char**); + void *(*malloc64)(sqlite3_uint64); + sqlite3_uint64 (*msize)(void*); + void *(*realloc64)(void*,sqlite3_uint64); + void (*reset_auto_extension)(void); + void (*result_blob64)(sqlite3_context*,const void*,sqlite3_uint64, + void(*)(void*)); + void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64, + void(*)(void*), unsigned char); + int (*strglob)(const char*,const char*); + /* Version 3.8.11 and later */ + sqlite3_value *(*value_dup)(const sqlite3_value*); + void (*value_free)(sqlite3_value*); + int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64); + int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64); + /* Version 3.9.0 and later */ + unsigned int (*value_subtype)(sqlite3_value*); + void (*result_subtype)(sqlite3_context*,unsigned int); + /* Version 3.10.0 and later */ + int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int); + int (*strlike)(const char*,const char*,unsigned int); + int (*db_cacheflush)(sqlite3*); + /* Version 3.12.0 and later */ + int (*system_errno)(sqlite3*); + /* Version 3.14.0 and later */ + int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*); + char *(*expanded_sql)(sqlite3_stmt*); + /* Version 3.18.0 and later */ + void (*set_last_insert_rowid)(sqlite3*,sqlite3_int64); + /* Version 3.20.0 and later */ + int (*prepare_v3)(sqlite3*,const char*,int,unsigned int, + sqlite3_stmt**,const char**); + int (*prepare16_v3)(sqlite3*,const void*,int,unsigned int, + sqlite3_stmt**,const void**); + int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*)); + void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*)); + void *(*value_pointer)(sqlite3_value*,const char*); + int (*vtab_nochange)(sqlite3_context*); + int (*value_nochange)(sqlite3_value*); + const char *(*vtab_collation)(sqlite3_index_info*,int); + /* Version 3.24.0 and later */ + int (*keyword_count)(void); + int (*keyword_name)(int,const char**,int*); + int (*keyword_check)(const char*,int); + sqlite3_str *(*str_new)(sqlite3*); + char *(*str_finish)(sqlite3_str*); + void (*str_appendf)(sqlite3_str*, const char *zFormat, ...); + void (*str_vappendf)(sqlite3_str*, const char *zFormat, va_list); + void (*str_append)(sqlite3_str*, const char *zIn, int N); + void (*str_appendall)(sqlite3_str*, const char *zIn); + void (*str_appendchar)(sqlite3_str*, int N, char C); + void (*str_reset)(sqlite3_str*); + int (*str_errcode)(sqlite3_str*); + int (*str_length)(sqlite3_str*); + char *(*str_value)(sqlite3_str*); + /* Version 3.25.0 and later */ + int (*create_window_function)(sqlite3*,const char*,int,int,void*, + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInv)(sqlite3_context*,int,sqlite3_value**), + void(*xDestroy)(void*)); + /* Version 3.26.0 and later */ + const char *(*normalized_sql)(sqlite3_stmt*); + /* Version 3.28.0 and later */ + int (*stmt_isexplain)(sqlite3_stmt*); + int (*value_frombind)(sqlite3_value*); + /* Version 3.30.0 and later */ + int (*drop_modules)(sqlite3*,const char**); + /* Version 3.31.0 and later */ + sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64); + const char *(*uri_key)(const char*,int); + const char *(*filename_database)(const char*); + const char *(*filename_journal)(const char*); + const char *(*filename_wal)(const char*); + /* Version 3.32.0 and later */ + char *(*create_filename)(const char*,const char*,const char*, + int,const char**); + void (*free_filename)(char*); + sqlite3_file *(*database_file_object)(const char*); +}; + +/* +** This is the function signature used for all extension entry points. It +** is also defined in the file "loadext.c". +*/ +typedef int (*sqlite3_loadext_entry)( + sqlite3 *db, /* Handle to the database. */ + char **pzErrMsg, /* Used to set error string on failure. */ + const sqlite3_api_routines *pThunk /* Extension API function pointers. */ +); + +/* +** The following macros redefine the API routines so that they are +** redirected through the global sqlite3_api structure. +** +** This header file is also used by the loadext.c source file +** (part of the main SQLite library - not an extension) so that +** it can get access to the sqlite3_api_routines structure +** definition. But the main library does not want to redefine +** the API. So the redefinition macros are only valid if the +** SQLITE_CORE macros is undefined. +*/ +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) +#define sqlite3_aggregate_context sqlite3_api->aggregate_context +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_aggregate_count sqlite3_api->aggregate_count +#endif +#define sqlite3_bind_blob sqlite3_api->bind_blob +#define sqlite3_bind_double sqlite3_api->bind_double +#define sqlite3_bind_int sqlite3_api->bind_int +#define sqlite3_bind_int64 sqlite3_api->bind_int64 +#define sqlite3_bind_null sqlite3_api->bind_null +#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count +#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index +#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name +#define sqlite3_bind_text sqlite3_api->bind_text +#define sqlite3_bind_text16 sqlite3_api->bind_text16 +#define sqlite3_bind_value sqlite3_api->bind_value +#define sqlite3_busy_handler sqlite3_api->busy_handler +#define sqlite3_busy_timeout sqlite3_api->busy_timeout +#define sqlite3_changes sqlite3_api->changes +#define sqlite3_close sqlite3_api->close +#define sqlite3_collation_needed sqlite3_api->collation_needed +#define sqlite3_collation_needed16 sqlite3_api->collation_needed16 +#define sqlite3_column_blob sqlite3_api->column_blob +#define sqlite3_column_bytes sqlite3_api->column_bytes +#define sqlite3_column_bytes16 sqlite3_api->column_bytes16 +#define sqlite3_column_count sqlite3_api->column_count +#define sqlite3_column_database_name sqlite3_api->column_database_name +#define sqlite3_column_database_name16 sqlite3_api->column_database_name16 +#define sqlite3_column_decltype sqlite3_api->column_decltype +#define sqlite3_column_decltype16 sqlite3_api->column_decltype16 +#define sqlite3_column_double sqlite3_api->column_double +#define sqlite3_column_int sqlite3_api->column_int +#define sqlite3_column_int64 sqlite3_api->column_int64 +#define sqlite3_column_name sqlite3_api->column_name +#define sqlite3_column_name16 sqlite3_api->column_name16 +#define sqlite3_column_origin_name sqlite3_api->column_origin_name +#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16 +#define sqlite3_column_table_name sqlite3_api->column_table_name +#define sqlite3_column_table_name16 sqlite3_api->column_table_name16 +#define sqlite3_column_text sqlite3_api->column_text +#define sqlite3_column_text16 sqlite3_api->column_text16 +#define sqlite3_column_type sqlite3_api->column_type +#define sqlite3_column_value sqlite3_api->column_value +#define sqlite3_commit_hook sqlite3_api->commit_hook +#define sqlite3_complete sqlite3_api->complete +#define sqlite3_complete16 sqlite3_api->complete16 +#define sqlite3_create_collation sqlite3_api->create_collation +#define sqlite3_create_collation16 sqlite3_api->create_collation16 +#define sqlite3_create_function sqlite3_api->create_function +#define sqlite3_create_function16 sqlite3_api->create_function16 +#define sqlite3_create_module sqlite3_api->create_module +#define sqlite3_create_module_v2 sqlite3_api->create_module_v2 +#define sqlite3_data_count sqlite3_api->data_count +#define sqlite3_db_handle sqlite3_api->db_handle +#define sqlite3_declare_vtab sqlite3_api->declare_vtab +#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache +#define sqlite3_errcode sqlite3_api->errcode +#define sqlite3_errmsg sqlite3_api->errmsg +#define sqlite3_errmsg16 sqlite3_api->errmsg16 +#define sqlite3_exec sqlite3_api->exec +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_expired sqlite3_api->expired +#endif +#define sqlite3_finalize sqlite3_api->finalize +#define sqlite3_free sqlite3_api->free +#define sqlite3_free_table sqlite3_api->free_table +#define sqlite3_get_autocommit sqlite3_api->get_autocommit +#define sqlite3_get_auxdata sqlite3_api->get_auxdata +#define sqlite3_get_table sqlite3_api->get_table +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_global_recover sqlite3_api->global_recover +#endif +#define sqlite3_interrupt sqlite3_api->interruptx +#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid +#define sqlite3_libversion sqlite3_api->libversion +#define sqlite3_libversion_number sqlite3_api->libversion_number +#define sqlite3_malloc sqlite3_api->malloc +#define sqlite3_mprintf sqlite3_api->mprintf +#define sqlite3_open sqlite3_api->open +#define sqlite3_open16 sqlite3_api->open16 +#define sqlite3_prepare sqlite3_api->prepare +#define sqlite3_prepare16 sqlite3_api->prepare16 +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_profile sqlite3_api->profile +#define sqlite3_progress_handler sqlite3_api->progress_handler +#define sqlite3_realloc sqlite3_api->realloc +#define sqlite3_reset sqlite3_api->reset +#define sqlite3_result_blob sqlite3_api->result_blob +#define sqlite3_result_double sqlite3_api->result_double +#define sqlite3_result_error sqlite3_api->result_error +#define sqlite3_result_error16 sqlite3_api->result_error16 +#define sqlite3_result_int sqlite3_api->result_int +#define sqlite3_result_int64 sqlite3_api->result_int64 +#define sqlite3_result_null sqlite3_api->result_null +#define sqlite3_result_text sqlite3_api->result_text +#define sqlite3_result_text16 sqlite3_api->result_text16 +#define sqlite3_result_text16be sqlite3_api->result_text16be +#define sqlite3_result_text16le sqlite3_api->result_text16le +#define sqlite3_result_value sqlite3_api->result_value +#define sqlite3_rollback_hook sqlite3_api->rollback_hook +#define sqlite3_set_authorizer sqlite3_api->set_authorizer +#define sqlite3_set_auxdata sqlite3_api->set_auxdata +#define sqlite3_snprintf sqlite3_api->xsnprintf +#define sqlite3_step sqlite3_api->step +#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata +#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup +#define sqlite3_total_changes sqlite3_api->total_changes +#define sqlite3_trace sqlite3_api->trace +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings +#endif +#define sqlite3_update_hook sqlite3_api->update_hook +#define sqlite3_user_data sqlite3_api->user_data +#define sqlite3_value_blob sqlite3_api->value_blob +#define sqlite3_value_bytes sqlite3_api->value_bytes +#define sqlite3_value_bytes16 sqlite3_api->value_bytes16 +#define sqlite3_value_double sqlite3_api->value_double +#define sqlite3_value_int sqlite3_api->value_int +#define sqlite3_value_int64 sqlite3_api->value_int64 +#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type +#define sqlite3_value_text sqlite3_api->value_text +#define sqlite3_value_text16 sqlite3_api->value_text16 +#define sqlite3_value_text16be sqlite3_api->value_text16be +#define sqlite3_value_text16le sqlite3_api->value_text16le +#define sqlite3_value_type sqlite3_api->value_type +#define sqlite3_vmprintf sqlite3_api->vmprintf +#define sqlite3_vsnprintf sqlite3_api->xvsnprintf +#define sqlite3_overload_function sqlite3_api->overload_function +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_clear_bindings sqlite3_api->clear_bindings +#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob +#define sqlite3_blob_bytes sqlite3_api->blob_bytes +#define sqlite3_blob_close sqlite3_api->blob_close +#define sqlite3_blob_open sqlite3_api->blob_open +#define sqlite3_blob_read sqlite3_api->blob_read +#define sqlite3_blob_write sqlite3_api->blob_write +#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2 +#define sqlite3_file_control sqlite3_api->file_control +#define sqlite3_memory_highwater sqlite3_api->memory_highwater +#define sqlite3_memory_used sqlite3_api->memory_used +#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc +#define sqlite3_mutex_enter sqlite3_api->mutex_enter +#define sqlite3_mutex_free sqlite3_api->mutex_free +#define sqlite3_mutex_leave sqlite3_api->mutex_leave +#define sqlite3_mutex_try sqlite3_api->mutex_try +#define sqlite3_open_v2 sqlite3_api->open_v2 +#define sqlite3_release_memory sqlite3_api->release_memory +#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem +#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig +#define sqlite3_sleep sqlite3_api->sleep +#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit +#define sqlite3_vfs_find sqlite3_api->vfs_find +#define sqlite3_vfs_register sqlite3_api->vfs_register +#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister +#define sqlite3_threadsafe sqlite3_api->xthreadsafe +#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob +#define sqlite3_result_error_code sqlite3_api->result_error_code +#define sqlite3_test_control sqlite3_api->test_control +#define sqlite3_randomness sqlite3_api->randomness +#define sqlite3_context_db_handle sqlite3_api->context_db_handle +#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes +#define sqlite3_limit sqlite3_api->limit +#define sqlite3_next_stmt sqlite3_api->next_stmt +#define sqlite3_sql sqlite3_api->sql +#define sqlite3_status sqlite3_api->status +#define sqlite3_backup_finish sqlite3_api->backup_finish +#define sqlite3_backup_init sqlite3_api->backup_init +#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount +#define sqlite3_backup_remaining sqlite3_api->backup_remaining +#define sqlite3_backup_step sqlite3_api->backup_step +#define sqlite3_compileoption_get sqlite3_api->compileoption_get +#define sqlite3_compileoption_used sqlite3_api->compileoption_used +#define sqlite3_create_function_v2 sqlite3_api->create_function_v2 +#define sqlite3_db_config sqlite3_api->db_config +#define sqlite3_db_mutex sqlite3_api->db_mutex +#define sqlite3_db_status sqlite3_api->db_status +#define sqlite3_extended_errcode sqlite3_api->extended_errcode +#define sqlite3_log sqlite3_api->log +#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64 +#define sqlite3_sourceid sqlite3_api->sourceid +#define sqlite3_stmt_status sqlite3_api->stmt_status +#define sqlite3_strnicmp sqlite3_api->strnicmp +#define sqlite3_unlock_notify sqlite3_api->unlock_notify +#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint +#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint +#define sqlite3_wal_hook sqlite3_api->wal_hook +#define sqlite3_blob_reopen sqlite3_api->blob_reopen +#define sqlite3_vtab_config sqlite3_api->vtab_config +#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict +/* Version 3.7.16 and later */ +#define sqlite3_close_v2 sqlite3_api->close_v2 +#define sqlite3_db_filename sqlite3_api->db_filename +#define sqlite3_db_readonly sqlite3_api->db_readonly +#define sqlite3_db_release_memory sqlite3_api->db_release_memory +#define sqlite3_errstr sqlite3_api->errstr +#define sqlite3_stmt_busy sqlite3_api->stmt_busy +#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly +#define sqlite3_stricmp sqlite3_api->stricmp +#define sqlite3_uri_boolean sqlite3_api->uri_boolean +#define sqlite3_uri_int64 sqlite3_api->uri_int64 +#define sqlite3_uri_parameter sqlite3_api->uri_parameter +#define sqlite3_uri_vsnprintf sqlite3_api->xvsnprintf +#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2 +/* Version 3.8.7 and later */ +#define sqlite3_auto_extension sqlite3_api->auto_extension +#define sqlite3_bind_blob64 sqlite3_api->bind_blob64 +#define sqlite3_bind_text64 sqlite3_api->bind_text64 +#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension +#define sqlite3_load_extension sqlite3_api->load_extension +#define sqlite3_malloc64 sqlite3_api->malloc64 +#define sqlite3_msize sqlite3_api->msize +#define sqlite3_realloc64 sqlite3_api->realloc64 +#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension +#define sqlite3_result_blob64 sqlite3_api->result_blob64 +#define sqlite3_result_text64 sqlite3_api->result_text64 +#define sqlite3_strglob sqlite3_api->strglob +/* Version 3.8.11 and later */ +#define sqlite3_value_dup sqlite3_api->value_dup +#define sqlite3_value_free sqlite3_api->value_free +#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64 +#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64 +/* Version 3.9.0 and later */ +#define sqlite3_value_subtype sqlite3_api->value_subtype +#define sqlite3_result_subtype sqlite3_api->result_subtype +/* Version 3.10.0 and later */ +#define sqlite3_status64 sqlite3_api->status64 +#define sqlite3_strlike sqlite3_api->strlike +#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush +/* Version 3.12.0 and later */ +#define sqlite3_system_errno sqlite3_api->system_errno +/* Version 3.14.0 and later */ +#define sqlite3_trace_v2 sqlite3_api->trace_v2 +#define sqlite3_expanded_sql sqlite3_api->expanded_sql +/* Version 3.18.0 and later */ +#define sqlite3_set_last_insert_rowid sqlite3_api->set_last_insert_rowid +/* Version 3.20.0 and later */ +#define sqlite3_prepare_v3 sqlite3_api->prepare_v3 +#define sqlite3_prepare16_v3 sqlite3_api->prepare16_v3 +#define sqlite3_bind_pointer sqlite3_api->bind_pointer +#define sqlite3_result_pointer sqlite3_api->result_pointer +#define sqlite3_value_pointer sqlite3_api->value_pointer +/* Version 3.22.0 and later */ +#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange +#define sqlite3_value_nochange sqlite3_api->value_nochange +#define sqlite3_vtab_collation sqlite3_api->vtab_collation +/* Version 3.24.0 and later */ +#define sqlite3_keyword_count sqlite3_api->keyword_count +#define sqlite3_keyword_name sqlite3_api->keyword_name +#define sqlite3_keyword_check sqlite3_api->keyword_check +#define sqlite3_str_new sqlite3_api->str_new +#define sqlite3_str_finish sqlite3_api->str_finish +#define sqlite3_str_appendf sqlite3_api->str_appendf +#define sqlite3_str_vappendf sqlite3_api->str_vappendf +#define sqlite3_str_append sqlite3_api->str_append +#define sqlite3_str_appendall sqlite3_api->str_appendall +#define sqlite3_str_appendchar sqlite3_api->str_appendchar +#define sqlite3_str_reset sqlite3_api->str_reset +#define sqlite3_str_errcode sqlite3_api->str_errcode +#define sqlite3_str_length sqlite3_api->str_length +#define sqlite3_str_value sqlite3_api->str_value +/* Version 3.25.0 and later */ +#define sqlite3_create_window_function sqlite3_api->create_window_function +/* Version 3.26.0 and later */ +#define sqlite3_normalized_sql sqlite3_api->normalized_sql +/* Version 3.28.0 and later */ +#define sqlite3_stmt_isexplain sqlite3_api->stmt_isexplain +#define sqlite3_value_frombind sqlite3_api->value_frombind +/* Version 3.30.0 and later */ +#define sqlite3_drop_modules sqlite3_api->drop_modules +/* Version 3.31.0 and later */ +#define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64 +#define sqlite3_uri_key sqlite3_api->uri_key +#define sqlite3_filename_database sqlite3_api->filename_database +#define sqlite3_filename_journal sqlite3_api->filename_journal +#define sqlite3_filename_wal sqlite3_api->filename_wal +/* Version 3.32.0 and later */ +#define sqlite3_create_filename sqlite3_api->create_filename +#define sqlite3_free_filename sqlite3_api->free_filename +#define sqlite3_database_file_object sqlite3_api->database_file_object +#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + /* This case when the file really is being compiled as a loadable + ** extension */ +# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; +# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; +# define SQLITE_EXTENSION_INIT3 \ + extern const sqlite3_api_routines *sqlite3_api; +#else + /* This case when the file is being statically linked into the + ** application */ +# define SQLITE_EXTENSION_INIT1 /*no-op*/ +# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */ +# define SQLITE_EXTENSION_INIT3 /*no-op*/ +#endif + +#endif /* SQLITE3EXT_H */ + +/************** End of sqlite3ext.h ******************************************/ +/************** Continuing where we left off in loadext.c ********************/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Some API routines are omitted when various features are +** excluded from a build of SQLite. Substitute a NULL pointer +** for any missing APIs. +*/ +#ifndef SQLITE_ENABLE_COLUMN_METADATA +# define sqlite3_column_database_name 0 +# define sqlite3_column_database_name16 0 +# define sqlite3_column_table_name 0 +# define sqlite3_column_table_name16 0 +# define sqlite3_column_origin_name 0 +# define sqlite3_column_origin_name16 0 +#endif + +#ifdef SQLITE_OMIT_AUTHORIZATION +# define sqlite3_set_authorizer 0 +#endif + +#ifdef SQLITE_OMIT_UTF16 +# define sqlite3_bind_text16 0 +# define sqlite3_collation_needed16 0 +# define sqlite3_column_decltype16 0 +# define sqlite3_column_name16 0 +# define sqlite3_column_text16 0 +# define sqlite3_complete16 0 +# define sqlite3_create_collation16 0 +# define sqlite3_create_function16 0 +# define sqlite3_errmsg16 0 +# define sqlite3_open16 0 +# define sqlite3_prepare16 0 +# define sqlite3_prepare16_v2 0 +# define sqlite3_prepare16_v3 0 +# define sqlite3_result_error16 0 +# define sqlite3_result_text16 0 +# define sqlite3_result_text16be 0 +# define sqlite3_result_text16le 0 +# define sqlite3_value_text16 0 +# define sqlite3_value_text16be 0 +# define sqlite3_value_text16le 0 +# define sqlite3_column_database_name16 0 +# define sqlite3_column_table_name16 0 +# define sqlite3_column_origin_name16 0 +#endif + +#ifdef SQLITE_OMIT_COMPLETE +# define sqlite3_complete 0 +# define sqlite3_complete16 0 +#endif + +#ifdef SQLITE_OMIT_DECLTYPE +# define sqlite3_column_decltype16 0 +# define sqlite3_column_decltype 0 +#endif + +#ifdef SQLITE_OMIT_PROGRESS_CALLBACK +# define sqlite3_progress_handler 0 +#endif + +#ifdef SQLITE_OMIT_VIRTUALTABLE +# define sqlite3_create_module 0 +# define sqlite3_create_module_v2 0 +# define sqlite3_declare_vtab 0 +# define sqlite3_vtab_config 0 +# define sqlite3_vtab_on_conflict 0 +# define sqlite3_vtab_collation 0 +#endif + +#ifdef SQLITE_OMIT_SHARED_CACHE +# define sqlite3_enable_shared_cache 0 +#endif + +#if defined(SQLITE_OMIT_TRACE) || defined(SQLITE_OMIT_DEPRECATED) +# define sqlite3_profile 0 +# define sqlite3_trace 0 +#endif + +#ifdef SQLITE_OMIT_GET_TABLE +# define sqlite3_free_table 0 +# define sqlite3_get_table 0 +#endif + +#ifdef SQLITE_OMIT_INCRBLOB +#define sqlite3_bind_zeroblob 0 +#define sqlite3_blob_bytes 0 +#define sqlite3_blob_close 0 +#define sqlite3_blob_open 0 +#define sqlite3_blob_read 0 +#define sqlite3_blob_write 0 +#define sqlite3_blob_reopen 0 +#endif + +#if defined(SQLITE_OMIT_TRACE) +# define sqlite3_trace_v2 0 +#endif + +/* +** The following structure contains pointers to all SQLite API routines. +** A pointer to this structure is passed into extensions when they are +** loaded so that the extension can make calls back into the SQLite +** library. +** +** When adding new APIs, add them to the bottom of this structure +** in order to preserve backwards compatibility. +** +** Extensions that use newer APIs should first call the +** sqlite3_libversion_number() to make sure that the API they +** intend to use is supported by the library. Extensions should +** also check to make sure that the pointer to the function is +** not NULL before calling it. +*/ +static const sqlite3_api_routines sqlite3Apis = { + sqlite3_aggregate_context, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_aggregate_count, +#else + 0, +#endif + sqlite3_bind_blob, + sqlite3_bind_double, + sqlite3_bind_int, + sqlite3_bind_int64, + sqlite3_bind_null, + sqlite3_bind_parameter_count, + sqlite3_bind_parameter_index, + sqlite3_bind_parameter_name, + sqlite3_bind_text, + sqlite3_bind_text16, + sqlite3_bind_value, + sqlite3_busy_handler, + sqlite3_busy_timeout, + sqlite3_changes, + sqlite3_close, + sqlite3_collation_needed, + sqlite3_collation_needed16, + sqlite3_column_blob, + sqlite3_column_bytes, + sqlite3_column_bytes16, + sqlite3_column_count, + sqlite3_column_database_name, + sqlite3_column_database_name16, + sqlite3_column_decltype, + sqlite3_column_decltype16, + sqlite3_column_double, + sqlite3_column_int, + sqlite3_column_int64, + sqlite3_column_name, + sqlite3_column_name16, + sqlite3_column_origin_name, + sqlite3_column_origin_name16, + sqlite3_column_table_name, + sqlite3_column_table_name16, + sqlite3_column_text, + sqlite3_column_text16, + sqlite3_column_type, + sqlite3_column_value, + sqlite3_commit_hook, + sqlite3_complete, + sqlite3_complete16, + sqlite3_create_collation, + sqlite3_create_collation16, + sqlite3_create_function, + sqlite3_create_function16, + sqlite3_create_module, + sqlite3_data_count, + sqlite3_db_handle, + sqlite3_declare_vtab, + sqlite3_enable_shared_cache, + sqlite3_errcode, + sqlite3_errmsg, + sqlite3_errmsg16, + sqlite3_exec, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_expired, +#else + 0, +#endif + sqlite3_finalize, + sqlite3_free, + sqlite3_free_table, + sqlite3_get_autocommit, + sqlite3_get_auxdata, + sqlite3_get_table, + 0, /* Was sqlite3_global_recover(), but that function is deprecated */ + sqlite3_interrupt, + sqlite3_last_insert_rowid, + sqlite3_libversion, + sqlite3_libversion_number, + sqlite3_malloc, + sqlite3_mprintf, + sqlite3_open, + sqlite3_open16, + sqlite3_prepare, + sqlite3_prepare16, + sqlite3_profile, + sqlite3_progress_handler, + sqlite3_realloc, + sqlite3_reset, + sqlite3_result_blob, + sqlite3_result_double, + sqlite3_result_error, + sqlite3_result_error16, + sqlite3_result_int, + sqlite3_result_int64, + sqlite3_result_null, + sqlite3_result_text, + sqlite3_result_text16, + sqlite3_result_text16be, + sqlite3_result_text16le, + sqlite3_result_value, + sqlite3_rollback_hook, + sqlite3_set_authorizer, + sqlite3_set_auxdata, + sqlite3_snprintf, + sqlite3_step, + sqlite3_table_column_metadata, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_thread_cleanup, +#else + 0, +#endif + sqlite3_total_changes, + sqlite3_trace, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_transfer_bindings, +#else + 0, +#endif + sqlite3_update_hook, + sqlite3_user_data, + sqlite3_value_blob, + sqlite3_value_bytes, + sqlite3_value_bytes16, + sqlite3_value_double, + sqlite3_value_int, + sqlite3_value_int64, + sqlite3_value_numeric_type, + sqlite3_value_text, + sqlite3_value_text16, + sqlite3_value_text16be, + sqlite3_value_text16le, + sqlite3_value_type, + sqlite3_vmprintf, + /* + ** The original API set ends here. All extensions can call any + ** of the APIs above provided that the pointer is not NULL. But + ** before calling APIs that follow, extension should check the + ** sqlite3_libversion_number() to make sure they are dealing with + ** a library that is new enough to support that API. + ************************************************************************* + */ + sqlite3_overload_function, + + /* + ** Added after 3.3.13 + */ + sqlite3_prepare_v2, + sqlite3_prepare16_v2, + sqlite3_clear_bindings, + + /* + ** Added for 3.4.1 + */ + sqlite3_create_module_v2, + + /* + ** Added for 3.5.0 + */ + sqlite3_bind_zeroblob, + sqlite3_blob_bytes, + sqlite3_blob_close, + sqlite3_blob_open, + sqlite3_blob_read, + sqlite3_blob_write, + sqlite3_create_collation_v2, + sqlite3_file_control, + sqlite3_memory_highwater, + sqlite3_memory_used, +#ifdef SQLITE_MUTEX_OMIT + 0, + 0, + 0, + 0, + 0, +#else + sqlite3_mutex_alloc, + sqlite3_mutex_enter, + sqlite3_mutex_free, + sqlite3_mutex_leave, + sqlite3_mutex_try, +#endif + sqlite3_open_v2, + sqlite3_release_memory, + sqlite3_result_error_nomem, + sqlite3_result_error_toobig, + sqlite3_sleep, + sqlite3_soft_heap_limit, + sqlite3_vfs_find, + sqlite3_vfs_register, + sqlite3_vfs_unregister, + + /* + ** Added for 3.5.8 + */ + sqlite3_threadsafe, + sqlite3_result_zeroblob, + sqlite3_result_error_code, + sqlite3_test_control, + sqlite3_randomness, + sqlite3_context_db_handle, + + /* + ** Added for 3.6.0 + */ + sqlite3_extended_result_codes, + sqlite3_limit, + sqlite3_next_stmt, + sqlite3_sql, + sqlite3_status, + + /* + ** Added for 3.7.4 + */ + sqlite3_backup_finish, + sqlite3_backup_init, + sqlite3_backup_pagecount, + sqlite3_backup_remaining, + sqlite3_backup_step, +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + sqlite3_compileoption_get, + sqlite3_compileoption_used, +#else + 0, + 0, +#endif + sqlite3_create_function_v2, + sqlite3_db_config, + sqlite3_db_mutex, + sqlite3_db_status, + sqlite3_extended_errcode, + sqlite3_log, + sqlite3_soft_heap_limit64, + sqlite3_sourceid, + sqlite3_stmt_status, + sqlite3_strnicmp, +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY + sqlite3_unlock_notify, +#else + 0, +#endif +#ifndef SQLITE_OMIT_WAL + sqlite3_wal_autocheckpoint, + sqlite3_wal_checkpoint, + sqlite3_wal_hook, +#else + 0, + 0, + 0, +#endif + sqlite3_blob_reopen, + sqlite3_vtab_config, + sqlite3_vtab_on_conflict, + sqlite3_close_v2, + sqlite3_db_filename, + sqlite3_db_readonly, + sqlite3_db_release_memory, + sqlite3_errstr, + sqlite3_stmt_busy, + sqlite3_stmt_readonly, + sqlite3_stricmp, + sqlite3_uri_boolean, + sqlite3_uri_int64, + sqlite3_uri_parameter, + sqlite3_vsnprintf, + sqlite3_wal_checkpoint_v2, + /* Version 3.8.7 and later */ + sqlite3_auto_extension, + sqlite3_bind_blob64, + sqlite3_bind_text64, + sqlite3_cancel_auto_extension, + sqlite3_load_extension, + sqlite3_malloc64, + sqlite3_msize, + sqlite3_realloc64, + sqlite3_reset_auto_extension, + sqlite3_result_blob64, + sqlite3_result_text64, + sqlite3_strglob, + /* Version 3.8.11 and later */ + (sqlite3_value*(*)(const sqlite3_value*))sqlite3_value_dup, + sqlite3_value_free, + sqlite3_result_zeroblob64, + sqlite3_bind_zeroblob64, + /* Version 3.9.0 and later */ + sqlite3_value_subtype, + sqlite3_result_subtype, + /* Version 3.10.0 and later */ + sqlite3_status64, + sqlite3_strlike, + sqlite3_db_cacheflush, + /* Version 3.12.0 and later */ + sqlite3_system_errno, + /* Version 3.14.0 and later */ + sqlite3_trace_v2, + sqlite3_expanded_sql, + /* Version 3.18.0 and later */ + sqlite3_set_last_insert_rowid, + /* Version 3.20.0 and later */ + sqlite3_prepare_v3, + sqlite3_prepare16_v3, + sqlite3_bind_pointer, + sqlite3_result_pointer, + sqlite3_value_pointer, + /* Version 3.22.0 and later */ + sqlite3_vtab_nochange, + sqlite3_value_nochange, + sqlite3_vtab_collation, + /* Version 3.24.0 and later */ + sqlite3_keyword_count, + sqlite3_keyword_name, + sqlite3_keyword_check, + sqlite3_str_new, + sqlite3_str_finish, + sqlite3_str_appendf, + sqlite3_str_vappendf, + sqlite3_str_append, + sqlite3_str_appendall, + sqlite3_str_appendchar, + sqlite3_str_reset, + sqlite3_str_errcode, + sqlite3_str_length, + sqlite3_str_value, + /* Version 3.25.0 and later */ + sqlite3_create_window_function, + /* Version 3.26.0 and later */ +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3_normalized_sql, +#else + 0, +#endif + /* Version 3.28.0 and later */ + sqlite3_stmt_isexplain, + sqlite3_value_frombind, + /* Version 3.30.0 and later */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3_drop_modules, +#else + 0, +#endif + /* Version 3.31.0 and later */ + sqlite3_hard_heap_limit64, + sqlite3_uri_key, + sqlite3_filename_database, + sqlite3_filename_journal, + sqlite3_filename_wal, + /* Version 3.32.0 and later */ + sqlite3_create_filename, + sqlite3_free_filename, + sqlite3_database_file_object, +}; + +/* True if x is the directory separator character +*/ +#if SQLITE_OS_WIN +# define DirSep(X) ((X)=='/'||(X)=='\\') +#else +# define DirSep(X) ((X)=='/') +#endif + +/* +** Attempt to load an SQLite extension library contained in the file +** zFile. The entry point is zProc. zProc may be 0 in which case a +** default entry point name (sqlite3_extension_init) is used. Use +** of the default name is recommended. +** +** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. +** +** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with +** error message text. The calling function should free this memory +** by calling sqlite3DbFree(db, ). +*/ +static int sqlite3LoadExtension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +){ + sqlite3_vfs *pVfs = db->pVfs; + void *handle; + sqlite3_loadext_entry xInit; + char *zErrmsg = 0; + const char *zEntry; + char *zAltEntry = 0; + void **aHandle; + u64 nMsg = 300 + sqlite3Strlen30(zFile); + int ii; + int rc; + + /* Shared library endings to try if zFile cannot be loaded as written */ + static const char *azEndings[] = { +#if SQLITE_OS_WIN + "dll" +#elif defined(__APPLE__) + "dylib" +#else + "so" +#endif + }; + + + if( pzErrMsg ) *pzErrMsg = 0; + + /* Ticket #1863. To avoid a creating security problems for older + ** applications that relink against newer versions of SQLite, the + ** ability to run load_extension is turned off by default. One + ** must call either sqlite3_enable_load_extension(db) or + ** sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0) + ** to turn on extension loading. + */ + if( (db->flags & SQLITE_LoadExtension)==0 ){ + if( pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("not authorized"); + } + return SQLITE_ERROR; + } + + zEntry = zProc ? zProc : "sqlite3_extension_init"; + + handle = sqlite3OsDlOpen(pVfs, zFile); +#if SQLITE_OS_UNIX || SQLITE_OS_WIN + for(ii=0; ii sqlite3_example_init + ** C:/lib/mathfuncs.dll ==> sqlite3_mathfuncs_init + */ + if( xInit==0 && zProc==0 ){ + int iFile, iEntry, c; + int ncFile = sqlite3Strlen30(zFile); + zAltEntry = sqlite3_malloc64(ncFile+30); + if( zAltEntry==0 ){ + sqlite3OsDlClose(pVfs, handle); + return SQLITE_NOMEM_BKPT; + } + memcpy(zAltEntry, "sqlite3_", 8); + for(iFile=ncFile-1; iFile>=0 && !DirSep(zFile[iFile]); iFile--){} + iFile++; + if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; + for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ + if( sqlite3Isalpha(c) ){ + zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c]; + } + } + memcpy(zAltEntry+iEntry, "_init", 6); + zEntry = zAltEntry; + xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry); + } + if( xInit==0 ){ + if( pzErrMsg ){ + nMsg += sqlite3Strlen30(zEntry); + *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg); + if( zErrmsg ){ + sqlite3_snprintf(nMsg, zErrmsg, + "no entry point [%s] in shared library [%s]", zEntry, zFile); + sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); + } + } + sqlite3OsDlClose(pVfs, handle); + sqlite3_free(zAltEntry); + return SQLITE_ERROR; + } + sqlite3_free(zAltEntry); + rc = xInit(db, &zErrmsg, &sqlite3Apis); + if( rc ){ + if( rc==SQLITE_OK_LOAD_PERMANENTLY ) return SQLITE_OK; + if( pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg); + } + sqlite3_free(zErrmsg); + sqlite3OsDlClose(pVfs, handle); + return SQLITE_ERROR; + } + + /* Append the new shared library handle to the db->aExtension array. */ + aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1)); + if( aHandle==0 ){ + return SQLITE_NOMEM_BKPT; + } + if( db->nExtension>0 ){ + memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension); + } + sqlite3DbFree(db, db->aExtension); + db->aExtension = aHandle; + + db->aExtension[db->nExtension++] = handle; + return SQLITE_OK; +} +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +){ + int rc; + sqlite3_mutex_enter(db->mutex); + rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Call this routine when the database connection is closing in order +** to clean up loaded extensions +*/ +SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3 *db){ + int i; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inExtension; i++){ + sqlite3OsDlClose(db->pVfs, db->aExtension[i]); + } + sqlite3DbFree(db, db->aExtension); +} + +/* +** Enable or disable extension loading. Extension loading is disabled by +** default so as not to open security holes in older applications. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ + sqlite3_mutex_enter(db->mutex); + if( onoff ){ + db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc; + }else{ + db->flags &= ~(u64)(SQLITE_LoadExtension|SQLITE_LoadExtFunc); + } + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#endif /* !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +/* +** The following object holds the list of automatically loaded +** extensions. +** +** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER +** mutex must be held while accessing this list. +*/ +typedef struct sqlite3AutoExtList sqlite3AutoExtList; +static SQLITE_WSD struct sqlite3AutoExtList { + u32 nExt; /* Number of entries in aExt[] */ + void (**aExt)(void); /* Pointers to the extension init functions */ +} sqlite3Autoext = { 0, 0 }; + +/* The "wsdAutoext" macro will resolve to the autoextension +** state vector. If writable static data is unsupported on the target, +** we have to locate the state vector at run-time. In the more common +** case where writable static data is supported, wsdStat can refer directly +** to the "sqlite3Autoext" state vector declared above. +*/ +#ifdef SQLITE_OMIT_WSD +# define wsdAutoextInit \ + sqlite3AutoExtList *x = &GLOBAL(sqlite3AutoExtList,sqlite3Autoext) +# define wsdAutoext x[0] +#else +# define wsdAutoextInit +# define wsdAutoext sqlite3Autoext +#endif + + +/* +** Register a statically linked extension that is automatically +** loaded by every new database connection. +*/ +SQLITE_API int sqlite3_auto_extension( + void (*xInit)(void) +){ + int rc = SQLITE_OK; +#ifndef SQLITE_OMIT_AUTOINIT + rc = sqlite3_initialize(); + if( rc ){ + return rc; + }else +#endif + { + u32 i; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif + wsdAutoextInit; + sqlite3_mutex_enter(mutex); + for(i=0; i=0; i--){ + if( wsdAutoext.aExt[i]==xInit ){ + wsdAutoext.nExt--; + wsdAutoext.aExt[i] = wsdAutoext.aExt[wsdAutoext.nExt]; + n++; + break; + } + } + sqlite3_mutex_leave(mutex); + return n; +} + +/* +** Reset the automatic extension loading mechanism. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize()==SQLITE_OK ) +#endif + { +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif + wsdAutoextInit; + sqlite3_mutex_enter(mutex); + sqlite3_free(wsdAutoext.aExt); + wsdAutoext.aExt = 0; + wsdAutoext.nExt = 0; + sqlite3_mutex_leave(mutex); + } +} + +/* +** Load all automatic extensions. +** +** If anything goes wrong, set an error in the database connection. +*/ +SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ + u32 i; + int go = 1; + int rc; + sqlite3_loadext_entry xInit; + + wsdAutoextInit; + if( wsdAutoext.nExt==0 ){ + /* Common case: early out without every having to acquire a mutex */ + return; + } + for(i=0; go; i++){ + char *zErrmsg; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif +#ifdef SQLITE_OMIT_LOAD_EXTENSION + const sqlite3_api_routines *pThunk = 0; +#else + const sqlite3_api_routines *pThunk = &sqlite3Apis; +#endif + sqlite3_mutex_enter(mutex); + if( i>=wsdAutoext.nExt ){ + xInit = 0; + go = 0; + }else{ + xInit = (sqlite3_loadext_entry)wsdAutoext.aExt[i]; + } + sqlite3_mutex_leave(mutex); + zErrmsg = 0; + if( xInit && (rc = xInit(db, &zErrmsg, pThunk))!=0 ){ + sqlite3ErrorWithMsg(db, rc, + "automatic extension loading failed: %s", zErrmsg); + go = 0; + } + sqlite3_free(zErrmsg); + } +} + +/************** End of loadext.c *********************************************/ +/************** Begin file pragma.c ******************************************/ +/* +** 2003 April 6 +** +** 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 code used to implement the PRAGMA command. +*/ +/* #include "sqliteInt.h" */ + +#if !defined(SQLITE_ENABLE_LOCKING_STYLE) +# if defined(__APPLE__) +# define SQLITE_ENABLE_LOCKING_STYLE 1 +# else +# define SQLITE_ENABLE_LOCKING_STYLE 0 +# endif +#endif + +/*************************************************************************** +** The "pragma.h" include file is an automatically generated file that +** that includes the PragType_XXXX macro definitions and the aPragmaName[] +** object. This ensures that the aPragmaName[] table is arranged in +** lexicographical order to facility a binary search of the pragma name. +** Do not edit pragma.h directly. Edit and rerun the script in at +** ../tool/mkpragmatab.tcl. */ +/************** Include pragma.h in the middle of pragma.c *******************/ +/************** Begin file pragma.h ******************************************/ +/* DO NOT EDIT! +** This file is automatically generated by the script at +** ../tool/mkpragmatab.tcl. To update the set of pragmas, edit +** that script and rerun it. +*/ + +/* The various pragma types */ +#define PragTyp_ACTIVATE_EXTENSIONS 0 +#define PragTyp_ANALYSIS_LIMIT 1 +#define PragTyp_HEADER_VALUE 2 +#define PragTyp_AUTO_VACUUM 3 +#define PragTyp_FLAG 4 +#define PragTyp_BUSY_TIMEOUT 5 +#define PragTyp_CACHE_SIZE 6 +#define PragTyp_CACHE_SPILL 7 +#define PragTyp_CASE_SENSITIVE_LIKE 8 +#define PragTyp_COLLATION_LIST 9 +#define PragTyp_COMPILE_OPTIONS 10 +#define PragTyp_DATA_STORE_DIRECTORY 11 +#define PragTyp_DATABASE_LIST 12 +#define PragTyp_DEFAULT_CACHE_SIZE 13 +#define PragTyp_ENCODING 14 +#define PragTyp_FOREIGN_KEY_CHECK 15 +#define PragTyp_FOREIGN_KEY_LIST 16 +#define PragTyp_FUNCTION_LIST 17 +#define PragTyp_HARD_HEAP_LIMIT 18 +#define PragTyp_INCREMENTAL_VACUUM 19 +#define PragTyp_INDEX_INFO 20 +#define PragTyp_INDEX_LIST 21 +#define PragTyp_INTEGRITY_CHECK 22 +#define PragTyp_JOURNAL_MODE 23 +#define PragTyp_JOURNAL_SIZE_LIMIT 24 +#define PragTyp_LOCK_PROXY_FILE 25 +#define PragTyp_LOCKING_MODE 26 +#define PragTyp_PAGE_COUNT 27 +#define PragTyp_MMAP_SIZE 28 +#define PragTyp_MODULE_LIST 29 +#define PragTyp_OPTIMIZE 30 +#define PragTyp_PAGE_SIZE 31 +#define PragTyp_PRAGMA_LIST 32 +#define PragTyp_SECURE_DELETE 33 +#define PragTyp_SHRINK_MEMORY 34 +#define PragTyp_SOFT_HEAP_LIMIT 35 +#define PragTyp_SYNCHRONOUS 36 +#define PragTyp_TABLE_INFO 37 +#define PragTyp_TEMP_STORE 38 +#define PragTyp_TEMP_STORE_DIRECTORY 39 +#define PragTyp_THREADS 40 +#define PragTyp_WAL_AUTOCHECKPOINT 41 +#define PragTyp_WAL_CHECKPOINT 42 +#define PragTyp_LOCK_STATUS 43 +#define PragTyp_STATS 44 + +/* Property flags associated with various pragma. */ +#define PragFlg_NeedSchema 0x01 /* Force schema load before running */ +#define PragFlg_NoColumns 0x02 /* OP_ResultRow called with zero columns */ +#define PragFlg_NoColumns1 0x04 /* zero columns if RHS argument is present */ +#define PragFlg_ReadOnly 0x08 /* Read-only HEADER_VALUE */ +#define PragFlg_Result0 0x10 /* Acts as query when no argument */ +#define PragFlg_Result1 0x20 /* Acts as query when has one argument */ +#define PragFlg_SchemaOpt 0x40 /* Schema restricts name search if present */ +#define PragFlg_SchemaReq 0x80 /* Schema required - "main" is default */ + +/* Names of columns for pragmas that return multi-column result +** or that return single-column results where the name of the +** result column is different from the name of the pragma +*/ +static const char *const pragCName[] = { + /* 0 */ "id", /* Used by: foreign_key_list */ + /* 1 */ "seq", + /* 2 */ "table", + /* 3 */ "from", + /* 4 */ "to", + /* 5 */ "on_update", + /* 6 */ "on_delete", + /* 7 */ "match", + /* 8 */ "cid", /* Used by: table_xinfo */ + /* 9 */ "name", + /* 10 */ "type", + /* 11 */ "notnull", + /* 12 */ "dflt_value", + /* 13 */ "pk", + /* 14 */ "hidden", + /* table_info reuses 8 */ + /* 15 */ "seqno", /* Used by: index_xinfo */ + /* 16 */ "cid", + /* 17 */ "name", + /* 18 */ "desc", + /* 19 */ "coll", + /* 20 */ "key", + /* 21 */ "name", /* Used by: function_list */ + /* 22 */ "builtin", + /* 23 */ "type", + /* 24 */ "enc", + /* 25 */ "narg", + /* 26 */ "flags", + /* 27 */ "tbl", /* Used by: stats */ + /* 28 */ "idx", + /* 29 */ "wdth", + /* 30 */ "hght", + /* 31 */ "flgs", + /* 32 */ "seq", /* Used by: index_list */ + /* 33 */ "name", + /* 34 */ "unique", + /* 35 */ "origin", + /* 36 */ "partial", + /* 37 */ "table", /* Used by: foreign_key_check */ + /* 38 */ "rowid", + /* 39 */ "parent", + /* 40 */ "fkid", + /* index_info reuses 15 */ + /* 41 */ "seq", /* Used by: database_list */ + /* 42 */ "name", + /* 43 */ "file", + /* 44 */ "busy", /* Used by: wal_checkpoint */ + /* 45 */ "log", + /* 46 */ "checkpointed", + /* collation_list reuses 32 */ + /* 47 */ "database", /* Used by: lock_status */ + /* 48 */ "status", + /* 49 */ "cache_size", /* Used by: default_cache_size */ + /* module_list pragma_list reuses 9 */ + /* 50 */ "timeout", /* Used by: busy_timeout */ +}; + +/* Definitions of all built-in pragmas */ +typedef struct PragmaName { + const char *const zName; /* Name of pragma */ + u8 ePragTyp; /* PragTyp_XXX value */ + u8 mPragFlg; /* Zero or more PragFlg_XXX values */ + u8 iPragCName; /* Start of column names in pragCName[] */ + u8 nPragCName; /* Num of col names. 0 means use pragma name */ + u64 iArg; /* Extra argument */ +} PragmaName; +static const PragmaName aPragmaName[] = { +#if defined(SQLITE_ENABLE_CEROD) + {/* zName: */ "activate_extensions", + /* ePragTyp: */ PragTyp_ACTIVATE_EXTENSIONS, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif + {/* zName: */ "analysis_limit", + /* ePragTyp: */ PragTyp_ANALYSIS_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + {/* zName: */ "application_id", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_NoColumns1|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_APPLICATION_ID }, +#endif +#if !defined(SQLITE_OMIT_AUTOVACUUM) + {/* zName: */ "auto_vacuum", + /* ePragTyp: */ PragTyp_AUTO_VACUUM, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_AUTOMATIC_INDEX) + {/* zName: */ "automatic_index", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_AutoIndex }, +#endif +#endif + {/* zName: */ "busy_timeout", + /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 50, 1, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "cache_size", + /* ePragTyp: */ PragTyp_CACHE_SIZE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "cache_spill", + /* ePragTyp: */ PragTyp_CACHE_SPILL, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA) + {/* zName: */ "case_sensitive_like", + /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, + /* ePragFlg: */ PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif + {/* zName: */ "cell_size_check", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CellSizeCk }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "checkpoint_fullfsync", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CkptFullFSync }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + {/* zName: */ "collation_list", + /* ePragTyp: */ PragTyp_COLLATION_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 32, 2, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS) + {/* zName: */ "compile_options", + /* ePragTyp: */ PragTyp_COMPILE_OPTIONS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "count_changes", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CountRows }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN + {/* zName: */ "data_store_directory", + /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, + /* ePragFlg: */ PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + {/* zName: */ "data_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_ReadOnly|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_DATA_VERSION }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + {/* zName: */ "database_list", + /* ePragTyp: */ PragTyp_DATABASE_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, + /* ColNames: */ 41, 3, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) + {/* zName: */ "default_cache_size", + /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 49, 1, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + {/* zName: */ "defer_foreign_keys", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_DeferFKs }, +#endif +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "empty_result_callbacks", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_NullCallback }, +#endif +#if !defined(SQLITE_OMIT_UTF16) + {/* zName: */ "encoding", + /* ePragTyp: */ PragTyp_ENCODING, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + {/* zName: */ "foreign_key_check", + /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, + /* ColNames: */ 37, 4, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FOREIGN_KEY) + {/* zName: */ "foreign_key_list", + /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 0, 8, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + {/* zName: */ "foreign_keys", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ForeignKeys }, +#endif +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + {/* zName: */ "freelist_count", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_ReadOnly|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_FREE_PAGE_COUNT }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "full_column_names", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_FullColNames }, + {/* zName: */ "fullfsync", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_FullFSync }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) + {/* zName: */ "function_list", + /* ePragTyp: */ PragTyp_FUNCTION_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 21, 6, + /* iArg: */ 0 }, +#endif +#endif + {/* zName: */ "hard_heap_limit", + /* ePragTyp: */ PragTyp_HARD_HEAP_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_CHECK) + {/* zName: */ "ignore_check_constraints", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_IgnoreChecks }, +#endif +#endif +#if !defined(SQLITE_OMIT_AUTOVACUUM) + {/* zName: */ "incremental_vacuum", + /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + {/* zName: */ "index_info", + /* ePragTyp: */ PragTyp_INDEX_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 15, 3, + /* iArg: */ 0 }, + {/* zName: */ "index_list", + /* ePragTyp: */ PragTyp_INDEX_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 32, 5, + /* iArg: */ 0 }, + {/* zName: */ "index_xinfo", + /* ePragTyp: */ PragTyp_INDEX_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 15, 6, + /* iArg: */ 1 }, +#endif +#if !defined(SQLITE_OMIT_INTEGRITY_CHECK) + {/* zName: */ "integrity_check", + /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "journal_mode", + /* ePragTyp: */ PragTyp_JOURNAL_MODE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "journal_size_limit", + /* ePragTyp: */ PragTyp_JOURNAL_SIZE_LIMIT, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "legacy_alter_table", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_LegacyAlter }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE + {/* zName: */ "lock_proxy_file", + /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, + /* ePragFlg: */ PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + {/* zName: */ "lock_status", + /* ePragTyp: */ PragTyp_LOCK_STATUS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 47, 2, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "locking_mode", + /* ePragTyp: */ PragTyp_LOCKING_MODE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "max_page_count", + /* ePragTyp: */ PragTyp_PAGE_COUNT, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "mmap_size", + /* ePragTyp: */ PragTyp_MMAP_SIZE, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) +#if !defined(SQLITE_OMIT_VIRTUALTABLE) +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) + {/* zName: */ "module_list", + /* ePragTyp: */ PragTyp_MODULE_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 9, 1, + /* iArg: */ 0 }, +#endif +#endif +#endif + {/* zName: */ "optimize", + /* ePragTyp: */ PragTyp_OPTIMIZE, + /* ePragFlg: */ PragFlg_Result1|PragFlg_NeedSchema, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "page_count", + /* ePragTyp: */ PragTyp_PAGE_COUNT, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "page_size", + /* ePragTyp: */ PragTyp_PAGE_SIZE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) + {/* zName: */ "parser_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ParserTrace }, +#endif +#endif +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) + {/* zName: */ "pragma_list", + /* ePragTyp: */ PragTyp_PRAGMA_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 9, 1, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "query_only", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_QueryOnly }, +#endif +#if !defined(SQLITE_OMIT_INTEGRITY_CHECK) + {/* zName: */ "quick_check", + /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "read_uncommitted", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ReadUncommit }, + {/* zName: */ "recursive_triggers", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_RecTriggers }, + {/* zName: */ "reverse_unordered_selects", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ReverseOrder }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + {/* zName: */ "schema_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_NoColumns1|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_SCHEMA_VERSION }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "secure_delete", + /* ePragTyp: */ PragTyp_SECURE_DELETE, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "short_column_names", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ShortColNames }, +#endif + {/* zName: */ "shrink_memory", + /* ePragTyp: */ PragTyp_SHRINK_MEMORY, + /* ePragFlg: */ PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "soft_heap_limit", + /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) + {/* zName: */ "sql_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_SqlTrace }, +#endif +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && defined(SQLITE_DEBUG) + {/* zName: */ "stats", + /* ePragTyp: */ PragTyp_STATS, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 27, 5, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "synchronous", + /* ePragTyp: */ PragTyp_SYNCHRONOUS, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + {/* zName: */ "table_info", + /* ePragTyp: */ PragTyp_TABLE_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 8, 6, + /* iArg: */ 0 }, + {/* zName: */ "table_xinfo", + /* ePragTyp: */ PragTyp_TABLE_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 8, 7, + /* iArg: */ 1 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "temp_store", + /* ePragTyp: */ PragTyp_TEMP_STORE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "temp_store_directory", + /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, + /* ePragFlg: */ PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif + {/* zName: */ "threads", + /* ePragTyp: */ PragTyp_THREADS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "trusted_schema", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_TrustedSchema }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + {/* zName: */ "user_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_NoColumns1|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_USER_VERSION }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) + {/* zName: */ "vdbe_addoptrace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeAddopTrace }, + {/* zName: */ "vdbe_debug", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace }, + {/* zName: */ "vdbe_eqp", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeEQP }, + {/* zName: */ "vdbe_listing", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeListing }, + {/* zName: */ "vdbe_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeTrace }, +#endif +#endif +#if !defined(SQLITE_OMIT_WAL) + {/* zName: */ "wal_autocheckpoint", + /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "wal_checkpoint", + /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, + /* ePragFlg: */ PragFlg_NeedSchema, + /* ColNames: */ 44, 3, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "writable_schema", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, +#endif +}; +/* Number of pragmas: 67 on by default, 77 total. */ + +/************** End of pragma.h **********************************************/ +/************** Continuing where we left off in pragma.c *********************/ + +/* +** Interpret the given string as a safety level. Return 0 for OFF, +** 1 for ON or NORMAL, 2 for FULL, and 3 for EXTRA. Return 1 for an empty or +** unrecognized string argument. The FULL and EXTRA option is disallowed +** if the omitFull parameter it 1. +** +** Note that the values returned are one less that the values that +** should be passed into sqlite3BtreeSetSafetyLevel(). The is done +** to support legacy SQL code. The safety level used to be boolean +** and older scripts may have used numbers 0 for OFF and 1 for ON. +*/ +static u8 getSafetyLevel(const char *z, int omitFull, u8 dflt){ + /* 123456789 123456789 123 */ + static const char zText[] = "onoffalseyestruextrafull"; + static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 15, 20}; + static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 5, 4}; + static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 3, 2}; + /* on no off false yes true extra full */ + int i, n; + if( sqlite3Isdigit(*z) ){ + return (u8)sqlite3Atoi(z); + } + n = sqlite3Strlen30(z); + for(i=0; i=0&&i<=2)?i:0); +} +#endif /* ifndef SQLITE_OMIT_AUTOVACUUM */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** Interpret the given string as a temp db location. Return 1 for file +** backed temporary databases, 2 for the Red-Black tree in memory database +** and 0 to use the compile-time default. +*/ +static int getTempStore(const char *z){ + if( z[0]>='0' && z[0]<='2' ){ + return z[0] - '0'; + }else if( sqlite3StrICmp(z, "file")==0 ){ + return 1; + }else if( sqlite3StrICmp(z, "memory")==0 ){ + return 2; + }else{ + return 0; + } +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** Invalidate temp storage, either when the temp storage is changed +** from default, or when 'file' and the temp_store_directory has changed +*/ +static int invalidateTempStorage(Parse *pParse){ + sqlite3 *db = pParse->db; + if( db->aDb[1].pBt!=0 ){ + if( !db->autoCommit || sqlite3BtreeIsInReadTrans(db->aDb[1].pBt) ){ + sqlite3ErrorMsg(pParse, "temporary storage cannot be changed " + "from within a transaction"); + return SQLITE_ERROR; + } + sqlite3BtreeClose(db->aDb[1].pBt); + db->aDb[1].pBt = 0; + sqlite3ResetAllSchemasOfConnection(db); + } + return SQLITE_OK; +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** If the TEMP database is open, close it and mark the database schema +** as needing reloading. This must be done when using the SQLITE_TEMP_STORE +** or DEFAULT_TEMP_STORE pragmas. +*/ +static int changeTempStorage(Parse *pParse, const char *zStorageType){ + int ts = getTempStore(zStorageType); + sqlite3 *db = pParse->db; + if( db->temp_store==ts ) return SQLITE_OK; + if( invalidateTempStorage( pParse ) != SQLITE_OK ){ + return SQLITE_ERROR; + } + db->temp_store = (u8)ts; + return SQLITE_OK; +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +/* +** Set result column names for a pragma. +*/ +static void setPragmaResultColumnNames( + Vdbe *v, /* The query under construction */ + const PragmaName *pPragma /* The pragma */ +){ + u8 n = pPragma->nPragCName; + sqlite3VdbeSetNumCols(v, n==0 ? 1 : n); + if( n==0 ){ + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, pPragma->zName, SQLITE_STATIC); + }else{ + int i, j; + for(i=0, j=pPragma->iPragCName; iautoCommit ){ + Db *pDb = db->aDb; + int n = db->nDb; + assert( SQLITE_FullFSync==PAGER_FULLFSYNC ); + assert( SQLITE_CkptFullFSync==PAGER_CKPT_FULLFSYNC ); + assert( SQLITE_CacheSpill==PAGER_CACHESPILL ); + assert( (PAGER_FULLFSYNC | PAGER_CKPT_FULLFSYNC | PAGER_CACHESPILL) + == PAGER_FLAGS_MASK ); + assert( (pDb->safety_level & PAGER_SYNCHRONOUS_MASK)==pDb->safety_level ); + while( (n--) > 0 ){ + if( pDb->pBt ){ + sqlite3BtreeSetPagerFlags(pDb->pBt, + pDb->safety_level | (db->flags & PAGER_FLAGS_MASK) ); + } + pDb++; + } + } +} +#else +# define setAllPagerFlags(X) /* no-op */ +#endif + + +/* +** Return a human-readable name for a constraint resolution action. +*/ +#ifndef SQLITE_OMIT_FOREIGN_KEY +static const char *actionName(u8 action){ + const char *zName; + switch( action ){ + case OE_SetNull: zName = "SET NULL"; break; + case OE_SetDflt: zName = "SET DEFAULT"; break; + case OE_Cascade: zName = "CASCADE"; break; + case OE_Restrict: zName = "RESTRICT"; break; + default: zName = "NO ACTION"; + assert( action==OE_None ); break; + } + return zName; +} +#endif + + +/* +** Parameter eMode must be one of the PAGER_JOURNALMODE_XXX constants +** defined in pager.h. This function returns the associated lowercase +** journal-mode name. +*/ +SQLITE_PRIVATE const char *sqlite3JournalModename(int eMode){ + static char * const azModeName[] = { + "delete", "persist", "off", "truncate", "memory" +#ifndef SQLITE_OMIT_WAL + , "wal" +#endif + }; + assert( PAGER_JOURNALMODE_DELETE==0 ); + assert( PAGER_JOURNALMODE_PERSIST==1 ); + assert( PAGER_JOURNALMODE_OFF==2 ); + assert( PAGER_JOURNALMODE_TRUNCATE==3 ); + assert( PAGER_JOURNALMODE_MEMORY==4 ); + assert( PAGER_JOURNALMODE_WAL==5 ); + assert( eMode>=0 && eMode<=ArraySize(azModeName) ); + + if( eMode==ArraySize(azModeName) ) return 0; + return azModeName[eMode]; +} + +/* +** Locate a pragma in the aPragmaName[] array. +*/ +static const PragmaName *pragmaLocate(const char *zName){ + int upr, lwr, mid = 0, rc; + lwr = 0; + upr = ArraySize(aPragmaName)-1; + while( lwr<=upr ){ + mid = (lwr+upr)/2; + rc = sqlite3_stricmp(zName, aPragmaName[mid].zName); + if( rc==0 ) break; + if( rc<0 ){ + upr = mid - 1; + }else{ + lwr = mid + 1; + } + } + return lwr>upr ? 0 : &aPragmaName[mid]; +} + +/* +** Create zero or more entries in the output for the SQL functions +** defined by FuncDef p. +*/ +static void pragmaFunclistLine( + Vdbe *v, /* The prepared statement being created */ + FuncDef *p, /* A particular function definition */ + int isBuiltin, /* True if this is a built-in function */ + int showInternFuncs /* True if showing internal functions */ +){ + for(; p; p=p->pNext){ + const char *zType; + static const u32 mask = + SQLITE_DETERMINISTIC | + SQLITE_DIRECTONLY | + SQLITE_SUBTYPE | + SQLITE_INNOCUOUS | + SQLITE_FUNC_INTERNAL + ; + static const char *azEnc[] = { 0, "utf8", "utf16le", "utf16be" }; + + assert( SQLITE_FUNC_ENCMASK==0x3 ); + assert( strcmp(azEnc[SQLITE_UTF8],"utf8")==0 ); + assert( strcmp(azEnc[SQLITE_UTF16LE],"utf16le")==0 ); + assert( strcmp(azEnc[SQLITE_UTF16BE],"utf16be")==0 ); + + if( p->xSFunc==0 ) continue; + if( (p->funcFlags & SQLITE_FUNC_INTERNAL)!=0 + && showInternFuncs==0 + ){ + continue; + } + if( p->xValue!=0 ){ + zType = "w"; + }else if( p->xFinalize!=0 ){ + zType = "a"; + }else{ + zType = "s"; + } + sqlite3VdbeMultiLoad(v, 1, "sissii", + p->zName, isBuiltin, + zType, azEnc[p->funcFlags&SQLITE_FUNC_ENCMASK], + p->nArg, + (p->funcFlags & mask) ^ SQLITE_INNOCUOUS + ); + } +} + + +/* +** Helper subroutine for PRAGMA integrity_check: +** +** Generate code to output a single-column result row with a value of the +** string held in register 3. Decrement the result count in register 1 +** and halt if the maximum number of result rows have been issued. +*/ +static int integrityCheckResultRow(Vdbe *v){ + int addr; + sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); + addr = sqlite3VdbeAddOp3(v, OP_IfPos, 1, sqlite3VdbeCurrentAddr(v)+2, 1); + VdbeCoverage(v); + sqlite3VdbeAddOp0(v, OP_Halt); + return addr; +} + +/* +** Process a pragma statement. +** +** Pragmas are of this form: +** +** PRAGMA [schema.]id [= value] +** +** The identifier might also be a string. The value is a string, and +** identifier, or a number. If minusFlag is true, then the value is +** a number that was preceded by a minus sign. +** +** If the left side is "database.id" then pId1 is the database name +** and pId2 is the id. If the left side is just "id" then pId1 is the +** id and pId2 is any empty string. +*/ +SQLITE_PRIVATE void sqlite3Pragma( + Parse *pParse, + Token *pId1, /* First part of [schema.]id field */ + Token *pId2, /* Second part of [schema.]id field, or NULL */ + Token *pValue, /* Token for , or NULL */ + int minusFlag /* True if a '-' sign preceded */ +){ + char *zLeft = 0; /* Nul-terminated UTF-8 string */ + char *zRight = 0; /* Nul-terminated UTF-8 string , or NULL */ + const char *zDb = 0; /* The database name */ + Token *pId; /* Pointer to token */ + char *aFcntl[4]; /* Argument to SQLITE_FCNTL_PRAGMA */ + int iDb; /* Database index for */ + int rc; /* return value form SQLITE_FCNTL_PRAGMA */ + sqlite3 *db = pParse->db; /* The database connection */ + Db *pDb; /* The specific database being pragmaed */ + Vdbe *v = sqlite3GetVdbe(pParse); /* Prepared statement */ + const PragmaName *pPragma; /* The pragma */ + + if( v==0 ) return; + sqlite3VdbeRunOnlyOnce(v); + pParse->nMem = 2; + + /* Interpret the [schema.] part of the pragma statement. iDb is the + ** index of the database this pragma is being applied to in db.aDb[]. */ + iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId); + if( iDb<0 ) return; + pDb = &db->aDb[iDb]; + + /* If the temp database has been explicitly named as part of the + ** pragma, make sure it is open. + */ + if( iDb==1 && sqlite3OpenTempDatabase(pParse) ){ + return; + } + + zLeft = sqlite3NameFromToken(db, pId); + if( !zLeft ) return; + if( minusFlag ){ + zRight = sqlite3MPrintf(db, "-%T", pValue); + }else{ + zRight = sqlite3NameFromToken(db, pValue); + } + + assert( pId2 ); + zDb = pId2->n>0 ? pDb->zDbSName : 0; + if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){ + goto pragma_out; + } + + /* Send an SQLITE_FCNTL_PRAGMA file-control to the underlying VFS + ** connection. If it returns SQLITE_OK, then assume that the VFS + ** handled the pragma and generate a no-op prepared statement. + ** + ** IMPLEMENTATION-OF: R-12238-55120 Whenever a PRAGMA statement is parsed, + ** an SQLITE_FCNTL_PRAGMA file control is sent to the open sqlite3_file + ** object corresponding to the database file to which the pragma + ** statement refers. + ** + ** IMPLEMENTATION-OF: R-29875-31678 The argument to the SQLITE_FCNTL_PRAGMA + ** file control is an array of pointers to strings (char**) in which the + ** second element of the array is the name of the pragma and the third + ** element is the argument to the pragma or NULL if the pragma has no + ** argument. + */ + aFcntl[0] = 0; + aFcntl[1] = zLeft; + aFcntl[2] = zRight; + aFcntl[3] = 0; + db->busyHandler.nBusy = 0; + rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl); + if( rc==SQLITE_OK ){ + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, aFcntl[0], SQLITE_TRANSIENT); + returnSingleText(v, aFcntl[0]); + sqlite3_free(aFcntl[0]); + goto pragma_out; + } + if( rc!=SQLITE_NOTFOUND ){ + if( aFcntl[0] ){ + sqlite3ErrorMsg(pParse, "%s", aFcntl[0]); + sqlite3_free(aFcntl[0]); + } + pParse->nErr++; + pParse->rc = rc; + goto pragma_out; + } + + /* Locate the pragma in the lookup table */ + pPragma = pragmaLocate(zLeft); + if( pPragma==0 ) goto pragma_out; + + /* Make sure the database schema is loaded if the pragma requires that */ + if( (pPragma->mPragFlg & PragFlg_NeedSchema)!=0 ){ + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + } + + /* Register the result column names for pragmas that return results */ + if( (pPragma->mPragFlg & PragFlg_NoColumns)==0 + && ((pPragma->mPragFlg & PragFlg_NoColumns1)==0 || zRight==0) + ){ + setPragmaResultColumnNames(v, pPragma); + } + + /* Jump to the appropriate pragma handler */ + switch( pPragma->ePragTyp ){ + +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) + /* + ** PRAGMA [schema.]default_cache_size + ** PRAGMA [schema.]default_cache_size=N + ** + ** The first form reports the current persistent setting for the + ** page cache size. The value returned is the maximum number of + ** pages in the page cache. The second form sets both the current + ** page cache size value and the persistent page cache size value + ** stored in the database file. + ** + ** Older versions of SQLite would set the default cache size to a + ** negative number to indicate synchronous=OFF. These days, synchronous + ** is always on by default regardless of the sign of the default cache + ** size. But continue to take the absolute value of the default cache + ** size of historical compatibility. + */ + case PragTyp_DEFAULT_CACHE_SIZE: { + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList getCacheSize[] = { + { OP_Transaction, 0, 0, 0}, /* 0 */ + { OP_ReadCookie, 0, 1, BTREE_DEFAULT_CACHE_SIZE}, /* 1 */ + { OP_IfPos, 1, 8, 0}, + { OP_Integer, 0, 2, 0}, + { OP_Subtract, 1, 2, 1}, + { OP_IfPos, 1, 8, 0}, + { OP_Integer, 0, 1, 0}, /* 6 */ + { OP_Noop, 0, 0, 0}, + { OP_ResultRow, 1, 1, 0}, + }; + VdbeOp *aOp; + sqlite3VdbeUsesBtree(v, iDb); + if( !zRight ){ + pParse->nMem += 2; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(getCacheSize)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize, iLn); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[6].p1 = SQLITE_DEFAULT_CACHE_SIZE; + }else{ + int size = sqlite3AbsInt32(sqlite3Atoi(zRight)); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, size); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pDb->pSchema->cache_size = size; + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + break; + } +#endif /* !SQLITE_OMIT_PAGER_PRAGMAS && !SQLITE_OMIT_DEPRECATED */ + +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + /* + ** PRAGMA [schema.]page_size + ** PRAGMA [schema.]page_size=N + ** + ** The first form reports the current setting for the + ** database page size in bytes. The second form sets the + ** database page size value. The value can only be set if + ** the database has not yet been created. + */ + case PragTyp_PAGE_SIZE: { + Btree *pBt = pDb->pBt; + assert( pBt!=0 ); + if( !zRight ){ + int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; + returnSingleInt(v, size); + }else{ + /* Malloc may fail when setting the page-size, as there is an internal + ** buffer that the pager module resizes using sqlite3_realloc(). + */ + db->nextPagesize = sqlite3Atoi(zRight); + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize,0,0) ){ + sqlite3OomFault(db); + } + } + break; + } + + /* + ** PRAGMA [schema.]secure_delete + ** PRAGMA [schema.]secure_delete=ON/OFF/FAST + ** + ** The first form reports the current setting for the + ** secure_delete flag. The second form changes the secure_delete + ** flag setting and reports the new value. + */ + case PragTyp_SECURE_DELETE: { + Btree *pBt = pDb->pBt; + int b = -1; + assert( pBt!=0 ); + if( zRight ){ + if( sqlite3_stricmp(zRight, "fast")==0 ){ + b = 2; + }else{ + b = sqlite3GetBoolean(zRight, 0); + } + } + if( pId2->n==0 && b>=0 ){ + int ii; + for(ii=0; iinDb; ii++){ + sqlite3BtreeSecureDelete(db->aDb[ii].pBt, b); + } + } + b = sqlite3BtreeSecureDelete(pBt, b); + returnSingleInt(v, b); + break; + } + + /* + ** PRAGMA [schema.]max_page_count + ** PRAGMA [schema.]max_page_count=N + ** + ** The first form reports the current setting for the + ** maximum number of pages in the database file. The + ** second form attempts to change this setting. Both + ** forms return the current setting. + ** + ** The absolute value of N is used. This is undocumented and might + ** change. The only purpose is to provide an easy way to test + ** the sqlite3AbsInt32() function. + ** + ** PRAGMA [schema.]page_count + ** + ** Return the number of pages in the specified database. + */ + case PragTyp_PAGE_COUNT: { + int iReg; + sqlite3CodeVerifySchema(pParse, iDb); + iReg = ++pParse->nMem; + if( sqlite3Tolower(zLeft[0])=='p' ){ + sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg); + }else{ + sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, + sqlite3AbsInt32(sqlite3Atoi(zRight))); + } + sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); + break; + } + + /* + ** PRAGMA [schema.]locking_mode + ** PRAGMA [schema.]locking_mode = (normal|exclusive) + */ + case PragTyp_LOCKING_MODE: { + const char *zRet = "normal"; + int eMode = getLockingMode(zRight); + + if( pId2->n==0 && eMode==PAGER_LOCKINGMODE_QUERY ){ + /* Simple "PRAGMA locking_mode;" statement. This is a query for + ** the current default locking mode (which may be different to + ** the locking-mode of the main database). + */ + eMode = db->dfltLockMode; + }else{ + Pager *pPager; + if( pId2->n==0 ){ + /* This indicates that no database name was specified as part + ** of the PRAGMA command. In this case the locking-mode must be + ** set on all attached databases, as well as the main db file. + ** + ** Also, the sqlite3.dfltLockMode variable is set so that + ** any subsequently attached databases also use the specified + ** locking mode. + */ + int ii; + assert(pDb==&db->aDb[0]); + for(ii=2; iinDb; ii++){ + pPager = sqlite3BtreePager(db->aDb[ii].pBt); + sqlite3PagerLockingMode(pPager, eMode); + } + db->dfltLockMode = (u8)eMode; + } + pPager = sqlite3BtreePager(pDb->pBt); + eMode = sqlite3PagerLockingMode(pPager, eMode); + } + + assert( eMode==PAGER_LOCKINGMODE_NORMAL + || eMode==PAGER_LOCKINGMODE_EXCLUSIVE ); + if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){ + zRet = "exclusive"; + } + returnSingleText(v, zRet); + break; + } + + /* + ** PRAGMA [schema.]journal_mode + ** PRAGMA [schema.]journal_mode = + ** (delete|persist|off|truncate|memory|wal|off) + */ + case PragTyp_JOURNAL_MODE: { + int eMode; /* One of the PAGER_JOURNALMODE_XXX symbols */ + int ii; /* Loop counter */ + + if( zRight==0 ){ + /* If there is no "=MODE" part of the pragma, do a query for the + ** current mode */ + eMode = PAGER_JOURNALMODE_QUERY; + }else{ + const char *zMode; + int n = sqlite3Strlen30(zRight); + for(eMode=0; (zMode = sqlite3JournalModename(eMode))!=0; eMode++){ + if( sqlite3StrNICmp(zRight, zMode, n)==0 ) break; + } + if( !zMode ){ + /* If the "=MODE" part does not match any known journal mode, + ** then do a query */ + eMode = PAGER_JOURNALMODE_QUERY; + } + if( eMode==PAGER_JOURNALMODE_OFF && (db->flags & SQLITE_Defensive)!=0 ){ + /* Do not allow journal-mode "OFF" in defensive since the database + ** can become corrupted using ordinary SQL when the journal is off */ + eMode = PAGER_JOURNALMODE_QUERY; + } + } + if( eMode==PAGER_JOURNALMODE_QUERY && pId2->n==0 ){ + /* Convert "PRAGMA journal_mode" into "PRAGMA main.journal_mode" */ + iDb = 0; + pId2->n = 1; + } + for(ii=db->nDb-1; ii>=0; ii--){ + if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){ + sqlite3VdbeUsesBtree(v, ii); + sqlite3VdbeAddOp3(v, OP_JournalMode, ii, 1, eMode); + } + } + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + break; + } + + /* + ** PRAGMA [schema.]journal_size_limit + ** PRAGMA [schema.]journal_size_limit=N + ** + ** Get or set the size limit on rollback journal files. + */ + case PragTyp_JOURNAL_SIZE_LIMIT: { + Pager *pPager = sqlite3BtreePager(pDb->pBt); + i64 iLimit = -2; + if( zRight ){ + sqlite3DecOrHexToI64(zRight, &iLimit); + if( iLimit<-1 ) iLimit = -1; + } + iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit); + returnSingleInt(v, iLimit); + break; + } + +#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ + + /* + ** PRAGMA [schema.]auto_vacuum + ** PRAGMA [schema.]auto_vacuum=N + ** + ** Get or set the value of the database 'auto-vacuum' parameter. + ** The value is one of: 0 NONE 1 FULL 2 INCREMENTAL + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + case PragTyp_AUTO_VACUUM: { + Btree *pBt = pDb->pBt; + assert( pBt!=0 ); + if( !zRight ){ + returnSingleInt(v, sqlite3BtreeGetAutoVacuum(pBt)); + }else{ + int eAuto = getAutoVacuum(zRight); + assert( eAuto>=0 && eAuto<=2 ); + db->nextAutovac = (u8)eAuto; + /* Call SetAutoVacuum() to set initialize the internal auto and + ** incr-vacuum flags. This is required in case this connection + ** creates the database file. It is important that it is created + ** as an auto-vacuum capable db. + */ + rc = sqlite3BtreeSetAutoVacuum(pBt, eAuto); + if( rc==SQLITE_OK && (eAuto==1 || eAuto==2) ){ + /* When setting the auto_vacuum mode to either "full" or + ** "incremental", write the value of meta[6] in the database + ** file. Before writing to meta[6], check that meta[3] indicates + ** that this really is an auto-vacuum capable database. + */ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList setMeta6[] = { + { OP_Transaction, 0, 1, 0}, /* 0 */ + { OP_ReadCookie, 0, 1, BTREE_LARGEST_ROOT_PAGE}, + { OP_If, 1, 0, 0}, /* 2 */ + { OP_Halt, SQLITE_OK, OE_Abort, 0}, /* 3 */ + { OP_SetCookie, 0, BTREE_INCR_VACUUM, 0}, /* 4 */ + }; + VdbeOp *aOp; + int iAddr = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(setMeta6)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6, iLn); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[2].p2 = iAddr+4; + aOp[4].p1 = iDb; + aOp[4].p3 = eAuto - 1; + sqlite3VdbeUsesBtree(v, iDb); + } + } + break; + } +#endif + + /* + ** PRAGMA [schema.]incremental_vacuum(N) + ** + ** Do N steps of incremental vacuuming on a database. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + case PragTyp_INCREMENTAL_VACUUM: { + int iLimit, addr; + if( zRight==0 || !sqlite3GetInt32(zRight, &iLimit) || iLimit<=0 ){ + iLimit = 0x7fffffff; + } + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3VdbeAddOp2(v, OP_Integer, iLimit, 1); + addr = sqlite3VdbeAddOp1(v, OP_IncrVacuum, iDb); VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_ResultRow, 1); + sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); + sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr); + break; + } +#endif + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS + /* + ** PRAGMA [schema.]cache_size + ** PRAGMA [schema.]cache_size=N + ** + ** The first form reports the current local setting for the + ** page cache size. The second form sets the local + ** page cache size value. If N is positive then that is the + ** number of pages in the cache. If N is negative, then the + ** number of pages is adjusted so that the cache uses -N kibibytes + ** of memory. + */ + case PragTyp_CACHE_SIZE: { + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( !zRight ){ + returnSingleInt(v, pDb->pSchema->cache_size); + }else{ + int size = sqlite3Atoi(zRight); + pDb->pSchema->cache_size = size; + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + break; + } + + /* + ** PRAGMA [schema.]cache_spill + ** PRAGMA cache_spill=BOOLEAN + ** PRAGMA [schema.]cache_spill=N + ** + ** The first form reports the current local setting for the + ** page cache spill size. The second form turns cache spill on + ** or off. When turnning cache spill on, the size is set to the + ** current cache_size. The third form sets a spill size that + ** may be different form the cache size. + ** If N is positive then that is the + ** number of pages in the cache. If N is negative, then the + ** number of pages is adjusted so that the cache uses -N kibibytes + ** of memory. + ** + ** If the number of cache_spill pages is less then the number of + ** cache_size pages, no spilling occurs until the page count exceeds + ** the number of cache_size pages. + ** + ** The cache_spill=BOOLEAN setting applies to all attached schemas, + ** not just the schema specified. + */ + case PragTyp_CACHE_SPILL: { + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( !zRight ){ + returnSingleInt(v, + (db->flags & SQLITE_CacheSpill)==0 ? 0 : + sqlite3BtreeSetSpillSize(pDb->pBt,0)); + }else{ + int size = 1; + if( sqlite3GetInt32(zRight, &size) ){ + sqlite3BtreeSetSpillSize(pDb->pBt, size); + } + if( sqlite3GetBoolean(zRight, size!=0) ){ + db->flags |= SQLITE_CacheSpill; + }else{ + db->flags &= ~(u64)SQLITE_CacheSpill; + } + setAllPagerFlags(db); + } + break; + } + + /* + ** PRAGMA [schema.]mmap_size(N) + ** + ** Used to set mapping size limit. The mapping size limit is + ** used to limit the aggregate size of all memory mapped regions of the + ** database file. If this parameter is set to zero, then memory mapping + ** is not used at all. If N is negative, then the default memory map + ** limit determined by sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) is set. + ** The parameter N is measured in bytes. + ** + ** This value is advisory. The underlying VFS is free to memory map + ** as little or as much as it wants. Except, if N is set to 0 then the + ** upper layers will never invoke the xFetch interfaces to the VFS. + */ + case PragTyp_MMAP_SIZE: { + sqlite3_int64 sz; +#if SQLITE_MAX_MMAP_SIZE>0 + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( zRight ){ + int ii; + sqlite3DecOrHexToI64(zRight, &sz); + if( sz<0 ) sz = sqlite3GlobalConfig.szMmap; + if( pId2->n==0 ) db->szMmap = sz; + for(ii=db->nDb-1; ii>=0; ii--){ + if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){ + sqlite3BtreeSetMmapLimit(db->aDb[ii].pBt, sz); + } + } + } + sz = -1; + rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_MMAP_SIZE, &sz); +#else + sz = 0; + rc = SQLITE_OK; +#endif + if( rc==SQLITE_OK ){ + returnSingleInt(v, sz); + }else if( rc!=SQLITE_NOTFOUND ){ + pParse->nErr++; + pParse->rc = rc; + } + break; + } + + /* + ** PRAGMA temp_store + ** PRAGMA temp_store = "default"|"memory"|"file" + ** + ** Return or set the local value of the temp_store flag. Changing + ** the local value does not make changes to the disk file and the default + ** value will be restored the next time the database is opened. + ** + ** Note that it is possible for the library compile-time options to + ** override this setting + */ + case PragTyp_TEMP_STORE: { + if( !zRight ){ + returnSingleInt(v, db->temp_store); + }else{ + changeTempStorage(pParse, zRight); + } + break; + } + + /* + ** PRAGMA temp_store_directory + ** PRAGMA temp_store_directory = ""|"directory_name" + ** + ** Return or set the local value of the temp_store_directory flag. Changing + ** the value sets a specific directory to be used for temporary files. + ** Setting to a null string reverts to the default temporary directory search. + ** If temporary directory is changed, then invalidateTempStorage. + ** + */ + case PragTyp_TEMP_STORE_DIRECTORY: { + if( !zRight ){ + returnSingleText(v, sqlite3_temp_directory); + }else{ +#ifndef SQLITE_OMIT_WSD + if( zRight[0] ){ + int res; + rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); + if( rc!=SQLITE_OK || res==0 ){ + sqlite3ErrorMsg(pParse, "not a writable directory"); + goto pragma_out; + } + } + if( SQLITE_TEMP_STORE==0 + || (SQLITE_TEMP_STORE==1 && db->temp_store<=1) + || (SQLITE_TEMP_STORE==2 && db->temp_store==1) + ){ + invalidateTempStorage(pParse); + } + sqlite3_free(sqlite3_temp_directory); + if( zRight[0] ){ + sqlite3_temp_directory = sqlite3_mprintf("%s", zRight); + }else{ + sqlite3_temp_directory = 0; + } +#endif /* SQLITE_OMIT_WSD */ + } + break; + } + +#if SQLITE_OS_WIN + /* + ** PRAGMA data_store_directory + ** PRAGMA data_store_directory = ""|"directory_name" + ** + ** Return or set the local value of the data_store_directory flag. Changing + ** the value sets a specific directory to be used for database files that + ** were specified with a relative pathname. Setting to a null string reverts + ** to the default database directory, which for database files specified with + ** a relative path will probably be based on the current directory for the + ** process. Database file specified with an absolute path are not impacted + ** by this setting, regardless of its value. + ** + */ + case PragTyp_DATA_STORE_DIRECTORY: { + if( !zRight ){ + returnSingleText(v, sqlite3_data_directory); + }else{ +#ifndef SQLITE_OMIT_WSD + if( zRight[0] ){ + int res; + rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); + if( rc!=SQLITE_OK || res==0 ){ + sqlite3ErrorMsg(pParse, "not a writable directory"); + goto pragma_out; + } + } + sqlite3_free(sqlite3_data_directory); + if( zRight[0] ){ + sqlite3_data_directory = sqlite3_mprintf("%s", zRight); + }else{ + sqlite3_data_directory = 0; + } +#endif /* SQLITE_OMIT_WSD */ + } + break; + } +#endif + +#if SQLITE_ENABLE_LOCKING_STYLE + /* + ** PRAGMA [schema.]lock_proxy_file + ** PRAGMA [schema.]lock_proxy_file = ":auto:"|"lock_file_path" + ** + ** Return or set the value of the lock_proxy_file flag. Changing + ** the value sets a specific file to be used for database access locks. + ** + */ + case PragTyp_LOCK_PROXY_FILE: { + if( !zRight ){ + Pager *pPager = sqlite3BtreePager(pDb->pBt); + char *proxy_file_path = NULL; + sqlite3_file *pFile = sqlite3PagerFile(pPager); + sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE, + &proxy_file_path); + returnSingleText(v, proxy_file_path); + }else{ + Pager *pPager = sqlite3BtreePager(pDb->pBt); + sqlite3_file *pFile = sqlite3PagerFile(pPager); + int res; + if( zRight[0] ){ + res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, + zRight); + } else { + res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, + NULL); + } + if( res!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "failed to set lock proxy file"); + goto pragma_out; + } + } + break; + } +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + + /* + ** PRAGMA [schema.]synchronous + ** PRAGMA [schema.]synchronous=OFF|ON|NORMAL|FULL|EXTRA + ** + ** Return or set the local value of the synchronous flag. Changing + ** the local value does not make changes to the disk file and the + ** default value will be restored the next time the database is + ** opened. + */ + case PragTyp_SYNCHRONOUS: { + if( !zRight ){ + returnSingleInt(v, pDb->safety_level-1); + }else{ + if( !db->autoCommit ){ + sqlite3ErrorMsg(pParse, + "Safety level may not be changed inside a transaction"); + }else if( iDb!=1 ){ + int iLevel = (getSafetyLevel(zRight,0,1)+1) & PAGER_SYNCHRONOUS_MASK; + if( iLevel==0 ) iLevel = 1; + pDb->safety_level = iLevel; + pDb->bSyncSet = 1; + setAllPagerFlags(db); + } + } + break; + } +#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_FLAG_PRAGMAS + case PragTyp_FLAG: { + if( zRight==0 ){ + setPragmaResultColumnNames(v, pPragma); + returnSingleInt(v, (db->flags & pPragma->iArg)!=0 ); + }else{ + u64 mask = pPragma->iArg; /* Mask of bits to set or clear. */ + if( db->autoCommit==0 ){ + /* Foreign key support may not be enabled or disabled while not + ** in auto-commit mode. */ + mask &= ~(SQLITE_ForeignKeys); + } +#if SQLITE_USER_AUTHENTICATION + if( db->auth.authLevel==UAUTH_User ){ + /* Do not allow non-admin users to modify the schema arbitrarily */ + mask &= ~(SQLITE_WriteSchema); + } +#endif + + if( sqlite3GetBoolean(zRight, 0) ){ + db->flags |= mask; + }else{ + db->flags &= ~mask; + if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0; + } + + /* Many of the flag-pragmas modify the code generated by the SQL + ** compiler (eg. count_changes). So add an opcode to expire all + ** compiled SQL statements after modifying a pragma value. + */ + sqlite3VdbeAddOp0(v, OP_Expire); + setAllPagerFlags(db); + } + break; + } +#endif /* SQLITE_OMIT_FLAG_PRAGMAS */ + +#ifndef SQLITE_OMIT_SCHEMA_PRAGMAS + /* + ** PRAGMA table_info(
    ) + ** + ** Return a single row for each column of the named table. The columns of + ** the returned data set are: + ** + ** cid: Column id (numbered from left to right, starting at 0) + ** name: Column name + ** type: Column declaration type. + ** notnull: True if 'NOT NULL' is part of column declaration + ** dflt_value: The default value for the column, if any. + ** pk: Non-zero for PK fields. + */ + case PragTyp_TABLE_INFO: if( zRight ){ + Table *pTab; + pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); + if( pTab ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + int i, k; + int nHidden = 0; + Column *pCol; + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + pParse->nMem = 7; + sqlite3CodeVerifySchema(pParse, iTabDb); + sqlite3ViewGetColumnNames(pParse, pTab); + for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ + int isHidden = 0; + if( pCol->colFlags & COLFLAG_NOINSERT ){ + if( pPragma->iArg==0 ){ + nHidden++; + continue; + } + if( pCol->colFlags & COLFLAG_VIRTUAL ){ + isHidden = 2; /* GENERATED ALWAYS AS ... VIRTUAL */ + }else if( pCol->colFlags & COLFLAG_STORED ){ + isHidden = 3; /* GENERATED ALWAYS AS ... STORED */ + }else{ assert( pCol->colFlags & COLFLAG_HIDDEN ); + isHidden = 1; /* HIDDEN */ + } + } + if( (pCol->colFlags & COLFLAG_PRIMKEY)==0 ){ + k = 0; + }else if( pPk==0 ){ + k = 1; + }else{ + for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} + } + assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN || isHidden>=2 ); + sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi", + i-nHidden, + pCol->zName, + sqlite3ColumnType(pCol,""), + pCol->notNull ? 1 : 0, + pCol->pDflt && isHidden<2 ? pCol->pDflt->u.zToken : 0, + k, + isHidden); + } + } + } + break; + +#ifdef SQLITE_DEBUG + case PragTyp_STATS: { + Index *pIdx; + HashElem *i; + pParse->nMem = 5; + sqlite3CodeVerifySchema(pParse, iDb); + for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + sqlite3VdbeMultiLoad(v, 1, "ssiii", + pTab->zName, + 0, + pTab->szTabRow, + pTab->nRowLogEst, + pTab->tabFlags); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3VdbeMultiLoad(v, 2, "siiiX", + pIdx->zName, + pIdx->szIdxRow, + pIdx->aiRowLogEst[0], + pIdx->hasStat1); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5); + } + } + } + break; +#endif + + case PragTyp_INDEX_INFO: if( zRight ){ + Index *pIdx; + Table *pTab; + pIdx = sqlite3FindIndex(db, zRight, zDb); + if( pIdx==0 ){ + /* If there is no index named zRight, check to see if there is a + ** WITHOUT ROWID table named zRight, and if there is, show the + ** structure of the PRIMARY KEY index for that table. */ + pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); + if( pTab && !HasRowid(pTab) ){ + pIdx = sqlite3PrimaryKeyIndex(pTab); + } + } + if( pIdx ){ + int iIdxDb = sqlite3SchemaToIndex(db, pIdx->pSchema); + int i; + int mx; + if( pPragma->iArg ){ + /* PRAGMA index_xinfo (newer version with more rows and columns) */ + mx = pIdx->nColumn; + pParse->nMem = 6; + }else{ + /* PRAGMA index_info (legacy version) */ + mx = pIdx->nKeyCol; + pParse->nMem = 3; + } + pTab = pIdx->pTable; + sqlite3CodeVerifySchema(pParse, iIdxDb); + assert( pParse->nMem<=pPragma->nPragCName ); + for(i=0; iaiColumn[i]; + sqlite3VdbeMultiLoad(v, 1, "iisX", i, cnum, + cnum<0 ? 0 : pTab->aCol[cnum].zName); + if( pPragma->iArg ){ + sqlite3VdbeMultiLoad(v, 4, "isiX", + pIdx->aSortOrder[i], + pIdx->azColl[i], + inKeyCol); + } + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, pParse->nMem); + } + } + } + break; + + case PragTyp_INDEX_LIST: if( zRight ){ + Index *pIdx; + Table *pTab; + int i; + pTab = sqlite3FindTable(db, zRight, zDb); + if( pTab ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + pParse->nMem = 5; + sqlite3CodeVerifySchema(pParse, iTabDb); + for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){ + const char *azOrigin[] = { "c", "u", "pk" }; + sqlite3VdbeMultiLoad(v, 1, "isisi", + i, + pIdx->zName, + IsUniqueIndex(pIdx), + azOrigin[pIdx->idxType], + pIdx->pPartIdxWhere!=0); + } + } + } + break; + + case PragTyp_DATABASE_LIST: { + int i; + pParse->nMem = 3; + for(i=0; inDb; i++){ + if( db->aDb[i].pBt==0 ) continue; + assert( db->aDb[i].zDbSName!=0 ); + sqlite3VdbeMultiLoad(v, 1, "iss", + i, + db->aDb[i].zDbSName, + sqlite3BtreeGetFilename(db->aDb[i].pBt)); + } + } + break; + + case PragTyp_COLLATION_LIST: { + int i = 0; + HashElem *p; + pParse->nMem = 2; + for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){ + CollSeq *pColl = (CollSeq *)sqliteHashData(p); + sqlite3VdbeMultiLoad(v, 1, "is", i++, pColl->zName); + } + } + break; + +#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS + case PragTyp_FUNCTION_LIST: { + int i; + HashElem *j; + FuncDef *p; + int showInternFunc = (db->mDbFlags & DBFLAG_InternalFunc)!=0; + pParse->nMem = 6; + for(i=0; iu.pHash ){ + pragmaFunclistLine(v, p, 1, showInternFunc); + } + } + for(j=sqliteHashFirst(&db->aFunc); j; j=sqliteHashNext(j)){ + p = (FuncDef*)sqliteHashData(j); + pragmaFunclistLine(v, p, 0, showInternFunc); + } + } + break; + +#ifndef SQLITE_OMIT_VIRTUALTABLE + case PragTyp_MODULE_LIST: { + HashElem *j; + pParse->nMem = 1; + for(j=sqliteHashFirst(&db->aModule); j; j=sqliteHashNext(j)){ + Module *pMod = (Module*)sqliteHashData(j); + sqlite3VdbeMultiLoad(v, 1, "s", pMod->zName); + } + } + break; +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + case PragTyp_PRAGMA_LIST: { + int i; + for(i=0; ipFKey; + if( pFK ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + int i = 0; + pParse->nMem = 8; + sqlite3CodeVerifySchema(pParse, iTabDb); + while(pFK){ + int j; + for(j=0; jnCol; j++){ + sqlite3VdbeMultiLoad(v, 1, "iissssss", + i, + j, + pFK->zTo, + pTab->aCol[pFK->aCol[j].iFrom].zName, + pFK->aCol[j].zCol, + actionName(pFK->aAction[1]), /* ON UPDATE */ + actionName(pFK->aAction[0]), /* ON DELETE */ + "NONE"); + } + ++i; + pFK = pFK->pNextFrom; + } + } + } + } + break; +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY +#ifndef SQLITE_OMIT_TRIGGER + case PragTyp_FOREIGN_KEY_CHECK: { + FKey *pFK; /* A foreign key constraint */ + Table *pTab; /* Child table contain "REFERENCES" keyword */ + Table *pParent; /* Parent table that child points to */ + Index *pIdx; /* Index in the parent table */ + int i; /* Loop counter: Foreign key number for pTab */ + int j; /* Loop counter: Field of the foreign key */ + HashElem *k; /* Loop counter: Next table in schema */ + int x; /* result variable */ + int regResult; /* 3 registers to hold a result row */ + int regKey; /* Register to hold key for checking the FK */ + int regRow; /* Registers to hold a row from pTab */ + int addrTop; /* Top of a loop checking foreign keys */ + int addrOk; /* Jump here if the key is OK */ + int *aiCols; /* child to parent column mapping */ + + regResult = pParse->nMem+1; + pParse->nMem += 4; + regKey = ++pParse->nMem; + regRow = ++pParse->nMem; + k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash); + while( k ){ + int iTabDb; + if( zRight ){ + pTab = sqlite3LocateTable(pParse, 0, zRight, zDb); + k = 0; + }else{ + pTab = (Table*)sqliteHashData(k); + k = sqliteHashNext(k); + } + if( pTab==0 || pTab->pFKey==0 ) continue; + iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + sqlite3CodeVerifySchema(pParse, iTabDb); + sqlite3TableLock(pParse, iTabDb, pTab->tnum, 0, pTab->zName); + if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow; + sqlite3OpenTable(pParse, 0, iTabDb, pTab, OP_OpenRead); + sqlite3VdbeLoadString(v, regResult, pTab->zName); + for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ + pParent = sqlite3FindTable(db, pFK->zTo, zDb); + if( pParent==0 ) continue; + pIdx = 0; + sqlite3TableLock(pParse, iTabDb, pParent->tnum, 0, pParent->zName); + x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0); + if( x==0 ){ + if( pIdx==0 ){ + sqlite3OpenTable(pParse, i, iTabDb, pParent, OP_OpenRead); + }else{ + sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iTabDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + } + }else{ + k = 0; + break; + } + } + assert( pParse->nErr>0 || pFK==0 ); + if( pFK ) break; + if( pParse->nTabnTab = i; + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0); VdbeCoverage(v); + for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ + pParent = sqlite3FindTable(db, pFK->zTo, zDb); + pIdx = 0; + aiCols = 0; + if( pParent ){ + x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols); + assert( x==0 ); + } + addrOk = sqlite3VdbeMakeLabel(pParse); + + /* Generate code to read the child key values into registers + ** regRow..regRow+n. If any of the child key values are NULL, this + ** row cannot cause an FK violation. Jump directly to addrOk in + ** this case. */ + for(j=0; jnCol; j++){ + int iCol = aiCols ? aiCols[j] : pFK->aCol[j].iFrom; + sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, iCol, regRow+j); + sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); VdbeCoverage(v); + } + + /* Generate code to query the parent index for a matching parent + ** key. If a match is found, jump to addrOk. */ + if( pIdx ){ + sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, pFK->nCol, regKey, + sqlite3IndexAffinityStr(db,pIdx), pFK->nCol); + sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0); + VdbeCoverage(v); + }else if( pParent ){ + int jmp = sqlite3VdbeCurrentAddr(v)+2; + sqlite3VdbeAddOp3(v, OP_SeekRowid, i, jmp, regRow); VdbeCoverage(v); + sqlite3VdbeGoto(v, addrOk); + assert( pFK->nCol==1 ); + } + + /* Generate code to report an FK violation to the caller. */ + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, regResult+1); + } + sqlite3VdbeMultiLoad(v, regResult+2, "siX", pFK->zTo, i-1); + sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, 4); + sqlite3VdbeResolveLabel(v, addrOk); + sqlite3DbFree(db, aiCols); + } + sqlite3VdbeAddOp2(v, OP_Next, 0, addrTop+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrTop); + } + } + break; +#endif /* !defined(SQLITE_OMIT_TRIGGER) */ +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + +#ifndef SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA + /* Reinstall the LIKE and GLOB functions. The variant of LIKE + ** used will be case sensitive or not depending on the RHS. + */ + case PragTyp_CASE_SENSITIVE_LIKE: { + if( zRight ){ + sqlite3RegisterLikeFunctions(db, sqlite3GetBoolean(zRight, 0)); + } + } + break; +#endif /* SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA */ + +#ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX +# define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100 +#endif + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK + /* PRAGMA integrity_check + ** PRAGMA integrity_check(N) + ** PRAGMA quick_check + ** PRAGMA quick_check(N) + ** + ** Verify the integrity of the database. + ** + ** The "quick_check" is reduced version of + ** integrity_check designed to detect most database corruption + ** without the overhead of cross-checking indexes. Quick_check + ** is linear time wherease integrity_check is O(NlogN). + */ + case PragTyp_INTEGRITY_CHECK: { + int i, j, addr, mxErr; + + int isQuick = (sqlite3Tolower(zLeft[0])=='q'); + + /* If the PRAGMA command was of the form "PRAGMA .integrity_check", + ** then iDb is set to the index of the database identified by . + ** In this case, the integrity of database iDb only is verified by + ** the VDBE created below. + ** + ** Otherwise, if the command was simply "PRAGMA integrity_check" (or + ** "PRAGMA quick_check"), then iDb is set to 0. In this case, set iDb + ** to -1 here, to indicate that the VDBE should verify the integrity + ** of all attached databases. */ + assert( iDb>=0 ); + assert( iDb==0 || pId2->z ); + if( pId2->z==0 ) iDb = -1; + + /* Initialize the VDBE program */ + pParse->nMem = 6; + + /* Set the maximum error count */ + mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; + if( zRight ){ + sqlite3GetInt32(zRight, &mxErr); + if( mxErr<=0 ){ + mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; + } + } + sqlite3VdbeAddOp2(v, OP_Integer, mxErr-1, 1); /* reg[1] holds errors left */ + + /* Do an integrity check on each database file */ + for(i=0; inDb; i++){ + HashElem *x; /* For looping over tables in the schema */ + Hash *pTbls; /* Set of all tables in the schema */ + int *aRoot; /* Array of root page numbers of all btrees */ + int cnt = 0; /* Number of entries in aRoot[] */ + int mxIdx = 0; /* Maximum number of indexes for any table */ + + if( OMIT_TEMPDB && i==1 ) continue; + if( iDb>=0 && i!=iDb ) continue; + + sqlite3CodeVerifySchema(pParse, i); + + /* Do an integrity check of the B-Tree + ** + ** Begin by finding the root pages numbers + ** for all tables and indices in the database. + */ + assert( sqlite3SchemaMutexHeld(db, i, 0) ); + pTbls = &db->aDb[i].pSchema->tblHash; + for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); /* Current table */ + Index *pIdx; /* An index on pTab */ + int nIdx; /* Number of indexes on pTab */ + if( HasRowid(pTab) ) cnt++; + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; } + if( nIdx>mxIdx ) mxIdx = nIdx; + } + aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1)); + if( aRoot==0 ) break; + for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); + Index *pIdx; + if( HasRowid(pTab) ) aRoot[++cnt] = pTab->tnum; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + aRoot[++cnt] = pIdx->tnum; + } + } + aRoot[0] = cnt; + + /* Make sure sufficient number of registers have been allocated */ + pParse->nMem = MAX( pParse->nMem, 8+mxIdx ); + sqlite3ClearTempRegCache(pParse); + + /* Do the b-tree integrity checks */ + sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY); + sqlite3VdbeChangeP5(v, (u8)i); + addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, + sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zDbSName), + P4_DYNAMIC); + sqlite3VdbeAddOp3(v, OP_Concat, 2, 3, 3); + integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, addr); + + /* Make sure all the indices are constructed correctly. + */ + for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); + Index *pIdx, *pPk; + Index *pPrior = 0; + int loopTop; + int iDataCur, iIdxCur; + int r1 = -1; + + if( pTab->tnum<1 ) continue; /* Skip VIEWs or VIRTUAL TABLEs */ + pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0, + 1, 0, &iDataCur, &iIdxCur); + /* reg[7] counts the number of entries in the table. + ** reg[8+i] counts the number of entries in the i-th index + */ + sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */ + } + assert( pParse->nMem>=8+j ); + assert( sqlite3NoTempsInRange(pParse,1,7+j) ); + sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); + loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); + if( !isQuick ){ + /* Sanity check on record header decoding */ + sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nNVCol-1,3); + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + } + /* Verify that all NOT NULL columns really are NOT NULL */ + for(j=0; jnCol; j++){ + char *zErr; + int jmp2; + if( j==pTab->iPKey ) continue; + if( pTab->aCol[j].notNull==0 ) continue; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); + if( sqlite3VdbeGetOp(v,-1)->opcode==OP_Column ){ + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + } + jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); + zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, + pTab->aCol[j].zName); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); + integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, jmp2); + } + /* Verify CHECK constraints */ + if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ + ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0); + if( db->mallocFailed==0 ){ + int addrCkFault = sqlite3VdbeMakeLabel(pParse); + int addrCkOk = sqlite3VdbeMakeLabel(pParse); + char *zErr; + int k; + pParse->iSelfTab = iDataCur + 1; + for(k=pCheck->nExpr-1; k>0; k--){ + sqlite3ExprIfFalse(pParse, pCheck->a[k].pExpr, addrCkFault, 0); + } + sqlite3ExprIfTrue(pParse, pCheck->a[0].pExpr, addrCkOk, + SQLITE_JUMPIFNULL); + sqlite3VdbeResolveLabel(v, addrCkFault); + pParse->iSelfTab = 0; + zErr = sqlite3MPrintf(db, "CHECK constraint failed in %s", + pTab->zName); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); + integrityCheckResultRow(v); + sqlite3VdbeResolveLabel(v, addrCkOk); + } + sqlite3ExprListDelete(db, pCheck); + } + if( !isQuick ){ /* Omit the remaining tests for quick_check */ + /* Validate index entries for the current row */ + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + int jmp2, jmp3, jmp4, jmp5; + int ckUniq = sqlite3VdbeMakeLabel(pParse); + if( pPk==pIdx ) continue; + r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, + pPrior, r1); + pPrior = pIdx; + sqlite3VdbeAddOp2(v, OP_AddImm, 8+j, 1);/* increment entry count */ + /* Verify that an index entry exists for the current table row */ + jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, iIdxCur+j, ckUniq, r1, + pIdx->nColumn); VdbeCoverage(v); + sqlite3VdbeLoadString(v, 3, "row "); + sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3); + sqlite3VdbeLoadString(v, 4, " missing from index "); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); + jmp5 = sqlite3VdbeLoadString(v, 4, pIdx->zName); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); + jmp4 = integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, jmp2); + /* For UNIQUE indexes, verify that only one entry exists with the + ** current key. The entry is unique if (1) any column is NULL + ** or (2) the next entry has a different key */ + if( IsUniqueIndex(pIdx) ){ + int uniqOk = sqlite3VdbeMakeLabel(pParse); + int jmp6; + int kk; + for(kk=0; kknKeyCol; kk++){ + int iCol = pIdx->aiColumn[kk]; + assert( iCol!=XN_ROWID && iColnCol ); + if( iCol>=0 && pTab->aCol[iCol].notNull ) continue; + sqlite3VdbeAddOp2(v, OP_IsNull, r1+kk, uniqOk); + VdbeCoverage(v); + } + jmp6 = sqlite3VdbeAddOp1(v, OP_Next, iIdxCur+j); VdbeCoverage(v); + sqlite3VdbeGoto(v, uniqOk); + sqlite3VdbeJumpHere(v, jmp6); + sqlite3VdbeAddOp4Int(v, OP_IdxGT, iIdxCur+j, uniqOk, r1, + pIdx->nKeyCol); VdbeCoverage(v); + sqlite3VdbeLoadString(v, 3, "non-unique entry in index "); + sqlite3VdbeGoto(v, jmp5); + sqlite3VdbeResolveLabel(v, uniqOk); + } + sqlite3VdbeJumpHere(v, jmp4); + sqlite3ResolvePartIdxLabel(pParse, jmp3); + } + } + sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, loopTop-1); + if( !isQuick ){ + sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + if( pPk==pIdx ) continue; + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur+j, 3); + addr = sqlite3VdbeAddOp3(v, OP_Eq, 8+j, 0, 3); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + sqlite3VdbeLoadString(v, 4, pIdx->zName); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 2, 3); + integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, addr); + } + } + } + } + { + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList endCode[] = { + { OP_AddImm, 1, 0, 0}, /* 0 */ + { OP_IfNotZero, 1, 4, 0}, /* 1 */ + { OP_String8, 0, 3, 0}, /* 2 */ + { OP_ResultRow, 3, 1, 0}, /* 3 */ + { OP_Halt, 0, 0, 0}, /* 4 */ + { OP_String8, 0, 3, 0}, /* 5 */ + { OP_Goto, 0, 3, 0}, /* 6 */ + }; + VdbeOp *aOp; + + aOp = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode, iLn); + if( aOp ){ + aOp[0].p2 = 1-mxErr; + aOp[2].p4type = P4_STATIC; + aOp[2].p4.z = "ok"; + aOp[5].p4type = P4_STATIC; + aOp[5].p4.z = (char*)sqlite3ErrStr(SQLITE_CORRUPT); + } + sqlite3VdbeChangeP3(v, 0, sqlite3VdbeCurrentAddr(v)-2); + } + } + break; +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_UTF16 + /* + ** PRAGMA encoding + ** PRAGMA encoding = "utf-8"|"utf-16"|"utf-16le"|"utf-16be" + ** + ** In its first form, this pragma returns the encoding of the main + ** database. If the database is not initialized, it is initialized now. + ** + ** The second form of this pragma is a no-op if the main database file + ** has not already been initialized. In this case it sets the default + ** encoding that will be used for the main database file if a new file + ** is created. If an existing main database file is opened, then the + ** default text encoding for the existing database is used. + ** + ** In all cases new databases created using the ATTACH command are + ** created to use the same default text encoding as the main database. If + ** the main database has not been initialized and/or created when ATTACH + ** is executed, this is done before the ATTACH operation. + ** + ** In the second form this pragma sets the text encoding to be used in + ** new database files created using this database handle. It is only + ** useful if invoked immediately after the main database i + */ + case PragTyp_ENCODING: { + static const struct EncName { + char *zName; + u8 enc; + } encnames[] = { + { "UTF8", SQLITE_UTF8 }, + { "UTF-8", SQLITE_UTF8 }, /* Must be element [1] */ + { "UTF-16le", SQLITE_UTF16LE }, /* Must be element [2] */ + { "UTF-16be", SQLITE_UTF16BE }, /* Must be element [3] */ + { "UTF16le", SQLITE_UTF16LE }, + { "UTF16be", SQLITE_UTF16BE }, + { "UTF-16", 0 }, /* SQLITE_UTF16NATIVE */ + { "UTF16", 0 }, /* SQLITE_UTF16NATIVE */ + { 0, 0 } + }; + const struct EncName *pEnc; + if( !zRight ){ /* "PRAGMA encoding" */ + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + assert( encnames[SQLITE_UTF8].enc==SQLITE_UTF8 ); + assert( encnames[SQLITE_UTF16LE].enc==SQLITE_UTF16LE ); + assert( encnames[SQLITE_UTF16BE].enc==SQLITE_UTF16BE ); + returnSingleText(v, encnames[ENC(pParse->db)].zName); + }else{ /* "PRAGMA encoding = XXX" */ + /* Only change the value of sqlite.enc if the database handle is not + ** initialized. If the main database exists, the new sqlite.enc value + ** will be overwritten when the schema is next loaded. If it does not + ** already exists, it will be created to use the new encoding value. + */ + if( (db->mDbFlags & DBFLAG_EncodingFixed)==0 ){ + for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ + if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ + u8 enc = pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE; + SCHEMA_ENC(db) = enc; + sqlite3SetTextEncoding(db, enc); + break; + } + } + if( !pEnc->zName ){ + sqlite3ErrorMsg(pParse, "unsupported encoding: %s", zRight); + } + } + } + } + break; +#endif /* SQLITE_OMIT_UTF16 */ + +#ifndef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS + /* + ** PRAGMA [schema.]schema_version + ** PRAGMA [schema.]schema_version = + ** + ** PRAGMA [schema.]user_version + ** PRAGMA [schema.]user_version = + ** + ** PRAGMA [schema.]freelist_count + ** + ** PRAGMA [schema.]data_version + ** + ** PRAGMA [schema.]application_id + ** PRAGMA [schema.]application_id = + ** + ** The pragma's schema_version and user_version are used to set or get + ** the value of the schema-version and user-version, respectively. Both + ** the schema-version and the user-version are 32-bit signed integers + ** stored in the database header. + ** + ** The schema-cookie is usually only manipulated internally by SQLite. It + ** is incremented by SQLite whenever the database schema is modified (by + ** creating or dropping a table or index). The schema version is used by + ** SQLite each time a query is executed to ensure that the internal cache + ** of the schema used when compiling the SQL query matches the schema of + ** the database against which the compiled query is actually executed. + ** Subverting this mechanism by using "PRAGMA schema_version" to modify + ** the schema-version is potentially dangerous and may lead to program + ** crashes or database corruption. Use with caution! + ** + ** The user-version is not used internally by SQLite. It may be used by + ** applications for any purpose. + */ + case PragTyp_HEADER_VALUE: { + int iCookie = pPragma->iArg; /* Which cookie to read or write */ + sqlite3VdbeUsesBtree(v, iDb); + if( zRight && (pPragma->mPragFlg & PragFlg_ReadOnly)==0 ){ + /* Write the specified cookie value */ + static const VdbeOpList setCookie[] = { + { OP_Transaction, 0, 1, 0}, /* 0 */ + { OP_SetCookie, 0, 0, 0}, /* 1 */ + }; + VdbeOp *aOp; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(setCookie)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie, 0); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[1].p2 = iCookie; + aOp[1].p3 = sqlite3Atoi(zRight); + }else{ + /* Read the specified cookie value */ + static const VdbeOpList readCookie[] = { + { OP_Transaction, 0, 0, 0}, /* 0 */ + { OP_ReadCookie, 0, 1, 0}, /* 1 */ + { OP_ResultRow, 1, 1, 0} + }; + VdbeOp *aOp; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(readCookie)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(readCookie),readCookie,0); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[1].p3 = iCookie; + sqlite3VdbeReusable(v); + } + } + break; +#endif /* SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS */ + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + /* + ** PRAGMA compile_options + ** + ** Return the names of all compile-time options used in this build, + ** one option per row. + */ + case PragTyp_COMPILE_OPTIONS: { + int i = 0; + const char *zOpt; + pParse->nMem = 1; + while( (zOpt = sqlite3_compileoption_get(i++))!=0 ){ + sqlite3VdbeLoadString(v, 1, zOpt); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + } + sqlite3VdbeReusable(v); + } + break; +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +#ifndef SQLITE_OMIT_WAL + /* + ** PRAGMA [schema.]wal_checkpoint = passive|full|restart|truncate + ** + ** Checkpoint the database. + */ + case PragTyp_WAL_CHECKPOINT: { + int iBt = (pId2->z?iDb:SQLITE_MAX_ATTACHED); + int eMode = SQLITE_CHECKPOINT_PASSIVE; + if( zRight ){ + if( sqlite3StrICmp(zRight, "full")==0 ){ + eMode = SQLITE_CHECKPOINT_FULL; + }else if( sqlite3StrICmp(zRight, "restart")==0 ){ + eMode = SQLITE_CHECKPOINT_RESTART; + }else if( sqlite3StrICmp(zRight, "truncate")==0 ){ + eMode = SQLITE_CHECKPOINT_TRUNCATE; + } + } + pParse->nMem = 3; + sqlite3VdbeAddOp3(v, OP_Checkpoint, iBt, eMode, 1); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); + } + break; + + /* + ** PRAGMA wal_autocheckpoint + ** PRAGMA wal_autocheckpoint = N + ** + ** Configure a database connection to automatically checkpoint a database + ** after accumulating N frames in the log. Or query for the current value + ** of N. + */ + case PragTyp_WAL_AUTOCHECKPOINT: { + if( zRight ){ + sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight)); + } + returnSingleInt(v, + db->xWalCallback==sqlite3WalDefaultHook ? + SQLITE_PTR_TO_INT(db->pWalArg) : 0); + } + break; +#endif + + /* + ** PRAGMA shrink_memory + ** + ** IMPLEMENTATION-OF: R-23445-46109 This pragma causes the database + ** connection on which it is invoked to free up as much memory as it + ** can, by calling sqlite3_db_release_memory(). + */ + case PragTyp_SHRINK_MEMORY: { + sqlite3_db_release_memory(db); + break; + } + + /* + ** PRAGMA optimize + ** PRAGMA optimize(MASK) + ** PRAGMA schema.optimize + ** PRAGMA schema.optimize(MASK) + ** + ** Attempt to optimize the database. All schemas are optimized in the first + ** two forms, and only the specified schema is optimized in the latter two. + ** + ** The details of optimizations performed by this pragma are expected + ** to change and improve over time. Applications should anticipate that + ** this pragma will perform new optimizations in future releases. + ** + ** The optional argument is a bitmask of optimizations to perform: + ** + ** 0x0001 Debugging mode. Do not actually perform any optimizations + ** but instead return one line of text for each optimization + ** that would have been done. Off by default. + ** + ** 0x0002 Run ANALYZE on tables that might benefit. On by default. + ** See below for additional information. + ** + ** 0x0004 (Not yet implemented) Record usage and performance + ** information from the current session in the + ** database file so that it will be available to "optimize" + ** pragmas run by future database connections. + ** + ** 0x0008 (Not yet implemented) Create indexes that might have + ** been helpful to recent queries + ** + ** The default MASK is and always shall be 0xfffe. 0xfffe means perform all + ** of the optimizations listed above except Debug Mode, including new + ** optimizations that have not yet been invented. If new optimizations are + ** ever added that should be off by default, those off-by-default + ** optimizations will have bitmasks of 0x10000 or larger. + ** + ** DETERMINATION OF WHEN TO RUN ANALYZE + ** + ** In the current implementation, a table is analyzed if only if all of + ** the following are true: + ** + ** (1) MASK bit 0x02 is set. + ** + ** (2) The query planner used sqlite_stat1-style statistics for one or + ** more indexes of the table at some point during the lifetime of + ** the current connection. + ** + ** (3) One or more indexes of the table are currently unanalyzed OR + ** the number of rows in the table has increased by 25 times or more + ** since the last time ANALYZE was run. + ** + ** The rules for when tables are analyzed are likely to change in + ** future releases. + */ + case PragTyp_OPTIMIZE: { + int iDbLast; /* Loop termination point for the schema loop */ + int iTabCur; /* Cursor for a table whose size needs checking */ + HashElem *k; /* Loop over tables of a schema */ + Schema *pSchema; /* The current schema */ + Table *pTab; /* A table in the schema */ + Index *pIdx; /* An index of the table */ + LogEst szThreshold; /* Size threshold above which reanalysis is needd */ + char *zSubSql; /* SQL statement for the OP_SqlExec opcode */ + u32 opMask; /* Mask of operations to perform */ + + if( zRight ){ + opMask = (u32)sqlite3Atoi(zRight); + if( (opMask & 0x02)==0 ) break; + }else{ + opMask = 0xfffe; + } + iTabCur = pParse->nTab++; + for(iDbLast = zDb?iDb:db->nDb-1; iDb<=iDbLast; iDb++){ + if( iDb==1 ) continue; + sqlite3CodeVerifySchema(pParse, iDb); + pSchema = db->aDb[iDb].pSchema; + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ + pTab = (Table*)sqliteHashData(k); + + /* If table pTab has not been used in a way that would benefit from + ** having analysis statistics during the current session, then skip it. + ** This also has the effect of skipping virtual tables and views */ + if( (pTab->tabFlags & TF_StatsUsed)==0 ) continue; + + /* Reanalyze if the table is 25 times larger than the last analysis */ + szThreshold = pTab->nRowLogEst + 46; assert( sqlite3LogEst(25)==46 ); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( !pIdx->hasStat1 ){ + szThreshold = 0; /* Always analyze if any index lacks statistics */ + break; + } + } + if( szThreshold ){ + sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); + sqlite3VdbeAddOp3(v, OP_IfSmaller, iTabCur, + sqlite3VdbeCurrentAddr(v)+2+(opMask&1), szThreshold); + VdbeCoverage(v); + } + zSubSql = sqlite3MPrintf(db, "ANALYZE \"%w\".\"%w\"", + db->aDb[iDb].zDbSName, pTab->zName); + if( opMask & 0x01 ){ + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4(v, OP_String8, 0, r1, 0, zSubSql, P4_DYNAMIC); + sqlite3VdbeAddOp2(v, OP_ResultRow, r1, 1); + }else{ + sqlite3VdbeAddOp4(v, OP_SqlExec, 0, 0, 0, zSubSql, P4_DYNAMIC); + } + } + } + sqlite3VdbeAddOp0(v, OP_Expire); + break; + } + + /* + ** PRAGMA busy_timeout + ** PRAGMA busy_timeout = N + ** + ** Call sqlite3_busy_timeout(db, N). Return the current timeout value + ** if one is set. If no busy handler or a different busy handler is set + ** then 0 is returned. Setting the busy_timeout to 0 or negative + ** disables the timeout. + */ + /*case PragTyp_BUSY_TIMEOUT*/ default: { + assert( pPragma->ePragTyp==PragTyp_BUSY_TIMEOUT ); + if( zRight ){ + sqlite3_busy_timeout(db, sqlite3Atoi(zRight)); + } + returnSingleInt(v, db->busyTimeout); + break; + } + + /* + ** PRAGMA soft_heap_limit + ** PRAGMA soft_heap_limit = N + ** + ** IMPLEMENTATION-OF: R-26343-45930 This pragma invokes the + ** sqlite3_soft_heap_limit64() interface with the argument N, if N is + ** specified and is a non-negative integer. + ** IMPLEMENTATION-OF: R-64451-07163 The soft_heap_limit pragma always + ** returns the same integer that would be returned by the + ** sqlite3_soft_heap_limit64(-1) C-language function. + */ + case PragTyp_SOFT_HEAP_LIMIT: { + sqlite3_int64 N; + if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){ + sqlite3_soft_heap_limit64(N); + } + returnSingleInt(v, sqlite3_soft_heap_limit64(-1)); + break; + } + + /* + ** PRAGMA hard_heap_limit + ** PRAGMA hard_heap_limit = N + ** + ** Invoke sqlite3_hard_heap_limit64() to query or set the hard heap + ** limit. The hard heap limit can be activated or lowered by this + ** pragma, but not raised or deactivated. Only the + ** sqlite3_hard_heap_limit64() C-language API can raise or deactivate + ** the hard heap limit. This allows an application to set a heap limit + ** constraint that cannot be relaxed by an untrusted SQL script. + */ + case PragTyp_HARD_HEAP_LIMIT: { + sqlite3_int64 N; + if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){ + sqlite3_int64 iPrior = sqlite3_hard_heap_limit64(-1); + if( N>0 && (iPrior==0 || iPrior>N) ) sqlite3_hard_heap_limit64(N); + } + returnSingleInt(v, sqlite3_hard_heap_limit64(-1)); + break; + } + + /* + ** PRAGMA threads + ** PRAGMA threads = N + ** + ** Configure the maximum number of worker threads. Return the new + ** maximum, which might be less than requested. + */ + case PragTyp_THREADS: { + sqlite3_int64 N; + if( zRight + && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK + && N>=0 + ){ + sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, (int)(N&0x7fffffff)); + } + returnSingleInt(v, sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1)); + break; + } + + /* + ** PRAGMA analysis_limit + ** PRAGMA analysis_limit = N + ** + ** Configure the maximum number of rows that ANALYZE will examine + ** in each index that it looks at. Return the new limit. + */ + case PragTyp_ANALYSIS_LIMIT: { + sqlite3_int64 N; + if( zRight + && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK + && N>=0 + ){ + db->nAnalysisLimit = (int)(N&0x7fffffff); + } + returnSingleInt(v, db->nAnalysisLimit); + break; + } + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* + ** Report the current state of file logs for all databases + */ + case PragTyp_LOCK_STATUS: { + static const char *const azLockName[] = { + "unlocked", "shared", "reserved", "pending", "exclusive" + }; + int i; + pParse->nMem = 2; + for(i=0; inDb; i++){ + Btree *pBt; + const char *zState = "unknown"; + int j; + if( db->aDb[i].zDbSName==0 ) continue; + pBt = db->aDb[i].pBt; + if( pBt==0 || sqlite3BtreePager(pBt)==0 ){ + zState = "closed"; + }else if( sqlite3_file_control(db, i ? db->aDb[i].zDbSName : 0, + SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ + zState = azLockName[j]; + } + sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zDbSName, zState); + } + break; + } +#endif + +#if defined(SQLITE_ENABLE_CEROD) + case PragTyp_ACTIVATE_EXTENSIONS: if( zRight ){ + if( sqlite3StrNICmp(zRight, "cerod-", 6)==0 ){ + sqlite3_activate_cerod(&zRight[6]); + } + } + break; +#endif + + } /* End of the PRAGMA switch */ + + /* The following block is a no-op unless SQLITE_DEBUG is defined. Its only + ** purpose is to execute assert() statements to verify that if the + ** PragFlg_NoColumns1 flag is set and the caller specified an argument + ** to the PRAGMA, the implementation has not added any OP_ResultRow + ** instructions to the VM. */ + if( (pPragma->mPragFlg & PragFlg_NoColumns1) && zRight ){ + sqlite3VdbeVerifyNoResultRow(v); + } + +pragma_out: + sqlite3DbFree(db, zLeft); + sqlite3DbFree(db, zRight); +} +#ifndef SQLITE_OMIT_VIRTUALTABLE +/***************************************************************************** +** Implementation of an eponymous virtual table that runs a pragma. +** +*/ +typedef struct PragmaVtab PragmaVtab; +typedef struct PragmaVtabCursor PragmaVtabCursor; +struct PragmaVtab { + sqlite3_vtab base; /* Base class. Must be first */ + sqlite3 *db; /* The database connection to which it belongs */ + const PragmaName *pName; /* Name of the pragma */ + u8 nHidden; /* Number of hidden columns */ + u8 iHidden; /* Index of the first hidden column */ +}; +struct PragmaVtabCursor { + sqlite3_vtab_cursor base; /* Base class. Must be first */ + sqlite3_stmt *pPragma; /* The pragma statement to run */ + sqlite_int64 iRowid; /* Current rowid */ + char *azArg[2]; /* Value of the argument and schema */ +}; + +/* +** Pragma virtual table module xConnect method. +*/ +static int pragmaVtabConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + const PragmaName *pPragma = (const PragmaName*)pAux; + PragmaVtab *pTab = 0; + int rc; + int i, j; + char cSep = '('; + StrAccum acc; + char zBuf[200]; + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3_str_appendall(&acc, "CREATE TABLE x"); + for(i=0, j=pPragma->iPragCName; inPragCName; i++, j++){ + sqlite3_str_appendf(&acc, "%c\"%s\"", cSep, pragCName[j]); + cSep = ','; + } + if( i==0 ){ + sqlite3_str_appendf(&acc, "(\"%s\"", pPragma->zName); + i++; + } + j = 0; + if( pPragma->mPragFlg & PragFlg_Result1 ){ + sqlite3_str_appendall(&acc, ",arg HIDDEN"); + j++; + } + if( pPragma->mPragFlg & (PragFlg_SchemaOpt|PragFlg_SchemaReq) ){ + sqlite3_str_appendall(&acc, ",schema HIDDEN"); + j++; + } + sqlite3_str_append(&acc, ")", 1); + sqlite3StrAccumFinish(&acc); + assert( strlen(zBuf) < sizeof(zBuf)-1 ); + rc = sqlite3_declare_vtab(db, zBuf); + if( rc==SQLITE_OK ){ + pTab = (PragmaVtab*)sqlite3_malloc(sizeof(PragmaVtab)); + if( pTab==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pTab, 0, sizeof(PragmaVtab)); + pTab->pName = pPragma; + pTab->db = db; + pTab->iHidden = i; + pTab->nHidden = j; + } + }else{ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + + *ppVtab = (sqlite3_vtab*)pTab; + return rc; +} + +/* +** Pragma virtual table module xDisconnect method. +*/ +static int pragmaVtabDisconnect(sqlite3_vtab *pVtab){ + PragmaVtab *pTab = (PragmaVtab*)pVtab; + sqlite3_free(pTab); + return SQLITE_OK; +} + +/* Figure out the best index to use to search a pragma virtual table. +** +** There are not really any index choices. But we want to encourage the +** query planner to give == constraints on as many hidden parameters as +** possible, and especially on the first hidden parameter. So return a +** high cost if hidden parameters are unconstrained. +*/ +static int pragmaVtabBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + PragmaVtab *pTab = (PragmaVtab*)tab; + const struct sqlite3_index_constraint *pConstraint; + int i, j; + int seen[2]; + + pIdxInfo->estimatedCost = (double)1; + if( pTab->nHidden==0 ){ return SQLITE_OK; } + pConstraint = pIdxInfo->aConstraint; + seen[0] = 0; + seen[1] = 0; + for(i=0; inConstraint; i++, pConstraint++){ + if( pConstraint->usable==0 ) continue; + if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( pConstraint->iColumn < pTab->iHidden ) continue; + j = pConstraint->iColumn - pTab->iHidden; + assert( j < 2 ); + seen[j] = i+1; + } + if( seen[0]==0 ){ + pIdxInfo->estimatedCost = (double)2147483647; + pIdxInfo->estimatedRows = 2147483647; + return SQLITE_OK; + } + j = seen[0]-1; + pIdxInfo->aConstraintUsage[j].argvIndex = 1; + pIdxInfo->aConstraintUsage[j].omit = 1; + if( seen[1]==0 ) return SQLITE_OK; + pIdxInfo->estimatedCost = (double)20; + pIdxInfo->estimatedRows = 20; + j = seen[1]-1; + pIdxInfo->aConstraintUsage[j].argvIndex = 2; + pIdxInfo->aConstraintUsage[j].omit = 1; + return SQLITE_OK; +} + +/* Create a new cursor for the pragma virtual table */ +static int pragmaVtabOpen(sqlite3_vtab *pVtab, sqlite3_vtab_cursor **ppCursor){ + PragmaVtabCursor *pCsr; + pCsr = (PragmaVtabCursor*)sqlite3_malloc(sizeof(*pCsr)); + if( pCsr==0 ) return SQLITE_NOMEM; + memset(pCsr, 0, sizeof(PragmaVtabCursor)); + pCsr->base.pVtab = pVtab; + *ppCursor = &pCsr->base; + return SQLITE_OK; +} + +/* Clear all content from pragma virtual table cursor. */ +static void pragmaVtabCursorClear(PragmaVtabCursor *pCsr){ + int i; + sqlite3_finalize(pCsr->pPragma); + pCsr->pPragma = 0; + for(i=0; iazArg); i++){ + sqlite3_free(pCsr->azArg[i]); + pCsr->azArg[i] = 0; + } +} + +/* Close a pragma virtual table cursor */ +static int pragmaVtabClose(sqlite3_vtab_cursor *cur){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)cur; + pragmaVtabCursorClear(pCsr); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* Advance the pragma virtual table cursor to the next row */ +static int pragmaVtabNext(sqlite3_vtab_cursor *pVtabCursor){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + int rc = SQLITE_OK; + + /* Increment the xRowid value */ + pCsr->iRowid++; + assert( pCsr->pPragma ); + if( SQLITE_ROW!=sqlite3_step(pCsr->pPragma) ){ + rc = sqlite3_finalize(pCsr->pPragma); + pCsr->pPragma = 0; + pragmaVtabCursorClear(pCsr); + } + return rc; +} + +/* +** Pragma virtual table module xFilter method. +*/ +static int pragmaVtabFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + PragmaVtab *pTab = (PragmaVtab*)(pVtabCursor->pVtab); + int rc; + int i, j; + StrAccum acc; + char *zSql; + + UNUSED_PARAMETER(idxNum); + UNUSED_PARAMETER(idxStr); + pragmaVtabCursorClear(pCsr); + j = (pTab->pName->mPragFlg & PragFlg_Result1)!=0 ? 0 : 1; + for(i=0; iazArg) ); + assert( pCsr->azArg[j]==0 ); + if( zText ){ + pCsr->azArg[j] = sqlite3_mprintf("%s", zText); + if( pCsr->azArg[j]==0 ){ + return SQLITE_NOMEM; + } + } + } + sqlite3StrAccumInit(&acc, 0, 0, 0, pTab->db->aLimit[SQLITE_LIMIT_SQL_LENGTH]); + sqlite3_str_appendall(&acc, "PRAGMA "); + if( pCsr->azArg[1] ){ + sqlite3_str_appendf(&acc, "%Q.", pCsr->azArg[1]); + } + sqlite3_str_appendall(&acc, pTab->pName->zName); + if( pCsr->azArg[0] ){ + sqlite3_str_appendf(&acc, "=%Q", pCsr->azArg[0]); + } + zSql = sqlite3StrAccumFinish(&acc); + if( zSql==0 ) return SQLITE_NOMEM; + rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pPragma, 0); + sqlite3_free(zSql); + if( rc!=SQLITE_OK ){ + pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db)); + return rc; + } + return pragmaVtabNext(pVtabCursor); +} + +/* +** Pragma virtual table module xEof method. +*/ +static int pragmaVtabEof(sqlite3_vtab_cursor *pVtabCursor){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + return (pCsr->pPragma==0); +} + +/* The xColumn method simply returns the corresponding column from +** the PRAGMA. +*/ +static int pragmaVtabColumn( + sqlite3_vtab_cursor *pVtabCursor, + sqlite3_context *ctx, + int i +){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + PragmaVtab *pTab = (PragmaVtab*)(pVtabCursor->pVtab); + if( iiHidden ){ + sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pPragma, i)); + }else{ + sqlite3_result_text(ctx, pCsr->azArg[i-pTab->iHidden],-1,SQLITE_TRANSIENT); + } + return SQLITE_OK; +} + +/* +** Pragma virtual table module xRowid method. +*/ +static int pragmaVtabRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *p){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + *p = pCsr->iRowid; + return SQLITE_OK; +} + +/* The pragma virtual table object */ +static const sqlite3_module pragmaVtabModule = { + 0, /* iVersion */ + 0, /* xCreate - create a table */ + pragmaVtabConnect, /* xConnect - connect to an existing table */ + pragmaVtabBestIndex, /* xBestIndex - Determine search strategy */ + pragmaVtabDisconnect, /* xDisconnect - Disconnect from a table */ + 0, /* xDestroy - Drop a table */ + pragmaVtabOpen, /* xOpen - open a cursor */ + pragmaVtabClose, /* xClose - close a cursor */ + pragmaVtabFilter, /* xFilter - configure scan constraints */ + pragmaVtabNext, /* xNext - advance a cursor */ + pragmaVtabEof, /* xEof */ + pragmaVtabColumn, /* xColumn - read data */ + pragmaVtabRowid, /* xRowid - read data */ + 0, /* xUpdate - write data */ + 0, /* xBegin - begin transaction */ + 0, /* xSync - sync transaction */ + 0, /* xCommit - commit transaction */ + 0, /* xRollback - rollback transaction */ + 0, /* xFindFunction - function overloading */ + 0, /* xRename - rename the table */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ +}; + +/* +** Check to see if zTabName is really the name of a pragma. If it is, +** then register an eponymous virtual table for that pragma and return +** a pointer to the Module object for the new virtual table. +*/ +SQLITE_PRIVATE Module *sqlite3PragmaVtabRegister(sqlite3 *db, const char *zName){ + const PragmaName *pName; + assert( sqlite3_strnicmp(zName, "pragma_", 7)==0 ); + pName = pragmaLocate(zName+7); + if( pName==0 ) return 0; + if( (pName->mPragFlg & (PragFlg_Result0|PragFlg_Result1))==0 ) return 0; + assert( sqlite3HashFind(&db->aModule, zName)==0 ); + return sqlite3VtabCreateModule(db, zName, &pragmaVtabModule, (void*)pName, 0); +} + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#endif /* SQLITE_OMIT_PRAGMA */ + +/************** End of pragma.c **********************************************/ +/************** Begin file prepare.c *****************************************/ +/* +** 2005 May 25 +** +** 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 the implementation of the sqlite3_prepare() +** interface, and routines that contribute to loading the database schema +** from disk. +*/ +/* #include "sqliteInt.h" */ + +/* +** Fill the InitData structure with an error message that indicates +** that the database is corrupt. +*/ +static void corruptSchema( + InitData *pData, /* Initialization context */ + const char *zObj, /* Object being parsed at the point of error */ + const char *zExtra /* Error information */ +){ + sqlite3 *db = pData->db; + if( db->mallocFailed ){ + pData->rc = SQLITE_NOMEM_BKPT; + }else if( pData->pzErrMsg[0]!=0 ){ + /* A error message has already been generated. Do not overwrite it */ + }else if( pData->mInitFlags & INITFLAG_AlterTable ){ + *pData->pzErrMsg = sqlite3DbStrDup(db, zExtra); + pData->rc = SQLITE_ERROR; + }else if( db->flags & SQLITE_WriteSchema ){ + pData->rc = SQLITE_CORRUPT_BKPT; + }else{ + char *z; + if( zObj==0 ) zObj = "?"; + z = sqlite3MPrintf(db, "malformed database schema (%s)", zObj); + if( zExtra && zExtra[0] ) z = sqlite3MPrintf(db, "%z - %s", z, zExtra); + *pData->pzErrMsg = z; + pData->rc = SQLITE_CORRUPT_BKPT; + } +} + +/* +** Check to see if any sibling index (another index on the same table) +** of pIndex has the same root page number, and if it does, return true. +** This would indicate a corrupt schema. +*/ +SQLITE_PRIVATE int sqlite3IndexHasDuplicateRootPage(Index *pIndex){ + Index *p; + for(p=pIndex->pTable->pIndex; p; p=p->pNext){ + if( p->tnum==pIndex->tnum && p!=pIndex ) return 1; + } + return 0; +} + +/* forward declaration */ +static int sqlite3Prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + Vdbe *pReprepare, /* VM being reprepared */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +); + + +/* +** This is the callback routine for the code that initializes the +** database. See sqlite3Init() below for additional information. +** This routine is also called from the OP_ParseSchema opcode of the VDBE. +** +** Each callback contains the following information: +** +** argv[0] = type of object: "table", "index", "trigger", or "view". +** argv[1] = name of thing being created +** argv[2] = associated table if an index or trigger +** argv[3] = root page number for table or index. 0 for trigger or view. +** argv[4] = SQL text for the CREATE statement. +** +*/ +SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ + InitData *pData = (InitData*)pInit; + sqlite3 *db = pData->db; + int iDb = pData->iDb; + + assert( argc==5 ); + UNUSED_PARAMETER2(NotUsed, argc); + assert( sqlite3_mutex_held(db->mutex) ); + db->mDbFlags |= DBFLAG_EncodingFixed; + pData->nInitRow++; + if( db->mallocFailed ){ + corruptSchema(pData, argv[1], 0); + return 1; + } + + assert( iDb>=0 && iDbnDb ); + if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ + if( argv[3]==0 ){ + corruptSchema(pData, argv[1], 0); + }else if( sqlite3_strnicmp(argv[4],"create ",7)==0 ){ + /* Call the parser to process a CREATE TABLE, INDEX or VIEW. + ** But because db->init.busy is set to 1, no VDBE code is generated + ** or executed. All the parser does is build the internal data + ** structures that describe the table, index, or view. + */ + int rc; + u8 saved_iDb = db->init.iDb; + sqlite3_stmt *pStmt; + TESTONLY(int rcp); /* Return code from sqlite3_prepare() */ + + assert( db->init.busy ); + db->init.iDb = iDb; + db->init.newTnum = sqlite3Atoi(argv[3]); + db->init.orphanTrigger = 0; + db->init.azInit = argv; + pStmt = 0; + TESTONLY(rcp = ) sqlite3Prepare(db, argv[4], -1, 0, 0, &pStmt, 0); + rc = db->errCode; + assert( (rc&0xFF)==(rcp&0xFF) ); + db->init.iDb = saved_iDb; + /* assert( saved_iDb==0 || (db->mDbFlags & DBFLAG_Vacuum)!=0 ); */ + if( SQLITE_OK!=rc ){ + if( db->init.orphanTrigger ){ + assert( iDb==1 ); + }else{ + if( rc > pData->rc ) pData->rc = rc; + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + }else if( rc!=SQLITE_INTERRUPT && (rc&0xFF)!=SQLITE_LOCKED ){ + corruptSchema(pData, argv[1], sqlite3_errmsg(db)); + } + } + } + sqlite3_finalize(pStmt); + }else if( argv[1]==0 || (argv[4]!=0 && argv[4][0]!=0) ){ + corruptSchema(pData, argv[1], 0); + }else{ + /* If the SQL column is blank it means this is an index that + ** was created to be the PRIMARY KEY or to fulfill a UNIQUE + ** constraint for a CREATE TABLE. The index should have already + ** been created when we processed the CREATE TABLE. All we have + ** to do here is record the root page number for that index. + */ + Index *pIndex; + pIndex = sqlite3FindIndex(db, argv[1], db->aDb[iDb].zDbSName); + if( pIndex==0 + || sqlite3GetInt32(argv[3],&pIndex->tnum)==0 + || pIndex->tnum<2 + || sqlite3IndexHasDuplicateRootPage(pIndex) + ){ + corruptSchema(pData, argv[1], pIndex?"invalid rootpage":"orphan index"); + } + } + return 0; +} + +/* +** Attempt to read the database schema and initialize internal +** data structures for a single database file. The index of the +** database file is given by iDb. iDb==0 is used for the main +** database. iDb==1 should never be used. iDb>=2 is used for +** auxiliary databases. Return one of the SQLITE_ error codes to +** indicate success or failure. +*/ +SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ + int rc; + int i; +#ifndef SQLITE_OMIT_DEPRECATED + int size; +#endif + Db *pDb; + char const *azArg[6]; + int meta[5]; + InitData initData; + const char *zMasterName; + int openedTransaction = 0; + int mask = ((db->mDbFlags & DBFLAG_EncodingFixed) | ~DBFLAG_EncodingFixed); + + assert( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 ); + assert( iDb>=0 && iDbnDb ); + assert( db->aDb[iDb].pSchema ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); + + db->init.busy = 1; + + /* Construct the in-memory representation schema tables (sqlite_master or + ** sqlite_temp_master) by invoking the parser directly. The appropriate + ** table name will be inserted automatically by the parser so we can just + ** use the abbreviation "x" here. The parser will also automatically tag + ** the schema table as read-only. */ + azArg[0] = "table"; + azArg[1] = zMasterName = SCHEMA_TABLE(iDb); + azArg[2] = azArg[1]; + azArg[3] = "1"; + azArg[4] = "CREATE TABLE x(type text,name text,tbl_name text," + "rootpage int,sql text)"; + azArg[5] = 0; + initData.db = db; + initData.iDb = iDb; + initData.rc = SQLITE_OK; + initData.pzErrMsg = pzErrMsg; + initData.mInitFlags = mFlags; + initData.nInitRow = 0; + sqlite3InitCallback(&initData, 5, (char **)azArg, 0); + db->mDbFlags &= mask; + if( initData.rc ){ + rc = initData.rc; + goto error_out; + } + + /* Create a cursor to hold the database open + */ + pDb = &db->aDb[iDb]; + if( pDb->pBt==0 ){ + assert( iDb==1 ); + DbSetProperty(db, 1, DB_SchemaLoaded); + rc = SQLITE_OK; + goto error_out; + } + + /* If there is not already a read-only (or read-write) transaction opened + ** on the b-tree database, open one now. If a transaction is opened, it + ** will be closed before this function returns. */ + sqlite3BtreeEnter(pDb->pBt); + if( !sqlite3BtreeIsInReadTrans(pDb->pBt) ){ + rc = sqlite3BtreeBeginTrans(pDb->pBt, 0, 0); + if( rc!=SQLITE_OK ){ + sqlite3SetString(pzErrMsg, db, sqlite3ErrStr(rc)); + goto initone_error_out; + } + openedTransaction = 1; + } + + /* Get the database meta information. + ** + ** Meta values are as follows: + ** meta[0] Schema cookie. Changes with each schema change. + ** meta[1] File format of schema layer. + ** meta[2] Size of the page cache. + ** meta[3] Largest rootpage (auto/incr_vacuum mode) + ** meta[4] Db text encoding. 1:UTF-8 2:UTF-16LE 3:UTF-16BE + ** meta[5] User version + ** meta[6] Incremental vacuum mode + ** meta[7] unused + ** meta[8] unused + ** meta[9] unused + ** + ** Note: The #defined SQLITE_UTF* symbols in sqliteInt.h correspond to + ** the possible values of meta[4]. + */ + for(i=0; ipBt, i+1, (u32 *)&meta[i]); + } + if( (db->flags & SQLITE_ResetDatabase)!=0 ){ + memset(meta, 0, sizeof(meta)); + } + pDb->pSchema->schema_cookie = meta[BTREE_SCHEMA_VERSION-1]; + + /* If opening a non-empty database, check the text encoding. For the + ** main database, set sqlite3.enc to the encoding of the main database. + ** For an attached db, it is an error if the encoding is not the same + ** as sqlite3.enc. + */ + if( meta[BTREE_TEXT_ENCODING-1] ){ /* text encoding */ + if( iDb==0 && (db->mDbFlags & DBFLAG_EncodingFixed)==0 ){ + u8 encoding; +#ifndef SQLITE_OMIT_UTF16 + /* If opening the main database, set ENC(db). */ + encoding = (u8)meta[BTREE_TEXT_ENCODING-1] & 3; + if( encoding==0 ) encoding = SQLITE_UTF8; +#else + encoding = SQLITE_UTF8; +#endif + sqlite3SetTextEncoding(db, encoding); + }else{ + /* If opening an attached database, the encoding much match ENC(db) */ + if( (meta[BTREE_TEXT_ENCODING-1] & 3)!=ENC(db) ){ + sqlite3SetString(pzErrMsg, db, "attached databases must use the same" + " text encoding as main database"); + rc = SQLITE_ERROR; + goto initone_error_out; + } + } + } + pDb->pSchema->enc = ENC(db); + + if( pDb->pSchema->cache_size==0 ){ +#ifndef SQLITE_OMIT_DEPRECATED + size = sqlite3AbsInt32(meta[BTREE_DEFAULT_CACHE_SIZE-1]); + if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; } + pDb->pSchema->cache_size = size; +#else + pDb->pSchema->cache_size = SQLITE_DEFAULT_CACHE_SIZE; +#endif + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + + /* + ** file_format==1 Version 3.0.0. + ** file_format==2 Version 3.1.3. // ALTER TABLE ADD COLUMN + ** file_format==3 Version 3.1.4. // ditto but with non-NULL defaults + ** file_format==4 Version 3.3.0. // DESC indices. Boolean constants + */ + pDb->pSchema->file_format = (u8)meta[BTREE_FILE_FORMAT-1]; + if( pDb->pSchema->file_format==0 ){ + pDb->pSchema->file_format = 1; + } + if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){ + sqlite3SetString(pzErrMsg, db, "unsupported file format"); + rc = SQLITE_ERROR; + goto initone_error_out; + } + + /* Ticket #2804: When we open a database in the newer file format, + ** clear the legacy_file_format pragma flag so that a VACUUM will + ** not downgrade the database and thus invalidate any descending + ** indices that the user might have created. + */ + if( iDb==0 && meta[BTREE_FILE_FORMAT-1]>=4 ){ + db->flags &= ~(u64)SQLITE_LegacyFileFmt; + } + + /* Read the schema information out of the schema tables + */ + assert( db->init.busy ); + { + char *zSql; + zSql = sqlite3MPrintf(db, + "SELECT*FROM\"%w\".%s ORDER BY rowid", + db->aDb[iDb].zDbSName, zMasterName); +#ifndef SQLITE_OMIT_AUTHORIZATION + { + sqlite3_xauth xAuth; + xAuth = db->xAuth; + db->xAuth = 0; +#endif + rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; + } +#endif + if( rc==SQLITE_OK ) rc = initData.rc; + sqlite3DbFree(db, zSql); +#ifndef SQLITE_OMIT_ANALYZE + if( rc==SQLITE_OK ){ + sqlite3AnalysisLoad(db, iDb); + } +#endif + } + if( db->mallocFailed ){ + rc = SQLITE_NOMEM_BKPT; + sqlite3ResetAllSchemasOfConnection(db); + } + if( rc==SQLITE_OK || (db->flags&SQLITE_NoSchemaError)){ + /* Black magic: If the SQLITE_NoSchemaError flag is set, then consider + ** the schema loaded, even if errors occurred. In this situation the + ** current sqlite3_prepare() operation will fail, but the following one + ** will attempt to compile the supplied statement against whatever subset + ** of the schema was loaded before the error occurred. The primary + ** purpose of this is to allow access to the sqlite_master table + ** even when its contents have been corrupted. + */ + DbSetProperty(db, iDb, DB_SchemaLoaded); + rc = SQLITE_OK; + } + + /* Jump here for an error that occurs after successfully allocating + ** curMain and calling sqlite3BtreeEnter(). For an error that occurs + ** before that point, jump to error_out. + */ +initone_error_out: + if( openedTransaction ){ + sqlite3BtreeCommit(pDb->pBt); + } + sqlite3BtreeLeave(pDb->pBt); + +error_out: + if( rc ){ + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + } + sqlite3ResetOneSchema(db, iDb); + } + db->init.busy = 0; + return rc; +} + +/* +** Initialize all database files - the main database file, the file +** used to store temporary tables, and any additional database files +** created using ATTACH statements. Return a success code. If an +** error occurs, write an error message into *pzErrMsg. +** +** After a database is initialized, the DB_SchemaLoaded bit is set +** bit is set in the flags field of the Db structure. +*/ +SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){ + int i, rc; + int commit_internal = !(db->mDbFlags&DBFLAG_SchemaChange); + + assert( sqlite3_mutex_held(db->mutex) ); + assert( sqlite3BtreeHoldsMutex(db->aDb[0].pBt) ); + assert( db->init.busy==0 ); + ENC(db) = SCHEMA_ENC(db); + assert( db->nDb>0 ); + /* Do the main schema first */ + if( !DbHasProperty(db, 0, DB_SchemaLoaded) ){ + rc = sqlite3InitOne(db, 0, pzErrMsg, 0); + if( rc ) return rc; + } + /* All other schemas after the main schema. The "temp" schema must be last */ + for(i=db->nDb-1; i>0; i--){ + assert( i==1 || sqlite3BtreeHoldsMutex(db->aDb[i].pBt) ); + if( !DbHasProperty(db, i, DB_SchemaLoaded) ){ + rc = sqlite3InitOne(db, i, pzErrMsg, 0); + if( rc ) return rc; + } + } + if( commit_internal ){ + sqlite3CommitInternalChanges(db); + } + return SQLITE_OK; +} + +/* +** This routine is a no-op if the database schema is already initialized. +** Otherwise, the schema is loaded. An error code is returned. +*/ +SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse){ + int rc = SQLITE_OK; + sqlite3 *db = pParse->db; + assert( sqlite3_mutex_held(db->mutex) ); + if( !db->init.busy ){ + rc = sqlite3Init(db, &pParse->zErrMsg); + if( rc!=SQLITE_OK ){ + pParse->rc = rc; + pParse->nErr++; + }else if( db->noSharedCache ){ + db->mDbFlags |= DBFLAG_SchemaKnownOk; + } + } + return rc; +} + + +/* +** Check schema cookies in all databases. If any cookie is out +** of date set pParse->rc to SQLITE_SCHEMA. If all schema cookies +** make no changes to pParse->rc. +*/ +static void schemaIsValid(Parse *pParse){ + sqlite3 *db = pParse->db; + int iDb; + int rc; + int cookie; + + assert( pParse->checkSchema ); + assert( sqlite3_mutex_held(db->mutex) ); + for(iDb=0; iDbnDb; iDb++){ + int openedTransaction = 0; /* True if a transaction is opened */ + Btree *pBt = db->aDb[iDb].pBt; /* Btree database to read cookie from */ + if( pBt==0 ) continue; + + /* If there is not already a read-only (or read-write) transaction opened + ** on the b-tree database, open one now. If a transaction is opened, it + ** will be closed immediately after reading the meta-value. */ + if( !sqlite3BtreeIsInReadTrans(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0, 0); + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + } + if( rc!=SQLITE_OK ) return; + openedTransaction = 1; + } + + /* Read the schema cookie from the database. If it does not match the + ** value stored as part of the in-memory schema representation, + ** set Parse.rc to SQLITE_SCHEMA. */ + sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){ + sqlite3ResetOneSchema(db, iDb); + pParse->rc = SQLITE_SCHEMA; + } + + /* Close the transaction, if one was opened. */ + if( openedTransaction ){ + sqlite3BtreeCommit(pBt); + } + } +} + +/* +** Convert a schema pointer into the iDb index that indicates +** which database file in db->aDb[] the schema refers to. +** +** If the same database is attached more than once, the first +** attached database is returned. +*/ +SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ + int i = -1000000; + + /* If pSchema is NULL, then return -1000000. This happens when code in + ** expr.c is trying to resolve a reference to a transient table (i.e. one + ** created by a sub-select). In this case the return value of this + ** function should never be used. + ** + ** We return -1000000 instead of the more usual -1 simply because using + ** -1000000 as the incorrect index into db->aDb[] is much + ** more likely to cause a segfault than -1 (of course there are assert() + ** statements too, but it never hurts to play the odds). + */ + assert( sqlite3_mutex_held(db->mutex) ); + if( pSchema ){ + for(i=0; 1; i++){ + assert( inDb ); + if( db->aDb[i].pSchema==pSchema ){ + break; + } + } + assert( i>=0 && inDb ); + } + return i; +} + +/* +** Deallocate a single AggInfo object +*/ +static void agginfoFree(sqlite3 *db, AggInfo *p){ + sqlite3DbFree(db, p->aCol); + sqlite3DbFree(db, p->aFunc); + sqlite3DbFree(db, p); +} + +/* +** Free all memory allocations in the pParse object +*/ +SQLITE_PRIVATE void sqlite3ParserReset(Parse *pParse){ + sqlite3 *db = pParse->db; + AggInfo *pThis = pParse->pAggList; + while( pThis ){ + AggInfo *pNext = pThis->pNext; + agginfoFree(db, pThis); + pThis = pNext; + } + sqlite3DbFree(db, pParse->aLabel); + sqlite3ExprListDelete(db, pParse->pConstExpr); + if( db ){ + assert( db->lookaside.bDisable >= pParse->disableLookaside ); + db->lookaside.bDisable -= pParse->disableLookaside; + db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue; + } + pParse->disableLookaside = 0; +} + +/* +** Compile the UTF-8 encoded SQL statement zSql into a statement handle. +*/ +static int sqlite3Prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + Vdbe *pReprepare, /* VM being reprepared */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + char *zErrMsg = 0; /* Error message */ + int rc = SQLITE_OK; /* Result code */ + int i; /* Loop counter */ + Parse sParse; /* Parsing context */ + + memset(&sParse, 0, PARSE_HDR_SZ); + memset(PARSE_TAIL(&sParse), 0, PARSE_TAIL_SZ); + sParse.pReprepare = pReprepare; + assert( ppStmt && *ppStmt==0 ); + /* assert( !db->mallocFailed ); // not true with SQLITE_USE_ALLOCA */ + assert( sqlite3_mutex_held(db->mutex) ); + + /* For a long-term use prepared statement avoid the use of + ** lookaside memory. + */ + if( prepFlags & SQLITE_PREPARE_PERSISTENT ){ + sParse.disableLookaside++; + DisableLookaside; + } + sParse.disableVtab = (prepFlags & SQLITE_PREPARE_NO_VTAB)!=0; + + /* Check to verify that it is possible to get a read lock on all + ** database schemas. The inability to get a read lock indicates that + ** some other database connection is holding a write-lock, which in + ** turn means that the other connection has made uncommitted changes + ** to the schema. + ** + ** Were we to proceed and prepare the statement against the uncommitted + ** schema changes and if those schema changes are subsequently rolled + ** back and different changes are made in their place, then when this + ** prepared statement goes to run the schema cookie would fail to detect + ** the schema change. Disaster would follow. + ** + ** This thread is currently holding mutexes on all Btrees (because + ** of the sqlite3BtreeEnterAll() in sqlite3LockAndPrepare()) so it + ** is not possible for another thread to start a new schema change + ** while this routine is running. Hence, we do not need to hold + ** locks on the schema, we just need to make sure nobody else is + ** holding them. + ** + ** Note that setting READ_UNCOMMITTED overrides most lock detection, + ** but it does *not* override schema lock detection, so this all still + ** works even if READ_UNCOMMITTED is set. + */ + if( !db->noSharedCache ){ + for(i=0; inDb; i++) { + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + assert( sqlite3BtreeHoldsMutex(pBt) ); + rc = sqlite3BtreeSchemaLocked(pBt); + if( rc ){ + const char *zDb = db->aDb[i].zDbSName; + sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); + testcase( db->flags & SQLITE_ReadUncommit ); + goto end_prepare; + } + } + } + } + + sqlite3VtabUnlockList(db); + + sParse.db = db; + if( nBytes>=0 && (nBytes==0 || zSql[nBytes-1]!=0) ){ + char *zSqlCopy; + int mxLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; + testcase( nBytes==mxLen ); + testcase( nBytes==mxLen+1 ); + if( nBytes>mxLen ){ + sqlite3ErrorWithMsg(db, SQLITE_TOOBIG, "statement too long"); + rc = sqlite3ApiExit(db, SQLITE_TOOBIG); + goto end_prepare; + } + zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes); + if( zSqlCopy ){ + sqlite3RunParser(&sParse, zSqlCopy, &zErrMsg); + sParse.zTail = &zSql[sParse.zTail-zSqlCopy]; + sqlite3DbFree(db, zSqlCopy); + }else{ + sParse.zTail = &zSql[nBytes]; + } + }else{ + sqlite3RunParser(&sParse, zSql, &zErrMsg); + } + assert( 0==sParse.nQueryLoop ); + + if( sParse.rc==SQLITE_DONE ){ + sParse.rc = SQLITE_OK; + } + if( sParse.checkSchema ){ + schemaIsValid(&sParse); + } + if( pzTail ){ + *pzTail = sParse.zTail; + } + + if( db->init.busy==0 ){ + sqlite3VdbeSetSql(sParse.pVdbe, zSql, (int)(sParse.zTail-zSql), prepFlags); + } + if( db->mallocFailed ){ + sParse.rc = SQLITE_NOMEM_BKPT; + } + rc = sParse.rc; + if( rc!=SQLITE_OK ){ + if( sParse.pVdbe ) sqlite3VdbeFinalize(sParse.pVdbe); + assert(!(*ppStmt)); + }else{ + *ppStmt = (sqlite3_stmt*)sParse.pVdbe; + } + + if( zErrMsg ){ + sqlite3ErrorWithMsg(db, rc, "%s", zErrMsg); + sqlite3DbFree(db, zErrMsg); + }else{ + sqlite3Error(db, rc); + } + + /* Delete any TriggerPrg structures allocated while parsing this statement. */ + while( sParse.pTriggerPrg ){ + TriggerPrg *pT = sParse.pTriggerPrg; + sParse.pTriggerPrg = pT->pNext; + sqlite3DbFree(db, pT); + } + +end_prepare: + + sqlite3ParserReset(&sParse); + return rc; +} +static int sqlite3LockAndPrepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + Vdbe *pOld, /* VM being reprepared */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + int cnt = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppStmt==0 ) return SQLITE_MISUSE_BKPT; +#endif + *ppStmt = 0; + if( !sqlite3SafetyCheckOk(db)||zSql==0 ){ + return SQLITE_MISUSE_BKPT; + } + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + do{ + /* Make multiple attempts to compile the SQL, until it either succeeds + ** or encounters a permanent error. A schema problem after one schema + ** reset is considered a permanent error. */ + rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail); + assert( rc==SQLITE_OK || *ppStmt==0 ); + }while( rc==SQLITE_ERROR_RETRY + || (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) ); + sqlite3BtreeLeaveAll(db); + rc = sqlite3ApiExit(db, rc); + assert( (rc&db->errMask)==rc ); + sqlite3_mutex_leave(db->mutex); + return rc; +} + + +/* +** Rerun the compilation of a statement after a schema change. +** +** If the statement is successfully recompiled, return SQLITE_OK. Otherwise, +** if the statement cannot be recompiled because another connection has +** locked the sqlite3_master table, return SQLITE_LOCKED. If any other error +** occurs, return SQLITE_SCHEMA. +*/ +SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){ + int rc; + sqlite3_stmt *pNew; + const char *zSql; + sqlite3 *db; + u8 prepFlags; + + assert( sqlite3_mutex_held(sqlite3VdbeDb(p)->mutex) ); + zSql = sqlite3_sql((sqlite3_stmt *)p); + assert( zSql!=0 ); /* Reprepare only called for prepare_v2() statements */ + db = sqlite3VdbeDb(p); + assert( sqlite3_mutex_held(db->mutex) ); + prepFlags = sqlite3VdbePrepareFlags(p); + rc = sqlite3LockAndPrepare(db, zSql, -1, prepFlags, p, &pNew, 0); + if( rc ){ + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } + assert( pNew==0 ); + return rc; + }else{ + assert( pNew!=0 ); + } + sqlite3VdbeSwap((Vdbe*)pNew, p); + sqlite3TransferBindings(pNew, (sqlite3_stmt*)p); + sqlite3VdbeResetStepResult((Vdbe*)pNew); + sqlite3VdbeFinalize((Vdbe*)pNew); + return SQLITE_OK; +} + + +/* +** Two versions of the official API. Legacy and new use. In the legacy +** version, the original SQL text is not saved in the prepared statement +** and so if a schema change occurs, SQLITE_SCHEMA is returned by +** sqlite3_step(). In the new version, the original SQL text is retained +** and the statement is automatically recompiled if an schema change +** occurs. +*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3LockAndPrepare(db,zSql,nBytes,0,0,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + /* EVIDENCE-OF: R-37923-12173 The sqlite3_prepare_v2() interface works + ** exactly the same as sqlite3_prepare_v3() with a zero prepFlags + ** parameter. + ** + ** Proof in that the 5th parameter to sqlite3LockAndPrepare is 0 */ + rc = sqlite3LockAndPrepare(db,zSql,nBytes,SQLITE_PREPARE_SAVESQL,0, + ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); + return rc; +} +SQLITE_API int sqlite3_prepare_v3( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + /* EVIDENCE-OF: R-56861-42673 sqlite3_prepare_v3() differs from + ** sqlite3_prepare_v2() only in having the extra prepFlags parameter, + ** which is a bit array consisting of zero or more of the + ** SQLITE_PREPARE_* flags. + ** + ** Proof by comparison to the implementation of sqlite3_prepare_v2() + ** directly above. */ + rc = sqlite3LockAndPrepare(db,zSql,nBytes, + SQLITE_PREPARE_SAVESQL|(prepFlags&SQLITE_PREPARE_MASK), + 0,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); + return rc; +} + + +#ifndef SQLITE_OMIT_UTF16 +/* +** Compile the UTF-16 encoded SQL statement zSql into a statement handle. +*/ +static int sqlite3Prepare16( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + /* This function currently works by first transforming the UTF-16 + ** encoded string to UTF-8, then invoking sqlite3_prepare(). The + ** tricky bit is figuring out the pointer to return in *pzTail. + */ + char *zSql8; + const char *zTail8 = 0; + int rc = SQLITE_OK; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppStmt==0 ) return SQLITE_MISUSE_BKPT; +#endif + *ppStmt = 0; + if( !sqlite3SafetyCheckOk(db)||zSql==0 ){ + return SQLITE_MISUSE_BKPT; + } + if( nBytes>=0 ){ + int sz; + const char *z = (const char*)zSql; + for(sz=0; szmutex); + zSql8 = sqlite3Utf16to8(db, zSql, nBytes, SQLITE_UTF16NATIVE); + if( zSql8 ){ + rc = sqlite3LockAndPrepare(db, zSql8, -1, prepFlags, 0, ppStmt, &zTail8); + } + + if( zTail8 && pzTail ){ + /* If sqlite3_prepare returns a tail pointer, we calculate the + ** equivalent pointer into the UTF-16 string by counting the unicode + ** characters between zSql8 and zTail8, and then returning a pointer + ** the same number of characters into the UTF-16 string. + */ + int chars_parsed = sqlite3Utf8CharLen(zSql8, (int)(zTail8-zSql8)); + *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed); + } + sqlite3DbFree(db, zSql8); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Two versions of the official API. Legacy and new use. In the legacy +** version, the original SQL text is not saved in the prepared statement +** and so if a schema change occurs, SQLITE_SCHEMA is returned by +** sqlite3_step(). In the new version, the original SQL text is retained +** and the statement is automatically recompiled if an schema change +** occurs. +*/ +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3Prepare16(db,zSql,nBytes,0,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3Prepare16(db,zSql,nBytes,SQLITE_PREPARE_SAVESQL,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} +SQLITE_API int sqlite3_prepare16_v3( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3Prepare16(db,zSql,nBytes, + SQLITE_PREPARE_SAVESQL|(prepFlags&SQLITE_PREPARE_MASK), + ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} + +#endif /* SQLITE_OMIT_UTF16 */ + +/************** End of prepare.c *********************************************/ +/************** Begin file select.c ******************************************/ +/* +** 2001 September 15 +** +** 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 C code routines that are called by the parser +** to handle SELECT statements in SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* +** Trace output macros +*/ +#if SELECTTRACE_ENABLED +/***/ int sqlite3SelectTrace = 0; +# define SELECTTRACE(K,P,S,X) \ + if(sqlite3SelectTrace&(K)) \ + sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\ + sqlite3DebugPrintf X +#else +# define SELECTTRACE(K,P,S,X) +#endif + + +/* +** An instance of the following object is used to record information about +** how to process the DISTINCT keyword, to simplify passing that information +** into the selectInnerLoop() routine. +*/ +typedef struct DistinctCtx DistinctCtx; +struct DistinctCtx { + u8 isTnct; /* True if the DISTINCT keyword is present */ + u8 eTnctType; /* One of the WHERE_DISTINCT_* operators */ + int tabTnct; /* Ephemeral table used for DISTINCT processing */ + int addrTnct; /* Address of OP_OpenEphemeral opcode for tabTnct */ +}; + +/* +** An instance of the following object is used to record information about +** the ORDER BY (or GROUP BY) clause of query is being coded. +** +** The aDefer[] array is used by the sorter-references optimization. For +** example, assuming there is no index that can be used for the ORDER BY, +** for the query: +** +** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10; +** +** it may be more efficient to add just the "a" values to the sorter, and +** retrieve the associated "bigblob" values directly from table t1 as the +** 10 smallest "a" values are extracted from the sorter. +** +** When the sorter-reference optimization is used, there is one entry in the +** aDefer[] array for each database table that may be read as values are +** extracted from the sorter. +*/ +typedef struct SortCtx SortCtx; +struct SortCtx { + ExprList *pOrderBy; /* The ORDER BY (or GROUP BY clause) */ + int nOBSat; /* Number of ORDER BY terms satisfied by indices */ + int iECursor; /* Cursor number for the sorter */ + int regReturn; /* Register holding block-output return address */ + int labelBkOut; /* Start label for the block-output subroutine */ + int addrSortIndex; /* Address of the OP_SorterOpen or OP_OpenEphemeral */ + int labelDone; /* Jump here when done, ex: LIMIT reached */ + int labelOBLopt; /* Jump here when sorter is full */ + u8 sortFlags; /* Zero or more SORTFLAG_* bits */ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + u8 nDefer; /* Number of valid entries in aDefer[] */ + struct DeferredCsr { + Table *pTab; /* Table definition */ + int iCsr; /* Cursor number for table */ + int nKey; /* Number of PK columns for table pTab (>=1) */ + } aDefer[4]; +#endif + struct RowLoadInfo *pDeferredRowLoad; /* Deferred row loading info or NULL */ +}; +#define SORTFLAG_UseSorter 0x01 /* Use SorterOpen instead of OpenEphemeral */ + +/* +** Delete all the content of a Select structure. Deallocate the structure +** itself depending on the value of bFree +** +** If bFree==1, call sqlite3DbFree() on the p object. +** If bFree==0, Leave the first Select object unfreed +*/ +static void clearSelect(sqlite3 *db, Select *p, int bFree){ + while( p ){ + Select *pPrior = p->pPrior; + sqlite3ExprListDelete(db, p->pEList); + sqlite3SrcListDelete(db, p->pSrc); + sqlite3ExprDelete(db, p->pWhere); + sqlite3ExprListDelete(db, p->pGroupBy); + sqlite3ExprDelete(db, p->pHaving); + sqlite3ExprListDelete(db, p->pOrderBy); + sqlite3ExprDelete(db, p->pLimit); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( OK_IF_ALWAYS_TRUE(p->pWinDefn) ){ + sqlite3WindowListDelete(db, p->pWinDefn); + } +#endif + if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith); + if( bFree ) sqlite3DbFreeNN(db, p); + p = pPrior; + bFree = 1; + } +} + +/* +** Initialize a SelectDest structure. +*/ +SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){ + pDest->eDest = (u8)eDest; + pDest->iSDParm = iParm; + pDest->zAffSdst = 0; + pDest->iSdst = 0; + pDest->nSdst = 0; +} + + +/* +** Allocate a new Select structure and return a pointer to that +** structure. +*/ +SQLITE_PRIVATE Select *sqlite3SelectNew( + Parse *pParse, /* Parsing context */ + ExprList *pEList, /* which columns to include in the result */ + SrcList *pSrc, /* the FROM clause -- which tables to scan */ + Expr *pWhere, /* the WHERE clause */ + ExprList *pGroupBy, /* the GROUP BY clause */ + Expr *pHaving, /* the HAVING clause */ + ExprList *pOrderBy, /* the ORDER BY clause */ + u32 selFlags, /* Flag parameters, such as SF_Distinct */ + Expr *pLimit /* LIMIT value. NULL means not used */ +){ + Select *pNew; + Select standin; + pNew = sqlite3DbMallocRawNN(pParse->db, sizeof(*pNew) ); + if( pNew==0 ){ + assert( pParse->db->mallocFailed ); + pNew = &standin; + } + if( pEList==0 ){ + pEList = sqlite3ExprListAppend(pParse, 0, + sqlite3Expr(pParse->db,TK_ASTERISK,0)); + } + pNew->pEList = pEList; + pNew->op = TK_SELECT; + pNew->selFlags = selFlags; + pNew->iLimit = 0; + pNew->iOffset = 0; + pNew->selId = ++pParse->nSelect; + pNew->addrOpenEphm[0] = -1; + pNew->addrOpenEphm[1] = -1; + pNew->nSelectRow = 0; + if( pSrc==0 ) pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*pSrc)); + pNew->pSrc = pSrc; + pNew->pWhere = pWhere; + pNew->pGroupBy = pGroupBy; + pNew->pHaving = pHaving; + pNew->pOrderBy = pOrderBy; + pNew->pPrior = 0; + pNew->pNext = 0; + pNew->pLimit = pLimit; + pNew->pWith = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + pNew->pWin = 0; + pNew->pWinDefn = 0; +#endif + if( pParse->db->mallocFailed ) { + clearSelect(pParse->db, pNew, pNew!=&standin); + pNew = 0; + }else{ + assert( pNew->pSrc!=0 || pParse->nErr>0 ); + } + assert( pNew!=&standin ); + return pNew; +} + + +/* +** Delete the given Select structure and all of its substructures. +*/ +SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3 *db, Select *p){ + if( OK_IF_ALWAYS_TRUE(p) ) clearSelect(db, p, 1); +} + +/* +** Delete all the substructure for p, but keep p allocated. Redefine +** p to be a single SELECT where every column of the result set has a +** value of NULL. +*/ +SQLITE_PRIVATE void sqlite3SelectReset(Parse *pParse, Select *p){ + if( ALWAYS(p) ){ + clearSelect(pParse->db, p, 0); + memset(&p->iLimit, 0, sizeof(Select) - offsetof(Select,iLimit)); + p->pEList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(pParse->db,TK_NULL,0,0)); + p->pSrc = sqlite3DbMallocZero(pParse->db, sizeof(SrcList)); + } +} + +/* +** Return a pointer to the right-most SELECT statement in a compound. +*/ +static Select *findRightmost(Select *p){ + while( p->pNext ) p = p->pNext; + return p; +} + +/* +** Given 1 to 3 identifiers preceding the JOIN keyword, determine the +** type of join. Return an integer constant that expresses that type +** in terms of the following bit values: +** +** JT_INNER +** JT_CROSS +** JT_OUTER +** JT_NATURAL +** JT_LEFT +** JT_RIGHT +** +** A full outer join is the combination of JT_LEFT and JT_RIGHT. +** +** If an illegal or unsupported join type is seen, then still return +** a join type, but put an error in the pParse structure. +*/ +SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ + int jointype = 0; + Token *apAll[3]; + Token *p; + /* 0123456789 123456789 123456789 123 */ + static const char zKeyText[] = "naturaleftouterightfullinnercross"; + static const struct { + u8 i; /* Beginning of keyword text in zKeyText[] */ + u8 nChar; /* Length of the keyword in characters */ + u8 code; /* Join type mask */ + } aKeyword[] = { + /* natural */ { 0, 7, JT_NATURAL }, + /* left */ { 6, 4, JT_LEFT|JT_OUTER }, + /* outer */ { 10, 5, JT_OUTER }, + /* right */ { 14, 5, JT_RIGHT|JT_OUTER }, + /* full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER }, + /* inner */ { 23, 5, JT_INNER }, + /* cross */ { 28, 5, JT_INNER|JT_CROSS }, + }; + int i, j; + apAll[0] = pA; + apAll[1] = pB; + apAll[2] = pC; + for(i=0; i<3 && apAll[i]; i++){ + p = apAll[i]; + for(j=0; jn==aKeyword[j].nChar + && sqlite3StrNICmp((char*)p->z, &zKeyText[aKeyword[j].i], p->n)==0 ){ + jointype |= aKeyword[j].code; + break; + } + } + testcase( j==0 || j==1 || j==2 || j==3 || j==4 || j==5 || j==6 ); + if( j>=ArraySize(aKeyword) ){ + jointype |= JT_ERROR; + break; + } + } + if( + (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) || + (jointype & JT_ERROR)!=0 + ){ + const char *zSp = " "; + assert( pB!=0 ); + if( pC==0 ){ zSp++; } + sqlite3ErrorMsg(pParse, "unknown or unsupported join type: " + "%T %T%s%T", pA, pB, zSp, pC); + jointype = JT_INNER; + }else if( (jointype & JT_OUTER)!=0 + && (jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ){ + sqlite3ErrorMsg(pParse, + "RIGHT and FULL OUTER JOINs are not currently supported"); + jointype = JT_INNER; + } + return jointype; +} + +/* +** Return the index of a column in a table. Return -1 if the column +** is not contained in the table. +*/ +static int columnIndex(Table *pTab, const char *zCol){ + int i; + for(i=0; inCol; i++){ + if( sqlite3StrICmp(pTab->aCol[i].zName, zCol)==0 ) return i; + } + return -1; +} + +/* +** Search the first N tables in pSrc, from left to right, looking for a +** table that has a column named zCol. +** +** When found, set *piTab and *piCol to the table index and column index +** of the matching column and return TRUE. +** +** If not found, return FALSE. +*/ +static int tableAndColumnIndex( + SrcList *pSrc, /* Array of tables to search */ + int N, /* Number of tables in pSrc->a[] to search */ + const char *zCol, /* Name of the column we are looking for */ + int *piTab, /* Write index of pSrc->a[] here */ + int *piCol, /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ + int bIgnoreHidden /* True to ignore hidden columns */ +){ + int i; /* For looping over tables in pSrc */ + int iCol; /* Index of column matching zCol */ + + assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */ + for(i=0; ia[i].pTab, zCol); + if( iCol>=0 + && (bIgnoreHidden==0 || IsHiddenColumn(&pSrc->a[i].pTab->aCol[iCol])==0) + ){ + if( piTab ){ + *piTab = i; + *piCol = iCol; + } + return 1; + } + } + return 0; +} + +/* +** This function is used to add terms implied by JOIN syntax to the +** WHERE clause expression of a SELECT statement. The new term, which +** is ANDed with the existing WHERE clause, is of the form: +** +** (tab1.col1 = tab2.col2) +** +** where tab1 is the iSrc'th table in SrcList pSrc and tab2 is the +** (iSrc+1)'th. Column col1 is column iColLeft of tab1, and col2 is +** column iColRight of tab2. +*/ +static void addWhereTerm( + Parse *pParse, /* Parsing context */ + SrcList *pSrc, /* List of tables in FROM clause */ + int iLeft, /* Index of first table to join in pSrc */ + int iColLeft, /* Index of column in first table */ + int iRight, /* Index of second table in pSrc */ + int iColRight, /* Index of column in second table */ + int isOuterJoin, /* True if this is an OUTER join */ + Expr **ppWhere /* IN/OUT: The WHERE clause to add to */ +){ + sqlite3 *db = pParse->db; + Expr *pE1; + Expr *pE2; + Expr *pEq; + + assert( iLeftnSrc>iRight ); + assert( pSrc->a[iLeft].pTab ); + assert( pSrc->a[iRight].pTab ); + + pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iColLeft); + pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight); + + pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2); + if( pEq && isOuterJoin ){ + ExprSetProperty(pEq, EP_FromJoin); + assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(pEq, EP_NoReduce); + pEq->iRightJoinTable = (i16)pE2->iTable; + } + *ppWhere = sqlite3ExprAnd(pParse, *ppWhere, pEq); +} + +/* +** Set the EP_FromJoin property on all terms of the given expression. +** And set the Expr.iRightJoinTable to iTable for every term in the +** expression. +** +** The EP_FromJoin property is used on terms of an expression to tell +** the LEFT OUTER JOIN processing logic that this term is part of the +** join restriction specified in the ON or USING clause and not a part +** of the more general WHERE clause. These terms are moved over to the +** WHERE clause during join processing but we need to remember that they +** originated in the ON or USING clause. +** +** The Expr.iRightJoinTable tells the WHERE clause processing that the +** expression depends on table iRightJoinTable even if that table is not +** explicitly mentioned in the expression. That information is needed +** for cases like this: +** +** SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.b AND t1.x=5 +** +** The where clause needs to defer the handling of the t1.x=5 +** term until after the t2 loop of the join. In that way, a +** NULL t2 row will be inserted whenever t1.x!=5. If we do not +** defer the handling of t1.x=5, it will be processed immediately +** after the t1 loop and rows with t1.x!=5 will never appear in +** the output, which is incorrect. +*/ +SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable){ + while( p ){ + ExprSetProperty(p, EP_FromJoin); + assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(p, EP_NoReduce); + p->iRightJoinTable = (i16)iTable; + if( p->op==TK_FUNCTION && p->x.pList ){ + int i; + for(i=0; ix.pList->nExpr; i++){ + sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable); + } + } + sqlite3SetJoinExpr(p->pLeft, iTable); + p = p->pRight; + } +} + +/* Undo the work of sqlite3SetJoinExpr(). In the expression p, convert every +** term that is marked with EP_FromJoin and iRightJoinTable==iTable into +** an ordinary term that omits the EP_FromJoin mark. +** +** This happens when a LEFT JOIN is simplified into an ordinary JOIN. +*/ +static void unsetJoinExpr(Expr *p, int iTable){ + while( p ){ + if( ExprHasProperty(p, EP_FromJoin) + && (iTable<0 || p->iRightJoinTable==iTable) ){ + ExprClearProperty(p, EP_FromJoin); + } + if( p->op==TK_FUNCTION && p->x.pList ){ + int i; + for(i=0; ix.pList->nExpr; i++){ + unsetJoinExpr(p->x.pList->a[i].pExpr, iTable); + } + } + unsetJoinExpr(p->pLeft, iTable); + p = p->pRight; + } +} + +/* +** This routine processes the join information for a SELECT statement. +** ON and USING clauses are converted into extra terms of the WHERE clause. +** NATURAL joins also create extra WHERE clause terms. +** +** The terms of a FROM clause are contained in the Select.pSrc structure. +** The left most table is the first entry in Select.pSrc. The right-most +** table is the last entry. The join operator is held in the entry to +** the left. Thus entry 0 contains the join operator for the join between +** entries 0 and 1. Any ON or USING clauses associated with the join are +** also attached to the left entry. +** +** This routine returns the number of errors encountered. +*/ +static int sqliteProcessJoin(Parse *pParse, Select *p){ + SrcList *pSrc; /* All tables in the FROM clause */ + int i, j; /* Loop counters */ + struct SrcList_item *pLeft; /* Left table being joined */ + struct SrcList_item *pRight; /* Right table being joined */ + + pSrc = p->pSrc; + pLeft = &pSrc->a[0]; + pRight = &pLeft[1]; + for(i=0; inSrc-1; i++, pRight++, pLeft++){ + Table *pRightTab = pRight->pTab; + int isOuter; + + if( NEVER(pLeft->pTab==0 || pRightTab==0) ) continue; + isOuter = (pRight->fg.jointype & JT_OUTER)!=0; + + /* When the NATURAL keyword is present, add WHERE clause terms for + ** every column that the two tables have in common. + */ + if( pRight->fg.jointype & JT_NATURAL ){ + if( pRight->pOn || pRight->pUsing ){ + sqlite3ErrorMsg(pParse, "a NATURAL join may not have " + "an ON or USING clause", 0); + return 1; + } + for(j=0; jnCol; j++){ + char *zName; /* Name of column in the right table */ + int iLeft; /* Matching left table */ + int iLeftCol; /* Matching column in the left table */ + + if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue; + zName = pRightTab->aCol[j].zName; + if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 1) ){ + addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j, + isOuter, &p->pWhere); + } + } + } + + /* Disallow both ON and USING clauses in the same join + */ + if( pRight->pOn && pRight->pUsing ){ + sqlite3ErrorMsg(pParse, "cannot have both ON and USING " + "clauses in the same join"); + return 1; + } + + /* Add the ON clause to the end of the WHERE clause, connected by + ** an AND operator. + */ + if( pRight->pOn ){ + if( isOuter ) sqlite3SetJoinExpr(pRight->pOn, pRight->iCursor); + p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->pOn); + pRight->pOn = 0; + } + + /* Create extra terms on the WHERE clause for each column named + ** in the USING clause. Example: If the two tables to be joined are + ** A and B and the USING clause names X, Y, and Z, then add this + ** to the WHERE clause: A.X=B.X AND A.Y=B.Y AND A.Z=B.Z + ** Report an error if any column mentioned in the USING clause is + ** not contained in both tables to be joined. + */ + if( pRight->pUsing ){ + IdList *pList = pRight->pUsing; + for(j=0; jnId; j++){ + char *zName; /* Name of the term in the USING clause */ + int iLeft; /* Table on the left with matching column name */ + int iLeftCol; /* Column number of matching column on the left */ + int iRightCol; /* Column number of matching column on the right */ + + zName = pList->a[j].zName; + iRightCol = columnIndex(pRightTab, zName); + if( iRightCol<0 + || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 0) + ){ + sqlite3ErrorMsg(pParse, "cannot join using column %s - column " + "not present in both tables", zName); + return 1; + } + addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, iRightCol, + isOuter, &p->pWhere); + } + } + } + return 0; +} + +/* +** An instance of this object holds information (beyond pParse and pSelect) +** needed to load the next result row that is to be added to the sorter. +*/ +typedef struct RowLoadInfo RowLoadInfo; +struct RowLoadInfo { + int regResult; /* Store results in array of registers here */ + u8 ecelFlags; /* Flag argument to ExprCodeExprList() */ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + ExprList *pExtra; /* Extra columns needed by sorter refs */ + int regExtraResult; /* Where to load the extra columns */ +#endif +}; + +/* +** This routine does the work of loading query data into an array of +** registers so that it can be added to the sorter. +*/ +static void innerLoopLoadRow( + Parse *pParse, /* Statement under construction */ + Select *pSelect, /* The query being coded */ + RowLoadInfo *pInfo /* Info needed to complete the row load */ +){ + sqlite3ExprCodeExprList(pParse, pSelect->pEList, pInfo->regResult, + 0, pInfo->ecelFlags); +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( pInfo->pExtra ){ + sqlite3ExprCodeExprList(pParse, pInfo->pExtra, pInfo->regExtraResult, 0, 0); + sqlite3ExprListDelete(pParse->db, pInfo->pExtra); + } +#endif +} + +/* +** Code the OP_MakeRecord instruction that generates the entry to be +** added into the sorter. +** +** Return the register in which the result is stored. +*/ +static int makeSorterRecord( + Parse *pParse, + SortCtx *pSort, + Select *pSelect, + int regBase, + int nBase +){ + int nOBSat = pSort->nOBSat; + Vdbe *v = pParse->pVdbe; + int regOut = ++pParse->nMem; + if( pSort->pDeferredRowLoad ){ + innerLoopLoadRow(pParse, pSelect, pSort->pDeferredRowLoad); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regOut); + return regOut; +} + +/* +** Generate code that will push the record in registers regData +** through regData+nData-1 onto the sorter. +*/ +static void pushOntoSorter( + Parse *pParse, /* Parser context */ + SortCtx *pSort, /* Information about the ORDER BY clause */ + Select *pSelect, /* The whole SELECT statement */ + int regData, /* First register holding data to be sorted */ + int regOrigData, /* First register holding data before packing */ + int nData, /* Number of elements in the regData data array */ + int nPrefixReg /* No. of reg prior to regData available for use */ +){ + Vdbe *v = pParse->pVdbe; /* Stmt under construction */ + int bSeq = ((pSort->sortFlags & SORTFLAG_UseSorter)==0); + int nExpr = pSort->pOrderBy->nExpr; /* No. of ORDER BY terms */ + int nBase = nExpr + bSeq + nData; /* Fields in sorter record */ + int regBase; /* Regs for sorter record */ + int regRecord = 0; /* Assembled sorter record */ + int nOBSat = pSort->nOBSat; /* ORDER BY terms to skip */ + int op; /* Opcode to add sorter record to sorter */ + int iLimit; /* LIMIT counter */ + int iSkip = 0; /* End of the sorter insert loop */ + + assert( bSeq==0 || bSeq==1 ); + + /* Three cases: + ** (1) The data to be sorted has already been packed into a Record + ** by a prior OP_MakeRecord. In this case nData==1 and regData + ** will be completely unrelated to regOrigData. + ** (2) All output columns are included in the sort record. In that + ** case regData==regOrigData. + ** (3) Some output columns are omitted from the sort record due to + ** the SQLITE_ENABLE_SORTER_REFERENCE optimization, or due to the + ** SQLITE_ECEL_OMITREF optimization, or due to the + ** SortCtx.pDeferredRowLoad optimiation. In any of these cases + ** regOrigData is 0 to prevent this routine from trying to copy + ** values that might not yet exist. + */ + assert( nData==1 || regData==regOrigData || regOrigData==0 ); + + if( nPrefixReg ){ + assert( nPrefixReg==nExpr+bSeq ); + regBase = regData - nPrefixReg; + }else{ + regBase = pParse->nMem + 1; + pParse->nMem += nBase; + } + assert( pSelect->iOffset==0 || pSelect->iLimit!=0 ); + iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit; + pSort->labelDone = sqlite3VdbeMakeLabel(pParse); + sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData, + SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0)); + if( bSeq ){ + sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr); + } + if( nPrefixReg==0 && nData>0 ){ + sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+bSeq, nData); + } + if( nOBSat>0 ){ + int regPrevKey; /* The first nOBSat columns of the previous row */ + int addrFirst; /* Address of the OP_IfNot opcode */ + int addrJmp; /* Address of the OP_Jump opcode */ + VdbeOp *pOp; /* Opcode that opens the sorter */ + int nKey; /* Number of sorting key columns, including OP_Sequence */ + KeyInfo *pKI; /* Original KeyInfo on the sorter table */ + + regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase); + regPrevKey = pParse->nMem+1; + pParse->nMem += pSort->nOBSat; + nKey = nExpr - pSort->nOBSat + bSeq; + if( bSeq ){ + addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr); + }else{ + addrFirst = sqlite3VdbeAddOp1(v, OP_SequenceTest, pSort->iECursor); + } + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Compare, regPrevKey, regBase, pSort->nOBSat); + pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); + if( pParse->db->mallocFailed ) return; + pOp->p2 = nKey + nData; + pKI = pOp->p4.pKeyInfo; + memset(pKI->aSortFlags, 0, pKI->nKeyField); /* Makes OP_Jump testable */ + sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO); + testcase( pKI->nAllField > pKI->nKeyField+2 ); + pOp->p4.pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pSort->pOrderBy,nOBSat, + pKI->nAllField-pKI->nKeyField-1); + pOp = 0; /* Ensure pOp not used after sqltie3VdbeAddOp3() */ + addrJmp = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); + pSort->labelBkOut = sqlite3VdbeMakeLabel(pParse); + pSort->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); + sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor); + if( iLimit ){ + sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, pSort->labelDone); + VdbeCoverage(v); + } + sqlite3VdbeJumpHere(v, addrFirst); + sqlite3ExprCodeMove(pParse, regBase, regPrevKey, pSort->nOBSat); + sqlite3VdbeJumpHere(v, addrJmp); + } + if( iLimit ){ + /* At this point the values for the new sorter entry are stored + ** in an array of registers. They need to be composed into a record + ** and inserted into the sorter if either (a) there are currently + ** less than LIMIT+OFFSET items or (b) the new record is smaller than + ** the largest record currently in the sorter. If (b) is true and there + ** are already LIMIT+OFFSET items in the sorter, delete the largest + ** entry before inserting the new one. This way there are never more + ** than LIMIT+OFFSET items in the sorter. + ** + ** If the new record does not need to be inserted into the sorter, + ** jump to the next iteration of the loop. If the pSort->labelOBLopt + ** value is not zero, then it is a label of where to jump. Otherwise, + ** just bypass the row insert logic. See the header comment on the + ** sqlite3WhereOrderByLimitOptLabel() function for additional info. + */ + int iCsr = pSort->iECursor; + sqlite3VdbeAddOp2(v, OP_IfNotZero, iLimit, sqlite3VdbeCurrentAddr(v)+4); + VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Last, iCsr, 0); + iSkip = sqlite3VdbeAddOp4Int(v, OP_IdxLE, + iCsr, 0, regBase+nOBSat, nExpr-nOBSat); + VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_Delete, iCsr); + } + if( regRecord==0 ){ + regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase); + } + if( pSort->sortFlags & SORTFLAG_UseSorter ){ + op = OP_SorterInsert; + }else{ + op = OP_IdxInsert; + } + sqlite3VdbeAddOp4Int(v, op, pSort->iECursor, regRecord, + regBase+nOBSat, nBase-nOBSat); + if( iSkip ){ + sqlite3VdbeChangeP2(v, iSkip, + pSort->labelOBLopt ? pSort->labelOBLopt : sqlite3VdbeCurrentAddr(v)); + } +} + +/* +** Add code to implement the OFFSET +*/ +static void codeOffset( + Vdbe *v, /* Generate code into this VM */ + int iOffset, /* Register holding the offset counter */ + int iContinue /* Jump here to skip the current record */ +){ + if( iOffset>0 ){ + sqlite3VdbeAddOp3(v, OP_IfPos, iOffset, iContinue, 1); VdbeCoverage(v); + VdbeComment((v, "OFFSET")); + } +} + +/* +** Add code that will check to make sure the N registers starting at iMem +** form a distinct entry. iTab is a sorting index that holds previously +** seen combinations of the N values. A new entry is made in iTab +** if the current N values are new. +** +** A jump to addrRepeat is made and the N+1 values are popped from the +** stack if the top N elements are not distinct. +*/ +static void codeDistinct( + Parse *pParse, /* Parsing and code generating context */ + int iTab, /* A sorting index used to test for distinctness */ + int addrRepeat, /* Jump to here if not distinct */ + int N, /* Number of elements */ + int iMem /* First element */ +){ + Vdbe *v; + int r1; + + v = pParse->pVdbe; + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, iMem, N, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r1, iMem, N); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + sqlite3ReleaseTempReg(pParse, r1); +} + +#ifdef SQLITE_ENABLE_SORTER_REFERENCES +/* +** This function is called as part of inner-loop generation for a SELECT +** statement with an ORDER BY that is not optimized by an index. It +** determines the expressions, if any, that the sorter-reference +** optimization should be used for. The sorter-reference optimization +** is used for SELECT queries like: +** +** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10 +** +** If the optimization is used for expression "bigblob", then instead of +** storing values read from that column in the sorter records, the PK of +** the row from table t1 is stored instead. Then, as records are extracted from +** the sorter to return to the user, the required value of bigblob is +** retrieved directly from table t1. If the values are very large, this +** can be more efficient than storing them directly in the sorter records. +** +** The ExprList_item.bSorterRef flag is set for each expression in pEList +** for which the sorter-reference optimization should be enabled. +** Additionally, the pSort->aDefer[] array is populated with entries +** for all cursors required to evaluate all selected expressions. Finally. +** output variable (*ppExtra) is set to an expression list containing +** expressions for all extra PK values that should be stored in the +** sorter records. +*/ +static void selectExprDefer( + Parse *pParse, /* Leave any error here */ + SortCtx *pSort, /* Sorter context */ + ExprList *pEList, /* Expressions destined for sorter */ + ExprList **ppExtra /* Expressions to append to sorter record */ +){ + int i; + int nDefer = 0; + ExprList *pExtra = 0; + for(i=0; inExpr; i++){ + struct ExprList_item *pItem = &pEList->a[i]; + if( pItem->u.x.iOrderByCol==0 ){ + Expr *pExpr = pItem->pExpr; + Table *pTab = pExpr->y.pTab; + if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab) + && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF) + ){ + int j; + for(j=0; jaDefer[j].iCsr==pExpr->iTable ) break; + } + if( j==nDefer ){ + if( nDefer==ArraySize(pSort->aDefer) ){ + continue; + }else{ + int nKey = 1; + int k; + Index *pPk = 0; + if( !HasRowid(pTab) ){ + pPk = sqlite3PrimaryKeyIndex(pTab); + nKey = pPk->nKeyCol; + } + for(k=0; kiTable = pExpr->iTable; + pNew->y.pTab = pExpr->y.pTab; + pNew->iColumn = pPk ? pPk->aiColumn[k] : -1; + pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew); + } + } + pSort->aDefer[nDefer].pTab = pExpr->y.pTab; + pSort->aDefer[nDefer].iCsr = pExpr->iTable; + pSort->aDefer[nDefer].nKey = nKey; + nDefer++; + } + } + pItem->bSorterRef = 1; + } + } + } + pSort->nDefer = (u8)nDefer; + *ppExtra = pExtra; +} +#endif + +/* +** This routine generates the code for the inside of the inner loop +** of a SELECT. +** +** If srcTab is negative, then the p->pEList expressions +** are evaluated in order to get the data for this row. If srcTab is +** zero or more, then data is pulled from srcTab and p->pEList is used only +** to get the number of columns and the collation sequence for each column. +*/ +static void selectInnerLoop( + Parse *pParse, /* The parser context */ + Select *p, /* The complete select statement being coded */ + int srcTab, /* Pull data from this table if non-negative */ + SortCtx *pSort, /* If not NULL, info on how to process ORDER BY */ + DistinctCtx *pDistinct, /* If not NULL, info on how to process DISTINCT */ + SelectDest *pDest, /* How to dispose of the results */ + int iContinue, /* Jump here to continue with next row */ + int iBreak /* Jump here to break out of the inner loop */ +){ + Vdbe *v = pParse->pVdbe; + int i; + int hasDistinct; /* True if the DISTINCT keyword is present */ + int eDest = pDest->eDest; /* How to dispose of results */ + int iParm = pDest->iSDParm; /* First argument to disposal method */ + int nResultCol; /* Number of result columns */ + int nPrefixReg = 0; /* Number of extra registers before regResult */ + RowLoadInfo sRowLoadInfo; /* Info for deferred row loading */ + + /* Usually, regResult is the first cell in an array of memory cells + ** containing the current result row. In this case regOrig is set to the + ** same value. However, if the results are being sent to the sorter, the + ** values for any expressions that are also part of the sort-key are omitted + ** from this array. In this case regOrig is set to zero. */ + int regResult; /* Start of memory holding current results */ + int regOrig; /* Start of memory holding full result (or 0) */ + + assert( v ); + assert( p->pEList!=0 ); + hasDistinct = pDistinct ? pDistinct->eTnctType : WHERE_DISTINCT_NOOP; + if( pSort && pSort->pOrderBy==0 ) pSort = 0; + if( pSort==0 && !hasDistinct ){ + assert( iContinue!=0 ); + codeOffset(v, p->iOffset, iContinue); + } + + /* Pull the requested columns. + */ + nResultCol = p->pEList->nExpr; + + if( pDest->iSdst==0 ){ + if( pSort ){ + nPrefixReg = pSort->pOrderBy->nExpr; + if( !(pSort->sortFlags & SORTFLAG_UseSorter) ) nPrefixReg++; + pParse->nMem += nPrefixReg; + } + pDest->iSdst = pParse->nMem+1; + pParse->nMem += nResultCol; + }else if( pDest->iSdst+nResultCol > pParse->nMem ){ + /* This is an error condition that can result, for example, when a SELECT + ** on the right-hand side of an INSERT contains more result columns than + ** there are columns in the table on the left. The error will be caught + ** and reported later. But we need to make sure enough memory is allocated + ** to avoid other spurious errors in the meantime. */ + pParse->nMem += nResultCol; + } + pDest->nSdst = nResultCol; + regOrig = regResult = pDest->iSdst; + if( srcTab>=0 ){ + for(i=0; ipEList->a[i].zEName)); + } + }else if( eDest!=SRT_Exists ){ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + ExprList *pExtra = 0; +#endif + /* If the destination is an EXISTS(...) expression, the actual + ** values returned by the SELECT are not required. + */ + u8 ecelFlags; /* "ecel" is an abbreviation of "ExprCodeExprList" */ + ExprList *pEList; + if( eDest==SRT_Mem || eDest==SRT_Output || eDest==SRT_Coroutine ){ + ecelFlags = SQLITE_ECEL_DUP; + }else{ + ecelFlags = 0; + } + if( pSort && hasDistinct==0 && eDest!=SRT_EphemTab && eDest!=SRT_Table ){ + /* For each expression in p->pEList that is a copy of an expression in + ** the ORDER BY clause (pSort->pOrderBy), set the associated + ** iOrderByCol value to one more than the index of the ORDER BY + ** expression within the sort-key that pushOntoSorter() will generate. + ** This allows the p->pEList field to be omitted from the sorted record, + ** saving space and CPU cycles. */ + ecelFlags |= (SQLITE_ECEL_OMITREF|SQLITE_ECEL_REF); + + for(i=pSort->nOBSat; ipOrderBy->nExpr; i++){ + int j; + if( (j = pSort->pOrderBy->a[i].u.x.iOrderByCol)>0 ){ + p->pEList->a[j-1].u.x.iOrderByCol = i+1-pSort->nOBSat; + } + } +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + selectExprDefer(pParse, pSort, p->pEList, &pExtra); + if( pExtra && pParse->db->mallocFailed==0 ){ + /* If there are any extra PK columns to add to the sorter records, + ** allocate extra memory cells and adjust the OpenEphemeral + ** instruction to account for the larger records. This is only + ** required if there are one or more WITHOUT ROWID tables with + ** composite primary keys in the SortCtx.aDefer[] array. */ + VdbeOp *pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); + pOp->p2 += (pExtra->nExpr - pSort->nDefer); + pOp->p4.pKeyInfo->nAllField += (pExtra->nExpr - pSort->nDefer); + pParse->nMem += pExtra->nExpr; + } +#endif + + /* Adjust nResultCol to account for columns that are omitted + ** from the sorter by the optimizations in this branch */ + pEList = p->pEList; + for(i=0; inExpr; i++){ + if( pEList->a[i].u.x.iOrderByCol>0 +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + || pEList->a[i].bSorterRef +#endif + ){ + nResultCol--; + regOrig = 0; + } + } + + testcase( regOrig ); + testcase( eDest==SRT_Set ); + testcase( eDest==SRT_Mem ); + testcase( eDest==SRT_Coroutine ); + testcase( eDest==SRT_Output ); + assert( eDest==SRT_Set || eDest==SRT_Mem + || eDest==SRT_Coroutine || eDest==SRT_Output ); + } + sRowLoadInfo.regResult = regResult; + sRowLoadInfo.ecelFlags = ecelFlags; +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + sRowLoadInfo.pExtra = pExtra; + sRowLoadInfo.regExtraResult = regResult + nResultCol; + if( pExtra ) nResultCol += pExtra->nExpr; +#endif + if( p->iLimit + && (ecelFlags & SQLITE_ECEL_OMITREF)!=0 + && nPrefixReg>0 + ){ + assert( pSort!=0 ); + assert( hasDistinct==0 ); + pSort->pDeferredRowLoad = &sRowLoadInfo; + regOrig = 0; + }else{ + innerLoopLoadRow(pParse, p, &sRowLoadInfo); + } + } + + /* If the DISTINCT keyword was present on the SELECT statement + ** and this row has been seen before, then do not make this row + ** part of the result. + */ + if( hasDistinct ){ + switch( pDistinct->eTnctType ){ + case WHERE_DISTINCT_ORDERED: { + VdbeOp *pOp; /* No longer required OpenEphemeral instr. */ + int iJump; /* Jump destination */ + int regPrev; /* Previous row content */ + + /* Allocate space for the previous row */ + regPrev = pParse->nMem+1; + pParse->nMem += nResultCol; + + /* Change the OP_OpenEphemeral coded earlier to an OP_Null + ** sets the MEM_Cleared bit on the first register of the + ** previous value. This will cause the OP_Ne below to always + ** fail on the first iteration of the loop even if the first + ** row is all NULLs. + */ + sqlite3VdbeChangeToNoop(v, pDistinct->addrTnct); + pOp = sqlite3VdbeGetOp(v, pDistinct->addrTnct); + pOp->opcode = OP_Null; + pOp->p1 = 1; + pOp->p2 = regPrev; + pOp = 0; /* Ensure pOp is not used after sqlite3VdbeAddOp() */ + + iJump = sqlite3VdbeCurrentAddr(v) + nResultCol; + for(i=0; ipEList->a[i].pExpr); + if( idb->mallocFailed ); + sqlite3VdbeAddOp3(v, OP_Copy, regResult, regPrev, nResultCol-1); + break; + } + + case WHERE_DISTINCT_UNIQUE: { + sqlite3VdbeChangeToNoop(v, pDistinct->addrTnct); + break; + } + + default: { + assert( pDistinct->eTnctType==WHERE_DISTINCT_UNORDERED ); + codeDistinct(pParse, pDistinct->tabTnct, iContinue, nResultCol, + regResult); + break; + } + } + if( pSort==0 ){ + codeOffset(v, p->iOffset, iContinue); + } + } + + switch( eDest ){ + /* In this mode, write each query result to the key of the temporary + ** table iParm. + */ +#ifndef SQLITE_OMIT_COMPOUND_SELECT + case SRT_Union: { + int r1; + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); + sqlite3ReleaseTempReg(pParse, r1); + break; + } + + /* Construct a record from the query result, but instead of + ** saving that record, use it as a key to delete elements from + ** the temporary table iParm. + */ + case SRT_Except: { + sqlite3VdbeAddOp3(v, OP_IdxDelete, iParm, regResult, nResultCol); + break; + } +#endif /* SQLITE_OMIT_COMPOUND_SELECT */ + + /* Store the result as data using a unique key. + */ + case SRT_Fifo: + case SRT_DistFifo: + case SRT_Table: + case SRT_EphemTab: { + int r1 = sqlite3GetTempRange(pParse, nPrefixReg+1); + testcase( eDest==SRT_Table ); + testcase( eDest==SRT_EphemTab ); + testcase( eDest==SRT_Fifo ); + testcase( eDest==SRT_DistFifo ); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1+nPrefixReg); +#ifndef SQLITE_OMIT_CTE + if( eDest==SRT_DistFifo ){ + /* If the destination is DistFifo, then cursor (iParm+1) is open + ** on an ephemeral index. If the current row is already present + ** in the index, do not write it to the output. If not, add the + ** current row to the index and proceed with writing it to the + ** output table as well. */ + int addr = sqlite3VdbeCurrentAddr(v) + 4; + sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, addr, r1, 0); + VdbeCoverage(v); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm+1, r1,regResult,nResultCol); + assert( pSort==0 ); + } +#endif + if( pSort ){ + assert( regResult==regOrig ); + pushOntoSorter(pParse, pSort, p, r1+nPrefixReg, regOrig, 1, nPrefixReg); + }else{ + int r2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, r2); + sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, r2); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + sqlite3ReleaseTempReg(pParse, r2); + } + sqlite3ReleaseTempRange(pParse, r1, nPrefixReg+1); + break; + } + +#ifndef SQLITE_OMIT_SUBQUERY + /* If we are creating a set for an "expr IN (SELECT ...)" construct, + ** then there should be a single item on the stack. Write this + ** item into the set table with bogus data. + */ + case SRT_Set: { + if( pSort ){ + /* At first glance you would think we could optimize out the + ** ORDER BY in this case since the order of entries in the set + ** does not matter. But there might be a LIMIT clause, in which + ** case the order does matter */ + pushOntoSorter( + pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); + }else{ + int r1 = sqlite3GetTempReg(pParse); + assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, + r1, pDest->zAffSdst, nResultCol); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); + sqlite3ReleaseTempReg(pParse, r1); + } + break; + } + + /* If any row exist in the result set, record that fact and abort. + */ + case SRT_Exists: { + sqlite3VdbeAddOp2(v, OP_Integer, 1, iParm); + /* The LIMIT clause will terminate the loop for us */ + break; + } + + /* If this is a scalar select that is part of an expression, then + ** store the results in the appropriate memory cell or array of + ** memory cells and break out of the scan loop. + */ + case SRT_Mem: { + if( pSort ){ + assert( nResultCol<=pDest->nSdst ); + pushOntoSorter( + pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); + }else{ + assert( nResultCol==pDest->nSdst ); + assert( regResult==iParm ); + /* The LIMIT clause will jump out of the loop for us */ + } + break; + } +#endif /* #ifndef SQLITE_OMIT_SUBQUERY */ + + case SRT_Coroutine: /* Send data to a co-routine */ + case SRT_Output: { /* Return the results */ + testcase( eDest==SRT_Coroutine ); + testcase( eDest==SRT_Output ); + if( pSort ){ + pushOntoSorter(pParse, pSort, p, regResult, regOrig, nResultCol, + nPrefixReg); + }else if( eDest==SRT_Coroutine ){ + sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); + }else{ + sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, nResultCol); + } + break; + } + +#ifndef SQLITE_OMIT_CTE + /* Write the results into a priority queue that is order according to + ** pDest->pOrderBy (in pSO). pDest->iSDParm (in iParm) is the cursor for an + ** index with pSO->nExpr+2 columns. Build a key using pSO for the first + ** pSO->nExpr columns, then make sure all keys are unique by adding a + ** final OP_Sequence column. The last column is the record as a blob. + */ + case SRT_DistQueue: + case SRT_Queue: { + int nKey; + int r1, r2, r3; + int addrTest = 0; + ExprList *pSO; + pSO = pDest->pOrderBy; + assert( pSO ); + nKey = pSO->nExpr; + r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3GetTempRange(pParse, nKey+2); + r3 = r2+nKey+1; + if( eDest==SRT_DistQueue ){ + /* If the destination is DistQueue, then cursor (iParm+1) is open + ** on a second ephemeral index that holds all values every previously + ** added to the queue. */ + addrTest = sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, 0, + regResult, nResultCol); + VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r3); + if( eDest==SRT_DistQueue ){ + sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm+1, r3); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + } + for(i=0; ia[i].u.x.iOrderByCol - 1, + r2+i); + } + sqlite3VdbeAddOp2(v, OP_Sequence, iParm, r2+nKey); + sqlite3VdbeAddOp3(v, OP_MakeRecord, r2, nKey+2, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, r2, nKey+2); + if( addrTest ) sqlite3VdbeJumpHere(v, addrTest); + sqlite3ReleaseTempReg(pParse, r1); + sqlite3ReleaseTempRange(pParse, r2, nKey+2); + break; + } +#endif /* SQLITE_OMIT_CTE */ + + + +#if !defined(SQLITE_OMIT_TRIGGER) + /* Discard the results. This is used for SELECT statements inside + ** the body of a TRIGGER. The purpose of such selects is to call + ** user-defined functions that have side effects. We do not care + ** about the actual results of the select. + */ + default: { + assert( eDest==SRT_Discard ); + break; + } +#endif + } + + /* Jump to the end of the loop if the LIMIT is reached. Except, if + ** there is a sorter, in which case the sorter has already limited + ** the output for us. + */ + if( pSort==0 && p->iLimit ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v); + } +} + +/* +** Allocate a KeyInfo object sufficient for an index of N key columns and +** X extra columns. +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){ + int nExtra = (N+X)*(sizeof(CollSeq*)+1) - sizeof(CollSeq*); + KeyInfo *p = sqlite3DbMallocRawNN(db, sizeof(KeyInfo) + nExtra); + if( p ){ + p->aSortFlags = (u8*)&p->aColl[N+X]; + p->nKeyField = (u16)N; + p->nAllField = (u16)(N+X); + p->enc = ENC(db); + p->db = db; + p->nRef = 1; + memset(&p[1], 0, nExtra); + }else{ + sqlite3OomFault(db); + } + return p; +} + +/* +** Deallocate a KeyInfo object +*/ +SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo *p){ + if( p ){ + assert( p->nRef>0 ); + p->nRef--; + if( p->nRef==0 ) sqlite3DbFreeNN(p->db, p); + } +} + +/* +** Make a new pointer to a KeyInfo object +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoRef(KeyInfo *p){ + if( p ){ + assert( p->nRef>0 ); + p->nRef++; + } + return p; +} + +#ifdef SQLITE_DEBUG +/* +** Return TRUE if a KeyInfo object can be change. The KeyInfo object +** can only be changed if this is just a single reference to the object. +** +** This routine is used only inside of assert() statements. +*/ +SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo *p){ return p->nRef==1; } +#endif /* SQLITE_DEBUG */ + +/* +** Given an expression list, generate a KeyInfo structure that records +** the collating sequence for each expression in that expression list. +** +** If the ExprList is an ORDER BY or GROUP BY clause then the resulting +** KeyInfo structure is appropriate for initializing a virtual index to +** implement that clause. If the ExprList is the result set of a SELECT +** then the KeyInfo structure is appropriate for initializing a virtual +** index to implement a DISTINCT test. +** +** Space to hold the KeyInfo structure is obtained from malloc. The calling +** function is responsible for seeing that this structure is eventually +** freed. +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* Form the KeyInfo object from this ExprList */ + int iStart, /* Begin with this column of pList */ + int nExtra /* Add this many extra columns to the end */ +){ + int nExpr; + KeyInfo *pInfo; + struct ExprList_item *pItem; + sqlite3 *db = pParse->db; + int i; + + nExpr = pList->nExpr; + pInfo = sqlite3KeyInfoAlloc(db, nExpr-iStart, nExtra+1); + if( pInfo ){ + assert( sqlite3KeyInfoIsWriteable(pInfo) ); + for(i=iStart, pItem=pList->a+iStart; iaColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); + pInfo->aSortFlags[i-iStart] = pItem->sortFlags; + } + } + return pInfo; +} + +/* +** Name of the connection operator, used for error messages. +*/ +static const char *selectOpName(int id){ + char *z; + switch( id ){ + case TK_ALL: z = "UNION ALL"; break; + case TK_INTERSECT: z = "INTERSECT"; break; + case TK_EXCEPT: z = "EXCEPT"; break; + default: z = "UNION"; break; + } + return z; +} + +#ifndef SQLITE_OMIT_EXPLAIN +/* +** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function +** is a no-op. Otherwise, it adds a single row of output to the EQP result, +** where the caption is of the form: +** +** "USE TEMP B-TREE FOR xxx" +** +** where xxx is one of "DISTINCT", "ORDER BY" or "GROUP BY". Exactly which +** is determined by the zUsage argument. +*/ +static void explainTempTable(Parse *pParse, const char *zUsage){ + ExplainQueryPlan((pParse, 0, "USE TEMP B-TREE FOR %s", zUsage)); +} + +/* +** Assign expression b to lvalue a. A second, no-op, version of this macro +** is provided when SQLITE_OMIT_EXPLAIN is defined. This allows the code +** in sqlite3Select() to assign values to structure member variables that +** only exist if SQLITE_OMIT_EXPLAIN is not defined without polluting the +** code with #ifndef directives. +*/ +# define explainSetInteger(a, b) a = b + +#else +/* No-op versions of the explainXXX() functions and macros. */ +# define explainTempTable(y,z) +# define explainSetInteger(y,z) +#endif + + +/* +** If the inner loop was generated using a non-null pOrderBy argument, +** then the results were placed in a sorter. After the loop is terminated +** we need to run the sorter and output the results. The following +** routine generates the code needed to do that. +*/ +static void generateSortTail( + Parse *pParse, /* Parsing context */ + Select *p, /* The SELECT statement */ + SortCtx *pSort, /* Information on the ORDER BY clause */ + int nColumn, /* Number of columns of data */ + SelectDest *pDest /* Write the sorted results here */ +){ + Vdbe *v = pParse->pVdbe; /* The prepared statement */ + int addrBreak = pSort->labelDone; /* Jump here to exit loop */ + int addrContinue = sqlite3VdbeMakeLabel(pParse);/* Jump here for next cycle */ + int addr; /* Top of output loop. Jump for Next. */ + int addrOnce = 0; + int iTab; + ExprList *pOrderBy = pSort->pOrderBy; + int eDest = pDest->eDest; + int iParm = pDest->iSDParm; + int regRow; + int regRowid; + int iCol; + int nKey; /* Number of key columns in sorter record */ + int iSortTab; /* Sorter cursor to read from */ + int i; + int bSeq; /* True if sorter record includes seq. no. */ + int nRefKey = 0; + struct ExprList_item *aOutEx = p->pEList->a; + + assert( addrBreak<0 ); + if( pSort->labelBkOut ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); + sqlite3VdbeGoto(v, addrBreak); + sqlite3VdbeResolveLabel(v, pSort->labelBkOut); + } + +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + /* Open any cursors needed for sorter-reference expressions */ + for(i=0; inDefer; i++){ + Table *pTab = pSort->aDefer[i].pTab; + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3OpenTable(pParse, pSort->aDefer[i].iCsr, iDb, pTab, OP_OpenRead); + nRefKey = MAX(nRefKey, pSort->aDefer[i].nKey); + } +#endif + + iTab = pSort->iECursor; + if( eDest==SRT_Output || eDest==SRT_Coroutine || eDest==SRT_Mem ){ + regRowid = 0; + regRow = pDest->iSdst; + }else{ + regRowid = sqlite3GetTempReg(pParse); + if( eDest==SRT_EphemTab || eDest==SRT_Table ){ + regRow = sqlite3GetTempReg(pParse); + nColumn = 0; + }else{ + regRow = sqlite3GetTempRange(pParse, nColumn); + } + } + nKey = pOrderBy->nExpr - pSort->nOBSat; + if( pSort->sortFlags & SORTFLAG_UseSorter ){ + int regSortOut = ++pParse->nMem; + iSortTab = pParse->nTab++; + if( pSort->labelBkOut ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut, + nKey+1+nColumn+nRefKey); + if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce); + addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak); + VdbeCoverage(v); + codeOffset(v, p->iOffset, addrContinue); + sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab); + bSeq = 0; + }else{ + addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); VdbeCoverage(v); + codeOffset(v, p->iOffset, addrContinue); + iSortTab = iTab; + bSeq = 1; + } + for(i=0, iCol=nKey+bSeq-1; inDefer ){ + int iKey = iCol+1; + int regKey = sqlite3GetTempRange(pParse, nRefKey); + + for(i=0; inDefer; i++){ + int iCsr = pSort->aDefer[i].iCsr; + Table *pTab = pSort->aDefer[i].pTab; + int nKey = pSort->aDefer[i].nKey; + + sqlite3VdbeAddOp1(v, OP_NullRow, iCsr); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey); + sqlite3VdbeAddOp3(v, OP_SeekRowid, iCsr, + sqlite3VdbeCurrentAddr(v)+1, regKey); + }else{ + int k; + int iJmp; + assert( sqlite3PrimaryKeyIndex(pTab)->nKeyCol==nKey ); + for(k=0; k=0; i--){ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( aOutEx[i].bSorterRef ){ + sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i); + }else +#endif + { + int iRead; + if( aOutEx[i].u.x.iOrderByCol ){ + iRead = aOutEx[i].u.x.iOrderByCol-1; + }else{ + iRead = iCol--; + } + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i); + VdbeComment((v, "%s", aOutEx[i].zEName)); + } + } + switch( eDest ){ + case SRT_Table: + case SRT_EphemTab: { + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq, regRow); + sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case SRT_Set: { + assert( nColumn==sqlite3Strlen30(pDest->zAffSdst) ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, nColumn, regRowid, + pDest->zAffSdst, nColumn); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, regRowid, regRow, nColumn); + break; + } + case SRT_Mem: { + /* The LIMIT clause will terminate the loop for us */ + break; + } +#endif + default: { + assert( eDest==SRT_Output || eDest==SRT_Coroutine ); + testcase( eDest==SRT_Output ); + testcase( eDest==SRT_Coroutine ); + if( eDest==SRT_Output ){ + sqlite3VdbeAddOp2(v, OP_ResultRow, pDest->iSdst, nColumn); + }else{ + sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); + } + break; + } + } + if( regRowid ){ + if( eDest==SRT_Set ){ + sqlite3ReleaseTempRange(pParse, regRow, nColumn); + }else{ + sqlite3ReleaseTempReg(pParse, regRow); + } + sqlite3ReleaseTempReg(pParse, regRowid); + } + /* The bottom of the loop + */ + sqlite3VdbeResolveLabel(v, addrContinue); + if( pSort->sortFlags & SORTFLAG_UseSorter ){ + sqlite3VdbeAddOp2(v, OP_SorterNext, iTab, addr); VdbeCoverage(v); + }else{ + sqlite3VdbeAddOp2(v, OP_Next, iTab, addr); VdbeCoverage(v); + } + if( pSort->regReturn ) sqlite3VdbeAddOp1(v, OP_Return, pSort->regReturn); + sqlite3VdbeResolveLabel(v, addrBreak); +} + +/* +** Return a pointer to a string containing the 'declaration type' of the +** expression pExpr. The string may be treated as static by the caller. +** +** Also try to estimate the size of the returned value and return that +** result in *pEstWidth. +** +** The declaration type is the exact datatype definition extracted from the +** original CREATE TABLE statement if the expression is a column. The +** declaration type for a ROWID field is INTEGER. Exactly when an expression +** is considered a column can be complex in the presence of subqueries. The +** result-set expression in all of the following SELECT statements is +** considered a column by this function. +** +** SELECT col FROM tbl; +** SELECT (SELECT col FROM tbl; +** SELECT (SELECT col FROM tbl); +** SELECT abc FROM (SELECT col AS abc FROM tbl); +** +** The declaration type for any expression other than a column is NULL. +** +** This routine has either 3 or 6 parameters depending on whether or not +** the SQLITE_ENABLE_COLUMN_METADATA compile-time option is used. +*/ +#ifdef SQLITE_ENABLE_COLUMN_METADATA +# define columnType(A,B,C,D,E) columnTypeImpl(A,B,C,D,E) +#else /* if !defined(SQLITE_ENABLE_COLUMN_METADATA) */ +# define columnType(A,B,C,D,E) columnTypeImpl(A,B) +#endif +static const char *columnTypeImpl( + NameContext *pNC, +#ifndef SQLITE_ENABLE_COLUMN_METADATA + Expr *pExpr +#else + Expr *pExpr, + const char **pzOrigDb, + const char **pzOrigTab, + const char **pzOrigCol +#endif +){ + char const *zType = 0; + int j; +#ifdef SQLITE_ENABLE_COLUMN_METADATA + char const *zOrigDb = 0; + char const *zOrigTab = 0; + char const *zOrigCol = 0; +#endif + + assert( pExpr!=0 ); + assert( pNC->pSrcList!=0 ); + switch( pExpr->op ){ + case TK_COLUMN: { + /* The expression is a column. Locate the table the column is being + ** extracted from in NameContext.pSrcList. This table may be real + ** database table or a subquery. + */ + Table *pTab = 0; /* Table structure column is extracted from */ + Select *pS = 0; /* Select the column is extracted from */ + int iCol = pExpr->iColumn; /* Index of column in pTab */ + while( pNC && !pTab ){ + SrcList *pTabList = pNC->pSrcList; + for(j=0;jnSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++); + if( jnSrc ){ + pTab = pTabList->a[j].pTab; + pS = pTabList->a[j].pSelect; + }else{ + pNC = pNC->pNext; + } + } + + if( pTab==0 ){ + /* At one time, code such as "SELECT new.x" within a trigger would + ** cause this condition to run. Since then, we have restructured how + ** trigger code is generated and so this condition is no longer + ** possible. However, it can still be true for statements like + ** the following: + ** + ** CREATE TABLE t1(col INTEGER); + ** SELECT (SELECT t1.col) FROM FROM t1; + ** + ** when columnType() is called on the expression "t1.col" in the + ** sub-select. In this case, set the column type to NULL, even + ** though it should really be "INTEGER". + ** + ** This is not a problem, as the column type of "t1.col" is never + ** used. When columnType() is called on the expression + ** "(SELECT t1.col)", the correct type is returned (see the TK_SELECT + ** branch below. */ + break; + } + + assert( pTab && pExpr->y.pTab==pTab ); + if( pS ){ + /* The "table" is actually a sub-select or a view in the FROM clause + ** of the SELECT statement. Return the declaration type and origin + ** data for the result-set column of the sub-select. + */ + if( iCol>=0 && iColpEList->nExpr ){ + /* If iCol is less than zero, then the expression requests the + ** rowid of the sub-select or view. This expression is legal (see + ** test case misc2.2.2) - it always evaluates to NULL. + */ + NameContext sNC; + Expr *p = pS->pEList->a[iCol].pExpr; + sNC.pSrcList = pS->pSrc; + sNC.pNext = pNC; + sNC.pParse = pNC->pParse; + zType = columnType(&sNC, p,&zOrigDb,&zOrigTab,&zOrigCol); + } + }else{ + /* A real table or a CTE table */ + assert( !pS ); +#ifdef SQLITE_ENABLE_COLUMN_METADATA + if( iCol<0 ) iCol = pTab->iPKey; + assert( iCol==XN_ROWID || (iCol>=0 && iColnCol) ); + if( iCol<0 ){ + zType = "INTEGER"; + zOrigCol = "rowid"; + }else{ + zOrigCol = pTab->aCol[iCol].zName; + zType = sqlite3ColumnType(&pTab->aCol[iCol],0); + } + zOrigTab = pTab->zName; + if( pNC->pParse && pTab->pSchema ){ + int iDb = sqlite3SchemaToIndex(pNC->pParse->db, pTab->pSchema); + zOrigDb = pNC->pParse->db->aDb[iDb].zDbSName; + } +#else + assert( iCol==XN_ROWID || (iCol>=0 && iColnCol) ); + if( iCol<0 ){ + zType = "INTEGER"; + }else{ + zType = sqlite3ColumnType(&pTab->aCol[iCol],0); + } +#endif + } + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_SELECT: { + /* The expression is a sub-select. Return the declaration type and + ** origin info for the single column in the result set of the SELECT + ** statement. + */ + NameContext sNC; + Select *pS = pExpr->x.pSelect; + Expr *p = pS->pEList->a[0].pExpr; + assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + sNC.pSrcList = pS->pSrc; + sNC.pNext = pNC; + sNC.pParse = pNC->pParse; + zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); + break; + } +#endif + } + +#ifdef SQLITE_ENABLE_COLUMN_METADATA + if( pzOrigDb ){ + assert( pzOrigTab && pzOrigCol ); + *pzOrigDb = zOrigDb; + *pzOrigTab = zOrigTab; + *pzOrigCol = zOrigCol; + } +#endif + return zType; +} + +/* +** Generate code that will tell the VDBE the declaration types of columns +** in the result set. +*/ +static void generateColumnTypes( + Parse *pParse, /* Parser context */ + SrcList *pTabList, /* List of tables */ + ExprList *pEList /* Expressions defining the result set */ +){ +#ifndef SQLITE_OMIT_DECLTYPE + Vdbe *v = pParse->pVdbe; + int i; + NameContext sNC; + sNC.pSrcList = pTabList; + sNC.pParse = pParse; + sNC.pNext = 0; + for(i=0; inExpr; i++){ + Expr *p = pEList->a[i].pExpr; + const char *zType; +#ifdef SQLITE_ENABLE_COLUMN_METADATA + const char *zOrigDb = 0; + const char *zOrigTab = 0; + const char *zOrigCol = 0; + zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); + + /* The vdbe must make its own copy of the column-type and other + ** column specific strings, in case the schema is reset before this + ** virtual machine is deleted. + */ + sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb, SQLITE_TRANSIENT); + sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, SQLITE_TRANSIENT); + sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, SQLITE_TRANSIENT); +#else + zType = columnType(&sNC, p, 0, 0, 0); +#endif + sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, SQLITE_TRANSIENT); + } +#endif /* !defined(SQLITE_OMIT_DECLTYPE) */ +} + + +/* +** Compute the column names for a SELECT statement. +** +** The only guarantee that SQLite makes about column names is that if the +** column has an AS clause assigning it a name, that will be the name used. +** That is the only documented guarantee. However, countless applications +** developed over the years have made baseless assumptions about column names +** and will break if those assumptions changes. Hence, use extreme caution +** when modifying this routine to avoid breaking legacy. +** +** See Also: sqlite3ColumnsFromExprList() +** +** The PRAGMA short_column_names and PRAGMA full_column_names settings are +** deprecated. The default setting is short=ON, full=OFF. 99.9% of all +** applications should operate this way. Nevertheless, we need to support the +** other modes for legacy: +** +** short=OFF, full=OFF: Column name is the text of the expression has it +** originally appears in the SELECT statement. In +** other words, the zSpan of the result expression. +** +** short=ON, full=OFF: (This is the default setting). If the result +** refers directly to a table column, then the +** result column name is just the table column +** name: COLUMN. Otherwise use zSpan. +** +** full=ON, short=ANY: If the result refers directly to a table column, +** then the result column name with the table name +** prefix, ex: TABLE.COLUMN. Otherwise use zSpan. +*/ +static void generateColumnNames( + Parse *pParse, /* Parser context */ + Select *pSelect /* Generate column names for this SELECT statement */ +){ + Vdbe *v = pParse->pVdbe; + int i; + Table *pTab; + SrcList *pTabList; + ExprList *pEList; + sqlite3 *db = pParse->db; + int fullName; /* TABLE.COLUMN if no AS clause and is a direct table ref */ + int srcName; /* COLUMN or TABLE.COLUMN if no AS clause and is direct */ + +#ifndef SQLITE_OMIT_EXPLAIN + /* If this is an EXPLAIN, skip this step */ + if( pParse->explain ){ + return; + } +#endif + + if( pParse->colNamesSet ) return; + /* Column names are determined by the left-most term of a compound select */ + while( pSelect->pPrior ) pSelect = pSelect->pPrior; + SELECTTRACE(1,pParse,pSelect,("generating column names\n")); + pTabList = pSelect->pSrc; + pEList = pSelect->pEList; + assert( v!=0 ); + assert( pTabList!=0 ); + pParse->colNamesSet = 1; + fullName = (db->flags & SQLITE_FullColNames)!=0; + srcName = (db->flags & SQLITE_ShortColNames)!=0 || fullName; + sqlite3VdbeSetNumCols(v, pEList->nExpr); + for(i=0; inExpr; i++){ + Expr *p = pEList->a[i].pExpr; + + assert( p!=0 ); + assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ + assert( p->op!=TK_COLUMN || p->y.pTab!=0 ); /* Covering idx not yet coded */ + if( pEList->a[i].zEName && pEList->a[i].eEName==ENAME_NAME ){ + /* An AS clause always takes first priority */ + char *zName = pEList->a[i].zEName; + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); + }else if( srcName && p->op==TK_COLUMN ){ + char *zCol; + int iCol = p->iColumn; + pTab = p->y.pTab; + assert( pTab!=0 ); + if( iCol<0 ) iCol = pTab->iPKey; + assert( iCol==-1 || (iCol>=0 && iColnCol) ); + if( iCol<0 ){ + zCol = "rowid"; + }else{ + zCol = pTab->aCol[iCol].zName; + } + if( fullName ){ + char *zName = 0; + zName = sqlite3MPrintf(db, "%s.%s", pTab->zName, zCol); + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_DYNAMIC); + }else{ + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, SQLITE_TRANSIENT); + } + }else{ + const char *z = pEList->a[i].zEName; + z = z==0 ? sqlite3MPrintf(db, "column%d", i+1) : sqlite3DbStrDup(db, z); + sqlite3VdbeSetColName(v, i, COLNAME_NAME, z, SQLITE_DYNAMIC); + } + } + generateColumnTypes(pParse, pTabList, pEList); +} + +/* +** Given an expression list (which is really the list of expressions +** that form the result set of a SELECT statement) compute appropriate +** column names for a table that would hold the expression list. +** +** All column names will be unique. +** +** Only the column names are computed. Column.zType, Column.zColl, +** and other fields of Column are zeroed. +** +** Return SQLITE_OK on success. If a memory allocation error occurs, +** store NULL in *paCol and 0 in *pnCol and return SQLITE_NOMEM. +** +** The only guarantee that SQLite makes about column names is that if the +** column has an AS clause assigning it a name, that will be the name used. +** That is the only documented guarantee. However, countless applications +** developed over the years have made baseless assumptions about column names +** and will break if those assumptions changes. Hence, use extreme caution +** when modifying this routine to avoid breaking legacy. +** +** See Also: generateColumnNames() +*/ +SQLITE_PRIVATE int sqlite3ColumnsFromExprList( + Parse *pParse, /* Parsing context */ + ExprList *pEList, /* Expr list from which to derive column names */ + i16 *pnCol, /* Write the number of columns here */ + Column **paCol /* Write the new column list here */ +){ + sqlite3 *db = pParse->db; /* Database connection */ + int i, j; /* Loop counters */ + u32 cnt; /* Index added to make the name unique */ + Column *aCol, *pCol; /* For looping over result columns */ + int nCol; /* Number of columns in the result set */ + char *zName; /* Column name */ + int nName; /* Size of name in zName[] */ + Hash ht; /* Hash table of column names */ + + sqlite3HashInit(&ht); + if( pEList ){ + nCol = pEList->nExpr; + aCol = sqlite3DbMallocZero(db, sizeof(aCol[0])*nCol); + testcase( aCol==0 ); + if( nCol>32767 ) nCol = 32767; + }else{ + nCol = 0; + aCol = 0; + } + assert( nCol==(i16)nCol ); + *pnCol = nCol; + *paCol = aCol; + + for(i=0, pCol=aCol; imallocFailed; i++, pCol++){ + /* Get an appropriate name for the column + */ + if( (zName = pEList->a[i].zEName)!=0 && pEList->a[i].eEName==ENAME_NAME ){ + /* If the column contains an "AS " phrase, use as the name */ + }else{ + Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr); + while( pColExpr->op==TK_DOT ){ + pColExpr = pColExpr->pRight; + assert( pColExpr!=0 ); + } + if( pColExpr->op==TK_COLUMN ){ + /* For columns use the column name name */ + int iCol = pColExpr->iColumn; + Table *pTab = pColExpr->y.pTab; + assert( pTab!=0 ); + if( iCol<0 ) iCol = pTab->iPKey; + zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid"; + }else if( pColExpr->op==TK_ID ){ + assert( !ExprHasProperty(pColExpr, EP_IntValue) ); + zName = pColExpr->u.zToken; + }else{ + /* Use the original text of the column expression as its name */ + zName = pEList->a[i].zEName; + } + } + if( zName && !sqlite3IsTrueOrFalse(zName) ){ + zName = sqlite3DbStrDup(db, zName); + }else{ + zName = sqlite3MPrintf(db,"column%d",i+1); + } + + /* Make sure the column name is unique. If the name is not unique, + ** append an integer to the name so that it becomes unique. + */ + cnt = 0; + while( zName && sqlite3HashFind(&ht, zName)!=0 ){ + nName = sqlite3Strlen30(zName); + if( nName>0 ){ + for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){} + if( zName[j]==':' ) nName = j; + } + zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); + if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); + } + pCol->zName = zName; + pCol->hName = sqlite3StrIHash(zName); + sqlite3ColumnPropertiesFromName(0, pCol); + if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ + sqlite3OomFault(db); + } + } + sqlite3HashClear(&ht); + if( db->mallocFailed ){ + for(j=0; jdb; + NameContext sNC; + Column *pCol; + CollSeq *pColl; + int i; + Expr *p; + struct ExprList_item *a; + + assert( pSelect!=0 ); + assert( (pSelect->selFlags & SF_Resolved)!=0 ); + assert( pTab->nCol==pSelect->pEList->nExpr || db->mallocFailed ); + if( db->mallocFailed ) return; + memset(&sNC, 0, sizeof(sNC)); + sNC.pSrcList = pSelect->pSrc; + a = pSelect->pEList->a; + for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ + const char *zType; + int n, m; + p = a[i].pExpr; + zType = columnType(&sNC, p, 0, 0, 0); + /* pCol->szEst = ... // Column size est for SELECT tables never used */ + pCol->affinity = sqlite3ExprAffinity(p); + if( zType ){ + m = sqlite3Strlen30(zType); + n = sqlite3Strlen30(pCol->zName); + pCol->zName = sqlite3DbReallocOrFree(db, pCol->zName, n+m+2); + if( pCol->zName ){ + memcpy(&pCol->zName[n+1], zType, m+1); + pCol->colFlags |= COLFLAG_HASTYPE; + } + } + if( pCol->affinity<=SQLITE_AFF_NONE ) pCol->affinity = aff; + pColl = sqlite3ExprCollSeq(pParse, p); + if( pColl && pCol->zColl==0 ){ + pCol->zColl = sqlite3DbStrDup(db, pColl->zName); + } + } + pTab->szTabRow = 1; /* Any non-zero value works */ +} + +/* +** Given a SELECT statement, generate a Table structure that describes +** the result set of that SELECT. +*/ +SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect, char aff){ + Table *pTab; + sqlite3 *db = pParse->db; + u64 savedFlags; + + savedFlags = db->flags; + db->flags &= ~(u64)SQLITE_FullColNames; + db->flags |= SQLITE_ShortColNames; + sqlite3SelectPrep(pParse, pSelect, 0); + db->flags = savedFlags; + if( pParse->nErr ) return 0; + while( pSelect->pPrior ) pSelect = pSelect->pPrior; + pTab = sqlite3DbMallocZero(db, sizeof(Table) ); + if( pTab==0 ){ + return 0; + } + pTab->nTabRef = 1; + pTab->zName = 0; + pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + sqlite3ColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect, aff); + pTab->iPKey = -1; + if( db->mallocFailed ){ + sqlite3DeleteTable(db, pTab); + return 0; + } + return pTab; +} + +/* +** Get a VDBE for the given parser context. Create a new one if necessary. +** If an error occurs, return NULL and leave a message in pParse. +*/ +SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){ + if( pParse->pVdbe ){ + return pParse->pVdbe; + } + if( pParse->pToplevel==0 + && OptimizationEnabled(pParse->db,SQLITE_FactorOutConst) + ){ + pParse->okConstFactor = 1; + } + return sqlite3VdbeCreate(pParse); +} + + +/* +** Compute the iLimit and iOffset fields of the SELECT based on the +** pLimit expressions. pLimit->pLeft and pLimit->pRight hold the expressions +** that appear in the original SQL statement after the LIMIT and OFFSET +** keywords. Or NULL if those keywords are omitted. iLimit and iOffset +** are the integer memory register numbers for counters used to compute +** the limit and offset. If there is no limit and/or offset, then +** iLimit and iOffset are negative. +** +** This routine changes the values of iLimit and iOffset only if +** a limit or offset is defined by pLimit->pLeft and pLimit->pRight. iLimit +** and iOffset should have been preset to appropriate default values (zero) +** prior to calling this routine. +** +** The iOffset register (if it exists) is initialized to the value +** of the OFFSET. The iLimit register is initialized to LIMIT. Register +** iOffset+1 is initialized to LIMIT+OFFSET. +** +** Only if pLimit->pLeft!=0 do the limit registers get +** redefined. The UNION ALL operator uses this property to force +** the reuse of the same limit and offset registers across multiple +** SELECT statements. +*/ +static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ + Vdbe *v = 0; + int iLimit = 0; + int iOffset; + int n; + Expr *pLimit = p->pLimit; + + if( p->iLimit ) return; + + /* + ** "LIMIT -1" always shows all rows. There is some + ** controversy about what the correct behavior should be. + ** The current implementation interprets "LIMIT 0" to mean + ** no rows. + */ + if( pLimit ){ + assert( pLimit->op==TK_LIMIT ); + assert( pLimit->pLeft!=0 ); + p->iLimit = iLimit = ++pParse->nMem; + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + if( sqlite3ExprIsInteger(pLimit->pLeft, &n) ){ + sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit); + VdbeComment((v, "LIMIT counter")); + if( n==0 ){ + sqlite3VdbeGoto(v, iBreak); + }else if( n>=0 && p->nSelectRow>sqlite3LogEst((u64)n) ){ + p->nSelectRow = sqlite3LogEst((u64)n); + p->selFlags |= SF_FixedLimit; + } + }else{ + sqlite3ExprCode(pParse, pLimit->pLeft, iLimit); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v); + VdbeComment((v, "LIMIT counter")); + sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); VdbeCoverage(v); + } + if( pLimit->pRight ){ + p->iOffset = iOffset = ++pParse->nMem; + pParse->nMem++; /* Allocate an extra register for limit+offset */ + sqlite3ExprCode(pParse, pLimit->pRight, iOffset); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v); + VdbeComment((v, "OFFSET counter")); + sqlite3VdbeAddOp3(v, OP_OffsetLimit, iLimit, iOffset+1, iOffset); + VdbeComment((v, "LIMIT+OFFSET")); + } + } +} + +#ifndef SQLITE_OMIT_COMPOUND_SELECT +/* +** Return the appropriate collating sequence for the iCol-th column of +** the result set for the compound-select statement "p". Return NULL if +** the column has no default collating sequence. +** +** The collating sequence for the compound select is taken from the +** left-most term of the select that has a collating sequence. +*/ +static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){ + CollSeq *pRet; + if( p->pPrior ){ + pRet = multiSelectCollSeq(pParse, p->pPrior, iCol); + }else{ + pRet = 0; + } + assert( iCol>=0 ); + /* iCol must be less than p->pEList->nExpr. Otherwise an error would + ** have been thrown during name resolution and we would not have gotten + ** this far */ + if( pRet==0 && ALWAYS(iColpEList->nExpr) ){ + pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr); + } + return pRet; +} + +/* +** The select statement passed as the second parameter is a compound SELECT +** with an ORDER BY clause. This function allocates and returns a KeyInfo +** structure suitable for implementing the ORDER BY. +** +** Space to hold the KeyInfo structure is obtained from malloc. The calling +** function is responsible for ensuring that this structure is eventually +** freed. +*/ +static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){ + ExprList *pOrderBy = p->pOrderBy; + int nOrderBy = p->pOrderBy->nExpr; + sqlite3 *db = pParse->db; + KeyInfo *pRet = sqlite3KeyInfoAlloc(db, nOrderBy+nExtra, 1); + if( pRet ){ + int i; + for(i=0; ia[i]; + Expr *pTerm = pItem->pExpr; + CollSeq *pColl; + + if( pTerm->flags & EP_Collate ){ + pColl = sqlite3ExprCollSeq(pParse, pTerm); + }else{ + pColl = multiSelectCollSeq(pParse, p, pItem->u.x.iOrderByCol-1); + if( pColl==0 ) pColl = db->pDfltColl; + pOrderBy->a[i].pExpr = + sqlite3ExprAddCollateString(pParse, pTerm, pColl->zName); + } + assert( sqlite3KeyInfoIsWriteable(pRet) ); + pRet->aColl[i] = pColl; + pRet->aSortFlags[i] = pOrderBy->a[i].sortFlags; + } + } + + return pRet; +} + +#ifndef SQLITE_OMIT_CTE +/* +** This routine generates VDBE code to compute the content of a WITH RECURSIVE +** query of the form: +** +** AS ( UNION [ALL] ) +** \___________/ \_______________/ +** p->pPrior p +** +** +** There is exactly one reference to the recursive-table in the FROM clause +** of recursive-query, marked with the SrcList->a[].fg.isRecursive flag. +** +** The setup-query runs once to generate an initial set of rows that go +** into a Queue table. Rows are extracted from the Queue table one by +** one. Each row extracted from Queue is output to pDest. Then the single +** extracted row (now in the iCurrent table) becomes the content of the +** recursive-table for a recursive-query run. The output of the recursive-query +** is added back into the Queue table. Then another row is extracted from Queue +** and the iteration continues until the Queue table is empty. +** +** If the compound query operator is UNION then no duplicate rows are ever +** inserted into the Queue table. The iDistinct table keeps a copy of all rows +** that have ever been inserted into Queue and causes duplicates to be +** discarded. If the operator is UNION ALL, then duplicates are allowed. +** +** If the query has an ORDER BY, then entries in the Queue table are kept in +** ORDER BY order and the first entry is extracted for each cycle. Without +** an ORDER BY, the Queue table is just a FIFO. +** +** If a LIMIT clause is provided, then the iteration stops after LIMIT rows +** have been output to pDest. A LIMIT of zero means to output no rows and a +** negative LIMIT means to output all rows. If there is also an OFFSET clause +** with a positive value, then the first OFFSET outputs are discarded rather +** than being sent to pDest. The LIMIT count does not begin until after OFFSET +** rows have been skipped. +*/ +static void generateWithRecursiveQuery( + Parse *pParse, /* Parsing context */ + Select *p, /* The recursive SELECT to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + SrcList *pSrc = p->pSrc; /* The FROM clause of the recursive query */ + int nCol = p->pEList->nExpr; /* Number of columns in the recursive table */ + Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */ + Select *pSetup = p->pPrior; /* The setup query */ + int addrTop; /* Top of the loop */ + int addrCont, addrBreak; /* CONTINUE and BREAK addresses */ + int iCurrent = 0; /* The Current table */ + int regCurrent; /* Register holding Current table */ + int iQueue; /* The Queue table */ + int iDistinct = 0; /* To ensure unique results if UNION */ + int eDest = SRT_Fifo; /* How to write to Queue */ + SelectDest destQueue; /* SelectDest targetting the Queue table */ + int i; /* Loop counter */ + int rc; /* Result code */ + ExprList *pOrderBy; /* The ORDER BY clause */ + Expr *pLimit; /* Saved LIMIT and OFFSET */ + int regLimit, regOffset; /* Registers used by LIMIT and OFFSET */ + +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ){ + sqlite3ErrorMsg(pParse, "cannot use window functions in recursive queries"); + return; + } +#endif + + /* Obtain authorization to do a recursive query */ + if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return; + + /* Process the LIMIT and OFFSET clauses, if they exist */ + addrBreak = sqlite3VdbeMakeLabel(pParse); + p->nSelectRow = 320; /* 4 billion rows */ + computeLimitRegisters(pParse, p, addrBreak); + pLimit = p->pLimit; + regLimit = p->iLimit; + regOffset = p->iOffset; + p->pLimit = 0; + p->iLimit = p->iOffset = 0; + pOrderBy = p->pOrderBy; + + /* Locate the cursor number of the Current table */ + for(i=0; ALWAYS(inSrc); i++){ + if( pSrc->a[i].fg.isRecursive ){ + iCurrent = pSrc->a[i].iCursor; + break; + } + } + + /* Allocate cursors numbers for Queue and Distinct. The cursor number for + ** the Distinct table must be exactly one greater than Queue in order + ** for the SRT_DistFifo and SRT_DistQueue destinations to work. */ + iQueue = pParse->nTab++; + if( p->op==TK_UNION ){ + eDest = pOrderBy ? SRT_DistQueue : SRT_DistFifo; + iDistinct = pParse->nTab++; + }else{ + eDest = pOrderBy ? SRT_Queue : SRT_Fifo; + } + sqlite3SelectDestInit(&destQueue, eDest, iQueue); + + /* Allocate cursors for Current, Queue, and Distinct. */ + regCurrent = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_OpenPseudo, iCurrent, regCurrent, nCol); + if( pOrderBy ){ + KeyInfo *pKeyInfo = multiSelectOrderByKeyInfo(pParse, p, 1); + sqlite3VdbeAddOp4(v, OP_OpenEphemeral, iQueue, pOrderBy->nExpr+2, 0, + (char*)pKeyInfo, P4_KEYINFO); + destQueue.pOrderBy = pOrderBy; + }else{ + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iQueue, nCol); + } + VdbeComment((v, "Queue table")); + if( iDistinct ){ + p->addrOpenEphm[0] = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iDistinct, 0); + p->selFlags |= SF_UsesEphemeral; + } + + /* Detach the ORDER BY clause from the compound SELECT */ + p->pOrderBy = 0; + + /* Store the results of the setup-query in Queue. */ + pSetup->pNext = 0; + ExplainQueryPlan((pParse, 1, "SETUP")); + rc = sqlite3Select(pParse, pSetup, &destQueue); + pSetup->pNext = p; + if( rc ) goto end_of_recursive_query; + + /* Find the next row in the Queue and output that row */ + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iQueue, addrBreak); VdbeCoverage(v); + + /* Transfer the next row in Queue over to Current */ + sqlite3VdbeAddOp1(v, OP_NullRow, iCurrent); /* To reset column cache */ + if( pOrderBy ){ + sqlite3VdbeAddOp3(v, OP_Column, iQueue, pOrderBy->nExpr+1, regCurrent); + }else{ + sqlite3VdbeAddOp2(v, OP_RowData, iQueue, regCurrent); + } + sqlite3VdbeAddOp1(v, OP_Delete, iQueue); + + /* Output the single row in Current */ + addrCont = sqlite3VdbeMakeLabel(pParse); + codeOffset(v, regOffset, addrCont); + selectInnerLoop(pParse, p, iCurrent, + 0, 0, pDest, addrCont, addrBreak); + if( regLimit ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, regLimit, addrBreak); + VdbeCoverage(v); + } + sqlite3VdbeResolveLabel(v, addrCont); + + /* Execute the recursive SELECT taking the single row in Current as + ** the value for the recursive-table. Store the results in the Queue. + */ + if( p->selFlags & SF_Aggregate ){ + sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported"); + }else{ + p->pPrior = 0; + ExplainQueryPlan((pParse, 1, "RECURSIVE STEP")); + sqlite3Select(pParse, p, &destQueue); + assert( p->pPrior==0 ); + p->pPrior = pSetup; + } + + /* Keep running the loop until the Queue is empty */ + sqlite3VdbeGoto(v, addrTop); + sqlite3VdbeResolveLabel(v, addrBreak); + +end_of_recursive_query: + sqlite3ExprListDelete(pParse->db, p->pOrderBy); + p->pOrderBy = pOrderBy; + p->pLimit = pLimit; + return; +} +#endif /* SQLITE_OMIT_CTE */ + +/* Forward references */ +static int multiSelectOrderBy( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +); + +/* +** Handle the special case of a compound-select that originates from a +** VALUES clause. By handling this as a special case, we avoid deep +** recursion, and thus do not need to enforce the SQLITE_LIMIT_COMPOUND_SELECT +** on a VALUES clause. +** +** Because the Select object originates from a VALUES clause: +** (1) There is no LIMIT or OFFSET or else there is a LIMIT of exactly 1 +** (2) All terms are UNION ALL +** (3) There is no ORDER BY clause +** +** The "LIMIT of exactly 1" case of condition (1) comes about when a VALUES +** clause occurs within scalar expression (ex: "SELECT (VALUES(1),(2),(3))"). +** The sqlite3CodeSubselect will have added the LIMIT 1 clause in tht case. +** Since the limit is exactly 1, we only need to evalutes the left-most VALUES. +*/ +static int multiSelectValues( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + int nRow = 1; + int rc = 0; + int bShowAll = p->pLimit==0; + assert( p->selFlags & SF_MultiValue ); + do{ + assert( p->selFlags & SF_Values ); + assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) ); + assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr ); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ) return -1; +#endif + if( p->pPrior==0 ) break; + assert( p->pPrior->pNext==p ); + p = p->pPrior; + nRow += bShowAll; + }while(1); + ExplainQueryPlan((pParse, 0, "SCAN %d CONSTANT ROW%s", nRow, + nRow==1 ? "" : "S")); + while( p ){ + selectInnerLoop(pParse, p, -1, 0, 0, pDest, 1, 1); + if( !bShowAll ) break; + p->nSelectRow = nRow; + p = p->pNext; + } + return rc; +} + +/* +** This routine is called to process a compound query form from +** two or more separate queries using UNION, UNION ALL, EXCEPT, or +** INTERSECT +** +** "p" points to the right-most of the two queries. the query on the +** left is p->pPrior. The left query could also be a compound query +** in which case this routine will be called recursively. +** +** The results of the total query are to be written into a destination +** of type eDest with parameter iParm. +** +** Example 1: Consider a three-way compound SQL statement. +** +** SELECT a FROM t1 UNION SELECT b FROM t2 UNION SELECT c FROM t3 +** +** This statement is parsed up as follows: +** +** SELECT c FROM t3 +** | +** `-----> SELECT b FROM t2 +** | +** `------> SELECT a FROM t1 +** +** The arrows in the diagram above represent the Select.pPrior pointer. +** So if this routine is called with p equal to the t3 query, then +** pPrior will be the t2 query. p->op will be TK_UNION in this case. +** +** Notice that because of the way SQLite parses compound SELECTs, the +** individual selects always group from left to right. +*/ +static int multiSelect( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + int rc = SQLITE_OK; /* Success code from a subroutine */ + Select *pPrior; /* Another SELECT immediately to our left */ + Vdbe *v; /* Generate code to this VDBE */ + SelectDest dest; /* Alternative data destination */ + Select *pDelete = 0; /* Chain of simple selects to delete */ + sqlite3 *db; /* Database connection */ + + /* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only + ** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT. + */ + assert( p && p->pPrior ); /* Calling function guarantees this much */ + assert( (p->selFlags & SF_Recursive)==0 || p->op==TK_ALL || p->op==TK_UNION ); + assert( p->selFlags & SF_Compound ); + db = pParse->db; + pPrior = p->pPrior; + dest = *pDest; + if( pPrior->pOrderBy || pPrior->pLimit ){ + sqlite3ErrorMsg(pParse,"%s clause should come after %s not before", + pPrior->pOrderBy!=0 ? "ORDER BY" : "LIMIT", selectOpName(p->op)); + rc = 1; + goto multi_select_end; + } + + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); /* The VDBE already created by calling function */ + + /* Create the destination temporary table if necessary + */ + if( dest.eDest==SRT_EphemTab ){ + assert( p->pEList ); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, dest.iSDParm, p->pEList->nExpr); + dest.eDest = SRT_Table; + } + + /* Special handling for a compound-select that originates as a VALUES clause. + */ + if( p->selFlags & SF_MultiValue ){ + rc = multiSelectValues(pParse, p, &dest); + if( rc>=0 ) goto multi_select_end; + rc = SQLITE_OK; + } + + /* Make sure all SELECTs in the statement have the same number of elements + ** in their result sets. + */ + assert( p->pEList && pPrior->pEList ); + assert( p->pEList->nExpr==pPrior->pEList->nExpr ); + +#ifndef SQLITE_OMIT_CTE + if( p->selFlags & SF_Recursive ){ + generateWithRecursiveQuery(pParse, p, &dest); + }else +#endif + + /* Compound SELECTs that have an ORDER BY clause are handled separately. + */ + if( p->pOrderBy ){ + return multiSelectOrderBy(pParse, p, pDest); + }else{ + +#ifndef SQLITE_OMIT_EXPLAIN + if( pPrior->pPrior==0 ){ + ExplainQueryPlan((pParse, 1, "COMPOUND QUERY")); + ExplainQueryPlan((pParse, 1, "LEFT-MOST SUBQUERY")); + } +#endif + + /* Generate code for the left and right SELECT statements. + */ + switch( p->op ){ + case TK_ALL: { + int addr = 0; + int nLimit; + assert( !pPrior->pLimit ); + pPrior->iLimit = p->iLimit; + pPrior->iOffset = p->iOffset; + pPrior->pLimit = p->pLimit; + rc = sqlite3Select(pParse, pPrior, &dest); + p->pLimit = 0; + if( rc ){ + goto multi_select_end; + } + p->pPrior = 0; + p->iLimit = pPrior->iLimit; + p->iOffset = pPrior->iOffset; + if( p->iLimit ){ + addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v); + VdbeComment((v, "Jump ahead if LIMIT reached")); + if( p->iOffset ){ + sqlite3VdbeAddOp3(v, OP_OffsetLimit, + p->iLimit, p->iOffset+1, p->iOffset); + } + } + ExplainQueryPlan((pParse, 1, "UNION ALL")); + rc = sqlite3Select(pParse, p, &dest); + testcase( rc!=SQLITE_OK ); + pDelete = p->pPrior; + p->pPrior = pPrior; + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + if( pPrior->pLimit + && sqlite3ExprIsInteger(pPrior->pLimit->pLeft, &nLimit) + && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit) + ){ + p->nSelectRow = sqlite3LogEst((u64)nLimit); + } + if( addr ){ + sqlite3VdbeJumpHere(v, addr); + } + break; + } + case TK_EXCEPT: + case TK_UNION: { + int unionTab; /* Cursor number of the temp table holding result */ + u8 op = 0; /* One of the SRT_ operations to apply to self */ + int priorOp; /* The SRT_ operation to apply to prior selects */ + Expr *pLimit; /* Saved values of p->nLimit */ + int addr; + SelectDest uniondest; + + testcase( p->op==TK_EXCEPT ); + testcase( p->op==TK_UNION ); + priorOp = SRT_Union; + if( dest.eDest==priorOp ){ + /* We can reuse a temporary table generated by a SELECT to our + ** right. + */ + assert( p->pLimit==0 ); /* Not allowed on leftward elements */ + unionTab = dest.iSDParm; + }else{ + /* We will need to create our own temporary table to hold the + ** intermediate results. + */ + unionTab = pParse->nTab++; + assert( p->pOrderBy==0 ); + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0); + assert( p->addrOpenEphm[0] == -1 ); + p->addrOpenEphm[0] = addr; + findRightmost(p)->selFlags |= SF_UsesEphemeral; + assert( p->pEList ); + } + + /* Code the SELECT statements to our left + */ + assert( !pPrior->pOrderBy ); + sqlite3SelectDestInit(&uniondest, priorOp, unionTab); + rc = sqlite3Select(pParse, pPrior, &uniondest); + if( rc ){ + goto multi_select_end; + } + + /* Code the current SELECT statement + */ + if( p->op==TK_EXCEPT ){ + op = SRT_Except; + }else{ + assert( p->op==TK_UNION ); + op = SRT_Union; + } + p->pPrior = 0; + pLimit = p->pLimit; + p->pLimit = 0; + uniondest.eDest = op; + ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE", + selectOpName(p->op))); + rc = sqlite3Select(pParse, p, &uniondest); + testcase( rc!=SQLITE_OK ); + assert( p->pOrderBy==0 ); + pDelete = p->pPrior; + p->pPrior = pPrior; + p->pOrderBy = 0; + if( p->op==TK_UNION ){ + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + } + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = pLimit; + p->iLimit = 0; + p->iOffset = 0; + + /* Convert the data in the temporary table into whatever form + ** it is that we currently need. + */ + assert( unionTab==dest.iSDParm || dest.eDest!=priorOp ); + assert( p->pEList || db->mallocFailed ); + if( dest.eDest!=priorOp && db->mallocFailed==0 ){ + int iCont, iBreak, iStart; + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); + computeLimitRegisters(pParse, p, iBreak); + sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v); + iStart = sqlite3VdbeCurrentAddr(v); + selectInnerLoop(pParse, p, unionTab, + 0, 0, &dest, iCont, iBreak); + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v); + sqlite3VdbeResolveLabel(v, iBreak); + sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0); + } + break; + } + default: assert( p->op==TK_INTERSECT ); { + int tab1, tab2; + int iCont, iBreak, iStart; + Expr *pLimit; + int addr; + SelectDest intersectdest; + int r1; + + /* INTERSECT is different from the others since it requires + ** two temporary tables. Hence it has its own case. Begin + ** by allocating the tables we will need. + */ + tab1 = pParse->nTab++; + tab2 = pParse->nTab++; + assert( p->pOrderBy==0 ); + + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0); + assert( p->addrOpenEphm[0] == -1 ); + p->addrOpenEphm[0] = addr; + findRightmost(p)->selFlags |= SF_UsesEphemeral; + assert( p->pEList ); + + /* Code the SELECTs to our left into temporary table "tab1". + */ + sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1); + rc = sqlite3Select(pParse, pPrior, &intersectdest); + if( rc ){ + goto multi_select_end; + } + + /* Code the current SELECT into temporary table "tab2" + */ + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0); + assert( p->addrOpenEphm[1] == -1 ); + p->addrOpenEphm[1] = addr; + p->pPrior = 0; + pLimit = p->pLimit; + p->pLimit = 0; + intersectdest.iSDParm = tab2; + ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE", + selectOpName(p->op))); + rc = sqlite3Select(pParse, p, &intersectdest); + testcase( rc!=SQLITE_OK ); + pDelete = p->pPrior; + p->pPrior = pPrior; + if( p->nSelectRow>pPrior->nSelectRow ){ + p->nSelectRow = pPrior->nSelectRow; + } + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = pLimit; + + /* Generate code to take the intersection of the two temporary + ** tables. + */ + if( rc ) break; + assert( p->pEList ); + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); + computeLimitRegisters(pParse, p, iBreak); + sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); + r1 = sqlite3GetTempReg(pParse); + iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1); + sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, r1); + selectInnerLoop(pParse, p, tab1, + 0, 0, &dest, iCont, iBreak); + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v); + sqlite3VdbeResolveLabel(v, iBreak); + sqlite3VdbeAddOp2(v, OP_Close, tab2, 0); + sqlite3VdbeAddOp2(v, OP_Close, tab1, 0); + break; + } + } + + #ifndef SQLITE_OMIT_EXPLAIN + if( p->pNext==0 ){ + ExplainQueryPlanPop(pParse); + } + #endif + } + if( pParse->nErr ) goto multi_select_end; + + /* Compute collating sequences used by + ** temporary tables needed to implement the compound select. + ** Attach the KeyInfo structure to all temporary tables. + ** + ** This section is run by the right-most SELECT statement only. + ** SELECT statements to the left always skip this part. The right-most + ** SELECT might also skip this part if it has no ORDER BY clause and + ** no temp tables are required. + */ + if( p->selFlags & SF_UsesEphemeral ){ + int i; /* Loop counter */ + KeyInfo *pKeyInfo; /* Collating sequence for the result set */ + Select *pLoop; /* For looping through SELECT statements */ + CollSeq **apColl; /* For looping through pKeyInfo->aColl[] */ + int nCol; /* Number of columns in result set */ + + assert( p->pNext==0 ); + nCol = p->pEList->nExpr; + pKeyInfo = sqlite3KeyInfoAlloc(db, nCol, 1); + if( !pKeyInfo ){ + rc = SQLITE_NOMEM_BKPT; + goto multi_select_end; + } + for(i=0, apColl=pKeyInfo->aColl; ipDfltColl; + } + } + + for(pLoop=p; pLoop; pLoop=pLoop->pPrior){ + for(i=0; i<2; i++){ + int addr = pLoop->addrOpenEphm[i]; + if( addr<0 ){ + /* If [0] is unused then [1] is also unused. So we can + ** always safely abort as soon as the first unused slot is found */ + assert( pLoop->addrOpenEphm[1]<0 ); + break; + } + sqlite3VdbeChangeP2(v, addr, nCol); + sqlite3VdbeChangeP4(v, addr, (char*)sqlite3KeyInfoRef(pKeyInfo), + P4_KEYINFO); + pLoop->addrOpenEphm[i] = -1; + } + } + sqlite3KeyInfoUnref(pKeyInfo); + } + +multi_select_end: + pDest->iSdst = dest.iSdst; + pDest->nSdst = dest.nSdst; + sqlite3SelectDelete(db, pDelete); + return rc; +} +#endif /* SQLITE_OMIT_COMPOUND_SELECT */ + +/* +** Error message for when two or more terms of a compound select have different +** size result sets. +*/ +SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p){ + if( p->selFlags & SF_Values ){ + sqlite3ErrorMsg(pParse, "all VALUES must have the same number of terms"); + }else{ + sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s" + " do not have the same number of result columns", selectOpName(p->op)); + } +} + +/* +** Code an output subroutine for a coroutine implementation of a +** SELECT statment. +** +** The data to be output is contained in pIn->iSdst. There are +** pIn->nSdst columns to be output. pDest is where the output should +** be sent. +** +** regReturn is the number of the register holding the subroutine +** return address. +** +** If regPrev>0 then it is the first register in a vector that +** records the previous output. mem[regPrev] is a flag that is false +** if there has been no previous output. If regPrev>0 then code is +** generated to suppress duplicates. pKeyInfo is used for comparing +** keys. +** +** If the LIMIT found in p->iLimit is reached, jump immediately to +** iBreak. +*/ +static int generateOutputSubroutine( + Parse *pParse, /* Parsing context */ + Select *p, /* The SELECT statement */ + SelectDest *pIn, /* Coroutine supplying data */ + SelectDest *pDest, /* Where to send the data */ + int regReturn, /* The return address register */ + int regPrev, /* Previous result register. No uniqueness if 0 */ + KeyInfo *pKeyInfo, /* For comparing with previous entry */ + int iBreak /* Jump here if we hit the LIMIT */ +){ + Vdbe *v = pParse->pVdbe; + int iContinue; + int addr; + + addr = sqlite3VdbeCurrentAddr(v); + iContinue = sqlite3VdbeMakeLabel(pParse); + + /* Suppress duplicates for UNION, EXCEPT, and INTERSECT + */ + if( regPrev ){ + int addr1, addr2; + addr1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); VdbeCoverage(v); + addr2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iSdst, regPrev+1, pIn->nSdst, + (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, addr2+2, iContinue, addr2+2); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp3(v, OP_Copy, pIn->iSdst, regPrev+1, pIn->nSdst-1); + sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev); + } + if( pParse->db->mallocFailed ) return 0; + + /* Suppress the first OFFSET entries if there is an OFFSET clause + */ + codeOffset(v, p->iOffset, iContinue); + + assert( pDest->eDest!=SRT_Exists ); + assert( pDest->eDest!=SRT_Table ); + switch( pDest->eDest ){ + /* Store the result as data using a unique key. + */ + case SRT_EphemTab: { + int r1 = sqlite3GetTempReg(pParse); + int r2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, r1); + sqlite3VdbeAddOp2(v, OP_NewRowid, pDest->iSDParm, r2); + sqlite3VdbeAddOp3(v, OP_Insert, pDest->iSDParm, r1, r2); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + sqlite3ReleaseTempReg(pParse, r2); + sqlite3ReleaseTempReg(pParse, r1); + break; + } + +#ifndef SQLITE_OMIT_SUBQUERY + /* If we are creating a set for an "expr IN (SELECT ...)". + */ + case SRT_Set: { + int r1; + testcase( pIn->nSdst>1 ); + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, + r1, pDest->zAffSdst, pIn->nSdst); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pDest->iSDParm, r1, + pIn->iSdst, pIn->nSdst); + sqlite3ReleaseTempReg(pParse, r1); + break; + } + + /* If this is a scalar select that is part of an expression, then + ** store the results in the appropriate memory cell and break out + ** of the scan loop. Note that the select might return multiple columns + ** if it is the RHS of a row-value IN operator. + */ + case SRT_Mem: { + if( pParse->nErr==0 ){ + testcase( pIn->nSdst>1 ); + sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, pIn->nSdst); + } + /* The LIMIT clause will jump out of the loop for us */ + break; + } +#endif /* #ifndef SQLITE_OMIT_SUBQUERY */ + + /* The results are stored in a sequence of registers + ** starting at pDest->iSdst. Then the co-routine yields. + */ + case SRT_Coroutine: { + if( pDest->iSdst==0 ){ + pDest->iSdst = sqlite3GetTempRange(pParse, pIn->nSdst); + pDest->nSdst = pIn->nSdst; + } + sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSdst, pIn->nSdst); + sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); + break; + } + + /* If none of the above, then the result destination must be + ** SRT_Output. This routine is never called with any other + ** destination other than the ones handled above or SRT_Output. + ** + ** For SRT_Output, results are stored in a sequence of registers. + ** Then the OP_ResultRow opcode is used to cause sqlite3_step() to + ** return the next row of result. + */ + default: { + assert( pDest->eDest==SRT_Output ); + sqlite3VdbeAddOp2(v, OP_ResultRow, pIn->iSdst, pIn->nSdst); + break; + } + } + + /* Jump to the end of the loop if the LIMIT is reached. + */ + if( p->iLimit ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v); + } + + /* Generate the subroutine return + */ + sqlite3VdbeResolveLabel(v, iContinue); + sqlite3VdbeAddOp1(v, OP_Return, regReturn); + + return addr; +} + +/* +** Alternative compound select code generator for cases when there +** is an ORDER BY clause. +** +** We assume a query of the following form: +** +** ORDER BY +** +** is one of UNION ALL, UNION, EXCEPT, or INTERSECT. The idea +** is to code both and with the ORDER BY clause as +** co-routines. Then run the co-routines in parallel and merge the results +** into the output. In addition to the two coroutines (called selectA and +** selectB) there are 7 subroutines: +** +** outA: Move the output of the selectA coroutine into the output +** of the compound query. +** +** outB: Move the output of the selectB coroutine into the output +** of the compound query. (Only generated for UNION and +** UNION ALL. EXCEPT and INSERTSECT never output a row that +** appears only in B.) +** +** AltB: Called when there is data from both coroutines and AB. +** +** EofA: Called when data is exhausted from selectA. +** +** EofB: Called when data is exhausted from selectB. +** +** The implementation of the latter five subroutines depend on which +** is used: +** +** +** UNION ALL UNION EXCEPT INTERSECT +** ------------- ----------------- -------------- ----------------- +** AltB: outA, nextA outA, nextA outA, nextA nextA +** +** AeqB: outA, nextA nextA nextA outA, nextA +** +** AgtB: outB, nextB outB, nextB nextB nextB +** +** EofA: outB, nextB outB, nextB halt halt +** +** EofB: outA, nextA outA, nextA outA, nextA halt +** +** In the AltB, AeqB, and AgtB subroutines, an EOF on A following nextA +** causes an immediate jump to EofA and an EOF on B following nextB causes +** an immediate jump to EofB. Within EofA and EofB, and EOF on entry or +** following nextX causes a jump to the end of the select processing. +** +** Duplicate removal in the UNION, EXCEPT, and INTERSECT cases is handled +** within the output subroutine. The regPrev register set holds the previously +** output value. A comparison is made against this value and the output +** is skipped if the next results would be the same as the previous. +** +** The implementation plan is to implement the two coroutines and seven +** subroutines first, then put the control logic at the bottom. Like this: +** +** goto Init +** coA: coroutine for left query (A) +** coB: coroutine for right query (B) +** outA: output one row of A +** outB: output one row of B (UNION and UNION ALL only) +** EofA: ... +** EofB: ... +** AltB: ... +** AeqB: ... +** AgtB: ... +** Init: initialize coroutine registers +** yield coA +** if eof(A) goto EofA +** yield coB +** if eof(B) goto EofB +** Cmpr: Compare A, B +** Jump AltB, AeqB, AgtB +** End: ... +** +** We call AltB, AeqB, AgtB, EofA, and EofB "subroutines" but they are not +** actually called using Gosub and they do not Return. EofA and EofB loop +** until all data is exhausted then jump to the "end" labe. AltB, AeqB, +** and AgtB jump to either L2 or to one of EofA or EofB. +*/ +#ifndef SQLITE_OMIT_COMPOUND_SELECT +static int multiSelectOrderBy( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + int i, j; /* Loop counters */ + Select *pPrior; /* Another SELECT immediately to our left */ + Vdbe *v; /* Generate code to this VDBE */ + SelectDest destA; /* Destination for coroutine A */ + SelectDest destB; /* Destination for coroutine B */ + int regAddrA; /* Address register for select-A coroutine */ + int regAddrB; /* Address register for select-B coroutine */ + int addrSelectA; /* Address of the select-A coroutine */ + int addrSelectB; /* Address of the select-B coroutine */ + int regOutA; /* Address register for the output-A subroutine */ + int regOutB; /* Address register for the output-B subroutine */ + int addrOutA; /* Address of the output-A subroutine */ + int addrOutB = 0; /* Address of the output-B subroutine */ + int addrEofA; /* Address of the select-A-exhausted subroutine */ + int addrEofA_noB; /* Alternate addrEofA if B is uninitialized */ + int addrEofB; /* Address of the select-B-exhausted subroutine */ + int addrAltB; /* Address of the AB subroutine */ + int regLimitA; /* Limit register for select-A */ + int regLimitB; /* Limit register for select-A */ + int regPrev; /* A range of registers to hold previous output */ + int savedLimit; /* Saved value of p->iLimit */ + int savedOffset; /* Saved value of p->iOffset */ + int labelCmpr; /* Label for the start of the merge algorithm */ + int labelEnd; /* Label for the end of the overall SELECT stmt */ + int addr1; /* Jump instructions that get retargetted */ + int op; /* One of TK_ALL, TK_UNION, TK_EXCEPT, TK_INTERSECT */ + KeyInfo *pKeyDup = 0; /* Comparison information for duplicate removal */ + KeyInfo *pKeyMerge; /* Comparison information for merging rows */ + sqlite3 *db; /* Database connection */ + ExprList *pOrderBy; /* The ORDER BY clause */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + int *aPermute; /* Mapping from ORDER BY terms to result set columns */ + + assert( p->pOrderBy!=0 ); + assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */ + db = pParse->db; + v = pParse->pVdbe; + assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */ + labelEnd = sqlite3VdbeMakeLabel(pParse); + labelCmpr = sqlite3VdbeMakeLabel(pParse); + + + /* Patch up the ORDER BY clause + */ + op = p->op; + pPrior = p->pPrior; + assert( pPrior->pOrderBy==0 ); + pOrderBy = p->pOrderBy; + assert( pOrderBy ); + nOrderBy = pOrderBy->nExpr; + + /* For operators other than UNION ALL we have to make sure that + ** the ORDER BY clause covers every term of the result set. Add + ** terms to the ORDER BY clause as necessary. + */ + if( op!=TK_ALL ){ + for(i=1; db->mallocFailed==0 && i<=p->pEList->nExpr; i++){ + struct ExprList_item *pItem; + for(j=0, pItem=pOrderBy->a; ju.x.iOrderByCol>0 ); + if( pItem->u.x.iOrderByCol==i ) break; + } + if( j==nOrderBy ){ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return SQLITE_NOMEM_BKPT; + pNew->flags |= EP_IntValue; + pNew->u.iValue = i; + p->pOrderBy = pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew); + if( pOrderBy ) pOrderBy->a[nOrderBy++].u.x.iOrderByCol = (u16)i; + } + } + } + + /* Compute the comparison permutation and keyinfo that is used with + ** the permutation used to determine if the next + ** row of results comes from selectA or selectB. Also add explicit + ** collations to the ORDER BY clause terms so that when the subqueries + ** to the right and the left are evaluated, they use the correct + ** collation. + */ + aPermute = sqlite3DbMallocRawNN(db, sizeof(int)*(nOrderBy + 1)); + if( aPermute ){ + struct ExprList_item *pItem; + aPermute[0] = nOrderBy; + for(i=1, pItem=pOrderBy->a; i<=nOrderBy; i++, pItem++){ + assert( pItem->u.x.iOrderByCol>0 ); + assert( pItem->u.x.iOrderByCol<=p->pEList->nExpr ); + aPermute[i] = pItem->u.x.iOrderByCol - 1; + } + pKeyMerge = multiSelectOrderByKeyInfo(pParse, p, 1); + }else{ + pKeyMerge = 0; + } + + /* Reattach the ORDER BY clause to the query. + */ + p->pOrderBy = pOrderBy; + pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0); + + /* Allocate a range of temporary registers and the KeyInfo needed + ** for the logic that removes duplicate result rows when the + ** operator is UNION, EXCEPT, or INTERSECT (but not UNION ALL). + */ + if( op==TK_ALL ){ + regPrev = 0; + }else{ + int nExpr = p->pEList->nExpr; + assert( nOrderBy>=nExpr || db->mallocFailed ); + regPrev = pParse->nMem+1; + pParse->nMem += nExpr+1; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regPrev); + pKeyDup = sqlite3KeyInfoAlloc(db, nExpr, 1); + if( pKeyDup ){ + assert( sqlite3KeyInfoIsWriteable(pKeyDup) ); + for(i=0; iaColl[i] = multiSelectCollSeq(pParse, p, i); + pKeyDup->aSortFlags[i] = 0; + } + } + } + + /* Separate the left and the right query from one another + */ + p->pPrior = 0; + pPrior->pNext = 0; + sqlite3ResolveOrderGroupBy(pParse, p, p->pOrderBy, "ORDER"); + if( pPrior->pPrior==0 ){ + sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER"); + } + + /* Compute the limit registers */ + computeLimitRegisters(pParse, p, labelEnd); + if( p->iLimit && op==TK_ALL ){ + regLimitA = ++pParse->nMem; + regLimitB = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Copy, p->iOffset ? p->iOffset+1 : p->iLimit, + regLimitA); + sqlite3VdbeAddOp2(v, OP_Copy, regLimitA, regLimitB); + }else{ + regLimitA = regLimitB = 0; + } + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = 0; + + regAddrA = ++pParse->nMem; + regAddrB = ++pParse->nMem; + regOutA = ++pParse->nMem; + regOutB = ++pParse->nMem; + sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA); + sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB); + + ExplainQueryPlan((pParse, 1, "MERGE (%s)", selectOpName(p->op))); + + /* Generate a coroutine to evaluate the SELECT statement to the + ** left of the compound operator - the "A" select. + */ + addrSelectA = sqlite3VdbeCurrentAddr(v) + 1; + addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA); + VdbeComment((v, "left SELECT")); + pPrior->iLimit = regLimitA; + ExplainQueryPlan((pParse, 1, "LEFT")); + sqlite3Select(pParse, pPrior, &destA); + sqlite3VdbeEndCoroutine(v, regAddrA); + sqlite3VdbeJumpHere(v, addr1); + + /* Generate a coroutine to evaluate the SELECT statement on + ** the right - the "B" select + */ + addrSelectB = sqlite3VdbeCurrentAddr(v) + 1; + addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrB, 0, addrSelectB); + VdbeComment((v, "right SELECT")); + savedLimit = p->iLimit; + savedOffset = p->iOffset; + p->iLimit = regLimitB; + p->iOffset = 0; + ExplainQueryPlan((pParse, 1, "RIGHT")); + sqlite3Select(pParse, p, &destB); + p->iLimit = savedLimit; + p->iOffset = savedOffset; + sqlite3VdbeEndCoroutine(v, regAddrB); + + /* Generate a subroutine that outputs the current row of the A + ** select as the next output row of the compound select. + */ + VdbeNoopComment((v, "Output routine for A")); + addrOutA = generateOutputSubroutine(pParse, + p, &destA, pDest, regOutA, + regPrev, pKeyDup, labelEnd); + + /* Generate a subroutine that outputs the current row of the B + ** select as the next output row of the compound select. + */ + if( op==TK_ALL || op==TK_UNION ){ + VdbeNoopComment((v, "Output routine for B")); + addrOutB = generateOutputSubroutine(pParse, + p, &destB, pDest, regOutB, + regPrev, pKeyDup, labelEnd); + } + sqlite3KeyInfoUnref(pKeyDup); + + /* Generate a subroutine to run when the results from select A + ** are exhausted and only data in select B remains. + */ + if( op==TK_EXCEPT || op==TK_INTERSECT ){ + addrEofA_noB = addrEofA = labelEnd; + }else{ + VdbeNoopComment((v, "eof-A subroutine")); + addrEofA = sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); + addrEofA_noB = sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, labelEnd); + VdbeCoverage(v); + sqlite3VdbeGoto(v, addrEofA); + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + } + + /* Generate a subroutine to run when the results from select B + ** are exhausted and only data in select A remains. + */ + if( op==TK_INTERSECT ){ + addrEofB = addrEofA; + if( p->nSelectRow > pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow; + }else{ + VdbeNoopComment((v, "eof-B subroutine")); + addrEofB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, labelEnd); VdbeCoverage(v); + sqlite3VdbeGoto(v, addrEofB); + } + + /* Generate code to handle the case of AB + */ + VdbeNoopComment((v, "A-gt-B subroutine")); + addrAgtB = sqlite3VdbeCurrentAddr(v); + if( op==TK_ALL || op==TK_UNION ){ + sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); + } + sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); + sqlite3VdbeGoto(v, labelCmpr); + + /* This code runs once to initialize everything. + */ + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA_noB); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); + + /* Implement the main merge loop + */ + sqlite3VdbeResolveLabel(v, labelCmpr); + sqlite3VdbeAddOp4(v, OP_Permutation, 0, 0, 0, (char*)aPermute, P4_INTARRAY); + sqlite3VdbeAddOp4(v, OP_Compare, destA.iSdst, destB.iSdst, nOrderBy, + (char*)pKeyMerge, P4_KEYINFO); + sqlite3VdbeChangeP5(v, OPFLAG_PERMUTE); + sqlite3VdbeAddOp3(v, OP_Jump, addrAltB, addrAeqB, addrAgtB); VdbeCoverage(v); + + /* Jump to the this point in order to terminate the query. + */ + sqlite3VdbeResolveLabel(v, labelEnd); + + /* Reassembly the compound query so that it will be freed correctly + ** by the calling function */ + if( p->pPrior ){ + sqlite3SelectDelete(db, p->pPrior); + } + p->pPrior = pPrior; + pPrior->pNext = p; + + /*** TBD: Insert subroutine calls to close cursors on incomplete + **** subqueries ****/ + ExplainQueryPlanPop(pParse); + return pParse->nErr!=0; +} +#endif + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + +/* An instance of the SubstContext object describes an substitution edit +** to be performed on a parse tree. +** +** All references to columns in table iTable are to be replaced by corresponding +** expressions in pEList. +*/ +typedef struct SubstContext { + Parse *pParse; /* The parsing context */ + int iTable; /* Replace references to this table */ + int iNewTable; /* New table number */ + int isLeftJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */ + ExprList *pEList; /* Replacement expressions */ +} SubstContext; + +/* Forward Declarations */ +static void substExprList(SubstContext*, ExprList*); +static void substSelect(SubstContext*, Select*, int); + +/* +** Scan through the expression pExpr. Replace every reference to +** a column in table number iTable with a copy of the iColumn-th +** entry in pEList. (But leave references to the ROWID column +** unchanged.) +** +** This routine is part of the flattening procedure. A subquery +** whose result set is defined by pEList appears as entry in the +** FROM clause of a SELECT such that the VDBE cursor assigned to that +** FORM clause entry is iTable. This routine makes the necessary +** changes to pExpr so that it refers directly to the source table +** of the subquery rather the result set of the subquery. +*/ +static Expr *substExpr( + SubstContext *pSubst, /* Description of the substitution */ + Expr *pExpr /* Expr in which substitution occurs */ +){ + if( pExpr==0 ) return 0; + if( ExprHasProperty(pExpr, EP_FromJoin) + && pExpr->iRightJoinTable==pSubst->iTable + ){ + pExpr->iRightJoinTable = pSubst->iNewTable; + } + if( pExpr->op==TK_COLUMN + && pExpr->iTable==pSubst->iTable + && !ExprHasProperty(pExpr, EP_FixedCol) + ){ + if( pExpr->iColumn<0 ){ + pExpr->op = TK_NULL; + }else{ + Expr *pNew; + Expr *pCopy = pSubst->pEList->a[pExpr->iColumn].pExpr; + Expr ifNullRow; + assert( pSubst->pEList!=0 && pExpr->iColumnpEList->nExpr ); + assert( pExpr->pRight==0 ); + if( sqlite3ExprIsVector(pCopy) ){ + sqlite3VectorErrorMsg(pSubst->pParse, pCopy); + }else{ + sqlite3 *db = pSubst->pParse->db; + if( pSubst->isLeftJoin && pCopy->op!=TK_COLUMN ){ + memset(&ifNullRow, 0, sizeof(ifNullRow)); + ifNullRow.op = TK_IF_NULL_ROW; + ifNullRow.pLeft = pCopy; + ifNullRow.iTable = pSubst->iNewTable; + ifNullRow.flags = EP_Skip; + pCopy = &ifNullRow; + } + testcase( ExprHasProperty(pCopy, EP_Subquery) ); + pNew = sqlite3ExprDup(db, pCopy, 0); + if( pNew && pSubst->isLeftJoin ){ + ExprSetProperty(pNew, EP_CanBeNull); + } + if( pNew && ExprHasProperty(pExpr,EP_FromJoin) ){ + pNew->iRightJoinTable = pExpr->iRightJoinTable; + ExprSetProperty(pNew, EP_FromJoin); + } + sqlite3ExprDelete(db, pExpr); + pExpr = pNew; + + /* Ensure that the expression now has an implicit collation sequence, + ** just as it did when it was a column of a view or sub-query. */ + if( pExpr ){ + if( pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE ){ + CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse, pExpr); + pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr, + (pColl ? pColl->zName : "BINARY") + ); + } + ExprClearProperty(pExpr, EP_Collate); + } + } + } + }else{ + if( pExpr->op==TK_IF_NULL_ROW && pExpr->iTable==pSubst->iTable ){ + pExpr->iTable = pSubst->iNewTable; + } + pExpr->pLeft = substExpr(pSubst, pExpr->pLeft); + pExpr->pRight = substExpr(pSubst, pExpr->pRight); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + substSelect(pSubst, pExpr->x.pSelect, 1); + }else{ + substExprList(pSubst, pExpr->x.pList); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window *pWin = pExpr->y.pWin; + pWin->pFilter = substExpr(pSubst, pWin->pFilter); + substExprList(pSubst, pWin->pPartition); + substExprList(pSubst, pWin->pOrderBy); + } +#endif + } + return pExpr; +} +static void substExprList( + SubstContext *pSubst, /* Description of the substitution */ + ExprList *pList /* List to scan and in which to make substitutes */ +){ + int i; + if( pList==0 ) return; + for(i=0; inExpr; i++){ + pList->a[i].pExpr = substExpr(pSubst, pList->a[i].pExpr); + } +} +static void substSelect( + SubstContext *pSubst, /* Description of the substitution */ + Select *p, /* SELECT statement in which to make substitutions */ + int doPrior /* Do substitutes on p->pPrior too */ +){ + SrcList *pSrc; + struct SrcList_item *pItem; + int i; + if( !p ) return; + do{ + substExprList(pSubst, p->pEList); + substExprList(pSubst, p->pGroupBy); + substExprList(pSubst, p->pOrderBy); + p->pHaving = substExpr(pSubst, p->pHaving); + p->pWhere = substExpr(pSubst, p->pWhere); + pSrc = p->pSrc; + assert( pSrc!=0 ); + for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ + substSelect(pSubst, pItem->pSelect, 1); + if( pItem->fg.isTabFunc ){ + substExprList(pSubst, pItem->u1.pFuncArg); + } + } + }while( doPrior && (p = p->pPrior)!=0 ); +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* +** pSelect is a SELECT statement and pSrcItem is one item in the FROM +** clause of that SELECT. +** +** This routine scans the entire SELECT statement and recomputes the +** pSrcItem->colUsed mask. +*/ +static int recomputeColumnsUsedExpr(Walker *pWalker, Expr *pExpr){ + struct SrcList_item *pItem; + if( pExpr->op!=TK_COLUMN ) return WRC_Continue; + pItem = pWalker->u.pSrcItem; + if( pItem->iCursor!=pExpr->iTable ) return WRC_Continue; + if( pExpr->iColumn<0 ) return WRC_Continue; + pItem->colUsed |= sqlite3ExprColUsed(pExpr); + return WRC_Continue; +} +static void recomputeColumnsUsed( + Select *pSelect, /* The complete SELECT statement */ + struct SrcList_item *pSrcItem /* Which FROM clause item to recompute */ +){ + Walker w; + if( NEVER(pSrcItem->pTab==0) ) return; + memset(&w, 0, sizeof(w)); + w.xExprCallback = recomputeColumnsUsedExpr; + w.xSelectCallback = sqlite3SelectWalkNoop; + w.u.pSrcItem = pSrcItem; + pSrcItem->colUsed = 0; + sqlite3WalkSelect(&w, pSelect); +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* +** This routine attempts to flatten subqueries as a performance optimization. +** This routine returns 1 if it makes changes and 0 if no flattening occurs. +** +** To understand the concept of flattening, consider the following +** query: +** +** SELECT a FROM (SELECT x+y AS a FROM t1 WHERE z<100) WHERE a>5 +** +** The default way of implementing this query is to execute the +** subquery first and store the results in a temporary table, then +** run the outer query on that temporary table. This requires two +** passes over the data. Furthermore, because the temporary table +** has no indices, the WHERE clause on the outer query cannot be +** optimized. +** +** This routine attempts to rewrite queries such as the above into +** a single flat select, like this: +** +** SELECT x+y AS a FROM t1 WHERE z<100 AND a>5 +** +** The code generated for this simplification gives the same result +** but only has to scan the data once. And because indices might +** exist on the table t1, a complete scan of the data might be +** avoided. +** +** Flattening is subject to the following constraints: +** +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** The subquery and the outer query cannot both be aggregates. +** +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** (2) If the subquery is an aggregate then +** (2a) the outer query must not be a join and +** (2b) the outer query must not use subqueries +** other than the one FROM-clause subquery that is a candidate +** for flattening. (This is due to ticket [2f7170d73bf9abf80] +** from 2015-02-09.) +** +** (3) If the subquery is the right operand of a LEFT JOIN then +** (3a) the subquery may not be a join and +** (3b) the FROM clause of the subquery may not contain a virtual +** table and +** (3c) the outer query may not be an aggregate. +** (3d) the outer query may not be DISTINCT. +** +** (4) The subquery can not be DISTINCT. +** +** (**) At one point restrictions (4) and (5) defined a subset of DISTINCT +** sub-queries that were excluded from this optimization. Restriction +** (4) has since been expanded to exclude all DISTINCT subqueries. +** +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** If the subquery is aggregate, the outer query may not be DISTINCT. +** +** (7) The subquery must have a FROM clause. TODO: For subqueries without +** A FROM clause, consider adding a FROM clause with the special +** table sqlite_once that consists of a single row containing a +** single NULL. +** +** (8) If the subquery uses LIMIT then the outer query may not be a join. +** +** (9) If the subquery uses LIMIT then the outer query may not be aggregate. +** +** (**) Restriction (10) was removed from the code on 2005-02-05 but we +** accidently carried the comment forward until 2014-09-15. Original +** constraint: "If the subquery is aggregate then the outer query +** may not use LIMIT." +** +** (11) The subquery and the outer query may not both have ORDER BY clauses. +** +** (**) Not implemented. Subsumed into restriction (3). Was previously +** a separate restriction deriving from ticket #350. +** +** (13) The subquery and outer query may not both use LIMIT. +** +** (14) The subquery may not use OFFSET. +** +** (15) If the outer query is part of a compound select, then the +** subquery may not use LIMIT. +** (See ticket #2339 and ticket [02a8e81d44]). +** +** (16) If the outer query is aggregate, then the subquery may not +** use ORDER BY. (Ticket #2942) This used to not matter +** until we introduced the group_concat() function. +** +** (17) If the subquery is a compound select, then +** (17a) all compound operators must be a UNION ALL, and +** (17b) no terms within the subquery compound may be aggregate +** or DISTINCT, and +** (17c) every term within the subquery compound must have a FROM clause +** (17d) the outer query may not be +** (17d1) aggregate, or +** (17d2) DISTINCT, or +** (17d3) a join. +** (17e) the subquery may not contain window functions +** +** The parent and sub-query may contain WHERE clauses. Subject to +** rules (11), (13) and (14), they may also contain ORDER BY, +** LIMIT and OFFSET clauses. The subquery cannot use any compound +** operator other than UNION ALL because all the other compound +** operators have an implied DISTINCT which is disallowed by +** restriction (4). +** +** Also, each component of the sub-query must return the same number +** of result columns. This is actually a requirement for any compound +** SELECT statement, but all the code here does is make sure that no +** such (illegal) sub-query is flattened. The caller will detect the +** syntax error and return a detailed message. +** +** (18) If the sub-query is a compound select, then all terms of the +** ORDER BY clause of the parent must be simple references to +** columns of the sub-query. +** +** (19) If the subquery uses LIMIT then the outer query may not +** have a WHERE clause. +** +** (20) If the sub-query is a compound select, then it must not use +** an ORDER BY clause. Ticket #3773. We could relax this constraint +** somewhat by saying that the terms of the ORDER BY clause must +** appear as unmodified result columns in the outer query. But we +** have other optimizations in mind to deal with that case. +** +** (21) If the subquery uses LIMIT then the outer query may not be +** DISTINCT. (See ticket [752e1646fc]). +** +** (22) The subquery may not be a recursive CTE. +** +** (**) Subsumed into restriction (17d3). Was: If the outer query is +** a recursive CTE, then the sub-query may not be a compound query. +** This restriction is because transforming the +** parent to a compound query confuses the code that handles +** recursive queries in multiSelect(). +** +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** The subquery may not be an aggregate that uses the built-in min() or +** or max() functions. (Without this restriction, a query like: +** "SELECT x FROM (SELECT max(y), x FROM t1)" would not necessarily +** return the value X for which Y was maximal.) +** +** (25) If either the subquery or the parent query contains a window +** function in the select list or ORDER BY clause, flattening +** is not attempted. +** +** +** In this routine, the "p" parameter is a pointer to the outer query. +** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query +** uses aggregates. +** +** If flattening is not attempted, this routine is a no-op and returns 0. +** If flattening is attempted this routine returns 1. +** +** All of the expression analysis must occur on both the outer query and +** the subquery before this routine runs. +*/ +static int flattenSubquery( + Parse *pParse, /* Parsing context */ + Select *p, /* The parent or outer SELECT statement */ + int iFrom, /* Index in p->pSrc->a[] of the inner subquery */ + int isAgg /* True if outer SELECT uses aggregate functions */ +){ + const char *zSavedAuthContext = pParse->zAuthContext; + Select *pParent; /* Current UNION ALL term of the other query */ + Select *pSub; /* The inner query or "subquery" */ + Select *pSub1; /* Pointer to the rightmost select in sub-query */ + SrcList *pSrc; /* The FROM clause of the outer query */ + SrcList *pSubSrc; /* The FROM clause of the subquery */ + int iParent; /* VDBE cursor number of the pSub result set temp table */ + int iNewParent = -1;/* Replacement table for iParent */ + int isLeftJoin = 0; /* True if pSub is the right side of a LEFT JOIN */ + int i; /* Loop counter */ + Expr *pWhere; /* The WHERE clause */ + struct SrcList_item *pSubitem; /* The subquery */ + sqlite3 *db = pParse->db; + Walker w; /* Walker to persist agginfo data */ + + /* Check to see if flattening is permitted. Return 0 if not. + */ + assert( p!=0 ); + assert( p->pPrior==0 ); + if( OptimizationDisabled(db, SQLITE_QueryFlattener) ) return 0; + pSrc = p->pSrc; + assert( pSrc && iFrom>=0 && iFromnSrc ); + pSubitem = &pSrc->a[iFrom]; + iParent = pSubitem->iCursor; + pSub = pSubitem->pSelect; + assert( pSub!=0 ); + +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin || pSub->pWin ) return 0; /* Restriction (25) */ +#endif + + pSubSrc = pSub->pSrc; + assert( pSubSrc ); + /* Prior to version 3.1.2, when LIMIT and OFFSET had to be simple constants, + ** not arbitrary expressions, we allowed some combining of LIMIT and OFFSET + ** because they could be computed at compile-time. But when LIMIT and OFFSET + ** became arbitrary expressions, we were forced to add restrictions (13) + ** and (14). */ + if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */ + if( pSub->pLimit && pSub->pLimit->pRight ) return 0; /* Restriction (14) */ + if( (p->selFlags & SF_Compound)!=0 && pSub->pLimit ){ + return 0; /* Restriction (15) */ + } + if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */ + if( pSub->selFlags & SF_Distinct ) return 0; /* Restriction (4) */ + if( pSub->pLimit && (pSrc->nSrc>1 || isAgg) ){ + return 0; /* Restrictions (8)(9) */ + } + if( p->pOrderBy && pSub->pOrderBy ){ + return 0; /* Restriction (11) */ + } + if( isAgg && pSub->pOrderBy ) return 0; /* Restriction (16) */ + if( pSub->pLimit && p->pWhere ) return 0; /* Restriction (19) */ + if( pSub->pLimit && (p->selFlags & SF_Distinct)!=0 ){ + return 0; /* Restriction (21) */ + } + if( pSub->selFlags & (SF_Recursive) ){ + return 0; /* Restrictions (22) */ + } + + /* + ** If the subquery is the right operand of a LEFT JOIN, then the + ** subquery may not be a join itself (3a). Example of why this is not + ** allowed: + ** + ** t1 LEFT OUTER JOIN (t2 JOIN t3) + ** + ** If we flatten the above, we would get + ** + ** (t1 LEFT OUTER JOIN t2) JOIN t3 + ** + ** which is not at all the same thing. + ** + ** If the subquery is the right operand of a LEFT JOIN, then the outer + ** query cannot be an aggregate. (3c) This is an artifact of the way + ** aggregates are processed - there is no mechanism to determine if + ** the LEFT JOIN table should be all-NULL. + ** + ** See also tickets #306, #350, and #3300. + */ + if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){ + isLeftJoin = 1; + if( pSubSrc->nSrc>1 /* (3a) */ + || isAgg /* (3b) */ + || IsVirtual(pSubSrc->a[0].pTab) /* (3c) */ + || (p->selFlags & SF_Distinct)!=0 /* (3d) */ + ){ + return 0; + } + } +#ifdef SQLITE_EXTRA_IFNULLROW + else if( iFrom>0 && !isAgg ){ + /* Setting isLeftJoin to -1 causes OP_IfNullRow opcodes to be generated for + ** every reference to any result column from subquery in a join, even + ** though they are not necessary. This will stress-test the OP_IfNullRow + ** opcode. */ + isLeftJoin = -1; + } +#endif + + /* 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 + ** that make up the compound SELECT are allowed to be aggregate or distinct + ** queries. + */ + if( pSub->pPrior ){ + if( pSub->pOrderBy ){ + return 0; /* Restriction (20) */ + } + if( isAgg || (p->selFlags & SF_Distinct)!=0 || pSrc->nSrc!=1 ){ + return 0; /* (17d1), (17d2), or (17d3) */ + } + for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){ + testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); + testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); + assert( pSub->pSrc!=0 ); + assert( pSub->pEList->nExpr==pSub1->pEList->nExpr ); + if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 /* (17b) */ + || (pSub1->pPrior && pSub1->op!=TK_ALL) /* (17a) */ + || pSub1->pSrc->nSrc<1 /* (17c) */ +#ifndef SQLITE_OMIT_WINDOWFUNC + || pSub1->pWin /* (17e) */ +#endif + ){ + return 0; + } + testcase( pSub1->pSrc->nSrc>1 ); + } + + /* Restriction (18). */ + if( p->pOrderBy ){ + int ii; + for(ii=0; iipOrderBy->nExpr; ii++){ + if( p->pOrderBy->a[ii].u.x.iOrderByCol==0 ) return 0; + } + } + } + + /* Ex-restriction (23): + ** The only way that the recursive part of a CTE can contain a compound + ** subquery is for the subquery to be one term of a join. But if the + ** subquery is a join, then the flattening has already been stopped by + ** restriction (17d3) + */ + assert( (p->selFlags & SF_Recursive)==0 || pSub->pPrior==0 ); + + /***** If we reach this point, flattening is permitted. *****/ + SELECTTRACE(1,pParse,p,("flatten %u.%p from term %d\n", + pSub->selId, pSub, iFrom)); + + /* Authorize the subquery */ + pParse->zAuthContext = pSubitem->zName; + TESTONLY(i =) sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0); + testcase( i==SQLITE_DENY ); + pParse->zAuthContext = zSavedAuthContext; + + /* If the sub-query is a compound SELECT statement, then (by restrictions + ** 17 and 18 above) it must be a UNION ALL and the parent query must + ** be of the form: + ** + ** SELECT FROM () + ** + ** followed by any ORDER BY, LIMIT and/or OFFSET clauses. This block + ** creates N-1 copies of the parent query without any ORDER BY, LIMIT or + ** OFFSET clauses and joins them to the left-hand-side of the original + ** using UNION ALL operators. In this case N is the number of simple + ** select statements in the compound sub-query. + ** + ** Example: + ** + ** SELECT a+1 FROM ( + ** SELECT x FROM tab + ** UNION ALL + ** SELECT y FROM tab + ** UNION ALL + ** SELECT abs(z*2) FROM tab2 + ** ) WHERE a!=5 ORDER BY 1 + ** + ** Transformed into: + ** + ** SELECT x+1 FROM tab WHERE x+1!=5 + ** UNION ALL + ** SELECT y+1 FROM tab WHERE y+1!=5 + ** UNION ALL + ** SELECT abs(z*2)+1 FROM tab2 WHERE abs(z*2)+1!=5 + ** ORDER BY 1 + ** + ** We call this the "compound-subquery flattening". + */ + for(pSub=pSub->pPrior; pSub; pSub=pSub->pPrior){ + Select *pNew; + ExprList *pOrderBy = p->pOrderBy; + Expr *pLimit = p->pLimit; + Select *pPrior = p->pPrior; + p->pOrderBy = 0; + p->pSrc = 0; + p->pPrior = 0; + p->pLimit = 0; + pNew = sqlite3SelectDup(db, p, 0); + p->pLimit = pLimit; + p->pOrderBy = pOrderBy; + p->pSrc = pSrc; + p->op = TK_ALL; + if( pNew==0 ){ + p->pPrior = pPrior; + }else{ + pNew->pPrior = pPrior; + if( pPrior ) pPrior->pNext = pNew; + pNew->pNext = p; + p->pPrior = pNew; + SELECTTRACE(2,pParse,p,("compound-subquery flattener" + " creates %u as peer\n",pNew->selId)); + } + if( db->mallocFailed ) return 1; + } + + /* Begin flattening the iFrom-th entry of the FROM clause + ** in the outer query. + */ + pSub = pSub1 = pSubitem->pSelect; + + /* Delete the transient table structure associated with the + ** subquery + */ + sqlite3DbFree(db, pSubitem->zDatabase); + sqlite3DbFree(db, pSubitem->zName); + sqlite3DbFree(db, pSubitem->zAlias); + pSubitem->zDatabase = 0; + pSubitem->zName = 0; + pSubitem->zAlias = 0; + pSubitem->pSelect = 0; + + /* Defer deleting the Table object associated with the + ** subquery until code generation is + ** complete, since there may still exist Expr.pTab entries that + ** refer to the subquery even after flattening. Ticket #3346. + ** + ** pSubitem->pTab is always non-NULL by test restrictions and tests above. + */ + if( ALWAYS(pSubitem->pTab!=0) ){ + Table *pTabToDel = pSubitem->pTab; + if( pTabToDel->nTabRef==1 ){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + pTabToDel->pNextZombie = pToplevel->pZombieTab; + pToplevel->pZombieTab = pTabToDel; + }else{ + pTabToDel->nTabRef--; + } + pSubitem->pTab = 0; + } + + /* The following loop runs once for each term in a compound-subquery + ** flattening (as described above). If we are doing a different kind + ** of flattening - a flattening other than a compound-subquery flattening - + ** then this loop only runs once. + ** + ** This loop moves all of the FROM elements of the subquery into the + ** the FROM clause of the outer query. Before doing this, remember + ** the cursor number for the original outer query FROM element in + ** iParent. The iParent cursor will never be used. Subsequent code + ** will scan expressions looking for iParent references and replace + ** those references with expressions that resolve to the subquery FROM + ** elements we are now copying in. + */ + for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ + int nSubSrc; + u8 jointype = 0; + assert( pSub!=0 ); + pSubSrc = pSub->pSrc; /* FROM clause of subquery */ + nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */ + pSrc = pParent->pSrc; /* FROM clause of the outer query */ + + if( pSrc ){ + assert( pParent==p ); /* First time through the loop */ + jointype = pSubitem->fg.jointype; + }else{ + assert( pParent!=p ); /* 2nd and subsequent times through the loop */ + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; + } + + /* The subquery uses a single slot of the FROM clause of the outer + ** query. If the subquery has more than one element in its FROM clause, + ** then expand the outer query to make space for it to hold all elements + ** of the subquery. + ** + ** Example: + ** + ** SELECT * FROM tabA, (SELECT * FROM sub1, sub2), tabB; + ** + ** The outer query has 3 slots in its FROM clause. One slot of the + ** outer query (the middle slot) is used by the subquery. The next + ** block of code will expand the outer query FROM clause to 4 slots. + ** The middle slot is expanded to two slots in order to make space + ** for the two elements in the FROM clause of the subquery. + */ + if( nSubSrc>1 ){ + pSrc = sqlite3SrcListEnlarge(pParse, pSrc, nSubSrc-1,iFrom+1); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; + } + + /* Transfer the FROM clause terms from the subquery into the + ** outer query. + */ + for(i=0; ia[i+iFrom].pUsing); + assert( pSrc->a[i+iFrom].fg.isTabFunc==0 ); + pSrc->a[i+iFrom] = pSubSrc->a[i]; + iNewParent = pSubSrc->a[i].iCursor; + memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); + } + pSrc->a[iFrom].fg.jointype = jointype; + + /* Now begin substituting subquery result set expressions for + ** references to the iParent in the outer query. + ** + ** Example: + ** + ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b; + ** \ \_____________ subquery __________/ / + ** \_____________________ outer query ______________________________/ + ** + ** We look at every expression in the outer query and every place we see + ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". + */ + if( pSub->pOrderBy && (pParent->selFlags & SF_NoopOrderBy)==0 ){ + /* At this point, any non-zero iOrderByCol values indicate that the + ** ORDER BY column expression is identical to the iOrderByCol'th + ** expression returned by SELECT statement pSub. Since these values + ** do not necessarily correspond to columns in SELECT statement pParent, + ** zero them before transfering the ORDER BY clause. + ** + ** Not doing this may cause an error if a subsequent call to this + ** function attempts to flatten a compound sub-query into pParent + ** (the only way this can happen is if the compound sub-query is + ** currently part of pSub->pSrc). See ticket [d11a6e908f]. */ + ExprList *pOrderBy = pSub->pOrderBy; + for(i=0; inExpr; i++){ + pOrderBy->a[i].u.x.iOrderByCol = 0; + } + assert( pParent->pOrderBy==0 ); + pParent->pOrderBy = pOrderBy; + pSub->pOrderBy = 0; + } + pWhere = pSub->pWhere; + pSub->pWhere = 0; + if( isLeftJoin>0 ){ + sqlite3SetJoinExpr(pWhere, iNewParent); + } + if( pWhere ){ + if( pParent->pWhere ){ + pParent->pWhere = sqlite3PExpr(pParse, TK_AND, pWhere, pParent->pWhere); + }else{ + pParent->pWhere = pWhere; + } + } + if( db->mallocFailed==0 ){ + SubstContext x; + x.pParse = pParse; + x.iTable = iParent; + x.iNewTable = iNewParent; + x.isLeftJoin = isLeftJoin; + x.pEList = pSub->pEList; + substSelect(&x, pParent, 0); + } + + /* The flattened query is a compound if either the inner or the + ** outer query is a compound. */ + pParent->selFlags |= pSub->selFlags & SF_Compound; + assert( (pSub->selFlags & SF_Distinct)==0 ); /* restriction (17b) */ + + /* + ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y; + ** + ** One is tempted to try to add a and b to combine the limits. But this + ** does not work if either limit is negative. + */ + if( pSub->pLimit ){ + pParent->pLimit = pSub->pLimit; + pSub->pLimit = 0; + } + + /* Recompute the SrcList_item.colUsed masks for the flattened + ** tables. */ + for(i=0; ia[i+iFrom]); + } + } + + /* Finially, delete what is left of the subquery and return + ** success. + */ + sqlite3AggInfoPersistWalkerInit(&w, pParse); + sqlite3WalkSelect(&w,pSub1); + sqlite3SelectDelete(db, pSub1); + +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After flattening:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + return 1; +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +/* +** A structure to keep track of all of the column values that are fixed to +** a known value due to WHERE clause constraints of the form COLUMN=VALUE. +*/ +typedef struct WhereConst WhereConst; +struct WhereConst { + Parse *pParse; /* Parsing context */ + int nConst; /* Number for COLUMN=CONSTANT terms */ + int nChng; /* Number of times a constant is propagated */ + Expr **apExpr; /* [i*2] is COLUMN and [i*2+1] is VALUE */ +}; + +/* +** Add a new entry to the pConst object. Except, do not add duplicate +** pColumn entires. Also, do not add if doing so would not be appropriate. +** +** The caller guarantees the pColumn is a column and pValue is a constant. +** This routine has to do some additional checks before completing the +** insert. +*/ +static void constInsert( + WhereConst *pConst, /* The WhereConst into which we are inserting */ + Expr *pColumn, /* The COLUMN part of the constraint */ + Expr *pValue, /* The VALUE part of the constraint */ + Expr *pExpr /* Overall expression: COLUMN=VALUE or VALUE=COLUMN */ +){ + int i; + assert( pColumn->op==TK_COLUMN ); + assert( sqlite3ExprIsConstant(pValue) ); + + if( ExprHasProperty(pColumn, EP_FixedCol) ) return; + if( sqlite3ExprAffinity(pValue)!=0 ) return; + if( !sqlite3IsBinary(sqlite3ExprCompareCollSeq(pConst->pParse,pExpr)) ){ + return; + } + + /* 2018-10-25 ticket [cf5ed20f] + ** Make sure the same pColumn is not inserted more than once */ + for(i=0; inConst; i++){ + const Expr *pE2 = pConst->apExpr[i*2]; + assert( pE2->op==TK_COLUMN ); + if( pE2->iTable==pColumn->iTable + && pE2->iColumn==pColumn->iColumn + ){ + return; /* Already present. Return without doing anything. */ + } + } + + pConst->nConst++; + pConst->apExpr = sqlite3DbReallocOrFree(pConst->pParse->db, pConst->apExpr, + pConst->nConst*2*sizeof(Expr*)); + if( pConst->apExpr==0 ){ + pConst->nConst = 0; + }else{ + pConst->apExpr[pConst->nConst*2-2] = pColumn; + pConst->apExpr[pConst->nConst*2-1] = pValue; + } +} + +/* +** Find all terms of COLUMN=VALUE or VALUE=COLUMN in pExpr where VALUE +** is a constant expression and where the term must be true because it +** is part of the AND-connected terms of the expression. For each term +** found, add it to the pConst structure. +*/ +static void findConstInWhere(WhereConst *pConst, Expr *pExpr){ + Expr *pRight, *pLeft; + if( pExpr==0 ) return; + if( ExprHasProperty(pExpr, EP_FromJoin) ) return; + if( pExpr->op==TK_AND ){ + findConstInWhere(pConst, pExpr->pRight); + findConstInWhere(pConst, pExpr->pLeft); + return; + } + if( pExpr->op!=TK_EQ ) return; + pRight = pExpr->pRight; + pLeft = pExpr->pLeft; + assert( pRight!=0 ); + assert( pLeft!=0 ); + if( pRight->op==TK_COLUMN && sqlite3ExprIsConstant(pLeft) ){ + constInsert(pConst,pRight,pLeft,pExpr); + } + if( pLeft->op==TK_COLUMN && sqlite3ExprIsConstant(pRight) ){ + constInsert(pConst,pLeft,pRight,pExpr); + } +} + +/* +** This is a Walker expression callback. pExpr is a candidate expression +** to be replaced by a value. If pExpr is equivalent to one of the +** columns named in pWalker->u.pConst, then overwrite it with its +** corresponding value. +*/ +static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ + int i; + WhereConst *pConst; + if( pExpr->op!=TK_COLUMN ) return WRC_Continue; + if( ExprHasProperty(pExpr, EP_FixedCol|EP_FromJoin) ){ + testcase( ExprHasProperty(pExpr, EP_FixedCol) ); + testcase( ExprHasProperty(pExpr, EP_FromJoin) ); + return WRC_Continue; + } + pConst = pWalker->u.pConst; + for(i=0; inConst; i++){ + Expr *pColumn = pConst->apExpr[i*2]; + if( pColumn==pExpr ) continue; + if( pColumn->iTable!=pExpr->iTable ) continue; + if( pColumn->iColumn!=pExpr->iColumn ) continue; + /* A match is found. Add the EP_FixedCol property */ + pConst->nChng++; + ExprClearProperty(pExpr, EP_Leaf); + ExprSetProperty(pExpr, EP_FixedCol); + assert( pExpr->pLeft==0 ); + pExpr->pLeft = sqlite3ExprDup(pConst->pParse->db, pConst->apExpr[i*2+1], 0); + break; + } + return WRC_Prune; +} + +/* +** The WHERE-clause constant propagation optimization. +** +** If the WHERE clause contains terms of the form COLUMN=CONSTANT or +** CONSTANT=COLUMN that are top-level AND-connected terms that are not +** part of a ON clause from a LEFT JOIN, then throughout the query +** replace all other occurrences of COLUMN with CONSTANT. +** +** For example, the query: +** +** SELECT * FROM t1, t2, t3 WHERE t1.a=39 AND t2.b=t1.a AND t3.c=t2.b +** +** Is transformed into +** +** SELECT * FROM t1, t2, t3 WHERE t1.a=39 AND t2.b=39 AND t3.c=39 +** +** Return true if any transformations where made and false if not. +** +** Implementation note: Constant propagation is tricky due to affinity +** and collating sequence interactions. Consider this example: +** +** CREATE TABLE t1(a INT,b TEXT); +** INSERT INTO t1 VALUES(123,'0123'); +** SELECT * FROM t1 WHERE a=123 AND b=a; +** SELECT * FROM t1 WHERE a=123 AND b=123; +** +** The two SELECT statements above should return different answers. b=a +** is alway true because the comparison uses numeric affinity, but b=123 +** is false because it uses text affinity and '0123' is not the same as '123'. +** To work around this, the expression tree is not actually changed from +** "b=a" to "b=123" but rather the "a" in "b=a" is tagged with EP_FixedCol +** and the "123" value is hung off of the pLeft pointer. Code generator +** routines know to generate the constant "123" instead of looking up the +** column value. Also, to avoid collation problems, this optimization is +** only attempted if the "a=123" term uses the default BINARY collation. +*/ +static int propagateConstants( + Parse *pParse, /* The parsing context */ + Select *p /* The query in which to propagate constants */ +){ + WhereConst x; + Walker w; + int nChng = 0; + x.pParse = pParse; + do{ + x.nConst = 0; + x.nChng = 0; + x.apExpr = 0; + findConstInWhere(&x, p->pWhere); + if( x.nConst ){ + memset(&w, 0, sizeof(w)); + w.pParse = pParse; + w.xExprCallback = propagateConstantExprRewrite; + w.xSelectCallback = sqlite3SelectWalkNoop; + w.xSelectCallback2 = 0; + w.walkerDepth = 0; + w.u.pConst = &x; + sqlite3WalkExpr(&w, p->pWhere); + sqlite3DbFree(x.pParse->db, x.apExpr); + nChng += x.nChng; + } + }while( x.nChng ); + return nChng; +} + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* +** Make copies of relevant WHERE clause terms of the outer query into +** the WHERE clause of subquery. Example: +** +** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1) WHERE x=5 AND y=10; +** +** Transformed into: +** +** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1 WHERE a=5 AND c-d=10) +** WHERE x=5 AND y=10; +** +** The hope is that the terms added to the inner query will make it more +** efficient. +** +** Do not attempt this optimization if: +** +** (1) (** This restriction was removed on 2017-09-29. We used to +** disallow this optimization for aggregate subqueries, but now +** it is allowed by putting the extra terms on the HAVING clause. +** The added HAVING clause is pointless if the subquery lacks +** a GROUP BY clause. But such a HAVING clause is also harmless +** so there does not appear to be any reason to add extra logic +** to suppress it. **) +** +** (2) The inner query is the recursive part of a common table expression. +** +** (3) The inner query has a LIMIT clause (since the changes to the WHERE +** clause would change the meaning of the LIMIT). +** +** (4) The inner query is the right operand of a LEFT JOIN and the +** expression to be pushed down does not come from the ON clause +** on that LEFT JOIN. +** +** (5) The WHERE clause expression originates in the ON or USING clause +** of a LEFT JOIN where iCursor is not the right-hand table of that +** left join. An example: +** +** SELECT * +** FROM (SELECT 1 AS a1 UNION ALL SELECT 2) AS aa +** JOIN (SELECT 1 AS b2 UNION ALL SELECT 2) AS bb ON (a1=b2) +** LEFT JOIN (SELECT 8 AS c3 UNION ALL SELECT 9) AS cc ON (b2=2); +** +** The correct answer is three rows: (1,1,NULL),(2,2,8),(2,2,9). +** But if the (b2=2) term were to be pushed down into the bb subquery, +** then the (1,1,NULL) row would be suppressed. +** +** (6) The inner query features one or more window-functions (since +** changes to the WHERE clause of the inner query could change the +** window over which window functions are calculated). +** +** Return 0 if no changes are made and non-zero if one or more WHERE clause +** terms are duplicated into the subquery. +*/ +static int pushDownWhereTerms( + Parse *pParse, /* Parse context (for malloc() and error reporting) */ + Select *pSubq, /* The subquery whose WHERE clause is to be augmented */ + Expr *pWhere, /* The WHERE clause of the outer query */ + int iCursor, /* Cursor number of the subquery */ + int isLeftJoin /* True if pSubq is the right term of a LEFT JOIN */ +){ + Expr *pNew; + int nChng = 0; + Select *pSel; + if( pWhere==0 ) return 0; + if( pSubq->selFlags & SF_Recursive ) return 0; /* restriction (2) */ + +#ifndef SQLITE_OMIT_WINDOWFUNC + for(pSel=pSubq; pSel; pSel=pSel->pPrior){ + if( pSel->pWin ) return 0; /* restriction (6) */ + } +#endif + +#ifdef SQLITE_DEBUG + /* Only the first term of a compound can have a WITH clause. But make + ** sure no other terms are marked SF_Recursive in case something changes + ** in the future. + */ + { + Select *pX; + for(pX=pSubq; pX; pX=pX->pPrior){ + assert( (pX->selFlags & (SF_Recursive))==0 ); + } + } +#endif + + if( pSubq->pLimit!=0 ){ + return 0; /* restriction (3) */ + } + while( pWhere->op==TK_AND ){ + nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, + iCursor, isLeftJoin); + pWhere = pWhere->pLeft; + } + if( isLeftJoin + && (ExprHasProperty(pWhere,EP_FromJoin)==0 + || pWhere->iRightJoinTable!=iCursor) + ){ + return 0; /* restriction (4) */ + } + if( ExprHasProperty(pWhere,EP_FromJoin) && pWhere->iRightJoinTable!=iCursor ){ + return 0; /* restriction (5) */ + } + if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){ + nChng++; + while( pSubq ){ + SubstContext x; + pNew = sqlite3ExprDup(pParse->db, pWhere, 0); + unsetJoinExpr(pNew, -1); + x.pParse = pParse; + x.iTable = iCursor; + x.iNewTable = iCursor; + x.isLeftJoin = 0; + x.pEList = pSubq->pEList; + pNew = substExpr(&x, pNew); + if( pSubq->selFlags & SF_Aggregate ){ + pSubq->pHaving = sqlite3ExprAnd(pParse, pSubq->pHaving, pNew); + }else{ + pSubq->pWhere = sqlite3ExprAnd(pParse, pSubq->pWhere, pNew); + } + pSubq = pSubq->pPrior; + } + } + return nChng; +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +/* +** The pFunc is the only aggregate function in the query. Check to see +** if the query is a candidate for the min/max optimization. +** +** If the query is a candidate for the min/max optimization, then set +** *ppMinMax to be an ORDER BY clause to be used for the optimization +** and return either WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX depending on +** whether pFunc is a min() or max() function. +** +** If the query is not a candidate for the min/max optimization, return +** WHERE_ORDERBY_NORMAL (which must be zero). +** +** This routine must be called after aggregate functions have been +** located but before their arguments have been subjected to aggregate +** analysis. +*/ +static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ + int eRet = WHERE_ORDERBY_NORMAL; /* Return value */ + ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */ + const char *zFunc; /* Name of aggregate function pFunc */ + ExprList *pOrderBy; + u8 sortFlags = 0; + + assert( *ppMinMax==0 ); + assert( pFunc->op==TK_AGG_FUNCTION ); + assert( !IsWindowFunc(pFunc) ); + if( pEList==0 || pEList->nExpr!=1 || ExprHasProperty(pFunc, EP_WinFunc) ){ + return eRet; + } + zFunc = pFunc->u.zToken; + if( sqlite3StrICmp(zFunc, "min")==0 ){ + eRet = WHERE_ORDERBY_MIN; + if( sqlite3ExprCanBeNull(pEList->a[0].pExpr) ){ + sortFlags = KEYINFO_ORDER_BIGNULL; + } + }else if( sqlite3StrICmp(zFunc, "max")==0 ){ + eRet = WHERE_ORDERBY_MAX; + sortFlags = KEYINFO_ORDER_DESC; + }else{ + return eRet; + } + *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); + assert( pOrderBy!=0 || db->mallocFailed ); + if( pOrderBy ) pOrderBy->a[0].sortFlags = sortFlags; + return eRet; +} + +/* +** The select statement passed as the first argument is an aggregate query. +** The second argument is the associated aggregate-info object. This +** function tests if the SELECT is of the form: +** +** SELECT count(*) FROM +** +** where table is a database table, not a sub-select or view. If the query +** does match this pattern, then a pointer to the Table object representing +** is returned. Otherwise, 0 is returned. +*/ +static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ + Table *pTab; + Expr *pExpr; + + assert( !p->pGroupBy ); + + if( p->pWhere || p->pEList->nExpr!=1 + || p->pSrc->nSrc!=1 || p->pSrc->a[0].pSelect + ){ + return 0; + } + pTab = p->pSrc->a[0].pTab; + pExpr = p->pEList->a[0].pExpr; + assert( pTab && !pTab->pSelect && pExpr ); + + if( IsVirtual(pTab) ) return 0; + if( pExpr->op!=TK_AGG_FUNCTION ) return 0; + if( NEVER(pAggInfo->nFunc==0) ) return 0; + if( (pAggInfo->aFunc[0].pFunc->funcFlags&SQLITE_FUNC_COUNT)==0 ) return 0; + if( ExprHasProperty(pExpr, EP_Distinct|EP_WinFunc) ) return 0; + + return pTab; +} + +/* +** If the source-list item passed as an argument was augmented with an +** INDEXED BY clause, then try to locate the specified index. If there +** was such a clause and the named index cannot be found, return +** SQLITE_ERROR and leave an error in pParse. Otherwise, populate +** pFrom->pIndex and return SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pFrom){ + if( pFrom->pTab && pFrom->fg.isIndexedBy ){ + Table *pTab = pFrom->pTab; + char *zIndexedBy = pFrom->u1.zIndexedBy; + Index *pIdx; + for(pIdx=pTab->pIndex; + pIdx && sqlite3StrICmp(pIdx->zName, zIndexedBy); + pIdx=pIdx->pNext + ); + if( !pIdx ){ + sqlite3ErrorMsg(pParse, "no such index: %s", zIndexedBy, 0); + pParse->checkSchema = 1; + return SQLITE_ERROR; + } + pFrom->pIBIndex = pIdx; + } + return SQLITE_OK; +} +/* +** Detect compound SELECT statements that use an ORDER BY clause with +** an alternative collating sequence. +** +** SELECT ... FROM t1 EXCEPT SELECT ... FROM t2 ORDER BY .. COLLATE ... +** +** These are rewritten as a subquery: +** +** SELECT * FROM (SELECT ... FROM t1 EXCEPT SELECT ... FROM t2) +** ORDER BY ... COLLATE ... +** +** This transformation is necessary because the multiSelectOrderBy() routine +** above that generates the code for a compound SELECT with an ORDER BY clause +** uses a merge algorithm that requires the same collating sequence on the +** result columns as on the ORDER BY clause. See ticket +** http://www.sqlite.org/src/info/6709574d2a +** +** This transformation is only needed for EXCEPT, INTERSECT, and UNION. +** The UNION ALL operator works fine with multiSelectOrderBy() even when +** there are COLLATE terms in the ORDER BY. +*/ +static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ + int i; + Select *pNew; + Select *pX; + sqlite3 *db; + struct ExprList_item *a; + SrcList *pNewSrc; + Parse *pParse; + Token dummy; + + if( p->pPrior==0 ) return WRC_Continue; + if( p->pOrderBy==0 ) return WRC_Continue; + for(pX=p; pX && (pX->op==TK_ALL || pX->op==TK_SELECT); pX=pX->pPrior){} + if( pX==0 ) return WRC_Continue; + a = p->pOrderBy->a; +#ifndef SQLITE_OMIT_WINDOWFUNC + /* If iOrderByCol is already non-zero, then it has already been matched + ** to a result column of the SELECT statement. This occurs when the + ** SELECT is rewritten for window-functions processing and then passed + ** to sqlite3SelectPrep() and similar a second time. The rewriting done + ** by this function is not required in this case. */ + if( a[0].u.x.iOrderByCol ) return WRC_Continue; +#endif + for(i=p->pOrderBy->nExpr-1; i>=0; i--){ + if( a[i].pExpr->flags & EP_Collate ) break; + } + if( i<0 ) return WRC_Continue; + + /* If we reach this point, that means the transformation is required. */ + + pParse = pWalker->pParse; + db = pParse->db; + pNew = sqlite3DbMallocZero(db, sizeof(*pNew) ); + if( pNew==0 ) return WRC_Abort; + memset(&dummy, 0, sizeof(dummy)); + pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0,0); + if( pNewSrc==0 ) return WRC_Abort; + *pNew = *p; + p->pSrc = pNewSrc; + p->pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ASTERISK, 0)); + p->op = TK_SELECT; + p->pWhere = 0; + pNew->pGroupBy = 0; + pNew->pHaving = 0; + pNew->pOrderBy = 0; + p->pPrior = 0; + p->pNext = 0; + p->pWith = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + p->pWinDefn = 0; +#endif + p->selFlags &= ~SF_Compound; + assert( (p->selFlags & SF_Converted)==0 ); + p->selFlags |= SF_Converted; + assert( pNew->pPrior!=0 ); + pNew->pPrior->pNext = pNew; + pNew->pLimit = 0; + return WRC_Continue; +} + +/* +** Check to see if the FROM clause term pFrom has table-valued function +** arguments. If it does, leave an error message in pParse and return +** non-zero, since pFrom is not allowed to be a table-valued function. +*/ +static int cannotBeFunction(Parse *pParse, struct SrcList_item *pFrom){ + if( pFrom->fg.isTabFunc ){ + sqlite3ErrorMsg(pParse, "'%s' is not a function", pFrom->zName); + return 1; + } + return 0; +} + +#ifndef SQLITE_OMIT_CTE +/* +** Argument pWith (which may be NULL) points to a linked list of nested +** WITH contexts, from inner to outermost. If the table identified by +** FROM clause element pItem is really a common-table-expression (CTE) +** then return a pointer to the CTE definition for that table. Otherwise +** return NULL. +** +** If a non-NULL value is returned, set *ppContext to point to the With +** object that the returned CTE belongs to. +*/ +static struct Cte *searchWith( + With *pWith, /* Current innermost WITH clause */ + struct SrcList_item *pItem, /* FROM clause element to resolve */ + With **ppContext /* OUT: WITH clause return value belongs to */ +){ + const char *zName; + if( pItem->zDatabase==0 && (zName = pItem->zName)!=0 ){ + With *p; + for(p=pWith; p; p=p->pOuter){ + int i; + for(i=0; inCte; i++){ + if( sqlite3StrICmp(zName, p->a[i].zName)==0 ){ + *ppContext = p; + return &p->a[i]; + } + } + } + } + return 0; +} + +/* The code generator maintains a stack of active WITH clauses +** with the inner-most WITH clause being at the top of the stack. +** +** This routine pushes the WITH clause passed as the second argument +** onto the top of the stack. If argument bFree is true, then this +** WITH clause will never be popped from the stack. In this case it +** should be freed along with the Parse object. In other cases, when +** bFree==0, the With object will be freed along with the SELECT +** statement with which it is associated. +*/ +SQLITE_PRIVATE void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ + assert( bFree==0 || (pParse->pWith==0 && pParse->pWithToFree==0) ); + if( pWith ){ + assert( pParse->pWith!=pWith ); + pWith->pOuter = pParse->pWith; + pParse->pWith = pWith; + if( bFree ) pParse->pWithToFree = pWith; + } +} + +/* +** This function checks if argument pFrom refers to a CTE declared by +** a WITH clause on the stack currently maintained by the parser. And, +** if currently processing a CTE expression, if it is a recursive +** reference to the current CTE. +** +** If pFrom falls into either of the two categories above, pFrom->pTab +** and other fields are populated accordingly. The caller should check +** (pFrom->pTab!=0) to determine whether or not a successful match +** was found. +** +** Whether or not a match is found, SQLITE_OK is returned if no error +** occurs. If an error does occur, an error message is stored in the +** parser and some error code other than SQLITE_OK returned. +*/ +static int withExpand( + Walker *pWalker, + struct SrcList_item *pFrom +){ + Parse *pParse = pWalker->pParse; + sqlite3 *db = pParse->db; + struct Cte *pCte; /* Matched CTE (or NULL if no match) */ + With *pWith; /* WITH clause that pCte belongs to */ + + assert( pFrom->pTab==0 ); + if( pParse->nErr ){ + return SQLITE_ERROR; + } + + pCte = searchWith(pParse->pWith, pFrom, &pWith); + if( pCte ){ + Table *pTab; + ExprList *pEList; + Select *pSel; + Select *pLeft; /* Left-most SELECT statement */ + int bMayRecursive; /* True if compound joined by UNION [ALL] */ + With *pSavedWith; /* Initial value of pParse->pWith */ + + /* If pCte->zCteErr is non-NULL at this point, then this is an illegal + ** recursive reference to CTE pCte. Leave an error in pParse and return + ** early. If pCte->zCteErr is NULL, then this is not a recursive reference. + ** In this case, proceed. */ + if( pCte->zCteErr ){ + sqlite3ErrorMsg(pParse, pCte->zCteErr, pCte->zName); + return SQLITE_ERROR; + } + if( cannotBeFunction(pParse, pFrom) ) return SQLITE_ERROR; + + assert( pFrom->pTab==0 ); + pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ) return WRC_Abort; + pTab->nTabRef = 1; + pTab->zName = sqlite3DbStrDup(db, pCte->zName); + pTab->iPKey = -1; + pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + pTab->tabFlags |= TF_Ephemeral | TF_NoVisibleRowid; + pFrom->pSelect = sqlite3SelectDup(db, pCte->pSelect, 0); + if( db->mallocFailed ) return SQLITE_NOMEM_BKPT; + assert( pFrom->pSelect ); + + /* Check if this is a recursive CTE. */ + pSel = pFrom->pSelect; + bMayRecursive = ( pSel->op==TK_ALL || pSel->op==TK_UNION ); + if( bMayRecursive ){ + int i; + SrcList *pSrc = pFrom->pSelect->pSrc; + for(i=0; inSrc; i++){ + struct SrcList_item *pItem = &pSrc->a[i]; + if( pItem->zDatabase==0 + && pItem->zName!=0 + && 0==sqlite3StrICmp(pItem->zName, pCte->zName) + ){ + pItem->pTab = pTab; + pItem->fg.isRecursive = 1; + pTab->nTabRef++; + pSel->selFlags |= SF_Recursive; + } + } + } + + /* Only one recursive reference is permitted. */ + if( pTab->nTabRef>2 ){ + sqlite3ErrorMsg( + pParse, "multiple references to recursive table: %s", pCte->zName + ); + return SQLITE_ERROR; + } + assert( pTab->nTabRef==1 || + ((pSel->selFlags&SF_Recursive) && pTab->nTabRef==2 )); + + pCte->zCteErr = "circular reference: %s"; + pSavedWith = pParse->pWith; + pParse->pWith = pWith; + if( bMayRecursive ){ + Select *pPrior = pSel->pPrior; + assert( pPrior->pWith==0 ); + pPrior->pWith = pSel->pWith; + sqlite3WalkSelect(pWalker, pPrior); + pPrior->pWith = 0; + }else{ + sqlite3WalkSelect(pWalker, pSel); + } + pParse->pWith = pWith; + + for(pLeft=pSel; pLeft->pPrior; pLeft=pLeft->pPrior); + pEList = pLeft->pEList; + if( pCte->pCols ){ + if( pEList && pEList->nExpr!=pCte->pCols->nExpr ){ + sqlite3ErrorMsg(pParse, "table %s has %d values for %d columns", + pCte->zName, pEList->nExpr, pCte->pCols->nExpr + ); + pParse->pWith = pSavedWith; + return SQLITE_ERROR; + } + pEList = pCte->pCols; + } + + sqlite3ColumnsFromExprList(pParse, pEList, &pTab->nCol, &pTab->aCol); + if( bMayRecursive ){ + if( pSel->selFlags & SF_Recursive ){ + pCte->zCteErr = "multiple recursive references: %s"; + }else{ + pCte->zCteErr = "recursive reference in a subquery: %s"; + } + sqlite3WalkSelect(pWalker, pSel); + } + pCte->zCteErr = 0; + pParse->pWith = pSavedWith; + } + + return SQLITE_OK; +} +#endif + +#ifndef SQLITE_OMIT_CTE +/* +** If the SELECT passed as the second argument has an associated WITH +** clause, pop it from the stack stored as part of the Parse object. +** +** This function is used as the xSelectCallback2() callback by +** sqlite3SelectExpand() when walking a SELECT tree to resolve table +** names and other FROM clause elements. +*/ +static void selectPopWith(Walker *pWalker, Select *p){ + Parse *pParse = pWalker->pParse; + if( OK_IF_ALWAYS_TRUE(pParse->pWith) && p->pPrior==0 ){ + With *pWith = findRightmost(p)->pWith; + if( pWith!=0 ){ + assert( pParse->pWith==pWith || pParse->nErr ); + pParse->pWith = pWith->pOuter; + } + } +} +#else +#define selectPopWith 0 +#endif + +/* +** The SrcList_item structure passed as the second argument represents a +** sub-query in the FROM clause of a SELECT statement. This function +** allocates and populates the SrcList_item.pTab object. If successful, +** SQLITE_OK is returned. Otherwise, if an OOM error is encountered, +** SQLITE_NOMEM. +*/ +SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, struct SrcList_item *pFrom){ + Select *pSel = pFrom->pSelect; + Table *pTab; + + assert( pSel ); + pFrom->pTab = pTab = sqlite3DbMallocZero(pParse->db, sizeof(Table)); + if( pTab==0 ) return SQLITE_NOMEM; + pTab->nTabRef = 1; + if( pFrom->zAlias ){ + pTab->zName = sqlite3DbStrDup(pParse->db, pFrom->zAlias); + }else{ + pTab->zName = sqlite3MPrintf(pParse->db, "subquery_%u", pSel->selId); + } + while( pSel->pPrior ){ pSel = pSel->pPrior; } + sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol); + pTab->iPKey = -1; + pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + pTab->tabFlags |= TF_Ephemeral; + + return pParse->nErr ? SQLITE_ERROR : SQLITE_OK; +} + +/* +** This routine is a Walker callback for "expanding" a SELECT statement. +** "Expanding" means to do the following: +** +** (1) Make sure VDBE cursor numbers have been assigned to every +** element of the FROM clause. +** +** (2) Fill in the pTabList->a[].pTab fields in the SrcList that +** defines FROM clause. When views appear in the FROM clause, +** fill pTabList->a[].pSelect with a copy of the SELECT statement +** that implements the view. A copy is made of the view's SELECT +** statement so that we can freely modify or delete that statement +** without worrying about messing up the persistent representation +** of the view. +** +** (3) Add terms to the WHERE clause to accommodate the NATURAL keyword +** on joins and the ON and USING clause of joins. +** +** (4) Scan the list of columns in the result set (pEList) looking +** for instances of the "*" operator or the TABLE.* operator. +** If found, expand each "*" to be every column in every table +** and TABLE.* to be every column in TABLE. +** +*/ +static int selectExpander(Walker *pWalker, Select *p){ + Parse *pParse = pWalker->pParse; + int i, j, k; + SrcList *pTabList; + ExprList *pEList; + struct SrcList_item *pFrom; + sqlite3 *db = pParse->db; + Expr *pE, *pRight, *pExpr; + u16 selFlags = p->selFlags; + u32 elistFlags = 0; + + p->selFlags |= SF_Expanded; + if( db->mallocFailed ){ + return WRC_Abort; + } + assert( p->pSrc!=0 ); + if( (selFlags & SF_Expanded)!=0 ){ + return WRC_Prune; + } + if( pWalker->eCode ){ + /* Renumber selId because it has been copied from a view */ + p->selId = ++pParse->nSelect; + } + pTabList = p->pSrc; + pEList = p->pEList; + sqlite3WithPush(pParse, p->pWith, 0); + + /* Make sure cursor numbers have been assigned to all entries in + ** the FROM clause of the SELECT statement. + */ + sqlite3SrcListAssignCursors(pParse, pTabList); + + /* Look up every table named in the FROM clause of the select. If + ** an entry of the FROM clause is a subquery instead of a table or view, + ** then create a transient table structure to describe the subquery. + */ + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab; + assert( pFrom->fg.isRecursive==0 || pFrom->pTab!=0 ); + if( pFrom->fg.isRecursive ) continue; + assert( pFrom->pTab==0 ); +#ifndef SQLITE_OMIT_CTE + if( withExpand(pWalker, pFrom) ) return WRC_Abort; + if( pFrom->pTab ) {} else +#endif + if( pFrom->zName==0 ){ +#ifndef SQLITE_OMIT_SUBQUERY + Select *pSel = pFrom->pSelect; + /* A sub-query in the FROM clause of a SELECT */ + assert( pSel!=0 ); + assert( pFrom->pTab==0 ); + if( sqlite3WalkSelect(pWalker, pSel) ) return WRC_Abort; + if( sqlite3ExpandSubquery(pParse, pFrom) ) return WRC_Abort; +#endif + }else{ + /* An ordinary table or view name in the FROM clause */ + assert( pFrom->pTab==0 ); + pFrom->pTab = pTab = sqlite3LocateTableItem(pParse, 0, pFrom); + if( pTab==0 ) return WRC_Abort; + if( pTab->nTabRef>=0xffff ){ + sqlite3ErrorMsg(pParse, "too many references to \"%s\": max 65535", + pTab->zName); + pFrom->pTab = 0; + return WRC_Abort; + } + pTab->nTabRef++; + if( !IsVirtual(pTab) && cannotBeFunction(pParse, pFrom) ){ + return WRC_Abort; + } +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) + if( IsVirtual(pTab) || pTab->pSelect ){ + i16 nCol; + u8 eCodeOrig = pWalker->eCode; + if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; + assert( pFrom->pSelect==0 ); + if( pTab->pSelect && (db->flags & SQLITE_EnableView)==0 ){ + sqlite3ErrorMsg(pParse, "access to view \"%s\" prohibited", + pTab->zName); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) + && pFrom->fg.fromDDL + && ALWAYS(pTab->pVTable!=0) + && pTab->pVTable->eVtabRisk > ((db->flags & SQLITE_TrustedSchema)!=0) + ){ + sqlite3ErrorMsg(pParse, "unsafe use of virtual table \"%s\"", + pTab->zName); + } +#endif + pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); + nCol = pTab->nCol; + pTab->nCol = -1; + pWalker->eCode = 1; /* Turn on Select.selId renumbering */ + sqlite3WalkSelect(pWalker, pFrom->pSelect); + pWalker->eCode = eCodeOrig; + pTab->nCol = nCol; + } +#endif + } + + /* Locate the index named by the INDEXED BY clause, if any. */ + if( sqlite3IndexedByLookup(pParse, pFrom) ){ + return WRC_Abort; + } + } + + /* Process NATURAL keywords, and ON and USING clauses of joins. + */ + if( pParse->nErr || db->mallocFailed || sqliteProcessJoin(pParse, p) ){ + return WRC_Abort; + } + + /* For every "*" that occurs in the column list, insert the names of + ** all columns in all tables. And for every TABLE.* insert the names + ** of all columns in TABLE. The parser inserted a special expression + ** with the TK_ASTERISK operator for each "*" that it found in the column + ** list. The following code just has to locate the TK_ASTERISK + ** expressions and expand each one to the list of all columns in + ** all tables. + ** + ** The first loop just checks to see if there are any "*" operators + ** that need expanding. + */ + for(k=0; knExpr; k++){ + pE = pEList->a[k].pExpr; + if( pE->op==TK_ASTERISK ) break; + assert( pE->op!=TK_DOT || pE->pRight!=0 ); + assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) ); + if( pE->op==TK_DOT && pE->pRight->op==TK_ASTERISK ) break; + elistFlags |= pE->flags; + } + if( knExpr ){ + /* + ** If we get here it means the result set contains one or more "*" + ** operators that need to be expanded. Loop through each expression + ** in the result set and expand them one by one. + */ + struct ExprList_item *a = pEList->a; + ExprList *pNew = 0; + int flags = pParse->db->flags; + int longNames = (flags & SQLITE_FullColNames)!=0 + && (flags & SQLITE_ShortColNames)==0; + + for(k=0; knExpr; k++){ + pE = a[k].pExpr; + elistFlags |= pE->flags; + pRight = pE->pRight; + assert( pE->op!=TK_DOT || pRight!=0 ); + if( pE->op!=TK_ASTERISK + && (pE->op!=TK_DOT || pRight->op!=TK_ASTERISK) + ){ + /* This particular expression does not need to be expanded. + */ + pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); + if( pNew ){ + pNew->a[pNew->nExpr-1].zEName = a[k].zEName; + pNew->a[pNew->nExpr-1].eEName = a[k].eEName; + a[k].zEName = 0; + } + a[k].pExpr = 0; + }else{ + /* This expression is a "*" or a "TABLE.*" and needs to be + ** expanded. */ + int tableSeen = 0; /* Set to 1 when TABLE matches */ + char *zTName = 0; /* text of name of TABLE */ + if( pE->op==TK_DOT ){ + assert( pE->pLeft!=0 ); + assert( !ExprHasProperty(pE->pLeft, EP_IntValue) ); + zTName = pE->pLeft->u.zToken; + } + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab = pFrom->pTab; + Select *pSub = pFrom->pSelect; + char *zTabName = pFrom->zAlias; + const char *zSchemaName = 0; + int iDb; + if( zTabName==0 ){ + zTabName = pTab->zName; + } + if( db->mallocFailed ) break; + if( pSub==0 || (pSub->selFlags & SF_NestedFrom)==0 ){ + pSub = 0; + if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){ + continue; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*"; + } + for(j=0; jnCol; j++){ + char *zName = pTab->aCol[j].zName; + char *zColname; /* The computed column name */ + char *zToFree; /* Malloced string that needs to be freed */ + Token sColname; /* Computed column name as a token */ + + assert( zName ); + if( zTName && pSub + && sqlite3MatchEName(&pSub->pEList->a[j], 0, zTName, 0)==0 + ){ + continue; + } + + /* If a column is marked as 'hidden', omit it from the expanded + ** result-set list unless the SELECT has the SF_IncludeHidden + ** bit set. + */ + if( (p->selFlags & SF_IncludeHidden)==0 + && IsHiddenColumn(&pTab->aCol[j]) + ){ + continue; + } + tableSeen = 1; + + if( i>0 && zTName==0 ){ + if( (pFrom->fg.jointype & JT_NATURAL)!=0 + && tableAndColumnIndex(pTabList, i, zName, 0, 0, 1) + ){ + /* In a NATURAL join, omit the join columns from the + ** table to the right of the join */ + continue; + } + if( sqlite3IdListIndex(pFrom->pUsing, zName)>=0 ){ + /* In a join with a USING clause, omit columns in the + ** using clause from the table on the right. */ + continue; + } + } + pRight = sqlite3Expr(db, TK_ID, zName); + zColname = zName; + zToFree = 0; + if( longNames || pTabList->nSrc>1 ){ + Expr *pLeft; + pLeft = sqlite3Expr(db, TK_ID, zTabName); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); + if( zSchemaName ){ + pLeft = sqlite3Expr(db, TK_ID, zSchemaName); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr); + } + if( longNames ){ + zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName); + zToFree = zColname; + } + }else{ + pExpr = pRight; + } + pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); + sqlite3TokenInit(&sColname, zColname); + sqlite3ExprListSetName(pParse, pNew, &sColname, 0); + if( pNew && (p->selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){ + struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; + sqlite3DbFree(db, pX->zEName); + if( pSub ){ + pX->zEName = sqlite3DbStrDup(db, pSub->pEList->a[j].zEName); + testcase( pX->zEName==0 ); + }else{ + pX->zEName = sqlite3MPrintf(db, "%s.%s.%s", + zSchemaName, zTabName, zColname); + testcase( pX->zEName==0 ); + } + pX->eEName = ENAME_TAB; + } + sqlite3DbFree(db, zToFree); + } + } + if( !tableSeen ){ + if( zTName ){ + sqlite3ErrorMsg(pParse, "no such table: %s", zTName); + }else{ + sqlite3ErrorMsg(pParse, "no tables specified"); + } + } + } + } + sqlite3ExprListDelete(db, pEList); + p->pEList = pNew; + } + if( p->pEList ){ + if( p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns in result set"); + return WRC_Abort; + } + if( (elistFlags & (EP_HasFunc|EP_Subquery))!=0 ){ + p->selFlags |= SF_ComplexResult; + } + } + return WRC_Continue; +} + +#if SQLITE_DEBUG +/* +** Always assert. This xSelectCallback2 implementation proves that the +** xSelectCallback2 is never invoked. +*/ +SQLITE_PRIVATE void sqlite3SelectWalkAssert2(Walker *NotUsed, Select *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + assert( 0 ); +} +#endif +/* +** This routine "expands" a SELECT statement and all of its subqueries. +** For additional information on what it means to "expand" a SELECT +** statement, see the comment on the selectExpand worker callback above. +** +** Expanding a SELECT statement is the first step in processing a +** SELECT statement. The SELECT statement must be expanded before +** name resolution is performed. +** +** If anything goes wrong, an error message is written into pParse. +** The calling function can detect the problem by looking at pParse->nErr +** and/or pParse->db->mallocFailed. +*/ +static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ + Walker w; + w.xExprCallback = sqlite3ExprWalkNoop; + w.pParse = pParse; + if( OK_IF_ALWAYS_TRUE(pParse->hasCompound) ){ + w.xSelectCallback = convertCompoundSelectToSubquery; + w.xSelectCallback2 = 0; + sqlite3WalkSelect(&w, pSelect); + } + w.xSelectCallback = selectExpander; + w.xSelectCallback2 = selectPopWith; + w.eCode = 0; + sqlite3WalkSelect(&w, pSelect); +} + + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** This is a Walker.xSelectCallback callback for the sqlite3SelectTypeInfo() +** interface. +** +** For each FROM-clause subquery, add Column.zType and Column.zColl +** information to the Table structure that represents the result set +** of that subquery. +** +** The Table structure that represents the result set was constructed +** by selectExpander() but the type and collation information was omitted +** at that point because identifiers had not yet been resolved. This +** routine is called after identifier resolution. +*/ +static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ + Parse *pParse; + int i; + SrcList *pTabList; + struct SrcList_item *pFrom; + + assert( p->selFlags & SF_Resolved ); + if( p->selFlags & SF_HasTypeInfo ) return; + p->selFlags |= SF_HasTypeInfo; + pParse = pWalker->pParse; + pTabList = p->pSrc; + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab = pFrom->pTab; + assert( pTab!=0 ); + if( (pTab->tabFlags & TF_Ephemeral)!=0 ){ + /* A sub-query in the FROM clause of a SELECT */ + Select *pSel = pFrom->pSelect; + if( pSel ){ + while( pSel->pPrior ) pSel = pSel->pPrior; + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel, + SQLITE_AFF_NONE); + } + } + } +} +#endif + + +/* +** This routine adds datatype and collating sequence information to +** the Table structures of all FROM-clause subqueries in a +** SELECT statement. +** +** Use this routine after name resolution. +*/ +static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){ +#ifndef SQLITE_OMIT_SUBQUERY + Walker w; + w.xSelectCallback = sqlite3SelectWalkNoop; + w.xSelectCallback2 = selectAddSubqueryTypeInfo; + w.xExprCallback = sqlite3ExprWalkNoop; + w.pParse = pParse; + sqlite3WalkSelect(&w, pSelect); +#endif +} + + +/* +** This routine sets up a SELECT statement for processing. The +** following is accomplished: +** +** * VDBE Cursor numbers are assigned to all FROM-clause terms. +** * Ephemeral Table objects are created for all FROM-clause subqueries. +** * ON and USING clauses are shifted into WHERE statements +** * Wildcards "*" and "TABLE.*" in result sets are expanded. +** * Identifiers in expression are matched to tables. +** +** This routine acts recursively on all subqueries within the SELECT. +*/ +SQLITE_PRIVATE void sqlite3SelectPrep( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + NameContext *pOuterNC /* Name context for container */ +){ + assert( p!=0 || pParse->db->mallocFailed ); + if( pParse->db->mallocFailed ) return; + if( p->selFlags & SF_HasTypeInfo ) return; + sqlite3SelectExpand(pParse, p); + if( pParse->nErr || pParse->db->mallocFailed ) return; + sqlite3ResolveSelectNames(pParse, p, pOuterNC); + if( pParse->nErr || pParse->db->mallocFailed ) return; + sqlite3SelectAddTypeInfo(pParse, p); +} + +/* +** Reset the aggregate accumulator. +** +** The aggregate accumulator is a set of memory cells that hold +** intermediate results while calculating an aggregate. This +** routine generates code that stores NULLs in all of those memory +** cells. +*/ +static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + struct AggInfo_func *pFunc; + int nReg = pAggInfo->nFunc + pAggInfo->nColumn; + if( nReg==0 ) return; + if( pParse->nErr ) return; +#ifdef SQLITE_DEBUG + /* Verify that all AggInfo registers are within the range specified by + ** AggInfo.mnReg..AggInfo.mxReg */ + assert( nReg==pAggInfo->mxReg-pAggInfo->mnReg+1 ); + for(i=0; inColumn; i++){ + assert( pAggInfo->aCol[i].iMem>=pAggInfo->mnReg + && pAggInfo->aCol[i].iMem<=pAggInfo->mxReg ); + } + for(i=0; inFunc; i++){ + assert( pAggInfo->aFunc[i].iMem>=pAggInfo->mnReg + && pAggInfo->aFunc[i].iMem<=pAggInfo->mxReg ); + } +#endif + sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg); + for(pFunc=pAggInfo->aFunc, i=0; inFunc; i++, pFunc++){ + if( pFunc->iDistinct>=0 ){ + Expr *pE = pFunc->pExpr; + assert( !ExprHasProperty(pE, EP_xIsSelect) ); + if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){ + sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one " + "argument"); + pFunc->iDistinct = -1; + }else{ + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pE->x.pList,0,0); + sqlite3VdbeAddOp4(v, OP_OpenEphemeral, pFunc->iDistinct, 0, 0, + (char*)pKeyInfo, P4_KEYINFO); + } + } + } +} + +/* +** Invoke the OP_AggFinalize opcode for every aggregate function +** in the AggInfo structure. +*/ +static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + struct AggInfo_func *pF; + for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ + ExprList *pList = pF->pExpr->x.pList; + assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); + sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0); + sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); + } +} + + +/* +** Update the accumulator memory cells for an aggregate based on +** the current cursor position. +** +** If regAcc is non-zero and there are no min() or max() aggregates +** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator +** registers if register regAcc contains 0. The caller will take care +** of setting and clearing regAcc. +*/ +static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + int regHit = 0; + int addrHitTest = 0; + struct AggInfo_func *pF; + struct AggInfo_col *pC; + + pAggInfo->directMode = 1; + for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ + int nArg; + int addrNext = 0; + int regAgg; + ExprList *pList = pF->pExpr->x.pList; + assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); + assert( !IsWindowFunc(pF->pExpr) ); + if( ExprHasProperty(pF->pExpr, EP_WinFunc) ){ + Expr *pFilter = pF->pExpr->y.pWin->pFilter; + if( pAggInfo->nAccumulator + && (pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) + ){ + if( regHit==0 ) regHit = ++pParse->nMem; + /* If this is the first row of the group (regAcc==0), clear the + ** "magnet" register regHit so that the accumulator registers + ** are populated if the FILTER clause jumps over the the + ** invocation of min() or max() altogether. Or, if this is not + ** the first row (regAcc==1), set the magnet register so that the + ** accumulators are not populated unless the min()/max() is invoked and + ** indicates that they should be. */ + sqlite3VdbeAddOp2(v, OP_Copy, regAcc, regHit); + } + addrNext = sqlite3VdbeMakeLabel(pParse); + sqlite3ExprIfFalse(pParse, pFilter, addrNext, SQLITE_JUMPIFNULL); + } + if( pList ){ + nArg = pList->nExpr; + regAgg = sqlite3GetTempRange(pParse, nArg); + sqlite3ExprCodeExprList(pParse, pList, regAgg, 0, SQLITE_ECEL_DUP); + }else{ + nArg = 0; + regAgg = 0; + } + if( pF->iDistinct>=0 ){ + if( addrNext==0 ){ + addrNext = sqlite3VdbeMakeLabel(pParse); + } + testcase( nArg==0 ); /* Error condition */ + testcase( nArg>1 ); /* Also an error */ + codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg); + } + if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + CollSeq *pColl = 0; + struct ExprList_item *pItem; + int j; + assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */ + for(j=0, pItem=pList->a; !pColl && jpExpr); + } + if( !pColl ){ + pColl = pParse->db->pDfltColl; + } + if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem; + sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ); + } + sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, pF->iMem); + sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, (u8)nArg); + sqlite3ReleaseTempRange(pParse, regAgg, nArg); + if( addrNext ){ + sqlite3VdbeResolveLabel(v, addrNext); + } + } + if( regHit==0 && pAggInfo->nAccumulator ){ + regHit = regAcc; + } + if( regHit ){ + addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v); + } + for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ + sqlite3ExprCode(pParse, pC->pExpr, pC->iMem); + } + + pAggInfo->directMode = 0; + if( addrHitTest ){ + sqlite3VdbeJumpHereOrPopInst(v, addrHitTest); + } +} + +/* +** Add a single OP_Explain instruction to the VDBE to explain a simple +** count(*) query ("SELECT count(*) FROM pTab"). +*/ +#ifndef SQLITE_OMIT_EXPLAIN +static void explainSimpleCount( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being queried */ + Index *pIdx /* Index used to optimize scan, or NULL */ +){ + if( pParse->explain==2 ){ + int bCover = (pIdx!=0 && (HasRowid(pTab) || !IsPrimaryKeyIndex(pIdx))); + sqlite3VdbeExplain(pParse, 0, "SCAN TABLE %s%s%s", + pTab->zName, + bCover ? " USING COVERING INDEX " : "", + bCover ? pIdx->zName : "" + ); + } +} +#else +# define explainSimpleCount(a,b,c) +#endif + +/* +** sqlite3WalkExpr() callback used by havingToWhere(). +** +** If the node passed to the callback is a TK_AND node, return +** WRC_Continue to tell sqlite3WalkExpr() to iterate through child nodes. +** +** Otherwise, return WRC_Prune. In this case, also check if the +** sub-expression matches the criteria for being moved to the WHERE +** clause. If so, add it to the WHERE clause and replace the sub-expression +** within the HAVING expression with a constant "1". +*/ +static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){ + if( pExpr->op!=TK_AND ){ + Select *pS = pWalker->u.pSelect; + if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, pS->pGroupBy) ){ + sqlite3 *db = pWalker->pParse->db; + Expr *pNew = sqlite3Expr(db, TK_INTEGER, "1"); + if( pNew ){ + Expr *pWhere = pS->pWhere; + SWAP(Expr, *pNew, *pExpr); + pNew = sqlite3ExprAnd(pWalker->pParse, pWhere, pNew); + pS->pWhere = pNew; + pWalker->eCode = 1; + } + } + return WRC_Prune; + } + return WRC_Continue; +} + +/* +** Transfer eligible terms from the HAVING clause of a query, which is +** processed after grouping, to the WHERE clause, which is processed before +** grouping. For example, the query: +** +** SELECT * FROM WHERE a=? GROUP BY b HAVING b=? AND c=? +** +** can be rewritten as: +** +** SELECT * FROM WHERE a=? AND b=? GROUP BY b HAVING c=? +** +** A term of the HAVING expression is eligible for transfer if it consists +** entirely of constants and expressions that are also GROUP BY terms that +** use the "BINARY" collation sequence. +*/ +static void havingToWhere(Parse *pParse, Select *p){ + Walker sWalker; + memset(&sWalker, 0, sizeof(sWalker)); + sWalker.pParse = pParse; + sWalker.xExprCallback = havingToWhereExprCb; + sWalker.u.pSelect = p; + sqlite3WalkExpr(&sWalker, p->pHaving); +#if SELECTTRACE_ENABLED + if( sWalker.eCode && (sqlite3SelectTrace & 0x100)!=0 ){ + SELECTTRACE(0x100,pParse,p,("Move HAVING terms into WHERE:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif +} + +/* +** Check to see if the pThis entry of pTabList is a self-join of a prior view. +** If it is, then return the SrcList_item for the prior view. If it is not, +** then return 0. +*/ +static struct SrcList_item *isSelfJoinView( + SrcList *pTabList, /* Search for self-joins in this FROM clause */ + struct SrcList_item *pThis /* Search for prior reference to this subquery */ +){ + struct SrcList_item *pItem; + for(pItem = pTabList->a; pItempSelect==0 ) continue; + if( pItem->fg.viaCoroutine ) continue; + if( pItem->zName==0 ) continue; + assert( pItem->pTab!=0 ); + assert( pThis->pTab!=0 ); + if( pItem->pTab->pSchema!=pThis->pTab->pSchema ) continue; + if( sqlite3_stricmp(pItem->zName, pThis->zName)!=0 ) continue; + pS1 = pItem->pSelect; + if( pItem->pTab->pSchema==0 && pThis->pSelect->selId!=pS1->selId ){ + /* The query flattener left two different CTE tables with identical + ** names in the same FROM clause. */ + continue; + } + if( sqlite3ExprCompare(0, pThis->pSelect->pWhere, pS1->pWhere, -1) + || sqlite3ExprCompare(0, pThis->pSelect->pHaving, pS1->pHaving, -1) + ){ + /* The view was modified by some other optimization such as + ** pushDownWhereTerms() */ + continue; + } + return pItem; + } + return 0; +} + +#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION +/* +** Attempt to transform a query of the form +** +** SELECT count(*) FROM (SELECT x FROM t1 UNION ALL SELECT y FROM t2) +** +** Into this: +** +** SELECT (SELECT count(*) FROM t1)+(SELECT count(*) FROM t2) +** +** The transformation only works if all of the following are true: +** +** * The subquery is a UNION ALL of two or more terms +** * The subquery does not have a LIMIT clause +** * There is no WHERE or GROUP BY or HAVING clauses on the subqueries +** * The outer query is a simple count(*) with no WHERE clause or other +** extraneous syntax. +** +** Return TRUE if the optimization is undertaken. +*/ +static int countOfViewOptimization(Parse *pParse, Select *p){ + Select *pSub, *pPrior; + Expr *pExpr; + Expr *pCount; + sqlite3 *db; + if( (p->selFlags & SF_Aggregate)==0 ) return 0; /* This is an aggregate */ + if( p->pEList->nExpr!=1 ) return 0; /* Single result column */ + if( p->pWhere ) return 0; + if( p->pGroupBy ) return 0; + pExpr = p->pEList->a[0].pExpr; + if( pExpr->op!=TK_AGG_FUNCTION ) return 0; /* Result is an aggregate */ + if( sqlite3_stricmp(pExpr->u.zToken,"count") ) return 0; /* Is count() */ + if( pExpr->x.pList!=0 ) return 0; /* Must be count(*) */ + if( p->pSrc->nSrc!=1 ) return 0; /* One table in FROM */ + pSub = p->pSrc->a[0].pSelect; + if( pSub==0 ) return 0; /* The FROM is a subquery */ + if( pSub->pPrior==0 ) return 0; /* Must be a compound ry */ + do{ + if( pSub->op!=TK_ALL && pSub->pPrior ) return 0; /* Must be UNION ALL */ + if( pSub->pWhere ) return 0; /* No WHERE clause */ + if( pSub->pLimit ) return 0; /* No LIMIT clause */ + if( pSub->selFlags & SF_Aggregate ) return 0; /* Not an aggregate */ + pSub = pSub->pPrior; /* Repeat over compound */ + }while( pSub ); + + /* If we reach this point then it is OK to perform the transformation */ + + db = pParse->db; + pCount = pExpr; + pExpr = 0; + pSub = p->pSrc->a[0].pSelect; + p->pSrc->a[0].pSelect = 0; + sqlite3SrcListDelete(db, p->pSrc); + p->pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*p->pSrc)); + while( pSub ){ + Expr *pTerm; + pPrior = pSub->pPrior; + pSub->pPrior = 0; + pSub->pNext = 0; + pSub->selFlags |= SF_Aggregate; + pSub->selFlags &= ~SF_Compound; + pSub->nSelectRow = 0; + sqlite3ExprListDelete(db, pSub->pEList); + pTerm = pPrior ? sqlite3ExprDup(db, pCount, 0) : pCount; + pSub->pEList = sqlite3ExprListAppend(pParse, 0, pTerm); + pTerm = sqlite3PExpr(pParse, TK_SELECT, 0, 0); + sqlite3PExprAddSelect(pParse, pTerm, pSub); + if( pExpr==0 ){ + pExpr = pTerm; + }else{ + pExpr = sqlite3PExpr(pParse, TK_PLUS, pTerm, pExpr); + } + pSub = pPrior; + } + p->pEList->a[0].pExpr = pExpr; + p->selFlags &= ~SF_Aggregate; + +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("After count-of-view optimization:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + return 1; +} +#endif /* SQLITE_COUNTOFVIEW_OPTIMIZATION */ + +/* +** Generate code for the SELECT statement given in the p argument. +** +** The results are returned according to the SelectDest structure. +** See comments in sqliteInt.h for further information. +** +** This routine returns the number of errors. If any errors are +** encountered, then an appropriate error message is left in +** pParse->zErrMsg. +** +** This routine does NOT free the Select structure passed in. The +** calling function needs to do that. +*/ +SQLITE_PRIVATE int sqlite3Select( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + SelectDest *pDest /* What to do with the query results */ +){ + int i, j; /* Loop counters */ + WhereInfo *pWInfo; /* Return from sqlite3WhereBegin() */ + Vdbe *v; /* The virtual machine under construction */ + int isAgg; /* True for select lists like "count(*)" */ + ExprList *pEList = 0; /* List of columns to extract. */ + SrcList *pTabList; /* List of tables to select from */ + Expr *pWhere; /* The WHERE clause. May be NULL */ + ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */ + Expr *pHaving; /* The HAVING clause. May be NULL */ + AggInfo *pAggInfo = 0; /* Aggregate information */ + int rc = 1; /* Value to return from this function */ + DistinctCtx sDistinct; /* Info on how to code the DISTINCT keyword */ + SortCtx sSort; /* Info on how to code the ORDER BY clause */ + int iEnd; /* Address of the end of the query */ + sqlite3 *db; /* The database connection */ + ExprList *pMinMaxOrderBy = 0; /* Added ORDER BY for min/max queries */ + u8 minMaxFlag; /* Flag for min/max queries */ + + db = pParse->db; + v = sqlite3GetVdbe(pParse); + if( p==0 || db->mallocFailed || pParse->nErr ){ + return 1; + } + if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; +#if SELECTTRACE_ENABLED + SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); + if( sqlite3SelectTrace & 0x100 ){ + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistFifo ); + assert( p->pOrderBy==0 || pDest->eDest!=SRT_Fifo ); + assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue ); + assert( p->pOrderBy==0 || pDest->eDest!=SRT_Queue ); + if( IgnorableOrderby(pDest) ){ + assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union || + pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard || + pDest->eDest==SRT_Queue || pDest->eDest==SRT_DistFifo || + pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_Fifo); + /* If ORDER BY makes no difference in the output then neither does + ** DISTINCT so it can be removed too. */ + sqlite3ExprListDelete(db, p->pOrderBy); + p->pOrderBy = 0; + p->selFlags &= ~SF_Distinct; + p->selFlags |= SF_NoopOrderBy; + } + sqlite3SelectPrep(pParse, p, 0); + if( pParse->nErr || db->mallocFailed ){ + goto select_end; + } + assert( p->pEList!=0 ); +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x104 ){ + SELECTTRACE(0x104,pParse,p, ("after name resolution:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + if( pDest->eDest==SRT_Output ){ + generateColumnNames(pParse, p); + } + +#ifndef SQLITE_OMIT_WINDOWFUNC + rc = sqlite3WindowRewrite(pParse, p); + if( rc ){ + assert( db->mallocFailed || pParse->nErr>0 ); + goto select_end; + } +#if SELECTTRACE_ENABLED + if( p->pWin && (sqlite3SelectTrace & 0x108)!=0 ){ + SELECTTRACE(0x104,pParse,p, ("after window rewrite:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif +#endif /* SQLITE_OMIT_WINDOWFUNC */ + pTabList = p->pSrc; + isAgg = (p->selFlags & SF_Aggregate)!=0; + memset(&sSort, 0, sizeof(sSort)); + sSort.pOrderBy = p->pOrderBy; + + /* Try to various optimizations (flattening subqueries, and strength + ** reduction of join operators) in the FROM clause up into the main query + */ +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + for(i=0; !p->pPrior && inSrc; i++){ + struct SrcList_item *pItem = &pTabList->a[i]; + Select *pSub = pItem->pSelect; + Table *pTab = pItem->pTab; + + /* Convert LEFT JOIN into JOIN if there are terms of the right table + ** of the LEFT JOIN used in the WHERE clause. + */ + if( (pItem->fg.jointype & JT_LEFT)!=0 + && sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor) + && OptimizationEnabled(db, SQLITE_SimplifyJoin) + ){ + SELECTTRACE(0x100,pParse,p, + ("LEFT-JOIN simplifies to JOIN on term %d\n",i)); + pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER); + unsetJoinExpr(p->pWhere, pItem->iCursor); + } + + /* No futher action if this term of the FROM clause is no a subquery */ + if( pSub==0 ) continue; + + /* Catch mismatch in the declared columns of a view and the number of + ** columns in the SELECT on the RHS */ + if( pTab->nCol!=pSub->pEList->nExpr ){ + sqlite3ErrorMsg(pParse, "expected %d columns for '%s' but got %d", + pTab->nCol, pTab->zName, pSub->pEList->nExpr); + goto select_end; + } + + /* Do not try to flatten an aggregate subquery. + ** + ** Flattening an aggregate subquery is only possible if the outer query + ** is not a join. But if the outer query is not a join, then the subquery + ** will be implemented as a co-routine and there is no advantage to + ** flattening in that case. + */ + if( (pSub->selFlags & SF_Aggregate)!=0 ) continue; + assert( pSub->pGroupBy==0 ); + + /* If the outer query contains a "complex" result set (that is, + ** if the result set of the outer query uses functions or subqueries) + ** and if the subquery contains an ORDER BY clause and if + ** it will be implemented as a co-routine, then do not flatten. This + ** restriction allows SQL constructs like this: + ** + ** SELECT expensive_function(x) + ** FROM (SELECT x FROM tab ORDER BY y LIMIT 10); + ** + ** The expensive_function() is only computed on the 10 rows that + ** are output, rather than every row of the table. + ** + ** The requirement that the outer query have a complex result set + ** means that flattening does occur on simpler SQL constraints without + ** the expensive_function() like: + ** + ** SELECT x FROM (SELECT x FROM tab ORDER BY y LIMIT 10); + */ + if( pSub->pOrderBy!=0 + && i==0 + && (p->selFlags & SF_ComplexResult)!=0 + && (pTabList->nSrc==1 + || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) + ){ + continue; + } + + if( flattenSubquery(pParse, p, i, isAgg) ){ + if( pParse->nErr ) goto select_end; + /* This subquery can be absorbed into its parent. */ + i = -1; + } + pTabList = p->pSrc; + if( db->mallocFailed ) goto select_end; + if( !IgnorableOrderby(pDest) ){ + sSort.pOrderBy = p->pOrderBy; + } + } +#endif + +#ifndef SQLITE_OMIT_COMPOUND_SELECT + /* Handle compound SELECT statements using the separate multiSelect() + ** procedure. + */ + if( p->pPrior ){ + rc = multiSelect(pParse, p, pDest); +#if SELECTTRACE_ENABLED + SELECTTRACE(0x1,pParse,p,("end compound-select processing\n")); + if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ + sqlite3TreeViewSelect(0, p, 0); + } +#endif + if( p->pNext==0 ) ExplainQueryPlanPop(pParse); + return rc; + } +#endif + + /* Do the WHERE-clause constant propagation optimization if this is + ** a join. No need to speed time on this operation for non-join queries + ** as the equivalent optimization will be handled by query planner in + ** sqlite3WhereBegin(). + */ + if( pTabList->nSrc>1 + && OptimizationEnabled(db, SQLITE_PropagateConst) + && propagateConstants(pParse, p) + ){ +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After constant propagation:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + }else{ + SELECTTRACE(0x100,pParse,p,("Constant propagation not helpful\n")); + } + +#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION + if( OptimizationEnabled(db, SQLITE_QueryFlattener|SQLITE_CountOfView) + && countOfViewOptimization(pParse, p) + ){ + if( db->mallocFailed ) goto select_end; + pEList = p->pEList; + pTabList = p->pSrc; + } +#endif + + /* For each term in the FROM clause, do two things: + ** (1) Authorized unreferenced tables + ** (2) Generate code for all sub-queries + */ + for(i=0; inSrc; i++){ + struct SrcList_item *pItem = &pTabList->a[i]; + SelectDest dest; + Select *pSub; +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + const char *zSavedAuthContext; +#endif + + /* Issue SQLITE_READ authorizations with a fake column name for any + ** tables that are referenced but from which no values are extracted. + ** Examples of where these kinds of null SQLITE_READ authorizations + ** would occur: + ** + ** SELECT count(*) FROM t1; -- SQLITE_READ t1."" + ** SELECT t1.* FROM t1, t2; -- SQLITE_READ t2."" + ** + ** The fake column name is an empty string. It is possible for a table to + ** have a column named by the empty string, in which case there is no way to + ** distinguish between an unreferenced table and an actual reference to the + ** "" column. The original design was for the fake column name to be a NULL, + ** which would be unambiguous. But legacy authorization callbacks might + ** assume the column name is non-NULL and segfault. The use of an empty + ** string for the fake column name seems safer. + */ + if( pItem->colUsed==0 && pItem->zName!=0 ){ + sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "", pItem->zDatabase); + } + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + /* Generate code for all sub-queries in the FROM clause + */ + pSub = pItem->pSelect; + if( pSub==0 ) continue; + + /* The code for a subquery should only be generated once, though it is + ** technically harmless for it to be generated multiple times. The + ** following assert() will detect if something changes to cause + ** the same subquery to be coded multiple times, as a signal to the + ** developers to try to optimize the situation. + ** + ** Update 2019-07-24: + ** See ticket https://sqlite.org/src/tktview/c52b09c7f38903b1311cec40. + ** The dbsqlfuzz fuzzer found a case where the same subquery gets + ** coded twice. So this assert() now becomes a testcase(). It should + ** be very rare, though. + */ + testcase( pItem->addrFillSub!=0 ); + + /* Increment Parse.nHeight by the height of the largest expression + ** tree referred to by this, the parent select. The child select + ** may contain expression trees of at most + ** (SQLITE_MAX_EXPR_DEPTH-Parse.nHeight) height. This is a bit + ** more conservative than necessary, but much easier than enforcing + ** an exact limit. + */ + pParse->nHeight += sqlite3SelectExprHeight(p); + + /* Make copies of constant WHERE-clause terms in the outer query down + ** inside the subquery. This can help the subquery to run more efficiently. + */ + if( OptimizationEnabled(db, SQLITE_PushDown) + && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor, + (pItem->fg.jointype & JT_OUTER)!=0) + ){ +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p, + ("After WHERE-clause push-down into subquery %d:\n", pSub->selId)); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + }else{ + SELECTTRACE(0x100,pParse,p,("Push-down not possible\n")); + } + + zSavedAuthContext = pParse->zAuthContext; + pParse->zAuthContext = pItem->zName; + + /* Generate code to implement the subquery + ** + ** The subquery is implemented as a co-routine if the subquery is + ** guaranteed to be the outer loop (so that it does not need to be + ** computed more than once) + ** + ** TODO: Are there other reasons beside (1) to use a co-routine + ** implementation? + */ + if( i==0 + && (pTabList->nSrc==1 + || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) /* (1) */ + ){ + /* Implement a co-routine that will return a single row of the result + ** set on each invocation. + */ + int addrTop = sqlite3VdbeCurrentAddr(v)+1; + + pItem->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); + VdbeComment((v, "%s", pItem->pTab->zName)); + pItem->addrFillSub = addrTop; + sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn); + ExplainQueryPlan((pParse, 1, "CO-ROUTINE %u", pSub->selId)); + sqlite3Select(pParse, pSub, &dest); + pItem->pTab->nRowLogEst = pSub->nSelectRow; + pItem->fg.viaCoroutine = 1; + pItem->regResult = dest.iSdst; + sqlite3VdbeEndCoroutine(v, pItem->regReturn); + sqlite3VdbeJumpHere(v, addrTop-1); + sqlite3ClearTempRegCache(pParse); + }else{ + /* Generate a subroutine that will fill an ephemeral table with + ** the content of this subquery. pItem->addrFillSub will point + ** to the address of the generated subroutine. pItem->regReturn + ** is a register allocated to hold the subroutine return address + */ + int topAddr; + int onceAddr = 0; + int retAddr; + struct SrcList_item *pPrior; + + testcase( pItem->addrFillSub==0 ); /* Ticket c52b09c7f38903b1311 */ + pItem->regReturn = ++pParse->nMem; + topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); + pItem->addrFillSub = topAddr+1; + if( pItem->fg.isCorrelated==0 ){ + /* If the subquery is not correlated and if we are not inside of + ** a trigger, then we only need to compute the value of the subquery + ** once. */ + onceAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + VdbeComment((v, "materialize \"%s\"", pItem->pTab->zName)); + }else{ + VdbeNoopComment((v, "materialize \"%s\"", pItem->pTab->zName)); + } + pPrior = isSelfJoinView(pTabList, pItem); + if( pPrior ){ + sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pPrior->iCursor); + assert( pPrior->pSelect!=0 ); + pSub->nSelectRow = pPrior->pSelect->nSelectRow; + }else{ + sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); + ExplainQueryPlan((pParse, 1, "MATERIALIZE %u", pSub->selId)); + sqlite3Select(pParse, pSub, &dest); + } + pItem->pTab->nRowLogEst = pSub->nSelectRow; + if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); + retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); + VdbeComment((v, "end %s", pItem->pTab->zName)); + sqlite3VdbeChangeP1(v, topAddr, retAddr); + sqlite3ClearTempRegCache(pParse); + } + if( db->mallocFailed ) goto select_end; + pParse->nHeight -= sqlite3SelectExprHeight(p); + pParse->zAuthContext = zSavedAuthContext; +#endif + } + + /* Various elements of the SELECT copied into local variables for + ** convenience */ + pEList = p->pEList; + pWhere = p->pWhere; + pGroupBy = p->pGroupBy; + pHaving = p->pHaving; + sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0; + +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("After all FROM-clause analysis:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + /* If the query is DISTINCT with an ORDER BY but is not an aggregate, and + ** if the select-list is the same as the ORDER BY list, then this query + ** can be rewritten as a GROUP BY. In other words, this: + ** + ** SELECT DISTINCT xyz FROM ... ORDER BY xyz + ** + ** is transformed to: + ** + ** SELECT xyz FROM ... GROUP BY xyz ORDER BY xyz + ** + ** The second form is preferred as a single index (or temp-table) may be + ** used for both the ORDER BY and DISTINCT processing. As originally + ** written the query must use a temp-table for at least one of the ORDER + ** BY and DISTINCT, and an index or separate temp-table for the other. + */ + if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct + && sqlite3ExprListCompare(sSort.pOrderBy, pEList, -1)==0 +#ifndef SQLITE_OMIT_WINDOWFUNC + && p->pWin==0 +#endif + ){ + p->selFlags &= ~SF_Distinct; + pGroupBy = p->pGroupBy = sqlite3ExprListDup(db, pEList, 0); + p->selFlags |= SF_Aggregate; + /* Notice that even thought SF_Distinct has been cleared from p->selFlags, + ** the sDistinct.isTnct is still set. Hence, isTnct represents the + ** original setting of the SF_Distinct flag, not the current setting */ + assert( sDistinct.isTnct ); + +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("Transform DISTINCT into GROUP BY:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + } + + /* If there is an ORDER BY clause, then create an ephemeral index to + ** do the sorting. But this sorting ephemeral index might end up + ** being unused if the data can be extracted in pre-sorted order. + ** If that is the case, then the OP_OpenEphemeral instruction will be + ** changed to an OP_Noop once we figure out that the sorting index is + ** not needed. The sSort.addrSortIndex variable is used to facilitate + ** that change. + */ + if( sSort.pOrderBy ){ + KeyInfo *pKeyInfo; + pKeyInfo = sqlite3KeyInfoFromExprList( + pParse, sSort.pOrderBy, 0, pEList->nExpr); + sSort.iECursor = pParse->nTab++; + sSort.addrSortIndex = + sqlite3VdbeAddOp4(v, OP_OpenEphemeral, + sSort.iECursor, sSort.pOrderBy->nExpr+1+pEList->nExpr, 0, + (char*)pKeyInfo, P4_KEYINFO + ); + }else{ + sSort.addrSortIndex = -1; + } + + /* If the output is destined for a temporary table, open that table. + */ + if( pDest->eDest==SRT_EphemTab ){ + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr); + } + + /* Set the limiter. + */ + iEnd = sqlite3VdbeMakeLabel(pParse); + if( (p->selFlags & SF_FixedLimit)==0 ){ + p->nSelectRow = 320; /* 4 billion rows */ + } + computeLimitRegisters(pParse, p, iEnd); + if( p->iLimit==0 && sSort.addrSortIndex>=0 ){ + sqlite3VdbeChangeOpcode(v, sSort.addrSortIndex, OP_SorterOpen); + sSort.sortFlags |= SORTFLAG_UseSorter; + } + + /* Open an ephemeral index to use for the distinct set. + */ + if( p->selFlags & SF_Distinct ){ + sDistinct.tabTnct = pParse->nTab++; + sDistinct.addrTnct = sqlite3VdbeAddOp4(v, OP_OpenEphemeral, + sDistinct.tabTnct, 0, 0, + (char*)sqlite3KeyInfoFromExprList(pParse, p->pEList,0,0), + P4_KEYINFO); + sqlite3VdbeChangeP5(v, BTREE_UNORDERED); + sDistinct.eTnctType = WHERE_DISTINCT_UNORDERED; + }else{ + sDistinct.eTnctType = WHERE_DISTINCT_NOOP; + } + + if( !isAgg && pGroupBy==0 ){ + /* No aggregate functions and no GROUP BY clause */ + u16 wctrlFlags = (sDistinct.isTnct ? WHERE_WANT_DISTINCT : 0) + | (p->selFlags & SF_FixedLimit); +#ifndef SQLITE_OMIT_WINDOWFUNC + Window *pWin = p->pWin; /* Master window object (or NULL) */ + if( pWin ){ + sqlite3WindowCodeInit(pParse, p); + } +#endif + assert( WHERE_USE_LIMIT==SF_FixedLimit ); + + + /* Begin the database scan. */ + SELECTTRACE(1,pParse,p,("WhereBegin\n")); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, sSort.pOrderBy, + p->pEList, wctrlFlags, p->nSelectRow); + if( pWInfo==0 ) goto select_end; + if( sqlite3WhereOutputRowCount(pWInfo) < p->nSelectRow ){ + p->nSelectRow = sqlite3WhereOutputRowCount(pWInfo); + } + if( sDistinct.isTnct && sqlite3WhereIsDistinct(pWInfo) ){ + sDistinct.eTnctType = sqlite3WhereIsDistinct(pWInfo); + } + if( sSort.pOrderBy ){ + sSort.nOBSat = sqlite3WhereIsOrdered(pWInfo); + sSort.labelOBLopt = sqlite3WhereOrderByLimitOptLabel(pWInfo); + if( sSort.nOBSat==sSort.pOrderBy->nExpr ){ + sSort.pOrderBy = 0; + } + } + + /* If sorting index that was created by a prior OP_OpenEphemeral + ** instruction ended up not being needed, then change the OP_OpenEphemeral + ** into an OP_Noop. + */ + if( sSort.addrSortIndex>=0 && sSort.pOrderBy==0 ){ + sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex); + } + + assert( p->pEList==pEList ); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pWin ){ + int addrGosub = sqlite3VdbeMakeLabel(pParse); + int iCont = sqlite3VdbeMakeLabel(pParse); + int iBreak = sqlite3VdbeMakeLabel(pParse); + int regGosub = ++pParse->nMem; + + sqlite3WindowCodeStep(pParse, p, pWInfo, regGosub, addrGosub); + + sqlite3VdbeAddOp2(v, OP_Goto, 0, iBreak); + sqlite3VdbeResolveLabel(v, addrGosub); + VdbeNoopComment((v, "inner-loop subroutine")); + sSort.labelOBLopt = 0; + selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, iCont, iBreak); + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp1(v, OP_Return, regGosub); + VdbeComment((v, "end inner-loop subroutine")); + sqlite3VdbeResolveLabel(v, iBreak); + }else +#endif /* SQLITE_OMIT_WINDOWFUNC */ + { + /* Use the standard inner loop. */ + selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, + sqlite3WhereContinueLabel(pWInfo), + sqlite3WhereBreakLabel(pWInfo)); + + /* End the database scan loop. + */ + sqlite3WhereEnd(pWInfo); + } + }else{ + /* This case when there exist aggregate functions or a GROUP BY clause + ** or both */ + NameContext sNC; /* Name context for processing aggregate information */ + int iAMem; /* First Mem address for storing current GROUP BY */ + int iBMem; /* First Mem address for previous GROUP BY */ + int iUseFlag; /* Mem address holding flag indicating that at least + ** one row of the input to the aggregator has been + ** processed */ + int iAbortFlag; /* Mem address which causes query abort if positive */ + int groupBySort; /* Rows come from source in GROUP BY order */ + int addrEnd; /* End of processing for this SELECT */ + int sortPTab = 0; /* Pseudotable used to decode sorting results */ + int sortOut = 0; /* Output register from the sorter */ + int orderByGrp = 0; /* True if the GROUP BY and ORDER BY are the same */ + + /* Remove any and all aliases between the result set and the + ** GROUP BY clause. + */ + if( pGroupBy ){ + int k; /* Loop counter */ + struct ExprList_item *pItem; /* For looping over expression in a list */ + + for(k=p->pEList->nExpr, pItem=p->pEList->a; k>0; k--, pItem++){ + pItem->u.x.iAlias = 0; + } + for(k=pGroupBy->nExpr, pItem=pGroupBy->a; k>0; k--, pItem++){ + pItem->u.x.iAlias = 0; + } + assert( 66==sqlite3LogEst(100) ); + if( p->nSelectRow>66 ) p->nSelectRow = 66; + + /* If there is both a GROUP BY and an ORDER BY clause and they are + ** identical, then it may be possible to disable the ORDER BY clause + ** on the grounds that the GROUP BY will cause elements to come out + ** in the correct order. It also may not - the GROUP BY might use a + ** database index that causes rows to be grouped together as required + ** but not actually sorted. Either way, record the fact that the + ** ORDER BY and GROUP BY clauses are the same by setting the orderByGrp + ** variable. */ + if( sSort.pOrderBy && pGroupBy->nExpr==sSort.pOrderBy->nExpr ){ + int ii; + /* The GROUP BY processing doesn't care whether rows are delivered in + ** ASC or DESC order - only that each group is returned contiguously. + ** So set the ASC/DESC flags in the GROUP BY to match those in the + ** ORDER BY to maximize the chances of rows being delivered in an + ** order that makes the ORDER BY redundant. */ + for(ii=0; iinExpr; ii++){ + u8 sortFlags = sSort.pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_DESC; + pGroupBy->a[ii].sortFlags = sortFlags; + } + if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){ + orderByGrp = 1; + } + } + }else{ + assert( 0==sqlite3LogEst(1) ); + p->nSelectRow = 0; + } + + /* Create a label to jump to when we want to abort the query */ + addrEnd = sqlite3VdbeMakeLabel(pParse); + + /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in + ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the + ** SELECT statement. + */ + pAggInfo = sqlite3DbMallocZero(db, sizeof(*pAggInfo) ); + if( pAggInfo==0 ){ + goto select_end; + } + pAggInfo->pNext = pParse->pAggList; + pParse->pAggList = pAggInfo; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + sNC.uNC.pAggInfo = pAggInfo; + VVA_ONLY( sNC.ncFlags = NC_UAggInfo; ) + pAggInfo->mnReg = pParse->nMem+1; + pAggInfo->nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0; + pAggInfo->pGroupBy = pGroupBy; + sqlite3ExprAnalyzeAggList(&sNC, pEList); + sqlite3ExprAnalyzeAggList(&sNC, sSort.pOrderBy); + if( pHaving ){ + if( pGroupBy ){ + assert( pWhere==p->pWhere ); + assert( pHaving==p->pHaving ); + assert( pGroupBy==p->pGroupBy ); + havingToWhere(pParse, p); + pWhere = p->pWhere; + } + sqlite3ExprAnalyzeAggregates(&sNC, pHaving); + } + pAggInfo->nAccumulator = pAggInfo->nColumn; + if( p->pGroupBy==0 && p->pHaving==0 && pAggInfo->nFunc==1 ){ + minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pExpr, &pMinMaxOrderBy); + }else{ + minMaxFlag = WHERE_ORDERBY_NORMAL; + } + for(i=0; inFunc; i++){ + Expr *pExpr = pAggInfo->aFunc[i].pExpr; + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + sNC.ncFlags |= NC_InAggFunc; + sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); +#ifndef SQLITE_OMIT_WINDOWFUNC + assert( !IsWindowFunc(pExpr) ); + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3ExprAnalyzeAggregates(&sNC, pExpr->y.pWin->pFilter); + } +#endif + sNC.ncFlags &= ~NC_InAggFunc; + } + pAggInfo->mxReg = pParse->nMem; + if( db->mallocFailed ) goto select_end; +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x400 ){ + int ii; + SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", pAggInfo)); + sqlite3TreeViewSelect(0, p, 0); + for(ii=0; iinColumn; ii++){ + sqlite3DebugPrintf("agg-column[%d] iMem=%d\n", + ii, pAggInfo->aCol[ii].iMem); + sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pExpr, 0); + } + for(ii=0; iinFunc; ii++){ + sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n", + ii, pAggInfo->aFunc[ii].iMem); + sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pExpr, 0); + } + } +#endif + + + /* Processing for aggregates with GROUP BY is very different and + ** much more complex than aggregates without a GROUP BY. + */ + if( pGroupBy ){ + KeyInfo *pKeyInfo; /* Keying information for the group by clause */ + int addr1; /* A-vs-B comparision jump */ + int addrOutputRow; /* Start of subroutine that outputs a result row */ + int regOutputRow; /* Return address register for output subroutine */ + int addrSetAbort; /* Set the abort flag and return */ + int addrTopOfLoop; /* Top of the input loop */ + int addrSortingIdx; /* The OP_OpenEphemeral for the sorting index */ + int addrReset; /* Subroutine for resetting the accumulator */ + int regReset; /* Return address register for reset subroutine */ + + /* If there is a GROUP BY clause we might need a sorting index to + ** implement it. Allocate that sorting index now. If it turns out + ** that we do not need it after all, the OP_SorterOpen instruction + ** will be converted into a Noop. + */ + pAggInfo->sortingIdx = pParse->nTab++; + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pGroupBy, + 0, pAggInfo->nColumn); + addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen, + pAggInfo->sortingIdx, pAggInfo->nSortingColumn, + 0, (char*)pKeyInfo, P4_KEYINFO); + + /* Initialize memory locations used by GROUP BY aggregate processing + */ + iUseFlag = ++pParse->nMem; + iAbortFlag = ++pParse->nMem; + regOutputRow = ++pParse->nMem; + addrOutputRow = sqlite3VdbeMakeLabel(pParse); + regReset = ++pParse->nMem; + addrReset = sqlite3VdbeMakeLabel(pParse); + iAMem = pParse->nMem + 1; + pParse->nMem += pGroupBy->nExpr; + iBMem = pParse->nMem + 1; + pParse->nMem += pGroupBy->nExpr; + sqlite3VdbeAddOp2(v, OP_Integer, 0, iAbortFlag); + VdbeComment((v, "clear abort flag")); + sqlite3VdbeAddOp3(v, OP_Null, 0, iAMem, iAMem+pGroupBy->nExpr-1); + + /* Begin a loop that will extract all source rows in GROUP BY order. + ** This might involve two separate loops with an OP_Sort in between, or + ** it might be a single loop that uses an index to extract information + ** in the right order to begin with. + */ + sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); + SELECTTRACE(1,pParse,p,("WhereBegin\n")); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, 0, + WHERE_GROUPBY | (orderByGrp ? WHERE_SORTBYGROUP : 0), 0 + ); + if( pWInfo==0 ) goto select_end; + if( sqlite3WhereIsOrdered(pWInfo)==pGroupBy->nExpr ){ + /* The optimizer is able to deliver rows in group by order so + ** we do not have to sort. The OP_OpenEphemeral table will be + ** cancelled later because we still need to use the pKeyInfo + */ + groupBySort = 0; + }else{ + /* Rows are coming out in undetermined order. We have to push + ** each row into a sorting index, terminate the first loop, + ** then loop over the sorting index in order to get the output + ** in sorted order + */ + int regBase; + int regRecord; + int nCol; + int nGroupBy; + + explainTempTable(pParse, + (sDistinct.isTnct && (p->selFlags&SF_Distinct)==0) ? + "DISTINCT" : "GROUP BY"); + + groupBySort = 1; + nGroupBy = pGroupBy->nExpr; + nCol = nGroupBy; + j = nGroupBy; + for(i=0; inColumn; i++){ + if( pAggInfo->aCol[i].iSorterColumn>=j ){ + nCol++; + j++; + } + } + regBase = sqlite3GetTempRange(pParse, nCol); + sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0, 0); + j = nGroupBy; + for(i=0; inColumn; i++){ + struct AggInfo_col *pCol = &pAggInfo->aCol[i]; + if( pCol->iSorterColumn>=j ){ + int r1 = j + regBase; + sqlite3ExprCodeGetColumnOfTable(v, + pCol->pTab, pCol->iTable, pCol->iColumn, r1); + j++; + } + } + regRecord = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord); + sqlite3VdbeAddOp2(v, OP_SorterInsert, pAggInfo->sortingIdx, regRecord); + sqlite3ReleaseTempReg(pParse, regRecord); + sqlite3ReleaseTempRange(pParse, regBase, nCol); + sqlite3WhereEnd(pWInfo); + pAggInfo->sortingIdxPTab = sortPTab = pParse->nTab++; + sortOut = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_OpenPseudo, sortPTab, sortOut, nCol); + sqlite3VdbeAddOp2(v, OP_SorterSort, pAggInfo->sortingIdx, addrEnd); + VdbeComment((v, "GROUP BY sort")); VdbeCoverage(v); + pAggInfo->useSortingIdx = 1; + } + + /* If the index or temporary table used by the GROUP BY sort + ** will naturally deliver rows in the order required by the ORDER BY + ** clause, cancel the ephemeral table open coded earlier. + ** + ** This is an optimization - the correct answer should result regardless. + ** Use the SQLITE_GroupByOrder flag with SQLITE_TESTCTRL_OPTIMIZER to + ** disable this optimization for testing purposes. */ + if( orderByGrp && OptimizationEnabled(db, SQLITE_GroupByOrder) + && (groupBySort || sqlite3WhereIsSorted(pWInfo)) + ){ + sSort.pOrderBy = 0; + sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex); + } + + /* Evaluate the current GROUP BY terms and store in b0, b1, b2... + ** (b0 is memory location iBMem+0, b1 is iBMem+1, and so forth) + ** Then compare the current GROUP BY terms against the GROUP BY terms + ** from the previous row currently stored in a0, a1, a2... + */ + addrTopOfLoop = sqlite3VdbeCurrentAddr(v); + if( groupBySort ){ + sqlite3VdbeAddOp3(v, OP_SorterData, pAggInfo->sortingIdx, + sortOut, sortPTab); + } + for(j=0; jnExpr; j++){ + if( groupBySort ){ + sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem+j); + }else{ + pAggInfo->directMode = 1; + sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j); + } + } + sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr, + (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Jump, addr1+1, 0, addr1+1); VdbeCoverage(v); + + /* Generate code that runs whenever the GROUP BY changes. + ** Changes in the GROUP BY are detected by the previous code + ** block. If there were no changes, this block is skipped. + ** + ** This code copies current group by terms in b0,b1,b2,... + ** over to a0,a1,a2. It then calls the output subroutine + ** and resets the aggregate accumulator registers in preparation + ** for the next GROUP BY batch. + */ + sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr); + sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); + VdbeComment((v, "output one row")); + sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd); VdbeCoverage(v); + VdbeComment((v, "check abort flag")); + sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); + VdbeComment((v, "reset accumulator")); + + /* Update the aggregate accumulators based on the content of + ** the current row + */ + sqlite3VdbeJumpHere(v, addr1); + updateAccumulator(pParse, iUseFlag, pAggInfo); + sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag); + VdbeComment((v, "indicate data in accumulator")); + + /* End of the loop + */ + if( groupBySort ){ + sqlite3VdbeAddOp2(v, OP_SorterNext, pAggInfo->sortingIdx, addrTopOfLoop); + VdbeCoverage(v); + }else{ + sqlite3WhereEnd(pWInfo); + sqlite3VdbeChangeToNoop(v, addrSortingIdx); + } + + /* Output the final row of result + */ + sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); + VdbeComment((v, "output final row")); + + /* Jump over the subroutines + */ + sqlite3VdbeGoto(v, addrEnd); + + /* Generate a subroutine that outputs a single row of the result + ** set. This subroutine first looks at the iUseFlag. If iUseFlag + ** is less than or equal to zero, the subroutine is a no-op. If + ** the processing calls for the query to abort, this subroutine + ** increments the iAbortFlag memory location before returning in + ** order to signal the caller to abort. + */ + addrSetAbort = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Integer, 1, iAbortFlag); + VdbeComment((v, "set abort flag")); + sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); + sqlite3VdbeResolveLabel(v, addrOutputRow); + addrOutputRow = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); + VdbeCoverage(v); + VdbeComment((v, "Groupby result generator entry point")); + sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); + finalizeAggFunctions(pParse, pAggInfo); + sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL); + selectInnerLoop(pParse, p, -1, &sSort, + &sDistinct, pDest, + addrOutputRow+1, addrSetAbort); + sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); + VdbeComment((v, "end groupby result generator")); + + /* Generate a subroutine that will reset the group-by accumulator + */ + sqlite3VdbeResolveLabel(v, addrReset); + resetAccumulator(pParse, pAggInfo); + sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); + VdbeComment((v, "indicate accumulator empty")); + sqlite3VdbeAddOp1(v, OP_Return, regReset); + + } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ + else { + Table *pTab; + if( (pTab = isSimpleCount(p, pAggInfo))!=0 ){ + /* If isSimpleCount() returns a pointer to a Table structure, then + ** the SQL statement is of the form: + ** + ** SELECT count(*) FROM + ** + ** where the Table structure returned represents table . + ** + ** This statement is so common that it is optimized specially. The + ** OP_Count instruction is executed either on the intkey table that + ** contains the data for table or on one of its indexes. It + ** is better to execute the op on an index, as indexes are almost + ** always spread across less pages than their corresponding tables. + */ + const int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + const int iCsr = pParse->nTab++; /* Cursor to scan b-tree */ + Index *pIdx; /* Iterator variable */ + KeyInfo *pKeyInfo = 0; /* Keyinfo for scanned index */ + Index *pBest = 0; /* Best index found so far */ + int iRoot = pTab->tnum; /* Root page of scanned b-tree */ + + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + + /* Search for the index that has the lowest scan cost. + ** + ** (2011-04-15) Do not do a full scan of an unordered index. + ** + ** (2013-10-03) Do not count the entries in a partial index. + ** + ** In practice the KeyInfo structure will not be used. It is only + ** passed to keep OP_OpenRead happy. + */ + if( !HasRowid(pTab) ) pBest = sqlite3PrimaryKeyIndex(pTab); + if( !p->pSrc->a[0].fg.notIndexed ){ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->bUnordered==0 + && pIdx->szIdxRowszTabRow + && pIdx->pPartIdxWhere==0 + && (!pBest || pIdx->szIdxRowszIdxRow) + ){ + pBest = pIdx; + } + } + } + if( pBest ){ + iRoot = pBest->tnum; + pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pBest); + } + + /* Open a read-only cursor, execute the OP_Count, close the cursor. */ + sqlite3VdbeAddOp4Int(v, OP_OpenRead, iCsr, iRoot, iDb, 1); + if( pKeyInfo ){ + sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO); + } + sqlite3VdbeAddOp2(v, OP_Count, iCsr, pAggInfo->aFunc[0].iMem); + sqlite3VdbeAddOp1(v, OP_Close, iCsr); + explainSimpleCount(pParse, pTab, pBest); + }else{ + int regAcc = 0; /* "populate accumulators" flag */ + + /* If there are accumulator registers but no min() or max() functions + ** without FILTER clauses, allocate register regAcc. Register regAcc + ** will contain 0 the first time the inner loop runs, and 1 thereafter. + ** The code generated by updateAccumulator() uses this to ensure + ** that the accumulator registers are (a) updated only once if + ** there are no min() or max functions or (b) always updated for the + ** first row visited by the aggregate, so that they are updated at + ** least once even if the FILTER clause means the min() or max() + ** function visits zero rows. */ + if( pAggInfo->nAccumulator ){ + for(i=0; inFunc; i++){ + if( ExprHasProperty(pAggInfo->aFunc[i].pExpr, EP_WinFunc) ){ + continue; + } + if( pAggInfo->aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ){ + break; + } + } + if( i==pAggInfo->nFunc ){ + regAcc = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regAcc); + } + } + + /* This case runs if the aggregate has no GROUP BY clause. The + ** processing is much simpler since there is only a single row + ** of output. + */ + assert( p->pGroupBy==0 ); + resetAccumulator(pParse, pAggInfo); + + /* If this query is a candidate for the min/max optimization, then + ** minMaxFlag will have been previously set to either + ** WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX and pMinMaxOrderBy will + ** be an appropriate ORDER BY expression for the optimization. + */ + assert( minMaxFlag==WHERE_ORDERBY_NORMAL || pMinMaxOrderBy!=0 ); + assert( pMinMaxOrderBy==0 || pMinMaxOrderBy->nExpr==1 ); + + SELECTTRACE(1,pParse,p,("WhereBegin\n")); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMaxOrderBy, + 0, minMaxFlag, 0); + if( pWInfo==0 ){ + goto select_end; + } + updateAccumulator(pParse, regAcc, pAggInfo); + if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc); + if( sqlite3WhereIsOrdered(pWInfo)>0 ){ + sqlite3VdbeGoto(v, sqlite3WhereBreakLabel(pWInfo)); + VdbeComment((v, "%s() by index", + (minMaxFlag==WHERE_ORDERBY_MIN?"min":"max"))); + } + sqlite3WhereEnd(pWInfo); + finalizeAggFunctions(pParse, pAggInfo); + } + + sSort.pOrderBy = 0; + sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL); + selectInnerLoop(pParse, p, -1, 0, 0, + pDest, addrEnd, addrEnd); + } + sqlite3VdbeResolveLabel(v, addrEnd); + + } /* endif aggregate query */ + + if( sDistinct.eTnctType==WHERE_DISTINCT_UNORDERED ){ + explainTempTable(pParse, "DISTINCT"); + } + + /* If there is an ORDER BY clause, then we need to sort the results + ** and send them to the callback one by one. + */ + if( sSort.pOrderBy ){ + explainTempTable(pParse, + sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY"); + assert( p->pEList==pEList ); + generateSortTail(pParse, p, &sSort, pEList->nExpr, pDest); + } + + /* Jump here to skip this query + */ + sqlite3VdbeResolveLabel(v, iEnd); + + /* The SELECT has been coded. If there is an error in the Parse structure, + ** set the return code to 1. Otherwise 0. */ + rc = (pParse->nErr>0); + + /* Control jumps to here if an error is encountered above, or upon + ** successful coding of the SELECT. + */ +select_end: + sqlite3ExprListDelete(db, pMinMaxOrderBy); +#ifdef SQLITE_DEBUG + if( pAggInfo && !db->mallocFailed ){ + for(i=0; inColumn; i++){ + Expr *pExpr = pAggInfo->aCol[i].pExpr; + assert( pExpr!=0 || db->mallocFailed ); + if( pExpr==0 ) continue; + assert( pExpr->pAggInfo==pAggInfo ); + assert( pExpr->iAgg==i ); + } + for(i=0; inFunc; i++){ + Expr *pExpr = pAggInfo->aFunc[i].pExpr; + assert( pExpr!=0 || db->mallocFailed ); + if( pExpr==0 ) continue; + assert( pExpr->pAggInfo==pAggInfo ); + assert( pExpr->iAgg==i ); + } + } +#endif + +#if SELECTTRACE_ENABLED + SELECTTRACE(0x1,pParse,p,("end processing\n")); + if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ + sqlite3TreeViewSelect(0, p, 0); + } +#endif + ExplainQueryPlanPop(pParse); + return rc; +} + +/************** End of select.c **********************************************/ +/************** Begin file table.c *******************************************/ +/* +** 2001 September 15 +** +** 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 the sqlite3_get_table() and sqlite3_free_table() +** interface routines. These are just wrappers around the main +** interface routine of sqlite3_exec(). +** +** These routines are in a separate files so that they will not be linked +** if they are not used. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_GET_TABLE + +/* +** This structure is used to pass data from sqlite3_get_table() through +** to the callback function is uses to build the result. +*/ +typedef struct TabResult { + char **azResult; /* Accumulated output */ + char *zErrMsg; /* Error message text, if an error occurs */ + u32 nAlloc; /* Slots allocated for azResult[] */ + u32 nRow; /* Number of rows in the result */ + u32 nColumn; /* Number of columns in the result */ + u32 nData; /* Slots used in azResult[]. (nRow+1)*nColumn */ + int rc; /* Return code from sqlite3_exec() */ +} TabResult; + +/* +** This routine is called once for each row in the result table. Its job +** is to fill in the TabResult structure appropriately, allocating new +** memory as necessary. +*/ +static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){ + TabResult *p = (TabResult*)pArg; /* Result accumulator */ + int need; /* Slots needed in p->azResult[] */ + int i; /* Loop counter */ + char *z; /* A single column of result */ + + /* Make sure there is enough space in p->azResult to hold everything + ** we need to remember from this invocation of the callback. + */ + if( p->nRow==0 && argv!=0 ){ + need = nCol*2; + }else{ + need = nCol; + } + if( p->nData + need > p->nAlloc ){ + char **azNew; + p->nAlloc = p->nAlloc*2 + need; + azNew = sqlite3Realloc( p->azResult, sizeof(char*)*p->nAlloc ); + if( azNew==0 ) goto malloc_failed; + p->azResult = azNew; + } + + /* If this is the first row, then generate an extra row containing + ** the names of all columns. + */ + if( p->nRow==0 ){ + p->nColumn = nCol; + for(i=0; iazResult[p->nData++] = z; + } + }else if( (int)p->nColumn!=nCol ){ + sqlite3_free(p->zErrMsg); + p->zErrMsg = sqlite3_mprintf( + "sqlite3_get_table() called with two or more incompatible queries" + ); + p->rc = SQLITE_ERROR; + return 1; + } + + /* Copy over the row data + */ + if( argv!=0 ){ + for(i=0; iazResult[p->nData++] = z; + } + p->nRow++; + } + return 0; + +malloc_failed: + p->rc = SQLITE_NOMEM_BKPT; + return 1; +} + +/* +** Query the database. But instead of invoking a callback for each row, +** malloc() for space to hold the result and return the entire results +** at the conclusion of the call. +** +** The result that is written to ***pazResult is held in memory obtained +** from malloc(). But the caller cannot free this memory directly. +** Instead, the entire table should be passed to sqlite3_free_table() when +** the calling procedure is finished using it. +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* The database on which the SQL executes */ + const char *zSql, /* The SQL to be executed */ + char ***pazResult, /* Write the result table here */ + int *pnRow, /* Write the number of rows in the result here */ + int *pnColumn, /* Write the number of columns of result here */ + char **pzErrMsg /* Write error messages here */ +){ + int rc; + TabResult res; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || pazResult==0 ) return SQLITE_MISUSE_BKPT; +#endif + *pazResult = 0; + if( pnColumn ) *pnColumn = 0; + if( pnRow ) *pnRow = 0; + if( pzErrMsg ) *pzErrMsg = 0; + res.zErrMsg = 0; + res.nRow = 0; + res.nColumn = 0; + res.nData = 1; + res.nAlloc = 20; + res.rc = SQLITE_OK; + res.azResult = sqlite3_malloc64(sizeof(char*)*res.nAlloc ); + if( res.azResult==0 ){ + db->errCode = SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; + } + res.azResult[0] = 0; + rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg); + assert( sizeof(res.azResult[0])>= sizeof(res.nData) ); + res.azResult[0] = SQLITE_INT_TO_PTR(res.nData); + if( (rc&0xff)==SQLITE_ABORT ){ + sqlite3_free_table(&res.azResult[1]); + if( res.zErrMsg ){ + if( pzErrMsg ){ + sqlite3_free(*pzErrMsg); + *pzErrMsg = sqlite3_mprintf("%s",res.zErrMsg); + } + sqlite3_free(res.zErrMsg); + } + db->errCode = res.rc; /* Assume 32-bit assignment is atomic */ + return res.rc; + } + sqlite3_free(res.zErrMsg); + if( rc!=SQLITE_OK ){ + sqlite3_free_table(&res.azResult[1]); + return rc; + } + if( res.nAlloc>res.nData ){ + char **azNew; + azNew = sqlite3Realloc( res.azResult, sizeof(char*)*res.nData ); + if( azNew==0 ){ + sqlite3_free_table(&res.azResult[1]); + db->errCode = SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; + } + res.azResult = azNew; + } + *pazResult = &res.azResult[1]; + if( pnColumn ) *pnColumn = res.nColumn; + if( pnRow ) *pnRow = res.nRow; + return rc; +} + +/* +** This routine frees the space the sqlite3_get_table() malloced. +*/ +SQLITE_API void sqlite3_free_table( + char **azResult /* Result returned from sqlite3_get_table() */ +){ + if( azResult ){ + int i, n; + azResult--; + assert( azResult!=0 ); + n = SQLITE_PTR_TO_INT(azResult[0]); + for(i=1; ipNext; + + sqlite3ExprDelete(db, pTmp->pWhere); + sqlite3ExprListDelete(db, pTmp->pExprList); + sqlite3SelectDelete(db, pTmp->pSelect); + sqlite3IdListDelete(db, pTmp->pIdList); + sqlite3UpsertDelete(db, pTmp->pUpsert); + sqlite3DbFree(db, pTmp->zSpan); + + sqlite3DbFree(db, pTmp); + } +} + +/* +** Given table pTab, return a list of all the triggers attached to +** the table. The list is connected by Trigger.pNext pointers. +** +** All of the triggers on pTab that are in the same database as pTab +** are already attached to pTab->pTrigger. But there might be additional +** triggers on pTab in the TEMP schema. This routine prepends all +** TEMP triggers on pTab to the beginning of the pTab->pTrigger list +** and returns the combined list. +** +** To state it another way: This routine returns a list of all triggers +** that fire off of pTab. The list will include any TEMP triggers on +** pTab as well as the triggers lised in pTab->pTrigger. +*/ +SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){ + Schema * const pTmpSchema = pParse->db->aDb[1].pSchema; + Trigger *pList = 0; /* List of triggers to return */ + + if( pParse->disableTriggers ){ + return 0; + } + + if( pTmpSchema!=pTab->pSchema ){ + HashElem *p; + assert( sqlite3SchemaMutexHeld(pParse->db, 0, pTmpSchema) ); + for(p=sqliteHashFirst(&pTmpSchema->trigHash); p; p=sqliteHashNext(p)){ + Trigger *pTrig = (Trigger *)sqliteHashData(p); + if( pTrig->pTabSchema==pTab->pSchema + && 0==sqlite3StrICmp(pTrig->table, pTab->zName) + ){ + pTrig->pNext = (pList ? pList : pTab->pTrigger); + pList = pTrig; + } + } + } + + return (pList ? pList : pTab->pTrigger); +} + +/* +** This is called by the parser when it sees a CREATE TRIGGER statement +** up to the point of the BEGIN before the trigger actions. A Trigger +** structure is generated based on the information available and stored +** in pParse->pNewTrigger. After the trigger actions have been parsed, the +** sqlite3FinishTrigger() function is called to complete the trigger +** construction process. +*/ +SQLITE_PRIVATE void sqlite3BeginTrigger( + Parse *pParse, /* The parse context of the CREATE TRIGGER statement */ + Token *pName1, /* The name of the trigger */ + Token *pName2, /* The name of the trigger */ + int tr_tm, /* One of TK_BEFORE, TK_AFTER, TK_INSTEAD */ + int op, /* One of TK_INSERT, TK_UPDATE, TK_DELETE */ + IdList *pColumns, /* column list if this is an UPDATE OF trigger */ + SrcList *pTableName,/* The name of the table/view the trigger applies to */ + Expr *pWhen, /* WHEN clause */ + int isTemp, /* True if the TEMPORARY keyword is present */ + int noErr /* Suppress errors if the trigger already exists */ +){ + Trigger *pTrigger = 0; /* The new trigger */ + Table *pTab; /* Table that the trigger fires off of */ + char *zName = 0; /* Name of the trigger */ + sqlite3 *db = pParse->db; /* The database connection */ + int iDb; /* The database to store the trigger in */ + Token *pName; /* The unqualified db name */ + DbFixer sFix; /* State vector for the DB fixer */ + + assert( pName1!=0 ); /* pName1->z might be NULL, but not pName1 itself */ + assert( pName2!=0 ); + assert( op==TK_INSERT || op==TK_UPDATE || op==TK_DELETE ); + assert( op>0 && op<0xff ); + if( isTemp ){ + /* If TEMP was specified, then the trigger name may not be qualified. */ + if( pName2->n>0 ){ + sqlite3ErrorMsg(pParse, "temporary trigger may not have qualified name"); + goto trigger_cleanup; + } + iDb = 1; + pName = pName1; + }else{ + /* Figure out the db that the trigger will be created in */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ){ + goto trigger_cleanup; + } + } + if( !pTableName || db->mallocFailed ){ + goto trigger_cleanup; + } + + /* A long-standing parser bug is that this syntax was allowed: + ** + ** CREATE TRIGGER attached.demo AFTER INSERT ON attached.tab .... + ** ^^^^^^^^ + ** + ** To maintain backwards compatibility, ignore the database + ** name on pTableName if we are reparsing out of SQLITE_MASTER. + */ + if( db->init.busy && iDb!=1 ){ + sqlite3DbFree(db, pTableName->a[0].zDatabase); + pTableName->a[0].zDatabase = 0; + } + + /* If the trigger name was unqualified, and the table is a temp table, + ** then set iDb to 1 to create the trigger in the temporary database. + ** If sqlite3SrcListLookup() returns 0, indicating the table does not + ** exist, the error is caught by the block below. + */ + pTab = sqlite3SrcListLookup(pParse, pTableName); + if( db->init.busy==0 && pName2->n==0 && pTab + && pTab->pSchema==db->aDb[1].pSchema ){ + iDb = 1; + } + + /* Ensure the table name matches database name and that the table exists */ + if( db->mallocFailed ) goto trigger_cleanup; + assert( pTableName->nSrc==1 ); + sqlite3FixInit(&sFix, pParse, iDb, "trigger", pName); + if( sqlite3FixSrcList(&sFix, pTableName) ){ + goto trigger_cleanup; + } + pTab = sqlite3SrcListLookup(pParse, pTableName); + if( !pTab ){ + /* The table does not exist. */ + if( db->init.iDb==1 ){ + /* Ticket #3810. + ** Normally, whenever a table is dropped, all associated triggers are + ** dropped too. But if a TEMP trigger is created on a non-TEMP table + ** and the table is dropped by a different database connection, the + ** trigger is not visible to the database connection that does the + ** drop so the trigger cannot be dropped. This results in an + ** "orphaned trigger" - a trigger whose associated table is missing. + */ + db->init.orphanTrigger = 1; + } + goto trigger_cleanup; + } + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "cannot create triggers on virtual tables"); + goto trigger_cleanup; + } + + /* Check that the trigger name is not reserved and that no trigger of the + ** specified name exists */ + zName = sqlite3NameFromToken(db, pName); + if( zName==0 ){ + assert( db->mallocFailed ); + goto trigger_cleanup; + } + if( sqlite3CheckObjectName(pParse, zName, "trigger", pTab->zName) ){ + goto trigger_cleanup; + } + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( !IN_RENAME_OBJECT ){ + if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash),zName) ){ + if( !noErr ){ + sqlite3ErrorMsg(pParse, "trigger %T already exists", pName); + }else{ + assert( !db->init.busy ); + sqlite3CodeVerifySchema(pParse, iDb); + } + goto trigger_cleanup; + } + } + + /* Do not create a trigger on a system table */ + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){ + sqlite3ErrorMsg(pParse, "cannot create trigger on system table"); + goto trigger_cleanup; + } + + /* INSTEAD of triggers are only for views and views only support INSTEAD + ** of triggers. + */ + if( pTab->pSelect && tr_tm!=TK_INSTEAD ){ + sqlite3ErrorMsg(pParse, "cannot create %s trigger on view: %S", + (tr_tm == TK_BEFORE)?"BEFORE":"AFTER", pTableName, 0); + goto trigger_cleanup; + } + if( !pTab->pSelect && tr_tm==TK_INSTEAD ){ + sqlite3ErrorMsg(pParse, "cannot create INSTEAD OF" + " trigger on table: %S", pTableName, 0); + goto trigger_cleanup; + } + +#ifndef SQLITE_OMIT_AUTHORIZATION + if( !IN_RENAME_OBJECT ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + int code = SQLITE_CREATE_TRIGGER; + const char *zDb = db->aDb[iTabDb].zDbSName; + const char *zDbTrig = isTemp ? db->aDb[1].zDbSName : zDb; + if( iTabDb==1 || isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER; + if( sqlite3AuthCheck(pParse, code, zName, pTab->zName, zDbTrig) ){ + goto trigger_cleanup; + } + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iTabDb),0,zDb)){ + goto trigger_cleanup; + } + } +#endif + + /* INSTEAD OF triggers can only appear on views and BEFORE triggers + ** cannot appear on views. So we might as well translate every + ** INSTEAD OF trigger into a BEFORE trigger. It simplifies code + ** elsewhere. + */ + if (tr_tm == TK_INSTEAD){ + tr_tm = TK_BEFORE; + } + + /* Build the Trigger object */ + pTrigger = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger)); + if( pTrigger==0 ) goto trigger_cleanup; + pTrigger->zName = zName; + zName = 0; + pTrigger->table = sqlite3DbStrDup(db, pTableName->a[0].zName); + pTrigger->pSchema = db->aDb[iDb].pSchema; + pTrigger->pTabSchema = pTab->pSchema; + pTrigger->op = (u8)op; + pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER; + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, pTrigger->table, pTableName->a[0].zName); + pTrigger->pWhen = pWhen; + pWhen = 0; + }else{ + pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE); + } + pTrigger->pColumns = pColumns; + pColumns = 0; + assert( pParse->pNewTrigger==0 ); + pParse->pNewTrigger = pTrigger; + +trigger_cleanup: + sqlite3DbFree(db, zName); + sqlite3SrcListDelete(db, pTableName); + sqlite3IdListDelete(db, pColumns); + sqlite3ExprDelete(db, pWhen); + if( !pParse->pNewTrigger ){ + sqlite3DeleteTrigger(db, pTrigger); + }else{ + assert( pParse->pNewTrigger==pTrigger ); + } +} + +/* +** This routine is called after all of the trigger actions have been parsed +** in order to complete the process of building the trigger. +*/ +SQLITE_PRIVATE void sqlite3FinishTrigger( + Parse *pParse, /* Parser context */ + TriggerStep *pStepList, /* The triggered program */ + Token *pAll /* Token that describes the complete CREATE TRIGGER */ +){ + Trigger *pTrig = pParse->pNewTrigger; /* Trigger being finished */ + char *zName; /* Name of trigger */ + sqlite3 *db = pParse->db; /* The database */ + DbFixer sFix; /* Fixer object */ + int iDb; /* Database containing the trigger */ + Token nameToken; /* Trigger name for error reporting */ + + pParse->pNewTrigger = 0; + if( NEVER(pParse->nErr) || !pTrig ) goto triggerfinish_cleanup; + zName = pTrig->zName; + iDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema); + pTrig->step_list = pStepList; + while( pStepList ){ + pStepList->pTrig = pTrig; + pStepList = pStepList->pNext; + } + sqlite3TokenInit(&nameToken, pTrig->zName); + sqlite3FixInit(&sFix, pParse, iDb, "trigger", &nameToken); + if( sqlite3FixTriggerStep(&sFix, pTrig->step_list) + || sqlite3FixExpr(&sFix, pTrig->pWhen) + ){ + goto triggerfinish_cleanup; + } + +#ifndef SQLITE_OMIT_ALTERTABLE + if( IN_RENAME_OBJECT ){ + assert( !db->init.busy ); + pParse->pNewTrigger = pTrig; + pTrig = 0; + }else +#endif + + /* if we are not initializing, + ** build the sqlite_master entry + */ + if( !db->init.busy ){ + Vdbe *v; + char *z; + + /* Make an entry in the sqlite_master table */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto triggerfinish_cleanup; + sqlite3BeginWriteOperation(pParse, 0, iDb); + z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); + testcase( z==0 ); + sqlite3NestedParse(pParse, + "INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", + db->aDb[iDb].zDbSName, MASTER_NAME, zName, + pTrig->table, z); + sqlite3DbFree(db, z); + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddParseSchemaOp(v, iDb, + sqlite3MPrintf(db, "type='trigger' AND name='%q'", zName)); + } + + if( db->init.busy ){ + Trigger *pLink = pTrig; + Hash *pHash = &db->aDb[iDb].pSchema->trigHash; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + assert( pLink!=0 ); + pTrig = sqlite3HashInsert(pHash, zName, pTrig); + if( pTrig ){ + sqlite3OomFault(db); + }else if( pLink->pSchema==pLink->pTabSchema ){ + Table *pTab; + pTab = sqlite3HashFind(&pLink->pTabSchema->tblHash, pLink->table); + assert( pTab!=0 ); + pLink->pNext = pTab->pTrigger; + pTab->pTrigger = pLink; + } + } + +triggerfinish_cleanup: + sqlite3DeleteTrigger(db, pTrig); + assert( IN_RENAME_OBJECT || !pParse->pNewTrigger ); + sqlite3DeleteTriggerStep(db, pStepList); +} + +/* +** Duplicate a range of text from an SQL statement, then convert all +** whitespace characters into ordinary space characters. +*/ +static char *triggerSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){ + char *z = sqlite3DbSpanDup(db, zStart, zEnd); + int i; + if( z ) for(i=0; z[i]; i++) if( sqlite3Isspace(z[i]) ) z[i] = ' '; + return z; +} + +/* +** Turn a SELECT statement (that the pSelect parameter points to) into +** a trigger step. Return a pointer to a TriggerStep structure. +** +** The parser calls this routine when it finds a SELECT statement in +** body of a TRIGGER. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep( + sqlite3 *db, /* Database connection */ + Select *pSelect, /* The SELECT statement */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ + TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep)); + if( pTriggerStep==0 ) { + sqlite3SelectDelete(db, pSelect); + return 0; + } + pTriggerStep->op = TK_SELECT; + pTriggerStep->pSelect = pSelect; + pTriggerStep->orconf = OE_Default; + pTriggerStep->zSpan = triggerSpanDup(db, zStart, zEnd); + return pTriggerStep; +} + +/* +** Allocate space to hold a new trigger step. The allocated space +** holds both the TriggerStep object and the TriggerStep.target.z string. +** +** If an OOM error occurs, NULL is returned and db->mallocFailed is set. +*/ +static TriggerStep *triggerStepAllocate( + Parse *pParse, /* Parser context */ + u8 op, /* Trigger opcode */ + Token *pName, /* The target name */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ + sqlite3 *db = pParse->db; + TriggerStep *pTriggerStep; + + pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1); + if( pTriggerStep ){ + char *z = (char*)&pTriggerStep[1]; + memcpy(z, pName->z, pName->n); + sqlite3Dequote(z); + pTriggerStep->zTarget = z; + pTriggerStep->op = op; + pTriggerStep->zSpan = triggerSpanDup(db, zStart, zEnd); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenMap(pParse, pTriggerStep->zTarget, pName); + } + } + return pTriggerStep; +} + +/* +** Build a trigger step out of an INSERT statement. Return a pointer +** to the new trigger step. +** +** The parser calls this routine when it sees an INSERT inside the +** body of a trigger. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep( + Parse *pParse, /* Parser */ + Token *pTableName, /* Name of the table into which we insert */ + IdList *pColumn, /* List of columns in pTableName to insert into */ + Select *pSelect, /* A SELECT statement that supplies values */ + u8 orconf, /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */ + Upsert *pUpsert, /* ON CONFLICT clauses for upsert */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ + sqlite3 *db = pParse->db; + TriggerStep *pTriggerStep; + + assert(pSelect != 0 || db->mallocFailed); + + pTriggerStep = triggerStepAllocate(pParse, TK_INSERT, pTableName,zStart,zEnd); + if( pTriggerStep ){ + if( IN_RENAME_OBJECT ){ + pTriggerStep->pSelect = pSelect; + pSelect = 0; + }else{ + pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); + } + pTriggerStep->pIdList = pColumn; + pTriggerStep->pUpsert = pUpsert; + pTriggerStep->orconf = orconf; + if( pUpsert ){ + sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget); + } + }else{ + testcase( pColumn ); + sqlite3IdListDelete(db, pColumn); + testcase( pUpsert ); + sqlite3UpsertDelete(db, pUpsert); + } + sqlite3SelectDelete(db, pSelect); + + return pTriggerStep; +} + +/* +** Construct a trigger step that implements an UPDATE statement and return +** a pointer to that trigger step. The parser calls this routine when it +** sees an UPDATE statement inside the body of a CREATE TRIGGER. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep( + Parse *pParse, /* Parser */ + Token *pTableName, /* Name of the table to be updated */ + ExprList *pEList, /* The SET clause: list of column and new values */ + Expr *pWhere, /* The WHERE clause */ + u8 orconf, /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ + sqlite3 *db = pParse->db; + TriggerStep *pTriggerStep; + + pTriggerStep = triggerStepAllocate(pParse, TK_UPDATE, pTableName,zStart,zEnd); + if( pTriggerStep ){ + if( IN_RENAME_OBJECT ){ + pTriggerStep->pExprList = pEList; + pTriggerStep->pWhere = pWhere; + pEList = 0; + pWhere = 0; + }else{ + pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE); + pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); + } + pTriggerStep->orconf = orconf; + } + sqlite3ExprListDelete(db, pEList); + sqlite3ExprDelete(db, pWhere); + return pTriggerStep; +} + +/* +** Construct a trigger step that implements a DELETE statement and return +** a pointer to that trigger step. The parser calls this routine when it +** sees a DELETE statement inside the body of a CREATE TRIGGER. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep( + Parse *pParse, /* Parser */ + Token *pTableName, /* The table from which rows are deleted */ + Expr *pWhere, /* The WHERE clause */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ + sqlite3 *db = pParse->db; + TriggerStep *pTriggerStep; + + pTriggerStep = triggerStepAllocate(pParse, TK_DELETE, pTableName,zStart,zEnd); + if( pTriggerStep ){ + if( IN_RENAME_OBJECT ){ + pTriggerStep->pWhere = pWhere; + pWhere = 0; + }else{ + pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); + } + pTriggerStep->orconf = OE_Default; + } + sqlite3ExprDelete(db, pWhere); + return pTriggerStep; +} + +/* +** Recursively delete a Trigger structure +*/ +SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){ + if( pTrigger==0 ) return; + sqlite3DeleteTriggerStep(db, pTrigger->step_list); + sqlite3DbFree(db, pTrigger->zName); + sqlite3DbFree(db, pTrigger->table); + sqlite3ExprDelete(db, pTrigger->pWhen); + sqlite3IdListDelete(db, pTrigger->pColumns); + sqlite3DbFree(db, pTrigger); +} + +/* +** This function is called to drop a trigger from the database schema. +** +** This may be called directly from the parser and therefore identifies +** the trigger by name. The sqlite3DropTriggerPtr() routine does the +** same job as this routine except it takes a pointer to the trigger +** instead of the trigger name. +**/ +SQLITE_PRIVATE void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr){ + Trigger *pTrigger = 0; + int i; + const char *zDb; + const char *zName; + sqlite3 *db = pParse->db; + + if( db->mallocFailed ) goto drop_trigger_cleanup; + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto drop_trigger_cleanup; + } + + assert( pName->nSrc==1 ); + zDb = pName->a[0].zDatabase; + zName = pName->a[0].zName; + assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); + for(i=OMIT_TEMPDB; inDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + if( zDb && sqlite3DbIsNamed(db, j, zDb)==0 ) continue; + assert( sqlite3SchemaMutexHeld(db, j, 0) ); + pTrigger = sqlite3HashFind(&(db->aDb[j].pSchema->trigHash), zName); + if( pTrigger ) break; + } + if( !pTrigger ){ + if( !noErr ){ + sqlite3ErrorMsg(pParse, "no such trigger: %S", pName, 0); + }else{ + sqlite3CodeVerifyNamedSchema(pParse, zDb); + } + pParse->checkSchema = 1; + goto drop_trigger_cleanup; + } + sqlite3DropTriggerPtr(pParse, pTrigger); + +drop_trigger_cleanup: + sqlite3SrcListDelete(db, pName); +} + +/* +** Return a pointer to the Table structure for the table that a trigger +** is set on. +*/ +static Table *tableOfTrigger(Trigger *pTrigger){ + return sqlite3HashFind(&pTrigger->pTabSchema->tblHash, pTrigger->table); +} + + +/* +** Drop a trigger given a pointer to that trigger. +*/ +SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ + Table *pTable; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + iDb = sqlite3SchemaToIndex(pParse->db, pTrigger->pSchema); + assert( iDb>=0 && iDbnDb ); + pTable = tableOfTrigger(pTrigger); + assert( (pTable && pTable->pSchema==pTrigger->pSchema) || iDb==1 ); +#ifndef SQLITE_OMIT_AUTHORIZATION + if( pTable ){ + int code = SQLITE_DROP_TRIGGER; + const char *zDb = db->aDb[iDb].zDbSName; + const char *zTab = SCHEMA_TABLE(iDb); + if( iDb==1 ) code = SQLITE_DROP_TEMP_TRIGGER; + if( sqlite3AuthCheck(pParse, code, pTrigger->zName, pTable->zName, zDb) || + sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ + return; + } + } +#endif + + /* Generate code to destroy the database record of the trigger. + */ + if( (v = sqlite3GetVdbe(pParse))!=0 ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", + db->aDb[iDb].zDbSName, MASTER_NAME, pTrigger->zName + ); + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); + } +} + +/* +** Remove a trigger from the hash tables of the sqlite* pointer. +*/ +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const char *zName){ + Trigger *pTrigger; + Hash *pHash; + + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pHash = &(db->aDb[iDb].pSchema->trigHash); + pTrigger = sqlite3HashInsert(pHash, zName, 0); + if( ALWAYS(pTrigger) ){ + if( pTrigger->pSchema==pTrigger->pTabSchema ){ + Table *pTab = tableOfTrigger(pTrigger); + if( pTab ){ + Trigger **pp; + for(pp=&pTab->pTrigger; *pp; pp=&((*pp)->pNext)){ + if( *pp==pTrigger ){ + *pp = (*pp)->pNext; + break; + } + } + } + } + sqlite3DeleteTrigger(db, pTrigger); + db->mDbFlags |= DBFLAG_SchemaChange; + } +} + +/* +** pEList is the SET clause of an UPDATE statement. Each entry +** in pEList is of the format =. If any of the entries +** in pEList have an which matches an identifier in pIdList, +** then return TRUE. If pIdList==NULL, then it is considered a +** wildcard that matches anything. Likewise if pEList==NULL then +** it matches anything so always return true. Return false only +** if there is no match. +*/ +static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){ + int e; + if( pIdList==0 || NEVER(pEList==0) ) return 1; + for(e=0; enExpr; e++){ + if( sqlite3IdListIndex(pIdList, pEList->a[e].zEName)>=0 ) return 1; + } + return 0; +} + +/* +** Return a list of all triggers on table pTab if there exists at least +** one trigger that must be fired when an operation of type 'op' is +** performed on the table, and, if that operation is an UPDATE, if at +** least one of the columns in pChanges is being modified. +*/ +SQLITE_PRIVATE Trigger *sqlite3TriggersExist( + Parse *pParse, /* Parse context */ + Table *pTab, /* The table the contains the triggers */ + int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */ + ExprList *pChanges, /* Columns that change in an UPDATE statement */ + int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ +){ + int mask = 0; + Trigger *pList = 0; + Trigger *p; + + if( (pParse->db->flags & SQLITE_EnableTrigger)!=0 ){ + pList = sqlite3TriggerList(pParse, pTab); + } + assert( pList==0 || IsVirtual(pTab)==0 ); + for(p=pList; p; p=p->pNext){ + if( p->op==op && checkColumnOverlap(p->pColumns, pChanges) ){ + mask |= p->tr_tm; + } + } + if( pMask ){ + *pMask = mask; + } + return (mask ? pList : 0); +} + +/* +** Convert the pStep->zTarget string into a SrcList and return a pointer +** to that SrcList. +** +** This routine adds a specific database name, if needed, to the target when +** forming the SrcList. This prevents a trigger in one database from +** referring to a target in another database. An exception is when the +** trigger is in TEMP in which case it can refer to any other database it +** wants. +*/ +static SrcList *targetSrcList( + Parse *pParse, /* The parsing context */ + TriggerStep *pStep /* The trigger containing the target token */ +){ + sqlite3 *db = pParse->db; + int iDb; /* Index of the database to use */ + SrcList *pSrc; /* SrcList to be returned */ + + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pSrc ){ + assert( pSrc->nSrc>0 ); + pSrc->a[pSrc->nSrc-1].zName = sqlite3DbStrDup(db, pStep->zTarget); + iDb = sqlite3SchemaToIndex(db, pStep->pTrig->pSchema); + if( iDb==0 || iDb>=2 ){ + const char *zDb; + assert( iDbnDb ); + zDb = db->aDb[iDb].zDbSName; + pSrc->a[pSrc->nSrc-1].zDatabase = sqlite3DbStrDup(db, zDb); + } + } + return pSrc; +} + +/* +** Generate VDBE code for the statements inside the body of a single +** trigger. +*/ +static int codeTriggerProgram( + Parse *pParse, /* The parser context */ + TriggerStep *pStepList, /* List of statements inside the trigger body */ + int orconf /* Conflict algorithm. (OE_Abort, etc) */ +){ + TriggerStep *pStep; + Vdbe *v = pParse->pVdbe; + sqlite3 *db = pParse->db; + + assert( pParse->pTriggerTab && pParse->pToplevel ); + assert( pStepList ); + assert( v!=0 ); + for(pStep=pStepList; pStep; pStep=pStep->pNext){ + /* Figure out the ON CONFLICT policy that will be used for this step + ** of the trigger program. If the statement that caused this trigger + ** to fire had an explicit ON CONFLICT, then use it. Otherwise, use + ** the ON CONFLICT policy that was specified as part of the trigger + ** step statement. Example: + ** + ** CREATE TRIGGER AFTER INSERT ON t1 BEGIN; + ** INSERT OR REPLACE INTO t2 VALUES(new.a, new.b); + ** END; + ** + ** INSERT INTO t1 ... ; -- insert into t2 uses REPLACE policy + ** INSERT OR IGNORE INTO t1 ... ; -- insert into t2 uses IGNORE policy + */ + pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf; + assert( pParse->okConstFactor==0 ); + +#ifndef SQLITE_OMIT_TRACE + if( pStep->zSpan ){ + sqlite3VdbeAddOp4(v, OP_Trace, 0x7fffffff, 1, 0, + sqlite3MPrintf(db, "-- %s", pStep->zSpan), + P4_DYNAMIC); + } +#endif + + switch( pStep->op ){ + case TK_UPDATE: { + sqlite3Update(pParse, + targetSrcList(pParse, pStep), + sqlite3ExprListDup(db, pStep->pExprList, 0), + sqlite3ExprDup(db, pStep->pWhere, 0), + pParse->eOrconf, 0, 0, 0 + ); + break; + } + case TK_INSERT: { + sqlite3Insert(pParse, + targetSrcList(pParse, pStep), + sqlite3SelectDup(db, pStep->pSelect, 0), + sqlite3IdListDup(db, pStep->pIdList), + pParse->eOrconf, + sqlite3UpsertDup(db, pStep->pUpsert) + ); + break; + } + case TK_DELETE: { + sqlite3DeleteFrom(pParse, + targetSrcList(pParse, pStep), + sqlite3ExprDup(db, pStep->pWhere, 0), 0, 0 + ); + break; + } + default: assert( pStep->op==TK_SELECT ); { + SelectDest sDest; + Select *pSelect = sqlite3SelectDup(db, pStep->pSelect, 0); + sqlite3SelectDestInit(&sDest, SRT_Discard, 0); + sqlite3Select(pParse, pSelect, &sDest); + sqlite3SelectDelete(db, pSelect); + break; + } + } + if( pStep->op!=TK_SELECT ){ + sqlite3VdbeAddOp0(v, OP_ResetCount); + } + } + + return 0; +} + +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +/* +** This function is used to add VdbeComment() annotations to a VDBE +** program. It is not used in production code, only for debugging. +*/ +static const char *onErrorText(int onError){ + switch( onError ){ + case OE_Abort: return "abort"; + case OE_Rollback: return "rollback"; + case OE_Fail: return "fail"; + case OE_Replace: return "replace"; + case OE_Ignore: return "ignore"; + case OE_Default: return "default"; + } + return "n/a"; +} +#endif + +/* +** Parse context structure pFrom has just been used to create a sub-vdbe +** (trigger program). If an error has occurred, transfer error information +** from pFrom to pTo. +*/ +static void transferParseError(Parse *pTo, Parse *pFrom){ + assert( pFrom->zErrMsg==0 || pFrom->nErr ); + assert( pTo->zErrMsg==0 || pTo->nErr ); + if( pTo->nErr==0 ){ + pTo->zErrMsg = pFrom->zErrMsg; + pTo->nErr = pFrom->nErr; + pTo->rc = pFrom->rc; + }else{ + sqlite3DbFree(pFrom->db, pFrom->zErrMsg); + } +} + +/* +** Create and populate a new TriggerPrg object with a sub-program +** implementing trigger pTrigger with ON CONFLICT policy orconf. +*/ +static TriggerPrg *codeRowTrigger( + Parse *pParse, /* Current parse context */ + Trigger *pTrigger, /* Trigger to code */ + Table *pTab, /* The table pTrigger is attached to */ + int orconf /* ON CONFLICT policy to code trigger program with */ +){ + Parse *pTop = sqlite3ParseToplevel(pParse); + sqlite3 *db = pParse->db; /* Database handle */ + TriggerPrg *pPrg; /* Value to return */ + Expr *pWhen = 0; /* Duplicate of trigger WHEN expression */ + Vdbe *v; /* Temporary VM */ + NameContext sNC; /* Name context for sub-vdbe */ + SubProgram *pProgram = 0; /* Sub-vdbe for trigger program */ + Parse *pSubParse; /* Parse context for sub-vdbe */ + int iEndTrigger = 0; /* Label to jump to if WHEN is false */ + + assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) ); + assert( pTop->pVdbe ); + + /* Allocate the TriggerPrg and SubProgram objects. To ensure that they + ** are freed if an error occurs, link them into the Parse.pTriggerPrg + ** list of the top-level Parse object sooner rather than later. */ + pPrg = sqlite3DbMallocZero(db, sizeof(TriggerPrg)); + if( !pPrg ) return 0; + pPrg->pNext = pTop->pTriggerPrg; + pTop->pTriggerPrg = pPrg; + pPrg->pProgram = pProgram = sqlite3DbMallocZero(db, sizeof(SubProgram)); + if( !pProgram ) return 0; + sqlite3VdbeLinkSubProgram(pTop->pVdbe, pProgram); + pPrg->pTrigger = pTrigger; + pPrg->orconf = orconf; + pPrg->aColmask[0] = 0xffffffff; + pPrg->aColmask[1] = 0xffffffff; + + /* Allocate and populate a new Parse context to use for coding the + ** trigger sub-program. */ + pSubParse = sqlite3StackAllocZero(db, sizeof(Parse)); + if( !pSubParse ) return 0; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pSubParse; + pSubParse->db = db; + pSubParse->pTriggerTab = pTab; + pSubParse->pToplevel = pTop; + pSubParse->zAuthContext = pTrigger->zName; + pSubParse->eTriggerOp = pTrigger->op; + pSubParse->nQueryLoop = pParse->nQueryLoop; + pSubParse->disableVtab = pParse->disableVtab; + + v = sqlite3GetVdbe(pSubParse); + if( v ){ + VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)", + pTrigger->zName, onErrorText(orconf), + (pTrigger->tr_tm==TRIGGER_BEFORE ? "BEFORE" : "AFTER"), + (pTrigger->op==TK_UPDATE ? "UPDATE" : ""), + (pTrigger->op==TK_INSERT ? "INSERT" : ""), + (pTrigger->op==TK_DELETE ? "DELETE" : ""), + pTab->zName + )); +#ifndef SQLITE_OMIT_TRACE + if( pTrigger->zName ){ + sqlite3VdbeChangeP4(v, -1, + sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC + ); + } +#endif + + /* If one was specified, code the WHEN clause. If it evaluates to false + ** (or NULL) the sub-vdbe is immediately halted by jumping to the + ** OP_Halt inserted at the end of the program. */ + if( pTrigger->pWhen ){ + pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0); + if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) + && db->mallocFailed==0 + ){ + iEndTrigger = sqlite3VdbeMakeLabel(pSubParse); + sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); + } + sqlite3ExprDelete(db, pWhen); + } + + /* Code the trigger program into the sub-vdbe. */ + codeTriggerProgram(pSubParse, pTrigger->step_list, orconf); + + /* Insert an OP_Halt at the end of the sub-program. */ + if( iEndTrigger ){ + sqlite3VdbeResolveLabel(v, iEndTrigger); + } + sqlite3VdbeAddOp0(v, OP_Halt); + VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf))); + + transferParseError(pParse, pSubParse); + if( db->mallocFailed==0 && pParse->nErr==0 ){ + pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg); + } + pProgram->nMem = pSubParse->nMem; + pProgram->nCsr = pSubParse->nTab; + pProgram->token = (void *)pTrigger; + pPrg->aColmask[0] = pSubParse->oldmask; + pPrg->aColmask[1] = pSubParse->newmask; + sqlite3VdbeDelete(v); + } + + assert( !pSubParse->pAinc && !pSubParse->pZombieTab ); + assert( !pSubParse->pTriggerPrg && !pSubParse->nMaxArg ); + sqlite3ParserReset(pSubParse); + sqlite3StackFree(db, pSubParse); + + return pPrg; +} + +/* +** Return a pointer to a TriggerPrg object containing the sub-program for +** trigger pTrigger with default ON CONFLICT algorithm orconf. If no such +** TriggerPrg object exists, a new object is allocated and populated before +** being returned. +*/ +static TriggerPrg *getRowTrigger( + Parse *pParse, /* Current parse context */ + Trigger *pTrigger, /* Trigger to code */ + Table *pTab, /* The table trigger pTrigger is attached to */ + int orconf /* ON CONFLICT algorithm. */ +){ + Parse *pRoot = sqlite3ParseToplevel(pParse); + TriggerPrg *pPrg; + + assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) ); + + /* It may be that this trigger has already been coded (or is in the + ** process of being coded). If this is the case, then an entry with + ** a matching TriggerPrg.pTrigger field will be present somewhere + ** in the Parse.pTriggerPrg list. Search for such an entry. */ + for(pPrg=pRoot->pTriggerPrg; + pPrg && (pPrg->pTrigger!=pTrigger || pPrg->orconf!=orconf); + pPrg=pPrg->pNext + ); + + /* If an existing TriggerPrg could not be located, create a new one. */ + if( !pPrg ){ + pPrg = codeRowTrigger(pParse, pTrigger, pTab, orconf); + } + + return pPrg; +} + +/* +** Generate code for the trigger program associated with trigger p on +** table pTab. The reg, orconf and ignoreJump parameters passed to this +** function are the same as those described in the header function for +** sqlite3CodeRowTrigger() +*/ +SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect( + Parse *pParse, /* Parse context */ + Trigger *p, /* Trigger to code */ + Table *pTab, /* The table to code triggers from */ + int reg, /* Reg array containing OLD.* and NEW.* values */ + int orconf, /* ON CONFLICT policy */ + int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */ +){ + Vdbe *v = sqlite3GetVdbe(pParse); /* Main VM */ + TriggerPrg *pPrg; + pPrg = getRowTrigger(pParse, p, pTab, orconf); + assert( pPrg || pParse->nErr || pParse->db->mallocFailed ); + + /* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program + ** is a pointer to the sub-vdbe containing the trigger program. */ + if( pPrg ){ + int bRecursive = (p->zName && 0==(pParse->db->flags&SQLITE_RecTriggers)); + + sqlite3VdbeAddOp4(v, OP_Program, reg, ignoreJump, ++pParse->nMem, + (const char *)pPrg->pProgram, P4_SUBPROGRAM); + VdbeComment( + (v, "Call: %s.%s", (p->zName?p->zName:"fkey"), onErrorText(orconf))); + + /* Set the P5 operand of the OP_Program instruction to non-zero if + ** recursive invocation of this trigger program is disallowed. Recursive + ** invocation is disallowed if (a) the sub-program is really a trigger, + ** not a foreign key action, and (b) the flag to enable recursive triggers + ** is clear. */ + sqlite3VdbeChangeP5(v, (u8)bRecursive); + } +} + +/* +** This is called to code the required FOR EACH ROW triggers for an operation +** on table pTab. The operation to code triggers for (INSERT, UPDATE or DELETE) +** is given by the op parameter. The tr_tm parameter determines whether the +** BEFORE or AFTER triggers are coded. If the operation is an UPDATE, then +** parameter pChanges is passed the list of columns being modified. +** +** If there are no triggers that fire at the specified time for the specified +** operation on pTab, this function is a no-op. +** +** The reg argument is the address of the first in an array of registers +** that contain the values substituted for the new.* and old.* references +** in the trigger program. If N is the number of columns in table pTab +** (a copy of pTab->nCol), then registers are populated as follows: +** +** Register Contains +** ------------------------------------------------------ +** reg+0 OLD.rowid +** reg+1 OLD.* value of left-most column of pTab +** ... ... +** reg+N OLD.* value of right-most column of pTab +** reg+N+1 NEW.rowid +** reg+N+2 OLD.* value of left-most column of pTab +** ... ... +** reg+N+N+1 NEW.* value of right-most column of pTab +** +** For ON DELETE triggers, the registers containing the NEW.* values will +** never be accessed by the trigger program, so they are not allocated or +** populated by the caller (there is no data to populate them with anyway). +** Similarly, for ON INSERT triggers the values stored in the OLD.* registers +** are never accessed, and so are not allocated by the caller. So, for an +** ON INSERT trigger, the value passed to this function as parameter reg +** is not a readable register, although registers (reg+N) through +** (reg+N+N+1) are. +** +** Parameter orconf is the default conflict resolution algorithm for the +** trigger program to use (REPLACE, IGNORE etc.). Parameter ignoreJump +** is the instruction that control should jump to if a trigger program +** raises an IGNORE exception. +*/ +SQLITE_PRIVATE void sqlite3CodeRowTrigger( + Parse *pParse, /* Parse context */ + Trigger *pTrigger, /* List of triggers on table pTab */ + int op, /* One of TK_UPDATE, TK_INSERT, TK_DELETE */ + ExprList *pChanges, /* Changes list for any UPDATE OF triggers */ + int tr_tm, /* One of TRIGGER_BEFORE, TRIGGER_AFTER */ + Table *pTab, /* The table to code triggers from */ + int reg, /* The first in an array of registers (see above) */ + int orconf, /* ON CONFLICT policy */ + int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */ +){ + Trigger *p; /* Used to iterate through pTrigger list */ + + assert( op==TK_UPDATE || op==TK_INSERT || op==TK_DELETE ); + assert( tr_tm==TRIGGER_BEFORE || tr_tm==TRIGGER_AFTER ); + assert( (op==TK_UPDATE)==(pChanges!=0) ); + + for(p=pTrigger; p; p=p->pNext){ + + /* Sanity checking: The schema for the trigger and for the table are + ** always defined. The trigger must be in the same schema as the table + ** or else it must be a TEMP trigger. */ + assert( p->pSchema!=0 ); + assert( p->pTabSchema!=0 ); + assert( p->pSchema==p->pTabSchema + || p->pSchema==pParse->db->aDb[1].pSchema ); + + /* Determine whether we should code this trigger */ + if( p->op==op + && p->tr_tm==tr_tm + && checkColumnOverlap(p->pColumns, pChanges) + ){ + sqlite3CodeRowTriggerDirect(pParse, p, pTab, reg, orconf, ignoreJump); + } + } +} + +/* +** Triggers may access values stored in the old.* or new.* pseudo-table. +** This function returns a 32-bit bitmask indicating which columns of the +** old.* or new.* tables actually are used by triggers. This information +** may be used by the caller, for example, to avoid having to load the entire +** old.* record into memory when executing an UPDATE or DELETE command. +** +** Bit 0 of the returned mask is set if the left-most column of the +** table may be accessed using an [old|new].reference. Bit 1 is set if +** the second leftmost column value is required, and so on. If there +** are more than 32 columns in the table, and at least one of the columns +** with an index greater than 32 may be accessed, 0xffffffff is returned. +** +** It is not possible to determine if the old.rowid or new.rowid column is +** accessed by triggers. The caller must always assume that it is. +** +** Parameter isNew must be either 1 or 0. If it is 0, then the mask returned +** applies to the old.* table. If 1, the new.* table. +** +** Parameter tr_tm must be a mask with one or both of the TRIGGER_BEFORE +** and TRIGGER_AFTER bits set. Values accessed by BEFORE triggers are only +** included in the returned mask if the TRIGGER_BEFORE bit is set in the +** tr_tm parameter. Similarly, values accessed by AFTER triggers are only +** included in the returned mask if the TRIGGER_AFTER bit is set in tr_tm. +*/ +SQLITE_PRIVATE u32 sqlite3TriggerColmask( + Parse *pParse, /* Parse context */ + Trigger *pTrigger, /* List of triggers on table pTab */ + ExprList *pChanges, /* Changes list for any UPDATE OF triggers */ + int isNew, /* 1 for new.* ref mask, 0 for old.* ref mask */ + int tr_tm, /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ + Table *pTab, /* The table to code triggers from */ + int orconf /* Default ON CONFLICT policy for trigger steps */ +){ + const int op = pChanges ? TK_UPDATE : TK_DELETE; + u32 mask = 0; + Trigger *p; + + assert( isNew==1 || isNew==0 ); + for(p=pTrigger; p; p=p->pNext){ + if( p->op==op && (tr_tm&p->tr_tm) + && checkColumnOverlap(p->pColumns,pChanges) + ){ + TriggerPrg *pPrg; + pPrg = getRowTrigger(pParse, p, pTab, orconf); + if( pPrg ){ + mask |= pPrg->aColmask[isNew]; + } + } + } + + return mask; +} + +#endif /* !defined(SQLITE_OMIT_TRIGGER) */ + +/************** End of trigger.c *********************************************/ +/************** Begin file update.c ******************************************/ +/* +** 2001 September 15 +** +** 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 C code routines that are called by the parser +** to handle UPDATE statements. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Forward declaration */ +static void updateVirtualTable( + Parse *pParse, /* The parsing context */ + SrcList *pSrc, /* The virtual table to be modified */ + Table *pTab, /* The virtual table */ + ExprList *pChanges, /* The columns to change in the UPDATE statement */ + Expr *pRowidExpr, /* Expression used to recompute the rowid */ + int *aXRef, /* Mapping from columns of pTab to entries in pChanges */ + Expr *pWhere, /* WHERE clause of the UPDATE statement */ + int onError /* ON CONFLICT strategy */ +); +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/* +** The most recently coded instruction was an OP_Column to retrieve the +** i-th column of table pTab. This routine sets the P4 parameter of the +** OP_Column to the default value, if any. +** +** The default value of a column is specified by a DEFAULT clause in the +** column definition. This was either supplied by the user when the table +** was created, or added later to the table definition by an ALTER TABLE +** command. If the latter, then the row-records in the table btree on disk +** may not contain a value for the column and the default value, taken +** from the P4 parameter of the OP_Column instruction, is returned instead. +** If the former, then all row-records are guaranteed to include a value +** for the column and the P4 value is not required. +** +** Column definitions created by an ALTER TABLE command may only have +** literal default values specified: a number, null or a string. (If a more +** complicated default expression value was provided, it is evaluated +** when the ALTER TABLE is executed and one of the literal values written +** into the sqlite_master table.) +** +** Therefore, the P4 parameter is only required if the default value for +** the column is a literal number, string or null. The sqlite3ValueFromExpr() +** function is capable of transforming these types of expressions into +** sqlite3_value objects. +** +** If column as REAL affinity and the table is an ordinary b-tree table +** (not a virtual table) then the value might have been stored as an +** integer. In that case, add an OP_RealAffinity opcode to make sure +** it has been converted into REAL. +*/ +SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ + assert( pTab!=0 ); + if( !pTab->pSelect ){ + sqlite3_value *pValue = 0; + u8 enc = ENC(sqlite3VdbeDb(v)); + Column *pCol = &pTab->aCol[i]; + VdbeComment((v, "%s.%s", pTab->zName, pCol->zName)); + assert( inCol ); + sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc, + pCol->affinity, &pValue); + if( pValue ){ + sqlite3VdbeAppendP4(v, pValue, P4_MEM); + } + } +#ifndef SQLITE_OMIT_FLOATING_POINT + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL && !IsVirtual(pTab) ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); + } +#endif +} + +/* +** Check to see if column iCol of index pIdx references any of the +** columns defined by aXRef and chngRowid. Return true if it does +** and false if not. This is an optimization. False-positives are a +** performance degradation, but false-negatives can result in a corrupt +** index and incorrect answers. +** +** aXRef[j] will be non-negative if column j of the original table is +** being updated. chngRowid will be true if the rowid of the table is +** being updated. +*/ +static int indexColumnIsBeingUpdated( + Index *pIdx, /* The index to check */ + int iCol, /* Which column of the index to check */ + int *aXRef, /* aXRef[j]>=0 if column j is being updated */ + int chngRowid /* true if the rowid is being updated */ +){ + i16 iIdxCol = pIdx->aiColumn[iCol]; + assert( iIdxCol!=XN_ROWID ); /* Cannot index rowid */ + if( iIdxCol>=0 ){ + return aXRef[iIdxCol]>=0; + } + assert( iIdxCol==XN_EXPR ); + assert( pIdx->aColExpr!=0 ); + assert( pIdx->aColExpr->a[iCol].pExpr!=0 ); + return sqlite3ExprReferencesUpdatedColumn(pIdx->aColExpr->a[iCol].pExpr, + aXRef,chngRowid); +} + +/* +** Check to see if index pIdx is a partial index whose conditional +** expression might change values due to an UPDATE. Return true if +** the index is subject to change and false if the index is guaranteed +** to be unchanged. This is an optimization. False-positives are a +** performance degradation, but false-negatives can result in a corrupt +** index and incorrect answers. +** +** aXRef[j] will be non-negative if column j of the original table is +** being updated. chngRowid will be true if the rowid of the table is +** being updated. +*/ +static int indexWhereClauseMightChange( + Index *pIdx, /* The index to check */ + int *aXRef, /* aXRef[j]>=0 if column j is being updated */ + int chngRowid /* true if the rowid is being updated */ +){ + if( pIdx->pPartIdxWhere==0 ) return 0; + return sqlite3ExprReferencesUpdatedColumn(pIdx->pPartIdxWhere, + aXRef, chngRowid); +} + +/* +** Process an UPDATE statement. +** +** UPDATE OR IGNORE table_wxyz SET a=b, c=d WHERE e<5 AND f NOT NULL; +** \_______/ \________/ \______/ \________________/ +* onError pTabList pChanges pWhere +*/ +SQLITE_PRIVATE void sqlite3Update( + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* The table in which we should change things */ + ExprList *pChanges, /* Things to be changed */ + Expr *pWhere, /* The WHERE clause. May be null */ + int onError, /* How to handle constraint errors */ + ExprList *pOrderBy, /* ORDER BY clause. May be null */ + Expr *pLimit, /* LIMIT clause. May be null */ + Upsert *pUpsert /* ON CONFLICT clause, or null */ +){ + int i, j, k; /* Loop counters */ + Table *pTab; /* The table to be updated */ + int addrTop = 0; /* VDBE instruction address of the start of the loop */ + WhereInfo *pWInfo; /* Information about the WHERE clause */ + Vdbe *v; /* The virtual database engine */ + Index *pIdx; /* For looping over indices */ + Index *pPk; /* The PRIMARY KEY index for WITHOUT ROWID tables */ + int nIdx; /* Number of indices that need updating */ + int nAllIdx; /* Total number of indexes */ + int iBaseCur; /* Base cursor number */ + int iDataCur; /* Cursor for the canonical data btree */ + int iIdxCur; /* Cursor for the first index */ + sqlite3 *db; /* The database structure */ + int *aRegIdx = 0; /* Registers for to each index and the main table */ + int *aXRef = 0; /* aXRef[i] is the index in pChanges->a[] of the + ** an expression for the i-th column of the table. + ** aXRef[i]==-1 if the i-th column is not changed. */ + u8 *aToOpen; /* 1 for tables and indices to be opened */ + u8 chngPk; /* PRIMARY KEY changed in a WITHOUT ROWID table */ + u8 chngRowid; /* Rowid changed in a normal table */ + u8 chngKey; /* Either chngPk or chngRowid */ + Expr *pRowidExpr = 0; /* Expression defining the new record number */ + AuthContext sContext; /* The authorization context */ + NameContext sNC; /* The name-context to resolve expressions in */ + int iDb; /* Database containing the table being updated */ + int eOnePass; /* ONEPASS_XXX value from where.c */ + int hasFK; /* True if foreign key processing is required */ + int labelBreak; /* Jump here to break out of UPDATE loop */ + int labelContinue; /* Jump here to continue next step of UPDATE loop */ + int flags; /* Flags for sqlite3WhereBegin() */ + +#ifndef SQLITE_OMIT_TRIGGER + int isView; /* True when updating a view (INSTEAD OF trigger) */ + Trigger *pTrigger; /* List of triggers on pTab, if required */ + int tmask; /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ +#endif + int newmask; /* Mask of NEW.* columns accessed by BEFORE triggers */ + int iEph = 0; /* Ephemeral table holding all primary key values */ + int nKey = 0; /* Number of elements in regKey for WITHOUT ROWID */ + int aiCurOnePass[2]; /* The write cursors opened by WHERE_ONEPASS */ + int addrOpen = 0; /* Address of OP_OpenEphemeral */ + int iPk = 0; /* First of nPk cells holding PRIMARY KEY value */ + i16 nPk = 0; /* Number of components of the PRIMARY KEY */ + int bReplace = 0; /* True if REPLACE conflict resolution might happen */ + int bFinishSeek = 1; /* The OP_FinishSeek opcode is needed */ + + /* Register Allocations */ + int regRowCount = 0; /* A count of rows changed */ + int regOldRowid = 0; /* The old rowid */ + int regNewRowid = 0; /* The new rowid */ + int regNew = 0; /* Content of the NEW.* table in triggers */ + int regOld = 0; /* Content of OLD.* table in triggers */ + int regRowSet = 0; /* Rowset of rows to be updated */ + int regKey = 0; /* composite PRIMARY KEY value */ + + memset(&sContext, 0, sizeof(sContext)); + db = pParse->db; + if( pParse->nErr || db->mallocFailed ){ + goto update_cleanup; + } + assert( pTabList->nSrc==1 ); + + /* Locate the table which we want to update. + */ + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ) goto update_cleanup; + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + + /* Figure out if we have any triggers and if the table being + ** updated is a view. + */ +#ifndef SQLITE_OMIT_TRIGGER + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, &tmask); + isView = pTab->pSelect!=0; + assert( pTrigger || tmask==0 ); +#else +# define pTrigger 0 +# define isView 0 +# define tmask 0 +#endif +#ifdef SQLITE_OMIT_VIEW +# undef isView +# define isView 0 +#endif + +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( !isView ){ + pWhere = sqlite3LimitWhere( + pParse, pTabList, pWhere, pOrderBy, pLimit, "UPDATE" + ); + pOrderBy = 0; + pLimit = 0; + } +#endif + + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto update_cleanup; + } + if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ + goto update_cleanup; + } + + /* Allocate a cursors for the main database table and for all indices. + ** The index cursors might not be used, but if they are used they + ** need to occur right after the database cursor. So go ahead and + ** allocate enough space, just in case. + */ + iBaseCur = iDataCur = pParse->nTab++; + iIdxCur = iDataCur+1; + pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); + testcase( pPk!=0 && pPk!=pTab->pIndex ); + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ + if( pPk==pIdx ){ + iDataCur = pParse->nTab; + } + pParse->nTab++; + } + if( pUpsert ){ + /* On an UPSERT, reuse the same cursors already opened by INSERT */ + iDataCur = pUpsert->iDataCur; + iIdxCur = pUpsert->iIdxCur; + pParse->nTab = iBaseCur; + } + pTabList->a[0].iCursor = iDataCur; + + /* Allocate space for aXRef[], aRegIdx[], and aToOpen[]. + ** Initialize aXRef[] and aToOpen[] to their default values. + */ + aXRef = sqlite3DbMallocRawNN(db, sizeof(int) * (pTab->nCol+nIdx+1) + nIdx+2 ); + if( aXRef==0 ) goto update_cleanup; + aRegIdx = aXRef+pTab->nCol; + aToOpen = (u8*)(aRegIdx+nIdx+1); + memset(aToOpen, 1, nIdx+1); + aToOpen[nIdx+1] = 0; + for(i=0; inCol; i++) aXRef[i] = -1; + + /* Initialize the name-context */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + sNC.uNC.pUpsert = pUpsert; + sNC.ncFlags = NC_UUpsert; + + /* Begin generating code. */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto update_cleanup; + + /* Resolve the column names in all the expressions of the + ** of the UPDATE statement. Also find the column index + ** for each column to be updated in the pChanges array. For each + ** column to be updated, make sure we have authorization to change + ** that column. + */ + chngRowid = chngPk = 0; + for(i=0; inExpr; i++){ + if( sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){ + goto update_cleanup; + } + for(j=0; jnCol; j++){ + if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zEName)==0 ){ + if( j==pTab->iPKey ){ + chngRowid = 1; + pRowidExpr = pChanges->a[i].pExpr; + }else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){ + chngPk = 1; + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + else if( pTab->aCol[j].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[j].colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, + "cannot UPDATE generated column \"%s\"", + pTab->aCol[j].zName); + goto update_cleanup; + } +#endif + aXRef[j] = i; + break; + } + } + if( j>=pTab->nCol ){ + if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zEName) ){ + j = -1; + chngRowid = 1; + pRowidExpr = pChanges->a[i].pExpr; + }else{ + sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zEName); + pParse->checkSchema = 1; + goto update_cleanup; + } + } +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int rc; + rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName, + j<0 ? "ROWID" : pTab->aCol[j].zName, + db->aDb[iDb].zDbSName); + if( rc==SQLITE_DENY ){ + goto update_cleanup; + }else if( rc==SQLITE_IGNORE ){ + aXRef[j] = -1; + } + } +#endif + } + assert( (chngRowid & chngPk)==0 ); + assert( chngRowid==0 || chngRowid==1 ); + assert( chngPk==0 || chngPk==1 ); + chngKey = chngRowid + chngPk; + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Mark generated columns as changing if their generator expressions + ** reference any changing column. The actual aXRef[] value for + ** generated expressions is not used, other than to check to see that it + ** is non-negative, so the value of aXRef[] for generated columns can be + ** set to any non-negative number. We use 99999 so that the value is + ** obvious when looking at aXRef[] in a symbolic debugger. + */ + if( pTab->tabFlags & TF_HasGenerated ){ + int bProgress; + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + do{ + bProgress = 0; + for(i=0; inCol; i++){ + if( aXRef[i]>=0 ) continue; + if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ) continue; + if( sqlite3ExprReferencesUpdatedColumn(pTab->aCol[i].pDflt, + aXRef, chngRowid) ){ + aXRef[i] = 99999; + bProgress = 1; + } + } + }while( bProgress ); + } +#endif + + /* The SET expressions are not actually used inside the WHERE loop. + ** So reset the colUsed mask. Unless this is a virtual table. In that + ** case, set all bits of the colUsed mask (to ensure that the virtual + ** table implementation makes all columns available). + */ + pTabList->a[0].colUsed = IsVirtual(pTab) ? ALLBITS : 0; + + hasFK = sqlite3FkRequired(pParse, pTab, aXRef, chngKey); + + /* There is one entry in the aRegIdx[] array for each index on the table + ** being updated. Fill in aRegIdx[] with a register number that will hold + ** the key for accessing each index. + */ + if( onError==OE_Replace ) bReplace = 1; + for(nAllIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nAllIdx++){ + int reg; + if( chngKey || hasFK>1 || pIdx==pPk + || indexWhereClauseMightChange(pIdx,aXRef,chngRowid) + ){ + reg = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; + }else{ + reg = 0; + for(i=0; inKeyCol; i++){ + if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){ + reg = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; + if( onError==OE_Default && pIdx->onError==OE_Replace ){ + bReplace = 1; + } + break; + } + } + } + if( reg==0 ) aToOpen[nAllIdx+1] = 0; + aRegIdx[nAllIdx] = reg; + } + aRegIdx[nAllIdx] = ++pParse->nMem; /* Register storing the table record */ + if( bReplace ){ + /* If REPLACE conflict resolution might be invoked, open cursors on all + ** indexes in case they are needed to delete records. */ + memset(aToOpen, 1, nIdx+1); + } + + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, pTrigger || hasFK, iDb); + + /* Allocate required registers. */ + if( !IsVirtual(pTab) ){ + /* For now, regRowSet and aRegIdx[nAllIdx] share the same register. + ** If regRowSet turns out to be needed, then aRegIdx[nAllIdx] will be + ** reallocated. aRegIdx[nAllIdx] is the register in which the main + ** table record is written. regRowSet holds the RowSet for the + ** two-pass update algorithm. */ + assert( aRegIdx[nAllIdx]==pParse->nMem ); + regRowSet = aRegIdx[nAllIdx]; + regOldRowid = regNewRowid = ++pParse->nMem; + if( chngPk || pTrigger || hasFK ){ + regOld = pParse->nMem + 1; + pParse->nMem += pTab->nCol; + } + if( chngKey || pTrigger || hasFK ){ + regNewRowid = ++pParse->nMem; + } + regNew = pParse->nMem + 1; + pParse->nMem += pTab->nCol; + } + + /* Start the view context. */ + if( isView ){ + sqlite3AuthContextPush(pParse, &sContext, pTab->zName); + } + + /* If we are trying to update a view, realize that view into + ** an ephemeral table. + */ +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) + if( isView ){ + sqlite3MaterializeView(pParse, pTab, + pWhere, pOrderBy, pLimit, iDataCur + ); + pOrderBy = 0; + pLimit = 0; + } +#endif + + /* Resolve the column names in all the expressions in the + ** WHERE clause. + */ + if( sqlite3ResolveExprNames(&sNC, pWhere) ){ + goto update_cleanup; + } + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Virtual tables must be handled separately */ + if( IsVirtual(pTab) ){ + updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef, + pWhere, onError); + goto update_cleanup; + } +#endif + + /* Jump to labelBreak to abandon further processing of this UPDATE */ + labelContinue = labelBreak = sqlite3VdbeMakeLabel(pParse); + + /* Not an UPSERT. Normal processing. Begin by + ** initialize the count of updated rows */ + if( (db->flags&SQLITE_CountRows)!=0 + && !pParse->pTriggerTab + && !pParse->nested + && pUpsert==0 + ){ + regRowCount = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); + } + + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid); + }else{ + assert( pPk!=0 ); + nPk = pPk->nKeyCol; + iPk = pParse->nMem+1; + pParse->nMem += nPk; + regKey = ++pParse->nMem; + if( pUpsert==0 ){ + iEph = pParse->nTab++; + sqlite3VdbeAddOp3(v, OP_Null, 0, iPk, iPk+nPk-1); + addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + } + + if( pUpsert ){ + /* If this is an UPSERT, then all cursors have already been opened by + ** the outer INSERT and the data cursor should be pointing at the row + ** that is to be updated. So bypass the code that searches for the + ** row(s) to be updated. + */ + pWInfo = 0; + eOnePass = ONEPASS_SINGLE; + sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL); + bFinishSeek = 0; + }else{ + /* Begin the database scan. + ** + ** Do not consider a single-pass strategy for a multi-row update if + ** there are any triggers or foreign keys to process, or rows may + ** be deleted as a result of REPLACE conflict handling. Any of these + ** things might disturb a cursor being used to scan through the table + ** or index, causing a single-pass approach to malfunction. */ + flags = WHERE_ONEPASS_DESIRED|WHERE_SEEK_UNIQ_TABLE; + if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){ + flags |= WHERE_ONEPASS_MULTIROW; + } + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags, iIdxCur); + if( pWInfo==0 ) goto update_cleanup; + + /* A one-pass strategy that might update more than one row may not + ** be used if any column of the index used for the scan is being + ** updated. Otherwise, if there is an index on "b", statements like + ** the following could create an infinite loop: + ** + ** UPDATE t1 SET b=b+1 WHERE b>? + ** + ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI + ** strategy that uses an index for which one or more columns are being + ** updated. */ + eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + bFinishSeek = sqlite3WhereUsesDeferredSeek(pWInfo); + if( eOnePass!=ONEPASS_SINGLE ){ + sqlite3MultiWrite(pParse); + if( eOnePass==ONEPASS_MULTI ){ + int iCur = aiCurOnePass[1]; + if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){ + eOnePass = ONEPASS_OFF; + } + assert( iCur!=iDataCur || !HasRowid(pTab) ); + } + } + } + + if( HasRowid(pTab) ){ + /* Read the rowid of the current row of the WHERE scan. In ONEPASS_OFF + ** mode, write the rowid into the FIFO. In either of the one-pass modes, + ** leave it in register regOldRowid. */ + sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regOldRowid); + if( eOnePass==ONEPASS_OFF ){ + /* We need to use regRowSet, so reallocate aRegIdx[nAllIdx] */ + aRegIdx[nAllIdx] = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid); + } + }else{ + /* Read the PK of the current row into an array of registers. In + ** ONEPASS_OFF mode, serialize the array into a record and store it in + ** the ephemeral table. Or, in ONEPASS_SINGLE or MULTI mode, change + ** the OP_OpenEphemeral instruction to a Noop (the ephemeral table + ** is not required) and leave the PK fields in the array of registers. */ + for(i=0; iaiColumn[i]>=0 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, + pPk->aiColumn[i], iPk+i); + } + if( eOnePass ){ + if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen); + nKey = nPk; + regKey = iPk; + }else{ + sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey, + sqlite3IndexAffinityStr(db, pPk), nPk); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEph, regKey, iPk, nPk); + } + } + + if( pUpsert==0 ){ + if( eOnePass!=ONEPASS_MULTI ){ + sqlite3WhereEnd(pWInfo); + } + + if( !isView ){ + int addrOnce = 0; + + /* Open every index that needs updating. */ + if( eOnePass!=ONEPASS_OFF ){ + if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0; + if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0; + } + + if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur, + aToOpen, 0, 0); + if( addrOnce ){ + sqlite3VdbeJumpHereOrPopInst(v, addrOnce); + } + } + + /* Top of the update loop */ + if( eOnePass!=ONEPASS_OFF ){ + if( !isView && aiCurOnePass[0]!=iDataCur && aiCurOnePass[1]!=iDataCur ){ + assert( pPk ); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey,nKey); + VdbeCoverage(v); + } + if( eOnePass!=ONEPASS_SINGLE ){ + labelContinue = sqlite3VdbeMakeLabel(pParse); + } + sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); + VdbeCoverageIf(v, pPk==0); + VdbeCoverageIf(v, pPk!=0); + }else if( pPk ){ + labelContinue = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); + addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); + VdbeCoverage(v); + }else{ + labelContinue = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet,labelBreak, + regOldRowid); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid); + VdbeCoverage(v); + } + } + + /* If the rowid value will change, set register regNewRowid to + ** contain the new value. If the rowid is not being modified, + ** then regNewRowid is the same register as regOldRowid, which is + ** already populated. */ + assert( chngKey || pTrigger || hasFK || regOldRowid==regNewRowid ); + if( chngRowid ){ + sqlite3ExprCode(pParse, pRowidExpr, regNewRowid); + sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid); VdbeCoverage(v); + } + + /* Compute the old pre-UPDATE content of the row being changed, if that + ** information is needed */ + if( chngPk || hasFK || pTrigger ){ + u32 oldmask = (hasFK ? sqlite3FkOldmask(pParse, pTab) : 0); + oldmask |= sqlite3TriggerColmask(pParse, + pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError + ); + for(i=0; inCol; i++){ + u32 colFlags = pTab->aCol[i].colFlags; + k = sqlite3TableColumnToStorage(pTab, i) + regOld; + if( oldmask==0xffffffff + || (i<32 && (oldmask & MASKBIT32(i))!=0) + || (colFlags & COLFLAG_PRIMKEY)!=0 + ){ + testcase( oldmask!=0xffffffff && i==31 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, k); + } + } + if( chngRowid==0 && pPk==0 ){ + sqlite3VdbeAddOp2(v, OP_Copy, regOldRowid, regNewRowid); + } + } + + /* Populate the array of registers beginning at regNew with the new + ** row data. This array is used to check constants, create the new + ** table and index records, and as the values for any new.* references + ** made by triggers. + ** + ** If there are one or more BEFORE triggers, then do not populate the + ** registers associated with columns that are (a) not modified by + ** this UPDATE statement and (b) not accessed by new.* references. The + ** values for registers not modified by the UPDATE must be reloaded from + ** the database after the BEFORE triggers are fired anyway (as the trigger + ** may have modified them). So not loading those that are not going to + ** be used eliminates some redundant opcodes. + */ + newmask = sqlite3TriggerColmask( + pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError + ); + for(i=0, k=regNew; inCol; i++, k++){ + if( i==pTab->iPKey ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, k); + }else if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)!=0 ){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; + }else{ + j = aXRef[i]; + if( j>=0 ){ + sqlite3ExprCode(pParse, pChanges->a[j].pExpr, k); + }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask & MASKBIT32(i)) ){ + /* This branch loads the value of a column that will not be changed + ** into a register. This is done if there are no BEFORE triggers, or + ** if there are one or more BEFORE triggers that use this value via + ** a new.* reference in a trigger program. + */ + testcase( i==31 ); + testcase( i==32 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); + bFinishSeek = 0; + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, k); + } + } + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); + } +#endif + + /* Fire any BEFORE UPDATE triggers. This happens before constraints are + ** verified. One could argue that this is wrong. + */ + if( tmask&TRIGGER_BEFORE ){ + sqlite3TableAffinity(v, pTab, regNew); + sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, + TRIGGER_BEFORE, pTab, regOldRowid, onError, labelContinue); + + /* The row-trigger may have deleted the row being updated. In this + ** case, jump to the next row. No updates or AFTER triggers are + ** required. This behavior - what happens when the row being updated + ** is deleted or renamed by a BEFORE trigger - is left undefined in the + ** documentation. + */ + if( pPk ){ + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue,regKey,nKey); + VdbeCoverage(v); + }else{ + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid); + VdbeCoverage(v); + } + + /* After-BEFORE-trigger-reload-loop: + ** If it did not delete it, the BEFORE trigger may still have modified + ** some of the columns of the row being updated. Load the values for + ** all columns not modified by the update statement into their registers + ** in case this has happened. Only unmodified columns are reloaded. + ** The values computed for modified columns use the values before the + ** BEFORE trigger runs. See test case trigger1-18.0 (added 2018-04-26) + ** for an example. + */ + for(i=0, k=regNew; inCol; i++, k++){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; + }else if( aXRef[i]<0 && i!=pTab->iPKey ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); + } + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); + } +#endif + } + + if( !isView ){ + /* Do constraint checks. */ + assert( regOldRowid>0 ); + sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, + regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace, + aXRef, 0); + + /* If REPLACE conflict handling may have been used, or if the PK of the + ** row is changing, then the GenerateConstraintChecks() above may have + ** moved cursor iDataCur. Reseek it. */ + if( bReplace || chngKey ){ + if( pPk ){ + sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey); + }else{ + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); + } + VdbeCoverageNeverTaken(v); + } + + /* Do FK constraint checks. */ + if( hasFK ){ + sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey); + } + + /* Delete the index entries associated with the current record. */ + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1); + + /* We must run the OP_FinishSeek opcode to resolve a prior + ** OP_DeferredSeek if there is any possibility that there have been + ** no OP_Column opcodes since the OP_DeferredSeek was issued. But + ** we want to avoid the OP_FinishSeek if possible, as running it + ** costs CPU cycles. */ + if( bFinishSeek ){ + sqlite3VdbeAddOp1(v, OP_FinishSeek, iDataCur); + } + + /* If changing the rowid value, or if there are foreign key constraints + ** to process, delete the old record. Otherwise, add a noop OP_Delete + ** to invoke the pre-update hook. + ** + ** That (regNew==regnewRowid+1) is true is also important for the + ** pre-update hook. If the caller invokes preupdate_new(), the returned + ** value is copied from memory cell (regNewRowid+1+iCol), where iCol + ** is the column index supplied by the user. + */ + assert( regNew==regNewRowid+1 ); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + sqlite3VdbeAddOp3(v, OP_Delete, iDataCur, + OPFLAG_ISUPDATE | ((hasFK>1 || chngKey) ? 0 : OPFLAG_ISNOOP), + regNewRowid + ); + if( eOnePass==ONEPASS_MULTI ){ + assert( hasFK==0 && chngKey==0 ); + sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION); + } + if( !pParse->nested ){ + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); + } +#else + if( hasFK>1 || chngKey ){ + sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0); + } +#endif + + if( hasFK ){ + sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey); + } + + /* Insert the new index entries and the new record. */ + sqlite3CompleteInsertion( + pParse, pTab, iDataCur, iIdxCur, regNewRowid, aRegIdx, + OPFLAG_ISUPDATE | (eOnePass==ONEPASS_MULTI ? OPFLAG_SAVEPOSITION : 0), + 0, 0 + ); + + /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to + ** handle rows (possibly in other tables) that refer via a foreign key + ** to the row just updated. */ + if( hasFK ){ + sqlite3FkActions(pParse, pTab, pChanges, regOldRowid, aXRef, chngKey); + } + } + + /* Increment the row counter + */ + if( regRowCount ){ + sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); + } + + sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, + TRIGGER_AFTER, pTab, regOldRowid, onError, labelContinue); + + /* Repeat the above with the next record to be updated, until + ** all record selected by the WHERE clause have been updated. + */ + if( eOnePass==ONEPASS_SINGLE ){ + /* Nothing to do at end-of-loop for a single-pass */ + }else if( eOnePass==ONEPASS_MULTI ){ + sqlite3VdbeResolveLabel(v, labelContinue); + sqlite3WhereEnd(pWInfo); + }else if( pPk ){ + sqlite3VdbeResolveLabel(v, labelContinue); + sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); VdbeCoverage(v); + }else{ + sqlite3VdbeGoto(v, labelContinue); + } + sqlite3VdbeResolveLabel(v, labelBreak); + + /* Update the sqlite_sequence table by storing the content of the + ** maximum rowid counter values recorded while inserting into + ** autoincrement tables. + */ + if( pParse->nested==0 && pParse->pTriggerTab==0 && pUpsert==0 ){ + sqlite3AutoincrementEnd(pParse); + } + + /* + ** Return the number of rows that were changed, if we are tracking + ** that information. + */ + if( regRowCount ){ + sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC); + } + +update_cleanup: + sqlite3AuthContextPop(&sContext); + sqlite3DbFree(db, aXRef); /* Also frees aRegIdx[] and aToOpen[] */ + sqlite3SrcListDelete(db, pTabList); + sqlite3ExprListDelete(db, pChanges); + sqlite3ExprDelete(db, pWhere); +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) + sqlite3ExprListDelete(db, pOrderBy); + sqlite3ExprDelete(db, pLimit); +#endif + return; +} +/* Make sure "isView" and other macros defined above are undefined. Otherwise +** they may interfere with compilation of other functions in this file +** (or in another file, if this file becomes part of the amalgamation). */ +#ifdef isView + #undef isView +#endif +#ifdef pTrigger + #undef pTrigger +#endif + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Generate code for an UPDATE of a virtual table. +** +** There are two possible strategies - the default and the special +** "onepass" strategy. Onepass is only used if the virtual table +** implementation indicates that pWhere may match at most one row. +** +** The default strategy is to create an ephemeral table that contains +** for each row to be changed: +** +** (A) The original rowid of that row. +** (B) The revised rowid for the row. +** (C) The content of every column in the row. +** +** Then loop through the contents of this ephemeral table executing a +** VUpdate for each row. When finished, drop the ephemeral table. +** +** The "onepass" strategy does not use an ephemeral table. Instead, it +** stores the same values (A, B and C above) in a register array and +** makes a single invocation of VUpdate. +*/ +static void updateVirtualTable( + Parse *pParse, /* The parsing context */ + SrcList *pSrc, /* The virtual table to be modified */ + Table *pTab, /* The virtual table */ + ExprList *pChanges, /* The columns to change in the UPDATE statement */ + Expr *pRowid, /* Expression used to recompute the rowid */ + int *aXRef, /* Mapping from columns of pTab to entries in pChanges */ + Expr *pWhere, /* WHERE clause of the UPDATE statement */ + int onError /* ON CONFLICT strategy */ +){ + Vdbe *v = pParse->pVdbe; /* Virtual machine under construction */ + int ephemTab; /* Table holding the result of the SELECT */ + int i; /* Loop counter */ + sqlite3 *db = pParse->db; /* Database connection */ + const char *pVTab = (const char*)sqlite3GetVTable(db, pTab); + WhereInfo *pWInfo; + int nArg = 2 + pTab->nCol; /* Number of arguments to VUpdate */ + int regArg; /* First register in VUpdate arg array */ + int regRec; /* Register in which to assemble record */ + int regRowid; /* Register for ephem table rowid */ + int iCsr = pSrc->a[0].iCursor; /* Cursor used for virtual table scan */ + int aDummy[2]; /* Unused arg for sqlite3WhereOkOnePass() */ + int eOnePass; /* True to use onepass strategy */ + int addr; /* Address of OP_OpenEphemeral */ + + /* Allocate nArg registers in which to gather the arguments for VUpdate. Then + ** create and open the ephemeral table in which the records created from + ** these arguments will be temporarily stored. */ + assert( v ); + ephemTab = pParse->nTab++; + addr= sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, nArg); + regArg = pParse->nMem + 1; + pParse->nMem += nArg; + regRec = ++pParse->nMem; + regRowid = ++pParse->nMem; + + /* Start scanning the virtual table */ + pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0,0,WHERE_ONEPASS_DESIRED,0); + if( pWInfo==0 ) return; + + /* Populate the argument registers. */ + for(i=0; inCol; i++){ + assert( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ); + if( aXRef[i]>=0 ){ + sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); + }else{ + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i); + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG);/* Enable sqlite3_vtab_nochange() */ + } + } + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg); + if( pRowid ){ + sqlite3ExprCode(pParse, pRowid, regArg+1); + }else{ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1); + } + }else{ + Index *pPk; /* PRIMARY KEY index */ + i16 iPk; /* PRIMARY KEY column */ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->nKeyCol==1 ); + iPk = pPk->aiColumn[0]; + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, iPk, regArg); + sqlite3VdbeAddOp2(v, OP_SCopy, regArg+2+iPk, regArg+1); + } + + eOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy); + + /* There is no ONEPASS_MULTI on virtual tables */ + assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); + + if( eOnePass ){ + /* If using the onepass strategy, no-op out the OP_OpenEphemeral coded + ** above. */ + sqlite3VdbeChangeToNoop(v, addr); + sqlite3VdbeAddOp1(v, OP_Close, iCsr); + }else{ + /* Create a record from the argument register contents and insert it into + ** the ephemeral table. */ + sqlite3MultiWrite(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec); +#ifdef SQLITE_DEBUG + /* Signal an assert() within OP_MakeRecord that it is allowed to + ** accept no-change records with serial_type 10 */ + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG_MAGIC); +#endif + sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid); + } + + + if( eOnePass==ONEPASS_OFF ){ + /* End the virtual table scan */ + sqlite3WhereEnd(pWInfo); + + /* Begin scannning through the ephemeral table. */ + addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v); + + /* Extract arguments from the current row of the ephemeral table and + ** invoke the VUpdate method. */ + for(i=0; ipUpsertTarget); + sqlite3ExprDelete(db, p->pUpsertTargetWhere); + sqlite3ExprListDelete(db, p->pUpsertSet); + sqlite3ExprDelete(db, p->pUpsertWhere); + sqlite3DbFree(db, p); + } +} + +/* +** Duplicate an Upsert object. +*/ +SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3 *db, Upsert *p){ + if( p==0 ) return 0; + return sqlite3UpsertNew(db, + sqlite3ExprListDup(db, p->pUpsertTarget, 0), + sqlite3ExprDup(db, p->pUpsertTargetWhere, 0), + sqlite3ExprListDup(db, p->pUpsertSet, 0), + sqlite3ExprDup(db, p->pUpsertWhere, 0) + ); +} + +/* +** Create a new Upsert object. +*/ +SQLITE_PRIVATE Upsert *sqlite3UpsertNew( + sqlite3 *db, /* Determines which memory allocator to use */ + ExprList *pTarget, /* Target argument to ON CONFLICT, or NULL */ + Expr *pTargetWhere, /* Optional WHERE clause on the target */ + ExprList *pSet, /* UPDATE columns, or NULL for a DO NOTHING */ + Expr *pWhere /* WHERE clause for the ON CONFLICT UPDATE */ +){ + Upsert *pNew; + pNew = sqlite3DbMallocRaw(db, sizeof(Upsert)); + if( pNew==0 ){ + sqlite3ExprListDelete(db, pTarget); + sqlite3ExprDelete(db, pTargetWhere); + sqlite3ExprListDelete(db, pSet); + sqlite3ExprDelete(db, pWhere); + return 0; + }else{ + pNew->pUpsertTarget = pTarget; + pNew->pUpsertTargetWhere = pTargetWhere; + pNew->pUpsertSet = pSet; + pNew->pUpsertWhere = pWhere; + pNew->pUpsertIdx = 0; + } + return pNew; +} + +/* +** Analyze the ON CONFLICT clause described by pUpsert. Resolve all +** symbols in the conflict-target. +** +** Return SQLITE_OK if everything works, or an error code is something +** is wrong. +*/ +SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( + Parse *pParse, /* The parsing context */ + SrcList *pTabList, /* Table into which we are inserting */ + Upsert *pUpsert /* The ON CONFLICT clauses */ +){ + Table *pTab; /* That table into which we are inserting */ + int rc; /* Result code */ + int iCursor; /* Cursor used by pTab */ + Index *pIdx; /* One of the indexes of pTab */ + ExprList *pTarget; /* The conflict-target clause */ + Expr *pTerm; /* One term of the conflict-target clause */ + NameContext sNC; /* Context for resolving symbolic names */ + Expr sCol[2]; /* Index column converted into an Expr */ + + assert( pTabList->nSrc==1 ); + assert( pTabList->a[0].pTab!=0 ); + assert( pUpsert!=0 ); + assert( pUpsert->pUpsertTarget!=0 ); + + /* Resolve all symbolic names in the conflict-target clause, which + ** includes both the list of columns and the optional partial-index + ** WHERE clause. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget); + if( rc ) return rc; + rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere); + if( rc ) return rc; + + /* Check to see if the conflict target matches the rowid. */ + pTab = pTabList->a[0].pTab; + pTarget = pUpsert->pUpsertTarget; + iCursor = pTabList->a[0].iCursor; + if( HasRowid(pTab) + && pTarget->nExpr==1 + && (pTerm = pTarget->a[0].pExpr)->op==TK_COLUMN + && pTerm->iColumn==XN_ROWID + ){ + /* The conflict-target is the rowid of the primary table */ + assert( pUpsert->pUpsertIdx==0 ); + return SQLITE_OK; + } + + /* Initialize sCol[0..1] to be an expression parse tree for a + ** single column of an index. The sCol[0] node will be the TK_COLLATE + ** operator and sCol[1] will be the TK_COLUMN operator. Code below + ** will populate the specific collation and column number values + ** prior to comparing against the conflict-target expression. + */ + memset(sCol, 0, sizeof(sCol)); + sCol[0].op = TK_COLLATE; + sCol[0].pLeft = &sCol[1]; + sCol[1].op = TK_COLUMN; + sCol[1].iTable = pTabList->a[0].iCursor; + + /* Check for matches against other indexes */ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int ii, jj, nn; + if( !IsUniqueIndex(pIdx) ) continue; + if( pTarget->nExpr!=pIdx->nKeyCol ) continue; + if( pIdx->pPartIdxWhere ){ + if( pUpsert->pUpsertTargetWhere==0 ) continue; + if( sqlite3ExprCompare(pParse, pUpsert->pUpsertTargetWhere, + pIdx->pPartIdxWhere, iCursor)!=0 ){ + continue; + } + } + nn = pIdx->nKeyCol; + for(ii=0; iiazColl[ii]; + if( pIdx->aiColumn[ii]==XN_EXPR ){ + assert( pIdx->aColExpr!=0 ); + assert( pIdx->aColExpr->nExpr>ii ); + pExpr = pIdx->aColExpr->a[ii].pExpr; + if( pExpr->op!=TK_COLLATE ){ + sCol[0].pLeft = pExpr; + pExpr = &sCol[0]; + } + }else{ + sCol[0].pLeft = &sCol[1]; + sCol[1].iColumn = pIdx->aiColumn[ii]; + pExpr = &sCol[0]; + } + for(jj=0; jja[jj].pExpr, pExpr,iCursor)<2 ){ + break; /* Column ii of the index matches column jj of target */ + } + } + if( jj>=nn ){ + /* The target contains no match for column jj of the index */ + break; + } + } + if( iipUpsertIdx = pIdx; + return SQLITE_OK; + } + sqlite3ErrorMsg(pParse, "ON CONFLICT clause does not match any " + "PRIMARY KEY or UNIQUE constraint"); + return SQLITE_ERROR; +} + +/* +** Generate bytecode that does an UPDATE as part of an upsert. +** +** If pIdx is NULL, then the UNIQUE constraint that failed was the IPK. +** In this case parameter iCur is a cursor open on the table b-tree that +** currently points to the conflicting table row. Otherwise, if pIdx +** is not NULL, then pIdx is the constraint that failed and iCur is a +** cursor points to the conflicting row. +*/ +SQLITE_PRIVATE void sqlite3UpsertDoUpdate( + Parse *pParse, /* The parsing and code-generating context */ + Upsert *pUpsert, /* The ON CONFLICT clause for the upsert */ + Table *pTab, /* The table being updated */ + Index *pIdx, /* The UNIQUE constraint that failed */ + int iCur /* Cursor for pIdx (or pTab if pIdx==NULL) */ +){ + Vdbe *v = pParse->pVdbe; + sqlite3 *db = pParse->db; + SrcList *pSrc; /* FROM clause for the UPDATE */ + int iDataCur; + int i; + + assert( v!=0 ); + assert( pUpsert!=0 ); + VdbeNoopComment((v, "Begin DO UPDATE of UPSERT")); + iDataCur = pUpsert->iDataCur; + if( pIdx && iCur!=iDataCur ){ + if( HasRowid(pTab) ){ + int regRowid = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_IdxRowid, iCur, regRowid); + sqlite3VdbeAddOp3(v, OP_SeekRowid, iDataCur, 0, regRowid); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, regRowid); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + int nPk = pPk->nKeyCol; + int iPk = pParse->nMem+1; + pParse->nMem += nPk; + for(i=0; iaiColumn[i]>=0 ); + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]); + sqlite3VdbeAddOp3(v, OP_Column, iCur, k, iPk+i); + VdbeComment((v, "%s.%s", pIdx->zName, + pTab->aCol[pPk->aiColumn[i]].zName)); + } + sqlite3VdbeVerifyAbortable(v, OE_Abort); + i = sqlite3VdbeAddOp4Int(v, OP_Found, iDataCur, 0, iPk, nPk); + VdbeCoverage(v); + sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0, + "corrupt database", P4_STATIC); + sqlite3MayAbort(pParse); + sqlite3VdbeJumpHere(v, i); + } + } + /* pUpsert does not own pUpsertSrc - the outer INSERT statement does. So + ** we have to make a copy before passing it down into sqlite3Update() */ + pSrc = sqlite3SrcListDup(db, pUpsert->pUpsertSrc, 0); + /* excluded.* columns of type REAL need to be converted to a hard real */ + for(i=0; inCol; i++){ + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, pUpsert->regData+i); + } + } + sqlite3Update(pParse, pSrc, pUpsert->pUpsertSet, + pUpsert->pUpsertWhere, OE_Abort, 0, 0, pUpsert); + pUpsert->pUpsertSet = 0; /* Will have been deleted by sqlite3Update() */ + pUpsert->pUpsertWhere = 0; /* Will have been deleted by sqlite3Update() */ + VdbeNoopComment((v, "End DO UPDATE of UPSERT")); +} + +#endif /* SQLITE_OMIT_UPSERT */ + +/************** End of upsert.c **********************************************/ +/************** Begin file vacuum.c ******************************************/ +/* +** 2003 April 6 +** +** 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 code used to implement the VACUUM command. +** +** Most of the code in this file may be omitted by defining the +** SQLITE_OMIT_VACUUM macro. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) + +/* +** Execute zSql on database db. +** +** If zSql returns rows, then each row will have exactly one +** column. (This will only happen if zSql begins with "SELECT".) +** Take each row of result and call execSql() again recursively. +** +** The execSqlF() routine does the same thing, except it accepts +** a format string as its third argument +*/ +static int execSql(sqlite3 *db, char **pzErrMsg, const char *zSql){ + sqlite3_stmt *pStmt; + int rc; + + /* printf("SQL: [%s]\n", zSql); fflush(stdout); */ + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){ + const char *zSubSql = (const char*)sqlite3_column_text(pStmt,0); + assert( sqlite3_strnicmp(zSql,"SELECT",6)==0 ); + /* The secondary SQL must be one of CREATE TABLE, CREATE INDEX, + ** or INSERT. Historically there have been attacks that first + ** corrupt the sqlite_master.sql field with other kinds of statements + ** then run VACUUM to get those statements to execute at inappropriate + ** times. */ + if( zSubSql + && (strncmp(zSubSql,"CRE",3)==0 || strncmp(zSubSql,"INS",3)==0) + ){ + rc = execSql(db, pzErrMsg, zSubSql); + if( rc!=SQLITE_OK ) break; + } + } + assert( rc!=SQLITE_ROW ); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + if( rc ){ + sqlite3SetString(pzErrMsg, db, sqlite3_errmsg(db)); + } + (void)sqlite3_finalize(pStmt); + return rc; +} +static int execSqlF(sqlite3 *db, char **pzErrMsg, const char *zSql, ...){ + char *z; + va_list ap; + int rc; + va_start(ap, zSql); + z = sqlite3VMPrintf(db, zSql, ap); + va_end(ap); + if( z==0 ) return SQLITE_NOMEM; + rc = execSql(db, pzErrMsg, z); + sqlite3DbFree(db, z); + return rc; +} + +/* +** The VACUUM command is used to clean up the database, +** collapse free space, etc. It is modelled after the VACUUM command +** in PostgreSQL. The VACUUM command works as follows: +** +** (1) Create a new transient database file +** (2) Copy all content from the database being vacuumed into +** the new transient database file +** (3) Copy content from the transient database back into the +** original database. +** +** The transient database requires temporary disk space approximately +** equal to the size of the original database. The copy operation of +** step (3) requires additional temporary disk space approximately equal +** to the size of the original database for the rollback journal. +** Hence, temporary disk space that is approximately 2x the size of the +** original database is required. Every page of the database is written +** approximately 3 times: Once for step (2) and twice for step (3). +** Two writes per page are required in step (3) because the original +** database content must be written into the rollback journal prior to +** overwriting the database with the vacuumed content. +** +** Only 1x temporary space and only 1x writes would be required if +** the copy of step (3) were replaced by deleting the original database +** and renaming the transient database as the original. But that will +** not work if other processes are attached to the original database. +** And a power loss in between deleting the original and renaming the +** transient would cause the database file to appear to be deleted +** following reboot. +*/ +SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm, Expr *pInto){ + Vdbe *v = sqlite3GetVdbe(pParse); + int iDb = 0; + if( v==0 ) goto build_vacuum_end; + if( pParse->nErr ) goto build_vacuum_end; + if( pNm ){ +#ifndef SQLITE_BUG_COMPATIBLE_20160819 + /* Default behavior: Report an error if the argument to VACUUM is + ** not recognized */ + iDb = sqlite3TwoPartName(pParse, pNm, pNm, &pNm); + if( iDb<0 ) goto build_vacuum_end; +#else + /* When SQLITE_BUG_COMPATIBLE_20160819 is defined, unrecognized arguments + ** to VACUUM are silently ignored. This is a back-out of a bug fix that + ** occurred on 2016-08-19 (https://www.sqlite.org/src/info/083f9e6270). + ** The buggy behavior is required for binary compatibility with some + ** legacy applications. */ + iDb = sqlite3FindDb(pParse->db, pNm); + if( iDb<0 ) iDb = 0; +#endif + } + if( iDb!=1 ){ + int iIntoReg = 0; + if( pInto && sqlite3ResolveSelfReference(pParse,0,0,pInto,0)==0 ){ + iIntoReg = ++pParse->nMem; + sqlite3ExprCode(pParse, pInto, iIntoReg); + } + sqlite3VdbeAddOp2(v, OP_Vacuum, iDb, iIntoReg); + sqlite3VdbeUsesBtree(v, iDb); + } +build_vacuum_end: + sqlite3ExprDelete(pParse->db, pInto); + return; +} + +/* +** This routine implements the OP_Vacuum opcode of the VDBE. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( + char **pzErrMsg, /* Write error message here */ + sqlite3 *db, /* Database connection */ + int iDb, /* Which attached DB to vacuum */ + sqlite3_value *pOut /* Write results here, if not NULL. VACUUM INTO */ +){ + int rc = SQLITE_OK; /* Return code from service routines */ + Btree *pMain; /* The database being vacuumed */ + Btree *pTemp; /* The temporary database we vacuum into */ + u32 saved_mDbFlags; /* Saved value of db->mDbFlags */ + u64 saved_flags; /* Saved value of db->flags */ + int saved_nChange; /* Saved value of db->nChange */ + int saved_nTotalChange; /* Saved value of db->nTotalChange */ + u32 saved_openFlags; /* Saved value of db->openFlags */ + u8 saved_mTrace; /* Saved trace settings */ + Db *pDb = 0; /* Database to detach at end of vacuum */ + int isMemDb; /* True if vacuuming a :memory: database */ + int nRes; /* Bytes of reserved space at the end of each page */ + int nDb; /* Number of attached databases */ + const char *zDbMain; /* Schema name of database to vacuum */ + const char *zOut; /* Name of output file */ + + if( !db->autoCommit ){ + sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction"); + return SQLITE_ERROR; /* IMP: R-12218-18073 */ + } + if( db->nVdbeActive>1 ){ + sqlite3SetString(pzErrMsg, db,"cannot VACUUM - SQL statements in progress"); + return SQLITE_ERROR; /* IMP: R-15610-35227 */ + } + saved_openFlags = db->openFlags; + if( pOut ){ + if( sqlite3_value_type(pOut)!=SQLITE_TEXT ){ + sqlite3SetString(pzErrMsg, db, "non-text filename"); + return SQLITE_ERROR; + } + zOut = (const char*)sqlite3_value_text(pOut); + db->openFlags &= ~SQLITE_OPEN_READONLY; + db->openFlags |= SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE; + }else{ + zOut = ""; + } + + /* Save the current value of the database flags so that it can be + ** restored before returning. Then set the writable-schema flag, and + ** disable CHECK and foreign key constraints. */ + saved_flags = db->flags; + saved_mDbFlags = db->mDbFlags; + saved_nChange = db->nChange; + saved_nTotalChange = db->nTotalChange; + saved_mTrace = db->mTrace; + db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks; + db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; + db->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder + | SQLITE_Defensive | SQLITE_CountRows); + db->mTrace = 0; + + zDbMain = db->aDb[iDb].zDbSName; + pMain = db->aDb[iDb].pBt; + isMemDb = sqlite3PagerIsMemdb(sqlite3BtreePager(pMain)); + + /* Attach the temporary database as 'vacuum_db'. The synchronous pragma + ** can be set to 'off' for this file, as it is not recovered if a crash + ** occurs anyway. The integrity of the database is maintained by a + ** (possibly synchronous) transaction opened on the main database before + ** sqlite3BtreeCopyFile() is called. + ** + ** An optimisation would be to use a non-journaled pager. + ** (Later:) I tried setting "PRAGMA vacuum_db.journal_mode=OFF" but + ** that actually made the VACUUM run slower. Very little journalling + ** actually occurs when doing a vacuum since the vacuum_db is initially + ** empty. Only the journal header is written. Apparently it takes more + ** time to parse and run the PRAGMA to turn journalling off than it does + ** to write the journal header file. + */ + nDb = db->nDb; + rc = execSqlF(db, pzErrMsg, "ATTACH %Q AS vacuum_db", zOut); + db->openFlags = saved_openFlags; + if( rc!=SQLITE_OK ) goto end_of_vacuum; + assert( (db->nDb-1)==nDb ); + pDb = &db->aDb[nDb]; + assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); + pTemp = pDb->pBt; + if( pOut ){ + sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp)); + i64 sz = 0; + if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){ + rc = SQLITE_ERROR; + sqlite3SetString(pzErrMsg, db, "output file already exists"); + goto end_of_vacuum; + } + db->mDbFlags |= DBFLAG_VacuumInto; + } + nRes = sqlite3BtreeGetRequestedReserve(pMain); + + sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size); + sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0)); + sqlite3BtreeSetPagerFlags(pTemp, PAGER_SYNCHRONOUS_OFF|PAGER_CACHESPILL); + + /* Begin a transaction and take an exclusive lock on the main database + ** file. This is done before the sqlite3BtreeGetPageSize(pMain) call below, + ** to ensure that we do not try to change the page-size on a WAL database. + */ + rc = execSql(db, pzErrMsg, "BEGIN"); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + rc = sqlite3BtreeBeginTrans(pMain, pOut==0 ? 2 : 0, 0); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + + /* Do not attempt to change the page size for a WAL database */ + if( sqlite3PagerGetJournalMode(sqlite3BtreePager(pMain)) + ==PAGER_JOURNALMODE_WAL ){ + db->nextPagesize = 0; + } + + if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes, 0) + || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes, 0)) + || NEVER(db->mallocFailed) + ){ + rc = SQLITE_NOMEM_BKPT; + goto end_of_vacuum; + } + +#ifndef SQLITE_OMIT_AUTOVACUUM + sqlite3BtreeSetAutoVacuum(pTemp, db->nextAutovac>=0 ? db->nextAutovac : + sqlite3BtreeGetAutoVacuum(pMain)); +#endif + + /* Query the schema of the main database. Create a mirror schema + ** in the temporary database. + */ + db->init.iDb = nDb; /* force new CREATE statements into vacuum_db */ + rc = execSqlF(db, pzErrMsg, + "SELECT sql FROM \"%w\".sqlite_master" + " WHERE type='table'AND name<>'sqlite_sequence'" + " AND coalesce(rootpage,1)>0", + zDbMain + ); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + rc = execSqlF(db, pzErrMsg, + "SELECT sql FROM \"%w\".sqlite_master" + " WHERE type='index'", + zDbMain + ); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + db->init.iDb = 0; + + /* Loop through the tables in the main database. For each, do + ** an "INSERT INTO vacuum_db.xxx SELECT * FROM main.xxx;" to copy + ** the contents to the temporary database. + */ + rc = execSqlF(db, pzErrMsg, + "SELECT'INSERT INTO vacuum_db.'||quote(name)" + "||' SELECT*FROM\"%w\".'||quote(name)" + "FROM vacuum_db.sqlite_master " + "WHERE type='table'AND coalesce(rootpage,1)>0", + zDbMain + ); + assert( (db->mDbFlags & DBFLAG_Vacuum)!=0 ); + db->mDbFlags &= ~DBFLAG_Vacuum; + if( rc!=SQLITE_OK ) goto end_of_vacuum; + + /* Copy the triggers, views, and virtual tables from the main database + ** over to the temporary database. None of these objects has any + ** associated storage, so all we have to do is copy their entries + ** from the SQLITE_MASTER table. + */ + rc = execSqlF(db, pzErrMsg, + "INSERT INTO vacuum_db.sqlite_master" + " SELECT*FROM \"%w\".sqlite_master" + " WHERE type IN('view','trigger')" + " OR(type='table'AND rootpage=0)", + zDbMain + ); + if( rc ) goto end_of_vacuum; + + /* At this point, there is a write transaction open on both the + ** vacuum database and the main database. Assuming no error occurs, + ** both transactions are closed by this block - the main database + ** transaction by sqlite3BtreeCopyFile() and the other by an explicit + ** call to sqlite3BtreeCommit(). + */ + { + u32 meta; + int i; + + /* This array determines which meta meta values are preserved in the + ** vacuum. Even entries are the meta value number and odd entries + ** are an increment to apply to the meta value after the vacuum. + ** The increment is used to increase the schema cookie so that other + ** connections to the same database will know to reread the schema. + */ + static const unsigned char aCopy[] = { + BTREE_SCHEMA_VERSION, 1, /* Add one to the old schema cookie */ + BTREE_DEFAULT_CACHE_SIZE, 0, /* Preserve the default page cache size */ + BTREE_TEXT_ENCODING, 0, /* Preserve the text encoding */ + BTREE_USER_VERSION, 0, /* Preserve the user version */ + BTREE_APPLICATION_ID, 0, /* Preserve the application id */ + }; + + assert( 1==sqlite3BtreeIsInTrans(pTemp) ); + assert( pOut!=0 || 1==sqlite3BtreeIsInTrans(pMain) ); + + /* Copy Btree meta values */ + for(i=0; iflags */ + db->init.iDb = 0; + db->mDbFlags = saved_mDbFlags; + db->flags = saved_flags; + db->nChange = saved_nChange; + db->nTotalChange = saved_nTotalChange; + db->mTrace = saved_mTrace; + sqlite3BtreeSetPageSize(pMain, -1, 0, 1); + + /* Currently there is an SQL level transaction open on the vacuum + ** database. No locks are held on any other files (since the main file + ** was committed at the btree level). So it safe to end the transaction + ** by manually setting the autoCommit flag to true and detaching the + ** vacuum database. The vacuum_db journal file is deleted when the pager + ** is closed by the DETACH. + */ + db->autoCommit = 1; + + if( pDb ){ + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + pDb->pSchema = 0; + } + + /* This both clears the schemas and reduces the size of the db->aDb[] + ** array. */ + sqlite3ResetAllSchemasOfConnection(db); + + return rc; +} + +#endif /* SQLITE_OMIT_VACUUM && SQLITE_OMIT_ATTACH */ + +/************** End of vacuum.c **********************************************/ +/************** Begin file vtab.c ********************************************/ +/* +** 2006 June 10 +** +** 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 code used to help implement virtual tables. +*/ +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* #include "sqliteInt.h" */ + +/* +** Before a virtual table xCreate() or xConnect() method is invoked, the +** sqlite3.pVtabCtx member variable is set to point to an instance of +** this struct allocated on the stack. It is used by the implementation of +** the sqlite3_declare_vtab() and sqlite3_vtab_config() APIs, both of which +** are invoked only from within xCreate and xConnect methods. +*/ +struct VtabCtx { + VTable *pVTable; /* The virtual table being constructed */ + Table *pTab; /* The Table object to which the virtual table belongs */ + VtabCtx *pPrior; /* Parent context (if any) */ + int bDeclared; /* True after sqlite3_declare_vtab() is called */ +}; + +/* +** Construct and install a Module object for a virtual table. When this +** routine is called, it is guaranteed that all appropriate locks are held +** and the module is not already part of the connection. +** +** If there already exists a module with zName, replace it with the new one. +** If pModule==0, then delete the module zName if it exists. +*/ +SQLITE_PRIVATE Module *sqlite3VtabCreateModule( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux, /* Context pointer for xCreate/xConnect */ + void (*xDestroy)(void *) /* Module destructor function */ +){ + Module *pMod; + Module *pDel; + char *zCopy; + if( pModule==0 ){ + zCopy = (char*)zName; + pMod = 0; + }else{ + int nName = sqlite3Strlen30(zName); + pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1); + if( pMod==0 ){ + sqlite3OomFault(db); + return 0; + } + zCopy = (char *)(&pMod[1]); + memcpy(zCopy, zName, nName+1); + pMod->zName = zCopy; + pMod->pModule = pModule; + pMod->pAux = pAux; + pMod->xDestroy = xDestroy; + pMod->pEpoTab = 0; + pMod->nRefModule = 1; + } + pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); + if( pDel ){ + if( pDel==pMod ){ + sqlite3OomFault(db); + sqlite3DbFree(db, pDel); + pMod = 0; + }else{ + sqlite3VtabEponymousTableClear(db, pDel); + sqlite3VtabModuleUnref(db, pDel); + } + } + return pMod; +} + +/* +** The actual function that does the work of creating a new module. +** This function implements the sqlite3_create_module() and +** sqlite3_create_module_v2() interfaces. +*/ +static int createModule( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux, /* Context pointer for xCreate/xConnect */ + void (*xDestroy)(void *) /* Module destructor function */ +){ + int rc = SQLITE_OK; + + sqlite3_mutex_enter(db->mutex); + (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy); + rc = sqlite3ApiExit(db, rc); + if( rc!=SQLITE_OK && xDestroy ) xDestroy(pAux); + sqlite3_mutex_leave(db->mutex); + return rc; +} + + +/* +** External API function used to create a new virtual-table module. +*/ +SQLITE_API int sqlite3_create_module( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux /* Context pointer for xCreate/xConnect */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + return createModule(db, zName, pModule, pAux, 0); +} + +/* +** External API function used to create a new virtual-table module. +*/ +SQLITE_API int sqlite3_create_module_v2( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux, /* Context pointer for xCreate/xConnect */ + void (*xDestroy)(void *) /* Module destructor function */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + return createModule(db, zName, pModule, pAux, xDestroy); +} + +/* +** External API to drop all virtual-table modules, except those named +** on the azNames list. +*/ +SQLITE_API int sqlite3_drop_modules(sqlite3 *db, const char** azNames){ + HashElem *pThis, *pNext; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + for(pThis=sqliteHashFirst(&db->aModule); pThis; pThis=pNext){ + Module *pMod = (Module*)sqliteHashData(pThis); + pNext = sqliteHashNext(pThis); + if( azNames ){ + int ii; + for(ii=0; azNames[ii]!=0 && strcmp(azNames[ii],pMod->zName)!=0; ii++){} + if( azNames[ii]!=0 ) continue; + } + createModule(db, pMod->zName, 0, 0, 0); + } + return SQLITE_OK; +} + +/* +** Decrement the reference count on a Module object. Destroy the +** module when the reference count reaches zero. +*/ +SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3 *db, Module *pMod){ + assert( pMod->nRefModule>0 ); + pMod->nRefModule--; + if( pMod->nRefModule==0 ){ + if( pMod->xDestroy ){ + pMod->xDestroy(pMod->pAux); + } + assert( pMod->pEpoTab==0 ); + sqlite3DbFree(db, pMod); + } +} + +/* +** Lock the virtual table so that it cannot be disconnected. +** Locks nest. Every lock should have a corresponding unlock. +** If an unlock is omitted, resources leaks will occur. +** +** If a disconnect is attempted while a virtual table is locked, +** the disconnect is deferred until all locks have been removed. +*/ +SQLITE_PRIVATE void sqlite3VtabLock(VTable *pVTab){ + pVTab->nRef++; +} + + +/* +** pTab is a pointer to a Table structure representing a virtual-table. +** Return a pointer to the VTable object used by connection db to access +** this virtual-table, if one has been created, or NULL otherwise. +*/ +SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3 *db, Table *pTab){ + VTable *pVtab; + assert( IsVirtual(pTab) ); + for(pVtab=pTab->pVTable; pVtab && pVtab->db!=db; pVtab=pVtab->pNext); + return pVtab; +} + +/* +** Decrement the ref-count on a virtual table object. When the ref-count +** reaches zero, call the xDisconnect() method to delete the object. +*/ +SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *pVTab){ + sqlite3 *db = pVTab->db; + + assert( db ); + assert( pVTab->nRef>0 ); + assert( db->magic==SQLITE_MAGIC_OPEN || db->magic==SQLITE_MAGIC_ZOMBIE ); + + pVTab->nRef--; + if( pVTab->nRef==0 ){ + sqlite3_vtab *p = pVTab->pVtab; + sqlite3VtabModuleUnref(pVTab->db, pVTab->pMod); + if( p ){ + p->pModule->xDisconnect(p); + } + sqlite3DbFree(db, pVTab); + } +} + +/* +** Table p is a virtual table. This function moves all elements in the +** p->pVTable list to the sqlite3.pDisconnect lists of their associated +** database connections to be disconnected at the next opportunity. +** Except, if argument db is not NULL, then the entry associated with +** connection db is left in the p->pVTable list. +*/ +static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){ + VTable *pRet = 0; + VTable *pVTable = p->pVTable; + p->pVTable = 0; + + /* Assert that the mutex (if any) associated with the BtShared database + ** that contains table p is held by the caller. See header comments + ** above function sqlite3VtabUnlockList() for an explanation of why + ** this makes it safe to access the sqlite3.pDisconnect list of any + ** database connection that may have an entry in the p->pVTable list. + */ + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, p->pSchema) ); + + while( pVTable ){ + sqlite3 *db2 = pVTable->db; + VTable *pNext = pVTable->pNext; + assert( db2 ); + if( db2==db ){ + pRet = pVTable; + p->pVTable = pRet; + pRet->pNext = 0; + }else{ + pVTable->pNext = db2->pDisconnect; + db2->pDisconnect = pVTable; + } + pVTable = pNext; + } + + assert( !db || pRet ); + return pRet; +} + +/* +** Table *p is a virtual table. This function removes the VTable object +** for table *p associated with database connection db from the linked +** list in p->pVTab. It also decrements the VTable ref count. This is +** used when closing database connection db to free all of its VTable +** objects without disturbing the rest of the Schema object (which may +** be being used by other shared-cache connections). +*/ +SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p){ + VTable **ppVTab; + + assert( IsVirtual(p) ); + assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert( sqlite3_mutex_held(db->mutex) ); + + for(ppVTab=&p->pVTable; *ppVTab; ppVTab=&(*ppVTab)->pNext){ + if( (*ppVTab)->db==db ){ + VTable *pVTab = *ppVTab; + *ppVTab = pVTab->pNext; + sqlite3VtabUnlock(pVTab); + break; + } + } +} + + +/* +** Disconnect all the virtual table objects in the sqlite3.pDisconnect list. +** +** This function may only be called when the mutexes associated with all +** shared b-tree databases opened using connection db are held by the +** caller. This is done to protect the sqlite3.pDisconnect list. The +** sqlite3.pDisconnect list is accessed only as follows: +** +** 1) By this function. In this case, all BtShared mutexes and the mutex +** associated with the database handle itself must be held. +** +** 2) By function vtabDisconnectAll(), when it adds a VTable entry to +** the sqlite3.pDisconnect list. In this case either the BtShared mutex +** associated with the database the virtual table is stored in is held +** or, if the virtual table is stored in a non-sharable database, then +** the database handle mutex is held. +** +** As a result, a sqlite3.pDisconnect cannot be accessed simultaneously +** by multiple threads. It is thread-safe. +*/ +SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){ + VTable *p = db->pDisconnect; + + assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert( sqlite3_mutex_held(db->mutex) ); + + if( p ){ + db->pDisconnect = 0; + sqlite3ExpirePreparedStatements(db, 0); + do { + VTable *pNext = p->pNext; + sqlite3VtabUnlock(p); + p = pNext; + }while( p ); + } +} + +/* +** Clear any and all virtual-table information from the Table record. +** This routine is called, for example, just before deleting the Table +** record. +** +** Since it is a virtual-table, the Table structure contains a pointer +** to the head of a linked list of VTable structures. Each VTable +** structure is associated with a single sqlite3* user of the schema. +** The reference count of the VTable structure associated with database +** connection db is decremented immediately (which may lead to the +** structure being xDisconnected and free). Any other VTable structures +** in the list are moved to the sqlite3.pDisconnect list of the associated +** database connection. +*/ +SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){ + if( !db || db->pnBytesFreed==0 ) vtabDisconnectAll(0, p); + if( p->azModuleArg ){ + int i; + for(i=0; inModuleArg; i++){ + if( i!=1 ) sqlite3DbFree(db, p->azModuleArg[i]); + } + sqlite3DbFree(db, p->azModuleArg); + } +} + +/* +** Add a new module argument to pTable->azModuleArg[]. +** The string is not copied - the pointer is stored. The +** string will be freed automatically when the table is +** deleted. +*/ +static void addModuleArgument(Parse *pParse, Table *pTable, char *zArg){ + sqlite3_int64 nBytes = sizeof(char *)*(2+pTable->nModuleArg); + char **azModuleArg; + sqlite3 *db = pParse->db; + if( pTable->nModuleArg+3>=db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns on %s", pTable->zName); + } + azModuleArg = sqlite3DbRealloc(db, pTable->azModuleArg, nBytes); + if( azModuleArg==0 ){ + sqlite3DbFree(db, zArg); + }else{ + int i = pTable->nModuleArg++; + azModuleArg[i] = zArg; + azModuleArg[i+1] = 0; + pTable->azModuleArg = azModuleArg; + } +} + +/* +** The parser calls this routine when it first sees a CREATE VIRTUAL TABLE +** statement. The module name has been parsed, but the optional list +** of parameters that follow the module name are still pending. +*/ +SQLITE_PRIVATE void sqlite3VtabBeginParse( + Parse *pParse, /* Parsing context */ + Token *pName1, /* Name of new table, or database name */ + Token *pName2, /* Name of new table or NULL */ + Token *pModuleName, /* Name of the module for the virtual table */ + int ifNotExists /* No error if the table already exists */ +){ + Table *pTable; /* The new virtual table */ + sqlite3 *db; /* Database connection */ + + sqlite3StartTable(pParse, pName1, pName2, 0, 0, 1, ifNotExists); + pTable = pParse->pNewTable; + if( pTable==0 ) return; + assert( 0==pTable->pIndex ); + + db = pParse->db; + + assert( pTable->nModuleArg==0 ); + addModuleArgument(pParse, pTable, sqlite3NameFromToken(db, pModuleName)); + addModuleArgument(pParse, pTable, 0); + addModuleArgument(pParse, pTable, sqlite3DbStrDup(db, pTable->zName)); + assert( (pParse->sNameToken.z==pName2->z && pName2->z!=0) + || (pParse->sNameToken.z==pName1->z && pName2->z==0) + ); + pParse->sNameToken.n = (int)( + &pModuleName->z[pModuleName->n] - pParse->sNameToken.z + ); + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Creating a virtual table invokes the authorization callback twice. + ** The first invocation, to obtain permission to INSERT a row into the + ** sqlite_master table, has already been made by sqlite3StartTable(). + ** The second call, to obtain permission to create the table, is made now. + */ + if( pTable->azModuleArg ){ + int iDb = sqlite3SchemaToIndex(db, pTable->pSchema); + assert( iDb>=0 ); /* The database the table is being created in */ + sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, + pTable->azModuleArg[0], pParse->db->aDb[iDb].zDbSName); + } +#endif +} + +/* +** This routine takes the module argument that has been accumulating +** in pParse->zArg[] and appends it to the list of arguments on the +** virtual table currently under construction in pParse->pTable. +*/ +static void addArgumentToVtab(Parse *pParse){ + if( pParse->sArg.z && pParse->pNewTable ){ + const char *z = (const char*)pParse->sArg.z; + int n = pParse->sArg.n; + sqlite3 *db = pParse->db; + addModuleArgument(pParse, pParse->pNewTable, sqlite3DbStrNDup(db, z, n)); + } +} + +/* +** The parser calls this routine after the CREATE VIRTUAL TABLE statement +** has been completely parsed. +*/ +SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ + Table *pTab = pParse->pNewTable; /* The table being constructed */ + sqlite3 *db = pParse->db; /* The database connection */ + + if( pTab==0 ) return; + addArgumentToVtab(pParse); + pParse->sArg.z = 0; + if( pTab->nModuleArg<1 ) return; + + /* If the CREATE VIRTUAL TABLE statement is being entered for the + ** first time (in other words if the virtual table is actually being + ** created now instead of just being read out of sqlite_master) then + ** do additional initialization work and store the statement text + ** in the sqlite_master table. + */ + if( !db->init.busy ){ + char *zStmt; + char *zWhere; + int iDb; + int iReg; + Vdbe *v; + + sqlite3MayAbort(pParse); + + /* Compute the complete text of the CREATE VIRTUAL TABLE statement */ + if( pEnd ){ + pParse->sNameToken.n = (int)(pEnd->z - pParse->sNameToken.z) + pEnd->n; + } + zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken); + + /* A slot for the record has already been allocated in the + ** SQLITE_MASTER table. We just need to update that slot with all + ** the information we've collected. + ** + ** The VM register number pParse->regRowid holds the rowid of an + ** entry in the sqlite_master table tht was created for this vtab + ** by sqlite3StartTable(). + */ + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + sqlite3NestedParse(pParse, + "UPDATE %Q.%s " + "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " + "WHERE rowid=#%d", + db->aDb[iDb].zDbSName, MASTER_NAME, + pTab->zName, + pTab->zName, + zStmt, + pParse->regRowid + ); + v = sqlite3GetVdbe(pParse); + sqlite3ChangeCookie(pParse, iDb); + + sqlite3VdbeAddOp0(v, OP_Expire); + zWhere = sqlite3MPrintf(db, "name=%Q AND sql=%Q", pTab->zName, zStmt); + sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere); + sqlite3DbFree(db, zStmt); + + iReg = ++pParse->nMem; + sqlite3VdbeLoadString(v, iReg, pTab->zName); + sqlite3VdbeAddOp2(v, OP_VCreate, iDb, iReg); + } + + /* If we are rereading the sqlite_master table create the in-memory + ** record of the table. The xConnect() method is not called until + ** the first time the virtual table is used in an SQL statement. This + ** allows a schema that contains virtual tables to be loaded before + ** the required virtual table implementations are registered. */ + else { + Table *pOld; + Schema *pSchema = pTab->pSchema; + const char *zName = pTab->zName; + assert( sqlite3SchemaMutexHeld(db, 0, pSchema) ); + pOld = sqlite3HashInsert(&pSchema->tblHash, zName, pTab); + if( pOld ){ + sqlite3OomFault(db); + assert( pTab==pOld ); /* Malloc must have failed inside HashInsert() */ + return; + } + pParse->pNewTable = 0; + } +} + +/* +** The parser calls this routine when it sees the first token +** of an argument to the module name in a CREATE VIRTUAL TABLE statement. +*/ +SQLITE_PRIVATE void sqlite3VtabArgInit(Parse *pParse){ + addArgumentToVtab(pParse); + pParse->sArg.z = 0; + pParse->sArg.n = 0; +} + +/* +** The parser calls this routine for each token after the first token +** in an argument to the module name in a CREATE VIRTUAL TABLE statement. +*/ +SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse *pParse, Token *p){ + Token *pArg = &pParse->sArg; + if( pArg->z==0 ){ + pArg->z = p->z; + pArg->n = p->n; + }else{ + assert(pArg->z <= p->z); + pArg->n = (int)(&p->z[p->n] - pArg->z); + } +} + +/* +** Invoke a virtual table constructor (either xCreate or xConnect). The +** pointer to the function to invoke is passed as the fourth parameter +** to this procedure. +*/ +static int vtabCallConstructor( + sqlite3 *db, + Table *pTab, + Module *pMod, + int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**), + char **pzErr +){ + VtabCtx sCtx; + VTable *pVTable; + int rc; + const char *const*azArg = (const char *const*)pTab->azModuleArg; + int nArg = pTab->nModuleArg; + char *zErr = 0; + char *zModuleName; + int iDb; + VtabCtx *pCtx; + + /* Check that the virtual-table is not already being initialized */ + for(pCtx=db->pVtabCtx; pCtx; pCtx=pCtx->pPrior){ + if( pCtx->pTab==pTab ){ + *pzErr = sqlite3MPrintf(db, + "vtable constructor called recursively: %s", pTab->zName + ); + return SQLITE_LOCKED; + } + } + + zModuleName = sqlite3DbStrDup(db, pTab->zName); + if( !zModuleName ){ + return SQLITE_NOMEM_BKPT; + } + + pVTable = sqlite3MallocZero(sizeof(VTable)); + if( !pVTable ){ + sqlite3OomFault(db); + sqlite3DbFree(db, zModuleName); + return SQLITE_NOMEM_BKPT; + } + pVTable->db = db; + pVTable->pMod = pMod; + pVTable->eVtabRisk = SQLITE_VTABRISK_Normal; + + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + pTab->azModuleArg[1] = db->aDb[iDb].zDbSName; + + /* Invoke the virtual table constructor */ + assert( &db->pVtabCtx ); + assert( xConstruct ); + sCtx.pTab = pTab; + sCtx.pVTable = pVTable; + sCtx.pPrior = db->pVtabCtx; + sCtx.bDeclared = 0; + db->pVtabCtx = &sCtx; + rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr); + db->pVtabCtx = sCtx.pPrior; + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + assert( sCtx.pTab==pTab ); + + if( SQLITE_OK!=rc ){ + if( zErr==0 ){ + *pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName); + }else { + *pzErr = sqlite3MPrintf(db, "%s", zErr); + sqlite3_free(zErr); + } + sqlite3DbFree(db, pVTable); + }else if( ALWAYS(pVTable->pVtab) ){ + /* Justification of ALWAYS(): A correct vtab constructor must allocate + ** the sqlite3_vtab object if successful. */ + memset(pVTable->pVtab, 0, sizeof(pVTable->pVtab[0])); + pVTable->pVtab->pModule = pMod->pModule; + pMod->nRefModule++; + pVTable->nRef = 1; + if( sCtx.bDeclared==0 ){ + const char *zFormat = "vtable constructor did not declare schema: %s"; + *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName); + sqlite3VtabUnlock(pVTable); + rc = SQLITE_ERROR; + }else{ + int iCol; + u16 oooHidden = 0; + /* If everything went according to plan, link the new VTable structure + ** into the linked list headed by pTab->pVTable. Then loop through the + ** columns of the table to see if any of them contain the token "hidden". + ** If so, set the Column COLFLAG_HIDDEN flag and remove the token from + ** the type string. */ + pVTable->pNext = pTab->pVTable; + pTab->pVTable = pVTable; + + for(iCol=0; iColnCol; iCol++){ + char *zType = sqlite3ColumnType(&pTab->aCol[iCol], ""); + int nType; + int i = 0; + nType = sqlite3Strlen30(zType); + for(i=0; i0 ){ + assert(zType[i-1]==' '); + zType[i-1] = '\0'; + } + pTab->aCol[iCol].colFlags |= COLFLAG_HIDDEN; + oooHidden = TF_OOOHidden; + }else{ + pTab->tabFlags |= oooHidden; + } + } + } + } + + sqlite3DbFree(db, zModuleName); + return rc; +} + +/* +** This function is invoked by the parser to call the xConnect() method +** of the virtual table pTab. If an error occurs, an error code is returned +** and an error left in pParse. +** +** This call is a no-op if table pTab is not a virtual table. +*/ +SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){ + sqlite3 *db = pParse->db; + const char *zMod; + Module *pMod; + int rc; + + assert( pTab ); + if( !IsVirtual(pTab) || sqlite3GetVTable(db, pTab) ){ + return SQLITE_OK; + } + + /* Locate the required virtual table module */ + zMod = pTab->azModuleArg[0]; + pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); + + if( !pMod ){ + const char *zModule = pTab->azModuleArg[0]; + sqlite3ErrorMsg(pParse, "no such module: %s", zModule); + rc = SQLITE_ERROR; + }else{ + char *zErr = 0; + rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xConnect, &zErr); + if( rc!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "%s", zErr); + pParse->rc = rc; + } + sqlite3DbFree(db, zErr); + } + + return rc; +} +/* +** Grow the db->aVTrans[] array so that there is room for at least one +** more v-table. Return SQLITE_NOMEM if a malloc fails, or SQLITE_OK otherwise. +*/ +static int growVTrans(sqlite3 *db){ + const int ARRAY_INCR = 5; + + /* Grow the sqlite3.aVTrans array if required */ + if( (db->nVTrans%ARRAY_INCR)==0 ){ + VTable **aVTrans; + sqlite3_int64 nBytes = sizeof(sqlite3_vtab*)* + ((sqlite3_int64)db->nVTrans + ARRAY_INCR); + aVTrans = sqlite3DbRealloc(db, (void *)db->aVTrans, nBytes); + if( !aVTrans ){ + return SQLITE_NOMEM_BKPT; + } + memset(&aVTrans[db->nVTrans], 0, sizeof(sqlite3_vtab *)*ARRAY_INCR); + db->aVTrans = aVTrans; + } + + return SQLITE_OK; +} + +/* +** Add the virtual table pVTab to the array sqlite3.aVTrans[]. Space should +** have already been reserved using growVTrans(). +*/ +static void addToVTrans(sqlite3 *db, VTable *pVTab){ + /* Add pVtab to the end of sqlite3.aVTrans */ + db->aVTrans[db->nVTrans++] = pVTab; + sqlite3VtabLock(pVTab); +} + +/* +** This function is invoked by the vdbe to call the xCreate method +** of the virtual table named zTab in database iDb. +** +** If an error occurs, *pzErr is set to point to an English language +** description of the error and an SQLITE_XXX error code is returned. +** In this case the caller must call sqlite3DbFree(db, ) on *pzErr. +*/ +SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){ + int rc = SQLITE_OK; + Table *pTab; + Module *pMod; + const char *zMod; + + pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); + assert( pTab && IsVirtual(pTab) && !pTab->pVTable ); + + /* Locate the required virtual table module */ + zMod = pTab->azModuleArg[0]; + pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); + + /* If the module has been registered and includes a Create method, + ** invoke it now. If the module has not been registered, return an + ** error. Otherwise, do nothing. + */ + if( pMod==0 || pMod->pModule->xCreate==0 || pMod->pModule->xDestroy==0 ){ + *pzErr = sqlite3MPrintf(db, "no such module: %s", zMod); + rc = SQLITE_ERROR; + }else{ + rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xCreate, pzErr); + } + + /* Justification of ALWAYS(): The xConstructor method is required to + ** create a valid sqlite3_vtab if it returns SQLITE_OK. */ + if( rc==SQLITE_OK && ALWAYS(sqlite3GetVTable(db, pTab)) ){ + rc = growVTrans(db); + if( rc==SQLITE_OK ){ + addToVTrans(db, sqlite3GetVTable(db, pTab)); + } + } + + return rc; +} + +/* +** This function is used to set the schema of a virtual table. It is only +** valid to call this function from within the xCreate() or xConnect() of a +** virtual table module. +*/ +SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ + VtabCtx *pCtx; + int rc = SQLITE_OK; + Table *pTab; + char *zErr = 0; + Parse sParse; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + pCtx = db->pVtabCtx; + if( !pCtx || pCtx->bDeclared ){ + sqlite3Error(db, SQLITE_MISUSE); + sqlite3_mutex_leave(db->mutex); + return SQLITE_MISUSE_BKPT; + } + pTab = pCtx->pTab; + assert( IsVirtual(pTab) ); + + memset(&sParse, 0, sizeof(sParse)); + sParse.eParseMode = PARSE_MODE_DECLARE_VTAB; + sParse.db = db; + sParse.nQueryLoop = 1; + if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable, &zErr) + && sParse.pNewTable + && !db->mallocFailed + && !sParse.pNewTable->pSelect + && !IsVirtual(sParse.pNewTable) + ){ + if( !pTab->aCol ){ + Table *pNew = sParse.pNewTable; + Index *pIdx; + pTab->aCol = pNew->aCol; + pTab->nCol = pNew->nCol; + pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid); + pNew->nCol = 0; + pNew->aCol = 0; + assert( pTab->pIndex==0 ); + assert( HasRowid(pNew) || sqlite3PrimaryKeyIndex(pNew)!=0 ); + if( !HasRowid(pNew) + && pCtx->pVTable->pMod->pModule->xUpdate!=0 + && sqlite3PrimaryKeyIndex(pNew)->nKeyCol!=1 + ){ + /* WITHOUT ROWID virtual tables must either be read-only (xUpdate==0) + ** or else must have a single-column PRIMARY KEY */ + rc = SQLITE_ERROR; + } + pIdx = pNew->pIndex; + if( pIdx ){ + assert( pIdx->pNext==0 ); + pTab->pIndex = pIdx; + pNew->pIndex = 0; + pIdx->pTable = pTab; + } + } + pCtx->bDeclared = 1; + }else{ + sqlite3ErrorWithMsg(db, SQLITE_ERROR, (zErr ? "%s" : 0), zErr); + sqlite3DbFree(db, zErr); + rc = SQLITE_ERROR; + } + sParse.eParseMode = PARSE_MODE_NORMAL; + + if( sParse.pVdbe ){ + sqlite3VdbeFinalize(sParse.pVdbe); + } + sqlite3DeleteTable(db, sParse.pNewTable); + sqlite3ParserReset(&sParse); + + assert( (rc&0xff)==rc ); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** This function is invoked by the vdbe to call the xDestroy method +** of the virtual table named zTab in database iDb. This occurs +** when a DROP TABLE is mentioned. +** +** This call is a no-op if zTab is not a virtual table. +*/ +SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){ + int rc = SQLITE_OK; + Table *pTab; + + pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); + if( pTab!=0 && ALWAYS(pTab->pVTable!=0) ){ + VTable *p; + int (*xDestroy)(sqlite3_vtab *); + for(p=pTab->pVTable; p; p=p->pNext){ + assert( p->pVtab ); + if( p->pVtab->nRef>0 ){ + return SQLITE_LOCKED; + } + } + p = vtabDisconnectAll(db, pTab); + xDestroy = p->pMod->pModule->xDestroy; + if( xDestroy==0 ) xDestroy = p->pMod->pModule->xDisconnect; + assert( xDestroy!=0 ); + pTab->nTabRef++; + rc = xDestroy(p->pVtab); + /* Remove the sqlite3_vtab* from the aVTrans[] array, if applicable */ + if( rc==SQLITE_OK ){ + assert( pTab->pVTable==p && p->pNext==0 ); + p->pVtab = 0; + pTab->pVTable = 0; + sqlite3VtabUnlock(p); + } + sqlite3DeleteTable(db, pTab); + } + + return rc; +} + +/* +** This function invokes either the xRollback or xCommit method +** of each of the virtual tables in the sqlite3.aVTrans array. The method +** called is identified by the second argument, "offset", which is +** the offset of the method to call in the sqlite3_module structure. +** +** The array is cleared after invoking the callbacks. +*/ +static void callFinaliser(sqlite3 *db, int offset){ + int i; + if( db->aVTrans ){ + VTable **aVTrans = db->aVTrans; + db->aVTrans = 0; + for(i=0; inVTrans; i++){ + VTable *pVTab = aVTrans[i]; + sqlite3_vtab *p = pVTab->pVtab; + if( p ){ + int (*x)(sqlite3_vtab *); + x = *(int (**)(sqlite3_vtab *))((char *)p->pModule + offset); + if( x ) x(p); + } + pVTab->iSavepoint = 0; + sqlite3VtabUnlock(pVTab); + } + sqlite3DbFree(db, aVTrans); + db->nVTrans = 0; + } +} + +/* +** Invoke the xSync method of all virtual tables in the sqlite3.aVTrans +** array. Return the error code for the first error that occurs, or +** SQLITE_OK if all xSync operations are successful. +** +** If an error message is available, leave it in p->zErrMsg. +*/ +SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, Vdbe *p){ + int i; + int rc = SQLITE_OK; + VTable **aVTrans = db->aVTrans; + + db->aVTrans = 0; + for(i=0; rc==SQLITE_OK && inVTrans; i++){ + int (*x)(sqlite3_vtab *); + sqlite3_vtab *pVtab = aVTrans[i]->pVtab; + if( pVtab && (x = pVtab->pModule->xSync)!=0 ){ + rc = x(pVtab); + sqlite3VtabImportErrmsg(p, pVtab); + } + } + db->aVTrans = aVTrans; + return rc; +} + +/* +** Invoke the xRollback method of all virtual tables in the +** sqlite3.aVTrans array. Then clear the array itself. +*/ +SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db){ + callFinaliser(db, offsetof(sqlite3_module,xRollback)); + return SQLITE_OK; +} + +/* +** Invoke the xCommit method of all virtual tables in the +** sqlite3.aVTrans array. Then clear the array itself. +*/ +SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db){ + callFinaliser(db, offsetof(sqlite3_module,xCommit)); + return SQLITE_OK; +} + +/* +** If the virtual table pVtab supports the transaction interface +** (xBegin/xRollback/xCommit and optionally xSync) and a transaction is +** not currently open, invoke the xBegin method now. +** +** If the xBegin call is successful, place the sqlite3_vtab pointer +** in the sqlite3.aVTrans array. +*/ +SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ + int rc = SQLITE_OK; + const sqlite3_module *pModule; + + /* Special case: If db->aVTrans is NULL and db->nVTrans is greater + ** than zero, then this function is being called from within a + ** virtual module xSync() callback. It is illegal to write to + ** virtual module tables in this case, so return SQLITE_LOCKED. + */ + if( sqlite3VtabInSync(db) ){ + return SQLITE_LOCKED; + } + if( !pVTab ){ + return SQLITE_OK; + } + pModule = pVTab->pVtab->pModule; + + if( pModule->xBegin ){ + int i; + + /* If pVtab is already in the aVTrans array, return early */ + for(i=0; inVTrans; i++){ + if( db->aVTrans[i]==pVTab ){ + return SQLITE_OK; + } + } + + /* Invoke the xBegin method. If successful, add the vtab to the + ** sqlite3.aVTrans[] array. */ + rc = growVTrans(db); + if( rc==SQLITE_OK ){ + rc = pModule->xBegin(pVTab->pVtab); + if( rc==SQLITE_OK ){ + int iSvpt = db->nStatement + db->nSavepoint; + addToVTrans(db, pVTab); + if( iSvpt && pModule->xSavepoint ){ + pVTab->iSavepoint = iSvpt; + rc = pModule->xSavepoint(pVTab->pVtab, iSvpt-1); + } + } + } + } + return rc; +} + +/* +** Invoke either the xSavepoint, xRollbackTo or xRelease method of all +** virtual tables that currently have an open transaction. Pass iSavepoint +** as the second argument to the virtual table method invoked. +** +** If op is SAVEPOINT_BEGIN, the xSavepoint method is invoked. If it is +** SAVEPOINT_ROLLBACK, the xRollbackTo method. Otherwise, if op is +** SAVEPOINT_RELEASE, then the xRelease method of each virtual table with +** an open transaction is invoked. +** +** If any virtual table method returns an error code other than SQLITE_OK, +** processing is abandoned and the error returned to the caller of this +** function immediately. If all calls to virtual table methods are successful, +** SQLITE_OK is returned. +*/ +SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ + int rc = SQLITE_OK; + + assert( op==SAVEPOINT_RELEASE||op==SAVEPOINT_ROLLBACK||op==SAVEPOINT_BEGIN ); + assert( iSavepoint>=-1 ); + if( db->aVTrans ){ + int i; + for(i=0; rc==SQLITE_OK && inVTrans; i++){ + VTable *pVTab = db->aVTrans[i]; + const sqlite3_module *pMod = pVTab->pMod->pModule; + if( pVTab->pVtab && pMod->iVersion>=2 ){ + int (*xMethod)(sqlite3_vtab *, int); + sqlite3VtabLock(pVTab); + switch( op ){ + case SAVEPOINT_BEGIN: + xMethod = pMod->xSavepoint; + pVTab->iSavepoint = iSavepoint+1; + break; + case SAVEPOINT_ROLLBACK: + xMethod = pMod->xRollbackTo; + break; + default: + xMethod = pMod->xRelease; + break; + } + if( xMethod && pVTab->iSavepoint>iSavepoint ){ + rc = xMethod(pVTab->pVtab, iSavepoint); + } + sqlite3VtabUnlock(pVTab); + } + } + } + return rc; +} + +/* +** The first parameter (pDef) is a function implementation. The +** second parameter (pExpr) is the first argument to this function. +** If pExpr is a column in a virtual table, then let the virtual +** table implementation have an opportunity to overload the function. +** +** This routine is used to allow virtual table implementations to +** overload MATCH, LIKE, GLOB, and REGEXP operators. +** +** Return either the pDef argument (indicating no change) or a +** new FuncDef structure that is marked as ephemeral using the +** SQLITE_FUNC_EPHEM flag. +*/ +SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction( + sqlite3 *db, /* Database connection for reporting malloc problems */ + FuncDef *pDef, /* Function to possibly overload */ + int nArg, /* Number of arguments to the function */ + Expr *pExpr /* First argument to the function */ +){ + Table *pTab; + sqlite3_vtab *pVtab; + sqlite3_module *pMod; + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**) = 0; + void *pArg = 0; + FuncDef *pNew; + int rc = 0; + + /* Check to see the left operand is a column in a virtual table */ + if( NEVER(pExpr==0) ) return pDef; + if( pExpr->op!=TK_COLUMN ) return pDef; + pTab = pExpr->y.pTab; + if( pTab==0 ) return pDef; + if( !IsVirtual(pTab) ) return pDef; + pVtab = sqlite3GetVTable(db, pTab)->pVtab; + assert( pVtab!=0 ); + assert( pVtab->pModule!=0 ); + pMod = (sqlite3_module *)pVtab->pModule; + if( pMod->xFindFunction==0 ) return pDef; + + /* Call the xFindFunction method on the virtual table implementation + ** to see if the implementation wants to overload this function. + ** + ** Though undocumented, we have historically always invoked xFindFunction + ** with an all lower-case function name. Continue in this tradition to + ** avoid any chance of an incompatibility. + */ +#ifdef SQLITE_DEBUG + { + int i; + for(i=0; pDef->zName[i]; i++){ + unsigned char x = (unsigned char)pDef->zName[i]; + assert( x==sqlite3UpperToLower[x] ); + } + } +#endif + rc = pMod->xFindFunction(pVtab, nArg, pDef->zName, &xSFunc, &pArg); + if( rc==0 ){ + return pDef; + } + + /* Create a new ephemeral function definition for the overloaded + ** function */ + pNew = sqlite3DbMallocZero(db, sizeof(*pNew) + + sqlite3Strlen30(pDef->zName) + 1); + if( pNew==0 ){ + return pDef; + } + *pNew = *pDef; + pNew->zName = (const char*)&pNew[1]; + memcpy((char*)&pNew[1], pDef->zName, sqlite3Strlen30(pDef->zName)+1); + pNew->xSFunc = xSFunc; + pNew->pUserData = pArg; + pNew->funcFlags |= SQLITE_FUNC_EPHEM; + return pNew; +} + +/* +** Make sure virtual table pTab is contained in the pParse->apVirtualLock[] +** array so that an OP_VBegin will get generated for it. Add pTab to the +** array if it is missing. If pTab is already in the array, this routine +** is a no-op. +*/ +SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + int i, n; + Table **apVtabLock; + + assert( IsVirtual(pTab) ); + for(i=0; inVtabLock; i++){ + if( pTab==pToplevel->apVtabLock[i] ) return; + } + n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]); + apVtabLock = sqlite3Realloc(pToplevel->apVtabLock, n); + if( apVtabLock ){ + pToplevel->apVtabLock = apVtabLock; + pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab; + }else{ + sqlite3OomFault(pToplevel->db); + } +} + +/* +** Check to see if virtual table module pMod can be have an eponymous +** virtual table instance. If it can, create one if one does not already +** exist. Return non-zero if the eponymous virtual table instance exists +** when this routine returns, and return zero if it does not exist. +** +** An eponymous virtual table instance is one that is named after its +** module, and more importantly, does not require a CREATE VIRTUAL TABLE +** statement in order to come into existance. Eponymous virtual table +** instances always exist. They cannot be DROP-ed. +** +** Any virtual table module for which xConnect and xCreate are the same +** method can have an eponymous virtual table instance. +*/ +SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ + const sqlite3_module *pModule = pMod->pModule; + Table *pTab; + char *zErr = 0; + int rc; + sqlite3 *db = pParse->db; + if( pMod->pEpoTab ) return 1; + if( pModule->xCreate!=0 && pModule->xCreate!=pModule->xConnect ) return 0; + pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ) return 0; + pTab->zName = sqlite3DbStrDup(db, pMod->zName); + if( pTab->zName==0 ){ + sqlite3DbFree(db, pTab); + return 0; + } + pMod->pEpoTab = pTab; + pTab->nTabRef = 1; + pTab->pSchema = db->aDb[0].pSchema; + assert( pTab->nModuleArg==0 ); + pTab->iPKey = -1; + addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); + addModuleArgument(pParse, pTab, 0); + addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); + rc = vtabCallConstructor(db, pTab, pMod, pModule->xConnect, &zErr); + if( rc ){ + sqlite3ErrorMsg(pParse, "%s", zErr); + sqlite3DbFree(db, zErr); + sqlite3VtabEponymousTableClear(db, pMod); + return 0; + } + return 1; +} + +/* +** Erase the eponymous virtual table instance associated with +** virtual table module pMod, if it exists. +*/ +SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3 *db, Module *pMod){ + Table *pTab = pMod->pEpoTab; + if( pTab!=0 ){ + /* Mark the table as Ephemeral prior to deleting it, so that the + ** sqlite3DeleteTable() routine will know that it is not stored in + ** the schema. */ + pTab->tabFlags |= TF_Ephemeral; + sqlite3DeleteTable(db, pTab); + pMod->pEpoTab = 0; + } +} + +/* +** Return the ON CONFLICT resolution mode in effect for the virtual +** table update operation currently in progress. +** +** The results of this routine are undefined unless it is called from +** within an xUpdate method. +*/ +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *db){ + static const unsigned char aMap[] = { + SQLITE_ROLLBACK, SQLITE_ABORT, SQLITE_FAIL, SQLITE_IGNORE, SQLITE_REPLACE + }; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + assert( OE_Rollback==1 && OE_Abort==2 && OE_Fail==3 ); + assert( OE_Ignore==4 && OE_Replace==5 ); + assert( db->vtabOnConflict>=1 && db->vtabOnConflict<=5 ); + return (int)aMap[db->vtabOnConflict-1]; +} + +/* +** Call from within the xCreate() or xConnect() methods to provide +** the SQLite core with additional information about the behavior +** of the virtual table being implemented. +*/ +SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ + va_list ap; + int rc = SQLITE_OK; + VtabCtx *p; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + p = db->pVtabCtx; + if( !p ){ + rc = SQLITE_MISUSE_BKPT; + }else{ + assert( p->pTab==0 || IsVirtual(p->pTab) ); + va_start(ap, op); + switch( op ){ + case SQLITE_VTAB_CONSTRAINT_SUPPORT: { + p->pVTable->bConstraint = (u8)va_arg(ap, int); + break; + } + case SQLITE_VTAB_INNOCUOUS: { + p->pVTable->eVtabRisk = SQLITE_VTABRISK_Low; + break; + } + case SQLITE_VTAB_DIRECTONLY: { + p->pVTable->eVtabRisk = SQLITE_VTABRISK_High; + break; + } + default: { + rc = SQLITE_MISUSE_BKPT; + break; + } + } + va_end(ap); + } + + if( rc!=SQLITE_OK ) sqlite3Error(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/************** End of vtab.c ************************************************/ +/************** Begin file wherecode.c ***************************************/ +/* +** 2015-06-06 +** +** 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 module contains C code that generates VDBE code used to process +** the WHERE clause of SQL statements. +** +** This file was split off from where.c on 2015-06-06 in order to reduce the +** size of where.c and make it easier to edit. This file contains the routines +** that actually generate the bulk of the WHERE loop code. The original where.c +** file retains the code that does query planning and analysis. +*/ +/* #include "sqliteInt.h" */ +/************** Include whereInt.h in the middle of wherecode.c **************/ +/************** Begin file whereInt.h ****************************************/ +/* +** 2013-11-12 +** +** 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 structure and macro definitions for the query +** planner logic in "where.c". These definitions are broken out into +** a separate source file for easier editing. +*/ +#ifndef SQLITE_WHEREINT_H +#define SQLITE_WHEREINT_H + +/* +** Trace output macros +*/ +#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) +/***/ extern int sqlite3WhereTrace; +#endif +#if defined(SQLITE_DEBUG) \ + && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_WHERETRACE)) +# define WHERETRACE(K,X) if(sqlite3WhereTrace&(K)) sqlite3DebugPrintf X +# define WHERETRACE_ENABLED 1 +#else +# define WHERETRACE(K,X) +#endif + +/* Forward references +*/ +typedef struct WhereClause WhereClause; +typedef struct WhereMaskSet WhereMaskSet; +typedef struct WhereOrInfo WhereOrInfo; +typedef struct WhereAndInfo WhereAndInfo; +typedef struct WhereLevel WhereLevel; +typedef struct WhereLoop WhereLoop; +typedef struct WherePath WherePath; +typedef struct WhereTerm WhereTerm; +typedef struct WhereLoopBuilder WhereLoopBuilder; +typedef struct WhereScan WhereScan; +typedef struct WhereOrCost WhereOrCost; +typedef struct WhereOrSet WhereOrSet; + +/* +** This object contains information needed to implement a single nested +** loop in WHERE clause. +** +** Contrast this object with WhereLoop. This object describes the +** implementation of the loop. WhereLoop describes the algorithm. +** This object contains a pointer to the WhereLoop algorithm as one of +** its elements. +** +** The WhereInfo object contains a single instance of this object for +** each term in the FROM clause (which is to say, for each of the +** nested loops as implemented). The order of WhereLevel objects determines +** the loop nested order, with WhereInfo.a[0] being the outer loop and +** WhereInfo.a[WhereInfo.nLevel-1] being the inner loop. +*/ +struct WhereLevel { + int iLeftJoin; /* Memory cell used to implement LEFT OUTER JOIN */ + int iTabCur; /* The VDBE cursor used to access the table */ + int iIdxCur; /* The VDBE cursor used to access pIdx */ + int addrBrk; /* Jump here to break out of the loop */ + int addrNxt; /* Jump here to start the next IN combination */ + int addrSkip; /* Jump here for next iteration of skip-scan */ + int addrCont; /* Jump here to continue with the next loop cycle */ + int addrFirst; /* First instruction of interior of the loop */ + int addrBody; /* Beginning of the body of this loop */ + int regBignull; /* big-null flag reg. True if a NULL-scan is needed */ + int addrBignull; /* Jump here for next part of big-null scan */ +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */ + int addrLikeRep; /* LIKE range processing address */ +#endif + u8 iFrom; /* Which entry in the FROM clause */ + u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ + int p1, p2; /* Operands of the opcode used to end the loop */ + union { /* Information that depends on pWLoop->wsFlags */ + struct { + int nIn; /* Number of entries in aInLoop[] */ + struct InLoop { + int iCur; /* The VDBE cursor used by this IN operator */ + int addrInTop; /* Top of the IN loop */ + int iBase; /* Base register of multi-key index record */ + int nPrefix; /* Number of prior entires in the key */ + u8 eEndLoopOp; /* IN Loop terminator. OP_Next or OP_Prev */ + } *aInLoop; /* Information about each nested IN operator */ + } in; /* Used when pWLoop->wsFlags&WHERE_IN_ABLE */ + Index *pCovidx; /* Possible covering index for WHERE_MULTI_OR */ + } u; + struct WhereLoop *pWLoop; /* The selected WhereLoop object */ + Bitmask notReady; /* FROM entries not usable at this level */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + int addrVisit; /* Address at which row is visited */ +#endif +}; + +/* +** Each instance of this object represents an algorithm for evaluating one +** term of a join. Every term of the FROM clause will have at least +** one corresponding WhereLoop object (unless INDEXED BY constraints +** prevent a query solution - which is an error) and many terms of the +** FROM clause will have multiple WhereLoop objects, each describing a +** potential way of implementing that FROM-clause term, together with +** dependencies and cost estimates for using the chosen algorithm. +** +** Query planning consists of building up a collection of these WhereLoop +** objects, then computing a particular sequence of WhereLoop objects, with +** one WhereLoop object per FROM clause term, that satisfy all dependencies +** and that minimize the overall cost. +*/ +struct WhereLoop { + Bitmask prereq; /* Bitmask of other loops that must run first */ + Bitmask maskSelf; /* Bitmask identifying table iTab */ +#ifdef SQLITE_DEBUG + char cId; /* Symbolic ID of this loop for debugging use */ +#endif + u8 iTab; /* Position in FROM clause of table for this loop */ + u8 iSortIdx; /* Sorting index number. 0==None */ + LogEst rSetup; /* One-time setup cost (ex: create transient index) */ + LogEst rRun; /* Cost of running each loop */ + LogEst nOut; /* Estimated number of output rows */ + union { + struct { /* Information for internal btree tables */ + u16 nEq; /* Number of equality constraints */ + u16 nBtm; /* Size of BTM vector */ + u16 nTop; /* Size of TOP vector */ + u16 nDistinctCol; /* Index columns used to sort for DISTINCT */ + Index *pIndex; /* Index used, or NULL */ + } btree; + struct { /* Information for virtual tables */ + int idxNum; /* Index number */ + u8 needFree; /* True if sqlite3_free(idxStr) is needed */ + i8 isOrdered; /* True if satisfies ORDER BY */ + u16 omitMask; /* Terms that may be omitted */ + char *idxStr; /* Index identifier string */ + } vtab; + } u; + u32 wsFlags; /* WHERE_* flags describing the plan */ + u16 nLTerm; /* Number of entries in aLTerm[] */ + u16 nSkip; /* Number of NULL aLTerm[] entries */ + /**** whereLoopXfer() copies fields above ***********************/ +# define WHERE_LOOP_XFER_SZ offsetof(WhereLoop,nLSlot) + u16 nLSlot; /* Number of slots allocated for aLTerm[] */ + WhereTerm **aLTerm; /* WhereTerms used */ + WhereLoop *pNextLoop; /* Next WhereLoop object in the WhereClause */ + WhereTerm *aLTermSpace[3]; /* Initial aLTerm[] space */ +}; + +/* This object holds the prerequisites and the cost of running a +** subquery on one operand of an OR operator in the WHERE clause. +** See WhereOrSet for additional information +*/ +struct WhereOrCost { + Bitmask prereq; /* Prerequisites */ + LogEst rRun; /* Cost of running this subquery */ + LogEst nOut; /* Number of outputs for this subquery */ +}; + +/* The WhereOrSet object holds a set of possible WhereOrCosts that +** correspond to the subquery(s) of OR-clause processing. Only the +** best N_OR_COST elements are retained. +*/ +#define N_OR_COST 3 +struct WhereOrSet { + u16 n; /* Number of valid a[] entries */ + WhereOrCost a[N_OR_COST]; /* Set of best costs */ +}; + +/* +** Each instance of this object holds a sequence of WhereLoop objects +** that implement some or all of a query plan. +** +** Think of each WhereLoop object as a node in a graph with arcs +** showing dependencies and costs for travelling between nodes. (That is +** not a completely accurate description because WhereLoop costs are a +** vector, not a scalar, and because dependencies are many-to-one, not +** one-to-one as are graph nodes. But it is a useful visualization aid.) +** Then a WherePath object is a path through the graph that visits some +** or all of the WhereLoop objects once. +** +** The "solver" works by creating the N best WherePath objects of length +** 1. Then using those as a basis to compute the N best WherePath objects +** of length 2. And so forth until the length of WherePaths equals the +** number of nodes in the FROM clause. The best (lowest cost) WherePath +** at the end is the chosen query plan. +*/ +struct WherePath { + Bitmask maskLoop; /* Bitmask of all WhereLoop objects in this path */ + Bitmask revLoop; /* aLoop[]s that should be reversed for ORDER BY */ + LogEst nRow; /* Estimated number of rows generated by this path */ + LogEst rCost; /* Total cost of this path */ + LogEst rUnsorted; /* Total cost of this path ignoring sorting costs */ + i8 isOrdered; /* No. of ORDER BY terms satisfied. -1 for unknown */ + WhereLoop **aLoop; /* Array of WhereLoop objects implementing this path */ +}; + +/* +** The query generator uses an array of instances of this structure to +** help it analyze the subexpressions of the WHERE clause. Each WHERE +** clause subexpression is separated from the others by AND operators, +** usually, or sometimes subexpressions separated by OR. +** +** All WhereTerms are collected into a single WhereClause structure. +** The following identity holds: +** +** WhereTerm.pWC->a[WhereTerm.idx] == WhereTerm +** +** When a term is of the form: +** +** X +** +** where X is a column name and is one of certain operators, +** then WhereTerm.leftCursor and WhereTerm.u.leftColumn record the +** cursor number and column number for X. WhereTerm.eOperator records +** the using a bitmask encoding defined by WO_xxx below. The +** use of a bitmask encoding for the operator allows us to search +** quickly for terms that match any of several different operators. +** +** A WhereTerm might also be two or more subterms connected by OR: +** +** (t1.X ) OR (t1.Y ) OR .... +** +** In this second case, wtFlag has the TERM_ORINFO bit set and eOperator==WO_OR +** and the WhereTerm.u.pOrInfo field points to auxiliary information that +** is collected about the OR clause. +** +** If a term in the WHERE clause does not match either of the two previous +** categories, then eOperator==0. The WhereTerm.pExpr field is still set +** to the original subexpression content and wtFlags is set up appropriately +** but no other fields in the WhereTerm object are meaningful. +** +** When eOperator!=0, prereqRight and prereqAll record sets of cursor numbers, +** but they do so indirectly. A single WhereMaskSet structure translates +** cursor number into bits and the translated bit is stored in the prereq +** fields. The translation is used in order to maximize the number of +** bits that will fit in a Bitmask. The VDBE cursor numbers might be +** spread out over the non-negative integers. For example, the cursor +** numbers might be 3, 8, 9, 10, 20, 23, 41, and 45. The WhereMaskSet +** translates these sparse cursor numbers into consecutive integers +** beginning with 0 in order to make the best possible use of the available +** bits in the Bitmask. So, in the example above, the cursor numbers +** would be mapped into integers 0 through 7. +** +** The number of terms in a join is limited by the number of bits +** in prereqRight and prereqAll. The default is 64 bits, hence SQLite +** is only able to process joins with 64 or fewer tables. +*/ +struct WhereTerm { + Expr *pExpr; /* Pointer to the subexpression that is this term */ + WhereClause *pWC; /* The clause this term is part of */ + LogEst truthProb; /* Probability of truth for this expression */ + u16 wtFlags; /* TERM_xxx bit flags. See below */ + u16 eOperator; /* A WO_xx value describing */ + u8 nChild; /* Number of children that must disable us */ + u8 eMatchOp; /* Op for vtab MATCH/LIKE/GLOB/REGEXP terms */ + int iParent; /* Disable pWC->a[iParent] when this term disabled */ + int leftCursor; /* Cursor number of X in "X " */ + int iField; /* Field in (?,?,?) IN (SELECT...) vector */ + union { + int leftColumn; /* Column number of X in "X " */ + WhereOrInfo *pOrInfo; /* Extra information if (eOperator & WO_OR)!=0 */ + WhereAndInfo *pAndInfo; /* Extra information if (eOperator& WO_AND)!=0 */ + } u; + Bitmask prereqRight; /* Bitmask of tables used by pExpr->pRight */ + Bitmask prereqAll; /* Bitmask of tables referenced by pExpr */ +}; + +/* +** Allowed values of WhereTerm.wtFlags +*/ +#define TERM_DYNAMIC 0x0001 /* Need to call sqlite3ExprDelete(db, pExpr) */ +#define TERM_VIRTUAL 0x0002 /* Added by the optimizer. Do not code */ +#define TERM_CODED 0x0004 /* This term is already coded */ +#define TERM_COPIED 0x0008 /* Has a child */ +#define TERM_ORINFO 0x0010 /* Need to free the WhereTerm.u.pOrInfo object */ +#define TERM_ANDINFO 0x0020 /* Need to free the WhereTerm.u.pAndInfo obj */ +#define TERM_OR_OK 0x0040 /* Used during OR-clause processing */ +#ifdef SQLITE_ENABLE_STAT4 +# define TERM_VNULL 0x0080 /* Manufactured x>NULL or x<=NULL term */ +#else +# define TERM_VNULL 0x0000 /* Disabled if not using stat4 */ +#endif +#define TERM_LIKEOPT 0x0100 /* Virtual terms from the LIKE optimization */ +#define TERM_LIKECOND 0x0200 /* Conditionally this LIKE operator term */ +#define TERM_LIKE 0x0400 /* The original LIKE operator */ +#define TERM_IS 0x0800 /* Term.pExpr is an IS operator */ +#define TERM_VARSELECT 0x1000 /* Term.pExpr contains a correlated sub-query */ +#define TERM_HEURTRUTH 0x2000 /* Heuristic truthProb used */ +#ifdef SQLITE_ENABLE_STAT4 +# define TERM_HIGHTRUTH 0x4000 /* Term excludes few rows */ +#else +# define TERM_HIGHTRUTH 0 /* Only used with STAT4 */ +#endif + +/* +** An instance of the WhereScan object is used as an iterator for locating +** terms in the WHERE clause that are useful to the query planner. +*/ +struct WhereScan { + WhereClause *pOrigWC; /* Original, innermost WhereClause */ + WhereClause *pWC; /* WhereClause currently being scanned */ + const char *zCollName; /* Required collating sequence, if not NULL */ + Expr *pIdxExpr; /* Search for this index expression */ + char idxaff; /* Must match this affinity, if zCollName!=NULL */ + unsigned char nEquiv; /* Number of entries in aEquiv[] */ + unsigned char iEquiv; /* Next unused slot in aEquiv[] */ + u32 opMask; /* Acceptable operators */ + int k; /* Resume scanning at this->pWC->a[this->k] */ + int aiCur[11]; /* Cursors in the equivalence class */ + i16 aiColumn[11]; /* Corresponding column number in the eq-class */ +}; + +/* +** An instance of the following structure holds all information about a +** WHERE clause. Mostly this is a container for one or more WhereTerms. +** +** Explanation of pOuter: For a WHERE clause of the form +** +** a AND ((b AND c) OR (d AND e)) AND f +** +** There are separate WhereClause objects for the whole clause and for +** the subclauses "(b AND c)" and "(d AND e)". The pOuter field of the +** subclauses points to the WhereClause object for the whole clause. +*/ +struct WhereClause { + WhereInfo *pWInfo; /* WHERE clause processing context */ + WhereClause *pOuter; /* Outer conjunction */ + u8 op; /* Split operator. TK_AND or TK_OR */ + u8 hasOr; /* True if any a[].eOperator is WO_OR */ + int nTerm; /* Number of terms */ + int nSlot; /* Number of entries in a[] */ + WhereTerm *a; /* Each a[] describes a term of the WHERE cluase */ +#if defined(SQLITE_SMALL_STACK) + WhereTerm aStatic[1]; /* Initial static space for a[] */ +#else + WhereTerm aStatic[8]; /* Initial static space for a[] */ +#endif +}; + +/* +** A WhereTerm with eOperator==WO_OR has its u.pOrInfo pointer set to +** a dynamically allocated instance of the following structure. +*/ +struct WhereOrInfo { + WhereClause wc; /* Decomposition into subterms */ + Bitmask indexable; /* Bitmask of all indexable tables in the clause */ +}; + +/* +** A WhereTerm with eOperator==WO_AND has its u.pAndInfo pointer set to +** a dynamically allocated instance of the following structure. +*/ +struct WhereAndInfo { + WhereClause wc; /* The subexpression broken out */ +}; + +/* +** An instance of the following structure keeps track of a mapping +** between VDBE cursor numbers and bits of the bitmasks in WhereTerm. +** +** The VDBE cursor numbers are small integers contained in +** SrcList_item.iCursor and Expr.iTable fields. For any given WHERE +** clause, the cursor numbers might not begin with 0 and they might +** contain gaps in the numbering sequence. But we want to make maximum +** use of the bits in our bitmasks. This structure provides a mapping +** from the sparse cursor numbers into consecutive integers beginning +** with 0. +** +** If WhereMaskSet.ix[A]==B it means that The A-th bit of a Bitmask +** corresponds VDBE cursor number B. The A-th bit of a bitmask is 1<3, 5->1, 8->2, 29->0, +** 57->5, 73->4. Or one of 719 other combinations might be used. It +** does not really matter. What is important is that sparse cursor +** numbers all get mapped into bit numbers that begin with 0 and contain +** no gaps. +*/ +struct WhereMaskSet { + int bVarSelect; /* Used by sqlite3WhereExprUsage() */ + int n; /* Number of assigned cursor values */ + int ix[BMS]; /* Cursor assigned to each bit */ +}; + +/* +** Initialize a WhereMaskSet object +*/ +#define initMaskSet(P) (P)->n=0 + +/* +** This object is a convenience wrapper holding all information needed +** to construct WhereLoop objects for a particular query. +*/ +struct WhereLoopBuilder { + WhereInfo *pWInfo; /* Information about this WHERE */ + WhereClause *pWC; /* WHERE clause terms */ + ExprList *pOrderBy; /* ORDER BY clause */ + WhereLoop *pNew; /* Template WhereLoop */ + WhereOrSet *pOrSet; /* Record best loops here, if not NULL */ +#ifdef SQLITE_ENABLE_STAT4 + UnpackedRecord *pRec; /* Probe for stat4 (if required) */ + int nRecValid; /* Number of valid fields currently in pRec */ +#endif + unsigned char bldFlags1; /* First set of SQLITE_BLDF_* flags */ + unsigned char bldFlags2; /* Second set of SQLITE_BLDF_* flags */ + unsigned int iPlanLimit; /* Search limiter */ +}; + +/* Allowed values for WhereLoopBuider.bldFlags */ +#define SQLITE_BLDF1_INDEXED 0x0001 /* An index is used */ +#define SQLITE_BLDF1_UNIQUE 0x0002 /* All keys of a UNIQUE index used */ + +#define SQLITE_BLDF2_2NDPASS 0x0004 /* Second builder pass needed */ + +/* The WhereLoopBuilder.iPlanLimit is used to limit the number of +** index+constraint combinations the query planner will consider for a +** particular query. If this parameter is unlimited, then certain +** pathological queries can spend excess time in the sqlite3WhereBegin() +** routine. The limit is high enough that is should not impact real-world +** queries. +** +** SQLITE_QUERY_PLANNER_LIMIT is the baseline limit. The limit is +** increased by SQLITE_QUERY_PLANNER_LIMIT_INCR before each term of the FROM +** clause is processed, so that every table in a join is guaranteed to be +** able to propose a some index+constraint combinations even if the initial +** baseline limit was exhausted by prior tables of the join. +*/ +#ifndef SQLITE_QUERY_PLANNER_LIMIT +# define SQLITE_QUERY_PLANNER_LIMIT 20000 +#endif +#ifndef SQLITE_QUERY_PLANNER_LIMIT_INCR +# define SQLITE_QUERY_PLANNER_LIMIT_INCR 1000 +#endif + +/* +** Each instance of this object records a change to a single node +** in an expression tree to cause that node to point to a column +** of an index rather than an expression or a virtual column. All +** such transformations need to be undone at the end of WHERE clause +** processing. +*/ +typedef struct WhereExprMod WhereExprMod; +struct WhereExprMod { + WhereExprMod *pNext; /* Next translation on a list of them all */ + Expr *pExpr; /* The Expr node that was transformed */ + Expr orig; /* Original value of the Expr node */ +}; + +/* +** The WHERE clause processing routine has two halves. The +** first part does the start of the WHERE loop and the second +** half does the tail of the WHERE loop. An instance of +** this structure is returned by the first half and passed +** into the second half to give some continuity. +** +** An instance of this object holds the complete state of the query +** planner. +*/ +struct WhereInfo { + Parse *pParse; /* Parsing and code generating context */ + SrcList *pTabList; /* List of tables in the join */ + ExprList *pOrderBy; /* The ORDER BY clause or NULL */ + ExprList *pResultSet; /* Result set of the query */ + Expr *pWhere; /* The complete WHERE clause */ + int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */ + int iContinue; /* Jump here to continue with next record */ + int iBreak; /* Jump here to break out of the loop */ + int savedNQueryLoop; /* pParse->nQueryLoop outside the WHERE loop */ + u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */ + LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ + u8 nLevel; /* Number of nested loop */ + i8 nOBSat; /* Number of ORDER BY terms satisfied by indices */ + u8 eOnePass; /* ONEPASS_OFF, or _SINGLE, or _MULTI */ + u8 eDistinct; /* One of the WHERE_DISTINCT_* values */ + unsigned bDeferredSeek :1; /* Uses OP_DeferredSeek */ + unsigned untestedTerms :1; /* Not all WHERE terms resolved by outer loop */ + unsigned bOrderedInnerLoop:1;/* True if only the inner-most loop is ordered */ + unsigned sorted :1; /* True if really sorted (not just grouped) */ + LogEst nRowOut; /* Estimated number of output rows */ + int iTop; /* The very beginning of the WHERE loop */ + WhereLoop *pLoops; /* List of all WhereLoop objects */ + WhereExprMod *pExprMods; /* Expression modifications */ + Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ + WhereClause sWC; /* Decomposition of the WHERE clause */ + WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ + WhereLevel a[1]; /* Information about each nest loop in WHERE */ +}; + +/* +** Private interfaces - callable only by other where.c routines. +** +** where.c: +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet*,int); +#ifdef WHERETRACE_ENABLED +SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC); +SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm); +SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC); +#endif +SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( + WhereClause *pWC, /* The WHERE clause to be searched */ + int iCur, /* Cursor number of LHS */ + int iColumn, /* Column number of LHS */ + Bitmask notReady, /* RHS must not overlap with this mask */ + u32 op, /* Mask of WO_xx values describing operator */ + Index *pIdx /* Must be compatible with this index, if not NULL */ +); + +/* wherecode.c: */ +#ifndef SQLITE_OMIT_EXPLAIN +SQLITE_PRIVATE int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +); +#else +# define sqlite3WhereExplainOneScan(u,v,w,x) 0 +#endif /* SQLITE_OMIT_EXPLAIN */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +SQLITE_PRIVATE void sqlite3WhereAddScanStatus( + Vdbe *v, /* Vdbe to add scanstatus entry to */ + SrcList *pSrclist, /* FROM clause pLvl reads data from */ + WhereLevel *pLvl, /* Level to add scanstatus() entry for */ + int addrExplain /* Address of OP_Explain (or 0) */ +); +#else +# define sqlite3WhereAddScanStatus(a, b, c, d) ((void)d) +#endif +SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ + Bitmask notReady /* Which tables are currently available */ +); + +/* whereexpr.c: */ +SQLITE_PRIVATE void sqlite3WhereClauseInit(WhereClause*,WhereInfo*); +SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause*); +SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause*,Expr*,u8); +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet*, Expr*); +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet*, Expr*); +SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet*, ExprList*); +SQLITE_PRIVATE void sqlite3WhereExprAnalyze(SrcList*, WhereClause*); +SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, struct SrcList_item*, WhereClause*); + + + + + +/* +** Bitmasks for the operators on WhereTerm objects. These are all +** operators that are of interest to the query planner. An +** OR-ed combination of these values can be used when searching for +** particular WhereTerms within a WhereClause. +** +** Value constraints: +** WO_EQ == SQLITE_INDEX_CONSTRAINT_EQ +** WO_LT == SQLITE_INDEX_CONSTRAINT_LT +** WO_LE == SQLITE_INDEX_CONSTRAINT_LE +** WO_GT == SQLITE_INDEX_CONSTRAINT_GT +** WO_GE == SQLITE_INDEX_CONSTRAINT_GE +*/ +#define WO_IN 0x0001 +#define WO_EQ 0x0002 +#define WO_LT (WO_EQ<<(TK_LT-TK_EQ)) +#define WO_LE (WO_EQ<<(TK_LE-TK_EQ)) +#define WO_GT (WO_EQ<<(TK_GT-TK_EQ)) +#define WO_GE (WO_EQ<<(TK_GE-TK_EQ)) +#define WO_AUX 0x0040 /* Op useful to virtual tables only */ +#define WO_IS 0x0080 +#define WO_ISNULL 0x0100 +#define WO_OR 0x0200 /* Two or more OR-connected terms */ +#define WO_AND 0x0400 /* Two or more AND-connected terms */ +#define WO_EQUIV 0x0800 /* Of the form A==B, both columns */ +#define WO_NOOP 0x1000 /* This term does not restrict search space */ + +#define WO_ALL 0x1fff /* Mask of all possible WO_* values */ +#define WO_SINGLE 0x01ff /* Mask of all non-compound WO_* values */ + +/* +** These are definitions of bits in the WhereLoop.wsFlags field. +** The particular combination of bits in each WhereLoop help to +** determine the algorithm that WhereLoop represents. +*/ +#define WHERE_COLUMN_EQ 0x00000001 /* x=EXPR */ +#define WHERE_COLUMN_RANGE 0x00000002 /* xEXPR */ +#define WHERE_COLUMN_IN 0x00000004 /* x IN (...) */ +#define WHERE_COLUMN_NULL 0x00000008 /* x IS NULL */ +#define WHERE_CONSTRAINT 0x0000000f /* Any of the WHERE_COLUMN_xxx values */ +#define WHERE_TOP_LIMIT 0x00000010 /* xEXPR or x>=EXPR constraint */ +#define WHERE_BOTH_LIMIT 0x00000030 /* Both x>EXPR and xaiColumn[i]; + if( i==XN_EXPR ) return ""; + if( i==XN_ROWID ) return "rowid"; + return pIdx->pTable->aCol[i].zName; +} + +/* +** This routine is a helper for explainIndexRange() below +** +** pStr holds the text of an expression that we are building up one term +** at a time. This routine adds a new term to the end of the expression. +** Terms are separated by AND so add the "AND" text for second and subsequent +** terms only. +*/ +static void explainAppendTerm( + StrAccum *pStr, /* The text expression being built */ + Index *pIdx, /* Index to read column names from */ + int nTerm, /* Number of terms */ + int iTerm, /* Zero-based index of first term. */ + int bAnd, /* Non-zero to append " AND " */ + const char *zOp /* Name of the operator */ +){ + int i; + + assert( nTerm>=1 ); + if( bAnd ) sqlite3_str_append(pStr, " AND ", 5); + + if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1); + for(i=0; i1 ) sqlite3_str_append(pStr, ")", 1); + + sqlite3_str_append(pStr, zOp, 1); + + if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1); + for(i=0; i1 ) sqlite3_str_append(pStr, ")", 1); +} + +/* +** Argument pLevel describes a strategy for scanning table pTab. This +** function appends text to pStr that describes the subset of table +** rows scanned by the strategy in the form of an SQL expression. +** +** For example, if the query: +** +** SELECT * FROM t1 WHERE a=1 AND b>2; +** +** is run and there is an index on (a, b), then this function returns a +** string similar to: +** +** "a=? AND b>?" +*/ +static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){ + Index *pIndex = pLoop->u.btree.pIndex; + u16 nEq = pLoop->u.btree.nEq; + u16 nSkip = pLoop->nSkip; + int i, j; + + if( nEq==0 && (pLoop->wsFlags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ) return; + sqlite3_str_append(pStr, " (", 2); + for(i=0; i=nSkip ? "%s=?" : "ANY(%s)", z); + } + + j = i; + if( pLoop->wsFlags&WHERE_BTM_LIMIT ){ + explainAppendTerm(pStr, pIndex, pLoop->u.btree.nBtm, j, i, ">"); + i = 1; + } + if( pLoop->wsFlags&WHERE_TOP_LIMIT ){ + explainAppendTerm(pStr, pIndex, pLoop->u.btree.nTop, j, i, "<"); + } + sqlite3_str_append(pStr, ")", 1); +} + +/* +** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN +** command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was +** defined at compile-time. If it is not a no-op, a single OP_Explain opcode +** is added to the output to describe the table scan strategy in pLevel. +** +** If an OP_Explain opcode is added to the VM, its address is returned. +** Otherwise, if no OP_Explain is coded, zero is returned. +*/ +SQLITE_PRIVATE int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +){ + int ret = 0; +#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS) + if( sqlite3ParseToplevel(pParse)->explain==2 ) +#endif + { + struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom]; + Vdbe *v = pParse->pVdbe; /* VM being constructed */ + sqlite3 *db = pParse->db; /* Database handle */ + int isSearch; /* True for a SEARCH. False for SCAN. */ + WhereLoop *pLoop; /* The controlling WhereLoop object */ + u32 flags; /* Flags that describe this loop */ + char *zMsg; /* Text to add to EQP output */ + StrAccum str; /* EQP output string */ + char zBuf[100]; /* Initial space for EQP output string */ + + pLoop = pLevel->pWLoop; + flags = pLoop->wsFlags; + if( (flags&WHERE_MULTI_OR) || (wctrlFlags&WHERE_OR_SUBCLAUSE) ) return 0; + + isSearch = (flags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0 + || ((flags&WHERE_VIRTUALTABLE)==0 && (pLoop->u.btree.nEq>0)) + || (wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX)); + + sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH); + sqlite3_str_appendall(&str, isSearch ? "SEARCH" : "SCAN"); + if( pItem->pSelect ){ + sqlite3_str_appendf(&str, " SUBQUERY %u", pItem->pSelect->selId); + }else{ + sqlite3_str_appendf(&str, " TABLE %s", pItem->zName); + } + + if( pItem->zAlias ){ + sqlite3_str_appendf(&str, " AS %s", pItem->zAlias); + } + if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 ){ + const char *zFmt = 0; + Index *pIdx; + + assert( pLoop->u.btree.pIndex!=0 ); + pIdx = pLoop->u.btree.pIndex; + assert( !(flags&WHERE_AUTO_INDEX) || (flags&WHERE_IDX_ONLY) ); + if( !HasRowid(pItem->pTab) && IsPrimaryKeyIndex(pIdx) ){ + if( isSearch ){ + zFmt = "PRIMARY KEY"; + } + }else if( flags & WHERE_PARTIALIDX ){ + zFmt = "AUTOMATIC PARTIAL COVERING INDEX"; + }else if( flags & WHERE_AUTO_INDEX ){ + zFmt = "AUTOMATIC COVERING INDEX"; + }else if( flags & WHERE_IDX_ONLY ){ + zFmt = "COVERING INDEX %s"; + }else{ + zFmt = "INDEX %s"; + } + if( zFmt ){ + sqlite3_str_append(&str, " USING ", 7); + sqlite3_str_appendf(&str, zFmt, pIdx->zName); + explainIndexRange(&str, pLoop); + } + }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){ + const char *zRangeOp; + if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){ + zRangeOp = "="; + }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){ + zRangeOp = ">? AND rowid<"; + }else if( flags&WHERE_BTM_LIMIT ){ + zRangeOp = ">"; + }else{ + assert( flags&WHERE_TOP_LIMIT); + zRangeOp = "<"; + } + sqlite3_str_appendf(&str, + " USING INTEGER PRIMARY KEY (rowid%s?)",zRangeOp); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + else if( (flags & WHERE_VIRTUALTABLE)!=0 ){ + sqlite3_str_appendf(&str, " VIRTUAL TABLE INDEX %d:%s", + pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr); + } +#endif +#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS + if( pLoop->nOut>=10 ){ + sqlite3_str_appendf(&str, " (~%llu rows)", + sqlite3LogEstToInt(pLoop->nOut)); + }else{ + sqlite3_str_append(&str, " (~1 row)", 9); + } +#endif + zMsg = sqlite3StrAccumFinish(&str); + sqlite3ExplainBreakpoint("",zMsg); + ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), + pParse->addrExplain, 0, zMsg,P4_DYNAMIC); + } + return ret; +} +#endif /* SQLITE_OMIT_EXPLAIN */ + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +/* +** Configure the VM passed as the first argument with an +** sqlite3_stmt_scanstatus() entry corresponding to the scan used to +** implement level pLvl. Argument pSrclist is a pointer to the FROM +** clause that the scan reads data from. +** +** If argument addrExplain is not 0, it must be the address of an +** OP_Explain instruction that describes the same loop. +*/ +SQLITE_PRIVATE void sqlite3WhereAddScanStatus( + Vdbe *v, /* Vdbe to add scanstatus entry to */ + SrcList *pSrclist, /* FROM clause pLvl reads data from */ + WhereLevel *pLvl, /* Level to add scanstatus() entry for */ + int addrExplain /* Address of OP_Explain (or 0) */ +){ + const char *zObj = 0; + WhereLoop *pLoop = pLvl->pWLoop; + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){ + zObj = pLoop->u.btree.pIndex->zName; + }else{ + zObj = pSrclist->a[pLvl->iFrom].zName; + } + sqlite3VdbeScanStatus( + v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj + ); +} +#endif + + +/* +** Disable a term in the WHERE clause. Except, do not disable the term +** if it controls a LEFT OUTER JOIN and it did not originate in the ON +** or USING clause of that join. +** +** Consider the term t2.z='ok' in the following queries: +** +** (1) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x WHERE t2.z='ok' +** (2) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x AND t2.z='ok' +** (3) SELECT * FROM t1, t2 WHERE t1.a=t2.x AND t2.z='ok' +** +** The t2.z='ok' is disabled in the in (2) because it originates +** in the ON clause. The term is disabled in (3) because it is not part +** of a LEFT OUTER JOIN. In (1), the term is not disabled. +** +** Disabling a term causes that term to not be tested in the inner loop +** of the join. Disabling is an optimization. When terms are satisfied +** by indices, we disable them to prevent redundant tests in the inner +** loop. We would get the correct results if nothing were ever disabled, +** but joins might run a little slower. The trick is to disable as much +** as we can without disabling too much. If we disabled in (1), we'd get +** the wrong answer. See ticket #813. +** +** If all the children of a term are disabled, then that term is also +** automatically disabled. In this way, terms get disabled if derived +** virtual terms are tested first. For example: +** +** x GLOB 'abc*' AND x>='abc' AND x<'acd' +** \___________/ \______/ \_____/ +** parent child1 child2 +** +** Only the parent term was in the original WHERE clause. The child1 +** and child2 terms were added by the LIKE optimization. If both of +** the virtual child terms are valid, then testing of the parent can be +** skipped. +** +** Usually the parent term is marked as TERM_CODED. But if the parent +** term was originally TERM_LIKE, then the parent gets TERM_LIKECOND instead. +** The TERM_LIKECOND marking indicates that the term should be coded inside +** a conditional such that is only evaluated on the second pass of a +** LIKE-optimization loop, when scanning BLOBs instead of strings. +*/ +static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ + int nLoop = 0; + assert( pTerm!=0 ); + while( (pTerm->wtFlags & TERM_CODED)==0 + && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + && (pLevel->notReady & pTerm->prereqAll)==0 + ){ + if( nLoop && (pTerm->wtFlags & TERM_LIKE)!=0 ){ + pTerm->wtFlags |= TERM_LIKECOND; + }else{ + pTerm->wtFlags |= TERM_CODED; + } + if( pTerm->iParent<0 ) break; + pTerm = &pTerm->pWC->a[pTerm->iParent]; + assert( pTerm!=0 ); + pTerm->nChild--; + if( pTerm->nChild!=0 ) break; + nLoop++; + } +} + +/* +** Code an OP_Affinity opcode to apply the column affinity string zAff +** to the n registers starting at base. +** +** As an optimization, SQLITE_AFF_BLOB and SQLITE_AFF_NONE entries (which +** are no-ops) at the beginning and end of zAff are ignored. If all entries +** in zAff are SQLITE_AFF_BLOB or SQLITE_AFF_NONE, then no code gets generated. +** +** This routine makes its own copy of zAff so that the caller is free +** to modify zAff after this routine returns. +*/ +static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ + Vdbe *v = pParse->pVdbe; + if( zAff==0 ){ + assert( pParse->db->mallocFailed ); + return; + } + assert( v!=0 ); + + /* Adjust base and n to skip over SQLITE_AFF_BLOB and SQLITE_AFF_NONE + ** entries at the beginning and end of the affinity string. + */ + assert( SQLITE_AFF_NONE0 && zAff[0]<=SQLITE_AFF_BLOB ){ + n--; + base++; + zAff++; + } + while( n>1 && zAff[n-1]<=SQLITE_AFF_BLOB ){ + n--; + } + + /* Code the OP_Affinity opcode if there is anything left to do. */ + if( n>0 ){ + sqlite3VdbeAddOp4(v, OP_Affinity, base, n, 0, zAff, n); + } +} + +/* +** Expression pRight, which is the RHS of a comparison operation, is +** either a vector of n elements or, if n==1, a scalar expression. +** Before the comparison operation, affinity zAff is to be applied +** to the pRight values. This function modifies characters within the +** affinity string to SQLITE_AFF_BLOB if either: +** +** * the comparison will be performed with no affinity, or +** * the affinity change in zAff is guaranteed not to change the value. +*/ +static void updateRangeAffinityStr( + Expr *pRight, /* RHS of comparison */ + int n, /* Number of vector elements in comparison */ + char *zAff /* Affinity string to modify */ +){ + int i; + for(i=0; idb; + Expr *pNew; + pNew = sqlite3ExprDup(db, pX, 0); + if( db->mallocFailed==0 ){ + ExprList *pOrigRhs = pNew->x.pSelect->pEList; /* Original unmodified RHS */ + ExprList *pOrigLhs = pNew->pLeft->x.pList; /* Original unmodified LHS */ + ExprList *pRhs = 0; /* New RHS after modifications */ + ExprList *pLhs = 0; /* New LHS after mods */ + int i; /* Loop counter */ + Select *pSelect; /* Pointer to the SELECT on the RHS */ + + for(i=iEq; inLTerm; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + int iField = pLoop->aLTerm[i]->iField - 1; + if( pOrigRhs->a[iField].pExpr==0 ) continue; /* Duplicate PK column */ + pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr); + pOrigRhs->a[iField].pExpr = 0; + assert( pOrigLhs->a[iField].pExpr!=0 ); + pLhs = sqlite3ExprListAppend(pParse, pLhs, pOrigLhs->a[iField].pExpr); + pOrigLhs->a[iField].pExpr = 0; + } + } + sqlite3ExprListDelete(db, pOrigRhs); + sqlite3ExprListDelete(db, pOrigLhs); + pNew->pLeft->x.pList = pLhs; + pNew->x.pSelect->pEList = pRhs; + if( pLhs && pLhs->nExpr==1 ){ + /* Take care here not to generate a TK_VECTOR containing only a + ** single value. Since the parser never creates such a vector, some + ** of the subroutines do not handle this case. */ + Expr *p = pLhs->a[0].pExpr; + pLhs->a[0].pExpr = 0; + sqlite3ExprDelete(db, pNew->pLeft); + pNew->pLeft = p; + } + pSelect = pNew->x.pSelect; + if( pSelect->pOrderBy ){ + /* If the SELECT statement has an ORDER BY clause, zero the + ** iOrderByCol variables. These are set to non-zero when an + ** ORDER BY term exactly matches one of the terms of the + ** result-set. Since the result-set of the SELECT statement may + ** have been modified or reordered, these variables are no longer + ** set correctly. Since setting them is just an optimization, + ** it's easiest just to zero them here. */ + ExprList *pOrderBy = pSelect->pOrderBy; + for(i=0; inExpr; i++){ + pOrderBy->a[i].u.x.iOrderByCol = 0; + } + } + +#if 0 + printf("For indexing, change the IN expr:\n"); + sqlite3TreeViewExpr(0, pX, 0); + printf("Into:\n"); + sqlite3TreeViewExpr(0, pNew, 0); +#endif + } + return pNew; +} + + +/* +** Generate code for a single equality term of the WHERE clause. An equality +** term can be either X=expr or X IN (...). pTerm is the term to be +** coded. +** +** The current value for the constraint is left in a register, the index +** of which is returned. An attempt is made store the result in iTarget but +** this is only guaranteed for TK_ISNULL and TK_IN constraints. If the +** constraint is a TK_EQ or TK_IS, then the current value might be left in +** some other register and it is the caller's responsibility to compensate. +** +** For a constraint of the form X=expr, the expression is evaluated in +** straight-line code. For constraints of the form X IN (...) +** this routine sets up a loop that will iterate over all values of X. +*/ +static int codeEqualityTerm( + Parse *pParse, /* The parsing context */ + WhereTerm *pTerm, /* The term of the WHERE clause to be coded */ + WhereLevel *pLevel, /* The level of the FROM clause we are working on */ + int iEq, /* Index of the equality term within this level */ + int bRev, /* True for reverse-order IN operations */ + int iTarget /* Attempt to leave results in this register */ +){ + Expr *pX = pTerm->pExpr; + Vdbe *v = pParse->pVdbe; + int iReg; /* Register holding results */ + + assert( pLevel->pWLoop->aLTerm[iEq]==pTerm ); + assert( iTarget>0 ); + if( pX->op==TK_EQ || pX->op==TK_IS ){ + iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget); + }else if( pX->op==TK_ISNULL ){ + iReg = iTarget; + sqlite3VdbeAddOp2(v, OP_Null, 0, iReg); +#ifndef SQLITE_OMIT_SUBQUERY + }else{ + int eType = IN_INDEX_NOOP; + int iTab; + struct InLoop *pIn; + WhereLoop *pLoop = pLevel->pWLoop; + int i; + int nEq = 0; + int *aiMap = 0; + + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 + && pLoop->u.btree.pIndex!=0 + && pLoop->u.btree.pIndex->aSortOrder[iEq] + ){ + testcase( iEq==0 ); + testcase( bRev ); + bRev = !bRev; + } + assert( pX->op==TK_IN ); + iReg = iTarget; + + for(i=0; iaLTerm[i] && pLoop->aLTerm[i]->pExpr==pX ){ + disableTerm(pLevel, pTerm); + return iTarget; + } + } + for(i=iEq;inLTerm; i++){ + assert( pLoop->aLTerm[i]!=0 ); + if( pLoop->aLTerm[i]->pExpr==pX ) nEq++; + } + + iTab = 0; + if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){ + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); + }else{ + sqlite3 *db = pParse->db; + pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); + + if( !db->mallocFailed ){ + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); + pTerm->pExpr->iTable = iTab; + } + sqlite3ExprDelete(db, pX); + pX = pTerm->pExpr; + } + + if( eType==IN_INDEX_INDEX_DESC ){ + testcase( bRev ); + bRev = !bRev; + } + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); + VdbeCoverageIf(v, bRev); + VdbeCoverageIf(v, !bRev); + assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); + + pLoop->wsFlags |= WHERE_IN_ABLE; + if( pLevel->u.in.nIn==0 ){ + pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); + } + + i = pLevel->u.in.nIn; + pLevel->u.in.nIn += nEq; + pLevel->u.in.aInLoop = + sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop, + sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); + pIn = pLevel->u.in.aInLoop; + if( pIn ){ + int iMap = 0; /* Index in aiMap[] */ + pIn += i; + for(i=iEq;inLTerm; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + int iOut = iReg + i - iEq; + if( eType==IN_INDEX_ROWID ){ + pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); + }else{ + int iCol = aiMap ? aiMap[iMap++] : 0; + pIn->addrInTop = sqlite3VdbeAddOp3(v,OP_Column,iTab, iCol, iOut); + } + sqlite3VdbeAddOp1(v, OP_IsNull, iOut); VdbeCoverage(v); + if( i==iEq ){ + pIn->iCur = iTab; + pIn->eEndLoopOp = bRev ? OP_Prev : OP_Next; + if( iEq>0 ){ + pIn->iBase = iReg - i; + pIn->nPrefix = i; + pLoop->wsFlags |= WHERE_IN_EARLYOUT; + }else{ + pIn->nPrefix = 0; + } + }else{ + pIn->eEndLoopOp = OP_Noop; + } + pIn++; + } + } + }else{ + pLevel->u.in.nIn = 0; + } + sqlite3DbFree(pParse->db, aiMap); +#endif + } + disableTerm(pLevel, pTerm); + return iReg; +} + +/* +** Generate code that will evaluate all == and IN constraints for an +** index scan. +** +** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c). +** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10 +** The index has as many as three equality constraints, but in this +** example, the third "c" value is an inequality. So only two +** constraints are coded. This routine will generate code to evaluate +** a==5 and b IN (1,2,3). The current values for a and b will be stored +** in consecutive registers and the index of the first register is returned. +** +** In the example above nEq==2. But this subroutine works for any value +** of nEq including 0. If nEq==0, this routine is nearly a no-op. +** The only thing it does is allocate the pLevel->iMem memory cell and +** compute the affinity string. +** +** The nExtraReg parameter is 0 or 1. It is 0 if all WHERE clause constraints +** are == or IN and are covered by the nEq. nExtraReg is 1 if there is +** an inequality constraint (such as the "c>=5 AND c<10" in the example) that +** occurs after the nEq quality constraints. +** +** This routine allocates a range of nEq+nExtraReg memory cells and returns +** the index of the first memory cell in that range. The code that +** calls this routine will use that memory range to store keys for +** start and termination conditions of the loop. +** key value of the loop. If one or more IN operators appear, then +** this routine allocates an additional nEq memory cells for internal +** use. +** +** Before returning, *pzAff is set to point to a buffer containing a +** copy of the column affinity string of the index allocated using +** sqlite3DbMalloc(). Except, entries in the copy of the string associated +** with equality constraints that use BLOB or NONE affinity are set to +** SQLITE_AFF_BLOB. This is to deal with SQL such as the following: +** +** CREATE TABLE t1(a TEXT PRIMARY KEY, b); +** SELECT ... FROM t1 AS t2, t1 WHERE t1.a = t2.b; +** +** In the example above, the index on t1(a) has TEXT affinity. But since +** the right hand side of the equality constraint (t2.b) has BLOB/NONE affinity, +** no conversion should be attempted before using a t2.b value as part of +** a key to search the index. Hence the first byte in the returned affinity +** string in this example would be set to SQLITE_AFF_BLOB. +*/ +static int codeAllEqualityTerms( + Parse *pParse, /* Parsing context */ + WhereLevel *pLevel, /* Which nested loop of the FROM we are coding */ + int bRev, /* Reverse the order of IN operators */ + int nExtraReg, /* Number of extra registers to allocate */ + char **pzAff /* OUT: Set to point to affinity string */ +){ + u16 nEq; /* The number of == or IN constraints to code */ + u16 nSkip; /* Number of left-most columns to skip */ + Vdbe *v = pParse->pVdbe; /* The vm under construction */ + Index *pIdx; /* The index being used for this loop */ + WhereTerm *pTerm; /* A single constraint term */ + WhereLoop *pLoop; /* The WhereLoop object */ + int j; /* Loop counter */ + int regBase; /* Base register */ + int nReg; /* Number of registers to allocate */ + char *zAff; /* Affinity string to return */ + + /* This module is only called on query plans that use an index. */ + pLoop = pLevel->pWLoop; + assert( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ); + nEq = pLoop->u.btree.nEq; + nSkip = pLoop->nSkip; + pIdx = pLoop->u.btree.pIndex; + assert( pIdx!=0 ); + + /* Figure out how many memory cells we will need then allocate them. + */ + regBase = pParse->nMem + 1; + nReg = pLoop->u.btree.nEq + nExtraReg; + pParse->nMem += nReg; + + zAff = sqlite3DbStrDup(pParse->db,sqlite3IndexAffinityStr(pParse->db,pIdx)); + assert( zAff!=0 || pParse->db->mallocFailed ); + + if( nSkip ){ + int iIdxCur = pLevel->iIdxCur; + sqlite3VdbeAddOp1(v, (bRev?OP_Last:OP_Rewind), iIdxCur); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + VdbeComment((v, "begin skip-scan on %s", pIdx->zName)); + j = sqlite3VdbeAddOp0(v, OP_Goto); + pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT), + iIdxCur, 0, regBase, nSkip); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + sqlite3VdbeJumpHere(v, j); + for(j=0; jaiColumn[j]==XN_EXPR ); + VdbeComment((v, "%s", explainIndexColumnName(pIdx, j))); + } + } + + /* Evaluate the equality constraints + */ + assert( zAff==0 || (int)strlen(zAff)>=nEq ); + for(j=nSkip; jaLTerm[j]; + assert( pTerm!=0 ); + /* The following testcase is true for indices with redundant columns. + ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */ + testcase( (pTerm->wtFlags & TERM_CODED)!=0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + r1 = codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, regBase+j); + if( r1!=regBase+j ){ + if( nReg==1 ){ + sqlite3ReleaseTempReg(pParse, regBase); + regBase = r1; + }else{ + sqlite3VdbeAddOp2(v, OP_SCopy, r1, regBase+j); + } + } + if( pTerm->eOperator & WO_IN ){ + if( pTerm->pExpr->flags & EP_xIsSelect ){ + /* No affinity ever needs to be (or should be) applied to a value + ** from the RHS of an "? IN (SELECT ...)" expression. The + ** sqlite3FindInIndex() routine has already ensured that the + ** affinity of the comparison has been applied to the value. */ + if( zAff ) zAff[j] = SQLITE_AFF_BLOB; + } + }else if( (pTerm->eOperator & WO_ISNULL)==0 ){ + Expr *pRight = pTerm->pExpr->pRight; + if( (pTerm->wtFlags & TERM_IS)==0 && sqlite3ExprCanBeNull(pRight) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); + VdbeCoverage(v); + } + if( zAff ){ + if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_BLOB ){ + zAff[j] = SQLITE_AFF_BLOB; + } + if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ + zAff[j] = SQLITE_AFF_BLOB; + } + } + } + } + *pzAff = zAff; + return regBase; +} + +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS +/* +** If the most recently coded instruction is a constant range constraint +** (a string literal) that originated from the LIKE optimization, then +** set P3 and P5 on the OP_String opcode so that the string will be cast +** to a BLOB at appropriate times. +** +** The LIKE optimization trys to evaluate "x LIKE 'abc%'" as a range +** expression: "x>='ABC' AND x<'abd'". But this requires that the range +** scan loop run twice, once for strings and a second time for BLOBs. +** The OP_String opcodes on the second pass convert the upper and lower +** bound string constants to blobs. This routine makes the necessary changes +** to the OP_String opcodes for that to happen. +** +** Except, of course, if SQLITE_LIKE_DOESNT_MATCH_BLOBS is defined, then +** only the one pass through the string space is required, so this routine +** becomes a no-op. +*/ +static void whereLikeOptimizationStringFixup( + Vdbe *v, /* prepared statement under construction */ + WhereLevel *pLevel, /* The loop that contains the LIKE operator */ + WhereTerm *pTerm /* The upper or lower bound just coded */ +){ + if( pTerm->wtFlags & TERM_LIKEOPT ){ + VdbeOp *pOp; + assert( pLevel->iLikeRepCntr>0 ); + pOp = sqlite3VdbeGetOp(v, -1); + assert( pOp!=0 ); + assert( pOp->opcode==OP_String8 + || pTerm->pWC->pWInfo->pParse->db->mallocFailed ); + pOp->p3 = (int)(pLevel->iLikeRepCntr>>1); /* Register holding counter */ + pOp->p5 = (u8)(pLevel->iLikeRepCntr&1); /* ASC or DESC */ + } +} +#else +# define whereLikeOptimizationStringFixup(A,B,C) +#endif + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Information is passed from codeCursorHint() down to individual nodes of +** the expression tree (by sqlite3WalkExpr()) using an instance of this +** structure. +*/ +struct CCurHint { + int iTabCur; /* Cursor for the main table */ + int iIdxCur; /* Cursor for the index, if pIdx!=0. Unused otherwise */ + Index *pIdx; /* The index used to access the table */ +}; + +/* +** This function is called for every node of an expression that is a candidate +** for a cursor hint on an index cursor. For TK_COLUMN nodes that reference +** the table CCurHint.iTabCur, verify that the same column can be +** accessed through the index. If it cannot, then set pWalker->eCode to 1. +*/ +static int codeCursorHintCheckExpr(Walker *pWalker, Expr *pExpr){ + struct CCurHint *pHint = pWalker->u.pCCurHint; + assert( pHint->pIdx!=0 ); + if( pExpr->op==TK_COLUMN + && pExpr->iTable==pHint->iTabCur + && sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn)<0 + ){ + pWalker->eCode = 1; + } + return WRC_Continue; +} + +/* +** Test whether or not expression pExpr, which was part of a WHERE clause, +** should be included in the cursor-hint for a table that is on the rhs +** of a LEFT JOIN. Set Walker.eCode to non-zero before returning if the +** expression is not suitable. +** +** An expression is unsuitable if it might evaluate to non NULL even if +** a TK_COLUMN node that does affect the value of the expression is set +** to NULL. For example: +** +** col IS NULL +** col IS NOT NULL +** coalesce(col, 1) +** CASE WHEN col THEN 0 ELSE 1 END +*/ +static int codeCursorHintIsOrFunction(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_IS + || pExpr->op==TK_ISNULL || pExpr->op==TK_ISNOT + || pExpr->op==TK_NOTNULL || pExpr->op==TK_CASE + ){ + pWalker->eCode = 1; + }else if( pExpr->op==TK_FUNCTION ){ + int d1; + char d2[4]; + if( 0==sqlite3IsLikeFunction(pWalker->pParse->db, pExpr, &d1, d2) ){ + pWalker->eCode = 1; + } + } + + return WRC_Continue; +} + + +/* +** This function is called on every node of an expression tree used as an +** argument to the OP_CursorHint instruction. If the node is a TK_COLUMN +** that accesses any table other than the one identified by +** CCurHint.iTabCur, then do the following: +** +** 1) allocate a register and code an OP_Column instruction to read +** the specified column into the new register, and +** +** 2) transform the expression node to a TK_REGISTER node that reads +** from the newly populated register. +** +** Also, if the node is a TK_COLUMN that does access the table idenified +** by pCCurHint.iTabCur, and an index is being used (which we will +** know because CCurHint.pIdx!=0) then transform the TK_COLUMN into +** an access of the index rather than the original table. +*/ +static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){ + int rc = WRC_Continue; + struct CCurHint *pHint = pWalker->u.pCCurHint; + if( pExpr->op==TK_COLUMN ){ + if( pExpr->iTable!=pHint->iTabCur ){ + int reg = ++pWalker->pParse->nMem; /* Register for column value */ + sqlite3ExprCode(pWalker->pParse, pExpr, reg); + pExpr->op = TK_REGISTER; + pExpr->iTable = reg; + }else if( pHint->pIdx!=0 ){ + pExpr->iTable = pHint->iIdxCur; + pExpr->iColumn = sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn); + assert( pExpr->iColumn>=0 ); + } + }else if( pExpr->op==TK_AGG_FUNCTION ){ + /* An aggregate function in the WHERE clause of a query means this must + ** be a correlated sub-query, and expression pExpr is an aggregate from + ** the parent context. Do not walk the function arguments in this case. + ** + ** todo: It should be possible to replace this node with a TK_REGISTER + ** expression, as the result of the expression must be stored in a + ** register at this point. The same holds for TK_AGG_COLUMN nodes. */ + rc = WRC_Prune; + } + return rc; +} + +/* +** Insert an OP_CursorHint instruction if it is appropriate to do so. +*/ +static void codeCursorHint( + struct SrcList_item *pTabItem, /* FROM clause item */ + WhereInfo *pWInfo, /* The where clause */ + WhereLevel *pLevel, /* Which loop to provide hints for */ + WhereTerm *pEndRange /* Hint this end-of-scan boundary term if not NULL */ +){ + Parse *pParse = pWInfo->pParse; + sqlite3 *db = pParse->db; + Vdbe *v = pParse->pVdbe; + Expr *pExpr = 0; + WhereLoop *pLoop = pLevel->pWLoop; + int iCur; + WhereClause *pWC; + WhereTerm *pTerm; + int i, j; + struct CCurHint sHint; + Walker sWalker; + + if( OptimizationDisabled(db, SQLITE_CursorHints) ) return; + iCur = pLevel->iTabCur; + assert( iCur==pWInfo->pTabList->a[pLevel->iFrom].iCursor ); + sHint.iTabCur = iCur; + sHint.iIdxCur = pLevel->iIdxCur; + sHint.pIdx = pLoop->u.btree.pIndex; + memset(&sWalker, 0, sizeof(sWalker)); + sWalker.pParse = pParse; + sWalker.u.pCCurHint = &sHint; + pWC = &pWInfo->sWC; + for(i=0; inTerm; i++){ + pTerm = &pWC->a[i]; + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( pTerm->prereqAll & pLevel->notReady ) continue; + + /* Any terms specified as part of the ON(...) clause for any LEFT + ** JOIN for which the current table is not the rhs are omitted + ** from the cursor-hint. + ** + ** If this table is the rhs of a LEFT JOIN, "IS" or "IS NULL" terms + ** that were specified as part of the WHERE clause must be excluded. + ** This is to address the following: + ** + ** SELECT ... t1 LEFT JOIN t2 ON (t1.a=t2.b) WHERE t2.c IS NULL; + ** + ** Say there is a single row in t2 that matches (t1.a=t2.b), but its + ** t2.c values is not NULL. If the (t2.c IS NULL) constraint is + ** pushed down to the cursor, this row is filtered out, causing + ** SQLite to synthesize a row of NULL values. Which does match the + ** WHERE clause, and so the query returns a row. Which is incorrect. + ** + ** For the same reason, WHERE terms such as: + ** + ** WHERE 1 = (t2.c IS NULL) + ** + ** are also excluded. See codeCursorHintIsOrFunction() for details. + */ + if( pTabItem->fg.jointype & JT_LEFT ){ + Expr *pExpr = pTerm->pExpr; + if( !ExprHasProperty(pExpr, EP_FromJoin) + || pExpr->iRightJoinTable!=pTabItem->iCursor + ){ + sWalker.eCode = 0; + sWalker.xExprCallback = codeCursorHintIsOrFunction; + sqlite3WalkExpr(&sWalker, pTerm->pExpr); + if( sWalker.eCode ) continue; + } + }else{ + if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) continue; + } + + /* All terms in pWLoop->aLTerm[] except pEndRange are used to initialize + ** the cursor. These terms are not needed as hints for a pure range + ** scan (that has no == terms) so omit them. */ + if( pLoop->u.btree.nEq==0 && pTerm!=pEndRange ){ + for(j=0; jnLTerm && pLoop->aLTerm[j]!=pTerm; j++){} + if( jnLTerm ) continue; + } + + /* No subqueries or non-deterministic functions allowed */ + if( sqlite3ExprContainsSubquery(pTerm->pExpr) ) continue; + + /* For an index scan, make sure referenced columns are actually in + ** the index. */ + if( sHint.pIdx!=0 ){ + sWalker.eCode = 0; + sWalker.xExprCallback = codeCursorHintCheckExpr; + sqlite3WalkExpr(&sWalker, pTerm->pExpr); + if( sWalker.eCode ) continue; + } + + /* If we survive all prior tests, that means this term is worth hinting */ + pExpr = sqlite3ExprAnd(pParse, pExpr, sqlite3ExprDup(db, pTerm->pExpr, 0)); + } + if( pExpr!=0 ){ + sWalker.xExprCallback = codeCursorHintFixExpr; + sqlite3WalkExpr(&sWalker, pExpr); + sqlite3VdbeAddOp4(v, OP_CursorHint, + (sHint.pIdx ? sHint.iIdxCur : sHint.iTabCur), 0, 0, + (const char*)pExpr, P4_EXPR); + } +} +#else +# define codeCursorHint(A,B,C,D) /* No-op */ +#endif /* SQLITE_ENABLE_CURSOR_HINTS */ + +/* +** Cursor iCur is open on an intkey b-tree (a table). Register iRowid contains +** a rowid value just read from cursor iIdxCur, open on index pIdx. This +** function generates code to do a deferred seek of cursor iCur to the +** rowid stored in register iRowid. +** +** Normally, this is just: +** +** OP_DeferredSeek $iCur $iRowid +** +** However, if the scan currently being coded is a branch of an OR-loop and +** the statement currently being coded is a SELECT, then P3 of OP_DeferredSeek +** is set to iIdxCur and P4 is set to point to an array of integers +** containing one entry for each column of the table cursor iCur is open +** on. For each table column, if the column is the i'th column of the +** index, then the corresponding array entry is set to (i+1). If the column +** does not appear in the index at all, the array entry is set to 0. +*/ +static void codeDeferredSeek( + WhereInfo *pWInfo, /* Where clause context */ + Index *pIdx, /* Index scan is using */ + int iCur, /* Cursor for IPK b-tree */ + int iIdxCur /* Index cursor */ +){ + Parse *pParse = pWInfo->pParse; /* Parse context */ + Vdbe *v = pParse->pVdbe; /* Vdbe to generate code within */ + + assert( iIdxCur>0 ); + assert( pIdx->aiColumn[pIdx->nColumn-1]==-1 ); + + pWInfo->bDeferredSeek = 1; + sqlite3VdbeAddOp3(v, OP_DeferredSeek, iIdxCur, 0, iCur); + if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) + && DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask) + ){ + int i; + Table *pTab = pIdx->pTable; + int *ai = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*(pTab->nCol+1)); + if( ai ){ + ai[0] = pTab->nCol; + for(i=0; inColumn-1; i++){ + int x1, x2; + assert( pIdx->aiColumn[i]nCol ); + x1 = pIdx->aiColumn[i]; + x2 = sqlite3TableColumnToStorage(pTab, x1); + testcase( x1!=x2 ); + if( x1>=0 ) ai[x2+1] = i+1; + } + sqlite3VdbeChangeP4(v, -1, (char*)ai, P4_INTARRAY); + } + } +} + +/* +** If the expression passed as the second argument is a vector, generate +** code to write the first nReg elements of the vector into an array +** of registers starting with iReg. +** +** If the expression is not a vector, then nReg must be passed 1. In +** this case, generate code to evaluate the expression and leave the +** result in register iReg. +*/ +static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ + assert( nReg>0 ); + if( p && sqlite3ExprIsVector(p) ){ +#ifndef SQLITE_OMIT_SUBQUERY + if( (p->flags & EP_xIsSelect) ){ + Vdbe *v = pParse->pVdbe; + int iSelect; + assert( p->op==TK_SELECT ); + iSelect = sqlite3CodeSubselect(pParse, p); + sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg-1); + }else +#endif + { + int i; + ExprList *pList = p->x.pList; + assert( nReg<=pList->nExpr ); + for(i=0; ia[i].pExpr, iReg+i); + } + } + }else{ + assert( nReg==1 ); + sqlite3ExprCode(pParse, p, iReg); + } +} + +/* An instance of the IdxExprTrans object carries information about a +** mapping from an expression on table columns into a column in an index +** down through the Walker. +*/ +typedef struct IdxExprTrans { + Expr *pIdxExpr; /* The index expression */ + int iTabCur; /* The cursor of the corresponding table */ + int iIdxCur; /* The cursor for the index */ + int iIdxCol; /* The column for the index */ + int iTabCol; /* The column for the table */ + WhereInfo *pWInfo; /* Complete WHERE clause information */ + sqlite3 *db; /* Database connection (for malloc()) */ +} IdxExprTrans; + +/* +** Preserve pExpr on the WhereETrans list of the WhereInfo. +*/ +static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){ + WhereExprMod *pNew; + pNew = sqlite3DbMallocRaw(pTrans->db, sizeof(*pNew)); + if( pNew==0 ) return; + pNew->pNext = pTrans->pWInfo->pExprMods; + pTrans->pWInfo->pExprMods = pNew; + pNew->pExpr = pExpr; + memcpy(&pNew->orig, pExpr, sizeof(*pExpr)); +} + +/* The walker node callback used to transform matching expressions into +** a reference to an index column for an index on an expression. +** +** If pExpr matches, then transform it into a reference to the index column +** that contains the value of pExpr. +*/ +static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ + IdxExprTrans *pX = p->u.pIdxTrans; + if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ + preserveExpr(pX, pExpr); + pExpr->affExpr = sqlite3ExprAffinity(pExpr); + pExpr->op = TK_COLUMN; + pExpr->iTable = pX->iIdxCur; + pExpr->iColumn = pX->iIdxCol; + pExpr->y.pTab = 0; + testcase( ExprHasProperty(pExpr, EP_Skip) ); + testcase( ExprHasProperty(pExpr, EP_Unlikely) ); + ExprClearProperty(pExpr, EP_Skip|EP_Unlikely); + return WRC_Prune; + }else{ + return WRC_Continue; + } +} + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* A walker node callback that translates a column reference to a table +** into a corresponding column reference of an index. +*/ +static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){ + if( pExpr->op==TK_COLUMN ){ + IdxExprTrans *pX = p->u.pIdxTrans; + if( pExpr->iTable==pX->iTabCur && pExpr->iColumn==pX->iTabCol ){ + assert( pExpr->y.pTab!=0 ); + preserveExpr(pX, pExpr); + pExpr->affExpr = sqlite3TableColumnAffinity(pExpr->y.pTab,pExpr->iColumn); + pExpr->iTable = pX->iIdxCur; + pExpr->iColumn = pX->iIdxCol; + pExpr->y.pTab = 0; + } + } + return WRC_Continue; +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + +/* +** For an indexes on expression X, locate every instance of expression X +** in pExpr and change that subexpression into a reference to the appropriate +** column of the index. +** +** 2019-10-24: Updated to also translate references to a VIRTUAL column in +** the table into references to the corresponding (stored) column of the +** index. +*/ +static void whereIndexExprTrans( + Index *pIdx, /* The Index */ + int iTabCur, /* Cursor of the table that is being indexed */ + int iIdxCur, /* Cursor of the index itself */ + WhereInfo *pWInfo /* Transform expressions in this WHERE clause */ +){ + int iIdxCol; /* Column number of the index */ + ExprList *aColExpr; /* Expressions that are indexed */ + Table *pTab; + Walker w; + IdxExprTrans x; + aColExpr = pIdx->aColExpr; + if( aColExpr==0 && !pIdx->bHasVCol ){ + /* The index does not reference any expressions or virtual columns + ** so no translations are needed. */ + return; + } + pTab = pIdx->pTable; + memset(&w, 0, sizeof(w)); + w.u.pIdxTrans = &x; + x.iTabCur = iTabCur; + x.iIdxCur = iIdxCur; + x.pWInfo = pWInfo; + x.db = pWInfo->pParse->db; + for(iIdxCol=0; iIdxColnColumn; iIdxCol++){ + i16 iRef = pIdx->aiColumn[iIdxCol]; + if( iRef==XN_EXPR ){ + assert( aColExpr->a[iIdxCol].pExpr!=0 ); + x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; + if( sqlite3ExprIsConstant(x.pIdxExpr) ) continue; + w.xExprCallback = whereIndexExprTransNode; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( iRef>=0 + && (pTab->aCol[iRef].colFlags & COLFLAG_VIRTUAL)!=0 + && (pTab->aCol[iRef].zColl==0 + || sqlite3StrICmp(pTab->aCol[iRef].zColl, sqlite3StrBINARY)==0) + ){ + /* Check to see if there are direct references to generated columns + ** that are contained in the index. Pulling the generated column + ** out of the index is an optimization only - the main table is always + ** available if the index cannot be used. To avoid unnecessary + ** complication, omit this optimization if the collating sequence for + ** the column is non-standard */ + x.iTabCol = iRef; + w.xExprCallback = whereIndexExprTransColumn; +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + }else{ + continue; + } + x.iIdxCol = iIdxCol; + sqlite3WalkExpr(&w, pWInfo->pWhere); + sqlite3WalkExprList(&w, pWInfo->pOrderBy); + sqlite3WalkExprList(&w, pWInfo->pResultSet); + } +} + +/* +** The pTruth expression is always true because it is the WHERE clause +** a partial index that is driving a query loop. Look through all of the +** WHERE clause terms on the query, and if any of those terms must be +** true because pTruth is true, then mark those WHERE clause terms as +** coded. +*/ +static void whereApplyPartialIndexConstraints( + Expr *pTruth, + int iTabCur, + WhereClause *pWC +){ + int i; + WhereTerm *pTerm; + while( pTruth->op==TK_AND ){ + whereApplyPartialIndexConstraints(pTruth->pLeft, iTabCur, pWC); + pTruth = pTruth->pRight; + } + for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + Expr *pExpr; + if( pTerm->wtFlags & TERM_CODED ) continue; + pExpr = pTerm->pExpr; + if( sqlite3ExprCompare(0, pExpr, pTruth, iTabCur)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } + } +} + +/* +** Generate code for the start of the iLevel-th loop in the WHERE clause +** implementation described by pWInfo. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ + Bitmask notReady /* Which tables are currently available */ +){ + int j, k; /* Loop counters */ + int iCur; /* The VDBE cursor for the table */ + int addrNxt; /* Where to jump to continue with the next IN case */ + int bRev; /* True if we need to scan in reverse order */ + WhereLoop *pLoop; /* The WhereLoop object being coded */ + WhereClause *pWC; /* Decomposition of the entire WHERE clause */ + WhereTerm *pTerm; /* A WHERE clause term */ + sqlite3 *db; /* Database connection */ + struct SrcList_item *pTabItem; /* FROM clause term being coded */ + int addrBrk; /* Jump here to break out of the loop */ + int addrHalt; /* addrBrk for the outermost loop */ + int addrCont; /* Jump here to continue with next cycle */ + int iRowidReg = 0; /* Rowid is stored in this register, if not zero */ + int iReleaseReg = 0; /* Temp register to free before returning */ + Index *pIdx = 0; /* Index used by loop (if any) */ + int iLoop; /* Iteration of constraint generator loop */ + + pWC = &pWInfo->sWC; + db = pParse->db; + pLoop = pLevel->pWLoop; + pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; + iCur = pTabItem->iCursor; + pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); + bRev = (pWInfo->revMask>>iLevel)&1; + VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); +#if WHERETRACE_ENABLED /* 0x20800 */ + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding level %d of %d: notReady=%llx iFrom=%d\n", + iLevel, pWInfo->nLevel, (u64)notReady, pLevel->iFrom); + sqlite3WhereLoopPrint(pLoop, pWC); + } + if( sqlite3WhereTrace & 0x20000 ){ + if( iLevel==0 ){ + sqlite3DebugPrintf("WHERE clause being coded:\n"); + sqlite3TreeViewExpr(0, pWInfo->pWhere, 0); + } + sqlite3DebugPrintf("All WHERE-clause terms before coding:\n"); + sqlite3WhereClausePrint(pWC); + } +#endif + + /* Create labels for the "break" and "continue" instructions + ** for the current loop. Jump to addrBrk to break out of a loop. + ** Jump to cont to go immediately to the next iteration of the + ** loop. + ** + ** When there is an IN operator, we also have a "addrNxt" label that + ** means to continue with the next IN value combination. When + ** there are no IN operators in the constraints, the "addrNxt" label + ** is the same as "addrBrk". + */ + addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); + addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(pParse); + + /* If this is the right table of a LEFT OUTER JOIN, allocate and + ** initialize a memory cell that records if this table matches any + ** row of the left table of the join. + */ + assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) + || pLevel->iFrom>0 || (pTabItem[0].fg.jointype & JT_LEFT)==0 + ); + if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){ + pLevel->iLeftJoin = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin); + VdbeComment((v, "init LEFT JOIN no-match flag")); + } + + /* Compute a safe address to jump to if we discover that the table for + ** this loop is empty and can never contribute content. */ + for(j=iLevel; j>0 && pWInfo->a[j].iLeftJoin==0; j--){} + addrHalt = pWInfo->a[j].addrBrk; + + /* Special case of a FROM clause subquery implemented as a co-routine */ + if( pTabItem->fg.viaCoroutine ){ + int regYield = pTabItem->regReturn; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); + VdbeCoverage(v); + VdbeComment((v, "next row of %s", pTabItem->pTab->zName)); + pLevel->op = OP_Goto; + }else + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ + /* Case 1: The table is a virtual-table. Use the VFilter and VNext + ** to access the data. + */ + int iReg; /* P3 Value for OP_VFilter */ + int addrNotFound; + int nConstraint = pLoop->nLTerm; + int iIn; /* Counter for IN constraints */ + + iReg = sqlite3GetTempRange(pParse, nConstraint+2); + addrNotFound = pLevel->addrBrk; + for(j=0; jaLTerm[j]; + if( NEVER(pTerm==0) ) continue; + if( pTerm->eOperator & WO_IN ){ + codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget); + addrNotFound = pLevel->addrNxt; + }else{ + Expr *pRight = pTerm->pExpr->pRight; + codeExprOrVector(pParse, pRight, iTarget, 1); + } + } + sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg); + sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1); + sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg, + pLoop->u.vtab.idxStr, + pLoop->u.vtab.needFree ? P4_DYNAMIC : P4_STATIC); + VdbeCoverage(v); + pLoop->u.vtab.needFree = 0; + pLevel->p1 = iCur; + pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext; + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + iIn = pLevel->u.in.nIn; + for(j=nConstraint-1; j>=0; j--){ + pTerm = pLoop->aLTerm[j]; + if( (pTerm->eOperator & WO_IN)!=0 ) iIn--; + if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ + disableTerm(pLevel, pTerm); + }else if( (pTerm->eOperator & WO_IN)!=0 + && sqlite3ExprVectorSize(pTerm->pExpr->pLeft)==1 + ){ + Expr *pCompare; /* The comparison operator */ + Expr *pRight; /* RHS of the comparison */ + VdbeOp *pOp; /* Opcode to access the value of the IN constraint */ + + /* Reload the constraint value into reg[iReg+j+2]. The same value + ** was loaded into the same register prior to the OP_VFilter, but + ** the xFilter implementation might have changed the datatype or + ** encoding of the value in the register, so it *must* be reloaded. */ + assert( pLevel->u.in.aInLoop!=0 || db->mallocFailed ); + if( !db->mallocFailed ){ + assert( iIn>=0 && iInu.in.nIn ); + pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop); + assert( pOp->opcode==OP_Column || pOp->opcode==OP_Rowid ); + assert( pOp->opcode!=OP_Column || pOp->p3==iReg+j+2 ); + assert( pOp->opcode!=OP_Rowid || pOp->p2==iReg+j+2 ); + testcase( pOp->opcode==OP_Rowid ); + sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3); + } + + /* Generate code that will continue to the next row if + ** the IN constraint is not satisfied */ + pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0); + assert( pCompare!=0 || db->mallocFailed ); + if( pCompare ){ + pCompare->pLeft = pTerm->pExpr->pLeft; + pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0); + if( pRight ){ + pRight->iTable = iReg+j+2; + sqlite3ExprIfFalse( + pParse, pCompare, pLevel->addrCont, SQLITE_JUMPIFNULL + ); + } + pCompare->pLeft = 0; + sqlite3ExprDelete(db, pCompare); + } + } + } + assert( iIn==0 || db->mallocFailed ); + /* These registers need to be preserved in case there is an IN operator + ** loop. So we could deallocate the registers here (and potentially + ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems + ** simpler and safer to simply not reuse the registers. + ** + ** sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2); + */ + }else +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + if( (pLoop->wsFlags & WHERE_IPK)!=0 + && (pLoop->wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_EQ))!=0 + ){ + /* Case 2: We can directly reference a single row using an + ** equality comparison against the ROWID field. Or + ** we reference multiple rows using a "rowid IN (...)" + ** construct. + */ + assert( pLoop->u.btree.nEq==1 ); + pTerm = pLoop->aLTerm[0]; + assert( pTerm!=0 ); + assert( pTerm->pExpr!=0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + iReleaseReg = ++pParse->nMem; + iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); + if( iRowidReg!=iReleaseReg ) sqlite3ReleaseTempReg(pParse, iReleaseReg); + addrNxt = pLevel->addrNxt; + sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); + VdbeCoverage(v); + pLevel->op = OP_Noop; + if( (pTerm->prereqAll & pLevel->notReady)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } + }else if( (pLoop->wsFlags & WHERE_IPK)!=0 + && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 + ){ + /* Case 3: We have an inequality comparison against the ROWID field. + */ + int testOp = OP_Noop; + int start; + int memEndValue = 0; + WhereTerm *pStart, *pEnd; + + j = 0; + pStart = pEnd = 0; + if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; + if( pLoop->wsFlags & WHERE_TOP_LIMIT ) pEnd = pLoop->aLTerm[j++]; + assert( pStart!=0 || pEnd!=0 ); + if( bRev ){ + pTerm = pStart; + pStart = pEnd; + pEnd = pTerm; + } + codeCursorHint(pTabItem, pWInfo, pLevel, pEnd); + if( pStart ){ + Expr *pX; /* The expression that defines the start bound */ + int r1, rTemp; /* Registers for holding the start boundary */ + int op; /* Cursor seek operation */ + + /* The following constant maps TK_xx codes into corresponding + ** seek opcodes. It depends on a particular ordering of TK_xx + */ + const u8 aMoveOp[] = { + /* TK_GT */ OP_SeekGT, + /* TK_LE */ OP_SeekLE, + /* TK_LT */ OP_SeekLT, + /* TK_GE */ OP_SeekGE + }; + assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */ + assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */ + assert( TK_GE==TK_GT+3 ); /* ... is correcct. */ + + assert( (pStart->wtFlags & TERM_VNULL)==0 ); + testcase( pStart->wtFlags & TERM_VIRTUAL ); + pX = pStart->pExpr; + assert( pX!=0 ); + testcase( pStart->leftCursor!=iCur ); /* transitive constraints */ + if( sqlite3ExprIsVector(pX->pRight) ){ + r1 = rTemp = sqlite3GetTempReg(pParse); + codeExprOrVector(pParse, pX->pRight, r1, 1); + testcase( pX->op==TK_GT ); + testcase( pX->op==TK_GE ); + testcase( pX->op==TK_LT ); + testcase( pX->op==TK_LE ); + op = aMoveOp[((pX->op - TK_GT - 1) & 0x3) | 0x1]; + assert( pX->op!=TK_GT || op==OP_SeekGE ); + assert( pX->op!=TK_GE || op==OP_SeekGE ); + assert( pX->op!=TK_LT || op==OP_SeekLE ); + assert( pX->op!=TK_LE || op==OP_SeekLE ); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp); + disableTerm(pLevel, pStart); + op = aMoveOp[(pX->op - TK_GT)]; + } + sqlite3VdbeAddOp3(v, op, iCur, addrBrk, r1); + VdbeComment((v, "pk")); + VdbeCoverageIf(v, pX->op==TK_GT); + VdbeCoverageIf(v, pX->op==TK_LE); + VdbeCoverageIf(v, pX->op==TK_LT); + VdbeCoverageIf(v, pX->op==TK_GE); + sqlite3ReleaseTempReg(pParse, rTemp); + }else{ + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrHalt); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + } + if( pEnd ){ + Expr *pX; + pX = pEnd->pExpr; + assert( pX!=0 ); + assert( (pEnd->wtFlags & TERM_VNULL)==0 ); + testcase( pEnd->leftCursor!=iCur ); /* Transitive constraints */ + testcase( pEnd->wtFlags & TERM_VIRTUAL ); + memEndValue = ++pParse->nMem; + codeExprOrVector(pParse, pX->pRight, memEndValue, 1); + if( 0==sqlite3ExprIsVector(pX->pRight) + && (pX->op==TK_LT || pX->op==TK_GT) + ){ + testOp = bRev ? OP_Le : OP_Ge; + }else{ + testOp = bRev ? OP_Lt : OP_Gt; + } + if( 0==sqlite3ExprIsVector(pX->pRight) ){ + disableTerm(pLevel, pEnd); + } + } + start = sqlite3VdbeCurrentAddr(v); + pLevel->op = bRev ? OP_Prev : OP_Next; + pLevel->p1 = iCur; + pLevel->p2 = start; + assert( pLevel->p5==0 ); + if( testOp!=OP_Noop ){ + iRowidReg = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg); + sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg); + VdbeCoverageIf(v, testOp==OP_Le); + VdbeCoverageIf(v, testOp==OP_Lt); + VdbeCoverageIf(v, testOp==OP_Ge); + VdbeCoverageIf(v, testOp==OP_Gt); + sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL); + } + }else if( pLoop->wsFlags & WHERE_INDEXED ){ + /* Case 4: A scan using an index. + ** + ** The WHERE clause may contain zero or more equality + ** terms ("==" or "IN" operators) that refer to the N + ** left-most columns of the index. It may also contain + ** inequality constraints (>, <, >= or <=) on the indexed + ** column that immediately follows the N equalities. Only + ** the right-most column can be an inequality - the rest must + ** use the "==" and "IN" operators. For example, if the + ** index is on (x,y,z), then the following clauses are all + ** optimized: + ** + ** x=5 + ** x=5 AND y=10 + ** x=5 AND y<10 + ** x=5 AND y>5 AND y<10 + ** x=5 AND y=5 AND z<=10 + ** + ** The z<10 term of the following cannot be used, only + ** the x=5 term: + ** + ** x=5 AND z<10 + ** + ** N may be zero if there are inequality constraints. + ** If there are no inequality constraints, then N is at + ** least one. + ** + ** This case is also used when there are no WHERE clause + ** constraints but an index is selected anyway, in order + ** to force the output order to conform to an ORDER BY. + */ + static const u8 aStartOp[] = { + 0, + 0, + OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */ + OP_Last, /* 3: (!start_constraints && startEq && bRev) */ + OP_SeekGT, /* 4: (start_constraints && !startEq && !bRev) */ + OP_SeekLT, /* 5: (start_constraints && !startEq && bRev) */ + OP_SeekGE, /* 6: (start_constraints && startEq && !bRev) */ + OP_SeekLE /* 7: (start_constraints && startEq && bRev) */ + }; + static const u8 aEndOp[] = { + OP_IdxGE, /* 0: (end_constraints && !bRev && !endEq) */ + OP_IdxGT, /* 1: (end_constraints && !bRev && endEq) */ + OP_IdxLE, /* 2: (end_constraints && bRev && !endEq) */ + OP_IdxLT, /* 3: (end_constraints && bRev && endEq) */ + }; + u16 nEq = pLoop->u.btree.nEq; /* Number of == or IN terms */ + u16 nBtm = pLoop->u.btree.nBtm; /* Length of BTM vector */ + u16 nTop = pLoop->u.btree.nTop; /* Length of TOP vector */ + int regBase; /* Base register holding constraint values */ + WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */ + WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */ + int startEq; /* True if range start uses ==, >= or <= */ + int endEq; /* True if range end uses ==, >= or <= */ + int start_constraints; /* Start of range is constrained */ + int nConstraint; /* Number of constraint terms */ + int iIdxCur; /* The VDBE cursor for the index */ + int nExtraReg = 0; /* Number of extra registers needed */ + int op; /* Instruction opcode */ + char *zStartAff; /* Affinity for start of range constraint */ + char *zEndAff = 0; /* Affinity for end of range constraint */ + u8 bSeekPastNull = 0; /* True to seek past initial nulls */ + u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ + int omitTable; /* True if we use the index only */ + int regBignull = 0; /* big-null flag register */ + + pIdx = pLoop->u.btree.pIndex; + iIdxCur = pLevel->iIdxCur; + assert( nEq>=pLoop->nSkip ); + + /* Find any inequality constraint terms for the start and end + ** of the range. + */ + j = nEq; + if( pLoop->wsFlags & WHERE_BTM_LIMIT ){ + pRangeStart = pLoop->aLTerm[j++]; + nExtraReg = MAX(nExtraReg, pLoop->u.btree.nBtm); + /* Like optimization range constraints always occur in pairs */ + assert( (pRangeStart->wtFlags & TERM_LIKEOPT)==0 || + (pLoop->wsFlags & WHERE_TOP_LIMIT)!=0 ); + } + if( pLoop->wsFlags & WHERE_TOP_LIMIT ){ + pRangeEnd = pLoop->aLTerm[j++]; + nExtraReg = MAX(nExtraReg, pLoop->u.btree.nTop); +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( (pRangeEnd->wtFlags & TERM_LIKEOPT)!=0 ){ + assert( pRangeStart!=0 ); /* LIKE opt constraints */ + assert( pRangeStart->wtFlags & TERM_LIKEOPT ); /* occur in pairs */ + pLevel->iLikeRepCntr = (u32)++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 1, (int)pLevel->iLikeRepCntr); + VdbeComment((v, "LIKE loop counter")); + pLevel->addrLikeRep = sqlite3VdbeCurrentAddr(v); + /* iLikeRepCntr actually stores 2x the counter register number. The + ** bottom bit indicates whether the search order is ASC or DESC. */ + testcase( bRev ); + testcase( pIdx->aSortOrder[nEq]==SQLITE_SO_DESC ); + assert( (bRev & ~1)==0 ); + pLevel->iLikeRepCntr <<=1; + pLevel->iLikeRepCntr |= bRev ^ (pIdx->aSortOrder[nEq]==SQLITE_SO_DESC); + } +#endif + if( pRangeStart==0 ){ + j = pIdx->aiColumn[nEq]; + if( (j>=0 && pIdx->pTable->aCol[j].notNull==0) || j==XN_EXPR ){ + bSeekPastNull = 1; + } + } + } + assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); + + /* If the WHERE_BIGNULL_SORT flag is set, then index column nEq uses + ** a non-default "big-null" sort (either ASC NULLS LAST or DESC NULLS + ** FIRST). In both cases separate ordered scans are made of those + ** index entries for which the column is null and for those for which + ** it is not. For an ASC sort, the non-NULL entries are scanned first. + ** For DESC, NULL entries are scanned first. + */ + if( (pLoop->wsFlags & (WHERE_TOP_LIMIT|WHERE_BTM_LIMIT))==0 + && (pLoop->wsFlags & WHERE_BIGNULL_SORT)!=0 + ){ + assert( bSeekPastNull==0 && nExtraReg==0 && nBtm==0 && nTop==0 ); + assert( pRangeEnd==0 && pRangeStart==0 ); + testcase( pLoop->nSkip>0 ); + nExtraReg = 1; + bSeekPastNull = 1; + pLevel->regBignull = regBignull = ++pParse->nMem; + if( pLevel->iLeftJoin ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, regBignull); + } + pLevel->addrBignull = sqlite3VdbeMakeLabel(pParse); + } + + /* If we are doing a reverse order scan on an ascending index, or + ** a forward order scan on a descending index, interchange the + ** start and end terms (pRangeStart and pRangeEnd). + */ + if( (nEqnKeyCol && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC)) + || (bRev && pIdx->nKeyCol==nEq) + ){ + SWAP(WhereTerm *, pRangeEnd, pRangeStart); + SWAP(u8, bSeekPastNull, bStopAtNull); + SWAP(u8, nBtm, nTop); + } + + /* Generate code to evaluate all constraint terms using == or IN + ** and store the values of those terms in an array of registers + ** starting at regBase. + */ + codeCursorHint(pTabItem, pWInfo, pLevel, pRangeEnd); + regBase = codeAllEqualityTerms(pParse,pLevel,bRev,nExtraReg,&zStartAff); + assert( zStartAff==0 || sqlite3Strlen30(zStartAff)>=nEq ); + if( zStartAff && nTop ){ + zEndAff = sqlite3DbStrDup(db, &zStartAff[nEq]); + } + addrNxt = (regBignull ? pLevel->addrBignull : pLevel->addrNxt); + + testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); + testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); + testcase( pRangeEnd && (pRangeEnd->eOperator & WO_LE)!=0 ); + testcase( pRangeEnd && (pRangeEnd->eOperator & WO_GE)!=0 ); + startEq = !pRangeStart || pRangeStart->eOperator & (WO_LE|WO_GE); + endEq = !pRangeEnd || pRangeEnd->eOperator & (WO_LE|WO_GE); + start_constraints = pRangeStart || nEq>0; + + /* Seek the index cursor to the start of the range. */ + nConstraint = nEq; + if( pRangeStart ){ + Expr *pRight = pRangeStart->pExpr->pRight; + codeExprOrVector(pParse, pRight, regBase+nEq, nBtm); + whereLikeOptimizationStringFixup(v, pLevel, pRangeStart); + if( (pRangeStart->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); + } + if( zStartAff ){ + updateRangeAffinityStr(pRight, nBtm, &zStartAff[nEq]); + } + nConstraint += nBtm; + testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); + if( sqlite3ExprIsVector(pRight)==0 ){ + disableTerm(pLevel, pRangeStart); + }else{ + startEq = 1; + } + bSeekPastNull = 0; + }else if( bSeekPastNull ){ + startEq = 0; + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + start_constraints = 1; + nConstraint++; + }else if( regBignull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + start_constraints = 1; + nConstraint++; + } + codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); + if( pLoop->nSkip>0 && nConstraint==pLoop->nSkip ){ + /* The skip-scan logic inside the call to codeAllEqualityConstraints() + ** above has already left the cursor sitting on the correct row, + ** so no further seeking is needed */ + }else{ + if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){ + sqlite3VdbeAddOp1(v, OP_SeekHit, iIdxCur); + } + if( regBignull ){ + sqlite3VdbeAddOp2(v, OP_Integer, 1, regBignull); + VdbeComment((v, "NULL-scan pass ctr")); + } + + op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; + assert( op!=0 ); + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); + + assert( bSeekPastNull==0 || bStopAtNull==0 ); + if( regBignull ){ + assert( bSeekPastNull==1 || bStopAtNull==1 ); + assert( bSeekPastNull==!bStopAtNull ); + assert( bStopAtNull==startEq ); + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); + op = aStartOp[(nConstraint>1)*4 + 2 + bRev]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, + nConstraint-startEq); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + assert( op==OP_Rewind || op==OP_Last || op==OP_SeekGE || op==OP_SeekLE); + } + } + + /* Load the value for the inequality constraint at the end of the + ** range (if any). + */ + nConstraint = nEq; + if( pRangeEnd ){ + Expr *pRight = pRangeEnd->pExpr->pRight; + codeExprOrVector(pParse, pRight, regBase+nEq, nTop); + whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd); + if( (pRangeEnd->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); + } + if( zEndAff ){ + updateRangeAffinityStr(pRight, nTop, zEndAff); + codeApplyAffinity(pParse, regBase+nEq, nTop, zEndAff); + }else{ + assert( pParse->db->mallocFailed ); + } + nConstraint += nTop; + testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); + + if( sqlite3ExprIsVector(pRight)==0 ){ + disableTerm(pLevel, pRangeEnd); + }else{ + endEq = 1; + } + }else if( bStopAtNull ){ + if( regBignull==0 ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + endEq = 0; + } + nConstraint++; + } + sqlite3DbFree(db, zStartAff); + sqlite3DbFree(db, zEndAff); + + /* Top of the loop body */ + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + + /* Check if the index cursor is past the end of the range. */ + if( nConstraint ){ + if( regBignull ){ + /* Except, skip the end-of-range check while doing the NULL-scan */ + sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+3); + VdbeComment((v, "If NULL-scan 2nd pass")); + VdbeCoverage(v); + } + op = aEndOp[bRev*2 + endEq]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); + } + if( regBignull ){ + /* During a NULL-scan, check to see if we have reached the end of + ** the NULLs */ + assert( bSeekPastNull==!bStopAtNull ); + assert( bSeekPastNull+bStopAtNull==1 ); + assert( nConstraint+bSeekPastNull>0 ); + sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+2); + VdbeComment((v, "If NULL-scan 1st pass")); + VdbeCoverage(v); + op = aEndOp[bRev*2 + bSeekPastNull]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, + nConstraint+bSeekPastNull); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); + } + + if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){ + sqlite3VdbeAddOp2(v, OP_SeekHit, iIdxCur, 1); + } + + /* Seek the table cursor, if required */ + omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; + if( omitTable ){ + /* pIdx is a covering index. No need to access the main table. */ + }else if( HasRowid(pIdx->pTable) ){ + if( (pWInfo->wctrlFlags & WHERE_SEEK_TABLE) + || ( (pWInfo->wctrlFlags & WHERE_SEEK_UNIQ_TABLE)!=0 + && (pWInfo->eOnePass==ONEPASS_SINGLE || pLoop->nLTerm==0) ) + ){ + iRowidReg = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg); + sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, iRowidReg); + VdbeCoverage(v); + }else{ + codeDeferredSeek(pWInfo, pIdx, iCur, iIdxCur); + } + }else if( iCur!=iIdxCur ){ + Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); + iRowidReg = sqlite3GetTempRange(pParse, pPk->nKeyCol); + for(j=0; jnKeyCol; j++){ + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, iRowidReg+j); + } + sqlite3VdbeAddOp4Int(v, OP_NotFound, iCur, addrCont, + iRowidReg, pPk->nKeyCol); VdbeCoverage(v); + } + + if( pLevel->iLeftJoin==0 ){ + /* If pIdx is an index on one or more expressions, then look through + ** all the expressions in pWInfo and try to transform matching expressions + ** into reference to index columns. Also attempt to translate references + ** to virtual columns in the table into references to (stored) columns + ** of the index. + ** + ** Do not do this for the RHS of a LEFT JOIN. This is because the + ** expression may be evaluated after OP_NullRow has been executed on + ** the cursor. In this case it is important to do the full evaluation, + ** as the result of the expression may not be NULL, even if all table + ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a + ** + ** Also, do not do this when processing one index an a multi-index + ** OR clause, since the transformation will become invalid once we + ** move forward to the next index. + ** https://sqlite.org/src/info/4e8e4857d32d401f + */ + if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ + whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); + } + + /* If a partial index is driving the loop, try to eliminate WHERE clause + ** terms from the query that must be true due to the WHERE clause of + ** the partial index. + ** + ** 2019-11-02 ticket 623eff57e76d45f6: This optimization does not work + ** for a LEFT JOIN. + */ + if( pIdx->pPartIdxWhere ){ + whereApplyPartialIndexConstraints(pIdx->pPartIdxWhere, iCur, pWC); + } + }else{ + testcase( pIdx->pPartIdxWhere ); + /* The following assert() is not a requirement, merely an observation: + ** The OR-optimization doesn't work for the right hand table of + ** a LEFT JOIN: */ + assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ); + } + + /* Record the instruction used to terminate the loop. */ + if( pLoop->wsFlags & WHERE_ONEROW ){ + pLevel->op = OP_Noop; + }else if( bRev ){ + pLevel->op = OP_Prev; + }else{ + pLevel->op = OP_Next; + } + pLevel->p1 = iIdxCur; + pLevel->p3 = (pLoop->wsFlags&WHERE_UNQ_WANTED)!=0 ? 1:0; + if( (pLoop->wsFlags & WHERE_CONSTRAINT)==0 ){ + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + }else{ + assert( pLevel->p5==0 ); + } + if( omitTable ) pIdx = 0; + }else + +#ifndef SQLITE_OMIT_OR_OPTIMIZATION + if( pLoop->wsFlags & WHERE_MULTI_OR ){ + /* Case 5: Two or more separately indexed terms connected by OR + ** + ** Example: + ** + ** CREATE TABLE t1(a,b,c,d); + ** CREATE INDEX i1 ON t1(a); + ** CREATE INDEX i2 ON t1(b); + ** CREATE INDEX i3 ON t1(c); + ** + ** SELECT * FROM t1 WHERE a=5 OR b=7 OR (c=11 AND d=13) + ** + ** In the example, there are three indexed terms connected by OR. + ** The top of the loop looks like this: + ** + ** Null 1 # Zero the rowset in reg 1 + ** + ** Then, for each indexed term, the following. The arguments to + ** RowSetTest are such that the rowid of the current row is inserted + ** into the RowSet. If it is already present, control skips the + ** Gosub opcode and jumps straight to the code generated by WhereEnd(). + ** + ** sqlite3WhereBegin() + ** RowSetTest # Insert rowid into rowset + ** Gosub 2 A + ** sqlite3WhereEnd() + ** + ** Following the above, code to terminate the loop. Label A, the target + ** of the Gosub above, jumps to the instruction right after the Goto. + ** + ** Null 1 # Zero the rowset in reg 1 + ** Goto B # The loop is finished. + ** + ** A: # Return data, whatever. + ** + ** Return 2 # Jump back to the Gosub + ** + ** B: + ** + ** Added 2014-05-26: If the table is a WITHOUT ROWID table, then + ** use an ephemeral index instead of a RowSet to record the primary + ** keys of the rows we have already seen. + ** + */ + WhereClause *pOrWc; /* The OR-clause broken out into subterms */ + SrcList *pOrTab; /* Shortened table list or OR-clause generation */ + Index *pCov = 0; /* Potential covering index (or NULL) */ + int iCovCur = pParse->nTab++; /* Cursor used for index scans (if any) */ + + int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ + int regRowset = 0; /* Register for RowSet object */ + int regRowid = 0; /* Register holding rowid */ + int iLoopBody = sqlite3VdbeMakeLabel(pParse);/* Start of loop body */ + int iRetInit; /* Address of regReturn init */ + int untestedTerms = 0; /* Some terms not completely tested */ + int ii; /* Loop counter */ + u16 wctrlFlags; /* Flags for sub-WHERE clause */ + Expr *pAndExpr = 0; /* An ".. AND (...)" expression */ + Table *pTab = pTabItem->pTab; + + pTerm = pLoop->aLTerm[0]; + assert( pTerm!=0 ); + assert( pTerm->eOperator & WO_OR ); + assert( (pTerm->wtFlags & TERM_ORINFO)!=0 ); + pOrWc = &pTerm->u.pOrInfo->wc; + pLevel->op = OP_Return; + pLevel->p1 = regReturn; + + /* Set up a new SrcList in pOrTab containing the table being scanned + ** by this loop in the a[0] slot and all notReady tables in a[1..] slots. + ** This becomes the SrcList in the recursive call to sqlite3WhereBegin(). + */ + if( pWInfo->nLevel>1 ){ + int nNotReady; /* The number of notReady tables */ + struct SrcList_item *origSrc; /* Original list of tables */ + nNotReady = pWInfo->nLevel - iLevel - 1; + pOrTab = sqlite3StackAllocRaw(db, + sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0])); + if( pOrTab==0 ) return notReady; + pOrTab->nAlloc = (u8)(nNotReady + 1); + pOrTab->nSrc = pOrTab->nAlloc; + memcpy(pOrTab->a, pTabItem, sizeof(*pTabItem)); + origSrc = pWInfo->pTabList->a; + for(k=1; k<=nNotReady; k++){ + memcpy(&pOrTab->a[k], &origSrc[pLevel[k].iFrom], sizeof(pOrTab->a[k])); + } + }else{ + pOrTab = pWInfo->pTabList; + } + + /* Initialize the rowset register to contain NULL. An SQL NULL is + ** equivalent to an empty rowset. Or, create an ephemeral index + ** capable of holding primary keys in the case of a WITHOUT ROWID. + ** + ** Also initialize regReturn to contain the address of the instruction + ** immediately following the OP_Return at the bottom of the loop. This + ** is required in a few obscure LEFT JOIN cases where control jumps + ** over the top of the loop into the body of it. In this case the + ** correct response for the end-of-loop code (the OP_Return) is to + ** fall through to the next instruction, just as an OP_Next does if + ** called on an uninitialized cursor. + */ + if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ + if( HasRowid(pTab) ){ + regRowset = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + regRowset = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, regRowset, pPk->nKeyCol); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + regRowid = ++pParse->nMem; + } + iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn); + + /* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y + ** Then for every term xN, evaluate as the subexpression: xN AND z + ** That way, terms in y that are factored into the disjunction will + ** be picked up by the recursive calls to sqlite3WhereBegin() below. + ** + ** Actually, each subexpression is converted to "xN AND w" where w is + ** the "interesting" terms of z - terms that did not originate in the + ** ON or USING clause of a LEFT JOIN, and terms that are usable as + ** indices. + ** + ** This optimization also only applies if the (x1 OR x2 OR ...) term + ** is not contained in the ON clause of a LEFT JOIN. + ** See ticket http://www.sqlite.org/src/info/f2369304e4 + */ + if( pWC->nTerm>1 ){ + int iTerm; + for(iTerm=0; iTermnTerm; iTerm++){ + Expr *pExpr = pWC->a[iTerm].pExpr; + if( &pWC->a[iTerm] == pTerm ) continue; + testcase( pWC->a[iTerm].wtFlags & TERM_VIRTUAL ); + testcase( pWC->a[iTerm].wtFlags & TERM_CODED ); + if( (pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_CODED))!=0 ) continue; + if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue; + testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO ); + pExpr = sqlite3ExprDup(db, pExpr, 0); + pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr); + } + if( pAndExpr ){ + /* The extra 0x10000 bit on the opcode is masked off and does not + ** become part of the new Expr.op. However, it does make the + ** op==TK_AND comparison inside of sqlite3PExpr() false, and this + ** prevents sqlite3PExpr() from implementing AND short-circuit + ** optimization, which we do not want here. */ + pAndExpr = sqlite3PExpr(pParse, TK_AND|0x10000, 0, pAndExpr); + } + } + + /* Run a separate WHERE clause for each term of the OR clause. After + ** eliminating duplicates from other WHERE clauses, the action for each + ** sub-WHERE clause is to to invoke the main loop body as a subroutine. + */ + wctrlFlags = WHERE_OR_SUBCLAUSE | (pWInfo->wctrlFlags & WHERE_SEEK_TABLE); + ExplainQueryPlan((pParse, 1, "MULTI-INDEX OR")); + for(ii=0; iinTerm; ii++){ + WhereTerm *pOrTerm = &pOrWc->a[ii]; + if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){ + WhereInfo *pSubWInfo; /* Info for single OR-term scan */ + Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ + int jmp1 = 0; /* Address of jump operation */ + testcase( (pTabItem[0].fg.jointype & JT_LEFT)!=0 + && !ExprHasProperty(pOrExpr, EP_FromJoin) + ); /* See TH3 vtab25.400 and ticket 614b25314c766238 */ + if( pAndExpr ){ + pAndExpr->pLeft = pOrExpr; + pOrExpr = pAndExpr; + } + /* Loop through table entries that match term pOrTerm. */ + ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1)); + WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); + pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, + wctrlFlags, iCovCur); + assert( pSubWInfo || pParse->nErr || db->mallocFailed ); + if( pSubWInfo ){ + WhereLoop *pSubLoop; + int addrExplain = sqlite3WhereExplainOneScan( + pParse, pOrTab, &pSubWInfo->a[0], 0 + ); + sqlite3WhereAddScanStatus(v, pOrTab, &pSubWInfo->a[0], addrExplain); + + /* This is the sub-WHERE clause body. First skip over + ** duplicate rows from prior sub-WHERE clauses, and record the + ** rowid (or PRIMARY KEY) for the current row so that the same + ** row will be skipped in subsequent sub-WHERE clauses. + */ + if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ + int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); + if( HasRowid(pTab) ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, regRowid); + jmp1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, + regRowid, iSet); + VdbeCoverage(v); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + int nPk = pPk->nKeyCol; + int iPk; + int r; + + /* Read the PK into an array of temp registers. */ + r = sqlite3GetTempRange(pParse, nPk); + for(iPk=0; iPkaiColumn[iPk]; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+iPk); + } + + /* Check if the temp table already contains this key. If so, + ** the row has already been included in the result set and + ** can be ignored (by jumping past the Gosub below). Otherwise, + ** insert the key into the temp table and proceed with processing + ** the row. + ** + ** Use some of the same optimizations as OP_RowSetTest: If iSet + ** is zero, assume that the key cannot already be present in + ** the temp table. And if iSet is -1, assume that there is no + ** need to insert the key into the temp table, as it will never + ** be tested for. */ + if( iSet ){ + jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, regRowset, 0, r, nPk); + VdbeCoverage(v); + } + if( iSet>=0 ){ + sqlite3VdbeAddOp3(v, OP_MakeRecord, r, nPk, regRowid); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, regRowset, regRowid, + r, nPk); + if( iSet ) sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + } + + /* Release the array of temp registers */ + sqlite3ReleaseTempRange(pParse, r, nPk); + } + } + + /* Invoke the main loop body as a subroutine */ + sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody); + + /* Jump here (skipping the main loop body subroutine) if the + ** current sub-WHERE row is a duplicate from prior sub-WHEREs. */ + if( jmp1 ) sqlite3VdbeJumpHere(v, jmp1); + + /* The pSubWInfo->untestedTerms flag means that this OR term + ** contained one or more AND term from a notReady table. The + ** terms from the notReady table could not be tested and will + ** need to be tested later. + */ + if( pSubWInfo->untestedTerms ) untestedTerms = 1; + + /* If all of the OR-connected terms are optimized using the same + ** index, and the index is opened using the same cursor number + ** by each call to sqlite3WhereBegin() made by this loop, it may + ** be possible to use that index as a covering index. + ** + ** If the call to sqlite3WhereBegin() above resulted in a scan that + ** uses an index, and this is either the first OR-connected term + ** processed or the index is the same as that used by all previous + ** terms, set pCov to the candidate covering index. Otherwise, set + ** pCov to NULL to indicate that no candidate covering index will + ** be available. + */ + pSubLoop = pSubWInfo->a[0].pWLoop; + assert( (pSubLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); + if( (pSubLoop->wsFlags & WHERE_INDEXED)!=0 + && (ii==0 || pSubLoop->u.btree.pIndex==pCov) + && (HasRowid(pTab) || !IsPrimaryKeyIndex(pSubLoop->u.btree.pIndex)) + ){ + assert( pSubWInfo->a[0].iIdxCur==iCovCur ); + pCov = pSubLoop->u.btree.pIndex; + }else{ + pCov = 0; + } + + /* Finish the loop through table entries that match term pOrTerm. */ + sqlite3WhereEnd(pSubWInfo); + ExplainQueryPlanPop(pParse); + } + } + } + ExplainQueryPlanPop(pParse); + pLevel->u.pCovidx = pCov; + if( pCov ) pLevel->iIdxCur = iCovCur; + if( pAndExpr ){ + pAndExpr->pLeft = 0; + sqlite3ExprDelete(db, pAndExpr); + } + sqlite3VdbeChangeP1(v, iRetInit, sqlite3VdbeCurrentAddr(v)); + sqlite3VdbeGoto(v, pLevel->addrBrk); + sqlite3VdbeResolveLabel(v, iLoopBody); + + if( pWInfo->nLevel>1 ){ sqlite3StackFree(db, pOrTab); } + if( !untestedTerms ) disableTerm(pLevel, pTerm); + }else +#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ + + { + /* Case 6: There is no usable index. We must do a complete + ** scan of the entire table. + */ + static const u8 aStep[] = { OP_Next, OP_Prev }; + static const u8 aStart[] = { OP_Rewind, OP_Last }; + assert( bRev==0 || bRev==1 ); + if( pTabItem->fg.isRecursive ){ + /* Tables marked isRecursive have only a single row that is stored in + ** a pseudo-cursor. No need to Rewind or Next such cursors. */ + pLevel->op = OP_Noop; + }else{ + codeCursorHint(pTabItem, pWInfo, pLevel, 0); + pLevel->op = aStep[bRev]; + pLevel->p1 = iCur; + pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrHalt); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + } + } + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + pLevel->addrVisit = sqlite3VdbeCurrentAddr(v); +#endif + + /* Insert code to test every subexpression that can be completely + ** computed using the current set of tables. + ** + ** This loop may run between one and three times, depending on the + ** constraints to be generated. The value of stack variable iLoop + ** determines the constraints coded by each iteration, as follows: + ** + ** iLoop==1: Code only expressions that are entirely covered by pIdx. + ** iLoop==2: Code remaining expressions that do not contain correlated + ** sub-queries. + ** iLoop==3: Code all remaining expressions. + ** + ** An effort is made to skip unnecessary iterations of the loop. + */ + iLoop = (pIdx ? 1 : 2); + do{ + int iNext = 0; /* Next value for iLoop */ + for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ + Expr *pE; + int skipLikeAddr = 0; + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + testcase( pTerm->wtFlags & TERM_CODED ); + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ + testcase( pWInfo->untestedTerms==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 ); + pWInfo->untestedTerms = 1; + continue; + } + pE = pTerm->pExpr; + assert( pE!=0 ); + if( (pTabItem->fg.jointype&JT_LEFT) && !ExprHasProperty(pE,EP_FromJoin) ){ + continue; + } + + if( iLoop==1 && !sqlite3ExprCoveredByIndex(pE, pLevel->iTabCur, pIdx) ){ + iNext = 2; + continue; + } + if( iLoop<3 && (pTerm->wtFlags & TERM_VARSELECT) ){ + if( iNext==0 ) iNext = 3; + continue; + } + + if( (pTerm->wtFlags & TERM_LIKECOND)!=0 ){ + /* If the TERM_LIKECOND flag is set, that means that the range search + ** is sufficient to guarantee that the LIKE operator is true, so we + ** can skip the call to the like(A,B) function. But this only works + ** for strings. So do not skip the call to the function on the pass + ** that compares BLOBs. */ +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS + continue; +#else + u32 x = pLevel->iLikeRepCntr; + if( x>0 ){ + skipLikeAddr = sqlite3VdbeAddOp1(v, (x&1)?OP_IfNot:OP_If,(int)(x>>1)); + VdbeCoverageIf(v, (x&1)==1); + VdbeCoverageIf(v, (x&1)==0); + } +#endif + } +#ifdef WHERETRACE_ENABLED /* 0xffff */ + if( sqlite3WhereTrace ){ + VdbeNoopComment((v, "WhereTerm[%d] (%p) priority=%d", + pWC->nTerm-j, pTerm, iLoop)); + } + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding auxiliary constraint:\n"); + sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); + } +#endif + sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); + if( skipLikeAddr ) sqlite3VdbeJumpHere(v, skipLikeAddr); + pTerm->wtFlags |= TERM_CODED; + } + iLoop = iNext; + }while( iLoop>0 ); + + /* Insert code to test for implied constraints based on transitivity + ** of the "==" operator. + ** + ** Example: If the WHERE clause contains "t1.a=t2.b" and "t2.b=123" + ** and we are coding the t1 loop and the t2 loop has not yet coded, + ** then we cannot use the "t1.a=t2.b" constraint, but we can code + ** the implied "t1.a=123" constraint. + */ + for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ + Expr *pE, sEAlt; + WhereTerm *pAlt; + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue; + if( (pTerm->eOperator & WO_EQUIV)==0 ) continue; + if( pTerm->leftCursor!=iCur ) continue; + if( pTabItem->fg.jointype & JT_LEFT ) continue; + pE = pTerm->pExpr; +#ifdef WHERETRACE_ENABLED /* 0x800 */ + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding transitive constraint:\n"); + sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); + } +#endif + assert( !ExprHasProperty(pE, EP_FromJoin) ); + assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); + pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.leftColumn, notReady, + WO_EQ|WO_IN|WO_IS, 0); + if( pAlt==0 ) continue; + if( pAlt->wtFlags & (TERM_CODED) ) continue; + if( (pAlt->eOperator & WO_IN) + && (pAlt->pExpr->flags & EP_xIsSelect) + && (pAlt->pExpr->x.pSelect->pEList->nExpr>1) + ){ + continue; + } + testcase( pAlt->eOperator & WO_EQ ); + testcase( pAlt->eOperator & WO_IS ); + testcase( pAlt->eOperator & WO_IN ); + VdbeModuleComment((v, "begin transitive constraint")); + sEAlt = *pAlt->pExpr; + sEAlt.pLeft = pE->pLeft; + sqlite3ExprIfFalse(pParse, &sEAlt, addrCont, SQLITE_JUMPIFNULL); + } + + /* For a LEFT OUTER JOIN, generate code that will record the fact that + ** at least one row of the right table has matched the left table. + */ + if( pLevel->iLeftJoin ){ + pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); + VdbeComment((v, "record LEFT JOIN hit")); + for(pTerm=pWC->a, j=0; jnTerm; j++, pTerm++){ + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + testcase( pTerm->wtFlags & TERM_CODED ); + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ + assert( pWInfo->untestedTerms ); + continue; + } + assert( pTerm->pExpr ); + sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); + pTerm->wtFlags |= TERM_CODED; + } + } + +#if WHERETRACE_ENABLED /* 0x20800 */ + if( sqlite3WhereTrace & 0x20000 ){ + sqlite3DebugPrintf("All WHERE-clause terms after coding level %d:\n", + iLevel); + sqlite3WhereClausePrint(pWC); + } + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("End Coding level %d: notReady=%llx\n", + iLevel, (u64)pLevel->notReady); + } +#endif + return pLevel->notReady; +} + +/************** End of wherecode.c *******************************************/ +/************** Begin file whereexpr.c ***************************************/ +/* +** 2015-06-08 +** +** 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 module contains C code that generates VDBE code used to process +** the WHERE clause of SQL statements. +** +** This file was originally part of where.c but was split out to improve +** readability and editabiliity. This file contains utility routines for +** analyzing Expr objects in the WHERE clause. +*/ +/* #include "sqliteInt.h" */ +/* #include "whereInt.h" */ + +/* Forward declarations */ +static void exprAnalyze(SrcList*, WhereClause*, int); + +/* +** Deallocate all memory associated with a WhereOrInfo object. +*/ +static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){ + sqlite3WhereClauseClear(&p->wc); + sqlite3DbFree(db, p); +} + +/* +** Deallocate all memory associated with a WhereAndInfo object. +*/ +static void whereAndInfoDelete(sqlite3 *db, WhereAndInfo *p){ + sqlite3WhereClauseClear(&p->wc); + sqlite3DbFree(db, p); +} + +/* +** Add a single new WhereTerm entry to the WhereClause object pWC. +** The new WhereTerm object is constructed from Expr p and with wtFlags. +** The index in pWC->a[] of the new WhereTerm is returned on success. +** 0 is returned if the new WhereTerm could not be added due to a memory +** allocation error. The memory allocation failure will be recorded in +** the db->mallocFailed flag so that higher-level functions can detect it. +** +** This routine will increase the size of the pWC->a[] array as necessary. +** +** If the wtFlags argument includes TERM_DYNAMIC, then responsibility +** for freeing the expression p is assumed by the WhereClause object pWC. +** This is true even if this routine fails to allocate a new WhereTerm. +** +** WARNING: This routine might reallocate the space used to store +** WhereTerms. All pointers to WhereTerms should be invalidated after +** calling this routine. Such pointers may be reinitialized by referencing +** the pWC->a[] array. +*/ +static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ + WhereTerm *pTerm; + int idx; + testcase( wtFlags & TERM_VIRTUAL ); + if( pWC->nTerm>=pWC->nSlot ){ + WhereTerm *pOld = pWC->a; + sqlite3 *db = pWC->pWInfo->pParse->db; + pWC->a = sqlite3DbMallocRawNN(db, sizeof(pWC->a[0])*pWC->nSlot*2 ); + if( pWC->a==0 ){ + if( wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, p); + } + pWC->a = pOld; + return 0; + } + memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm); + if( pOld!=pWC->aStatic ){ + sqlite3DbFree(db, pOld); + } + pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]); + } + pTerm = &pWC->a[idx = pWC->nTerm++]; + if( p && ExprHasProperty(p, EP_Unlikely) ){ + pTerm->truthProb = sqlite3LogEst(p->iTable) - 270; + }else{ + pTerm->truthProb = 1; + } + pTerm->pExpr = sqlite3ExprSkipCollateAndLikely(p); + pTerm->wtFlags = wtFlags; + pTerm->pWC = pWC; + pTerm->iParent = -1; + memset(&pTerm->eOperator, 0, + sizeof(WhereTerm) - offsetof(WhereTerm,eOperator)); + return idx; +} + +/* +** Return TRUE if the given operator is one of the operators that is +** allowed for an indexable WHERE clause term. The allowed operators are +** "=", "<", ">", "<=", ">=", "IN", "IS", and "IS NULL" +*/ +static int allowedOp(int op){ + assert( TK_GT>TK_EQ && TK_GTTK_EQ && TK_LTTK_EQ && TK_LE=TK_EQ && op<=TK_GE) || op==TK_ISNULL || op==TK_IS; +} + +/* +** Commute a comparison operator. Expressions of the form "X op Y" +** are converted into "Y op X". +*/ +static u16 exprCommute(Parse *pParse, Expr *pExpr){ + if( pExpr->pLeft->op==TK_VECTOR + || pExpr->pRight->op==TK_VECTOR + || sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight) != + sqlite3BinaryCompareCollSeq(pParse, pExpr->pRight, pExpr->pLeft) + ){ + pExpr->flags ^= EP_Commuted; + } + SWAP(Expr*,pExpr->pRight,pExpr->pLeft); + if( pExpr->op>=TK_GT ){ + assert( TK_LT==TK_GT+2 ); + assert( TK_GE==TK_LE+2 ); + assert( TK_GT>TK_EQ ); + assert( TK_GTop>=TK_GT && pExpr->op<=TK_GE ); + pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT; + } + return 0; +} + +/* +** Translate from TK_xx operator to WO_xx bitmask. +*/ +static u16 operatorMask(int op){ + u16 c; + assert( allowedOp(op) ); + if( op==TK_IN ){ + c = WO_IN; + }else if( op==TK_ISNULL ){ + c = WO_ISNULL; + }else if( op==TK_IS ){ + c = WO_IS; + }else{ + assert( (WO_EQ<<(op-TK_EQ)) < 0x7fff ); + c = (u16)(WO_EQ<<(op-TK_EQ)); + } + assert( op!=TK_ISNULL || c==WO_ISNULL ); + assert( op!=TK_IN || c==WO_IN ); + assert( op!=TK_EQ || c==WO_EQ ); + assert( op!=TK_LT || c==WO_LT ); + assert( op!=TK_LE || c==WO_LE ); + assert( op!=TK_GT || c==WO_GT ); + assert( op!=TK_GE || c==WO_GE ); + assert( op!=TK_IS || c==WO_IS ); + return c; +} + + +#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION +/* +** Check to see if the given expression is a LIKE or GLOB operator that +** can be optimized using inequality constraints. Return TRUE if it is +** so and false if not. +** +** In order for the operator to be optimizible, the RHS must be a string +** literal that does not begin with a wildcard. The LHS must be a column +** that may only be NULL, a string, or a BLOB, never a number. (This means +** that virtual tables cannot participate in the LIKE optimization.) The +** collating sequence for the column on the LHS must be appropriate for +** the operator. +*/ +static int isLikeOrGlob( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* Test this expression */ + Expr **ppPrefix, /* Pointer to TK_STRING expression with pattern prefix */ + int *pisComplete, /* True if the only wildcard is % in the last character */ + int *pnoCase /* True if uppercase is equivalent to lowercase */ +){ + const u8 *z = 0; /* String on RHS of LIKE operator */ + Expr *pRight, *pLeft; /* Right and left size of LIKE operator */ + ExprList *pList; /* List of operands to the LIKE operator */ + u8 c; /* One character in z[] */ + int cnt; /* Number of non-wildcard prefix characters */ + u8 wc[4]; /* Wildcard characters */ + sqlite3 *db = pParse->db; /* Database connection */ + sqlite3_value *pVal = 0; + int op; /* Opcode of pRight */ + int rc; /* Result code to return */ + + if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, (char*)wc) ){ + return 0; + } +#ifdef SQLITE_EBCDIC + if( *pnoCase ) return 0; +#endif + pList = pExpr->x.pList; + pLeft = pList->a[1].pExpr; + + pRight = sqlite3ExprSkipCollate(pList->a[0].pExpr); + op = pRight->op; + if( op==TK_VARIABLE && (db->flags & SQLITE_EnableQPSG)==0 ){ + Vdbe *pReprepare = pParse->pReprepare; + int iCol = pRight->iColumn; + pVal = sqlite3VdbeGetBoundValue(pReprepare, iCol, SQLITE_AFF_BLOB); + if( pVal && sqlite3_value_type(pVal)==SQLITE_TEXT ){ + z = sqlite3_value_text(pVal); + } + sqlite3VdbeSetVarmask(pParse->pVdbe, iCol); + assert( pRight->op==TK_VARIABLE || pRight->op==TK_REGISTER ); + }else if( op==TK_STRING ){ + z = (u8*)pRight->u.zToken; + } + if( z ){ + + /* Count the number of prefix characters prior to the first wildcard */ + cnt = 0; + while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){ + cnt++; + if( c==wc[3] && z[cnt]!=0 ) cnt++; + } + + /* The optimization is possible only if (1) the pattern does not begin + ** with a wildcard and if (2) the non-wildcard prefix does not end with + ** an (illegal 0xff) character, or (3) the pattern does not consist of + ** a single escape character. The second condition is necessary so + ** that we can increment the prefix key to find an upper bound for the + ** range search. The third is because the caller assumes that the pattern + ** consists of at least one character after all escapes have been + ** removed. */ + if( cnt!=0 && 255!=(u8)z[cnt-1] && (cnt>1 || z[0]!=wc[3]) ){ + Expr *pPrefix; + + /* A "complete" match if the pattern ends with "*" or "%" */ + *pisComplete = c==wc[0] && z[cnt+1]==0; + + /* Get the pattern prefix. Remove all escapes from the prefix. */ + pPrefix = sqlite3Expr(db, TK_STRING, (char*)z); + if( pPrefix ){ + int iFrom, iTo; + char *zNew = pPrefix->u.zToken; + zNew[cnt] = 0; + for(iFrom=iTo=0; iFrom0 ); + + /* If the LHS is not an ordinary column with TEXT affinity, then the + ** pattern prefix boundaries (both the start and end boundaries) must + ** not look like a number. Otherwise the pattern might be treated as + ** a number, which will invalidate the LIKE optimization. + ** + ** Getting this right has been a persistent source of bugs in the + ** LIKE optimization. See, for example: + ** 2018-09-10 https://sqlite.org/src/info/c94369cae9b561b1 + ** 2019-05-02 https://sqlite.org/src/info/b043a54c3de54b28 + ** 2019-06-10 https://sqlite.org/src/info/fd76310a5e843e07 + ** 2019-06-14 https://sqlite.org/src/info/ce8717f0885af975 + ** 2019-09-03 https://sqlite.org/src/info/0f0428096f17252a + */ + if( pLeft->op!=TK_COLUMN + || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT + || IsVirtual(pLeft->y.pTab) /* Value might be numeric */ + ){ + int isNum; + double rDummy; + isNum = sqlite3AtoF(zNew, &rDummy, iTo, SQLITE_UTF8); + if( isNum<=0 ){ + if( iTo==1 && zNew[0]=='-' ){ + isNum = +1; + }else{ + zNew[iTo-1]++; + isNum = sqlite3AtoF(zNew, &rDummy, iTo, SQLITE_UTF8); + zNew[iTo-1]--; + } + } + if( isNum>0 ){ + sqlite3ExprDelete(db, pPrefix); + sqlite3ValueFree(pVal); + return 0; + } + } + } + *ppPrefix = pPrefix; + + /* If the RHS pattern is a bound parameter, make arrangements to + ** reprepare the statement when that parameter is rebound */ + if( op==TK_VARIABLE ){ + Vdbe *v = pParse->pVdbe; + sqlite3VdbeSetVarmask(v, pRight->iColumn); + if( *pisComplete && pRight->u.zToken[1] ){ + /* If the rhs of the LIKE expression is a variable, and the current + ** value of the variable means there is no need to invoke the LIKE + ** function, then no OP_Variable will be added to the program. + ** This causes problems for the sqlite3_bind_parameter_name() + ** API. To work around them, add a dummy OP_Variable here. + */ + int r1 = sqlite3GetTempReg(pParse); + sqlite3ExprCodeTarget(pParse, pRight, r1); + sqlite3VdbeChangeP3(v, sqlite3VdbeCurrentAddr(v)-1, 0); + sqlite3ReleaseTempReg(pParse, r1); + } + } + }else{ + z = 0; + } + } + + rc = (z!=0); + sqlite3ValueFree(pVal); + return rc; +} +#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Check to see if the pExpr expression is a form that needs to be passed +** to the xBestIndex method of virtual tables. Forms of interest include: +** +** Expression Virtual Table Operator +** ----------------------- --------------------------------- +** 1. column MATCH expr SQLITE_INDEX_CONSTRAINT_MATCH +** 2. column GLOB expr SQLITE_INDEX_CONSTRAINT_GLOB +** 3. column LIKE expr SQLITE_INDEX_CONSTRAINT_LIKE +** 4. column REGEXP expr SQLITE_INDEX_CONSTRAINT_REGEXP +** 5. column != expr SQLITE_INDEX_CONSTRAINT_NE +** 6. expr != column SQLITE_INDEX_CONSTRAINT_NE +** 7. column IS NOT expr SQLITE_INDEX_CONSTRAINT_ISNOT +** 8. expr IS NOT column SQLITE_INDEX_CONSTRAINT_ISNOT +** 9. column IS NOT NULL SQLITE_INDEX_CONSTRAINT_ISNOTNULL +** +** In every case, "column" must be a column of a virtual table. If there +** is a match, set *ppLeft to the "column" expression, set *ppRight to the +** "expr" expression (even though in forms (6) and (8) the column is on the +** right and the expression is on the left). Also set *peOp2 to the +** appropriate virtual table operator. The return value is 1 or 2 if there +** is a match. The usual return is 1, but if the RHS is also a column +** of virtual table in forms (5) or (7) then return 2. +** +** If the expression matches none of the patterns above, return 0. +*/ +static int isAuxiliaryVtabOperator( + sqlite3 *db, /* Parsing context */ + Expr *pExpr, /* Test this expression */ + unsigned char *peOp2, /* OUT: 0 for MATCH, or else an op2 value */ + Expr **ppLeft, /* Column expression to left of MATCH/op2 */ + Expr **ppRight /* Expression to left of MATCH/op2 */ +){ + if( pExpr->op==TK_FUNCTION ){ + static const struct Op2 { + const char *zOp; + unsigned char eOp2; + } aOp[] = { + { "match", SQLITE_INDEX_CONSTRAINT_MATCH }, + { "glob", SQLITE_INDEX_CONSTRAINT_GLOB }, + { "like", SQLITE_INDEX_CONSTRAINT_LIKE }, + { "regexp", SQLITE_INDEX_CONSTRAINT_REGEXP } + }; + ExprList *pList; + Expr *pCol; /* Column reference */ + int i; + + pList = pExpr->x.pList; + if( pList==0 || pList->nExpr!=2 ){ + return 0; + } + + /* Built-in operators MATCH, GLOB, LIKE, and REGEXP attach to a + ** virtual table on their second argument, which is the same as + ** the left-hand side operand in their in-fix form. + ** + ** vtab_column MATCH expression + ** MATCH(expression,vtab_column) + */ + pCol = pList->a[1].pExpr; + testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); + if( ExprIsVtab(pCol) ){ + for(i=0; iu.zToken, aOp[i].zOp)==0 ){ + *peOp2 = aOp[i].eOp2; + *ppRight = pList->a[0].pExpr; + *ppLeft = pCol; + return 1; + } + } + } + + /* We can also match against the first column of overloaded + ** functions where xFindFunction returns a value of at least + ** SQLITE_INDEX_CONSTRAINT_FUNCTION. + ** + ** OVERLOADED(vtab_column,expression) + ** + ** Historically, xFindFunction expected to see lower-case function + ** names. But for this use case, xFindFunction is expected to deal + ** with function names in an arbitrary case. + */ + pCol = pList->a[0].pExpr; + testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); + if( ExprIsVtab(pCol) ){ + sqlite3_vtab *pVtab; + sqlite3_module *pMod; + void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**); + void *pNotUsed; + pVtab = sqlite3GetVTable(db, pCol->y.pTab)->pVtab; + assert( pVtab!=0 ); + assert( pVtab->pModule!=0 ); + pMod = (sqlite3_module *)pVtab->pModule; + if( pMod->xFindFunction!=0 ){ + i = pMod->xFindFunction(pVtab,2, pExpr->u.zToken, &xNotUsed, &pNotUsed); + if( i>=SQLITE_INDEX_CONSTRAINT_FUNCTION ){ + *peOp2 = i; + *ppRight = pList->a[1].pExpr; + *ppLeft = pCol; + return 1; + } + } + } + }else if( pExpr->op==TK_NE || pExpr->op==TK_ISNOT || pExpr->op==TK_NOTNULL ){ + int res = 0; + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pRight; + testcase( pLeft->op==TK_COLUMN && pLeft->y.pTab==0 ); + if( ExprIsVtab(pLeft) ){ + res++; + } + testcase( pRight && pRight->op==TK_COLUMN && pRight->y.pTab==0 ); + if( pRight && ExprIsVtab(pRight) ){ + res++; + SWAP(Expr*, pLeft, pRight); + } + *ppLeft = pLeft; + *ppRight = pRight; + if( pExpr->op==TK_NE ) *peOp2 = SQLITE_INDEX_CONSTRAINT_NE; + if( pExpr->op==TK_ISNOT ) *peOp2 = SQLITE_INDEX_CONSTRAINT_ISNOT; + if( pExpr->op==TK_NOTNULL ) *peOp2 = SQLITE_INDEX_CONSTRAINT_ISNOTNULL; + return res; + } + return 0; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/* +** If the pBase expression originated in the ON or USING clause of +** a join, then transfer the appropriate markings over to derived. +*/ +static void transferJoinMarkings(Expr *pDerived, Expr *pBase){ + if( pDerived ){ + pDerived->flags |= pBase->flags & EP_FromJoin; + pDerived->iRightJoinTable = pBase->iRightJoinTable; + } +} + +/* +** Mark term iChild as being a child of term iParent +*/ +static void markTermAsChild(WhereClause *pWC, int iChild, int iParent){ + pWC->a[iChild].iParent = iParent; + pWC->a[iChild].truthProb = pWC->a[iParent].truthProb; + pWC->a[iParent].nChild++; +} + +/* +** Return the N-th AND-connected subterm of pTerm. Or if pTerm is not +** a conjunction, then return just pTerm when N==0. If N is exceeds +** the number of available subterms, return NULL. +*/ +static WhereTerm *whereNthSubterm(WhereTerm *pTerm, int N){ + if( pTerm->eOperator!=WO_AND ){ + return N==0 ? pTerm : 0; + } + if( Nu.pAndInfo->wc.nTerm ){ + return &pTerm->u.pAndInfo->wc.a[N]; + } + return 0; +} + +/* +** Subterms pOne and pTwo are contained within WHERE clause pWC. The +** two subterms are in disjunction - they are OR-ed together. +** +** If these two terms are both of the form: "A op B" with the same +** A and B values but different operators and if the operators are +** compatible (if one is = and the other is <, for example) then +** add a new virtual AND term to pWC that is the combination of the +** two. +** +** Some examples: +** +** x x<=y +** x=y OR x=y --> x=y +** x<=y OR x x<=y +** +** The following is NOT generated: +** +** xy --> x!=y +*/ +static void whereCombineDisjuncts( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* The complete WHERE clause */ + WhereTerm *pOne, /* First disjunct */ + WhereTerm *pTwo /* Second disjunct */ +){ + u16 eOp = pOne->eOperator | pTwo->eOperator; + sqlite3 *db; /* Database connection (for malloc) */ + Expr *pNew; /* New virtual expression */ + int op; /* Operator for the combined expression */ + int idxNew; /* Index in pWC of the next virtual term */ + + if( (pOne->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; + if( (pTwo->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; + if( (eOp & (WO_EQ|WO_LT|WO_LE))!=eOp + && (eOp & (WO_EQ|WO_GT|WO_GE))!=eOp ) return; + assert( pOne->pExpr->pLeft!=0 && pOne->pExpr->pRight!=0 ); + assert( pTwo->pExpr->pLeft!=0 && pTwo->pExpr->pRight!=0 ); + if( sqlite3ExprCompare(0,pOne->pExpr->pLeft, pTwo->pExpr->pLeft, -1) ) return; + if( sqlite3ExprCompare(0,pOne->pExpr->pRight, pTwo->pExpr->pRight,-1) )return; + /* If we reach this point, it means the two subterms can be combined */ + if( (eOp & (eOp-1))!=0 ){ + if( eOp & (WO_LT|WO_LE) ){ + eOp = WO_LE; + }else{ + assert( eOp & (WO_GT|WO_GE) ); + eOp = WO_GE; + } + } + db = pWC->pWInfo->pParse->db; + pNew = sqlite3ExprDup(db, pOne->pExpr, 0); + if( pNew==0 ) return; + for(op=TK_EQ; eOp!=(WO_EQ<<(op-TK_EQ)); op++){ assert( opop = op; + idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); + exprAnalyze(pSrc, pWC, idxNew); +} + +#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) +/* +** Analyze a term that consists of two or more OR-connected +** subterms. So in: +** +** ... WHERE (a=5) AND (b=7 OR c=9 OR d=13) AND (d=13) +** ^^^^^^^^^^^^^^^^^^^^ +** +** This routine analyzes terms such as the middle term in the above example. +** A WhereOrTerm object is computed and attached to the term under +** analysis, regardless of the outcome of the analysis. Hence: +** +** WhereTerm.wtFlags |= TERM_ORINFO +** WhereTerm.u.pOrInfo = a dynamically allocated WhereOrTerm object +** +** The term being analyzed must have two or more of OR-connected subterms. +** A single subterm might be a set of AND-connected sub-subterms. +** Examples of terms under analysis: +** +** (A) t1.x=t2.y OR t1.x=t2.z OR t1.y=15 OR t1.z=t3.a+5 +** (B) x=expr1 OR expr2=x OR x=expr3 +** (C) t1.x=t2.y OR (t1.x=t2.z AND t1.y=15) +** (D) x=expr1 OR (y>11 AND y<22 AND z LIKE '*hello*') +** (E) (p.a=1 AND q.b=2 AND r.c=3) OR (p.x=4 AND q.y=5 AND r.z=6) +** (F) x>A OR (x=A AND y>=B) +** +** CASE 1: +** +** If all subterms are of the form T.C=expr for some single column of C and +** a single table T (as shown in example B above) then create a new virtual +** term that is an equivalent IN expression. In other words, if the term +** being analyzed is: +** +** x = expr1 OR expr2 = x OR x = expr3 +** +** then create a new virtual term like this: +** +** x IN (expr1,expr2,expr3) +** +** CASE 2: +** +** If there are exactly two disjuncts and one side has x>A and the other side +** has x=A (for the same x and A) then add a new virtual conjunct term to the +** WHERE clause of the form "x>=A". Example: +** +** x>A OR (x=A AND y>B) adds: x>=A +** +** The added conjunct can sometimes be helpful in query planning. +** +** CASE 3: +** +** If all subterms are indexable by a single table T, then set +** +** WhereTerm.eOperator = WO_OR +** WhereTerm.u.pOrInfo->indexable |= the cursor number for table T +** +** A subterm is "indexable" if it is of the form +** "T.C " where C is any column of table T and +** is one of "=", "<", "<=", ">", ">=", "IS NULL", or "IN". +** A subterm is also indexable if it is an AND of two or more +** subsubterms at least one of which is indexable. Indexable AND +** subterms have their eOperator set to WO_AND and they have +** u.pAndInfo set to a dynamically allocated WhereAndTerm object. +** +** From another point of view, "indexable" means that the subterm could +** potentially be used with an index if an appropriate index exists. +** This analysis does not consider whether or not the index exists; that +** is decided elsewhere. This analysis only looks at whether subterms +** appropriate for indexing exist. +** +** All examples A through E above satisfy case 3. But if a term +** also satisfies case 1 (such as B) we know that the optimizer will +** always prefer case 1, so in that case we pretend that case 3 is not +** satisfied. +** +** It might be the case that multiple tables are indexable. For example, +** (E) above is indexable on tables P, Q, and R. +** +** Terms that satisfy case 3 are candidates for lookup by using +** separate indices to find rowids for each subterm and composing +** the union of all rowids using a RowSet object. This is similar +** to "bitmap indices" in other database engines. +** +** OTHERWISE: +** +** If none of cases 1, 2, or 3 apply, then leave the eOperator set to +** zero. This term is not useful for search. +*/ +static void exprAnalyzeOrTerm( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* the complete WHERE clause */ + int idxTerm /* Index of the OR-term to be analyzed */ +){ + WhereInfo *pWInfo = pWC->pWInfo; /* WHERE clause processing context */ + Parse *pParse = pWInfo->pParse; /* Parser context */ + sqlite3 *db = pParse->db; /* Database connection */ + WhereTerm *pTerm = &pWC->a[idxTerm]; /* The term to be analyzed */ + Expr *pExpr = pTerm->pExpr; /* The expression of the term */ + int i; /* Loop counters */ + WhereClause *pOrWc; /* Breakup of pTerm into subterms */ + WhereTerm *pOrTerm; /* A Sub-term within the pOrWc */ + WhereOrInfo *pOrInfo; /* Additional information associated with pTerm */ + Bitmask chngToIN; /* Tables that might satisfy case 1 */ + Bitmask indexable; /* Tables that are indexable, satisfying case 2 */ + + /* + ** Break the OR clause into its separate subterms. The subterms are + ** stored in a WhereClause structure containing within the WhereOrInfo + ** object that is attached to the original OR clause term. + */ + assert( (pTerm->wtFlags & (TERM_DYNAMIC|TERM_ORINFO|TERM_ANDINFO))==0 ); + assert( pExpr->op==TK_OR ); + pTerm->u.pOrInfo = pOrInfo = sqlite3DbMallocZero(db, sizeof(*pOrInfo)); + if( pOrInfo==0 ) return; + pTerm->wtFlags |= TERM_ORINFO; + pOrWc = &pOrInfo->wc; + memset(pOrWc->aStatic, 0, sizeof(pOrWc->aStatic)); + sqlite3WhereClauseInit(pOrWc, pWInfo); + sqlite3WhereSplit(pOrWc, pExpr, TK_OR); + sqlite3WhereExprAnalyze(pSrc, pOrWc); + if( db->mallocFailed ) return; + assert( pOrWc->nTerm>=2 ); + + /* + ** Compute the set of tables that might satisfy cases 1 or 3. + */ + indexable = ~(Bitmask)0; + chngToIN = ~(Bitmask)0; + for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0 && indexable; i--, pOrTerm++){ + if( (pOrTerm->eOperator & WO_SINGLE)==0 ){ + WhereAndInfo *pAndInfo; + assert( (pOrTerm->wtFlags & (TERM_ANDINFO|TERM_ORINFO))==0 ); + chngToIN = 0; + pAndInfo = sqlite3DbMallocRawNN(db, sizeof(*pAndInfo)); + if( pAndInfo ){ + WhereClause *pAndWC; + WhereTerm *pAndTerm; + int j; + Bitmask b = 0; + pOrTerm->u.pAndInfo = pAndInfo; + pOrTerm->wtFlags |= TERM_ANDINFO; + pOrTerm->eOperator = WO_AND; + pAndWC = &pAndInfo->wc; + memset(pAndWC->aStatic, 0, sizeof(pAndWC->aStatic)); + sqlite3WhereClauseInit(pAndWC, pWC->pWInfo); + sqlite3WhereSplit(pAndWC, pOrTerm->pExpr, TK_AND); + sqlite3WhereExprAnalyze(pSrc, pAndWC); + pAndWC->pOuter = pWC; + if( !db->mallocFailed ){ + for(j=0, pAndTerm=pAndWC->a; jnTerm; j++, pAndTerm++){ + assert( pAndTerm->pExpr ); + if( allowedOp(pAndTerm->pExpr->op) + || pAndTerm->eOperator==WO_AUX + ){ + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pAndTerm->leftCursor); + } + } + } + indexable &= b; + } + }else if( pOrTerm->wtFlags & TERM_COPIED ){ + /* Skip this term for now. We revisit it when we process the + ** corresponding TERM_VIRTUAL term */ + }else{ + Bitmask b; + b = sqlite3WhereGetMask(&pWInfo->sMaskSet, pOrTerm->leftCursor); + if( pOrTerm->wtFlags & TERM_VIRTUAL ){ + WhereTerm *pOther = &pOrWc->a[pOrTerm->iParent]; + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pOther->leftCursor); + } + indexable &= b; + if( (pOrTerm->eOperator & WO_EQ)==0 ){ + chngToIN = 0; + }else{ + chngToIN &= b; + } + } + } + + /* + ** Record the set of tables that satisfy case 3. The set might be + ** empty. + */ + pOrInfo->indexable = indexable; + if( indexable ){ + pTerm->eOperator = WO_OR; + pWC->hasOr = 1; + }else{ + pTerm->eOperator = WO_OR; + } + + /* For a two-way OR, attempt to implementation case 2. + */ + if( indexable && pOrWc->nTerm==2 ){ + int iOne = 0; + WhereTerm *pOne; + while( (pOne = whereNthSubterm(&pOrWc->a[0],iOne++))!=0 ){ + int iTwo = 0; + WhereTerm *pTwo; + while( (pTwo = whereNthSubterm(&pOrWc->a[1],iTwo++))!=0 ){ + whereCombineDisjuncts(pSrc, pWC, pOne, pTwo); + } + } + } + + /* + ** chngToIN holds a set of tables that *might* satisfy case 1. But + ** we have to do some additional checking to see if case 1 really + ** is satisfied. + ** + ** chngToIN will hold either 0, 1, or 2 bits. The 0-bit case means + ** that there is no possibility of transforming the OR clause into an + ** IN operator because one or more terms in the OR clause contain + ** something other than == on a column in the single table. The 1-bit + ** case means that every term of the OR clause is of the form + ** "table.column=expr" for some single table. The one bit that is set + ** will correspond to the common table. We still need to check to make + ** sure the same column is used on all terms. The 2-bit case is when + ** the all terms are of the form "table1.column=table2.column". It + ** might be possible to form an IN operator with either table1.column + ** or table2.column as the LHS if either is common to every term of + ** the OR clause. + ** + ** Note that terms of the form "table.column1=table.column2" (the + ** same table on both sizes of the ==) cannot be optimized. + */ + if( chngToIN ){ + int okToChngToIN = 0; /* True if the conversion to IN is valid */ + int iColumn = -1; /* Column index on lhs of IN operator */ + int iCursor = -1; /* Table cursor common to all terms */ + int j = 0; /* Loop counter */ + + /* Search for a table and column that appears on one side or the + ** other of the == operator in every subterm. That table and column + ** will be recorded in iCursor and iColumn. There might not be any + ** such table and column. Set okToChngToIN if an appropriate table + ** and column is found but leave okToChngToIN false if not found. + */ + for(j=0; j<2 && !okToChngToIN; j++){ + Expr *pLeft = 0; + pOrTerm = pOrWc->a; + for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){ + assert( pOrTerm->eOperator & WO_EQ ); + pOrTerm->wtFlags &= ~TERM_OR_OK; + if( pOrTerm->leftCursor==iCursor ){ + /* This is the 2-bit case and we are on the second iteration and + ** current term is from the first iteration. So skip this term. */ + assert( j==1 ); + continue; + } + if( (chngToIN & sqlite3WhereGetMask(&pWInfo->sMaskSet, + pOrTerm->leftCursor))==0 ){ + /* This term must be of the form t1.a==t2.b where t2 is in the + ** chngToIN set but t1 is not. This term will be either preceded + ** or follwed by an inverted copy (t2.b==t1.a). Skip this term + ** and use its inversion. */ + testcase( pOrTerm->wtFlags & TERM_COPIED ); + testcase( pOrTerm->wtFlags & TERM_VIRTUAL ); + assert( pOrTerm->wtFlags & (TERM_COPIED|TERM_VIRTUAL) ); + continue; + } + iColumn = pOrTerm->u.leftColumn; + iCursor = pOrTerm->leftCursor; + pLeft = pOrTerm->pExpr->pLeft; + break; + } + if( i<0 ){ + /* No candidate table+column was found. This can only occur + ** on the second iteration */ + assert( j==1 ); + assert( IsPowerOfTwo(chngToIN) ); + assert( chngToIN==sqlite3WhereGetMask(&pWInfo->sMaskSet, iCursor) ); + break; + } + testcase( j==1 ); + + /* We have found a candidate table and column. Check to see if that + ** table and column is common to every term in the OR clause */ + okToChngToIN = 1; + for(; i>=0 && okToChngToIN; i--, pOrTerm++){ + assert( pOrTerm->eOperator & WO_EQ ); + if( pOrTerm->leftCursor!=iCursor ){ + pOrTerm->wtFlags &= ~TERM_OR_OK; + }else if( pOrTerm->u.leftColumn!=iColumn || (iColumn==XN_EXPR + && sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1) + )){ + okToChngToIN = 0; + }else{ + int affLeft, affRight; + /* If the right-hand side is also a column, then the affinities + ** of both right and left sides must be such that no type + ** conversions are required on the right. (Ticket #2249) + */ + affRight = sqlite3ExprAffinity(pOrTerm->pExpr->pRight); + affLeft = sqlite3ExprAffinity(pOrTerm->pExpr->pLeft); + if( affRight!=0 && affRight!=affLeft ){ + okToChngToIN = 0; + }else{ + pOrTerm->wtFlags |= TERM_OR_OK; + } + } + } + } + + /* At this point, okToChngToIN is true if original pTerm satisfies + ** case 1. In that case, construct a new virtual term that is + ** pTerm converted into an IN operator. + */ + if( okToChngToIN ){ + Expr *pDup; /* A transient duplicate expression */ + ExprList *pList = 0; /* The RHS of the IN operator */ + Expr *pLeft = 0; /* The LHS of the IN operator */ + Expr *pNew; /* The complete IN operator */ + + for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0; i--, pOrTerm++){ + if( (pOrTerm->wtFlags & TERM_OR_OK)==0 ) continue; + assert( pOrTerm->eOperator & WO_EQ ); + assert( pOrTerm->leftCursor==iCursor ); + assert( pOrTerm->u.leftColumn==iColumn ); + pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight, 0); + pList = sqlite3ExprListAppend(pWInfo->pParse, pList, pDup); + pLeft = pOrTerm->pExpr->pLeft; + } + assert( pLeft!=0 ); + pDup = sqlite3ExprDup(db, pLeft, 0); + pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0); + if( pNew ){ + int idxNew; + transferJoinMarkings(pNew, pExpr); + assert( !ExprHasProperty(pNew, EP_xIsSelect) ); + pNew->x.pList = pList; + idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + exprAnalyze(pSrc, pWC, idxNew); + /* pTerm = &pWC->a[idxTerm]; // would be needed if pTerm where used again */ + markTermAsChild(pWC, idxNew, idxTerm); + }else{ + sqlite3ExprListDelete(db, pList); + } + } + } +} +#endif /* !SQLITE_OMIT_OR_OPTIMIZATION && !SQLITE_OMIT_SUBQUERY */ + +/* +** We already know that pExpr is a binary operator where both operands are +** column references. This routine checks to see if pExpr is an equivalence +** relation: +** 1. The SQLITE_Transitive optimization must be enabled +** 2. Must be either an == or an IS operator +** 3. Not originating in the ON clause of an OUTER JOIN +** 4. The affinities of A and B must be compatible +** 5a. Both operands use the same collating sequence OR +** 5b. The overall collating sequence is BINARY +** If this routine returns TRUE, that means that the RHS can be substituted +** for the LHS anyplace else in the WHERE clause where the LHS column occurs. +** This is an optimization. No harm comes from returning 0. But if 1 is +** returned when it should not be, then incorrect answers might result. +*/ +static int termIsEquivalence(Parse *pParse, Expr *pExpr){ + char aff1, aff2; + CollSeq *pColl; + if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; + if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; + if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; + aff1 = sqlite3ExprAffinity(pExpr->pLeft); + aff2 = sqlite3ExprAffinity(pExpr->pRight); + if( aff1!=aff2 + && (!sqlite3IsNumericAffinity(aff1) || !sqlite3IsNumericAffinity(aff2)) + ){ + return 0; + } + pColl = sqlite3ExprCompareCollSeq(pParse, pExpr); + if( sqlite3IsBinary(pColl) ) return 1; + return sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight); +} + +/* +** Recursively walk the expressions of a SELECT statement and generate +** a bitmask indicating which tables are used in that expression +** tree. +*/ +static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){ + Bitmask mask = 0; + while( pS ){ + SrcList *pSrc = pS->pSrc; + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pEList); + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pGroupBy); + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pOrderBy); + mask |= sqlite3WhereExprUsage(pMaskSet, pS->pWhere); + mask |= sqlite3WhereExprUsage(pMaskSet, pS->pHaving); + if( ALWAYS(pSrc!=0) ){ + int i; + for(i=0; inSrc; i++){ + mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect); + mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].pOn); + if( pSrc->a[i].fg.isTabFunc ){ + mask |= sqlite3WhereExprListUsage(pMaskSet, pSrc->a[i].u1.pFuncArg); + } + } + } + pS = pS->pPrior; + } + return mask; +} + +/* +** Expression pExpr is one operand of a comparison operator that might +** be useful for indexing. This routine checks to see if pExpr appears +** in any index. Return TRUE (1) if pExpr is an indexed term and return +** FALSE (0) if not. If TRUE is returned, also set aiCurCol[0] to the cursor +** number of the table that is indexed and aiCurCol[1] to the column number +** of the column that is indexed, or XN_EXPR (-2) if an expression is being +** indexed. +** +** If pExpr is a TK_COLUMN column reference, then this routine always returns +** true even if that particular column is not indexed, because the column +** might be added to an automatic index later. +*/ +static SQLITE_NOINLINE int exprMightBeIndexed2( + SrcList *pFrom, /* The FROM clause */ + Bitmask mPrereq, /* Bitmask of FROM clause terms referenced by pExpr */ + int *aiCurCol, /* Write the referenced table cursor and column here */ + Expr *pExpr /* An operand of a comparison operator */ +){ + Index *pIdx; + int i; + int iCur; + for(i=0; mPrereq>1; i++, mPrereq>>=1){} + iCur = pFrom->a[i].iCursor; + for(pIdx=pFrom->a[i].pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->aColExpr==0 ) continue; + for(i=0; inKeyCol; i++){ + if( pIdx->aiColumn[i]!=XN_EXPR ) continue; + if( sqlite3ExprCompareSkip(pExpr, pIdx->aColExpr->a[i].pExpr, iCur)==0 ){ + aiCurCol[0] = iCur; + aiCurCol[1] = XN_EXPR; + return 1; + } + } + } + return 0; +} +static int exprMightBeIndexed( + SrcList *pFrom, /* The FROM clause */ + Bitmask mPrereq, /* Bitmask of FROM clause terms referenced by pExpr */ + int *aiCurCol, /* Write the referenced table cursor & column here */ + Expr *pExpr, /* An operand of a comparison operator */ + int op /* The specific comparison operator */ +){ + /* If this expression is a vector to the left or right of a + ** inequality constraint (>, <, >= or <=), perform the processing + ** on the first element of the vector. */ + assert( TK_GT+1==TK_LE && TK_GT+2==TK_LT && TK_GT+3==TK_GE ); + assert( TK_ISop==TK_VECTOR && (op>=TK_GT && ALWAYS(op<=TK_GE)) ){ + pExpr = pExpr->x.pList->a[0].pExpr; + } + + if( pExpr->op==TK_COLUMN ){ + aiCurCol[0] = pExpr->iTable; + aiCurCol[1] = pExpr->iColumn; + return 1; + } + if( mPrereq==0 ) return 0; /* No table references */ + if( (mPrereq&(mPrereq-1))!=0 ) return 0; /* Refs more than one table */ + return exprMightBeIndexed2(pFrom,mPrereq,aiCurCol,pExpr); +} + +/* +** The input to this routine is an WhereTerm structure with only the +** "pExpr" field filled in. The job of this routine is to analyze the +** subexpression and populate all the other fields of the WhereTerm +** structure. +** +** If the expression is of the form " X" it gets commuted +** to the standard form of "X ". +** +** If the expression is of the form "X Y" where both X and Y are +** columns, then the original expression is unchanged and a new virtual +** term of the form "Y X" is added to the WHERE clause and +** analyzed separately. The original term is marked with TERM_COPIED +** and the new term is marked with TERM_DYNAMIC (because it's pExpr +** needs to be freed with the WhereClause) and TERM_VIRTUAL (because it +** is a commuted copy of a prior term.) The original term has nChild=1 +** and the copy has idxParent set to the index of the original term. +*/ +static void exprAnalyze( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* the WHERE clause */ + int idxTerm /* Index of the term to be analyzed */ +){ + WhereInfo *pWInfo = pWC->pWInfo; /* WHERE clause processing context */ + WhereTerm *pTerm; /* The term to be analyzed */ + WhereMaskSet *pMaskSet; /* Set of table index masks */ + Expr *pExpr; /* The expression to be analyzed */ + Bitmask prereqLeft; /* Prerequesites of the pExpr->pLeft */ + Bitmask prereqAll; /* Prerequesites of pExpr */ + Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */ + Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */ + int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */ + int noCase = 0; /* uppercase equivalent to lowercase */ + int op; /* Top-level operator. pExpr->op */ + Parse *pParse = pWInfo->pParse; /* Parsing context */ + sqlite3 *db = pParse->db; /* Database connection */ + unsigned char eOp2 = 0; /* op2 value for LIKE/REGEXP/GLOB */ + int nLeft; /* Number of elements on left side vector */ + + if( db->mallocFailed ){ + return; + } + pTerm = &pWC->a[idxTerm]; + pMaskSet = &pWInfo->sMaskSet; + pExpr = pTerm->pExpr; + assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE ); + prereqLeft = sqlite3WhereExprUsage(pMaskSet, pExpr->pLeft); + op = pExpr->op; + if( op==TK_IN ){ + assert( pExpr->pRight==0 ); + if( sqlite3ExprCheckIN(pParse, pExpr) ) return; + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + pTerm->prereqRight = exprSelectUsage(pMaskSet, pExpr->x.pSelect); + }else{ + pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList); + } + }else if( op==TK_ISNULL ){ + pTerm->prereqRight = 0; + }else{ + pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); + } + pMaskSet->bVarSelect = 0; + prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr); + if( pMaskSet->bVarSelect ) pTerm->wtFlags |= TERM_VARSELECT; + if( ExprHasProperty(pExpr, EP_FromJoin) ){ + Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable); + prereqAll |= x; + extraRight = x-1; /* ON clause terms may not be used with an index + ** on left table of a LEFT JOIN. Ticket #3015 */ + if( (prereqAll>>1)>=x ){ + sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); + return; + } + } + pTerm->prereqAll = prereqAll; + pTerm->leftCursor = -1; + pTerm->iParent = -1; + pTerm->eOperator = 0; + if( allowedOp(op) ){ + int aiCurCol[2]; + Expr *pLeft = sqlite3ExprSkipCollate(pExpr->pLeft); + Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight); + u16 opMask = (pTerm->prereqRight & prereqLeft)==0 ? WO_ALL : WO_EQUIV; + + if( pTerm->iField>0 ){ + assert( op==TK_IN ); + assert( pLeft->op==TK_VECTOR ); + pLeft = pLeft->x.pList->a[pTerm->iField-1].pExpr; + } + + if( exprMightBeIndexed(pSrc, prereqLeft, aiCurCol, pLeft, op) ){ + pTerm->leftCursor = aiCurCol[0]; + pTerm->u.leftColumn = aiCurCol[1]; + pTerm->eOperator = operatorMask(op) & opMask; + } + if( op==TK_IS ) pTerm->wtFlags |= TERM_IS; + if( pRight + && exprMightBeIndexed(pSrc, pTerm->prereqRight, aiCurCol, pRight, op) + ){ + WhereTerm *pNew; + Expr *pDup; + u16 eExtraOp = 0; /* Extra bits for pNew->eOperator */ + assert( pTerm->iField==0 ); + if( pTerm->leftCursor>=0 ){ + int idxNew; + pDup = sqlite3ExprDup(db, pExpr, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDup); + return; + } + idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC); + if( idxNew==0 ) return; + pNew = &pWC->a[idxNew]; + markTermAsChild(pWC, idxNew, idxTerm); + if( op==TK_IS ) pNew->wtFlags |= TERM_IS; + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + + if( termIsEquivalence(pParse, pDup) ){ + pTerm->eOperator |= WO_EQUIV; + eExtraOp = WO_EQUIV; + } + }else{ + pDup = pExpr; + pNew = pTerm; + } + pNew->wtFlags |= exprCommute(pParse, pDup); + pNew->leftCursor = aiCurCol[0]; + pNew->u.leftColumn = aiCurCol[1]; + testcase( (prereqLeft | extraRight) != prereqLeft ); + pNew->prereqRight = prereqLeft | extraRight; + pNew->prereqAll = prereqAll; + pNew->eOperator = (operatorMask(pDup->op) + eExtraOp) & opMask; + } + } + +#ifndef SQLITE_OMIT_BETWEEN_OPTIMIZATION + /* If a term is the BETWEEN operator, create two new virtual terms + ** that define the range that the BETWEEN implements. For example: + ** + ** a BETWEEN b AND c + ** + ** is converted into: + ** + ** (a BETWEEN b AND c) AND (a>=b) AND (a<=c) + ** + ** The two new terms are added onto the end of the WhereClause object. + ** The new terms are "dynamic" and are children of the original BETWEEN + ** term. That means that if the BETWEEN term is coded, the children are + ** skipped. Or, if the children are satisfied by an index, the original + ** BETWEEN term is skipped. + */ + else if( pExpr->op==TK_BETWEEN && pWC->op==TK_AND ){ + ExprList *pList = pExpr->x.pList; + int i; + static const u8 ops[] = {TK_GE, TK_LE}; + assert( pList!=0 ); + assert( pList->nExpr==2 ); + for(i=0; i<2; i++){ + Expr *pNewExpr; + int idxNew; + pNewExpr = sqlite3PExpr(pParse, ops[i], + sqlite3ExprDup(db, pExpr->pLeft, 0), + sqlite3ExprDup(db, pList->a[i].pExpr, 0)); + transferJoinMarkings(pNewExpr, pExpr); + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + exprAnalyze(pSrc, pWC, idxNew); + pTerm = &pWC->a[idxTerm]; + markTermAsChild(pWC, idxNew, idxTerm); + } + } +#endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */ + +#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) + /* Analyze a term that is composed of two or more subterms connected by + ** an OR operator. + */ + else if( pExpr->op==TK_OR ){ + assert( pWC->op==TK_AND ); + exprAnalyzeOrTerm(pSrc, pWC, idxTerm); + pTerm = &pWC->a[idxTerm]; + } +#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ + +#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION + /* Add constraints to reduce the search space on a LIKE or GLOB + ** operator. + ** + ** A like pattern of the form "x LIKE 'aBc%'" is changed into constraints + ** + ** x>='ABC' AND x<'abd' AND x LIKE 'aBc%' + ** + ** The last character of the prefix "abc" is incremented to form the + ** termination condition "abd". If case is not significant (the default + ** for LIKE) then the lower-bound is made all uppercase and the upper- + ** bound is made all lowercase so that the bounds also work when comparing + ** BLOBs. + */ + if( pWC->op==TK_AND + && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase) + ){ + Expr *pLeft; /* LHS of LIKE/GLOB operator */ + Expr *pStr2; /* Copy of pStr1 - RHS of LIKE/GLOB operator */ + Expr *pNewExpr1; + Expr *pNewExpr2; + int idxNew1; + int idxNew2; + const char *zCollSeqName; /* Name of collating sequence */ + const u16 wtFlags = TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC; + + pLeft = pExpr->x.pList->a[1].pExpr; + pStr2 = sqlite3ExprDup(db, pStr1, 0); + + /* Convert the lower bound to upper-case and the upper bound to + ** lower-case (upper-case is less than lower-case in ASCII) so that + ** the range constraints also work for BLOBs + */ + if( noCase && !pParse->db->mallocFailed ){ + int i; + char c; + pTerm->wtFlags |= TERM_LIKE; + for(i=0; (c = pStr1->u.zToken[i])!=0; i++){ + pStr1->u.zToken[i] = sqlite3Toupper(c); + pStr2->u.zToken[i] = sqlite3Tolower(c); + } + } + + if( !db->mallocFailed ){ + u8 c, *pC; /* Last character before the first wildcard */ + pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1]; + c = *pC; + if( noCase ){ + /* The point is to increment the last character before the first + ** wildcard. But if we increment '@', that will push it into the + ** alphabetic range where case conversions will mess up the + ** inequality. To avoid this, make sure to also run the full + ** LIKE on all candidate expressions by clearing the isComplete flag + */ + if( c=='A'-1 ) isComplete = 0; + c = sqlite3UpperToLower[c]; + } + *pC = c + 1; + } + zCollSeqName = noCase ? "NOCASE" : sqlite3StrBINARY; + pNewExpr1 = sqlite3ExprDup(db, pLeft, 0); + pNewExpr1 = sqlite3PExpr(pParse, TK_GE, + sqlite3ExprAddCollateString(pParse,pNewExpr1,zCollSeqName), + pStr1); + transferJoinMarkings(pNewExpr1, pExpr); + idxNew1 = whereClauseInsert(pWC, pNewExpr1, wtFlags); + testcase( idxNew1==0 ); + exprAnalyze(pSrc, pWC, idxNew1); + pNewExpr2 = sqlite3ExprDup(db, pLeft, 0); + pNewExpr2 = sqlite3PExpr(pParse, TK_LT, + sqlite3ExprAddCollateString(pParse,pNewExpr2,zCollSeqName), + pStr2); + transferJoinMarkings(pNewExpr2, pExpr); + idxNew2 = whereClauseInsert(pWC, pNewExpr2, wtFlags); + testcase( idxNew2==0 ); + exprAnalyze(pSrc, pWC, idxNew2); + pTerm = &pWC->a[idxTerm]; + if( isComplete ){ + markTermAsChild(pWC, idxNew1, idxTerm); + markTermAsChild(pWC, idxNew2, idxTerm); + } + } +#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Add a WO_AUX auxiliary term to the constraint set if the + ** current expression is of the form "column OP expr" where OP + ** is an operator that gets passed into virtual tables but which is + ** not normally optimized for ordinary tables. In other words, OP + ** is one of MATCH, LIKE, GLOB, REGEXP, !=, IS, IS NOT, or NOT NULL. + ** This information is used by the xBestIndex methods of + ** virtual tables. The native query optimizer does not attempt + ** to do anything with MATCH functions. + */ + if( pWC->op==TK_AND ){ + Expr *pRight = 0, *pLeft = 0; + int res = isAuxiliaryVtabOperator(db, pExpr, &eOp2, &pLeft, &pRight); + while( res-- > 0 ){ + int idxNew; + WhereTerm *pNewTerm; + Bitmask prereqColumn, prereqExpr; + + prereqExpr = sqlite3WhereExprUsage(pMaskSet, pRight); + prereqColumn = sqlite3WhereExprUsage(pMaskSet, pLeft); + if( (prereqExpr & prereqColumn)==0 ){ + Expr *pNewExpr; + pNewExpr = sqlite3PExpr(pParse, TK_MATCH, + 0, sqlite3ExprDup(db, pRight, 0)); + if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){ + ExprSetProperty(pNewExpr, EP_FromJoin); + pNewExpr->iRightJoinTable = pExpr->iRightJoinTable; + } + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + pNewTerm = &pWC->a[idxNew]; + pNewTerm->prereqRight = prereqExpr; + pNewTerm->leftCursor = pLeft->iTable; + pNewTerm->u.leftColumn = pLeft->iColumn; + pNewTerm->eOperator = WO_AUX; + pNewTerm->eMatchOp = eOp2; + markTermAsChild(pWC, idxNew, idxTerm); + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + pNewTerm->prereqAll = pTerm->prereqAll; + } + SWAP(Expr*, pLeft, pRight); + } + } +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + /* If there is a vector == or IS term - e.g. "(a, b) == (?, ?)" - create + ** new terms for each component comparison - "a = ?" and "b = ?". The + ** new terms completely replace the original vector comparison, which is + ** no longer used. + ** + ** This is only required if at least one side of the comparison operation + ** is not a sub-select. */ + if( pWC->op==TK_AND + && (pExpr->op==TK_EQ || pExpr->op==TK_IS) + && (nLeft = sqlite3ExprVectorSize(pExpr->pLeft))>1 + && sqlite3ExprVectorSize(pExpr->pRight)==nLeft + && ( (pExpr->pLeft->flags & EP_xIsSelect)==0 + || (pExpr->pRight->flags & EP_xIsSelect)==0) + ){ + int i; + for(i=0; ipLeft, i); + Expr *pRight = sqlite3ExprForVectorField(pParse, pExpr->pRight, i); + + pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight); + transferJoinMarkings(pNew, pExpr); + idxNew = whereClauseInsert(pWC, pNew, TERM_DYNAMIC); + exprAnalyze(pSrc, pWC, idxNew); + } + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_CODED|TERM_VIRTUAL; /* Disable the original */ + pTerm->eOperator = 0; + } + + /* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create + ** a virtual term for each vector component. The expression object + ** used by each such virtual term is pExpr (the full vector IN(...) + ** expression). The WhereTerm.iField variable identifies the index within + ** the vector on the LHS that the virtual term represents. + ** + ** This only works if the RHS is a simple SELECT (not a compound) that does + ** not use window functions. + */ + if( pWC->op==TK_AND && pExpr->op==TK_IN && pTerm->iField==0 + && pExpr->pLeft->op==TK_VECTOR + && pExpr->x.pSelect->pPrior==0 +#ifndef SQLITE_OMIT_WINDOWFUNC + && pExpr->x.pSelect->pWin==0 +#endif + ){ + int i; + for(i=0; ipLeft); i++){ + int idxNew; + idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL); + pWC->a[idxNew].iField = i+1; + exprAnalyze(pSrc, pWC, idxNew); + markTermAsChild(pWC, idxNew, idxTerm); + } + } + +#ifdef SQLITE_ENABLE_STAT4 + /* When sqlite_stat4 histogram data is available an operator of the + ** form "x IS NOT NULL" can sometimes be evaluated more efficiently + ** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a + ** virtual term of that form. + ** + ** Note that the virtual term must be tagged with TERM_VNULL. + */ + if( pExpr->op==TK_NOTNULL + && pExpr->pLeft->op==TK_COLUMN + && pExpr->pLeft->iColumn>=0 + && !ExprHasProperty(pExpr, EP_FromJoin) + && OptimizationEnabled(db, SQLITE_Stat4) + ){ + Expr *pNewExpr; + Expr *pLeft = pExpr->pLeft; + int idxNew; + WhereTerm *pNewTerm; + + pNewExpr = sqlite3PExpr(pParse, TK_GT, + sqlite3ExprDup(db, pLeft, 0), + sqlite3ExprAlloc(db, TK_NULL, 0, 0)); + + idxNew = whereClauseInsert(pWC, pNewExpr, + TERM_VIRTUAL|TERM_DYNAMIC|TERM_VNULL); + if( idxNew ){ + pNewTerm = &pWC->a[idxNew]; + pNewTerm->prereqRight = 0; + pNewTerm->leftCursor = pLeft->iTable; + pNewTerm->u.leftColumn = pLeft->iColumn; + pNewTerm->eOperator = WO_GT; + markTermAsChild(pWC, idxNew, idxTerm); + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + pNewTerm->prereqAll = pTerm->prereqAll; + } + } +#endif /* SQLITE_ENABLE_STAT4 */ + + /* Prevent ON clause terms of a LEFT JOIN from being used to drive + ** an index for tables to the left of the join. + */ + testcase( pTerm!=&pWC->a[idxTerm] ); + pTerm = &pWC->a[idxTerm]; + pTerm->prereqRight |= extraRight; +} + +/*************************************************************************** +** Routines with file scope above. Interface to the rest of the where.c +** subsystem follows. +***************************************************************************/ + +/* +** This routine identifies subexpressions in the WHERE clause where +** each subexpression is separated by the AND operator or some other +** operator specified in the op parameter. The WhereClause structure +** is filled with pointers to subexpressions. For example: +** +** WHERE a=='hello' AND coalesce(b,11)<10 AND (c+12!=d OR c==22) +** \________/ \_______________/ \________________/ +** slot[0] slot[1] slot[2] +** +** The original WHERE clause in pExpr is unaltered. All this routine +** does is make slot[] entries point to substructure within pExpr. +** +** In the previous sentence and in the diagram, "slot[]" refers to +** the WhereClause.a[] array. The slot[] array grows as needed to contain +** all terms of the WHERE clause. +*/ +SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ + Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pExpr); + pWC->op = op; + if( pE2==0 ) return; + if( pE2->op!=op ){ + whereClauseInsert(pWC, pExpr, 0); + }else{ + sqlite3WhereSplit(pWC, pE2->pLeft, op); + sqlite3WhereSplit(pWC, pE2->pRight, op); + } +} + +/* +** Initialize a preallocated WhereClause structure. +*/ +SQLITE_PRIVATE void sqlite3WhereClauseInit( + WhereClause *pWC, /* The WhereClause to be initialized */ + WhereInfo *pWInfo /* The WHERE processing context */ +){ + pWC->pWInfo = pWInfo; + pWC->hasOr = 0; + pWC->pOuter = 0; + pWC->nTerm = 0; + pWC->nSlot = ArraySize(pWC->aStatic); + pWC->a = pWC->aStatic; +} + +/* +** Deallocate a WhereClause structure. The WhereClause structure +** itself is not freed. This routine is the inverse of +** sqlite3WhereClauseInit(). +*/ +SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){ + int i; + WhereTerm *a; + sqlite3 *db = pWC->pWInfo->pParse->db; + for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){ + if( a->wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, a->pExpr); + } + if( a->wtFlags & TERM_ORINFO ){ + whereOrInfoDelete(db, a->u.pOrInfo); + }else if( a->wtFlags & TERM_ANDINFO ){ + whereAndInfoDelete(db, a->u.pAndInfo); + } + } + if( pWC->a!=pWC->aStatic ){ + sqlite3DbFree(db, pWC->a); + } +} + + +/* +** These routines walk (recursively) an expression tree and generate +** a bitmask indicating which tables are used in that expression +** tree. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ + Bitmask mask; + if( p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){ + return sqlite3WhereGetMask(pMaskSet, p->iTable); + }else if( ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ + assert( p->op!=TK_IF_NULL_ROW ); + return 0; + } + mask = (p->op==TK_IF_NULL_ROW) ? sqlite3WhereGetMask(pMaskSet, p->iTable) : 0; + if( p->pLeft ) mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pLeft); + if( p->pRight ){ + mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pRight); + assert( p->x.pList==0 ); + }else if( ExprHasProperty(p, EP_xIsSelect) ){ + if( ExprHasProperty(p, EP_VarSelect) ) pMaskSet->bVarSelect = 1; + mask |= exprSelectUsage(pMaskSet, p->x.pSelect); + }else if( p->x.pList ){ + mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( (p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION) && p->y.pWin ){ + mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pPartition); + mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pOrderBy); + mask |= sqlite3WhereExprUsage(pMaskSet, p->y.pWin->pFilter); + } +#endif + return mask; +} +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){ + return p ? sqlite3WhereExprUsageNN(pMaskSet,p) : 0; +} +SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet *pMaskSet, ExprList *pList){ + int i; + Bitmask mask = 0; + if( pList ){ + for(i=0; inExpr; i++){ + mask |= sqlite3WhereExprUsage(pMaskSet, pList->a[i].pExpr); + } + } + return mask; +} + + +/* +** Call exprAnalyze on all terms in a WHERE clause. +** +** Note that exprAnalyze() might add new virtual terms onto the +** end of the WHERE clause. We do not want to analyze these new +** virtual terms, so start analyzing at the end and work forward +** so that the added virtual terms are never processed. +*/ +SQLITE_PRIVATE void sqlite3WhereExprAnalyze( + SrcList *pTabList, /* the FROM clause */ + WhereClause *pWC /* the WHERE clause to be analyzed */ +){ + int i; + for(i=pWC->nTerm-1; i>=0; i--){ + exprAnalyze(pTabList, pWC, i); + } +} + +/* +** For table-valued-functions, transform the function arguments into +** new WHERE clause terms. +** +** Each function argument translates into an equality constraint against +** a HIDDEN column in the table. +*/ +SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( + Parse *pParse, /* Parsing context */ + struct SrcList_item *pItem, /* The FROM clause term to process */ + WhereClause *pWC /* Xfer function arguments to here */ +){ + Table *pTab; + int j, k; + ExprList *pArgs; + Expr *pColRef; + Expr *pTerm; + if( pItem->fg.isTabFunc==0 ) return; + pTab = pItem->pTab; + assert( pTab!=0 ); + pArgs = pItem->u1.pFuncArg; + if( pArgs==0 ) return; + for(j=k=0; jnExpr; j++){ + Expr *pRhs; + while( knCol && (pTab->aCol[k].colFlags & COLFLAG_HIDDEN)==0 ){k++;} + if( k>=pTab->nCol ){ + sqlite3ErrorMsg(pParse, "too many arguments on %s() - max %d", + pTab->zName, j); + return; + } + pColRef = sqlite3ExprAlloc(pParse->db, TK_COLUMN, 0, 0); + if( pColRef==0 ) return; + pColRef->iTable = pItem->iCursor; + pColRef->iColumn = k++; + pColRef->y.pTab = pTab; + pRhs = sqlite3PExpr(pParse, TK_UPLUS, + sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); + pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs); + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3SetJoinExpr(pTerm, pItem->iCursor); + } + whereClauseInsert(pWC, pTerm, TERM_DYNAMIC); + } +} + +/************** End of whereexpr.c *******************************************/ +/************** Begin file where.c *******************************************/ +/* +** 2001 September 15 +** +** 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 module contains C code that generates VDBE code used to process +** the WHERE clause of SQL statements. This module is responsible for +** generating the code that loops through a table looking for applicable +** rows. Indices are selected and used to speed the search when doing +** so is applicable. Because this module is responsible for selecting +** indices, you might also think of this module as the "query optimizer". +*/ +/* #include "sqliteInt.h" */ +/* #include "whereInt.h" */ + +/* +** Extra information appended to the end of sqlite3_index_info but not +** visible to the xBestIndex function, at least not directly. The +** sqlite3_vtab_collation() interface knows how to reach it, however. +** +** This object is not an API and can be changed from one release to the +** next. As long as allocateIndexInfo() and sqlite3_vtab_collation() +** agree on the structure, all will be well. +*/ +typedef struct HiddenIndexInfo HiddenIndexInfo; +struct HiddenIndexInfo { + WhereClause *pWC; /* The Where clause being analyzed */ + Parse *pParse; /* The parsing context */ +}; + +/* Forward declaration of methods */ +static int whereLoopResize(sqlite3*, WhereLoop*, int); + +/* Test variable that can be set to enable WHERE tracing */ +#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) +/***/ int sqlite3WhereTrace = 0; +#endif + + +/* +** Return the estimated number of output rows from a WHERE clause +*/ +SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo *pWInfo){ + return pWInfo->nRowOut; +} + +/* +** Return one of the WHERE_DISTINCT_xxxxx values to indicate how this +** WHERE clause returns outputs for DISTINCT processing. +*/ +SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo *pWInfo){ + return pWInfo->eDistinct; +} + +/* +** Return TRUE if the WHERE clause returns rows in ORDER BY order. +** Return FALSE if the output needs to be sorted. +*/ +SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){ + return pWInfo->nOBSat; +} + +/* +** In the ORDER BY LIMIT optimization, if the inner-most loop is known +** to emit rows in increasing order, and if the last row emitted by the +** inner-most loop did not fit within the sorter, then we can skip all +** subsequent rows for the current iteration of the inner loop (because they +** will not fit in the sorter either) and continue with the second inner +** loop - the loop immediately outside the inner-most. +** +** When a row does not fit in the sorter (because the sorter already +** holds LIMIT+OFFSET rows that are smaller), then a jump is made to the +** label returned by this function. +** +** If the ORDER BY LIMIT optimization applies, the jump destination should +** be the continuation for the second-inner-most loop. If the ORDER BY +** LIMIT optimization does not apply, then the jump destination should +** be the continuation for the inner-most loop. +** +** It is always safe for this routine to return the continuation of the +** inner-most loop, in the sense that a correct answer will result. +** Returning the continuation the second inner loop is an optimization +** that might make the code run a little faster, but should not change +** the final answer. +*/ +SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo *pWInfo){ + WhereLevel *pInner; + if( !pWInfo->bOrderedInnerLoop ){ + /* The ORDER BY LIMIT optimization does not apply. Jump to the + ** continuation of the inner-most loop. */ + return pWInfo->iContinue; + } + pInner = &pWInfo->a[pWInfo->nLevel-1]; + assert( pInner->addrNxt!=0 ); + return pInner->addrNxt; +} + +/* +** Return the VDBE address or label to jump to in order to continue +** immediately with the next row of a WHERE clause. +*/ +SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo *pWInfo){ + assert( pWInfo->iContinue!=0 ); + return pWInfo->iContinue; +} + +/* +** Return the VDBE address or label to jump to in order to break +** out of a WHERE loop. +*/ +SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ + return pWInfo->iBreak; +} + +/* +** Return ONEPASS_OFF (0) if an UPDATE or DELETE statement is unable to +** operate directly on the rowids returned by a WHERE clause. Return +** ONEPASS_SINGLE (1) if the statement can operation directly because only +** a single row is to be changed. Return ONEPASS_MULTI (2) if the one-pass +** optimization can be used on multiple +** +** If the ONEPASS optimization is used (if this routine returns true) +** then also write the indices of open cursors used by ONEPASS +** into aiCur[0] and aiCur[1]. iaCur[0] gets the cursor of the data +** table and iaCur[1] gets the cursor used by an auxiliary index. +** Either value may be -1, indicating that cursor is not used. +** Any cursors returned will have been opened for writing. +** +** aiCur[0] and aiCur[1] both get -1 if the where-clause logic is +** unable to use the ONEPASS optimization. +*/ +SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo *pWInfo, int *aiCur){ + memcpy(aiCur, pWInfo->aiCurOnePass, sizeof(int)*2); +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace && pWInfo->eOnePass!=ONEPASS_OFF ){ + sqlite3DebugPrintf("%s cursors: %d %d\n", + pWInfo->eOnePass==ONEPASS_SINGLE ? "ONEPASS_SINGLE" : "ONEPASS_MULTI", + aiCur[0], aiCur[1]); + } +#endif + return pWInfo->eOnePass; +} + +/* +** Return TRUE if the WHERE loop uses the OP_DeferredSeek opcode to move +** the data cursor to the row selected by the index cursor. +*/ +SQLITE_PRIVATE int sqlite3WhereUsesDeferredSeek(WhereInfo *pWInfo){ + return pWInfo->bDeferredSeek; +} + +/* +** Move the content of pSrc into pDest +*/ +static void whereOrMove(WhereOrSet *pDest, WhereOrSet *pSrc){ + pDest->n = pSrc->n; + memcpy(pDest->a, pSrc->a, pDest->n*sizeof(pDest->a[0])); +} + +/* +** Try to insert a new prerequisite/cost entry into the WhereOrSet pSet. +** +** The new entry might overwrite an existing entry, or it might be +** appended, or it might be discarded. Do whatever is the right thing +** so that pSet keeps the N_OR_COST best entries seen so far. +*/ +static int whereOrInsert( + WhereOrSet *pSet, /* The WhereOrSet to be updated */ + Bitmask prereq, /* Prerequisites of the new entry */ + LogEst rRun, /* Run-cost of the new entry */ + LogEst nOut /* Number of outputs for the new entry */ +){ + u16 i; + WhereOrCost *p; + for(i=pSet->n, p=pSet->a; i>0; i--, p++){ + if( rRun<=p->rRun && (prereq & p->prereq)==prereq ){ + goto whereOrInsert_done; + } + if( p->rRun<=rRun && (p->prereq & prereq)==p->prereq ){ + return 0; + } + } + if( pSet->na[pSet->n++]; + p->nOut = nOut; + }else{ + p = pSet->a; + for(i=1; in; i++){ + if( p->rRun>pSet->a[i].rRun ) p = pSet->a + i; + } + if( p->rRun<=rRun ) return 0; + } +whereOrInsert_done: + p->prereq = prereq; + p->rRun = rRun; + if( p->nOut>nOut ) p->nOut = nOut; + return 1; +} + +/* +** Return the bitmask for the given cursor number. Return 0 if +** iCursor is not in the set. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ + int i; + assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 ); + for(i=0; in; i++){ + if( pMaskSet->ix[i]==iCursor ){ + return MASKBIT(i); + } + } + return 0; +} + +/* +** Create a new mask for cursor iCursor. +** +** There is one cursor per table in the FROM clause. The number of +** tables in the FROM clause is limited by a test early in the +** sqlite3WhereBegin() routine. So we know that the pMaskSet->ix[] +** array will never overflow. +*/ +static void createMask(WhereMaskSet *pMaskSet, int iCursor){ + assert( pMaskSet->n < ArraySize(pMaskSet->ix) ); + pMaskSet->ix[pMaskSet->n++] = iCursor; +} + +/* +** Advance to the next WhereTerm that matches according to the criteria +** established when the pScan object was initialized by whereScanInit(). +** Return NULL if there are no more matching WhereTerms. +*/ +static WhereTerm *whereScanNext(WhereScan *pScan){ + int iCur; /* The cursor on the LHS of the term */ + i16 iColumn; /* The column on the LHS of the term. -1 for IPK */ + Expr *pX; /* An expression being tested */ + WhereClause *pWC; /* Shorthand for pScan->pWC */ + WhereTerm *pTerm; /* The term being tested */ + int k = pScan->k; /* Where to start scanning */ + + assert( pScan->iEquiv<=pScan->nEquiv ); + pWC = pScan->pWC; + while(1){ + iColumn = pScan->aiColumn[pScan->iEquiv-1]; + iCur = pScan->aiCur[pScan->iEquiv-1]; + assert( pWC!=0 ); + do{ + for(pTerm=pWC->a+k; knTerm; k++, pTerm++){ + if( pTerm->leftCursor==iCur + && pTerm->u.leftColumn==iColumn + && (iColumn!=XN_EXPR + || sqlite3ExprCompareSkip(pTerm->pExpr->pLeft, + pScan->pIdxExpr,iCur)==0) + && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + ){ + if( (pTerm->eOperator & WO_EQUIV)!=0 + && pScan->nEquivaiCur) + && (pX = sqlite3ExprSkipCollateAndLikely(pTerm->pExpr->pRight))->op + ==TK_COLUMN + ){ + int j; + for(j=0; jnEquiv; j++){ + if( pScan->aiCur[j]==pX->iTable + && pScan->aiColumn[j]==pX->iColumn ){ + break; + } + } + if( j==pScan->nEquiv ){ + pScan->aiCur[j] = pX->iTable; + pScan->aiColumn[j] = pX->iColumn; + pScan->nEquiv++; + } + } + if( (pTerm->eOperator & pScan->opMask)!=0 ){ + /* Verify the affinity and collating sequence match */ + if( pScan->zCollName && (pTerm->eOperator & WO_ISNULL)==0 ){ + CollSeq *pColl; + Parse *pParse = pWC->pWInfo->pParse; + pX = pTerm->pExpr; + if( !sqlite3IndexAffinityOk(pX, pScan->idxaff) ){ + continue; + } + assert(pX->pLeft); + pColl = sqlite3ExprCompareCollSeq(pParse, pX); + if( pColl==0 ) pColl = pParse->db->pDfltColl; + if( sqlite3StrICmp(pColl->zName, pScan->zCollName) ){ + continue; + } + } + if( (pTerm->eOperator & (WO_EQ|WO_IS))!=0 + && (pX = pTerm->pExpr->pRight)->op==TK_COLUMN + && pX->iTable==pScan->aiCur[0] + && pX->iColumn==pScan->aiColumn[0] + ){ + testcase( pTerm->eOperator & WO_IS ); + continue; + } + pScan->pWC = pWC; + pScan->k = k+1; + return pTerm; + } + } + } + pWC = pWC->pOuter; + k = 0; + }while( pWC!=0 ); + if( pScan->iEquiv>=pScan->nEquiv ) break; + pWC = pScan->pOrigWC; + k = 0; + pScan->iEquiv++; + } + return 0; +} + +/* +** This is whereScanInit() for the case of an index on an expression. +** It is factored out into a separate tail-recursion subroutine so that +** the normal whereScanInit() routine, which is a high-runner, does not +** need to push registers onto the stack as part of its prologue. +*/ +static SQLITE_NOINLINE WhereTerm *whereScanInitIndexExpr(WhereScan *pScan){ + pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr); + return whereScanNext(pScan); +} + +/* +** Initialize a WHERE clause scanner object. Return a pointer to the +** first match. Return NULL if there are no matches. +** +** The scanner will be searching the WHERE clause pWC. It will look +** for terms of the form "X " where X is column iColumn of table +** iCur. Or if pIdx!=0 then X is column iColumn of index pIdx. pIdx +** must be one of the indexes of table iCur. +** +** The must be one of the operators described by opMask. +** +** If the search is for X and the WHERE clause contains terms of the +** form X=Y then this routine might also return terms of the form +** "Y ". The number of levels of transitivity is limited, +** but is enough to handle most commonly occurring SQL statements. +** +** If X is not the INTEGER PRIMARY KEY then X must be compatible with +** index pIdx. +*/ +static WhereTerm *whereScanInit( + WhereScan *pScan, /* The WhereScan object being initialized */ + WhereClause *pWC, /* The WHERE clause to be scanned */ + int iCur, /* Cursor to scan for */ + int iColumn, /* Column to scan for */ + u32 opMask, /* Operator(s) to scan for */ + Index *pIdx /* Must be compatible with this index */ +){ + pScan->pOrigWC = pWC; + pScan->pWC = pWC; + pScan->pIdxExpr = 0; + pScan->idxaff = 0; + pScan->zCollName = 0; + pScan->opMask = opMask; + pScan->k = 0; + pScan->aiCur[0] = iCur; + pScan->nEquiv = 1; + pScan->iEquiv = 1; + if( pIdx ){ + int j = iColumn; + iColumn = pIdx->aiColumn[j]; + if( iColumn==XN_EXPR ){ + pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; + pScan->zCollName = pIdx->azColl[j]; + pScan->aiColumn[0] = XN_EXPR; + return whereScanInitIndexExpr(pScan); + }else if( iColumn==pIdx->pTable->iPKey ){ + iColumn = XN_ROWID; + }else if( iColumn>=0 ){ + pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; + pScan->zCollName = pIdx->azColl[j]; + } + }else if( iColumn==XN_EXPR ){ + return 0; + } + pScan->aiColumn[0] = iColumn; + return whereScanNext(pScan); +} + +/* +** Search for a term in the WHERE clause that is of the form "X " +** where X is a reference to the iColumn of table iCur or of index pIdx +** if pIdx!=0 and is one of the WO_xx operator codes specified by +** the op parameter. Return a pointer to the term. Return 0 if not found. +** +** If pIdx!=0 then it must be one of the indexes of table iCur. +** Search for terms matching the iColumn-th column of pIdx +** rather than the iColumn-th column of table iCur. +** +** The term returned might by Y= if there is another constraint in +** the WHERE clause that specifies that X=Y. Any such constraints will be +** identified by the WO_EQUIV bit in the pTerm->eOperator field. The +** aiCur[]/iaColumn[] arrays hold X and all its equivalents. There are 11 +** slots in aiCur[]/aiColumn[] so that means we can look for X plus up to 10 +** other equivalent values. Hence a search for X will return if X=A1 +** and A1=A2 and A2=A3 and ... and A9=A10 and A10=. +** +** If there are multiple terms in the WHERE clause of the form "X " +** then try for the one with no dependencies on - in other words where +** is a constant expression of some kind. Only return entries of +** the form "X Y" where Y is a column in another table if no terms of +** the form "X " exist. If no terms with a constant RHS +** exist, try to return a term that does not use WO_EQUIV. +*/ +SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( + WhereClause *pWC, /* The WHERE clause to be searched */ + int iCur, /* Cursor number of LHS */ + int iColumn, /* Column number of LHS */ + Bitmask notReady, /* RHS must not overlap with this mask */ + u32 op, /* Mask of WO_xx values describing operator */ + Index *pIdx /* Must be compatible with this index, if not NULL */ +){ + WhereTerm *pResult = 0; + WhereTerm *p; + WhereScan scan; + + p = whereScanInit(&scan, pWC, iCur, iColumn, op, pIdx); + op &= WO_EQ|WO_IS; + while( p ){ + if( (p->prereqRight & notReady)==0 ){ + if( p->prereqRight==0 && (p->eOperator&op)!=0 ){ + testcase( p->eOperator & WO_IS ); + return p; + } + if( pResult==0 ) pResult = p; + } + p = whereScanNext(&scan); + } + return pResult; +} + +/* +** This function searches pList for an entry that matches the iCol-th column +** of index pIdx. +** +** If such an expression is found, its index in pList->a[] is returned. If +** no expression is found, -1 is returned. +*/ +static int findIndexCol( + Parse *pParse, /* Parse context */ + ExprList *pList, /* Expression list to search */ + int iBase, /* Cursor for table associated with pIdx */ + Index *pIdx, /* Index to match column of */ + int iCol /* Column of index to match */ +){ + int i; + const char *zColl = pIdx->azColl[iCol]; + + for(i=0; inExpr; i++){ + Expr *p = sqlite3ExprSkipCollateAndLikely(pList->a[i].pExpr); + if( p->op==TK_COLUMN + && p->iColumn==pIdx->aiColumn[iCol] + && p->iTable==iBase + ){ + CollSeq *pColl = sqlite3ExprNNCollSeq(pParse, pList->a[i].pExpr); + if( 0==sqlite3StrICmp(pColl->zName, zColl) ){ + return i; + } + } + } + + return -1; +} + +/* +** Return TRUE if the iCol-th column of index pIdx is NOT NULL +*/ +static int indexColumnNotNull(Index *pIdx, int iCol){ + int j; + assert( pIdx!=0 ); + assert( iCol>=0 && iColnColumn ); + j = pIdx->aiColumn[iCol]; + if( j>=0 ){ + return pIdx->pTable->aCol[j].notNull; + }else if( j==(-1) ){ + return 1; + }else{ + assert( j==(-2) ); + return 0; /* Assume an indexed expression can always yield a NULL */ + + } +} + +/* +** Return true if the DISTINCT expression-list passed as the third argument +** is redundant. +** +** A DISTINCT list is redundant if any subset of the columns in the +** DISTINCT list are collectively unique and individually non-null. +*/ +static int isDistinctRedundant( + Parse *pParse, /* Parsing context */ + SrcList *pTabList, /* The FROM clause */ + WhereClause *pWC, /* The WHERE clause */ + ExprList *pDistinct /* The result set that needs to be DISTINCT */ +){ + Table *pTab; + Index *pIdx; + int i; + int iBase; + + /* If there is more than one table or sub-select in the FROM clause of + ** this query, then it will not be possible to show that the DISTINCT + ** clause is redundant. */ + if( pTabList->nSrc!=1 ) return 0; + iBase = pTabList->a[0].iCursor; + pTab = pTabList->a[0].pTab; + + /* If any of the expressions is an IPK column on table iBase, then return + ** true. Note: The (p->iTable==iBase) part of this test may be false if the + ** current SELECT is a correlated sub-query. + */ + for(i=0; inExpr; i++){ + Expr *p = sqlite3ExprSkipCollateAndLikely(pDistinct->a[i].pExpr); + if( p->op==TK_COLUMN && p->iTable==iBase && p->iColumn<0 ) return 1; + } + + /* Loop through all indices on the table, checking each to see if it makes + ** the DISTINCT qualifier redundant. It does so if: + ** + ** 1. The index is itself UNIQUE, and + ** + ** 2. All of the columns in the index are either part of the pDistinct + ** list, or else the WHERE clause contains a term of the form "col=X", + ** where X is a constant value. The collation sequences of the + ** comparison and select-list expressions must match those of the index. + ** + ** 3. All of those index columns for which the WHERE clause does not + ** contain a "col=X" term are subject to a NOT NULL constraint. + */ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( !IsUniqueIndex(pIdx) ) continue; + for(i=0; inKeyCol; i++){ + if( 0==sqlite3WhereFindTerm(pWC, iBase, i, ~(Bitmask)0, WO_EQ, pIdx) ){ + if( findIndexCol(pParse, pDistinct, iBase, pIdx, i)<0 ) break; + if( indexColumnNotNull(pIdx, i)==0 ) break; + } + } + if( i==pIdx->nKeyCol ){ + /* This index implies that the DISTINCT qualifier is redundant. */ + return 1; + } + } + + return 0; +} + + +/* +** Estimate the logarithm of the input value to base 2. +*/ +static LogEst estLog(LogEst N){ + return N<=10 ? 0 : sqlite3LogEst(N) - 33; +} + +/* +** Convert OP_Column opcodes to OP_Copy in previously generated code. +** +** This routine runs over generated VDBE code and translates OP_Column +** opcodes into OP_Copy when the table is being accessed via co-routine +** instead of via table lookup. +** +** If the iAutoidxCur is not zero, then any OP_Rowid instructions on +** cursor iTabCur are transformed into OP_Sequence opcode for the +** iAutoidxCur cursor, in order to generate unique rowids for the +** automatic index being generated. +*/ +static void translateColumnToCopy( + Parse *pParse, /* Parsing context */ + int iStart, /* Translate from this opcode to the end */ + int iTabCur, /* OP_Column/OP_Rowid references to this table */ + int iRegister, /* The first column is in this register */ + int iAutoidxCur /* If non-zero, cursor of autoindex being generated */ +){ + Vdbe *v = pParse->pVdbe; + VdbeOp *pOp = sqlite3VdbeGetOp(v, iStart); + int iEnd = sqlite3VdbeCurrentAddr(v); + if( pParse->db->mallocFailed ) return; + for(; iStartp1!=iTabCur ) continue; + if( pOp->opcode==OP_Column ){ + pOp->opcode = OP_Copy; + pOp->p1 = pOp->p2 + iRegister; + pOp->p2 = pOp->p3; + pOp->p3 = 0; + }else if( pOp->opcode==OP_Rowid ){ + if( iAutoidxCur ){ + pOp->opcode = OP_Sequence; + pOp->p1 = iAutoidxCur; + }else{ + pOp->opcode = OP_Null; + pOp->p1 = 0; + pOp->p3 = 0; + } + } + } +} + +/* +** Two routines for printing the content of an sqlite3_index_info +** structure. Used for testing and debugging only. If neither +** SQLITE_TEST or SQLITE_DEBUG are defined, then these routines +** are no-ops. +*/ +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(WHERETRACE_ENABLED) +static void whereTraceIndexInfoInputs(sqlite3_index_info *p){ + int i; + if( !sqlite3WhereTrace ) return; + for(i=0; inConstraint; i++){ + sqlite3DebugPrintf(" constraint[%d]: col=%d termid=%d op=%d usabled=%d\n", + i, + p->aConstraint[i].iColumn, + p->aConstraint[i].iTermOffset, + p->aConstraint[i].op, + p->aConstraint[i].usable); + } + for(i=0; inOrderBy; i++){ + sqlite3DebugPrintf(" orderby[%d]: col=%d desc=%d\n", + i, + p->aOrderBy[i].iColumn, + p->aOrderBy[i].desc); + } +} +static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){ + int i; + if( !sqlite3WhereTrace ) return; + for(i=0; inConstraint; i++){ + sqlite3DebugPrintf(" usage[%d]: argvIdx=%d omit=%d\n", + i, + p->aConstraintUsage[i].argvIndex, + p->aConstraintUsage[i].omit); + } + sqlite3DebugPrintf(" idxNum=%d\n", p->idxNum); + sqlite3DebugPrintf(" idxStr=%s\n", p->idxStr); + sqlite3DebugPrintf(" orderByConsumed=%d\n", p->orderByConsumed); + sqlite3DebugPrintf(" estimatedCost=%g\n", p->estimatedCost); + sqlite3DebugPrintf(" estimatedRows=%lld\n", p->estimatedRows); +} +#else +#define whereTraceIndexInfoInputs(A) +#define whereTraceIndexInfoOutputs(A) +#endif + +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX +/* +** Return TRUE if the WHERE clause term pTerm is of a form where it +** could be used with an index to access pSrc, assuming an appropriate +** index existed. +*/ +static int termCanDriveIndex( + WhereTerm *pTerm, /* WHERE clause term to check */ + struct SrcList_item *pSrc, /* Table we are trying to access */ + Bitmask notReady /* Tables in outer loops of the join */ +){ + char aff; + if( pTerm->leftCursor!=pSrc->iCursor ) return 0; + if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0; + if( (pSrc->fg.jointype & JT_LEFT) + && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + && (pTerm->eOperator & WO_IS) + ){ + /* Cannot use an IS term from the WHERE clause as an index driver for + ** the RHS of a LEFT JOIN. Such a term can only be used if it is from + ** the ON clause. */ + return 0; + } + if( (pTerm->prereqRight & notReady)!=0 ) return 0; + if( pTerm->u.leftColumn<0 ) return 0; + aff = pSrc->pTab->aCol[pTerm->u.leftColumn].affinity; + if( !sqlite3IndexAffinityOk(pTerm->pExpr, aff) ) return 0; + testcase( pTerm->pExpr->op==TK_IS ); + return 1; +} +#endif + + +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX +/* +** Generate code to construct the Index object for an automatic index +** and to set up the WhereLevel object pLevel so that the code generator +** makes use of the automatic index. +*/ +static void constructAutomaticIndex( + Parse *pParse, /* The parsing context */ + WhereClause *pWC, /* The WHERE clause */ + struct SrcList_item *pSrc, /* The FROM clause term to get the next index */ + Bitmask notReady, /* Mask of cursors that are not available */ + WhereLevel *pLevel /* Write new index here */ +){ + int nKeyCol; /* Number of columns in the constructed index */ + WhereTerm *pTerm; /* A single term of the WHERE clause */ + WhereTerm *pWCEnd; /* End of pWC->a[] */ + Index *pIdx; /* Object describing the transient index */ + Vdbe *v; /* Prepared statement under construction */ + int addrInit; /* Address of the initialization bypass jump */ + Table *pTable; /* The table being indexed */ + int addrTop; /* Top of the index fill loop */ + int regRecord; /* Register holding an index record */ + int n; /* Column counter */ + int i; /* Loop counter */ + int mxBitCol; /* Maximum column in pSrc->colUsed */ + CollSeq *pColl; /* Collating sequence to on a column */ + WhereLoop *pLoop; /* The Loop object */ + char *zNotUsed; /* Extra space on the end of pIdx */ + Bitmask idxCols; /* Bitmap of columns used for indexing */ + Bitmask extraCols; /* Bitmap of additional columns */ + u8 sentWarning = 0; /* True if a warnning has been issued */ + Expr *pPartial = 0; /* Partial Index Expression */ + int iContinue = 0; /* Jump here to skip excluded rows */ + struct SrcList_item *pTabItem; /* FROM clause term being indexed */ + int addrCounter = 0; /* Address where integer counter is initialized */ + int regBase; /* Array of registers where record is assembled */ + + /* Generate code to skip over the creation and initialization of the + ** transient index on 2nd and subsequent iterations of the loop. */ + v = pParse->pVdbe; + assert( v!=0 ); + addrInit = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + + /* Count the number of columns that will be added to the index + ** and used to match WHERE clause constraints */ + nKeyCol = 0; + pTable = pSrc->pTab; + pWCEnd = &pWC->a[pWC->nTerm]; + pLoop = pLevel->pWLoop; + idxCols = 0; + for(pTerm=pWC->a; pTermpExpr; + assert( !ExprHasProperty(pExpr, EP_FromJoin) /* prereq always non-zero */ + || pExpr->iRightJoinTable!=pSrc->iCursor /* for the right-hand */ + || pLoop->prereq!=0 ); /* table of a LEFT JOIN */ + if( pLoop->prereq==0 + && (pTerm->wtFlags & TERM_VIRTUAL)==0 + && !ExprHasProperty(pExpr, EP_FromJoin) + && sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor) ){ + pPartial = sqlite3ExprAnd(pParse, pPartial, + sqlite3ExprDup(pParse->db, pExpr, 0)); + } + if( termCanDriveIndex(pTerm, pSrc, notReady) ){ + int iCol = pTerm->u.leftColumn; + Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol); + testcase( iCol==BMS ); + testcase( iCol==BMS-1 ); + if( !sentWarning ){ + sqlite3_log(SQLITE_WARNING_AUTOINDEX, + "automatic index on %s(%s)", pTable->zName, + pTable->aCol[iCol].zName); + sentWarning = 1; + } + if( (idxCols & cMask)==0 ){ + if( whereLoopResize(pParse->db, pLoop, nKeyCol+1) ){ + goto end_auto_index_create; + } + pLoop->aLTerm[nKeyCol++] = pTerm; + idxCols |= cMask; + } + } + } + assert( nKeyCol>0 ); + pLoop->u.btree.nEq = pLoop->nLTerm = nKeyCol; + pLoop->wsFlags = WHERE_COLUMN_EQ | WHERE_IDX_ONLY | WHERE_INDEXED + | WHERE_AUTO_INDEX; + + /* Count the number of additional columns needed to create a + ** covering index. A "covering index" is an index that contains all + ** columns that are needed by the query. With a covering index, the + ** original table never needs to be accessed. Automatic indices must + ** be a covering index because the index will not be updated if the + ** original table changes and the index and table cannot both be used + ** if they go out of sync. + */ + extraCols = pSrc->colUsed & (~idxCols | MASKBIT(BMS-1)); + mxBitCol = MIN(BMS-1,pTable->nCol); + testcase( pTable->nCol==BMS-1 ); + testcase( pTable->nCol==BMS-2 ); + for(i=0; icolUsed & MASKBIT(BMS-1) ){ + nKeyCol += pTable->nCol - BMS + 1; + } + + /* Construct the Index object to describe this index */ + pIdx = sqlite3AllocateIndexObject(pParse->db, nKeyCol+1, 0, &zNotUsed); + if( pIdx==0 ) goto end_auto_index_create; + pLoop->u.btree.pIndex = pIdx; + pIdx->zName = "auto-index"; + pIdx->pTable = pTable; + n = 0; + idxCols = 0; + for(pTerm=pWC->a; pTermu.leftColumn; + Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol); + testcase( iCol==BMS-1 ); + testcase( iCol==BMS ); + if( (idxCols & cMask)==0 ){ + Expr *pX = pTerm->pExpr; + idxCols |= cMask; + pIdx->aiColumn[n] = pTerm->u.leftColumn; + pColl = sqlite3ExprCompareCollSeq(pParse, pX); + assert( pColl!=0 || pParse->nErr>0 ); /* TH3 collate01.800 */ + pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; + n++; + } + } + } + assert( (u32)n==pLoop->u.btree.nEq ); + + /* Add additional columns needed to make the automatic index into + ** a covering index */ + for(i=0; iaiColumn[n] = i; + pIdx->azColl[n] = sqlite3StrBINARY; + n++; + } + } + if( pSrc->colUsed & MASKBIT(BMS-1) ){ + for(i=BMS-1; inCol; i++){ + pIdx->aiColumn[n] = i; + pIdx->azColl[n] = sqlite3StrBINARY; + n++; + } + } + assert( n==nKeyCol ); + pIdx->aiColumn[n] = XN_ROWID; + pIdx->azColl[n] = sqlite3StrBINARY; + + /* Create the automatic index */ + assert( pLevel->iIdxCur>=0 ); + pLevel->iIdxCur = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_OpenAutoindex, pLevel->iIdxCur, nKeyCol+1); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + VdbeComment((v, "for %s", pTable->zName)); + + /* Fill the automatic index with content */ + pTabItem = &pWC->pWInfo->pTabList->a[pLevel->iFrom]; + if( pTabItem->fg.viaCoroutine ){ + int regYield = pTabItem->regReturn; + addrCounter = sqlite3VdbeAddOp2(v, OP_Integer, 0, 0); + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + addrTop = sqlite3VdbeAddOp1(v, OP_Yield, regYield); + VdbeCoverage(v); + VdbeComment((v, "next row of %s", pTabItem->pTab->zName)); + }else{ + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); + } + if( pPartial ){ + iContinue = sqlite3VdbeMakeLabel(pParse); + sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL); + pLoop->wsFlags |= WHERE_PARTIALIDX; + } + regRecord = sqlite3GetTempReg(pParse); + regBase = sqlite3GenerateIndexKey( + pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0, 0, 0 + ); + sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + if( pPartial ) sqlite3VdbeResolveLabel(v, iContinue); + if( pTabItem->fg.viaCoroutine ){ + sqlite3VdbeChangeP2(v, addrCounter, regBase+n); + testcase( pParse->db->mallocFailed ); + assert( pLevel->iIdxCur>0 ); + translateColumnToCopy(pParse, addrTop, pLevel->iTabCur, + pTabItem->regResult, pLevel->iIdxCur); + sqlite3VdbeGoto(v, addrTop); + pTabItem->fg.viaCoroutine = 0; + }else{ + sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); + } + sqlite3VdbeJumpHere(v, addrTop); + sqlite3ReleaseTempReg(pParse, regRecord); + + /* Jump here when skipping the initialization */ + sqlite3VdbeJumpHere(v, addrInit); + +end_auto_index_create: + sqlite3ExprDelete(pParse->db, pPartial); +} +#endif /* SQLITE_OMIT_AUTOMATIC_INDEX */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Allocate and populate an sqlite3_index_info structure. It is the +** responsibility of the caller to eventually release the structure +** by passing the pointer returned by this function to sqlite3_free(). +*/ +static sqlite3_index_info *allocateIndexInfo( + Parse *pParse, /* The parsing context */ + WhereClause *pWC, /* The WHERE clause being analyzed */ + Bitmask mUnusable, /* Ignore terms with these prereqs */ + struct SrcList_item *pSrc, /* The FROM clause term that is the vtab */ + ExprList *pOrderBy, /* The ORDER BY clause */ + u16 *pmNoOmit /* Mask of terms not to omit */ +){ + int i, j; + int nTerm; + struct sqlite3_index_constraint *pIdxCons; + struct sqlite3_index_orderby *pIdxOrderBy; + struct sqlite3_index_constraint_usage *pUsage; + struct HiddenIndexInfo *pHidden; + WhereTerm *pTerm; + int nOrderBy; + sqlite3_index_info *pIdxInfo; + u16 mNoOmit = 0; + + /* Count the number of possible WHERE clause constraints referring + ** to this virtual table */ + for(i=nTerm=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + if( pTerm->leftCursor != pSrc->iCursor ) continue; + if( pTerm->prereqRight & mUnusable ) continue; + assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); + testcase( pTerm->eOperator & WO_IN ); + testcase( pTerm->eOperator & WO_ISNULL ); + testcase( pTerm->eOperator & WO_IS ); + testcase( pTerm->eOperator & WO_ALL ); + if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue; + if( pTerm->wtFlags & TERM_VNULL ) continue; + assert( pTerm->u.leftColumn>=(-1) ); + nTerm++; + } + + /* If the ORDER BY clause contains only columns in the current + ** virtual table then allocate space for the aOrderBy part of + ** the sqlite3_index_info structure. + */ + nOrderBy = 0; + if( pOrderBy ){ + int n = pOrderBy->nExpr; + for(i=0; ia[i].pExpr; + if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break; + if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break; + } + if( i==n){ + nOrderBy = n; + } + } + + /* Allocate the sqlite3_index_info structure + */ + pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo) + + (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm + + sizeof(*pIdxOrderBy)*nOrderBy + sizeof(*pHidden) ); + if( pIdxInfo==0 ){ + sqlite3ErrorMsg(pParse, "out of memory"); + return 0; + } + pHidden = (struct HiddenIndexInfo*)&pIdxInfo[1]; + pIdxCons = (struct sqlite3_index_constraint*)&pHidden[1]; + pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm]; + pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy]; + pIdxInfo->nOrderBy = nOrderBy; + pIdxInfo->aConstraint = pIdxCons; + pIdxInfo->aOrderBy = pIdxOrderBy; + pIdxInfo->aConstraintUsage = pUsage; + pHidden->pWC = pWC; + pHidden->pParse = pParse; + for(i=j=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + u16 op; + if( pTerm->leftCursor != pSrc->iCursor ) continue; + if( pTerm->prereqRight & mUnusable ) continue; + assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); + testcase( pTerm->eOperator & WO_IN ); + testcase( pTerm->eOperator & WO_IS ); + testcase( pTerm->eOperator & WO_ISNULL ); + testcase( pTerm->eOperator & WO_ALL ); + if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue; + if( pTerm->wtFlags & TERM_VNULL ) continue; + + /* tag-20191211-002: WHERE-clause constraints are not useful to the + ** right-hand table of a LEFT JOIN. See tag-20191211-001 for the + ** equivalent restriction for ordinary tables. */ + if( (pSrc->fg.jointype & JT_LEFT)!=0 + && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + ){ + continue; + } + assert( pTerm->u.leftColumn>=(-1) ); + pIdxCons[j].iColumn = pTerm->u.leftColumn; + pIdxCons[j].iTermOffset = i; + op = pTerm->eOperator & WO_ALL; + if( op==WO_IN ) op = WO_EQ; + if( op==WO_AUX ){ + pIdxCons[j].op = pTerm->eMatchOp; + }else if( op & (WO_ISNULL|WO_IS) ){ + if( op==WO_ISNULL ){ + pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_ISNULL; + }else{ + pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_IS; + } + }else{ + pIdxCons[j].op = (u8)op; + /* The direct assignment in the previous line is possible only because + ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The + ** following asserts verify this fact. */ + assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ ); + assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT ); + assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE ); + assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT ); + assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE ); + assert( pTerm->eOperator&(WO_IN|WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_AUX) ); + + if( op & (WO_LT|WO_LE|WO_GT|WO_GE) + && sqlite3ExprIsVector(pTerm->pExpr->pRight) + ){ + testcase( j!=i ); + if( j<16 ) mNoOmit |= (1 << j); + if( op==WO_LT ) pIdxCons[j].op = WO_LE; + if( op==WO_GT ) pIdxCons[j].op = WO_GE; + } + } + + j++; + } + pIdxInfo->nConstraint = j; + for(i=0; ia[i].pExpr; + pIdxOrderBy[i].iColumn = pExpr->iColumn; + pIdxOrderBy[i].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC; + } + + *pmNoOmit = mNoOmit; + return pIdxInfo; +} + +/* +** The table object reference passed as the second argument to this function +** must represent a virtual table. This function invokes the xBestIndex() +** method of the virtual table with the sqlite3_index_info object that +** comes in as the 3rd argument to this function. +** +** If an error occurs, pParse is populated with an error message and an +** appropriate error code is returned. A return of SQLITE_CONSTRAINT from +** xBestIndex is not considered an error. SQLITE_CONSTRAINT indicates that +** the current configuration of "unusable" flags in sqlite3_index_info can +** not result in a valid plan. +** +** Whether or not an error is returned, it is the responsibility of the +** caller to eventually free p->idxStr if p->needToFreeIdxStr indicates +** that this is required. +*/ +static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ + sqlite3_vtab *pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; + int rc; + + whereTraceIndexInfoInputs(p); + rc = pVtab->pModule->xBestIndex(pVtab, p); + whereTraceIndexInfoOutputs(p); + + if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){ + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(pParse->db); + }else if( !pVtab->zErrMsg ){ + sqlite3ErrorMsg(pParse, "%s", sqlite3ErrStr(rc)); + }else{ + sqlite3ErrorMsg(pParse, "%s", pVtab->zErrMsg); + } + } + sqlite3_free(pVtab->zErrMsg); + pVtab->zErrMsg = 0; + return rc; +} +#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */ + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Estimate the location of a particular key among all keys in an +** index. Store the results in aStat as follows: +** +** aStat[0] Est. number of rows less than pRec +** aStat[1] Est. number of rows equal to pRec +** +** Return the index of the sample that is the smallest sample that +** is greater than or equal to pRec. Note that this index is not an index +** into the aSample[] array - it is an index into a virtual set of samples +** based on the contents of aSample[] and the number of fields in record +** pRec. +*/ +static int whereKeyStats( + Parse *pParse, /* Database connection */ + Index *pIdx, /* Index to consider domain of */ + UnpackedRecord *pRec, /* Vector of values to consider */ + int roundUp, /* Round up if true. Round down if false */ + tRowcnt *aStat /* OUT: stats written here */ +){ + IndexSample *aSample = pIdx->aSample; + int iCol; /* Index of required stats in anEq[] etc. */ + int i; /* Index of first sample >= pRec */ + int iSample; /* Smallest sample larger than or equal to pRec */ + int iMin = 0; /* Smallest sample not yet tested */ + int iTest; /* Next sample to test */ + int res; /* Result of comparison operation */ + int nField; /* Number of fields in pRec */ + tRowcnt iLower = 0; /* anLt[] + anEq[] of largest sample pRec is > */ + +#ifndef SQLITE_DEBUG + UNUSED_PARAMETER( pParse ); +#endif + assert( pRec!=0 ); + assert( pIdx->nSample>0 ); + assert( pRec->nField>0 && pRec->nField<=pIdx->nSampleCol ); + + /* Do a binary search to find the first sample greater than or equal + ** to pRec. If pRec contains a single field, the set of samples to search + ** is simply the aSample[] array. If the samples in aSample[] contain more + ** than one fields, all fields following the first are ignored. + ** + ** If pRec contains N fields, where N is more than one, then as well as the + ** samples in aSample[] (truncated to N fields), the search also has to + ** consider prefixes of those samples. For example, if the set of samples + ** in aSample is: + ** + ** aSample[0] = (a, 5) + ** aSample[1] = (a, 10) + ** aSample[2] = (b, 5) + ** aSample[3] = (c, 100) + ** aSample[4] = (c, 105) + ** + ** Then the search space should ideally be the samples above and the + ** unique prefixes [a], [b] and [c]. But since that is hard to organize, + ** the code actually searches this set: + ** + ** 0: (a) + ** 1: (a, 5) + ** 2: (a, 10) + ** 3: (a, 10) + ** 4: (b) + ** 5: (b, 5) + ** 6: (c) + ** 7: (c, 100) + ** 8: (c, 105) + ** 9: (c, 105) + ** + ** For each sample in the aSample[] array, N samples are present in the + ** effective sample array. In the above, samples 0 and 1 are based on + ** sample aSample[0]. Samples 2 and 3 on aSample[1] etc. + ** + ** Often, sample i of each block of N effective samples has (i+1) fields. + ** Except, each sample may be extended to ensure that it is greater than or + ** equal to the previous sample in the array. For example, in the above, + ** sample 2 is the first sample of a block of N samples, so at first it + ** appears that it should be 1 field in size. However, that would make it + ** smaller than sample 1, so the binary search would not work. As a result, + ** it is extended to two fields. The duplicates that this creates do not + ** cause any problems. + */ + nField = pRec->nField; + iCol = 0; + iSample = pIdx->nSample * nField; + do{ + int iSamp; /* Index in aSample[] of test sample */ + int n; /* Number of fields in test sample */ + + iTest = (iMin+iSample)/2; + iSamp = iTest / nField; + if( iSamp>0 ){ + /* The proposed effective sample is a prefix of sample aSample[iSamp]. + ** Specifically, the shortest prefix of at least (1 + iTest%nField) + ** fields that is greater than the previous effective sample. */ + for(n=(iTest % nField) + 1; nnField = n; + res = sqlite3VdbeRecordCompare(aSample[iSamp].n, aSample[iSamp].p, pRec); + if( res<0 ){ + iLower = aSample[iSamp].anLt[n-1] + aSample[iSamp].anEq[n-1]; + iMin = iTest+1; + }else if( res==0 && ndb->mallocFailed==0 ){ + if( res==0 ){ + /* If (res==0) is true, then pRec must be equal to sample i. */ + assert( inSample ); + assert( iCol==nField-1 ); + pRec->nField = nField; + assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) + || pParse->db->mallocFailed + ); + }else{ + /* Unless i==pIdx->nSample, indicating that pRec is larger than + ** all samples in the aSample[] array, pRec must be smaller than the + ** (iCol+1) field prefix of sample i. */ + assert( i<=pIdx->nSample && i>=0 ); + pRec->nField = iCol+1; + assert( i==pIdx->nSample + || sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)>0 + || pParse->db->mallocFailed ); + + /* if i==0 and iCol==0, then record pRec is smaller than all samples + ** in the aSample[] array. Otherwise, if (iCol>0) then pRec must + ** be greater than or equal to the (iCol) field prefix of sample i. + ** If (i>0), then pRec must also be greater than sample (i-1). */ + if( iCol>0 ){ + pRec->nField = iCol; + assert( sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)<=0 + || pParse->db->mallocFailed ); + } + if( i>0 ){ + pRec->nField = nField; + assert( sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec)<0 + || pParse->db->mallocFailed ); + } + } + } +#endif /* ifdef SQLITE_DEBUG */ + + if( res==0 ){ + /* Record pRec is equal to sample i */ + assert( iCol==nField-1 ); + aStat[0] = aSample[i].anLt[iCol]; + aStat[1] = aSample[i].anEq[iCol]; + }else{ + /* At this point, the (iCol+1) field prefix of aSample[i] is the first + ** sample that is greater than pRec. Or, if i==pIdx->nSample then pRec + ** is larger than all samples in the array. */ + tRowcnt iUpper, iGap; + if( i>=pIdx->nSample ){ + iUpper = sqlite3LogEstToInt(pIdx->aiRowLogEst[0]); + }else{ + iUpper = aSample[i].anLt[iCol]; + } + + if( iLower>=iUpper ){ + iGap = 0; + }else{ + iGap = iUpper - iLower; + } + if( roundUp ){ + iGap = (iGap*2)/3; + }else{ + iGap = iGap/3; + } + aStat[0] = iLower + iGap; + aStat[1] = pIdx->aAvgEq[nField-1]; + } + + /* Restore the pRec->nField value before returning. */ + pRec->nField = nField; + return i; +} +#endif /* SQLITE_ENABLE_STAT4 */ + +/* +** If it is not NULL, pTerm is a term that provides an upper or lower +** bound on a range scan. Without considering pTerm, it is estimated +** that the scan will visit nNew rows. This function returns the number +** estimated to be visited after taking pTerm into account. +** +** If the user explicitly specified a likelihood() value for this term, +** then the return value is the likelihood multiplied by the number of +** input rows. Otherwise, this function assumes that an "IS NOT NULL" term +** has a likelihood of 0.50, and any other term a likelihood of 0.25. +*/ +static LogEst whereRangeAdjust(WhereTerm *pTerm, LogEst nNew){ + LogEst nRet = nNew; + if( pTerm ){ + if( pTerm->truthProb<=0 ){ + nRet += pTerm->truthProb; + }else if( (pTerm->wtFlags & TERM_VNULL)==0 ){ + nRet -= 20; assert( 20==sqlite3LogEst(4) ); + } + } + return nRet; +} + + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Return the affinity for a single column of an index. +*/ +SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCol){ + assert( iCol>=0 && iColnColumn ); + if( !pIdx->zColAff ){ + if( sqlite3IndexAffinityStr(db, pIdx)==0 ) return SQLITE_AFF_BLOB; + } + assert( pIdx->zColAff[iCol]!=0 ); + return pIdx->zColAff[iCol]; +} +#endif + + +#ifdef SQLITE_ENABLE_STAT4 +/* +** This function is called to estimate the number of rows visited by a +** range-scan on a skip-scan index. For example: +** +** CREATE INDEX i1 ON t1(a, b, c); +** SELECT * FROM t1 WHERE a=? AND c BETWEEN ? AND ?; +** +** Value pLoop->nOut is currently set to the estimated number of rows +** visited for scanning (a=? AND b=?). This function reduces that estimate +** by some factor to account for the (c BETWEEN ? AND ?) expression based +** on the stat4 data for the index. this scan will be peformed multiple +** times (once for each (a,b) combination that matches a=?) is dealt with +** by the caller. +** +** It does this by scanning through all stat4 samples, comparing values +** extracted from pLower and pUpper with the corresponding column in each +** sample. If L and U are the number of samples found to be less than or +** equal to the values extracted from pLower and pUpper respectively, and +** N is the total number of samples, the pLoop->nOut value is adjusted +** as follows: +** +** nOut = nOut * ( min(U - L, 1) / N ) +** +** If pLower is NULL, or a value cannot be extracted from the term, L is +** set to zero. If pUpper is NULL, or a value cannot be extracted from it, +** U is set to N. +** +** Normally, this function sets *pbDone to 1 before returning. However, +** if no value can be extracted from either pLower or pUpper (and so the +** estimate of the number of rows delivered remains unchanged), *pbDone +** is left as is. +** +** If an error occurs, an SQLite error code is returned. Otherwise, +** SQLITE_OK. +*/ +static int whereRangeSkipScanEst( + Parse *pParse, /* Parsing & code generating context */ + WhereTerm *pLower, /* Lower bound on the range. ex: "x>123" Might be NULL */ + WhereTerm *pUpper, /* Upper bound on the range. ex: "x<455" Might be NULL */ + WhereLoop *pLoop, /* Update the .nOut value of this loop */ + int *pbDone /* Set to true if at least one expr. value extracted */ +){ + Index *p = pLoop->u.btree.pIndex; + int nEq = pLoop->u.btree.nEq; + sqlite3 *db = pParse->db; + int nLower = -1; + int nUpper = p->nSample+1; + int rc = SQLITE_OK; + u8 aff = sqlite3IndexColumnAffinity(db, p, nEq); + CollSeq *pColl; + + sqlite3_value *p1 = 0; /* Value extracted from pLower */ + sqlite3_value *p2 = 0; /* Value extracted from pUpper */ + sqlite3_value *pVal = 0; /* Value extracted from record */ + + pColl = sqlite3LocateCollSeq(pParse, p->azColl[nEq]); + if( pLower ){ + rc = sqlite3Stat4ValueFromExpr(pParse, pLower->pExpr->pRight, aff, &p1); + nLower = 0; + } + if( pUpper && rc==SQLITE_OK ){ + rc = sqlite3Stat4ValueFromExpr(pParse, pUpper->pExpr->pRight, aff, &p2); + nUpper = p2 ? 0 : p->nSample; + } + + if( p1 || p2 ){ + int i; + int nDiff; + for(i=0; rc==SQLITE_OK && inSample; i++){ + rc = sqlite3Stat4Column(db, p->aSample[i].p, p->aSample[i].n, nEq, &pVal); + if( rc==SQLITE_OK && p1 ){ + int res = sqlite3MemCompare(p1, pVal, pColl); + if( res>=0 ) nLower++; + } + if( rc==SQLITE_OK && p2 ){ + int res = sqlite3MemCompare(p2, pVal, pColl); + if( res>=0 ) nUpper++; + } + } + nDiff = (nUpper - nLower); + if( nDiff<=0 ) nDiff = 1; + + /* If there is both an upper and lower bound specified, and the + ** comparisons indicate that they are close together, use the fallback + ** method (assume that the scan visits 1/64 of the rows) for estimating + ** the number of rows visited. Otherwise, estimate the number of rows + ** using the method described in the header comment for this function. */ + if( nDiff!=1 || pUpper==0 || pLower==0 ){ + int nAdjust = (sqlite3LogEst(p->nSample) - sqlite3LogEst(nDiff)); + pLoop->nOut -= nAdjust; + *pbDone = 1; + WHERETRACE(0x10, ("range skip-scan regions: %u..%u adjust=%d est=%d\n", + nLower, nUpper, nAdjust*-1, pLoop->nOut)); + } + + }else{ + assert( *pbDone==0 ); + } + + sqlite3ValueFree(p1); + sqlite3ValueFree(p2); + sqlite3ValueFree(pVal); + + return rc; +} +#endif /* SQLITE_ENABLE_STAT4 */ + +/* +** This function is used to estimate the number of rows that will be visited +** by scanning an index for a range of values. The range may have an upper +** bound, a lower bound, or both. The WHERE clause terms that set the upper +** and lower bounds are represented by pLower and pUpper respectively. For +** example, assuming that index p is on t1(a): +** +** ... FROM t1 WHERE a > ? AND a < ? ... +** |_____| |_____| +** | | +** pLower pUpper +** +** If either of the upper or lower bound is not present, then NULL is passed in +** place of the corresponding WhereTerm. +** +** The value in (pBuilder->pNew->u.btree.nEq) is the number of the index +** column subject to the range constraint. Or, equivalently, the number of +** equality constraints optimized by the proposed index scan. For example, +** assuming index p is on t1(a, b), and the SQL query is: +** +** ... FROM t1 WHERE a = ? AND b > ? AND b < ? ... +** +** then nEq is set to 1 (as the range restricted column, b, is the second +** left-most column of the index). Or, if the query is: +** +** ... FROM t1 WHERE a > ? AND a < ? ... +** +** then nEq is set to 0. +** +** When this function is called, *pnOut is set to the sqlite3LogEst() of the +** number of rows that the index scan is expected to visit without +** considering the range constraints. If nEq is 0, then *pnOut is the number of +** rows in the index. Assuming no error occurs, *pnOut is adjusted (reduced) +** to account for the range constraints pLower and pUpper. +** +** In the absence of sqlite_stat4 ANALYZE data, or if such data cannot be +** used, a single range inequality reduces the search space by a factor of 4. +** and a pair of constraints (x>? AND x123" Might be NULL */ + WhereTerm *pUpper, /* Upper bound on the range. ex: "x<455" Might be NULL */ + WhereLoop *pLoop /* Modify the .nOut and maybe .rRun fields */ +){ + int rc = SQLITE_OK; + int nOut = pLoop->nOut; + LogEst nNew; + +#ifdef SQLITE_ENABLE_STAT4 + Index *p = pLoop->u.btree.pIndex; + int nEq = pLoop->u.btree.nEq; + + if( p->nSample>0 && ALWAYS(nEqnSampleCol) + && OptimizationEnabled(pParse->db, SQLITE_Stat4) + ){ + if( nEq==pBuilder->nRecValid ){ + UnpackedRecord *pRec = pBuilder->pRec; + tRowcnt a[2]; + int nBtm = pLoop->u.btree.nBtm; + int nTop = pLoop->u.btree.nTop; + + /* Variable iLower will be set to the estimate of the number of rows in + ** the index that are less than the lower bound of the range query. The + ** lower bound being the concatenation of $P and $L, where $P is the + ** key-prefix formed by the nEq values matched against the nEq left-most + ** columns of the index, and $L is the value in pLower. + ** + ** Or, if pLower is NULL or $L cannot be extracted from it (because it + ** is not a simple variable or literal value), the lower bound of the + ** range is $P. Due to a quirk in the way whereKeyStats() works, even + ** if $L is available, whereKeyStats() is called for both ($P) and + ** ($P:$L) and the larger of the two returned values is used. + ** + ** Similarly, iUpper is to be set to the estimate of the number of rows + ** less than the upper bound of the range query. Where the upper bound + ** is either ($P) or ($P:$U). Again, even if $U is available, both values + ** of iUpper are requested of whereKeyStats() and the smaller used. + ** + ** The number of rows between the two bounds is then just iUpper-iLower. + */ + tRowcnt iLower; /* Rows less than the lower bound */ + tRowcnt iUpper; /* Rows less than the upper bound */ + int iLwrIdx = -2; /* aSample[] for the lower bound */ + int iUprIdx = -1; /* aSample[] for the upper bound */ + + if( pRec ){ + testcase( pRec->nField!=pBuilder->nRecValid ); + pRec->nField = pBuilder->nRecValid; + } + /* Determine iLower and iUpper using ($P) only. */ + if( nEq==0 ){ + iLower = 0; + iUpper = p->nRowEst0; + }else{ + /* Note: this call could be optimized away - since the same values must + ** have been requested when testing key $P in whereEqualScanEst(). */ + whereKeyStats(pParse, p, pRec, 0, a); + iLower = a[0]; + iUpper = a[0] + a[1]; + } + + assert( pLower==0 || (pLower->eOperator & (WO_GT|WO_GE))!=0 ); + assert( pUpper==0 || (pUpper->eOperator & (WO_LT|WO_LE))!=0 ); + assert( p->aSortOrder!=0 ); + if( p->aSortOrder[nEq] ){ + /* The roles of pLower and pUpper are swapped for a DESC index */ + SWAP(WhereTerm*, pLower, pUpper); + SWAP(int, nBtm, nTop); + } + + /* If possible, improve on the iLower estimate using ($P:$L). */ + if( pLower ){ + int n; /* Values extracted from pExpr */ + Expr *pExpr = pLower->pExpr->pRight; + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, nBtm, nEq, &n); + if( rc==SQLITE_OK && n ){ + tRowcnt iNew; + u16 mask = WO_GT|WO_LE; + if( sqlite3ExprVectorSize(pExpr)>n ) mask = (WO_LE|WO_LT); + iLwrIdx = whereKeyStats(pParse, p, pRec, 0, a); + iNew = a[0] + ((pLower->eOperator & mask) ? a[1] : 0); + if( iNew>iLower ) iLower = iNew; + nOut--; + pLower = 0; + } + } + + /* If possible, improve on the iUpper estimate using ($P:$U). */ + if( pUpper ){ + int n; /* Values extracted from pExpr */ + Expr *pExpr = pUpper->pExpr->pRight; + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, nTop, nEq, &n); + if( rc==SQLITE_OK && n ){ + tRowcnt iNew; + u16 mask = WO_GT|WO_LE; + if( sqlite3ExprVectorSize(pExpr)>n ) mask = (WO_LE|WO_LT); + iUprIdx = whereKeyStats(pParse, p, pRec, 1, a); + iNew = a[0] + ((pUpper->eOperator & mask) ? a[1] : 0); + if( iNewpRec = pRec; + if( rc==SQLITE_OK ){ + if( iUpper>iLower ){ + nNew = sqlite3LogEst(iUpper - iLower); + /* TUNING: If both iUpper and iLower are derived from the same + ** sample, then assume they are 4x more selective. This brings + ** the estimated selectivity more in line with what it would be + ** if estimated without the use of STAT4 tables. */ + if( iLwrIdx==iUprIdx ) nNew -= 20; assert( 20==sqlite3LogEst(4) ); + }else{ + nNew = 10; assert( 10==sqlite3LogEst(2) ); + } + if( nNewwtFlags & TERM_VNULL)==0 ); + nNew = whereRangeAdjust(pLower, nOut); + nNew = whereRangeAdjust(pUpper, nNew); + + /* TUNING: If there is both an upper and lower limit and neither limit + ** has an application-defined likelihood(), assume the range is + ** reduced by an additional 75%. This means that, by default, an open-ended + ** range query (e.g. col > ?) is assumed to match 1/4 of the rows in the + ** index. While a closed range (e.g. col BETWEEN ? AND ?) is estimated to + ** match 1/64 of the index. */ + if( pLower && pLower->truthProb>0 && pUpper && pUpper->truthProb>0 ){ + nNew -= 20; + } + + nOut -= (pLower!=0) + (pUpper!=0); + if( nNew<10 ) nNew = 10; + if( nNewnOut>nOut ){ + WHERETRACE(0x10,("Range scan lowers nOut from %d to %d\n", + pLoop->nOut, nOut)); + } +#endif + pLoop->nOut = (LogEst)nOut; + return rc; +} + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Estimate the number of rows that will be returned based on +** an equality constraint x=VALUE and where that VALUE occurs in +** the histogram data. This only works when x is the left-most +** column of an index and sqlite_stat4 histogram data is available +** for that index. When pExpr==NULL that means the constraint is +** "x IS NULL" instead of "x=VALUE". +** +** Write the estimated row count into *pnRow and return SQLITE_OK. +** If unable to make an estimate, leave *pnRow unchanged and return +** non-zero. +** +** This routine can fail if it is unable to load a collating sequence +** required for string comparison, or if unable to allocate memory +** for a UTF conversion required for comparison. The error is stored +** in the pParse structure. +*/ +static int whereEqualScanEst( + Parse *pParse, /* Parsing & code generating context */ + WhereLoopBuilder *pBuilder, + Expr *pExpr, /* Expression for VALUE in the x=VALUE constraint */ + tRowcnt *pnRow /* Write the revised row estimate here */ +){ + Index *p = pBuilder->pNew->u.btree.pIndex; + int nEq = pBuilder->pNew->u.btree.nEq; + UnpackedRecord *pRec = pBuilder->pRec; + int rc; /* Subfunction return code */ + tRowcnt a[2]; /* Statistics */ + int bOk; + + assert( nEq>=1 ); + assert( nEq<=p->nColumn ); + assert( p->aSample!=0 ); + assert( p->nSample>0 ); + assert( pBuilder->nRecValidnRecValid<(nEq-1) ){ + return SQLITE_NOTFOUND; + } + + /* This is an optimization only. The call to sqlite3Stat4ProbeSetValue() + ** below would return the same value. */ + if( nEq>=p->nColumn ){ + *pnRow = 1; + return SQLITE_OK; + } + + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, 1, nEq-1, &bOk); + pBuilder->pRec = pRec; + if( rc!=SQLITE_OK ) return rc; + if( bOk==0 ) return SQLITE_NOTFOUND; + pBuilder->nRecValid = nEq; + + whereKeyStats(pParse, p, pRec, 0, a); + WHERETRACE(0x10,("equality scan regions %s(%d): %d\n", + p->zName, nEq-1, (int)a[1])); + *pnRow = a[1]; + + return rc; +} +#endif /* SQLITE_ENABLE_STAT4 */ + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Estimate the number of rows that will be returned based on +** an IN constraint where the right-hand side of the IN operator +** is a list of values. Example: +** +** WHERE x IN (1,2,3,4) +** +** Write the estimated row count into *pnRow and return SQLITE_OK. +** If unable to make an estimate, leave *pnRow unchanged and return +** non-zero. +** +** This routine can fail if it is unable to load a collating sequence +** required for string comparison, or if unable to allocate memory +** for a UTF conversion required for comparison. The error is stored +** in the pParse structure. +*/ +static int whereInScanEst( + Parse *pParse, /* Parsing & code generating context */ + WhereLoopBuilder *pBuilder, + ExprList *pList, /* The value list on the RHS of "x IN (v1,v2,v3,...)" */ + tRowcnt *pnRow /* Write the revised row estimate here */ +){ + Index *p = pBuilder->pNew->u.btree.pIndex; + i64 nRow0 = sqlite3LogEstToInt(p->aiRowLogEst[0]); + int nRecValid = pBuilder->nRecValid; + int rc = SQLITE_OK; /* Subfunction return code */ + tRowcnt nEst; /* Number of rows for a single term */ + tRowcnt nRowEst = 0; /* New estimate of the number of rows */ + int i; /* Loop counter */ + + assert( p->aSample!=0 ); + for(i=0; rc==SQLITE_OK && inExpr; i++){ + nEst = nRow0; + rc = whereEqualScanEst(pParse, pBuilder, pList->a[i].pExpr, &nEst); + nRowEst += nEst; + pBuilder->nRecValid = nRecValid; + } + + if( rc==SQLITE_OK ){ + if( nRowEst > nRow0 ) nRowEst = nRow0; + *pnRow = nRowEst; + WHERETRACE(0x10,("IN row estimate: est=%d\n", nRowEst)); + } + assert( pBuilder->nRecValid==nRecValid ); + return rc; +} +#endif /* SQLITE_ENABLE_STAT4 */ + + +#ifdef WHERETRACE_ENABLED +/* +** Print the content of a WhereTerm object +*/ +SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){ + if( pTerm==0 ){ + sqlite3DebugPrintf("TERM-%-3d NULL\n", iTerm); + }else{ + char zType[8]; + char zLeft[50]; + memcpy(zType, "....", 5); + if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V'; + if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; + if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L'; + if( pTerm->wtFlags & TERM_CODED ) zType[3] = 'C'; + if( pTerm->eOperator & WO_SINGLE ){ + sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}", + pTerm->leftCursor, pTerm->u.leftColumn); + }else if( (pTerm->eOperator & WO_OR)!=0 && pTerm->u.pOrInfo!=0 ){ + sqlite3_snprintf(sizeof(zLeft),zLeft,"indexable=0x%lld", + pTerm->u.pOrInfo->indexable); + }else{ + sqlite3_snprintf(sizeof(zLeft),zLeft,"left=%d", pTerm->leftCursor); + } + sqlite3DebugPrintf( + "TERM-%-3d %p %s %-12s op=%03x wtFlags=%04x", + iTerm, pTerm, zType, zLeft, pTerm->eOperator, pTerm->wtFlags); + /* The 0x10000 .wheretrace flag causes extra information to be + ** shown about each Term */ + if( sqlite3WhereTrace & 0x10000 ){ + sqlite3DebugPrintf(" prob=%-3d prereq=%llx,%llx", + pTerm->truthProb, (u64)pTerm->prereqAll, (u64)pTerm->prereqRight); + } + if( pTerm->iField ){ + sqlite3DebugPrintf(" iField=%d", pTerm->iField); + } + if( pTerm->iParent>=0 ){ + sqlite3DebugPrintf(" iParent=%d", pTerm->iParent); + } + sqlite3DebugPrintf("\n"); + sqlite3TreeViewExpr(0, pTerm->pExpr, 0); + } +} +#endif + +#ifdef WHERETRACE_ENABLED +/* +** Show the complete content of a WhereClause +*/ +SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC){ + int i; + for(i=0; inTerm; i++){ + sqlite3WhereTermPrint(&pWC->a[i], i); + } +} +#endif + +#ifdef WHERETRACE_ENABLED +/* +** Print a WhereLoop object for debugging purposes +*/ +SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC){ + WhereInfo *pWInfo = pWC->pWInfo; + int nb = 1+(pWInfo->pTabList->nSrc+3)/4; + struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab; + Table *pTab = pItem->pTab; + Bitmask mAll = (((Bitmask)1)<<(nb*4)) - 1; + sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId, + p->iTab, nb, p->maskSelf, nb, p->prereq & mAll); + sqlite3DebugPrintf(" %12s", + pItem->zAlias ? pItem->zAlias : pTab->zName); + if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + const char *zName; + if( p->u.btree.pIndex && (zName = p->u.btree.pIndex->zName)!=0 ){ + if( strncmp(zName, "sqlite_autoindex_", 17)==0 ){ + int i = sqlite3Strlen30(zName) - 1; + while( zName[i]!='_' ) i--; + zName += i; + } + sqlite3DebugPrintf(".%-16s %2d", zName, p->u.btree.nEq); + }else{ + sqlite3DebugPrintf("%20s",""); + } + }else{ + char *z; + if( p->u.vtab.idxStr ){ + z = sqlite3_mprintf("(%d,\"%s\",%#x)", + p->u.vtab.idxNum, p->u.vtab.idxStr, p->u.vtab.omitMask); + }else{ + z = sqlite3_mprintf("(%d,%x)", p->u.vtab.idxNum, p->u.vtab.omitMask); + } + sqlite3DebugPrintf(" %-19s", z); + sqlite3_free(z); + } + if( p->wsFlags & WHERE_SKIPSCAN ){ + sqlite3DebugPrintf(" f %05x %d-%d", p->wsFlags, p->nLTerm,p->nSkip); + }else{ + sqlite3DebugPrintf(" f %05x N %d", p->wsFlags, p->nLTerm); + } + sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut); + if( p->nLTerm && (sqlite3WhereTrace & 0x100)!=0 ){ + int i; + for(i=0; inLTerm; i++){ + sqlite3WhereTermPrint(p->aLTerm[i], i); + } + } +} +#endif + +/* +** Convert bulk memory into a valid WhereLoop that can be passed +** to whereLoopClear harmlessly. +*/ +static void whereLoopInit(WhereLoop *p){ + p->aLTerm = p->aLTermSpace; + p->nLTerm = 0; + p->nLSlot = ArraySize(p->aLTermSpace); + p->wsFlags = 0; +} + +/* +** Clear the WhereLoop.u union. Leave WhereLoop.pLTerm intact. +*/ +static void whereLoopClearUnion(sqlite3 *db, WhereLoop *p){ + if( p->wsFlags & (WHERE_VIRTUALTABLE|WHERE_AUTO_INDEX) ){ + if( (p->wsFlags & WHERE_VIRTUALTABLE)!=0 && p->u.vtab.needFree ){ + sqlite3_free(p->u.vtab.idxStr); + p->u.vtab.needFree = 0; + p->u.vtab.idxStr = 0; + }else if( (p->wsFlags & WHERE_AUTO_INDEX)!=0 && p->u.btree.pIndex!=0 ){ + sqlite3DbFree(db, p->u.btree.pIndex->zColAff); + sqlite3DbFreeNN(db, p->u.btree.pIndex); + p->u.btree.pIndex = 0; + } + } +} + +/* +** Deallocate internal memory used by a WhereLoop object +*/ +static void whereLoopClear(sqlite3 *db, WhereLoop *p){ + if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFreeNN(db, p->aLTerm); + whereLoopClearUnion(db, p); + whereLoopInit(p); +} + +/* +** Increase the memory allocation for pLoop->aLTerm[] to be at least n. +*/ +static int whereLoopResize(sqlite3 *db, WhereLoop *p, int n){ + WhereTerm **paNew; + if( p->nLSlot>=n ) return SQLITE_OK; + n = (n+7)&~7; + paNew = sqlite3DbMallocRawNN(db, sizeof(p->aLTerm[0])*n); + if( paNew==0 ) return SQLITE_NOMEM_BKPT; + memcpy(paNew, p->aLTerm, sizeof(p->aLTerm[0])*p->nLSlot); + if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFreeNN(db, p->aLTerm); + p->aLTerm = paNew; + p->nLSlot = n; + return SQLITE_OK; +} + +/* +** Transfer content from the second pLoop into the first. +*/ +static int whereLoopXfer(sqlite3 *db, WhereLoop *pTo, WhereLoop *pFrom){ + whereLoopClearUnion(db, pTo); + if( whereLoopResize(db, pTo, pFrom->nLTerm) ){ + memset(&pTo->u, 0, sizeof(pTo->u)); + return SQLITE_NOMEM_BKPT; + } + memcpy(pTo, pFrom, WHERE_LOOP_XFER_SZ); + memcpy(pTo->aLTerm, pFrom->aLTerm, pTo->nLTerm*sizeof(pTo->aLTerm[0])); + if( pFrom->wsFlags & WHERE_VIRTUALTABLE ){ + pFrom->u.vtab.needFree = 0; + }else if( (pFrom->wsFlags & WHERE_AUTO_INDEX)!=0 ){ + pFrom->u.btree.pIndex = 0; + } + return SQLITE_OK; +} + +/* +** Delete a WhereLoop object +*/ +static void whereLoopDelete(sqlite3 *db, WhereLoop *p){ + whereLoopClear(db, p); + sqlite3DbFreeNN(db, p); +} + +/* +** Free a WhereInfo structure +*/ +static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ + int i; + assert( pWInfo!=0 ); + for(i=0; inLevel; i++){ + WhereLevel *pLevel = &pWInfo->a[i]; + if( pLevel->pWLoop && (pLevel->pWLoop->wsFlags & WHERE_IN_ABLE) ){ + sqlite3DbFree(db, pLevel->u.in.aInLoop); + } + } + sqlite3WhereClauseClear(&pWInfo->sWC); + while( pWInfo->pLoops ){ + WhereLoop *p = pWInfo->pLoops; + pWInfo->pLoops = p->pNextLoop; + whereLoopDelete(db, p); + } + assert( pWInfo->pExprMods==0 ); + sqlite3DbFreeNN(db, pWInfo); +} + +/* +** Return TRUE if all of the following are true: +** +** (1) X has the same or lower cost that Y +** (2) X uses fewer WHERE clause terms than Y +** (3) Every WHERE clause term used by X is also used by Y +** (4) X skips at least as many columns as Y +** (5) If X is a covering index, than Y is too +** +** Conditions (2) and (3) mean that X is a "proper subset" of Y. +** If X is a proper subset of Y then Y is a better choice and ought +** to have a lower cost. This routine returns TRUE when that cost +** relationship is inverted and needs to be adjusted. Constraint (4) +** was added because if X uses skip-scan less than Y it still might +** deserve a lower cost even if it is a proper subset of Y. Constraint (5) +** was added because a covering index probably deserves to have a lower cost +** than a non-covering index even if it is a proper subset. +*/ +static int whereLoopCheaperProperSubset( + const WhereLoop *pX, /* First WhereLoop to compare */ + const WhereLoop *pY /* Compare against this WhereLoop */ +){ + int i, j; + if( pX->nLTerm-pX->nSkip >= pY->nLTerm-pY->nSkip ){ + return 0; /* X is not a subset of Y */ + } + if( pY->nSkip > pX->nSkip ) return 0; + if( pX->rRun >= pY->rRun ){ + if( pX->rRun > pY->rRun ) return 0; /* X costs more than Y */ + if( pX->nOut > pY->nOut ) return 0; /* X costs more than Y */ + } + for(i=pX->nLTerm-1; i>=0; i--){ + if( pX->aLTerm[i]==0 ) continue; + for(j=pY->nLTerm-1; j>=0; j--){ + if( pY->aLTerm[j]==pX->aLTerm[i] ) break; + } + if( j<0 ) return 0; /* X not a subset of Y since term X[i] not used by Y */ + } + if( (pX->wsFlags&WHERE_IDX_ONLY)!=0 + && (pY->wsFlags&WHERE_IDX_ONLY)==0 ){ + return 0; /* Constraint (5) */ + } + return 1; /* All conditions meet */ +} + +/* +** Try to adjust the cost of WhereLoop pTemplate upwards or downwards so +** that: +** +** (1) pTemplate costs less than any other WhereLoops that are a proper +** subset of pTemplate +** +** (2) pTemplate costs more than any other WhereLoops for which pTemplate +** is a proper subset. +** +** To say "WhereLoop X is a proper subset of Y" means that X uses fewer +** WHERE clause terms than Y and that every WHERE clause term used by X is +** also used by Y. +*/ +static void whereLoopAdjustCost(const WhereLoop *p, WhereLoop *pTemplate){ + if( (pTemplate->wsFlags & WHERE_INDEXED)==0 ) return; + for(; p; p=p->pNextLoop){ + if( p->iTab!=pTemplate->iTab ) continue; + if( (p->wsFlags & WHERE_INDEXED)==0 ) continue; + if( whereLoopCheaperProperSubset(p, pTemplate) ){ + /* Adjust pTemplate cost downward so that it is cheaper than its + ** subset p. */ + WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n", + pTemplate->rRun, pTemplate->nOut, p->rRun, p->nOut-1)); + pTemplate->rRun = p->rRun; + pTemplate->nOut = p->nOut - 1; + }else if( whereLoopCheaperProperSubset(pTemplate, p) ){ + /* Adjust pTemplate cost upward so that it is costlier than p since + ** pTemplate is a proper subset of p */ + WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n", + pTemplate->rRun, pTemplate->nOut, p->rRun, p->nOut+1)); + pTemplate->rRun = p->rRun; + pTemplate->nOut = p->nOut + 1; + } + } +} + +/* +** Search the list of WhereLoops in *ppPrev looking for one that can be +** replaced by pTemplate. +** +** Return NULL if pTemplate does not belong on the WhereLoop list. +** In other words if pTemplate ought to be dropped from further consideration. +** +** If pX is a WhereLoop that pTemplate can replace, then return the +** link that points to pX. +** +** If pTemplate cannot replace any existing element of the list but needs +** to be added to the list as a new entry, then return a pointer to the +** tail of the list. +*/ +static WhereLoop **whereLoopFindLesser( + WhereLoop **ppPrev, + const WhereLoop *pTemplate +){ + WhereLoop *p; + for(p=(*ppPrev); p; ppPrev=&p->pNextLoop, p=*ppPrev){ + if( p->iTab!=pTemplate->iTab || p->iSortIdx!=pTemplate->iSortIdx ){ + /* If either the iTab or iSortIdx values for two WhereLoop are different + ** then those WhereLoops need to be considered separately. Neither is + ** a candidate to replace the other. */ + continue; + } + /* In the current implementation, the rSetup value is either zero + ** or the cost of building an automatic index (NlogN) and the NlogN + ** is the same for compatible WhereLoops. */ + assert( p->rSetup==0 || pTemplate->rSetup==0 + || p->rSetup==pTemplate->rSetup ); + + /* whereLoopAddBtree() always generates and inserts the automatic index + ** case first. Hence compatible candidate WhereLoops never have a larger + ** rSetup. Call this SETUP-INVARIANT */ + assert( p->rSetup>=pTemplate->rSetup ); + + /* Any loop using an appliation-defined index (or PRIMARY KEY or + ** UNIQUE constraint) with one or more == constraints is better + ** than an automatic index. Unless it is a skip-scan. */ + if( (p->wsFlags & WHERE_AUTO_INDEX)!=0 + && (pTemplate->nSkip)==0 + && (pTemplate->wsFlags & WHERE_INDEXED)!=0 + && (pTemplate->wsFlags & WHERE_COLUMN_EQ)!=0 + && (p->prereq & pTemplate->prereq)==pTemplate->prereq + ){ + break; + } + + /* If existing WhereLoop p is better than pTemplate, pTemplate can be + ** discarded. WhereLoop p is better if: + ** (1) p has no more dependencies than pTemplate, and + ** (2) p has an equal or lower cost than pTemplate + */ + if( (p->prereq & pTemplate->prereq)==p->prereq /* (1) */ + && p->rSetup<=pTemplate->rSetup /* (2a) */ + && p->rRun<=pTemplate->rRun /* (2b) */ + && p->nOut<=pTemplate->nOut /* (2c) */ + ){ + return 0; /* Discard pTemplate */ + } + + /* 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 + ** (2) pTemplate has an equal or lower cost than p. + */ + if( (p->prereq & pTemplate->prereq)==pTemplate->prereq /* (1) */ + && p->rRun>=pTemplate->rRun /* (2a) */ + && p->nOut>=pTemplate->nOut /* (2b) */ + ){ + assert( p->rSetup>=pTemplate->rSetup ); /* SETUP-INVARIANT above */ + break; /* Cause p to be overwritten by pTemplate */ + } + } + return ppPrev; +} + +/* +** Insert or replace a WhereLoop entry using the template supplied. +** +** An existing WhereLoop entry might be overwritten if the new template +** is better and has fewer dependencies. Or the template will be ignored +** and no insert will occur if an existing WhereLoop is faster and has +** fewer dependencies than the template. Otherwise a new WhereLoop is +** added based on the template. +** +** If pBuilder->pOrSet is not NULL then we care about only the +** prerequisites and rRun and nOut costs of the N best loops. That +** information is gathered in the pBuilder->pOrSet object. This special +** processing mode is used only for OR clause processing. +** +** When accumulating multiple loops (when pBuilder->pOrSet is NULL) we +** still might overwrite similar loops with the new template if the +** new template is better. Loops may be overwritten if the following +** conditions are met: +** +** (1) They have the same iTab. +** (2) They have the same iSortIdx. +** (3) The template has same or fewer dependencies than the current loop +** (4) The template has the same or lower cost than the current loop +*/ +static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ + WhereLoop **ppPrev, *p; + WhereInfo *pWInfo = pBuilder->pWInfo; + sqlite3 *db = pWInfo->pParse->db; + int rc; + + /* Stop the search once we hit the query planner search limit */ + if( pBuilder->iPlanLimit==0 ){ + WHERETRACE(0xffffffff,("=== query planner search limit reached ===\n")); + if( pBuilder->pOrSet ) pBuilder->pOrSet->n = 0; + return SQLITE_DONE; + } + pBuilder->iPlanLimit--; + + whereLoopAdjustCost(pWInfo->pLoops, pTemplate); + + /* If pBuilder->pOrSet is defined, then only keep track of the costs + ** and prereqs. + */ + if( pBuilder->pOrSet!=0 ){ + if( pTemplate->nLTerm ){ +#if WHERETRACE_ENABLED + u16 n = pBuilder->pOrSet->n; + int x = +#endif + whereOrInsert(pBuilder->pOrSet, pTemplate->prereq, pTemplate->rRun, + pTemplate->nOut); +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); + } +#endif + } + return SQLITE_OK; + } + + /* Look for an existing WhereLoop to replace with pTemplate + */ + ppPrev = whereLoopFindLesser(&pWInfo->pLoops, pTemplate); + + if( ppPrev==0 ){ + /* There already exists a WhereLoop on the list that is better + ** than pTemplate, so just ignore pTemplate */ +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + sqlite3DebugPrintf(" skip: "); + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); + } +#endif + return SQLITE_OK; + }else{ + p = *ppPrev; + } + + /* If we reach this point it means that either p[] should be overwritten + ** with pTemplate[] if p[] exists, or if p==NULL then allocate a new + ** WhereLoop and insert it. + */ +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + if( p!=0 ){ + sqlite3DebugPrintf("replace: "); + sqlite3WhereLoopPrint(p, pBuilder->pWC); + sqlite3DebugPrintf(" with: "); + }else{ + sqlite3DebugPrintf(" add: "); + } + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); + } +#endif + if( p==0 ){ + /* Allocate a new WhereLoop to add to the end of the list */ + *ppPrev = p = sqlite3DbMallocRawNN(db, sizeof(WhereLoop)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + whereLoopInit(p); + p->pNextLoop = 0; + }else{ + /* We will be overwriting WhereLoop p[]. But before we do, first + ** go through the rest of the list and delete any other entries besides + ** p[] that are also supplated by pTemplate */ + WhereLoop **ppTail = &p->pNextLoop; + WhereLoop *pToDel; + while( *ppTail ){ + ppTail = whereLoopFindLesser(ppTail, pTemplate); + if( ppTail==0 ) break; + pToDel = *ppTail; + if( pToDel==0 ) break; + *ppTail = pToDel->pNextLoop; +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + sqlite3DebugPrintf(" delete: "); + sqlite3WhereLoopPrint(pToDel, pBuilder->pWC); + } +#endif + whereLoopDelete(db, pToDel); + } + } + rc = whereLoopXfer(db, p, pTemplate); + if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + Index *pIndex = p->u.btree.pIndex; + if( pIndex && pIndex->idxType==SQLITE_IDXTYPE_IPK ){ + p->u.btree.pIndex = 0; + } + } + return rc; +} + +/* +** Adjust the WhereLoop.nOut value downward to account for terms of the +** WHERE clause that reference the loop but which are not used by an +** index. +* +** For every WHERE clause term that is not used by the index +** and which has a truth probability assigned by one of the likelihood(), +** likely(), or unlikely() SQL functions, reduce the estimated number +** of output rows by the probability specified. +** +** TUNING: For every WHERE clause term that is not used by the index +** and which does not have an assigned truth probability, heuristics +** described below are used to try to estimate the truth probability. +** TODO --> Perhaps this is something that could be improved by better +** table statistics. +** +** Heuristic 1: Estimate the truth probability as 93.75%. The 93.75% +** value corresponds to -1 in LogEst notation, so this means decrement +** the WhereLoop.nOut field for every such WHERE clause term. +** +** Heuristic 2: If there exists one or more WHERE clause terms of the +** form "x==EXPR" and EXPR is not a constant 0 or 1, then make sure the +** final output row estimate is no greater than 1/4 of the total number +** of rows in the table. In other words, assume that x==EXPR will filter +** out at least 3 out of 4 rows. If EXPR is -1 or 0 or 1, then maybe the +** "x" column is boolean or else -1 or 0 or 1 is a common default value +** on the "x" column and so in that case only cap the output row estimate +** at 1/2 instead of 1/4. +*/ +static void whereLoopOutputAdjust( + WhereClause *pWC, /* The WHERE clause */ + WhereLoop *pLoop, /* The loop to adjust downward */ + LogEst nRow /* Number of rows in the entire table */ +){ + WhereTerm *pTerm, *pX; + Bitmask notAllowed = ~(pLoop->prereq|pLoop->maskSelf); + int i, j; + LogEst iReduce = 0; /* pLoop->nOut should not exceed nRow-iReduce */ + + assert( (pLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); + for(i=pWC->nTerm, pTerm=pWC->a; i>0; i--, pTerm++){ + assert( pTerm!=0 ); + if( (pTerm->wtFlags & TERM_VIRTUAL)!=0 ) break; + if( (pTerm->prereqAll & pLoop->maskSelf)==0 ) continue; + if( (pTerm->prereqAll & notAllowed)!=0 ) continue; + for(j=pLoop->nLTerm-1; j>=0; j--){ + pX = pLoop->aLTerm[j]; + if( pX==0 ) continue; + if( pX==pTerm ) break; + if( pX->iParent>=0 && (&pWC->a[pX->iParent])==pTerm ) break; + } + if( j<0 ){ + if( pTerm->truthProb<=0 ){ + /* If a truth probability is specified using the likelihood() hints, + ** then use the probability provided by the application. */ + pLoop->nOut += pTerm->truthProb; + }else{ + /* In the absence of explicit truth probabilities, use heuristics to + ** guess a reasonable truth probability. */ + pLoop->nOut--; + if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 + && (pTerm->wtFlags & TERM_HIGHTRUTH)==0 /* tag-20200224-1 */ + ){ + Expr *pRight = pTerm->pExpr->pRight; + int k = 0; + testcase( pTerm->pExpr->op==TK_IS ); + if( sqlite3ExprIsInteger(pRight, &k) && k>=(-1) && k<=1 ){ + k = 10; + }else{ + k = 20; + } + if( iReducewtFlags |= TERM_HEURTRUTH; + iReduce = k; + } + } + } + } + } + if( pLoop->nOut > nRow-iReduce ) pLoop->nOut = nRow - iReduce; +} + +/* +** Term pTerm is a vector range comparison operation. The first comparison +** in the vector can be optimized using column nEq of the index. This +** function returns the total number of vector elements that can be used +** as part of the range comparison. +** +** For example, if the query is: +** +** WHERE a = ? AND (b, c, d) > (?, ?, ?) +** +** and the index: +** +** CREATE INDEX ... ON (a, b, c, d, e) +** +** then this function would be invoked with nEq=1. The value returned in +** this case is 3. +*/ +static int whereRangeVectorLen( + Parse *pParse, /* Parsing context */ + int iCur, /* Cursor open on pIdx */ + Index *pIdx, /* The index to be used for a inequality constraint */ + int nEq, /* Number of prior equality constraints on same index */ + WhereTerm *pTerm /* The vector inequality constraint */ +){ + int nCmp = sqlite3ExprVectorSize(pTerm->pExpr->pLeft); + int i; + + nCmp = MIN(nCmp, (pIdx->nColumn - nEq)); + for(i=1; ipExpr->pLeft->x.pList->a[i].pExpr; + Expr *pRhs = pTerm->pExpr->pRight; + if( pRhs->flags & EP_xIsSelect ){ + pRhs = pRhs->x.pSelect->pEList->a[i].pExpr; + }else{ + pRhs = pRhs->x.pList->a[i].pExpr; + } + + /* Check that the LHS of the comparison is a column reference to + ** the right column of the right source table. And that the sort + ** order of the index column is the same as the sort order of the + ** leftmost index column. */ + if( pLhs->op!=TK_COLUMN + || pLhs->iTable!=iCur + || pLhs->iColumn!=pIdx->aiColumn[i+nEq] + || pIdx->aSortOrder[i+nEq]!=pIdx->aSortOrder[nEq] + ){ + break; + } + + testcase( pLhs->iColumn==XN_ROWID ); + aff = sqlite3CompareAffinity(pRhs, sqlite3ExprAffinity(pLhs)); + idxaff = sqlite3TableColumnAffinity(pIdx->pTable, pLhs->iColumn); + if( aff!=idxaff ) break; + + pColl = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); + if( pColl==0 ) break; + if( sqlite3StrICmp(pColl->zName, pIdx->azColl[i+nEq]) ) break; + } + return i; +} + +/* +** Adjust the cost C by the costMult facter T. This only occurs if +** compiled with -DSQLITE_ENABLE_COSTMULT +*/ +#ifdef SQLITE_ENABLE_COSTMULT +# define ApplyCostMultiplier(C,T) C += T +#else +# define ApplyCostMultiplier(C,T) +#endif + +/* +** We have so far matched pBuilder->pNew->u.btree.nEq terms of the +** index pIndex. Try to match one more. +** +** When this function is called, pBuilder->pNew->nOut contains the +** number of rows expected to be visited by filtering using the nEq +** terms only. If it is modified, this value is restored before this +** function returns. +** +** If pProbe->idxType==SQLITE_IDXTYPE_IPK, that means pIndex is +** a fake index used for the INTEGER PRIMARY KEY. +*/ +static int whereLoopAddBtreeIndex( + WhereLoopBuilder *pBuilder, /* The WhereLoop factory */ + struct SrcList_item *pSrc, /* FROM clause term being analyzed */ + Index *pProbe, /* An index on pSrc */ + LogEst nInMul /* log(Number of iterations due to IN) */ +){ + WhereInfo *pWInfo = pBuilder->pWInfo; /* WHERE analyse context */ + Parse *pParse = pWInfo->pParse; /* Parsing context */ + sqlite3 *db = pParse->db; /* Database connection malloc context */ + WhereLoop *pNew; /* Template WhereLoop under construction */ + WhereTerm *pTerm; /* A WhereTerm under consideration */ + int opMask; /* Valid operators for constraints */ + WhereScan scan; /* Iterator for WHERE terms */ + Bitmask saved_prereq; /* Original value of pNew->prereq */ + u16 saved_nLTerm; /* Original value of pNew->nLTerm */ + u16 saved_nEq; /* Original value of pNew->u.btree.nEq */ + u16 saved_nBtm; /* Original value of pNew->u.btree.nBtm */ + u16 saved_nTop; /* Original value of pNew->u.btree.nTop */ + u16 saved_nSkip; /* Original value of pNew->nSkip */ + u32 saved_wsFlags; /* Original value of pNew->wsFlags */ + LogEst saved_nOut; /* Original value of pNew->nOut */ + int rc = SQLITE_OK; /* Return code */ + LogEst rSize; /* Number of rows in the table */ + LogEst rLogSize; /* Logarithm of table size */ + WhereTerm *pTop = 0, *pBtm = 0; /* Top and bottom range constraints */ + + pNew = pBuilder->pNew; + if( db->mallocFailed ) return SQLITE_NOMEM_BKPT; + WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d, nSkip=%d\n", + pProbe->pTable->zName,pProbe->zName, + pNew->u.btree.nEq, pNew->nSkip)); + + assert( (pNew->wsFlags & WHERE_VIRTUALTABLE)==0 ); + assert( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 ); + if( pNew->wsFlags & WHERE_BTM_LIMIT ){ + opMask = WO_LT|WO_LE; + }else{ + assert( pNew->u.btree.nBtm==0 ); + opMask = WO_EQ|WO_IN|WO_GT|WO_GE|WO_LT|WO_LE|WO_ISNULL|WO_IS; + } + if( pProbe->bUnordered ) opMask &= ~(WO_GT|WO_GE|WO_LT|WO_LE); + + assert( pNew->u.btree.nEqnColumn ); + + saved_nEq = pNew->u.btree.nEq; + saved_nBtm = pNew->u.btree.nBtm; + saved_nTop = pNew->u.btree.nTop; + saved_nSkip = pNew->nSkip; + saved_nLTerm = pNew->nLTerm; + saved_wsFlags = pNew->wsFlags; + saved_prereq = pNew->prereq; + saved_nOut = pNew->nOut; + pTerm = whereScanInit(&scan, pBuilder->pWC, pSrc->iCursor, saved_nEq, + opMask, pProbe); + pNew->rSetup = 0; + rSize = pProbe->aiRowLogEst[0]; + rLogSize = estLog(rSize); + for(; rc==SQLITE_OK && pTerm!=0; pTerm = whereScanNext(&scan)){ + u16 eOp = pTerm->eOperator; /* Shorthand for pTerm->eOperator */ + LogEst rCostIdx; + LogEst nOutUnadjusted; /* nOut before IN() and WHERE adjustments */ + int nIn = 0; +#ifdef SQLITE_ENABLE_STAT4 + int nRecValid = pBuilder->nRecValid; +#endif + if( (eOp==WO_ISNULL || (pTerm->wtFlags&TERM_VNULL)!=0) + && indexColumnNotNull(pProbe, saved_nEq) + ){ + continue; /* ignore IS [NOT] NULL constraints on NOT NULL columns */ + } + if( pTerm->prereqRight & pNew->maskSelf ) continue; + + /* Do not allow the upper bound of a LIKE optimization range constraint + ** to mix with a lower range bound from some other source */ + if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue; + + /* tag-20191211-001: Do not allow constraints from the WHERE clause to + ** be used by the right table of a LEFT JOIN. Only constraints in the + ** ON clause are allowed. See tag-20191211-002 for the vtab equivalent. */ + if( (pSrc->fg.jointype & JT_LEFT)!=0 + && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + ){ + continue; + } + + if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){ + pBuilder->bldFlags1 |= SQLITE_BLDF1_UNIQUE; + }else{ + pBuilder->bldFlags1 |= SQLITE_BLDF1_INDEXED; + } + pNew->wsFlags = saved_wsFlags; + pNew->u.btree.nEq = saved_nEq; + pNew->u.btree.nBtm = saved_nBtm; + pNew->u.btree.nTop = saved_nTop; + pNew->nLTerm = saved_nLTerm; + if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */ + pNew->aLTerm[pNew->nLTerm++] = pTerm; + pNew->prereq = (saved_prereq | pTerm->prereqRight) & ~pNew->maskSelf; + + assert( nInMul==0 + || (pNew->wsFlags & WHERE_COLUMN_NULL)!=0 + || (pNew->wsFlags & WHERE_COLUMN_IN)!=0 + || (pNew->wsFlags & WHERE_SKIPSCAN)!=0 + ); + + if( eOp & WO_IN ){ + Expr *pExpr = pTerm->pExpr; + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + /* "x IN (SELECT ...)": TUNING: the SELECT returns 25 rows */ + int i; + nIn = 46; assert( 46==sqlite3LogEst(25) ); + + /* The expression may actually be of the form (x, y) IN (SELECT...). + ** In this case there is a separate term for each of (x) and (y). + ** However, the nIn multiplier should only be applied once, not once + ** for each such term. The following loop checks that pTerm is the + ** first such term in use, and sets nIn back to 0 if it is not. */ + for(i=0; inLTerm-1; i++){ + if( pNew->aLTerm[i] && pNew->aLTerm[i]->pExpr==pExpr ) nIn = 0; + } + }else if( ALWAYS(pExpr->x.pList && pExpr->x.pList->nExpr) ){ + /* "x IN (value, value, ...)" */ + nIn = sqlite3LogEst(pExpr->x.pList->nExpr); + } + if( pProbe->hasStat1 ){ + LogEst M, logK, safetyMargin; + /* Let: + ** N = the total number of rows in the table + ** K = the number of entries on the RHS of the IN operator + ** M = the number of rows in the table that match terms to the + ** to the left in the same index. If the IN operator is on + ** the left-most index column, M==N. + ** + ** Given the definitions above, it is better to omit the IN operator + ** from the index lookup and instead do a scan of the M elements, + ** testing each scanned row against the IN operator separately, if: + ** + ** M*log(K) < K*log(N) + ** + ** Our estimates for M, K, and N might be inaccurate, so we build in + ** a safety margin of 2 (LogEst: 10) that favors using the IN operator + ** with the index, as using an index has better worst-case behavior. + ** If we do not have real sqlite_stat1 data, always prefer to use + ** the index. + */ + M = pProbe->aiRowLogEst[saved_nEq]; + logK = estLog(nIn); + safetyMargin = 10; /* TUNING: extra weight for indexed IN */ + if( M + logK + safetyMargin < nIn + rLogSize ){ + WHERETRACE(0x40, + ("Scan preferred over IN operator on column %d of \"%s\" (%d<%d)\n", + saved_nEq, pProbe->zName, M+logK+10, nIn+rLogSize)); + continue; + }else{ + WHERETRACE(0x40, + ("IN operator preferred on column %d of \"%s\" (%d>=%d)\n", + saved_nEq, pProbe->zName, M+logK+10, nIn+rLogSize)); + } + } + pNew->wsFlags |= WHERE_COLUMN_IN; + }else if( eOp & (WO_EQ|WO_IS) ){ + int iCol = pProbe->aiColumn[saved_nEq]; + pNew->wsFlags |= WHERE_COLUMN_EQ; + assert( saved_nEq==pNew->u.btree.nEq ); + if( iCol==XN_ROWID + || (iCol>=0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1) + ){ + if( iCol==XN_ROWID || pProbe->uniqNotNull + || (pProbe->nKeyCol==1 && pProbe->onError && eOp==WO_EQ) + ){ + pNew->wsFlags |= WHERE_ONEROW; + }else{ + pNew->wsFlags |= WHERE_UNQ_WANTED; + } + } + }else if( eOp & WO_ISNULL ){ + pNew->wsFlags |= WHERE_COLUMN_NULL; + }else if( eOp & (WO_GT|WO_GE) ){ + testcase( eOp & WO_GT ); + testcase( eOp & WO_GE ); + pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_BTM_LIMIT; + pNew->u.btree.nBtm = whereRangeVectorLen( + pParse, pSrc->iCursor, pProbe, saved_nEq, pTerm + ); + pBtm = pTerm; + pTop = 0; + if( pTerm->wtFlags & TERM_LIKEOPT ){ + /* Range contraints that come from the LIKE optimization are + ** always used in pairs. */ + pTop = &pTerm[1]; + assert( (pTop-(pTerm->pWC->a))pWC->nTerm ); + assert( pTop->wtFlags & TERM_LIKEOPT ); + assert( pTop->eOperator==WO_LT ); + if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */ + pNew->aLTerm[pNew->nLTerm++] = pTop; + pNew->wsFlags |= WHERE_TOP_LIMIT; + pNew->u.btree.nTop = 1; + } + }else{ + assert( eOp & (WO_LT|WO_LE) ); + testcase( eOp & WO_LT ); + testcase( eOp & WO_LE ); + pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_TOP_LIMIT; + pNew->u.btree.nTop = whereRangeVectorLen( + pParse, pSrc->iCursor, pProbe, saved_nEq, pTerm + ); + pTop = pTerm; + pBtm = (pNew->wsFlags & WHERE_BTM_LIMIT)!=0 ? + pNew->aLTerm[pNew->nLTerm-2] : 0; + } + + /* At this point pNew->nOut is set to the number of rows expected to + ** be visited by the index scan before considering term pTerm, or the + ** values of nIn and nInMul. In other words, assuming that all + ** "x IN(...)" terms are replaced with "x = ?". This block updates + ** the value of pNew->nOut to account for pTerm (but not nIn/nInMul). */ + assert( pNew->nOut==saved_nOut ); + if( pNew->wsFlags & WHERE_COLUMN_RANGE ){ + /* Adjust nOut using stat4 data. Or, if there is no stat4 + ** data, using some other estimate. */ + whereRangeScanEst(pParse, pBuilder, pBtm, pTop, pNew); + }else{ + int nEq = ++pNew->u.btree.nEq; + assert( eOp & (WO_ISNULL|WO_EQ|WO_IN|WO_IS) ); + + assert( pNew->nOut==saved_nOut ); + if( pTerm->truthProb<=0 && pProbe->aiColumn[saved_nEq]>=0 ){ + assert( (eOp & WO_IN) || nIn==0 ); + testcase( eOp & WO_IN ); + pNew->nOut += pTerm->truthProb; + pNew->nOut -= nIn; + }else{ +#ifdef SQLITE_ENABLE_STAT4 + tRowcnt nOut = 0; + if( nInMul==0 + && pProbe->nSample + && pNew->u.btree.nEq<=pProbe->nSampleCol + && ((eOp & WO_IN)==0 || !ExprHasProperty(pTerm->pExpr, EP_xIsSelect)) + && OptimizationEnabled(db, SQLITE_Stat4) + ){ + Expr *pExpr = pTerm->pExpr; + if( (eOp & (WO_EQ|WO_ISNULL|WO_IS))!=0 ){ + testcase( eOp & WO_EQ ); + testcase( eOp & WO_IS ); + testcase( eOp & WO_ISNULL ); + rc = whereEqualScanEst(pParse, pBuilder, pExpr->pRight, &nOut); + }else{ + rc = whereInScanEst(pParse, pBuilder, pExpr->x.pList, &nOut); + } + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + if( rc!=SQLITE_OK ) break; /* Jump out of the pTerm loop */ + if( nOut ){ + pNew->nOut = sqlite3LogEst(nOut); + if( nEq==1 + /* TUNING: Mark terms as "low selectivity" if they seem likely + ** to be true for half or more of the rows in the table. + ** See tag-202002240-1 */ + && pNew->nOut+10 > pProbe->aiRowLogEst[0] + ){ +#if WHERETRACE_ENABLED /* 0x01 */ + if( sqlite3WhereTrace & 0x01 ){ + sqlite3DebugPrintf( + "STAT4 determines term has low selectivity:\n"); + sqlite3WhereTermPrint(pTerm, 999); + } +#endif + pTerm->wtFlags |= TERM_HIGHTRUTH; + if( pTerm->wtFlags & TERM_HEURTRUTH ){ + /* If the term has previously been used with an assumption of + ** higher selectivity, then set the flag to rerun the + ** loop computations. */ + pBuilder->bldFlags2 |= SQLITE_BLDF2_2NDPASS; + } + } + if( pNew->nOut>saved_nOut ) pNew->nOut = saved_nOut; + pNew->nOut -= nIn; + } + } + if( nOut==0 ) +#endif + { + pNew->nOut += (pProbe->aiRowLogEst[nEq] - pProbe->aiRowLogEst[nEq-1]); + if( eOp & WO_ISNULL ){ + /* TUNING: If there is no likelihood() value, assume that a + ** "col IS NULL" expression matches twice as many rows + ** as (col=?). */ + pNew->nOut += 10; + } + } + } + } + + /* Set rCostIdx to the cost of visiting selected rows in index. Add + ** it to pNew->rRun, which is currently set to the cost of the index + ** seek only. Then, if this is a non-covering index, add the cost of + ** visiting the rows in the main table. */ + assert( pSrc->pTab->szTabRow>0 ); + rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow; + pNew->rRun = sqlite3LogEstAdd(rLogSize, rCostIdx); + if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK))==0 ){ + pNew->rRun = sqlite3LogEstAdd(pNew->rRun, pNew->nOut + 16); + } + ApplyCostMultiplier(pNew->rRun, pProbe->pTable->costMult); + + nOutUnadjusted = pNew->nOut; + pNew->rRun += nInMul + nIn; + pNew->nOut += nInMul + nIn; + whereLoopOutputAdjust(pBuilder->pWC, pNew, rSize); + rc = whereLoopInsert(pBuilder, pNew); + + if( pNew->wsFlags & WHERE_COLUMN_RANGE ){ + pNew->nOut = saved_nOut; + }else{ + pNew->nOut = nOutUnadjusted; + } + + if( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 + && pNew->u.btree.nEqnColumn + ){ + whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nInMul+nIn); + } + pNew->nOut = saved_nOut; +#ifdef SQLITE_ENABLE_STAT4 + pBuilder->nRecValid = nRecValid; +#endif + } + pNew->prereq = saved_prereq; + pNew->u.btree.nEq = saved_nEq; + pNew->u.btree.nBtm = saved_nBtm; + pNew->u.btree.nTop = saved_nTop; + pNew->nSkip = saved_nSkip; + pNew->wsFlags = saved_wsFlags; + pNew->nOut = saved_nOut; + pNew->nLTerm = saved_nLTerm; + + /* Consider using a skip-scan if there are no WHERE clause constraints + ** available for the left-most terms of the index, and if the average + ** number of repeats in the left-most terms is at least 18. + ** + ** The magic number 18 is selected on the basis that scanning 17 rows + ** is almost always quicker than an index seek (even though if the index + ** contains fewer than 2^17 rows we assume otherwise in other parts of + ** the code). And, even if it is not, it should not be too much slower. + ** On the other hand, the extra seeks could end up being significantly + ** more expensive. */ + assert( 42==sqlite3LogEst(18) ); + if( saved_nEq==saved_nSkip + && saved_nEq+1nKeyCol + && saved_nEq==pNew->nLTerm + && pProbe->noSkipScan==0 + && pProbe->hasStat1!=0 + && OptimizationEnabled(db, SQLITE_SkipScan) + && pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */ + && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK + ){ + LogEst nIter; + pNew->u.btree.nEq++; + pNew->nSkip++; + pNew->aLTerm[pNew->nLTerm++] = 0; + pNew->wsFlags |= WHERE_SKIPSCAN; + nIter = pProbe->aiRowLogEst[saved_nEq] - pProbe->aiRowLogEst[saved_nEq+1]; + pNew->nOut -= nIter; + /* TUNING: Because uncertainties in the estimates for skip-scan queries, + ** add a 1.375 fudge factor to make skip-scan slightly less likely. */ + nIter += 5; + whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nIter + nInMul); + pNew->nOut = saved_nOut; + pNew->u.btree.nEq = saved_nEq; + pNew->nSkip = saved_nSkip; + pNew->wsFlags = saved_wsFlags; + } + + WHERETRACE(0x800, ("END %s.addBtreeIdx(%s), nEq=%d, rc=%d\n", + pProbe->pTable->zName, pProbe->zName, saved_nEq, rc)); + return rc; +} + +/* +** Return True if it is possible that pIndex might be useful in +** implementing the ORDER BY clause in pBuilder. +** +** Return False if pBuilder does not contain an ORDER BY clause or +** if there is no way for pIndex to be useful in implementing that +** ORDER BY clause. +*/ +static int indexMightHelpWithOrderBy( + WhereLoopBuilder *pBuilder, + Index *pIndex, + int iCursor +){ + ExprList *pOB; + ExprList *aColExpr; + int ii, jj; + + if( pIndex->bUnordered ) return 0; + if( (pOB = pBuilder->pWInfo->pOrderBy)==0 ) return 0; + for(ii=0; iinExpr; ii++){ + Expr *pExpr = sqlite3ExprSkipCollateAndLikely(pOB->a[ii].pExpr); + if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){ + if( pExpr->iColumn<0 ) return 1; + for(jj=0; jjnKeyCol; jj++){ + if( pExpr->iColumn==pIndex->aiColumn[jj] ) return 1; + } + }else if( (aColExpr = pIndex->aColExpr)!=0 ){ + for(jj=0; jjnKeyCol; jj++){ + if( pIndex->aiColumn[jj]!=XN_EXPR ) continue; + if( sqlite3ExprCompareSkip(pExpr,aColExpr->a[jj].pExpr,iCursor)==0 ){ + return 1; + } + } + } + } + return 0; +} + +/* Check to see if a partial index with pPartIndexWhere can be used +** in the current query. Return true if it can be and false if not. +*/ +static int whereUsablePartialIndex( + int iTab, /* The table for which we want an index */ + int isLeft, /* True if iTab is the right table of a LEFT JOIN */ + WhereClause *pWC, /* The WHERE clause of the query */ + Expr *pWhere /* The WHERE clause from the partial index */ +){ + int i; + WhereTerm *pTerm; + Parse *pParse = pWC->pWInfo->pParse; + while( pWhere->op==TK_AND ){ + if( !whereUsablePartialIndex(iTab,isLeft,pWC,pWhere->pLeft) ) return 0; + pWhere = pWhere->pRight; + } + if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; + for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + Expr *pExpr; + pExpr = pTerm->pExpr; + if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) + && (isLeft==0 || ExprHasProperty(pExpr, EP_FromJoin)) + && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) + ){ + return 1; + } + } + return 0; +} + +/* +** Add all WhereLoop objects for a single table of the join where the table +** is identified by pBuilder->pNew->iTab. That table is guaranteed to be +** a b-tree table, not a virtual table. +** +** The costs (WhereLoop.rRun) of the b-tree loops added by this function +** are calculated as follows: +** +** For a full scan, assuming the table (or index) contains nRow rows: +** +** cost = nRow * 3.0 // full-table scan +** cost = nRow * K // scan of covering index +** cost = nRow * (K+3.0) // scan of non-covering index +** +** where K is a value between 1.1 and 3.0 set based on the relative +** estimated average size of the index and table records. +** +** For an index scan, where nVisit is the number of index rows visited +** by the scan, and nSeek is the number of seek operations required on +** the index b-tree: +** +** cost = nSeek * (log(nRow) + K * nVisit) // covering index +** cost = nSeek * (log(nRow) + (K+3.0) * nVisit) // non-covering index +** +** Normally, nSeek is 1. nSeek values greater than 1 come about if the +** WHERE clause includes "x IN (....)" terms used in place of "x=?". Or when +** implicit "x IN (SELECT x FROM tbl)" terms are added for skip-scans. +** +** The estimated values (nRow, nVisit, nSeek) often contain a large amount +** of uncertainty. For this reason, scoring is designed to pick plans that +** "do the least harm" if the estimates are inaccurate. For example, a +** log(nRow) factor is omitted from a non-covering index scan in order to +** bias the scoring in favor of using an index, since the worst-case +** performance of using an index is far better than the worst-case performance +** of a full table scan. +*/ +static int whereLoopAddBtree( + WhereLoopBuilder *pBuilder, /* WHERE clause information */ + Bitmask mPrereq /* Extra prerequesites for using this table */ +){ + WhereInfo *pWInfo; /* WHERE analysis context */ + Index *pProbe; /* An index we are evaluating */ + Index sPk; /* A fake index object for the primary key */ + LogEst aiRowEstPk[2]; /* The aiRowLogEst[] value for the sPk index */ + i16 aiColumnPk = -1; /* The aColumn[] value for the sPk index */ + SrcList *pTabList; /* The FROM clause */ + struct SrcList_item *pSrc; /* The FROM clause btree term to add */ + WhereLoop *pNew; /* Template WhereLoop object */ + int rc = SQLITE_OK; /* Return code */ + int iSortIdx = 1; /* Index number */ + int b; /* A boolean value */ + LogEst rSize; /* number of rows in the table */ + LogEst rLogSize; /* Logarithm of the number of rows in the table */ + WhereClause *pWC; /* The parsed WHERE clause */ + Table *pTab; /* Table being queried */ + + pNew = pBuilder->pNew; + pWInfo = pBuilder->pWInfo; + pTabList = pWInfo->pTabList; + pSrc = pTabList->a + pNew->iTab; + pTab = pSrc->pTab; + pWC = pBuilder->pWC; + assert( !IsVirtual(pSrc->pTab) ); + + if( pSrc->pIBIndex ){ + /* An INDEXED BY clause specifies a particular index to use */ + pProbe = pSrc->pIBIndex; + }else if( !HasRowid(pTab) ){ + pProbe = pTab->pIndex; + }else{ + /* There is no INDEXED BY clause. Create a fake Index object in local + ** variable sPk to represent the rowid primary key index. Make this + ** fake index the first in a chain of Index objects with all of the real + ** indices to follow */ + Index *pFirst; /* First of real indices on the table */ + memset(&sPk, 0, sizeof(Index)); + sPk.nKeyCol = 1; + sPk.nColumn = 1; + sPk.aiColumn = &aiColumnPk; + sPk.aiRowLogEst = aiRowEstPk; + sPk.onError = OE_Replace; + sPk.pTable = pTab; + sPk.szIdxRow = pTab->szTabRow; + sPk.idxType = SQLITE_IDXTYPE_IPK; + aiRowEstPk[0] = pTab->nRowLogEst; + aiRowEstPk[1] = 0; + pFirst = pSrc->pTab->pIndex; + if( pSrc->fg.notIndexed==0 ){ + /* The real indices of the table are only considered if the + ** NOT INDEXED qualifier is omitted from the FROM clause */ + sPk.pNext = pFirst; + } + pProbe = &sPk; + } + rSize = pTab->nRowLogEst; + rLogSize = estLog(rSize); + +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX + /* Automatic indexes */ + if( !pBuilder->pOrSet /* Not part of an OR optimization */ + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + && (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0 + && pSrc->pIBIndex==0 /* Has no INDEXED BY clause */ + && !pSrc->fg.notIndexed /* Has no NOT INDEXED clause */ + && HasRowid(pTab) /* Not WITHOUT ROWID table. (FIXME: Why not?) */ + && !pSrc->fg.isCorrelated /* Not a correlated subquery */ + && !pSrc->fg.isRecursive /* Not a recursive common table expression. */ + ){ + /* Generate auto-index WhereLoops */ + WhereTerm *pTerm; + WhereTerm *pWCEnd = pWC->a + pWC->nTerm; + for(pTerm=pWC->a; rc==SQLITE_OK && pTermprereqRight & pNew->maskSelf ) continue; + if( termCanDriveIndex(pTerm, pSrc, 0) ){ + pNew->u.btree.nEq = 1; + pNew->nSkip = 0; + pNew->u.btree.pIndex = 0; + pNew->nLTerm = 1; + pNew->aLTerm[0] = pTerm; + /* TUNING: One-time cost for computing the automatic index is + ** estimated to be X*N*log2(N) where N is the number of rows in + ** the table being indexed and where X is 7 (LogEst=28) for normal + ** tables or 0.5 (LogEst=-10) for views and subqueries. The value + ** of X is smaller for views and subqueries so that the query planner + ** will be more aggressive about generating automatic indexes for + ** those objects, since there is no opportunity to add schema + ** indexes on subqueries and views. */ + pNew->rSetup = rLogSize + rSize; + if( pTab->pSelect==0 && (pTab->tabFlags & TF_Ephemeral)==0 ){ + pNew->rSetup += 28; + }else{ + pNew->rSetup -= 10; + } + ApplyCostMultiplier(pNew->rSetup, pTab->costMult); + if( pNew->rSetup<0 ) pNew->rSetup = 0; + /* TUNING: Each index lookup yields 20 rows in the table. This + ** is more than the usual guess of 10 rows, since we have no way + ** of knowing how selective the index will ultimately be. It would + ** not be unreasonable to make this value much larger. */ + pNew->nOut = 43; assert( 43==sqlite3LogEst(20) ); + pNew->rRun = sqlite3LogEstAdd(rLogSize,pNew->nOut); + pNew->wsFlags = WHERE_AUTO_INDEX; + pNew->prereq = mPrereq | pTerm->prereqRight; + rc = whereLoopInsert(pBuilder, pNew); + } + } + } +#endif /* SQLITE_OMIT_AUTOMATIC_INDEX */ + + /* Loop over all indices. If there was an INDEXED BY clause, then only + ** consider index pProbe. */ + for(; rc==SQLITE_OK && pProbe; + pProbe=(pSrc->pIBIndex ? 0 : pProbe->pNext), iSortIdx++ + ){ + int isLeft = (pSrc->fg.jointype & JT_OUTER)!=0; + if( pProbe->pPartIdxWhere!=0 + && !whereUsablePartialIndex(pSrc->iCursor, isLeft, pWC, + pProbe->pPartIdxWhere) + ){ + testcase( pNew->iTab!=pSrc->iCursor ); /* See ticket [98d973b8f5] */ + continue; /* Partial index inappropriate for this query */ + } + if( pProbe->bNoQuery ) continue; + rSize = pProbe->aiRowLogEst[0]; + pNew->u.btree.nEq = 0; + pNew->u.btree.nBtm = 0; + pNew->u.btree.nTop = 0; + pNew->nSkip = 0; + pNew->nLTerm = 0; + pNew->iSortIdx = 0; + pNew->rSetup = 0; + pNew->prereq = mPrereq; + pNew->nOut = rSize; + pNew->u.btree.pIndex = pProbe; + b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); + /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ + assert( (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || b==0 ); + if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){ + /* Integer primary key index */ + pNew->wsFlags = WHERE_IPK; + + /* Full table scan */ + pNew->iSortIdx = b ? iSortIdx : 0; + /* TUNING: Cost of full table scan is (N*3.0). */ + pNew->rRun = rSize + 16; + ApplyCostMultiplier(pNew->rRun, pTab->costMult); + whereLoopOutputAdjust(pWC, pNew, rSize); + rc = whereLoopInsert(pBuilder, pNew); + pNew->nOut = rSize; + if( rc ) break; + }else{ + Bitmask m; + if( pProbe->isCovering ){ + pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED; + m = 0; + }else{ + m = pSrc->colUsed & pProbe->colNotIdxed; + pNew->wsFlags = (m==0) ? (WHERE_IDX_ONLY|WHERE_INDEXED) : WHERE_INDEXED; + } + + /* Full scan via index */ + if( b + || !HasRowid(pTab) + || pProbe->pPartIdxWhere!=0 + || ( m==0 + && pProbe->bUnordered==0 + && (pProbe->szIdxRowszTabRow) + && (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 + && sqlite3GlobalConfig.bUseCis + && OptimizationEnabled(pWInfo->pParse->db, SQLITE_CoverIdxScan) + ) + ){ + pNew->iSortIdx = b ? iSortIdx : 0; + + /* The cost of visiting the index rows is N*K, where K is + ** between 1.1 and 3.0, depending on the relative sizes of the + ** index and table rows. */ + pNew->rRun = rSize + 1 + (15*pProbe->szIdxRow)/pTab->szTabRow; + if( m!=0 ){ + /* If this is a non-covering index scan, add in the cost of + ** doing table lookups. The cost will be 3x the number of + ** lookups. Take into account WHERE clause terms that can be + ** satisfied using just the index, and that do not require a + ** table lookup. */ + LogEst nLookup = rSize + 16; /* Base cost: N*3 */ + int ii; + int iCur = pSrc->iCursor; + WhereClause *pWC2 = &pWInfo->sWC; + for(ii=0; iinTerm; ii++){ + WhereTerm *pTerm = &pWC2->a[ii]; + if( !sqlite3ExprCoveredByIndex(pTerm->pExpr, iCur, pProbe) ){ + break; + } + /* pTerm can be evaluated using just the index. So reduce + ** the expected number of table lookups accordingly */ + if( pTerm->truthProb<=0 ){ + nLookup += pTerm->truthProb; + }else{ + nLookup--; + if( pTerm->eOperator & (WO_EQ|WO_IS) ) nLookup -= 19; + } + } + + pNew->rRun = sqlite3LogEstAdd(pNew->rRun, nLookup); + } + ApplyCostMultiplier(pNew->rRun, pTab->costMult); + whereLoopOutputAdjust(pWC, pNew, rSize); + rc = whereLoopInsert(pBuilder, pNew); + pNew->nOut = rSize; + if( rc ) break; + } + } + + pBuilder->bldFlags1 = 0; + rc = whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, 0); + if( pBuilder->bldFlags1==SQLITE_BLDF1_INDEXED ){ + /* If a non-unique index is used, or if a prefix of the key for + ** unique index is used (making the index functionally non-unique) + ** then the sqlite_stat1 data becomes important for scoring the + ** plan */ + pTab->tabFlags |= TF_StatsUsed; + } +#ifdef SQLITE_ENABLE_STAT4 + sqlite3Stat4ProbeFree(pBuilder->pRec); + pBuilder->nRecValid = 0; + pBuilder->pRec = 0; +#endif + } + return rc; +} + +#ifndef SQLITE_OMIT_VIRTUALTABLE + +/* +** Argument pIdxInfo is already populated with all constraints that may +** be used by the virtual table identified by pBuilder->pNew->iTab. This +** function marks a subset of those constraints usable, invokes the +** xBestIndex method and adds the returned plan to pBuilder. +** +** A constraint is marked usable if: +** +** * Argument mUsable indicates that its prerequisites are available, and +** +** * It is not one of the operators specified in the mExclude mask passed +** as the fourth argument (which in practice is either WO_IN or 0). +** +** Argument mPrereq is a mask of tables that must be scanned before the +** virtual table in question. These are added to the plans prerequisites +** before it is added to pBuilder. +** +** Output parameter *pbIn is set to true if the plan added to pBuilder +** uses one or more WO_IN terms, or false otherwise. +*/ +static int whereLoopAddVirtualOne( + WhereLoopBuilder *pBuilder, + Bitmask mPrereq, /* Mask of tables that must be used. */ + Bitmask mUsable, /* Mask of usable tables */ + u16 mExclude, /* Exclude terms using these operators */ + sqlite3_index_info *pIdxInfo, /* Populated object for xBestIndex */ + u16 mNoOmit, /* Do not omit these constraints */ + int *pbIn /* OUT: True if plan uses an IN(...) op */ +){ + WhereClause *pWC = pBuilder->pWC; + struct sqlite3_index_constraint *pIdxCons; + struct sqlite3_index_constraint_usage *pUsage = pIdxInfo->aConstraintUsage; + int i; + int mxTerm; + int rc = SQLITE_OK; + WhereLoop *pNew = pBuilder->pNew; + Parse *pParse = pBuilder->pWInfo->pParse; + struct SrcList_item *pSrc = &pBuilder->pWInfo->pTabList->a[pNew->iTab]; + int nConstraint = pIdxInfo->nConstraint; + + assert( (mUsable & mPrereq)==mPrereq ); + *pbIn = 0; + pNew->prereq = mPrereq; + + /* Set the usable flag on the subset of constraints identified by + ** arguments mUsable and mExclude. */ + pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; + for(i=0; ia[pIdxCons->iTermOffset]; + pIdxCons->usable = 0; + if( (pTerm->prereqRight & mUsable)==pTerm->prereqRight + && (pTerm->eOperator & mExclude)==0 + ){ + pIdxCons->usable = 1; + } + } + + /* Initialize the output fields of the sqlite3_index_info structure */ + memset(pUsage, 0, sizeof(pUsage[0])*nConstraint); + assert( pIdxInfo->needToFreeIdxStr==0 ); + pIdxInfo->idxStr = 0; + pIdxInfo->idxNum = 0; + pIdxInfo->orderByConsumed = 0; + pIdxInfo->estimatedCost = SQLITE_BIG_DBL / (double)2; + pIdxInfo->estimatedRows = 25; + pIdxInfo->idxFlags = 0; + pIdxInfo->colUsed = (sqlite3_int64)pSrc->colUsed; + + /* Invoke the virtual table xBestIndex() method */ + rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo); + if( rc ){ + if( rc==SQLITE_CONSTRAINT ){ + /* If the xBestIndex method returns SQLITE_CONSTRAINT, that means + ** that the particular combination of parameters provided is unusable. + ** Make no entries in the loop table. + */ + WHERETRACE(0xffff, (" ^^^^--- non-viable plan rejected!\n")); + return SQLITE_OK; + } + return rc; + } + + mxTerm = -1; + assert( pNew->nLSlot>=nConstraint ); + for(i=0; iaLTerm[i] = 0; + pNew->u.vtab.omitMask = 0; + pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; + for(i=0; i=0 ){ + WhereTerm *pTerm; + int j = pIdxCons->iTermOffset; + if( iTerm>=nConstraint + || j<0 + || j>=pWC->nTerm + || pNew->aLTerm[iTerm]!=0 + || pIdxCons->usable==0 + ){ + sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName); + testcase( pIdxInfo->needToFreeIdxStr ); + return SQLITE_ERROR; + } + testcase( iTerm==nConstraint-1 ); + testcase( j==0 ); + testcase( j==pWC->nTerm-1 ); + pTerm = &pWC->a[j]; + pNew->prereq |= pTerm->prereqRight; + assert( iTermnLSlot ); + pNew->aLTerm[iTerm] = pTerm; + if( iTerm>mxTerm ) mxTerm = iTerm; + testcase( iTerm==15 ); + testcase( iTerm==16 ); + if( pUsage[i].omit ){ + if( i<16 && ((1<u.vtab.omitMask |= 1<eOperator & WO_IN)!=0 ){ + /* A virtual table that is constrained by an IN clause may not + ** consume the ORDER BY clause because (1) the order of IN terms + ** is not necessarily related to the order of output terms and + ** (2) Multiple outputs from a single IN value will not merge + ** together. */ + pIdxInfo->orderByConsumed = 0; + pIdxInfo->idxFlags &= ~SQLITE_INDEX_SCAN_UNIQUE; + *pbIn = 1; assert( (mExclude & WO_IN)==0 ); + } + } + } + + pNew->nLTerm = mxTerm+1; + for(i=0; i<=mxTerm; i++){ + if( pNew->aLTerm[i]==0 ){ + /* The non-zero argvIdx values must be contiguous. Raise an + ** error if they are not */ + sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName); + testcase( pIdxInfo->needToFreeIdxStr ); + return SQLITE_ERROR; + } + } + assert( pNew->nLTerm<=pNew->nLSlot ); + pNew->u.vtab.idxNum = pIdxInfo->idxNum; + pNew->u.vtab.needFree = pIdxInfo->needToFreeIdxStr; + pIdxInfo->needToFreeIdxStr = 0; + pNew->u.vtab.idxStr = pIdxInfo->idxStr; + pNew->u.vtab.isOrdered = (i8)(pIdxInfo->orderByConsumed ? + pIdxInfo->nOrderBy : 0); + pNew->rSetup = 0; + pNew->rRun = sqlite3LogEstFromDouble(pIdxInfo->estimatedCost); + pNew->nOut = sqlite3LogEst(pIdxInfo->estimatedRows); + + /* Set the WHERE_ONEROW flag if the xBestIndex() method indicated + ** that the scan will visit at most one row. Clear it otherwise. */ + if( pIdxInfo->idxFlags & SQLITE_INDEX_SCAN_UNIQUE ){ + pNew->wsFlags |= WHERE_ONEROW; + }else{ + pNew->wsFlags &= ~WHERE_ONEROW; + } + rc = whereLoopInsert(pBuilder, pNew); + if( pNew->u.vtab.needFree ){ + sqlite3_free(pNew->u.vtab.idxStr); + pNew->u.vtab.needFree = 0; + } + WHERETRACE(0xffff, (" bIn=%d prereqIn=%04llx prereqOut=%04llx\n", + *pbIn, (sqlite3_uint64)mPrereq, + (sqlite3_uint64)(pNew->prereq & ~mPrereq))); + + return rc; +} + +/* +** If this function is invoked from within an xBestIndex() callback, it +** returns a pointer to a buffer containing the name of the collation +** sequence associated with element iCons of the sqlite3_index_info.aConstraint +** array. Or, if iCons is out of range or there is no active xBestIndex +** call, return NULL. +*/ +SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int iCons){ + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + const char *zRet = 0; + if( iCons>=0 && iConsnConstraint ){ + CollSeq *pC = 0; + int iTerm = pIdxInfo->aConstraint[iCons].iTermOffset; + Expr *pX = pHidden->pWC->a[iTerm].pExpr; + if( pX->pLeft ){ + pC = sqlite3ExprCompareCollSeq(pHidden->pParse, pX); + } + zRet = (pC ? pC->zName : sqlite3StrBINARY); + } + return zRet; +} + +/* +** Add all WhereLoop objects for a table of the join identified by +** pBuilder->pNew->iTab. That table is guaranteed to be a virtual table. +** +** If there are no LEFT or CROSS JOIN joins in the query, both mPrereq and +** mUnusable are set to 0. Otherwise, mPrereq is a mask of all FROM clause +** entries that occur before the virtual table in the FROM clause and are +** separated from it by at least one LEFT or CROSS JOIN. Similarly, the +** mUnusable mask contains all FROM clause entries that occur after the +** virtual table and are separated from it by at least one LEFT or +** CROSS JOIN. +** +** For example, if the query were: +** +** ... FROM t1, t2 LEFT JOIN t3, t4, vt CROSS JOIN t5, t6; +** +** then mPrereq corresponds to (t1, t2) and mUnusable to (t5, t6). +** +** All the tables in mPrereq must be scanned before the current virtual +** table. So any terms for which all prerequisites are satisfied by +** mPrereq may be specified as "usable" in all calls to xBestIndex. +** Conversely, all tables in mUnusable must be scanned after the current +** virtual table, so any terms for which the prerequisites overlap with +** mUnusable should always be configured as "not-usable" for xBestIndex. +*/ +static int whereLoopAddVirtual( + WhereLoopBuilder *pBuilder, /* WHERE clause information */ + Bitmask mPrereq, /* Tables that must be scanned before this one */ + Bitmask mUnusable /* Tables that must be scanned after this one */ +){ + int rc = SQLITE_OK; /* Return code */ + WhereInfo *pWInfo; /* WHERE analysis context */ + Parse *pParse; /* The parsing context */ + WhereClause *pWC; /* The WHERE clause */ + struct SrcList_item *pSrc; /* The FROM clause term to search */ + sqlite3_index_info *p; /* Object to pass to xBestIndex() */ + int nConstraint; /* Number of constraints in p */ + int bIn; /* True if plan uses IN(...) operator */ + WhereLoop *pNew; + Bitmask mBest; /* Tables used by best possible plan */ + u16 mNoOmit; + + assert( (mPrereq & mUnusable)==0 ); + pWInfo = pBuilder->pWInfo; + pParse = pWInfo->pParse; + pWC = pBuilder->pWC; + pNew = pBuilder->pNew; + pSrc = &pWInfo->pTabList->a[pNew->iTab]; + assert( IsVirtual(pSrc->pTab) ); + p = allocateIndexInfo(pParse, pWC, mUnusable, pSrc, pBuilder->pOrderBy, + &mNoOmit); + if( p==0 ) return SQLITE_NOMEM_BKPT; + pNew->rSetup = 0; + pNew->wsFlags = WHERE_VIRTUALTABLE; + pNew->nLTerm = 0; + pNew->u.vtab.needFree = 0; + nConstraint = p->nConstraint; + if( whereLoopResize(pParse->db, pNew, nConstraint) ){ + sqlite3DbFree(pParse->db, p); + return SQLITE_NOMEM_BKPT; + } + + /* First call xBestIndex() with all constraints usable. */ + WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName)); + WHERETRACE(0x40, (" VirtualOne: all usable\n")); + rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn); + + /* If the call to xBestIndex() with all terms enabled produced a plan + ** that does not require any source tables (IOW: a plan with mBest==0) + ** and does not use an IN(...) operator, then there is no point in making + ** any further calls to xBestIndex() since they will all return the same + ** result (if the xBestIndex() implementation is sane). */ + if( rc==SQLITE_OK && ((mBest = (pNew->prereq & ~mPrereq))!=0 || bIn) ){ + int seenZero = 0; /* True if a plan with no prereqs seen */ + int seenZeroNoIN = 0; /* Plan with no prereqs and no IN(...) seen */ + Bitmask mPrev = 0; + Bitmask mBestNoIn = 0; + + /* If the plan produced by the earlier call uses an IN(...) term, call + ** xBestIndex again, this time with IN(...) terms disabled. */ + if( bIn ){ + WHERETRACE(0x40, (" VirtualOne: all usable w/o IN\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn); + assert( bIn==0 ); + mBestNoIn = pNew->prereq & ~mPrereq; + if( mBestNoIn==0 ){ + seenZero = 1; + seenZeroNoIN = 1; + } + } + + /* Call xBestIndex once for each distinct value of (prereqRight & ~mPrereq) + ** in the set of terms that apply to the current virtual table. */ + while( rc==SQLITE_OK ){ + int i; + Bitmask mNext = ALLBITS; + assert( mNext>0 ); + for(i=0; ia[p->aConstraint[i].iTermOffset].prereqRight & ~mPrereq + ); + if( mThis>mPrev && mThisprereq==mPrereq ){ + seenZero = 1; + if( bIn==0 ) seenZeroNoIN = 1; + } + } + + /* If the calls to xBestIndex() in the above loop did not find a plan + ** that requires no source tables at all (i.e. one guaranteed to be + ** usable), make a call here with all source tables disabled */ + if( rc==SQLITE_OK && seenZero==0 ){ + WHERETRACE(0x40, (" VirtualOne: all disabled\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, mPrereq, 0, p, mNoOmit, &bIn); + if( bIn==0 ) seenZeroNoIN = 1; + } + + /* If the calls to xBestIndex() have so far failed to find a plan + ** that requires no source tables at all and does not use an IN(...) + ** operator, make a final call to obtain one here. */ + if( rc==SQLITE_OK && seenZeroNoIN==0 ){ + WHERETRACE(0x40, (" VirtualOne: all disabled and w/o IN\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn); + } + } + + if( p->needToFreeIdxStr ) sqlite3_free(p->idxStr); + sqlite3DbFreeNN(pParse->db, p); + WHERETRACE(0x800, ("END %s.addVirtual(), rc=%d\n", pSrc->pTab->zName, rc)); + return rc; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/* +** Add WhereLoop entries to handle OR terms. This works for either +** btrees or virtual tables. +*/ +static int whereLoopAddOr( + WhereLoopBuilder *pBuilder, + Bitmask mPrereq, + Bitmask mUnusable +){ + WhereInfo *pWInfo = pBuilder->pWInfo; + WhereClause *pWC; + WhereLoop *pNew; + WhereTerm *pTerm, *pWCEnd; + int rc = SQLITE_OK; + int iCur; + WhereClause tempWC; + WhereLoopBuilder sSubBuild; + WhereOrSet sSum, sCur; + struct SrcList_item *pItem; + + pWC = pBuilder->pWC; + pWCEnd = pWC->a + pWC->nTerm; + pNew = pBuilder->pNew; + memset(&sSum, 0, sizeof(sSum)); + pItem = pWInfo->pTabList->a + pNew->iTab; + iCur = pItem->iCursor; + + for(pTerm=pWC->a; pTermeOperator & WO_OR)!=0 + && (pTerm->u.pOrInfo->indexable & pNew->maskSelf)!=0 + ){ + WhereClause * const pOrWC = &pTerm->u.pOrInfo->wc; + WhereTerm * const pOrWCEnd = &pOrWC->a[pOrWC->nTerm]; + WhereTerm *pOrTerm; + int once = 1; + int i, j; + + sSubBuild = *pBuilder; + sSubBuild.pOrderBy = 0; + sSubBuild.pOrSet = &sCur; + + WHERETRACE(0x200, ("Begin processing OR-clause %p\n", pTerm)); + for(pOrTerm=pOrWC->a; pOrTermeOperator & WO_AND)!=0 ){ + sSubBuild.pWC = &pOrTerm->u.pAndInfo->wc; + }else if( pOrTerm->leftCursor==iCur ){ + tempWC.pWInfo = pWC->pWInfo; + tempWC.pOuter = pWC; + tempWC.op = TK_AND; + tempWC.nTerm = 1; + tempWC.a = pOrTerm; + sSubBuild.pWC = &tempWC; + }else{ + continue; + } + sCur.n = 0; +#ifdef WHERETRACE_ENABLED + WHERETRACE(0x200, ("OR-term %d of %p has %d subterms:\n", + (int)(pOrTerm-pOrWC->a), pTerm, sSubBuild.pWC->nTerm)); + if( sqlite3WhereTrace & 0x400 ){ + sqlite3WhereClausePrint(sSubBuild.pWC); + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pItem->pTab) ){ + rc = whereLoopAddVirtual(&sSubBuild, mPrereq, mUnusable); + }else +#endif + { + rc = whereLoopAddBtree(&sSubBuild, mPrereq); + } + if( rc==SQLITE_OK ){ + rc = whereLoopAddOr(&sSubBuild, mPrereq, mUnusable); + } + assert( rc==SQLITE_OK || rc==SQLITE_DONE || sCur.n==0 ); + testcase( rc==SQLITE_DONE ); + if( sCur.n==0 ){ + sSum.n = 0; + break; + }else if( once ){ + whereOrMove(&sSum, &sCur); + once = 0; + }else{ + WhereOrSet sPrev; + whereOrMove(&sPrev, &sSum); + sSum.n = 0; + for(i=0; inLTerm = 1; + pNew->aLTerm[0] = pTerm; + pNew->wsFlags = WHERE_MULTI_OR; + pNew->rSetup = 0; + pNew->iSortIdx = 0; + memset(&pNew->u, 0, sizeof(pNew->u)); + for(i=0; rc==SQLITE_OK && irRun = sSum.a[i].rRun + 1; + pNew->nOut = sSum.a[i].nOut; + pNew->prereq = sSum.a[i].prereq; + rc = whereLoopInsert(pBuilder, pNew); + } + WHERETRACE(0x200, ("End processing OR-clause %p\n", pTerm)); + } + } + return rc; +} + +/* +** Add all WhereLoop objects for all tables +*/ +static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ + WhereInfo *pWInfo = pBuilder->pWInfo; + Bitmask mPrereq = 0; + Bitmask mPrior = 0; + int iTab; + SrcList *pTabList = pWInfo->pTabList; + struct SrcList_item *pItem; + struct SrcList_item *pEnd = &pTabList->a[pWInfo->nLevel]; + sqlite3 *db = pWInfo->pParse->db; + int rc = SQLITE_OK; + WhereLoop *pNew; + u8 priorJointype = 0; + + /* Loop over the tables in the join, from left to right */ + pNew = pBuilder->pNew; + whereLoopInit(pNew); + pBuilder->iPlanLimit = SQLITE_QUERY_PLANNER_LIMIT; + for(iTab=0, pItem=pTabList->a; pItemiTab = iTab; + pBuilder->iPlanLimit += SQLITE_QUERY_PLANNER_LIMIT_INCR; + pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); + if( ((pItem->fg.jointype|priorJointype) & (JT_LEFT|JT_CROSS))!=0 ){ + /* This condition is true when pItem is the FROM clause term on the + ** right-hand-side of a LEFT or CROSS JOIN. */ + mPrereq = mPrior; + } + priorJointype = pItem->fg.jointype; +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pItem->pTab) ){ + struct SrcList_item *p; + for(p=&pItem[1]; pfg.jointype & (JT_LEFT|JT_CROSS)) ){ + mUnusable |= sqlite3WhereGetMask(&pWInfo->sMaskSet, p->iCursor); + } + } + rc = whereLoopAddVirtual(pBuilder, mPrereq, mUnusable); + }else +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + { + rc = whereLoopAddBtree(pBuilder, mPrereq); + } + if( rc==SQLITE_OK && pBuilder->pWC->hasOr ){ + rc = whereLoopAddOr(pBuilder, mPrereq, mUnusable); + } + mPrior |= pNew->maskSelf; + if( rc || db->mallocFailed ){ + if( rc==SQLITE_DONE ){ + /* We hit the query planner search limit set by iPlanLimit */ + sqlite3_log(SQLITE_WARNING, "abbreviated query algorithm search"); + rc = SQLITE_OK; + }else{ + break; + } + } + } + + whereLoopClear(db, pNew); + return rc; +} + +/* +** Examine a WherePath (with the addition of the extra WhereLoop of the 6th +** parameters) to see if it outputs rows in the requested ORDER BY +** (or GROUP BY) without requiring a separate sort operation. Return N: +** +** N>0: N terms of the ORDER BY clause are satisfied +** N==0: No terms of the ORDER BY clause are satisfied +** N<0: Unknown yet how many terms of ORDER BY might be satisfied. +** +** Note that processing for WHERE_GROUPBY and WHERE_DISTINCTBY is not as +** strict. With GROUP BY and DISTINCT the only requirement is that +** equivalent rows appear immediately adjacent to one another. GROUP BY +** and DISTINCT do not require rows to appear in any particular order as long +** as equivalent rows are grouped together. Thus for GROUP BY and DISTINCT +** the pOrderBy terms can be matched in any order. With ORDER BY, the +** pOrderBy terms must be matched in strict left-to-right order. +*/ +static i8 wherePathSatisfiesOrderBy( + WhereInfo *pWInfo, /* The WHERE clause */ + ExprList *pOrderBy, /* ORDER BY or GROUP BY or DISTINCT clause to check */ + WherePath *pPath, /* The WherePath to check */ + u16 wctrlFlags, /* WHERE_GROUPBY or _DISTINCTBY or _ORDERBY_LIMIT */ + u16 nLoop, /* Number of entries in pPath->aLoop[] */ + WhereLoop *pLast, /* Add this WhereLoop to the end of pPath->aLoop[] */ + Bitmask *pRevMask /* OUT: Mask of WhereLoops to run in reverse order */ +){ + u8 revSet; /* True if rev is known */ + u8 rev; /* Composite sort order */ + u8 revIdx; /* Index sort order */ + u8 isOrderDistinct; /* All prior WhereLoops are order-distinct */ + u8 distinctColumns; /* True if the loop has UNIQUE NOT NULL columns */ + u8 isMatch; /* iColumn matches a term of the ORDER BY clause */ + u16 eqOpMask; /* Allowed equality operators */ + u16 nKeyCol; /* Number of key columns in pIndex */ + u16 nColumn; /* Total number of ordered columns in the index */ + u16 nOrderBy; /* Number terms in the ORDER BY clause */ + int iLoop; /* Index of WhereLoop in pPath being processed */ + int i, j; /* Loop counters */ + int iCur; /* Cursor number for current WhereLoop */ + int iColumn; /* A column number within table iCur */ + WhereLoop *pLoop = 0; /* Current WhereLoop being processed. */ + WhereTerm *pTerm; /* A single term of the WHERE clause */ + Expr *pOBExpr; /* An expression from the ORDER BY clause */ + CollSeq *pColl; /* COLLATE function from an ORDER BY clause term */ + Index *pIndex; /* The index associated with pLoop */ + sqlite3 *db = pWInfo->pParse->db; /* Database connection */ + Bitmask obSat = 0; /* Mask of ORDER BY terms satisfied so far */ + Bitmask obDone; /* Mask of all ORDER BY terms */ + Bitmask orderDistinctMask; /* Mask of all well-ordered loops */ + Bitmask ready; /* Mask of inner loops */ + + /* + ** We say the WhereLoop is "one-row" if it generates no more than one + ** row of output. A WhereLoop is one-row if all of the following are true: + ** (a) All index columns match with WHERE_COLUMN_EQ. + ** (b) The index is unique + ** Any WhereLoop with an WHERE_COLUMN_EQ constraint on the rowid is one-row. + ** Every one-row WhereLoop will have the WHERE_ONEROW bit set in wsFlags. + ** + ** We say the WhereLoop is "order-distinct" if the set of columns from + ** that WhereLoop that are in the ORDER BY clause are different for every + ** row of the WhereLoop. Every one-row WhereLoop is automatically + ** order-distinct. A WhereLoop that has no columns in the ORDER BY clause + ** is not order-distinct. To be order-distinct is not quite the same as being + ** UNIQUE since a UNIQUE column or index can have multiple rows that + ** are NULL and NULL values are equivalent for the purpose of order-distinct. + ** To be order-distinct, the columns must be UNIQUE and NOT NULL. + ** + ** The rowid for a table is always UNIQUE and NOT NULL so whenever the + ** rowid appears in the ORDER BY clause, the corresponding WhereLoop is + ** automatically order-distinct. + */ + + assert( pOrderBy!=0 ); + if( nLoop && OptimizationDisabled(db, SQLITE_OrderByIdxJoin) ) return 0; + + nOrderBy = pOrderBy->nExpr; + testcase( nOrderBy==BMS-1 ); + if( nOrderBy>BMS-1 ) return 0; /* Cannot optimize overly large ORDER BYs */ + isOrderDistinct = 1; + obDone = MASKBIT(nOrderBy)-1; + orderDistinctMask = 0; + ready = 0; + eqOpMask = WO_EQ | WO_IS | WO_ISNULL; + if( wctrlFlags & WHERE_ORDERBY_LIMIT ) eqOpMask |= WO_IN; + for(iLoop=0; isOrderDistinct && obSat0 ) ready |= pLoop->maskSelf; + if( iLoopaLoop[iLoop]; + if( wctrlFlags & WHERE_ORDERBY_LIMIT ) continue; + }else{ + pLoop = pLast; + } + if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){ + if( pLoop->u.vtab.isOrdered && (wctrlFlags & WHERE_DISTINCTBY)==0 ){ + obSat = obDone; + } + break; + }else if( wctrlFlags & WHERE_DISTINCTBY ){ + pLoop->u.btree.nDistinctCol = 0; + } + iCur = pWInfo->pTabList->a[pLoop->iTab].iCursor; + + /* Mark off any ORDER BY term X that is a column in the table of + ** the current loop for which there is term in the WHERE + ** clause of the form X IS NULL or X=? that reference only outer + ** loops. + */ + for(i=0; ia[i].pExpr); + if( pOBExpr->op!=TK_COLUMN ) continue; + if( pOBExpr->iTable!=iCur ) continue; + pTerm = sqlite3WhereFindTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn, + ~ready, eqOpMask, 0); + if( pTerm==0 ) continue; + if( pTerm->eOperator==WO_IN ){ + /* IN terms are only valid for sorting in the ORDER BY LIMIT + ** optimization, and then only if they are actually used + ** by the query plan */ + assert( wctrlFlags & WHERE_ORDERBY_LIMIT ); + for(j=0; jnLTerm && pTerm!=pLoop->aLTerm[j]; j++){} + if( j>=pLoop->nLTerm ) continue; + } + if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 && pOBExpr->iColumn>=0 ){ + Parse *pParse = pWInfo->pParse; + CollSeq *pColl1 = sqlite3ExprNNCollSeq(pParse, pOrderBy->a[i].pExpr); + CollSeq *pColl2 = sqlite3ExprCompareCollSeq(pParse, pTerm->pExpr); + assert( pColl1 ); + if( pColl2==0 || sqlite3StrICmp(pColl1->zName, pColl2->zName) ){ + continue; + } + testcase( pTerm->pExpr->op==TK_IS ); + } + obSat |= MASKBIT(i); + } + + if( (pLoop->wsFlags & WHERE_ONEROW)==0 ){ + if( pLoop->wsFlags & WHERE_IPK ){ + pIndex = 0; + nKeyCol = 0; + nColumn = 1; + }else if( (pIndex = pLoop->u.btree.pIndex)==0 || pIndex->bUnordered ){ + return 0; + }else{ + nKeyCol = pIndex->nKeyCol; + nColumn = pIndex->nColumn; + assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) ); + assert( pIndex->aiColumn[nColumn-1]==XN_ROWID + || !HasRowid(pIndex->pTable)); + isOrderDistinct = IsUniqueIndex(pIndex) + && (pLoop->wsFlags & WHERE_SKIPSCAN)==0; + } + + /* Loop through all columns of the index and deal with the ones + ** that are not constrained by == or IN. + */ + rev = revSet = 0; + distinctColumns = 0; + for(j=0; j=pLoop->u.btree.nEq + || (pLoop->aLTerm[j]==0)==(jnSkip) + ); + if( ju.btree.nEq && j>=pLoop->nSkip ){ + u16 eOp = pLoop->aLTerm[j]->eOperator; + + /* Skip over == and IS and ISNULL terms. (Also skip IN terms when + ** doing WHERE_ORDERBY_LIMIT processing). Except, IS and ISNULL + ** terms imply that the index is not UNIQUE NOT NULL in which case + ** the loop need to be marked as not order-distinct because it can + ** have repeated NULL rows. + ** + ** If the current term is a column of an ((?,?) IN (SELECT...)) + ** expression for which the SELECT returns more than one column, + ** check that it is the only column used by this loop. Otherwise, + ** if it is one of two or more, none of the columns can be + ** considered to match an ORDER BY term. + */ + if( (eOp & eqOpMask)!=0 ){ + if( eOp & (WO_ISNULL|WO_IS) ){ + testcase( eOp & WO_ISNULL ); + testcase( eOp & WO_IS ); + testcase( isOrderDistinct ); + isOrderDistinct = 0; + } + continue; + }else if( ALWAYS(eOp & WO_IN) ){ + /* ALWAYS() justification: eOp is an equality operator due to the + ** ju.btree.nEq constraint above. Any equality other + ** than WO_IN is captured by the previous "if". So this one + ** always has to be WO_IN. */ + Expr *pX = pLoop->aLTerm[j]->pExpr; + for(i=j+1; iu.btree.nEq; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + assert( (pLoop->aLTerm[i]->eOperator & WO_IN) ); + bOnce = 0; + break; + } + } + } + } + + /* Get the column number in the table (iColumn) and sort order + ** (revIdx) for the j-th column of the index. + */ + if( pIndex ){ + iColumn = pIndex->aiColumn[j]; + revIdx = pIndex->aSortOrder[j] & KEYINFO_ORDER_DESC; + if( iColumn==pIndex->pTable->iPKey ) iColumn = XN_ROWID; + }else{ + iColumn = XN_ROWID; + revIdx = 0; + } + + /* An unconstrained column that might be NULL means that this + ** WhereLoop is not well-ordered + */ + if( isOrderDistinct + && iColumn>=0 + && j>=pLoop->u.btree.nEq + && pIndex->pTable->aCol[iColumn].notNull==0 + ){ + isOrderDistinct = 0; + } + + /* Find the ORDER BY term that corresponds to the j-th column + ** of the index and mark that ORDER BY term off + */ + isMatch = 0; + for(i=0; bOnce && ia[i].pExpr); + testcase( wctrlFlags & WHERE_GROUPBY ); + testcase( wctrlFlags & WHERE_DISTINCTBY ); + if( (wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY))==0 ) bOnce = 0; + if( iColumn>=XN_ROWID ){ + if( pOBExpr->op!=TK_COLUMN ) continue; + if( pOBExpr->iTable!=iCur ) continue; + if( pOBExpr->iColumn!=iColumn ) continue; + }else{ + Expr *pIdxExpr = pIndex->aColExpr->a[j].pExpr; + if( sqlite3ExprCompareSkip(pOBExpr, pIdxExpr, iCur) ){ + continue; + } + } + if( iColumn!=XN_ROWID ){ + pColl = sqlite3ExprNNCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); + if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) continue; + } + if( wctrlFlags & WHERE_DISTINCTBY ){ + pLoop->u.btree.nDistinctCol = j+1; + } + isMatch = 1; + break; + } + if( isMatch && (wctrlFlags & WHERE_GROUPBY)==0 ){ + /* Make sure the sort order is compatible in an ORDER BY clause. + ** Sort order is irrelevant for a GROUP BY clause. */ + if( revSet ){ + if( (rev ^ revIdx)!=(pOrderBy->a[i].sortFlags&KEYINFO_ORDER_DESC) ){ + isMatch = 0; + } + }else{ + rev = revIdx ^ (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC); + if( rev ) *pRevMask |= MASKBIT(iLoop); + revSet = 1; + } + } + if( isMatch && (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL) ){ + if( j==pLoop->u.btree.nEq ){ + pLoop->wsFlags |= WHERE_BIGNULL_SORT; + }else{ + isMatch = 0; + } + } + if( isMatch ){ + if( iColumn==XN_ROWID ){ + testcase( distinctColumns==0 ); + distinctColumns = 1; + } + obSat |= MASKBIT(i); + }else{ + /* No match found */ + if( j==0 || jmaskSelf; + for(i=0; ia[i].pExpr; + mTerm = sqlite3WhereExprUsage(&pWInfo->sMaskSet,p); + if( mTerm==0 && !sqlite3ExprIsConstant(p) ) continue; + if( (mTerm&~orderDistinctMask)==0 ){ + obSat |= MASKBIT(i); + } + } + } + } /* End the loop over all WhereLoops from outer-most down to inner-most */ + if( obSat==obDone ) return (i8)nOrderBy; + if( !isOrderDistinct ){ + for(i=nOrderBy-1; i>0; i--){ + Bitmask m = MASKBIT(i) - 1; + if( (obSat&m)==m ) return i; + } + return 0; + } + return -1; +} + + +/* +** If the WHERE_GROUPBY flag is set in the mask passed to sqlite3WhereBegin(), +** the planner assumes that the specified pOrderBy list is actually a GROUP +** BY clause - and so any order that groups rows as required satisfies the +** request. +** +** Normally, in this case it is not possible for the caller to determine +** whether or not the rows are really being delivered in sorted order, or +** just in some other order that provides the required grouping. However, +** if the WHERE_SORTBYGROUP flag is also passed to sqlite3WhereBegin(), then +** this function may be called on the returned WhereInfo object. It returns +** true if the rows really will be sorted in the specified order, or false +** otherwise. +** +** For example, assuming: +** +** CREATE INDEX i1 ON t1(x, Y); +** +** then +** +** SELECT * FROM t1 GROUP BY x,y ORDER BY x,y; -- IsSorted()==1 +** SELECT * FROM t1 GROUP BY y,x ORDER BY y,x; -- IsSorted()==0 +*/ +SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo *pWInfo){ + assert( pWInfo->wctrlFlags & WHERE_GROUPBY ); + assert( pWInfo->wctrlFlags & WHERE_SORTBYGROUP ); + return pWInfo->sorted; +} + +#ifdef WHERETRACE_ENABLED +/* For debugging use only: */ +static const char *wherePathName(WherePath *pPath, int nLoop, WhereLoop *pLast){ + static char zName[65]; + int i; + for(i=0; iaLoop[i]->cId; } + if( pLast ) zName[i++] = pLast->cId; + zName[i] = 0; + return zName; +} +#endif + +/* +** Return the cost of sorting nRow rows, assuming that the keys have +** nOrderby columns and that the first nSorted columns are already in +** order. +*/ +static LogEst whereSortingCost( + WhereInfo *pWInfo, + LogEst nRow, + int nOrderBy, + int nSorted +){ + /* TUNING: Estimated cost of a full external sort, where N is + ** the number of rows to sort is: + ** + ** cost = (3.0 * N * log(N)). + ** + ** Or, if the order-by clause has X terms but only the last Y + ** terms are out of order, then block-sorting will reduce the + ** sorting cost to: + ** + ** cost = (3.0 * N * log(N)) * (Y/X) + ** + ** The (Y/X) term is implemented using stack variable rScale + ** below. */ + LogEst rScale, rSortCost; + assert( nOrderBy>0 && 66==sqlite3LogEst(100) ); + rScale = sqlite3LogEst((nOrderBy-nSorted)*100/nOrderBy) - 66; + rSortCost = nRow + rScale + 16; + + /* Multiple by log(M) where M is the number of output rows. + ** Use the LIMIT for M if it is smaller */ + if( (pWInfo->wctrlFlags & WHERE_USE_LIMIT)!=0 && pWInfo->iLimitiLimit; + } + rSortCost += estLog(nRow); + return rSortCost; +} + +/* +** Given the list of WhereLoop objects at pWInfo->pLoops, this routine +** attempts to find the lowest cost path that visits each WhereLoop +** once. This path is then loaded into the pWInfo->a[].pWLoop fields. +** +** Assume that the total number of output rows that will need to be sorted +** will be nRowEst (in the 10*log2 representation). Or, ignore sorting +** costs if nRowEst==0. +** +** Return SQLITE_OK on success or SQLITE_NOMEM of a memory allocation +** error occurs. +*/ +static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ + int mxChoice; /* Maximum number of simultaneous paths tracked */ + int nLoop; /* Number of terms in the join */ + Parse *pParse; /* Parsing context */ + sqlite3 *db; /* The database connection */ + int iLoop; /* Loop counter over the terms of the join */ + int ii, jj; /* Loop counters */ + int mxI = 0; /* Index of next entry to replace */ + int nOrderBy; /* Number of ORDER BY clause terms */ + LogEst mxCost = 0; /* Maximum cost of a set of paths */ + LogEst mxUnsorted = 0; /* Maximum unsorted cost of a set of path */ + int nTo, nFrom; /* Number of valid entries in aTo[] and aFrom[] */ + WherePath *aFrom; /* All nFrom paths at the previous level */ + WherePath *aTo; /* The nTo best paths at the current level */ + WherePath *pFrom; /* An element of aFrom[] that we are working on */ + WherePath *pTo; /* An element of aTo[] that we are working on */ + WhereLoop *pWLoop; /* One of the WhereLoop objects */ + WhereLoop **pX; /* Used to divy up the pSpace memory */ + LogEst *aSortCost = 0; /* Sorting and partial sorting costs */ + char *pSpace; /* Temporary memory used by this routine */ + int nSpace; /* Bytes of space allocated at pSpace */ + + pParse = pWInfo->pParse; + db = pParse->db; + nLoop = pWInfo->nLevel; + /* TUNING: For simple queries, only the best path is tracked. + ** For 2-way joins, the 5 best paths are followed. + ** 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)); + + /* 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 + ** by the overall query. Once this estimate has been obtained, the caller + ** will invoke this function a second time, passing the estimate as the + ** nRowEst parameter. */ + if( pWInfo->pOrderBy==0 || nRowEst==0 ){ + nOrderBy = 0; + }else{ + nOrderBy = pWInfo->pOrderBy->nExpr; + } + + /* Allocate and initialize space for aTo, aFrom and aSortCost[] */ + nSpace = (sizeof(WherePath)+sizeof(WhereLoop*)*nLoop)*mxChoice*2; + nSpace += sizeof(LogEst) * nOrderBy; + pSpace = sqlite3DbMallocRawNN(db, nSpace); + if( pSpace==0 ) return SQLITE_NOMEM_BKPT; + aTo = (WherePath*)pSpace; + aFrom = aTo+mxChoice; + memset(aFrom, 0, sizeof(aFrom[0])); + pX = (WhereLoop**)(aFrom+mxChoice); + for(ii=mxChoice*2, pFrom=aTo; ii>0; ii--, pFrom++, pX += nLoop){ + pFrom->aLoop = pX; + } + if( nOrderBy ){ + /* If there is an ORDER BY clause and it is not being ignored, set up + ** space for the aSortCost[] array. Each element of the aSortCost array + ** is either zero - meaning it has not yet been initialized - or the + ** cost of sorting nRowEst rows of data where the first X terms of + ** the ORDER BY clause are already in order, where X is the array + ** index. */ + aSortCost = (LogEst*)pX; + memset(aSortCost, 0, sizeof(LogEst) * nOrderBy); + } + assert( aSortCost==0 || &pSpace[nSpace]==(char*)&aSortCost[nOrderBy] ); + assert( aSortCost!=0 || &pSpace[nSpace]==(char*)pX ); + + /* Seed the search with a single WherePath containing zero WhereLoops. + ** + ** TUNING: Do not let the number of iterations go above 28. If the cost + ** of computing an automatic index is not paid back within the first 28 + ** rows, then do not use the automatic index. */ + aFrom[0].nRow = MIN(pParse->nQueryLoop, 48); assert( 48==sqlite3LogEst(28) ); + nFrom = 1; + assert( aFrom[0].isOrdered==0 ); + if( nOrderBy ){ + /* If nLoop is zero, then there are no FROM terms in the query. Since + ** in this case the query may return a maximum of one row, the results + ** are already in the requested order. Set isOrdered to nOrderBy to + ** indicate this. Or, if nLoop is greater than zero, set isOrdered to + ** -1, indicating that the result set may or may not be ordered, + ** depending on the loops added to the current plan. */ + aFrom[0].isOrdered = nLoop>0 ? -1 : nOrderBy; + } + + /* Compute successively longer WherePaths using the previous generation + ** of WherePaths as the basis for the next. Keep track of the mxChoice + ** best paths at each generation */ + for(iLoop=0; iLooppLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ + LogEst nOut; /* Rows visited by (pFrom+pWLoop) */ + LogEst rCost; /* Cost of path (pFrom+pWLoop) */ + LogEst rUnsorted; /* Unsorted cost of (pFrom+pWLoop) */ + i8 isOrdered = pFrom->isOrdered; /* isOrdered for (pFrom+pWLoop) */ + Bitmask maskNew; /* Mask of src visited by (..) */ + Bitmask revMask = 0; /* Mask of rev-order loops for (..) */ + + if( (pWLoop->prereq & ~pFrom->maskLoop)!=0 ) continue; + if( (pWLoop->maskSelf & pFrom->maskLoop)!=0 ) continue; + if( (pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 && pFrom->nRow<3 ){ + /* Do not use an automatic index if the this loop is expected + ** to run less than 1.25 times. It is tempting to also exclude + ** automatic index usage on an outer loop, but sometimes an automatic + ** index is useful in the outer loop of a correlated subquery. */ + assert( 10==sqlite3LogEst(2) ); + continue; + } + + /* At this point, pWLoop is a candidate to be the next loop. + ** Compute its cost */ + rUnsorted = sqlite3LogEstAdd(pWLoop->rSetup,pWLoop->rRun + pFrom->nRow); + rUnsorted = sqlite3LogEstAdd(rUnsorted, pFrom->rUnsorted); + nOut = pFrom->nRow + pWLoop->nOut; + maskNew = pFrom->maskLoop | pWLoop->maskSelf; + if( isOrdered<0 ){ + isOrdered = wherePathSatisfiesOrderBy(pWInfo, + pWInfo->pOrderBy, pFrom, pWInfo->wctrlFlags, + iLoop, pWLoop, &revMask); + }else{ + revMask = pFrom->revLoop; + } + if( isOrdered>=0 && isOrderedisOrdered^isOrdered)&0x80)==0" is equivalent + ** to (pTo->isOrdered==(-1))==(isOrdered==(-1))" for the range + ** of legal values for isOrdered, -1..64. + */ + for(jj=0, pTo=aTo; jjmaskLoop==maskNew + && ((pTo->isOrdered^isOrdered)&0x80)==0 + ){ + testcase( jj==nTo-1 ); + break; + } + } + if( jj>=nTo ){ + /* None of the existing best-so-far paths match the candidate. */ + if( nTo>=mxChoice + && (rCost>mxCost || (rCost==mxCost && rUnsorted>=mxUnsorted)) + ){ + /* The current candidate is no better than any of the mxChoice + ** paths currently in the best-so-far buffer. So discard + ** this candidate as not viable. */ +#ifdef WHERETRACE_ENABLED /* 0x4 */ + if( sqlite3WhereTrace&0x4 ){ + sqlite3DebugPrintf("Skip %s cost=%-3d,%3d,%3d order=%c\n", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + isOrdered>=0 ? isOrdered+'0' : '?'); + } +#endif + continue; + } + /* If we reach this points it means that the new candidate path + ** needs to be added to the set of best-so-far paths. */ + if( nTo=0 ? isOrdered+'0' : '?'); + } +#endif + }else{ + /* Control reaches here if best-so-far path pTo=aTo[jj] covers the + ** same set of loops and has the same isOrdered setting as the + ** candidate path. Check to see if the candidate should replace + ** pTo or if the candidate should be skipped. + ** + ** The conditional is an expanded vector comparison equivalent to: + ** (pTo->rCost,pTo->nRow,pTo->rUnsorted) <= (rCost,nOut,rUnsorted) + */ + if( pTo->rCostrCost==rCost + && (pTo->nRownRow==nOut && pTo->rUnsorted<=rUnsorted) + ) + ) + ){ +#ifdef WHERETRACE_ENABLED /* 0x4 */ + if( sqlite3WhereTrace&0x4 ){ + sqlite3DebugPrintf( + "Skip %s cost=%-3d,%3d,%3d order=%c", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + isOrdered>=0 ? isOrdered+'0' : '?'); + sqlite3DebugPrintf(" vs %s cost=%-3d,%3d,%3d order=%c\n", + wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, + pTo->rUnsorted, pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); + } +#endif + /* Discard the candidate path from further consideration */ + testcase( pTo->rCost==rCost ); + continue; + } + testcase( pTo->rCost==rCost+1 ); + /* Control reaches here if the candidate path is better than the + ** pTo path. Replace pTo with the candidate. */ +#ifdef WHERETRACE_ENABLED /* 0x4 */ + if( sqlite3WhereTrace&0x4 ){ + sqlite3DebugPrintf( + "Update %s cost=%-3d,%3d,%3d order=%c", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + isOrdered>=0 ? isOrdered+'0' : '?'); + sqlite3DebugPrintf(" was %s cost=%-3d,%3d,%3d order=%c\n", + wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, + pTo->rUnsorted, pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); + } +#endif + } + /* pWLoop is a winner. Add it to the set of best so far */ + pTo->maskLoop = pFrom->maskLoop | pWLoop->maskSelf; + pTo->revLoop = revMask; + pTo->nRow = nOut; + pTo->rCost = rCost; + pTo->rUnsorted = rUnsorted; + pTo->isOrdered = isOrdered; + memcpy(pTo->aLoop, pFrom->aLoop, sizeof(WhereLoop*)*iLoop); + pTo->aLoop[iLoop] = pWLoop; + if( nTo>=mxChoice ){ + mxI = 0; + mxCost = aTo[0].rCost; + mxUnsorted = aTo[0].nRow; + for(jj=1, pTo=&aTo[1]; jjrCost>mxCost + || (pTo->rCost==mxCost && pTo->rUnsorted>mxUnsorted) + ){ + mxCost = pTo->rCost; + mxUnsorted = pTo->rUnsorted; + mxI = jj; + } + } + } + } + } + +#ifdef WHERETRACE_ENABLED /* >=2 */ + if( sqlite3WhereTrace & 0x02 ){ + sqlite3DebugPrintf("---- after round %d ----\n", iLoop); + for(ii=0, pTo=aTo; iirCost, pTo->nRow, + pTo->isOrdered>=0 ? (pTo->isOrdered+'0') : '?'); + if( pTo->isOrdered>0 ){ + sqlite3DebugPrintf(" rev=0x%llx\n", pTo->revLoop); + }else{ + sqlite3DebugPrintf("\n"); + } + } + } +#endif + + /* Swap the roles of aFrom and aTo for the next generation */ + pFrom = aTo; + aTo = aFrom; + aFrom = pFrom; + nFrom = nTo; + } + + if( nFrom==0 ){ + sqlite3ErrorMsg(pParse, "no query solution"); + sqlite3DbFreeNN(db, pSpace); + return SQLITE_ERROR; + } + + /* Find the lowest cost path. pFrom will be left pointing to that path */ + pFrom = aFrom; + for(ii=1; iirCost>aFrom[ii].rCost ) pFrom = &aFrom[ii]; + } + assert( pWInfo->nLevel==nLoop ); + /* Load the lowest cost path into pWInfo */ + for(iLoop=0; iLoopa + iLoop; + pLevel->pWLoop = pWLoop = pFrom->aLoop[iLoop]; + pLevel->iFrom = pWLoop->iTab; + pLevel->iTabCur = pWInfo->pTabList->a[pLevel->iFrom].iCursor; + } + if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT)!=0 + && (pWInfo->wctrlFlags & WHERE_DISTINCTBY)==0 + && pWInfo->eDistinct==WHERE_DISTINCT_NOOP + && nRowEst + ){ + Bitmask notUsed; + int rc = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pResultSet, pFrom, + WHERE_DISTINCTBY, nLoop-1, pFrom->aLoop[nLoop-1], ¬Used); + if( rc==pWInfo->pResultSet->nExpr ){ + pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; + } + } + pWInfo->bOrderedInnerLoop = 0; + if( pWInfo->pOrderBy ){ + if( pWInfo->wctrlFlags & WHERE_DISTINCTBY ){ + if( pFrom->isOrdered==pWInfo->pOrderBy->nExpr ){ + pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; + } + }else{ + pWInfo->nOBSat = pFrom->isOrdered; + pWInfo->revMask = pFrom->revLoop; + if( pWInfo->nOBSat<=0 ){ + pWInfo->nOBSat = 0; + if( nLoop>0 ){ + u32 wsFlags = pFrom->aLoop[nLoop-1]->wsFlags; + if( (wsFlags & WHERE_ONEROW)==0 + && (wsFlags&(WHERE_IPK|WHERE_COLUMN_IN))!=(WHERE_IPK|WHERE_COLUMN_IN) + ){ + Bitmask m = 0; + int rc = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, pFrom, + WHERE_ORDERBY_LIMIT, nLoop-1, pFrom->aLoop[nLoop-1], &m); + testcase( wsFlags & WHERE_IPK ); + testcase( wsFlags & WHERE_COLUMN_IN ); + if( rc==pWInfo->pOrderBy->nExpr ){ + pWInfo->bOrderedInnerLoop = 1; + pWInfo->revMask = m; + } + } + } + } + } + if( (pWInfo->wctrlFlags & WHERE_SORTBYGROUP) + && pWInfo->nOBSat==pWInfo->pOrderBy->nExpr && nLoop>0 + ){ + Bitmask revMask = 0; + int nOrder = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, + pFrom, 0, nLoop-1, pFrom->aLoop[nLoop-1], &revMask + ); + assert( pWInfo->sorted==0 ); + if( nOrder==pWInfo->pOrderBy->nExpr ){ + pWInfo->sorted = 1; + pWInfo->revMask = revMask; + } + } + } + + + pWInfo->nRowOut = pFrom->nRow; + + /* Free temporary memory and return success */ + sqlite3DbFreeNN(db, pSpace); + return SQLITE_OK; +} + +/* +** Most queries use only a single table (they are not joins) and have +** simple == constraints against indexed fields. This routine attempts +** to plan those simple cases using much less ceremony than the +** general-purpose query planner, and thereby yield faster sqlite3_prepare() +** times for the common case. +** +** Return non-zero on success, if this query can be handled by this +** no-frills query planner. Return zero if this query needs the +** general-purpose query planner. +*/ +static int whereShortCut(WhereLoopBuilder *pBuilder){ + WhereInfo *pWInfo; + struct SrcList_item *pItem; + WhereClause *pWC; + WhereTerm *pTerm; + WhereLoop *pLoop; + int iCur; + int j; + Table *pTab; + Index *pIdx; + + pWInfo = pBuilder->pWInfo; + if( pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE ) return 0; + assert( pWInfo->pTabList->nSrc>=1 ); + pItem = pWInfo->pTabList->a; + pTab = pItem->pTab; + if( IsVirtual(pTab) ) return 0; + if( pItem->fg.isIndexedBy ) return 0; + iCur = pItem->iCursor; + pWC = &pWInfo->sWC; + pLoop = pBuilder->pNew; + pLoop->wsFlags = 0; + pLoop->nSkip = 0; + pTerm = sqlite3WhereFindTerm(pWC, iCur, -1, 0, WO_EQ|WO_IS, 0); + if( pTerm ){ + testcase( pTerm->eOperator & WO_IS ); + pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_IPK|WHERE_ONEROW; + pLoop->aLTerm[0] = pTerm; + pLoop->nLTerm = 1; + pLoop->u.btree.nEq = 1; + /* TUNING: Cost of a rowid lookup is 10 */ + pLoop->rRun = 33; /* 33==sqlite3LogEst(10) */ + }else{ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int opMask; + assert( pLoop->aLTermSpace==pLoop->aLTerm ); + if( !IsUniqueIndex(pIdx) + || pIdx->pPartIdxWhere!=0 + || pIdx->nKeyCol>ArraySize(pLoop->aLTermSpace) + ) continue; + opMask = pIdx->uniqNotNull ? (WO_EQ|WO_IS) : WO_EQ; + for(j=0; jnKeyCol; j++){ + pTerm = sqlite3WhereFindTerm(pWC, iCur, j, 0, opMask, pIdx); + if( pTerm==0 ) break; + testcase( pTerm->eOperator & WO_IS ); + pLoop->aLTerm[j] = pTerm; + } + if( j!=pIdx->nKeyCol ) continue; + pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_ONEROW|WHERE_INDEXED; + if( pIdx->isCovering || (pItem->colUsed & pIdx->colNotIdxed)==0 ){ + pLoop->wsFlags |= WHERE_IDX_ONLY; + } + pLoop->nLTerm = j; + pLoop->u.btree.nEq = j; + pLoop->u.btree.pIndex = pIdx; + /* TUNING: Cost of a unique index lookup is 15 */ + pLoop->rRun = 39; /* 39==sqlite3LogEst(15) */ + break; + } + } + if( pLoop->wsFlags ){ + pLoop->nOut = (LogEst)1; + pWInfo->a[0].pWLoop = pLoop; + assert( pWInfo->sMaskSet.n==1 && iCur==pWInfo->sMaskSet.ix[0] ); + pLoop->maskSelf = 1; /* sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); */ + pWInfo->a[0].iTabCur = iCur; + pWInfo->nRowOut = 1; + if( pWInfo->pOrderBy ) pWInfo->nOBSat = pWInfo->pOrderBy->nExpr; + if( pWInfo->wctrlFlags & WHERE_WANT_DISTINCT ){ + pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; + } +#ifdef SQLITE_DEBUG + pLoop->cId = '0'; +#endif + return 1; + } + return 0; +} + +/* +** Helper function for exprIsDeterministic(). +*/ +static int exprNodeIsDeterministic(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_ConstFunc)==0 ){ + pWalker->eCode = 0; + return WRC_Abort; + } + return WRC_Continue; +} + +/* +** Return true if the expression contains no non-deterministic SQL +** functions. Do not consider non-deterministic SQL functions that are +** part of sub-select statements. +*/ +static int exprIsDeterministic(Expr *p){ + Walker w; + memset(&w, 0, sizeof(w)); + w.eCode = 1; + w.xExprCallback = exprNodeIsDeterministic; + w.xSelectCallback = sqlite3SelectWalkFail; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + + +#ifdef WHERETRACE_ENABLED +/* +** Display all WhereLoops in pWInfo +*/ +static void showAllWhereLoops(WhereInfo *pWInfo, WhereClause *pWC){ + if( sqlite3WhereTrace ){ /* Display all of the WhereLoop objects */ + WhereLoop *p; + int i; + static const char zLabel[] = "0123456789abcdefghijklmnopqrstuvwyxz" + "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; + for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ + p->cId = zLabel[i%(sizeof(zLabel)-1)]; + sqlite3WhereLoopPrint(p, pWC); + } + } +} +# define WHERETRACE_ALL_LOOPS(W,C) showAllWhereLoops(W,C) +#else +# define WHERETRACE_ALL_LOOPS(W,C) +#endif + +/* +** Generate the beginning of the loop used for WHERE clause processing. +** The return value is a pointer to an opaque structure that contains +** information needed to terminate the loop. Later, the calling routine +** should invoke sqlite3WhereEnd() with the return value of this function +** in order to complete the WHERE clause processing. +** +** If an error occurs, this routine returns NULL. +** +** The basic idea is to do a nested loop, one loop for each table in +** the FROM clause of a select. (INSERT and UPDATE statements are the +** same as a SELECT with only a single table in the FROM clause.) For +** example, if the SQL is this: +** +** SELECT * FROM t1, t2, t3 WHERE ...; +** +** Then the code generated is conceptually like the following: +** +** foreach row1 in t1 do \ Code generated +** foreach row2 in t2 do |-- by sqlite3WhereBegin() +** foreach row3 in t3 do / +** ... +** end \ Code generated +** end |-- by sqlite3WhereEnd() +** end / +** +** Note that the loops might not be nested in the order in which they +** appear in the FROM clause if a different order is better able to make +** use of indices. Note also that when the IN operator appears in +** the WHERE clause, it might result in additional nested loops for +** scanning through all values on the right-hand side of the IN. +** +** There are Btree cursors associated with each table. t1 uses cursor +** number pTabList->a[0].iCursor. t2 uses the cursor pTabList->a[1].iCursor. +** And so forth. This routine generates code to open those VDBE cursors +** and sqlite3WhereEnd() generates the code to close them. +** +** The code that sqlite3WhereBegin() generates leaves the cursors named +** in pTabList pointing at their appropriate entries. The [...] code +** can use OP_Column and OP_Rowid opcodes on these cursors to extract +** data from the various tables of the loop. +** +** If the WHERE clause is empty, the foreach loops must each scan their +** entire tables. Thus a three-way join is an O(N^3) operation. But if +** the tables have indices and there are terms in the WHERE clause that +** refer to those indices, a complete table scan can be avoided and the +** code will run much faster. Most of the work of this routine is checking +** to see if there are indices that can be used to speed up the loop. +** +** Terms of the WHERE clause are also used to limit which rows actually +** make it to the "..." in the middle of the loop. After each "foreach", +** terms of the WHERE clause that use only terms in that loop and outer +** loops are evaluated and if false a jump is made around all subsequent +** inner loops (or around the "..." if the test occurs within the inner- +** most loop) +** +** OUTER JOINS +** +** An outer join of tables t1 and t2 is conceptally coded as follows: +** +** foreach row1 in t1 do +** flag = 0 +** foreach row2 in t2 do +** start: +** ... +** flag = 1 +** end +** if flag==0 then +** move the row2 cursor to a null row +** goto start +** fi +** end +** +** ORDER BY CLAUSE PROCESSING +** +** pOrderBy is a pointer to the ORDER BY clause (or the GROUP BY clause +** if the WHERE_GROUPBY flag is set in wctrlFlags) of a SELECT statement +** if there is one. If there is no ORDER BY clause or if this routine +** is called from an UPDATE or DELETE statement, then pOrderBy is NULL. +** +** The iIdxCur parameter is the cursor number of an index. If +** WHERE_OR_SUBCLAUSE is set, iIdxCur is the cursor number of an index +** to use for OR clause processing. The WHERE clause should use this +** specific cursor. If WHERE_ONEPASS_DESIRED is set, then iIdxCur is +** the first cursor in an array of cursors for all indices. iIdxCur should +** be used to compute the appropriate cursor depending on which index is +** used. +*/ +SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* FROM clause: A list of all tables to be scanned */ + Expr *pWhere, /* The WHERE clause */ + ExprList *pOrderBy, /* An ORDER BY (or GROUP BY) clause, or NULL */ + ExprList *pResultSet, /* Query result set. Req'd for DISTINCT */ + u16 wctrlFlags, /* The WHERE_* flags defined in sqliteInt.h */ + int iAuxArg /* If WHERE_OR_SUBCLAUSE is set, index cursor number + ** If WHERE_USE_LIMIT, then the limit amount */ +){ + int nByteWInfo; /* Num. bytes allocated for WhereInfo struct */ + int nTabList; /* Number of elements in pTabList */ + WhereInfo *pWInfo; /* Will become the return value of this function */ + Vdbe *v = pParse->pVdbe; /* The virtual database engine */ + Bitmask notReady; /* Cursors that are not yet positioned */ + WhereLoopBuilder sWLB; /* The WhereLoop builder */ + WhereMaskSet *pMaskSet; /* The expression mask set */ + WhereLevel *pLevel; /* A single level in pWInfo->a[] */ + WhereLoop *pLoop; /* Pointer to a single WhereLoop object */ + int ii; /* Loop counter */ + sqlite3 *db; /* Database connection */ + int rc; /* Return code */ + u8 bFordelete = 0; /* OPFLAG_FORDELETE or zero, as appropriate */ + + assert( (wctrlFlags & WHERE_ONEPASS_MULTIROW)==0 || ( + (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + )); + + /* Only one of WHERE_OR_SUBCLAUSE or WHERE_USE_LIMIT */ + assert( (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + || (wctrlFlags & WHERE_USE_LIMIT)==0 ); + + /* Variable initialization */ + db = pParse->db; + memset(&sWLB, 0, sizeof(sWLB)); + + /* An ORDER/GROUP BY clause of more than 63 terms cannot be optimized */ + testcase( pOrderBy && pOrderBy->nExpr==BMS-1 ); + if( pOrderBy && pOrderBy->nExpr>=BMS ) pOrderBy = 0; + sWLB.pOrderBy = pOrderBy; + + /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via + ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */ + if( OptimizationDisabled(db, SQLITE_DistinctOpt) ){ + wctrlFlags &= ~WHERE_WANT_DISTINCT; + } + + /* The number of tables in the FROM clause is limited by the number of + ** bits in a Bitmask + */ + testcase( pTabList->nSrc==BMS ); + if( pTabList->nSrc>BMS ){ + sqlite3ErrorMsg(pParse, "at most %d tables in a join", BMS); + return 0; + } + + /* This function normally generates a nested loop for all tables in + ** pTabList. But if the WHERE_OR_SUBCLAUSE flag is set, then we should + ** only generate code for the first table in pTabList and assume that + ** any cursors associated with subsequent tables are uninitialized. + */ + nTabList = (wctrlFlags & WHERE_OR_SUBCLAUSE) ? 1 : pTabList->nSrc; + + /* Allocate and initialize the WhereInfo structure that will become the + ** return value. A single allocation is used to store the WhereInfo + ** struct, the contents of WhereInfo.a[], the WhereClause structure + ** and the WhereMaskSet structure. Since WhereClause contains an 8-byte + ** field (type Bitmask) it must be aligned on an 8-byte boundary on + ** some architectures. Hence the ROUND8() below. + */ + nByteWInfo = ROUND8(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel)); + pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop)); + if( db->mallocFailed ){ + sqlite3DbFree(db, pWInfo); + pWInfo = 0; + goto whereBeginError; + } + pWInfo->pParse = pParse; + pWInfo->pTabList = pTabList; + pWInfo->pOrderBy = pOrderBy; + pWInfo->pWhere = pWhere; + pWInfo->pResultSet = pResultSet; + pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1; + pWInfo->nLevel = nTabList; + pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(pParse); + pWInfo->wctrlFlags = wctrlFlags; + pWInfo->iLimit = iAuxArg; + pWInfo->savedNQueryLoop = pParse->nQueryLoop; + memset(&pWInfo->nOBSat, 0, + offsetof(WhereInfo,sWC) - offsetof(WhereInfo,nOBSat)); + memset(&pWInfo->a[0], 0, sizeof(WhereLoop)+nTabList*sizeof(WhereLevel)); + assert( pWInfo->eOnePass==ONEPASS_OFF ); /* ONEPASS defaults to OFF */ + pMaskSet = &pWInfo->sMaskSet; + sWLB.pWInfo = pWInfo; + sWLB.pWC = &pWInfo->sWC; + sWLB.pNew = (WhereLoop*)(((char*)pWInfo)+nByteWInfo); + assert( EIGHT_BYTE_ALIGNMENT(sWLB.pNew) ); + whereLoopInit(sWLB.pNew); +#ifdef SQLITE_DEBUG + sWLB.pNew->cId = '*'; +#endif + + /* Split the WHERE clause into separate subexpressions where each + ** subexpression is separated by an AND operator. + */ + initMaskSet(pMaskSet); + sqlite3WhereClauseInit(&pWInfo->sWC, pWInfo); + sqlite3WhereSplit(&pWInfo->sWC, pWhere, TK_AND); + + /* Special case: No FROM clause + */ + if( nTabList==0 ){ + if( pOrderBy ) pWInfo->nOBSat = pOrderBy->nExpr; + if( wctrlFlags & WHERE_WANT_DISTINCT ){ + pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; + } + ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW")); + }else{ + /* Assign a bit from the bitmask to every term in the FROM clause. + ** + ** The N-th term of the FROM clause is assigned a bitmask of 1<nSrc tables in + ** pTabList, not just the first nTabList tables. nTabList is normally + ** equal to pTabList->nSrc but might be shortened to 1 if the + ** WHERE_OR_SUBCLAUSE flag is set. + */ + ii = 0; + do{ + createMask(pMaskSet, pTabList->a[ii].iCursor); + sqlite3WhereTabFuncArgs(pParse, &pTabList->a[ii], &pWInfo->sWC); + }while( (++ii)nSrc ); + #ifdef SQLITE_DEBUG + { + Bitmask mx = 0; + for(ii=0; iinSrc; ii++){ + Bitmask m = sqlite3WhereGetMask(pMaskSet, pTabList->a[ii].iCursor); + assert( m>=mx ); + mx = m; + } + } + #endif + } + + /* Analyze all of the subexpressions. */ + sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); + if( db->mallocFailed ) goto whereBeginError; + + /* Special case: WHERE terms that do not refer to any tables in the join + ** (constant expressions). Evaluate each such term, and jump over all the + ** generated code if the result is not true. + ** + ** Do not do this if the expression contains non-deterministic functions + ** that are not within a sub-select. This is not strictly required, but + ** preserves SQLite's legacy behaviour in the following two cases: + ** + ** FROM ... WHERE random()>0; -- eval random() once per row + ** FROM ... WHERE (SELECT random())>0; -- eval random() once overall + */ + for(ii=0; iinTerm; ii++){ + WhereTerm *pT = &sWLB.pWC->a[ii]; + if( pT->wtFlags & TERM_VIRTUAL ) continue; + if( pT->prereqAll==0 && (nTabList==0 || exprIsDeterministic(pT->pExpr)) ){ + sqlite3ExprIfFalse(pParse, pT->pExpr, pWInfo->iBreak, SQLITE_JUMPIFNULL); + pT->wtFlags |= TERM_CODED; + } + } + + if( wctrlFlags & WHERE_WANT_DISTINCT ){ + if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){ + /* The DISTINCT marking is pointless. Ignore it. */ + pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; + }else if( pOrderBy==0 ){ + /* Try to ORDER BY the result set to make distinct processing easier */ + pWInfo->wctrlFlags |= WHERE_DISTINCTBY; + pWInfo->pOrderBy = pResultSet; + } + } + + /* Construct the WhereLoop objects */ +#if defined(WHERETRACE_ENABLED) + if( sqlite3WhereTrace & 0xffff ){ + sqlite3DebugPrintf("*** Optimizer Start *** (wctrlFlags: 0x%x",wctrlFlags); + if( wctrlFlags & WHERE_USE_LIMIT ){ + sqlite3DebugPrintf(", limit: %d", iAuxArg); + } + sqlite3DebugPrintf(")\n"); + if( sqlite3WhereTrace & 0x100 ){ + Select sSelect; + memset(&sSelect, 0, sizeof(sSelect)); + sSelect.selFlags = SF_WhereBegin; + sSelect.pSrc = pTabList; + sSelect.pWhere = pWhere; + sSelect.pOrderBy = pOrderBy; + sSelect.pEList = pResultSet; + sqlite3TreeViewSelect(0, &sSelect, 0); + } + } + if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ + sqlite3DebugPrintf("---- WHERE clause at start of analysis:\n"); + sqlite3WhereClausePrint(sWLB.pWC); + } +#endif + + if( nTabList!=1 || whereShortCut(&sWLB)==0 ){ + rc = whereLoopAddAll(&sWLB); + if( rc ) goto whereBeginError; + +#ifdef SQLITE_ENABLE_STAT4 + /* If one or more WhereTerm.truthProb values were used in estimating + ** loop parameters, but then those truthProb values were subsequently + ** changed based on STAT4 information while computing subsequent loops, + ** then we need to rerun the whole loop building process so that all + ** loops will be built using the revised truthProb values. */ + if( sWLB.bldFlags2 & SQLITE_BLDF2_2NDPASS ){ + WHERETRACE_ALL_LOOPS(pWInfo, sWLB.pWC); + WHERETRACE(0xffff, + ("**** Redo all loop computations due to" + " TERM_HIGHTRUTH changes ****\n")); + while( pWInfo->pLoops ){ + WhereLoop *p = pWInfo->pLoops; + pWInfo->pLoops = p->pNextLoop; + whereLoopDelete(db, p); + } + rc = whereLoopAddAll(&sWLB); + if( rc ) goto whereBeginError; + } +#endif + WHERETRACE_ALL_LOOPS(pWInfo, sWLB.pWC); + + wherePathSolver(pWInfo, 0); + if( db->mallocFailed ) goto whereBeginError; + if( pWInfo->pOrderBy ){ + wherePathSolver(pWInfo, pWInfo->nRowOut+1); + if( db->mallocFailed ) goto whereBeginError; + } + } + if( pWInfo->pOrderBy==0 && (db->flags & SQLITE_ReverseOrder)!=0 ){ + pWInfo->revMask = ALLBITS; + } + if( pParse->nErr || NEVER(db->mallocFailed) ){ + goto whereBeginError; + } +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace ){ + sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); + if( pWInfo->nOBSat>0 ){ + sqlite3DebugPrintf(" ORDERBY=%d,0x%llx", pWInfo->nOBSat, pWInfo->revMask); + } + switch( pWInfo->eDistinct ){ + case WHERE_DISTINCT_UNIQUE: { + sqlite3DebugPrintf(" DISTINCT=unique"); + break; + } + case WHERE_DISTINCT_ORDERED: { + sqlite3DebugPrintf(" DISTINCT=ordered"); + break; + } + case WHERE_DISTINCT_UNORDERED: { + sqlite3DebugPrintf(" DISTINCT=unordered"); + break; + } + } + sqlite3DebugPrintf("\n"); + for(ii=0; iinLevel; ii++){ + sqlite3WhereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC); + } + } +#endif + + /* Attempt to omit tables from the join that do not affect the result. + ** For a table to not affect the result, the following must be true: + ** + ** 1) The query must not be an aggregate. + ** 2) The table must be the RHS of a LEFT JOIN. + ** 3) Either the query must be DISTINCT, or else the ON or USING clause + ** must contain a constraint that limits the scan of the table to + ** at most a single row. + ** 4) The table must not be referenced by any part of the query apart + ** from its own USING or ON clause. + ** + ** For example, given: + ** + ** CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1); + ** CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2); + ** CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3); + ** + ** then table t2 can be omitted from the following: + ** + ** SELECT v1, v3 FROM t1 + ** LEFT JOIN t2 ON (t1.ipk=t2.ipk) + ** LEFT JOIN t3 ON (t1.ipk=t3.ipk) + ** + ** or from: + ** + ** SELECT DISTINCT v1, v3 FROM t1 + ** LEFT JOIN t2 + ** LEFT JOIN t3 ON (t1.ipk=t3.ipk) + */ + notReady = ~(Bitmask)0; + if( pWInfo->nLevel>=2 + && pResultSet!=0 /* guarantees condition (1) above */ + && OptimizationEnabled(db, SQLITE_OmitNoopJoin) + ){ + int i; + Bitmask tabUsed = sqlite3WhereExprListUsage(pMaskSet, pResultSet); + if( sWLB.pOrderBy ){ + tabUsed |= sqlite3WhereExprListUsage(pMaskSet, sWLB.pOrderBy); + } + for(i=pWInfo->nLevel-1; i>=1; i--){ + WhereTerm *pTerm, *pEnd; + struct SrcList_item *pItem; + pLoop = pWInfo->a[i].pWLoop; + pItem = &pWInfo->pTabList->a[pLoop->iTab]; + if( (pItem->fg.jointype & JT_LEFT)==0 ) continue; + if( (wctrlFlags & WHERE_WANT_DISTINCT)==0 + && (pLoop->wsFlags & WHERE_ONEROW)==0 + ){ + continue; + } + if( (tabUsed & pLoop->maskSelf)!=0 ) continue; + pEnd = sWLB.pWC->a + sWLB.pWC->nTerm; + for(pTerm=sWLB.pWC->a; pTermprereqAll & pLoop->maskSelf)!=0 ){ + if( !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + || pTerm->pExpr->iRightJoinTable!=pItem->iCursor + ){ + break; + } + } + } + if( pTerm drop loop %c not used\n", pLoop->cId)); + notReady &= ~pLoop->maskSelf; + for(pTerm=sWLB.pWC->a; pTermprereqAll & pLoop->maskSelf)!=0 ){ + pTerm->wtFlags |= TERM_CODED; + } + } + if( i!=pWInfo->nLevel-1 ){ + int nByte = (pWInfo->nLevel-1-i) * sizeof(WhereLevel); + memmove(&pWInfo->a[i], &pWInfo->a[i+1], nByte); + } + pWInfo->nLevel--; + nTabList--; + } + } +#if defined(WHERETRACE_ENABLED) + if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ + sqlite3DebugPrintf("---- WHERE clause at end of analysis:\n"); + sqlite3WhereClausePrint(sWLB.pWC); + } + WHERETRACE(0xffff,("*** Optimizer Finished ***\n")); +#endif + pWInfo->pParse->nQueryLoop += pWInfo->nRowOut; + + /* If the caller is an UPDATE or DELETE statement that is requesting + ** to use a one-pass algorithm, determine if this is appropriate. + ** + ** A one-pass approach can be used if the caller has requested one + ** and either (a) the scan visits at most one row or (b) each + ** of the following are true: + ** + ** * the caller has indicated that a one-pass approach can be used + ** with multiple rows (by setting WHERE_ONEPASS_MULTIROW), and + ** * the table is not a virtual table, and + ** * either the scan does not use the OR optimization or the caller + ** is a DELETE operation (WHERE_DUPLICATES_OK is only specified + ** for DELETE). + ** + ** The last qualification is because an UPDATE statement uses + ** WhereInfo.aiCurOnePass[1] to determine whether or not it really can + ** use a one-pass approach, and this is not set accurately for scans + ** that use the OR optimization. + */ + assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 ); + if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ + int wsFlags = pWInfo->a[0].pWLoop->wsFlags; + int bOnerow = (wsFlags & WHERE_ONEROW)!=0; + assert( !(wsFlags & WHERE_VIRTUALTABLE) || IsVirtual(pTabList->a[0].pTab) ); + if( bOnerow || ( + 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) + && !IsVirtual(pTabList->a[0].pTab) + && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) + )){ + pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; + if( HasRowid(pTabList->a[0].pTab) && (wsFlags & WHERE_IDX_ONLY) ){ + if( wctrlFlags & WHERE_ONEPASS_MULTIROW ){ + bFordelete = OPFLAG_FORDELETE; + } + pWInfo->a[0].pWLoop->wsFlags = (wsFlags & ~WHERE_IDX_ONLY); + } + } + } + + /* Open all tables in the pTabList and any indices selected for + ** searching those tables. + */ + for(ii=0, pLevel=pWInfo->a; iia[pLevel->iFrom]; + pTab = pTabItem->pTab; + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + pLoop = pLevel->pWLoop; + if( (pTab->tabFlags & TF_Ephemeral)!=0 || pTab->pSelect ){ + /* Do nothing */ + }else +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ + const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + int iCur = pTabItem->iCursor; + sqlite3VdbeAddOp4(v, OP_VOpen, iCur, 0, 0, pVTab, P4_VTAB); + }else if( IsVirtual(pTab) ){ + /* noop */ + }else +#endif + if( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ + int op = OP_OpenRead; + if( pWInfo->eOnePass!=ONEPASS_OFF ){ + op = OP_OpenWrite; + pWInfo->aiCurOnePass[0] = pTabItem->iCursor; + }; + sqlite3OpenTable(pParse, pTabItem->iCursor, iDb, pTab, op); + assert( pTabItem->iCursor==pLevel->iTabCur ); + testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS-1 ); + testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS ); + if( pWInfo->eOnePass==ONEPASS_OFF + && pTab->nColtabFlags & (TF_HasGenerated|TF_WithoutRowid))==0 + ){ + /* If we know that only a prefix of the record will be used, + ** it is advantageous to reduce the "column count" field in + ** the P4 operand of the OP_OpenRead/Write opcode. */ + Bitmask b = pTabItem->colUsed; + int n = 0; + for(; b; b=b>>1, n++){} + sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(n), P4_INT32); + assert( n<=pTab->nCol ); + } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + if( pLoop->u.btree.pIndex!=0 ){ + sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ|bFordelete); + }else +#endif + { + sqlite3VdbeChangeP5(v, bFordelete); + } +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, pTabItem->iCursor, 0, 0, + (const u8*)&pTabItem->colUsed, P4_INT64); +#endif + }else{ + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + } + if( pLoop->wsFlags & WHERE_INDEXED ){ + Index *pIx = pLoop->u.btree.pIndex; + int iIndexCur; + int op = OP_OpenRead; + /* iAuxArg is always set to a positive value if ONEPASS is possible */ + assert( iAuxArg!=0 || (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 ); + if( !HasRowid(pTab) && IsPrimaryKeyIndex(pIx) + && (wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 + ){ + /* This is one term of an OR-optimization using the PRIMARY KEY of a + ** WITHOUT ROWID table. No need for a separate index */ + iIndexCur = pLevel->iTabCur; + op = 0; + }else if( pWInfo->eOnePass!=ONEPASS_OFF ){ + Index *pJ = pTabItem->pTab->pIndex; + iIndexCur = iAuxArg; + assert( wctrlFlags & WHERE_ONEPASS_DESIRED ); + while( ALWAYS(pJ) && pJ!=pIx ){ + iIndexCur++; + pJ = pJ->pNext; + } + op = OP_OpenWrite; + pWInfo->aiCurOnePass[1] = iIndexCur; + }else if( iAuxArg && (wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 ){ + iIndexCur = iAuxArg; + op = OP_ReopenIdx; + }else{ + iIndexCur = pParse->nTab++; + } + pLevel->iIdxCur = iIndexCur; + assert( pIx->pSchema==pTab->pSchema ); + assert( iIndexCur>=0 ); + if( op ){ + sqlite3VdbeAddOp3(v, op, iIndexCur, pIx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIx); + if( (pLoop->wsFlags & WHERE_CONSTRAINT)!=0 + && (pLoop->wsFlags & (WHERE_COLUMN_RANGE|WHERE_SKIPSCAN))==0 + && (pLoop->wsFlags & WHERE_BIGNULL_SORT)==0 + && (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 + && pWInfo->eDistinct!=WHERE_DISTINCT_ORDERED + ){ + sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); + } + VdbeComment((v, "%s", pIx->zName)); +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + { + u64 colUsed = 0; + int ii, jj; + for(ii=0; iinColumn; ii++){ + jj = pIx->aiColumn[ii]; + if( jj<0 ) continue; + if( jj>63 ) jj = 63; + if( (pTabItem->colUsed & MASKBIT(jj))==0 ) continue; + colUsed |= ((u64)1)<<(ii<63 ? ii : 63); + } + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, iIndexCur, 0, 0, + (u8*)&colUsed, P4_INT64); + } +#endif /* SQLITE_ENABLE_COLUMN_USED_MASK */ + } + } + if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb); + } + pWInfo->iTop = sqlite3VdbeCurrentAddr(v); + if( db->mallocFailed ) goto whereBeginError; + + /* Generate the code to do the search. Each iteration of the for + ** loop below generates code for a single nested loop of the VM + ** program. + */ + for(ii=0; iia[ii]; + wsFlags = pLevel->pWLoop->wsFlags; +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX + if( (pLevel->pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 ){ + constructAutomaticIndex(pParse, &pWInfo->sWC, + &pTabList->a[pLevel->iFrom], notReady, pLevel); + if( db->mallocFailed ) goto whereBeginError; + } +#endif + addrExplain = sqlite3WhereExplainOneScan( + pParse, pTabList, pLevel, wctrlFlags + ); + pLevel->addrBody = sqlite3VdbeCurrentAddr(v); + notReady = sqlite3WhereCodeOneLoopStart(pParse,v,pWInfo,ii,pLevel,notReady); + pWInfo->iContinue = pLevel->addrCont; + if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_OR_SUBCLAUSE)==0 ){ + sqlite3WhereAddScanStatus(v, pTabList, pLevel, addrExplain); + } + } + + /* Done. */ + VdbeModuleComment((v, "Begin WHERE-core")); + return pWInfo; + + /* Jump here if malloc fails */ +whereBeginError: + if( pWInfo ){ + pParse->nQueryLoop = pWInfo->savedNQueryLoop; + whereInfoFree(db, pWInfo); + } + return 0; +} + +/* +** Part of sqlite3WhereEnd() will rewrite opcodes to reference the +** index rather than the main table. In SQLITE_DEBUG mode, we want +** to trace those changes if PRAGMA vdbe_addoptrace=on. This routine +** does that. +*/ +#ifndef SQLITE_DEBUG +# define OpcodeRewriteTrace(D,K,P) /* no-op */ +#else +# define OpcodeRewriteTrace(D,K,P) sqlite3WhereOpcodeRewriteTrace(D,K,P) + static void sqlite3WhereOpcodeRewriteTrace( + sqlite3 *db, + int pc, + VdbeOp *pOp + ){ + if( (db->flags & SQLITE_VdbeAddopTrace)==0 ) return; + sqlite3VdbePrintOp(0, pc, pOp); + } +#endif + +/* +** Generate the end of the WHERE loop. See comments on +** sqlite3WhereBegin() for additional information. +*/ +SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ + Parse *pParse = pWInfo->pParse; + Vdbe *v = pParse->pVdbe; + int i; + WhereLevel *pLevel; + WhereLoop *pLoop; + SrcList *pTabList = pWInfo->pTabList; + sqlite3 *db = pParse->db; + + /* Generate loop termination code. + */ + VdbeModuleComment((v, "End WHERE-core")); + for(i=pWInfo->nLevel-1; i>=0; i--){ + int addr; + pLevel = &pWInfo->a[i]; + pLoop = pLevel->pWLoop; + if( pLevel->op!=OP_Noop ){ +#ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT + int addrSeek = 0; + Index *pIdx; + int n; + if( pWInfo->eDistinct==WHERE_DISTINCT_ORDERED + && i==pWInfo->nLevel-1 /* Ticket [ef9318757b152e3] 2017-10-21 */ + && (pLoop->wsFlags & WHERE_INDEXED)!=0 + && (pIdx = pLoop->u.btree.pIndex)->hasStat1 + && (n = pLoop->u.btree.nDistinctCol)>0 + && pIdx->aiRowLogEst[n]>=36 + ){ + int r1 = pParse->nMem+1; + int j, op; + for(j=0; jiIdxCur, j, r1+j); + } + pParse->nMem += n+1; + op = pLevel->op==OP_Prev ? OP_SeekLT : OP_SeekGT; + addrSeek = sqlite3VdbeAddOp4Int(v, op, pLevel->iIdxCur, 0, r1, n); + VdbeCoverageIf(v, op==OP_SeekLT); + VdbeCoverageIf(v, op==OP_SeekGT); + sqlite3VdbeAddOp2(v, OP_Goto, 1, pLevel->p2); + } +#endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */ + /* The common case: Advance to the next row */ + sqlite3VdbeResolveLabel(v, pLevel->addrCont); + sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3); + sqlite3VdbeChangeP5(v, pLevel->p5); + VdbeCoverage(v); + VdbeCoverageIf(v, pLevel->op==OP_Next); + VdbeCoverageIf(v, pLevel->op==OP_Prev); + VdbeCoverageIf(v, pLevel->op==OP_VNext); + if( pLevel->regBignull ){ + sqlite3VdbeResolveLabel(v, pLevel->addrBignull); + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, pLevel->regBignull, pLevel->p2-1); + VdbeCoverage(v); + } +#ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT + if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); +#endif + }else{ + sqlite3VdbeResolveLabel(v, pLevel->addrCont); + } + if( pLoop->wsFlags & WHERE_IN_ABLE && pLevel->u.in.nIn>0 ){ + struct InLoop *pIn; + int j; + sqlite3VdbeResolveLabel(v, pLevel->addrNxt); + for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){ + sqlite3VdbeJumpHere(v, pIn->addrInTop+1); + if( pIn->eEndLoopOp!=OP_Noop ){ + if( pIn->nPrefix ){ + assert( pLoop->wsFlags & WHERE_IN_EARLYOUT ); + if( pLevel->iLeftJoin ){ + /* For LEFT JOIN queries, cursor pIn->iCur may not have been + ** opened yet. This occurs for WHERE clauses such as + ** "a = ? AND b IN (...)", where the index is on (a, b). If + ** the RHS of the (a=?) is NULL, then the "b IN (...)" may + ** never have been coded, but the body of the loop run to + ** return the null-row. So, if the cursor is not open yet, + ** jump over the OP_Next or OP_Prev instruction about to + ** be coded. */ + sqlite3VdbeAddOp2(v, OP_IfNotOpen, pIn->iCur, + sqlite3VdbeCurrentAddr(v) + 2 + + ((pLoop->wsFlags & WHERE_VIRTUALTABLE)==0) + ); + VdbeCoverage(v); + } + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + sqlite3VdbeAddOp4Int(v, OP_IfNoHope, pLevel->iIdxCur, + sqlite3VdbeCurrentAddr(v)+2, + pIn->iBase, pIn->nPrefix); + VdbeCoverage(v); + } + } + sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop); + VdbeCoverage(v); + VdbeCoverageIf(v, pIn->eEndLoopOp==OP_Prev); + VdbeCoverageIf(v, pIn->eEndLoopOp==OP_Next); + } + sqlite3VdbeJumpHere(v, pIn->addrInTop-1); + } + } + sqlite3VdbeResolveLabel(v, pLevel->addrBrk); + if( pLevel->addrSkip ){ + sqlite3VdbeGoto(v, pLevel->addrSkip); + VdbeComment((v, "next skip-scan on %s", pLoop->u.btree.pIndex->zName)); + sqlite3VdbeJumpHere(v, pLevel->addrSkip); + sqlite3VdbeJumpHere(v, pLevel->addrSkip-2); + } +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( pLevel->addrLikeRep ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, (int)(pLevel->iLikeRepCntr>>1), + pLevel->addrLikeRep); + VdbeCoverage(v); + } +#endif + if( pLevel->iLeftJoin ){ + int ws = pLoop->wsFlags; + addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); VdbeCoverage(v); + assert( (ws & WHERE_IDX_ONLY)==0 || (ws & WHERE_INDEXED)!=0 ); + if( (ws & WHERE_IDX_ONLY)==0 ){ + assert( pLevel->iTabCur==pTabList->a[pLevel->iFrom].iCursor ); + sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iTabCur); + } + if( (ws & WHERE_INDEXED) + || ((ws & WHERE_MULTI_OR) && pLevel->u.pCovidx) + ){ + sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur); + } + if( pLevel->op==OP_Return ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pLevel->p1, pLevel->addrFirst); + }else{ + sqlite3VdbeGoto(v, pLevel->addrFirst); + } + sqlite3VdbeJumpHere(v, addr); + } + VdbeModuleComment((v, "End WHERE-loop%d: %s", i, + pWInfo->pTabList->a[pLevel->iFrom].pTab->zName)); + } + + /* The "break" point is here, just past the end of the outer loop. + ** Set it. + */ + sqlite3VdbeResolveLabel(v, pWInfo->iBreak); + + assert( pWInfo->nLevel<=pTabList->nSrc ); + for(i=0, pLevel=pWInfo->a; inLevel; i++, pLevel++){ + int k, last; + VdbeOp *pOp; + Index *pIdx = 0; + struct SrcList_item *pTabItem = &pTabList->a[pLevel->iFrom]; + Table *pTab = pTabItem->pTab; + assert( pTab!=0 ); + pLoop = pLevel->pWLoop; + + /* For a co-routine, change all OP_Column references to the table of + ** the co-routine into OP_Copy of result contained in a register. + ** OP_Rowid becomes OP_Null. + */ + if( pTabItem->fg.viaCoroutine ){ + testcase( pParse->db->mallocFailed ); + translateColumnToCopy(pParse, pLevel->addrBody, pLevel->iTabCur, + pTabItem->regResult, 0); + continue; + } + +#ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE + /* Close all of the cursors that were opened by sqlite3WhereBegin. + ** Except, do not close cursors that will be reused by the OR optimization + ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors + ** created for the ONEPASS optimization. + */ + if( (pTab->tabFlags & TF_Ephemeral)==0 + && pTab->pSelect==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + ){ + int ws = pLoop->wsFlags; + if( pWInfo->eOnePass==ONEPASS_OFF && (ws & WHERE_IDX_ONLY)==0 ){ + sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); + } + if( (ws & WHERE_INDEXED)!=0 + && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 + && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] + ){ + sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); + } + } +#endif + + /* If this scan uses an index, make VDBE code substitutions to read data + ** from the index instead of from the table where possible. In some cases + ** this optimization prevents the table from ever being read, which can + ** yield a significant performance boost. + ** + ** Calls to the code generator in between sqlite3WhereBegin and + ** sqlite3WhereEnd will have created code that references the table + ** directly. This loop scans all that code looking for opcodes + ** that reference the table and converts them into opcodes that + ** reference the index. + */ + if( pLoop->wsFlags & (WHERE_INDEXED|WHERE_IDX_ONLY) ){ + pIdx = pLoop->u.btree.pIndex; + }else if( pLoop->wsFlags & WHERE_MULTI_OR ){ + pIdx = pLevel->u.pCovidx; + } + if( pIdx + && (pWInfo->eOnePass==ONEPASS_OFF || !HasRowid(pIdx->pTable)) + && !db->mallocFailed + ){ + last = sqlite3VdbeCurrentAddr(v); + k = pLevel->addrBody; +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeAddopTrace ){ + printf("TRANSLATE opcodes in range %d..%d\n", k, last-1); + } +#endif + pOp = sqlite3VdbeGetOp(v, k); + for(; kp1!=pLevel->iTabCur ) continue; + if( pOp->opcode==OP_Column +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + || pOp->opcode==OP_Offset +#endif + ){ + int x = pOp->p2; + assert( pIdx->pTable==pTab ); + if( !HasRowid(pTab) ){ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + x = pPk->aiColumn[x]; + assert( x>=0 ); + }else{ + testcase( x!=sqlite3StorageColumnToTable(pTab,x) ); + x = sqlite3StorageColumnToTable(pTab,x); + } + x = sqlite3TableColumnToIndex(pIdx, x); + if( x>=0 ){ + pOp->p2 = x; + pOp->p1 = pLevel->iIdxCur; + OpcodeRewriteTrace(db, k, pOp); + } + assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0 + || pWInfo->eOnePass ); + }else if( pOp->opcode==OP_Rowid ){ + pOp->p1 = pLevel->iIdxCur; + pOp->opcode = OP_IdxRowid; + OpcodeRewriteTrace(db, k, pOp); + }else if( pOp->opcode==OP_IfNullRow ){ + pOp->p1 = pLevel->iIdxCur; + OpcodeRewriteTrace(db, k, pOp); + } + } +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeAddopTrace ) printf("TRANSLATE complete\n"); +#endif + } + } + + /* Undo all Expr node modifications */ + while( pWInfo->pExprMods ){ + WhereExprMod *p = pWInfo->pExprMods; + pWInfo->pExprMods = p->pNext; + memcpy(p->pExpr, &p->orig, sizeof(p->orig)); + sqlite3DbFree(db, p); + } + + /* Final cleanup + */ + pParse->nQueryLoop = pWInfo->savedNQueryLoop; + whereInfoFree(db, pWInfo); + return; +} + +/************** End of where.c ***********************************************/ +/************** Begin file window.c ******************************************/ +/* +** 2018 May 08 +** +** 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. +** +************************************************************************* +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_WINDOWFUNC + +/* +** SELECT REWRITING +** +** Any SELECT statement that contains one or more window functions in +** either the select list or ORDER BY clause (the only two places window +** functions may be used) is transformed by function sqlite3WindowRewrite() +** in order to support window function processing. For example, with the +** schema: +** +** CREATE TABLE t1(a, b, c, d, e, f, g); +** +** the statement: +** +** SELECT a+1, max(b) OVER (PARTITION BY c ORDER BY d) FROM t1 ORDER BY e; +** +** is transformed to: +** +** SELECT a+1, max(b) OVER (PARTITION BY c ORDER BY d) FROM ( +** SELECT a, e, c, d, b FROM t1 ORDER BY c, d +** ) ORDER BY e; +** +** The flattening optimization is disabled when processing this transformed +** SELECT statement. This allows the implementation of the window function +** (in this case max()) to process rows sorted in order of (c, d), which +** makes things easier for obvious reasons. More generally: +** +** * FROM, WHERE, GROUP BY and HAVING clauses are all moved to +** the sub-query. +** +** * ORDER BY, LIMIT and OFFSET remain part of the parent query. +** +** * Terminals from each of the expression trees that make up the +** select-list and ORDER BY expressions in the parent query are +** selected by the sub-query. For the purposes of the transformation, +** terminals are column references and aggregate functions. +** +** If there is more than one window function in the SELECT that uses +** the same window declaration (the OVER bit), then a single scan may +** be used to process more than one window function. For example: +** +** SELECT max(b) OVER (PARTITION BY c ORDER BY d), +** min(e) OVER (PARTITION BY c ORDER BY d) +** FROM t1; +** +** is transformed in the same way as the example above. However: +** +** SELECT max(b) OVER (PARTITION BY c ORDER BY d), +** min(e) OVER (PARTITION BY a ORDER BY b) +** FROM t1; +** +** Must be transformed to: +** +** SELECT max(b) OVER (PARTITION BY c ORDER BY d) FROM ( +** SELECT e, min(e) OVER (PARTITION BY a ORDER BY b), c, d, b FROM +** SELECT a, e, c, d, b FROM t1 ORDER BY a, b +** ) ORDER BY c, d +** ) ORDER BY e; +** +** so that both min() and max() may process rows in the order defined by +** their respective window declarations. +** +** INTERFACE WITH SELECT.C +** +** When processing the rewritten SELECT statement, code in select.c calls +** sqlite3WhereBegin() to begin iterating through the results of the +** sub-query, which is always implemented as a co-routine. It then calls +** sqlite3WindowCodeStep() to process rows and finish the scan by calling +** sqlite3WhereEnd(). +** +** sqlite3WindowCodeStep() generates VM code so that, for each row returned +** by the sub-query a sub-routine (OP_Gosub) coded by select.c is invoked. +** When the sub-routine is invoked: +** +** * The results of all window-functions for the row are stored +** in the associated Window.regResult registers. +** +** * The required terminal values are stored in the current row of +** temp table Window.iEphCsr. +** +** In some cases, depending on the window frame and the specific window +** functions invoked, sqlite3WindowCodeStep() caches each entire partition +** in a temp table before returning any rows. In other cases it does not. +** This detail is encapsulated within this file, the code generated by +** select.c is the same in either case. +** +** BUILT-IN WINDOW FUNCTIONS +** +** This implementation features the following built-in window functions: +** +** row_number() +** rank() +** dense_rank() +** percent_rank() +** cume_dist() +** ntile(N) +** lead(expr [, offset [, default]]) +** lag(expr [, offset [, default]]) +** first_value(expr) +** last_value(expr) +** nth_value(expr, N) +** +** These are the same built-in window functions supported by Postgres. +** Although the behaviour of aggregate window functions (functions that +** can be used as either aggregates or window funtions) allows them to +** be implemented using an API, built-in window functions are much more +** esoteric. Additionally, some window functions (e.g. nth_value()) +** may only be implemented by caching the entire partition in memory. +** As such, some built-in window functions use the same API as aggregate +** window functions and some are implemented directly using VDBE +** instructions. Additionally, for those functions that use the API, the +** window frame is sometimes modified before the SELECT statement is +** rewritten. For example, regardless of the specified window frame, the +** row_number() function always uses: +** +** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +** +** See sqlite3WindowUpdate() for details. +** +** As well as some of the built-in window functions, aggregate window +** functions min() and max() are implemented using VDBE instructions if +** the start of the window frame is declared as anything other than +** UNBOUNDED PRECEDING. +*/ + +/* +** Implementation of built-in window function row_number(). Assumes that the +** window frame has been coerced to: +** +** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +*/ +static void row_numberStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + i64 *p = (i64*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ) (*p)++; + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); +} +static void row_numberValueFunc(sqlite3_context *pCtx){ + i64 *p = (i64*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + sqlite3_result_int64(pCtx, (p ? *p : 0)); +} + +/* +** Context object type used by rank(), dense_rank(), percent_rank() and +** cume_dist(). +*/ +struct CallCount { + i64 nValue; + i64 nStep; + i64 nTotal; +}; + +/* +** Implementation of built-in window function dense_rank(). Assumes that +** the window frame has been set to: +** +** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +*/ +static void dense_rankStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ) p->nStep = 1; + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); +} +static void dense_rankValueFunc(sqlite3_context *pCtx){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + if( p->nStep ){ + p->nValue++; + p->nStep = 0; + } + sqlite3_result_int64(pCtx, p->nValue); + } +} + +/* +** Implementation of built-in window function nth_value(). This +** implementation is used in "slow mode" only - when the EXCLUDE clause +** is not set to the default value "NO OTHERS". +*/ +struct NthValueCtx { + i64 nStep; + sqlite3_value *pValue; +}; +static void nth_valueStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + i64 iVal; + switch( sqlite3_value_numeric_type(apArg[1]) ){ + case SQLITE_INTEGER: + iVal = sqlite3_value_int64(apArg[1]); + break; + case SQLITE_FLOAT: { + double fVal = sqlite3_value_double(apArg[1]); + if( ((i64)fVal)!=fVal ) goto error_out; + iVal = (i64)fVal; + break; + } + default: + goto error_out; + } + if( iVal<=0 ) goto error_out; + + p->nStep++; + if( iVal==p->nStep ){ + p->pValue = sqlite3_value_dup(apArg[0]); + if( !p->pValue ){ + sqlite3_result_error_nomem(pCtx); + } + } + } + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); + return; + + error_out: + sqlite3_result_error( + pCtx, "second argument to nth_value must be a positive integer", -1 + ); +} +static void nth_valueFinalizeFunc(sqlite3_context *pCtx){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, 0); + if( p && p->pValue ){ + sqlite3_result_value(pCtx, p->pValue); + sqlite3_value_free(p->pValue); + p->pValue = 0; + } +} +#define nth_valueInvFunc noopStepFunc +#define nth_valueValueFunc noopValueFunc + +static void first_valueStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->pValue==0 ){ + p->pValue = sqlite3_value_dup(apArg[0]); + if( !p->pValue ){ + sqlite3_result_error_nomem(pCtx); + } + } + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); +} +static void first_valueFinalizeFunc(sqlite3_context *pCtx){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->pValue ){ + sqlite3_result_value(pCtx, p->pValue); + sqlite3_value_free(p->pValue); + p->pValue = 0; + } +} +#define first_valueInvFunc noopStepFunc +#define first_valueValueFunc noopValueFunc + +/* +** Implementation of built-in window function rank(). Assumes that +** the window frame has been set to: +** +** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +*/ +static void rankStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + p->nStep++; + if( p->nValue==0 ){ + p->nValue = p->nStep; + } + } + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); +} +static void rankValueFunc(sqlite3_context *pCtx){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + sqlite3_result_int64(pCtx, p->nValue); + p->nValue = 0; + } +} + +/* +** Implementation of built-in window function percent_rank(). Assumes that +** the window frame has been set to: +** +** GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING +*/ +static void percent_rankStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + p->nTotal++; + } +} +static void percent_rankInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->nStep++; +} +static void percent_rankValueFunc(sqlite3_context *pCtx){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + p->nValue = p->nStep; + if( p->nTotal>1 ){ + double r = (double)p->nValue / (double)(p->nTotal-1); + sqlite3_result_double(pCtx, r); + }else{ + sqlite3_result_double(pCtx, 0.0); + } + } +} +#define percent_rankFinalizeFunc percent_rankValueFunc + +/* +** Implementation of built-in window function cume_dist(). Assumes that +** the window frame has been set to: +** +** GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING +*/ +static void cume_distStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + p->nTotal++; + } +} +static void cume_distInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->nStep++; +} +static void cume_distValueFunc(sqlite3_context *pCtx){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, 0); + if( p ){ + double r = (double)(p->nStep) / (double)(p->nTotal); + sqlite3_result_double(pCtx, r); + } +} +#define cume_distFinalizeFunc cume_distValueFunc + +/* +** Context object for ntile() window function. +*/ +struct NtileCtx { + i64 nTotal; /* Total rows in partition */ + i64 nParam; /* Parameter passed to ntile(N) */ + i64 iRow; /* Current row */ +}; + +/* +** Implementation of ntile(). This assumes that the window frame has +** been coerced to: +** +** ROWS CURRENT ROW AND UNBOUNDED FOLLOWING +*/ +static void ntileStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NtileCtx *p; + assert( nArg==1 ); UNUSED_PARAMETER(nArg); + p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + if( p->nTotal==0 ){ + p->nParam = sqlite3_value_int64(apArg[0]); + if( p->nParam<=0 ){ + sqlite3_result_error( + pCtx, "argument of ntile must be a positive integer", -1 + ); + } + } + p->nTotal++; + } +} +static void ntileInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NtileCtx *p; + assert( nArg==1 ); UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); + p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->iRow++; +} +static void ntileValueFunc(sqlite3_context *pCtx){ + struct NtileCtx *p; + p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->nParam>0 ){ + int nSize = (p->nTotal / p->nParam); + if( nSize==0 ){ + sqlite3_result_int64(pCtx, p->iRow+1); + }else{ + i64 nLarge = p->nTotal - p->nParam*nSize; + i64 iSmall = nLarge*(nSize+1); + i64 iRow = p->iRow; + + assert( (nLarge*(nSize+1) + (p->nParam-nLarge)*nSize)==p->nTotal ); + + if( iRowpVal); + p->pVal = sqlite3_value_dup(apArg[0]); + if( p->pVal==0 ){ + sqlite3_result_error_nomem(pCtx); + }else{ + p->nVal++; + } + } +} +static void last_valueInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct LastValueCtx *p; + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); + p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( ALWAYS(p) ){ + p->nVal--; + if( p->nVal==0 ){ + sqlite3_value_free(p->pVal); + p->pVal = 0; + } + } +} +static void last_valueValueFunc(sqlite3_context *pCtx){ + struct LastValueCtx *p; + p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, 0); + if( p && p->pVal ){ + sqlite3_result_value(pCtx, p->pVal); + } +} +static void last_valueFinalizeFunc(sqlite3_context *pCtx){ + struct LastValueCtx *p; + p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->pVal ){ + sqlite3_result_value(pCtx, p->pVal); + sqlite3_value_free(p->pVal); + p->pVal = 0; + } +} + +/* +** Static names for the built-in window function names. These static +** names are used, rather than string literals, so that FuncDef objects +** can be associated with a particular window function by direct +** comparison of the zName pointer. Example: +** +** if( pFuncDef->zName==row_valueName ){ ... } +*/ +static const char row_numberName[] = "row_number"; +static const char dense_rankName[] = "dense_rank"; +static const char rankName[] = "rank"; +static const char percent_rankName[] = "percent_rank"; +static const char cume_distName[] = "cume_dist"; +static const char ntileName[] = "ntile"; +static const char last_valueName[] = "last_value"; +static const char nth_valueName[] = "nth_value"; +static const char first_valueName[] = "first_value"; +static const char leadName[] = "lead"; +static const char lagName[] = "lag"; + +/* +** No-op implementations of xStep() and xFinalize(). Used as place-holders +** for built-in window functions that never call those interfaces. +** +** The noopValueFunc() is called but is expected to do nothing. The +** noopStepFunc() is never called, and so it is marked with NO_TEST to +** let the test coverage routine know not to expect this function to be +** invoked. +*/ +static void noopStepFunc( /*NO_TEST*/ + sqlite3_context *p, /*NO_TEST*/ + int n, /*NO_TEST*/ + sqlite3_value **a /*NO_TEST*/ +){ /*NO_TEST*/ + UNUSED_PARAMETER(p); /*NO_TEST*/ + UNUSED_PARAMETER(n); /*NO_TEST*/ + UNUSED_PARAMETER(a); /*NO_TEST*/ + assert(0); /*NO_TEST*/ +} /*NO_TEST*/ +static void noopValueFunc(sqlite3_context *p){ UNUSED_PARAMETER(p); /*no-op*/ } + +/* Window functions that use all window interfaces: xStep, xFinal, +** xValue, and xInverse */ +#define WINDOWFUNCALL(name,nArg,extra) { \ + nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ + name ## StepFunc, name ## FinalizeFunc, name ## ValueFunc, \ + name ## InvFunc, name ## Name, {0} \ +} + +/* Window functions that are implemented using bytecode and thus have +** no-op routines for their methods */ +#define WINDOWFUNCNOOP(name,nArg,extra) { \ + nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ + noopStepFunc, noopValueFunc, noopValueFunc, \ + noopStepFunc, name ## Name, {0} \ +} + +/* Window functions that use all window interfaces: xStep, the +** same routine for xFinalize and xValue and which never call +** xInverse. */ +#define WINDOWFUNCX(name,nArg,extra) { \ + nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ + name ## StepFunc, name ## ValueFunc, name ## ValueFunc, \ + noopStepFunc, name ## Name, {0} \ +} + + +/* +** Register those built-in window functions that are not also aggregates. +*/ +SQLITE_PRIVATE void sqlite3WindowFunctions(void){ + static FuncDef aWindowFuncs[] = { + WINDOWFUNCX(row_number, 0, 0), + WINDOWFUNCX(dense_rank, 0, 0), + WINDOWFUNCX(rank, 0, 0), + WINDOWFUNCALL(percent_rank, 0, 0), + WINDOWFUNCALL(cume_dist, 0, 0), + WINDOWFUNCALL(ntile, 1, 0), + WINDOWFUNCALL(last_value, 1, 0), + WINDOWFUNCALL(nth_value, 2, 0), + WINDOWFUNCALL(first_value, 1, 0), + WINDOWFUNCNOOP(lead, 1, 0), + WINDOWFUNCNOOP(lead, 2, 0), + WINDOWFUNCNOOP(lead, 3, 0), + WINDOWFUNCNOOP(lag, 1, 0), + WINDOWFUNCNOOP(lag, 2, 0), + WINDOWFUNCNOOP(lag, 3, 0), + }; + sqlite3InsertBuiltinFuncs(aWindowFuncs, ArraySize(aWindowFuncs)); +} + +static Window *windowFind(Parse *pParse, Window *pList, const char *zName){ + Window *p; + for(p=pList; p; p=p->pNextWin){ + if( sqlite3StrICmp(p->zName, zName)==0 ) break; + } + if( p==0 ){ + sqlite3ErrorMsg(pParse, "no such window: %s", zName); + } + return p; +} + +/* +** This function is called immediately after resolving the function name +** for a window function within a SELECT statement. Argument pList is a +** linked list of WINDOW definitions for the current SELECT statement. +** Argument pFunc is the function definition just resolved and pWin +** is the Window object representing the associated OVER clause. This +** function updates the contents of pWin as follows: +** +** * If the OVER clause refered to a named window (as in "max(x) OVER win"), +** search list pList for a matching WINDOW definition, and update pWin +** accordingly. If no such WINDOW clause can be found, leave an error +** in pParse. +** +** * If the function is a built-in window function that requires the +** window to be coerced (see "BUILT-IN WINDOW FUNCTIONS" at the top +** of this file), pWin is updated here. +*/ +SQLITE_PRIVATE void sqlite3WindowUpdate( + Parse *pParse, + Window *pList, /* List of named windows for this SELECT */ + Window *pWin, /* Window frame to update */ + FuncDef *pFunc /* Window function definition */ +){ + if( pWin->zName && pWin->eFrmType==0 ){ + Window *p = windowFind(pParse, pList, pWin->zName); + if( p==0 ) return; + pWin->pPartition = sqlite3ExprListDup(pParse->db, p->pPartition, 0); + pWin->pOrderBy = sqlite3ExprListDup(pParse->db, p->pOrderBy, 0); + pWin->pStart = sqlite3ExprDup(pParse->db, p->pStart, 0); + pWin->pEnd = sqlite3ExprDup(pParse->db, p->pEnd, 0); + pWin->eStart = p->eStart; + pWin->eEnd = p->eEnd; + pWin->eFrmType = p->eFrmType; + pWin->eExclude = p->eExclude; + }else{ + sqlite3WindowChain(pParse, pWin, pList); + } + if( (pWin->eFrmType==TK_RANGE) + && (pWin->pStart || pWin->pEnd) + && (pWin->pOrderBy==0 || pWin->pOrderBy->nExpr!=1) + ){ + sqlite3ErrorMsg(pParse, + "RANGE with offset PRECEDING/FOLLOWING requires one ORDER BY expression" + ); + }else + if( pFunc->funcFlags & SQLITE_FUNC_WINDOW ){ + sqlite3 *db = pParse->db; + if( pWin->pFilter ){ + sqlite3ErrorMsg(pParse, + "FILTER clause may only be used with aggregate window functions" + ); + }else{ + struct WindowUpdate { + const char *zFunc; + int eFrmType; + int eStart; + int eEnd; + } aUp[] = { + { row_numberName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, + { dense_rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, + { rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, + { percent_rankName, TK_GROUPS, TK_CURRENT, TK_UNBOUNDED }, + { cume_distName, TK_GROUPS, TK_FOLLOWING, TK_UNBOUNDED }, + { ntileName, TK_ROWS, TK_CURRENT, TK_UNBOUNDED }, + { leadName, TK_ROWS, TK_UNBOUNDED, TK_UNBOUNDED }, + { lagName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, + }; + int i; + for(i=0; izName==aUp[i].zFunc ){ + sqlite3ExprDelete(db, pWin->pStart); + sqlite3ExprDelete(db, pWin->pEnd); + pWin->pEnd = pWin->pStart = 0; + pWin->eFrmType = aUp[i].eFrmType; + pWin->eStart = aUp[i].eStart; + pWin->eEnd = aUp[i].eEnd; + pWin->eExclude = 0; + if( pWin->eStart==TK_FOLLOWING ){ + pWin->pStart = sqlite3Expr(db, TK_INTEGER, "1"); + } + break; + } + } + } + } + pWin->pFunc = pFunc; +} + +/* +** Context object passed through sqlite3WalkExprList() to +** selectWindowRewriteExprCb() by selectWindowRewriteEList(). +*/ +typedef struct WindowRewrite WindowRewrite; +struct WindowRewrite { + Window *pWin; + SrcList *pSrc; + ExprList *pSub; + Table *pTab; + Select *pSubSelect; /* Current sub-select, if any */ +}; + +/* +** Callback function used by selectWindowRewriteEList(). If necessary, +** this function appends to the output expression-list and updates +** expression (*ppExpr) in place. +*/ +static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ + struct WindowRewrite *p = pWalker->u.pRewrite; + Parse *pParse = pWalker->pParse; + assert( p!=0 ); + assert( p->pWin!=0 ); + + /* If this function is being called from within a scalar sub-select + ** that used by the SELECT statement being processed, only process + ** TK_COLUMN expressions that refer to it (the outer SELECT). Do + ** not process aggregates or window functions at all, as they belong + ** to the scalar sub-select. */ + if( p->pSubSelect ){ + if( pExpr->op!=TK_COLUMN ){ + return WRC_Continue; + }else{ + int nSrc = p->pSrc->nSrc; + int i; + for(i=0; iiTable==p->pSrc->a[i].iCursor ) break; + } + if( i==nSrc ) return WRC_Continue; + } + } + + switch( pExpr->op ){ + + case TK_FUNCTION: + if( !ExprHasProperty(pExpr, EP_WinFunc) ){ + break; + }else{ + Window *pWin; + for(pWin=p->pWin; pWin; pWin=pWin->pNextWin){ + if( pExpr->y.pWin==pWin ){ + assert( pWin->pOwner==pExpr ); + return WRC_Prune; + } + } + } + /* Fall through. */ + + case TK_AGG_FUNCTION: + case TK_COLUMN: { + int iCol = -1; + if( p->pSub ){ + int i; + for(i=0; ipSub->nExpr; i++){ + if( 0==sqlite3ExprCompare(0, p->pSub->a[i].pExpr, pExpr, -1) ){ + iCol = i; + break; + } + } + } + if( iCol<0 ){ + Expr *pDup = sqlite3ExprDup(pParse->db, pExpr, 0); + if( pDup && pDup->op==TK_AGG_FUNCTION ) pDup->op = TK_FUNCTION; + p->pSub = sqlite3ExprListAppend(pParse, p->pSub, pDup); + } + if( p->pSub ){ + assert( ExprHasProperty(pExpr, EP_Static)==0 ); + ExprSetProperty(pExpr, EP_Static); + sqlite3ExprDelete(pParse->db, pExpr); + ExprClearProperty(pExpr, EP_Static); + memset(pExpr, 0, sizeof(Expr)); + + pExpr->op = TK_COLUMN; + pExpr->iColumn = (iCol<0 ? p->pSub->nExpr-1: iCol); + pExpr->iTable = p->pWin->iEphCsr; + pExpr->y.pTab = p->pTab; + } + if( pParse->db->mallocFailed ) return WRC_Abort; + break; + } + + default: /* no-op */ + break; + } + + return WRC_Continue; +} +static int selectWindowRewriteSelectCb(Walker *pWalker, Select *pSelect){ + struct WindowRewrite *p = pWalker->u.pRewrite; + Select *pSave = p->pSubSelect; + if( pSave==pSelect ){ + return WRC_Continue; + }else{ + p->pSubSelect = pSelect; + sqlite3WalkSelect(pWalker, pSelect); + p->pSubSelect = pSave; + } + return WRC_Prune; +} + + +/* +** Iterate through each expression in expression-list pEList. For each: +** +** * TK_COLUMN, +** * aggregate function, or +** * window function with a Window object that is not a member of the +** Window list passed as the second argument (pWin). +** +** Append the node to output expression-list (*ppSub). And replace it +** with a TK_COLUMN that reads the (N-1)th element of table +** pWin->iEphCsr, where N is the number of elements in (*ppSub) after +** appending the new one. +*/ +static void selectWindowRewriteEList( + Parse *pParse, + Window *pWin, + SrcList *pSrc, + ExprList *pEList, /* Rewrite expressions in this list */ + Table *pTab, + ExprList **ppSub /* IN/OUT: Sub-select expression-list */ +){ + Walker sWalker; + WindowRewrite sRewrite; + + assert( pWin!=0 ); + memset(&sWalker, 0, sizeof(Walker)); + memset(&sRewrite, 0, sizeof(WindowRewrite)); + + sRewrite.pSub = *ppSub; + sRewrite.pWin = pWin; + sRewrite.pSrc = pSrc; + sRewrite.pTab = pTab; + + sWalker.pParse = pParse; + sWalker.xExprCallback = selectWindowRewriteExprCb; + sWalker.xSelectCallback = selectWindowRewriteSelectCb; + sWalker.u.pRewrite = &sRewrite; + + (void)sqlite3WalkExprList(&sWalker, pEList); + + *ppSub = sRewrite.pSub; +} + +/* +** Append a copy of each expression in expression-list pAppend to +** expression list pList. Return a pointer to the result list. +*/ +static ExprList *exprListAppendList( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to append. Might be NULL */ + ExprList *pAppend, /* List of values to append. Might be NULL */ + int bIntToNull +){ + if( pAppend ){ + int i; + int nInit = pList ? pList->nExpr : 0; + for(i=0; inExpr; i++){ + Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0); + assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) ); + if( bIntToNull && pDup ){ + int iDummy; + Expr *pSub; + for(pSub=pDup; ExprHasProperty(pSub, EP_Skip); pSub=pSub->pLeft){ + assert( pSub ); + } + if( sqlite3ExprIsInteger(pSub, &iDummy) ){ + pSub->op = TK_NULL; + pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); + pSub->u.zToken = 0; + } + } + pList = sqlite3ExprListAppend(pParse, pList, pDup); + if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; + } + } + return pList; +} + +/* +** When rewriting a query, if the new subquery in the FROM clause +** contains TK_AGG_FUNCTION nodes that refer to an outer query, +** then we have to increase the Expr->op2 values of those nodes +** due to the extra subquery layer that was added. +** +** See also the incrAggDepth() routine in resolve.c +*/ +static int sqlite3WindowExtraAggFuncDepth(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_AGG_FUNCTION + && pExpr->op2>=pWalker->walkerDepth + ){ + pExpr->op2++; + } + return WRC_Continue; +} + +/* +** If the SELECT statement passed as the second argument does not invoke +** any SQL window functions, this function is a no-op. Otherwise, it +** rewrites the SELECT statement so that window function xStep functions +** are invoked in the correct order as described under "SELECT REWRITING" +** at the top of this file. +*/ +SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ + int rc = SQLITE_OK; + if( p->pWin && p->pPrior==0 && (p->selFlags & SF_WinRewrite)==0 ){ + Vdbe *v = sqlite3GetVdbe(pParse); + sqlite3 *db = pParse->db; + Select *pSub = 0; /* The subquery */ + SrcList *pSrc = p->pSrc; + Expr *pWhere = p->pWhere; + ExprList *pGroupBy = p->pGroupBy; + Expr *pHaving = p->pHaving; + ExprList *pSort = 0; + + ExprList *pSublist = 0; /* Expression list for sub-query */ + Window *pMWin = p->pWin; /* Master window object */ + Window *pWin; /* Window object iterator */ + Table *pTab; + Walker w; + + u32 selFlags = p->selFlags; + + pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ){ + return sqlite3ErrorToParser(db, SQLITE_NOMEM); + } + sqlite3AggInfoPersistWalkerInit(&w, pParse); + sqlite3WalkSelect(&w, p); + + p->pSrc = 0; + p->pWhere = 0; + p->pGroupBy = 0; + p->pHaving = 0; + p->selFlags &= ~SF_Aggregate; + p->selFlags |= SF_WinRewrite; + + /* Create the ORDER BY clause for the sub-select. This is the concatenation + ** of the window PARTITION and ORDER BY clauses. Then, if this makes it + ** redundant, remove the ORDER BY from the parent SELECT. */ + pSort = exprListAppendList(pParse, 0, pMWin->pPartition, 1); + pSort = exprListAppendList(pParse, pSort, pMWin->pOrderBy, 1); + if( pSort && p->pOrderBy && p->pOrderBy->nExpr<=pSort->nExpr ){ + int nSave = pSort->nExpr; + pSort->nExpr = p->pOrderBy->nExpr; + if( sqlite3ExprListCompare(pSort, p->pOrderBy, -1)==0 ){ + sqlite3ExprListDelete(db, p->pOrderBy); + p->pOrderBy = 0; + } + pSort->nExpr = nSave; + } + + /* Assign a cursor number for the ephemeral table used to buffer rows. + ** The OpenEphemeral instruction is coded later, after it is known how + ** many columns the table will have. */ + pMWin->iEphCsr = pParse->nTab++; + pParse->nTab += 3; + + selectWindowRewriteEList(pParse, pMWin, pSrc, p->pEList, pTab, &pSublist); + selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, pTab, &pSublist); + pMWin->nBufferCol = (pSublist ? pSublist->nExpr : 0); + + /* Append the PARTITION BY and ORDER BY expressions to the to the + ** sub-select expression list. They are required to figure out where + ** boundaries for partitions and sets of peer rows lie. */ + pSublist = exprListAppendList(pParse, pSublist, pMWin->pPartition, 0); + pSublist = exprListAppendList(pParse, pSublist, pMWin->pOrderBy, 0); + + /* Append the arguments passed to each window function to the + ** sub-select expression list. Also allocate two registers for each + ** window function - one for the accumulator, another for interim + ** results. */ + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + ExprList *pArgs = pWin->pOwner->x.pList; + if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ + selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); + pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); + pWin->bExprArgs = 1; + }else{ + pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); + pSublist = exprListAppendList(pParse, pSublist, pArgs, 0); + } + if( pWin->pFilter ){ + Expr *pFilter = sqlite3ExprDup(db, pWin->pFilter, 0); + pSublist = sqlite3ExprListAppend(pParse, pSublist, pFilter); + } + pWin->regAccum = ++pParse->nMem; + pWin->regResult = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); + } + + /* If there is no ORDER BY or PARTITION BY clause, and the window + ** function accepts zero arguments, and there are no other columns + ** selected (e.g. "SELECT row_number() OVER () FROM t1"), it is possible + ** that pSublist is still NULL here. Add a constant expression here to + ** keep everything legal in this case. + */ + if( pSublist==0 ){ + pSublist = sqlite3ExprListAppend(pParse, 0, + sqlite3Expr(db, TK_INTEGER, "0") + ); + } + + pSub = sqlite3SelectNew( + pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0 + ); + p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( p->pSrc ){ + Table *pTab2; + p->pSrc->a[0].pSelect = pSub; + sqlite3SrcListAssignCursors(pParse, p->pSrc); + pSub->selFlags |= SF_Expanded; + pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE); + pSub->selFlags |= (selFlags & SF_Aggregate); + if( pTab2==0 ){ + /* Might actually be some other kind of error, but in that case + ** pParse->nErr will be set, so if SQLITE_NOMEM is set, we will get + ** the correct error message regardless. */ + rc = SQLITE_NOMEM; + }else{ + memcpy(pTab, pTab2, sizeof(Table)); + pTab->tabFlags |= TF_Ephemeral; + p->pSrc->a[0].pTab = pTab; + pTab = pTab2; + memset(&w, 0, sizeof(w)); + w.xExprCallback = sqlite3WindowExtraAggFuncDepth; + w.xSelectCallback = sqlite3WalkerDepthIncrease; + w.xSelectCallback2 = sqlite3WalkerDepthDecrease; + sqlite3WalkSelect(&w, pSub); + } + }else{ + sqlite3SelectDelete(db, pSub); + } + if( db->mallocFailed ) rc = SQLITE_NOMEM; + sqlite3DbFree(db, pTab); + } + + if( rc ){ + if( pParse->nErr==0 ){ + assert( pParse->db->mallocFailed ); + sqlite3ErrorToParser(pParse->db, SQLITE_NOMEM); + } + sqlite3SelectReset(pParse, p); + } + return rc; +} + +/* +** Unlink the Window object from the Select to which it is attached, +** if it is attached. +*/ +SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window *p){ + if( p->ppThis ){ + *p->ppThis = p->pNextWin; + if( p->pNextWin ) p->pNextWin->ppThis = p->ppThis; + p->ppThis = 0; + } +} + +/* +** Free the Window object passed as the second argument. +*/ +SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3 *db, Window *p){ + if( p ){ + sqlite3WindowUnlinkFromSelect(p); + sqlite3ExprDelete(db, p->pFilter); + sqlite3ExprListDelete(db, p->pPartition); + sqlite3ExprListDelete(db, p->pOrderBy); + sqlite3ExprDelete(db, p->pEnd); + sqlite3ExprDelete(db, p->pStart); + sqlite3DbFree(db, p->zName); + sqlite3DbFree(db, p->zBase); + sqlite3DbFree(db, p); + } +} + +/* +** Free the linked list of Window objects starting at the second argument. +*/ +SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p){ + while( p ){ + Window *pNext = p->pNextWin; + sqlite3WindowDelete(db, p); + p = pNext; + } +} + +/* +** The argument expression is an PRECEDING or FOLLOWING offset. The +** value should be a non-negative integer. If the value is not a +** constant, change it to NULL. The fact that it is then a non-negative +** integer will be caught later. But it is important not to leave +** variable values in the expression tree. +*/ +static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ + if( 0==sqlite3ExprIsConstant(pExpr) ){ + if( IN_RENAME_OBJECT ) sqlite3RenameExprUnmap(pParse, pExpr); + sqlite3ExprDelete(pParse->db, pExpr); + pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0); + } + return pExpr; +} + +/* +** Allocate and return a new Window object describing a Window Definition. +*/ +SQLITE_PRIVATE Window *sqlite3WindowAlloc( + Parse *pParse, /* Parsing context */ + int eType, /* Frame type. TK_RANGE, TK_ROWS, TK_GROUPS, or 0 */ + int eStart, /* Start type: CURRENT, PRECEDING, FOLLOWING, UNBOUNDED */ + Expr *pStart, /* Start window size if TK_PRECEDING or FOLLOWING */ + int eEnd, /* End type: CURRENT, FOLLOWING, TK_UNBOUNDED, PRECEDING */ + Expr *pEnd, /* End window size if TK_FOLLOWING or PRECEDING */ + u8 eExclude /* EXCLUDE clause */ +){ + Window *pWin = 0; + int bImplicitFrame = 0; + + /* Parser assures the following: */ + assert( eType==0 || eType==TK_RANGE || eType==TK_ROWS || eType==TK_GROUPS ); + assert( eStart==TK_CURRENT || eStart==TK_PRECEDING + || eStart==TK_UNBOUNDED || eStart==TK_FOLLOWING ); + assert( eEnd==TK_CURRENT || eEnd==TK_FOLLOWING + || eEnd==TK_UNBOUNDED || eEnd==TK_PRECEDING ); + assert( (eStart==TK_PRECEDING || eStart==TK_FOLLOWING)==(pStart!=0) ); + assert( (eEnd==TK_FOLLOWING || eEnd==TK_PRECEDING)==(pEnd!=0) ); + + if( eType==0 ){ + bImplicitFrame = 1; + eType = TK_RANGE; + } + + /* Additionally, the + ** starting boundary type may not occur earlier in the following list than + ** the ending boundary type: + ** + ** UNBOUNDED PRECEDING + ** PRECEDING + ** CURRENT ROW + ** FOLLOWING + ** UNBOUNDED FOLLOWING + ** + ** The parser ensures that "UNBOUNDED PRECEDING" cannot be used as an ending + ** boundary, and than "UNBOUNDED FOLLOWING" cannot be used as a starting + ** frame boundary. + */ + if( (eStart==TK_CURRENT && eEnd==TK_PRECEDING) + || (eStart==TK_FOLLOWING && (eEnd==TK_PRECEDING || eEnd==TK_CURRENT)) + ){ + sqlite3ErrorMsg(pParse, "unsupported frame specification"); + goto windowAllocErr; + } + + pWin = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( pWin==0 ) goto windowAllocErr; + pWin->eFrmType = eType; + pWin->eStart = eStart; + pWin->eEnd = eEnd; + if( eExclude==0 && OptimizationDisabled(pParse->db, SQLITE_WindowFunc) ){ + eExclude = TK_NO; + } + pWin->eExclude = eExclude; + pWin->bImplicitFrame = bImplicitFrame; + pWin->pEnd = sqlite3WindowOffsetExpr(pParse, pEnd); + pWin->pStart = sqlite3WindowOffsetExpr(pParse, pStart); + return pWin; + +windowAllocErr: + sqlite3ExprDelete(pParse->db, pEnd); + sqlite3ExprDelete(pParse->db, pStart); + return 0; +} + +/* +** Attach PARTITION and ORDER BY clauses pPartition and pOrderBy to window +** pWin. Also, if parameter pBase is not NULL, set pWin->zBase to the +** equivalent nul-terminated string. +*/ +SQLITE_PRIVATE Window *sqlite3WindowAssemble( + Parse *pParse, + Window *pWin, + ExprList *pPartition, + ExprList *pOrderBy, + Token *pBase +){ + if( pWin ){ + pWin->pPartition = pPartition; + pWin->pOrderBy = pOrderBy; + if( pBase ){ + pWin->zBase = sqlite3DbStrNDup(pParse->db, pBase->z, pBase->n); + } + }else{ + sqlite3ExprListDelete(pParse->db, pPartition); + sqlite3ExprListDelete(pParse->db, pOrderBy); + } + return pWin; +} + +/* +** Window *pWin has just been created from a WINDOW clause. Tokne pBase +** is the base window. Earlier windows from the same WINDOW clause are +** stored in the linked list starting at pWin->pNextWin. This function +** either updates *pWin according to the base specification, or else +** leaves an error in pParse. +*/ +SQLITE_PRIVATE void sqlite3WindowChain(Parse *pParse, Window *pWin, Window *pList){ + if( pWin->zBase ){ + sqlite3 *db = pParse->db; + Window *pExist = windowFind(pParse, pList, pWin->zBase); + if( pExist ){ + const char *zErr = 0; + /* Check for errors */ + if( pWin->pPartition ){ + zErr = "PARTITION clause"; + }else if( pExist->pOrderBy && pWin->pOrderBy ){ + zErr = "ORDER BY clause"; + }else if( pExist->bImplicitFrame==0 ){ + zErr = "frame specification"; + } + if( zErr ){ + sqlite3ErrorMsg(pParse, + "cannot override %s of window: %s", zErr, pWin->zBase + ); + }else{ + pWin->pPartition = sqlite3ExprListDup(db, pExist->pPartition, 0); + if( pExist->pOrderBy ){ + assert( pWin->pOrderBy==0 ); + pWin->pOrderBy = sqlite3ExprListDup(db, pExist->pOrderBy, 0); + } + sqlite3DbFree(db, pWin->zBase); + pWin->zBase = 0; + } + } + } +} + +/* +** Attach window object pWin to expression p. +*/ +SQLITE_PRIVATE void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ + if( p ){ + assert( p->op==TK_FUNCTION ); + assert( pWin ); + p->y.pWin = pWin; + ExprSetProperty(p, EP_WinFunc); + pWin->pOwner = p; + if( (p->flags & EP_Distinct) && pWin->eFrmType!=TK_FILTER ){ + sqlite3ErrorMsg(pParse, + "DISTINCT is not supported for window functions" + ); + } + }else{ + sqlite3WindowDelete(pParse->db, pWin); + } +} + +/* +** Possibly link window pWin into the list at pSel->pWin (window functions +** to be processed as part of SELECT statement pSel). The window is linked +** in if either (a) there are no other windows already linked to this +** SELECT, or (b) the windows already linked use a compatible window frame. +*/ +SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin){ + if( pSel!=0 + && (0==pSel->pWin || 0==sqlite3WindowCompare(0, pSel->pWin, pWin, 0)) + ){ + pWin->pNextWin = pSel->pWin; + if( pSel->pWin ){ + pSel->pWin->ppThis = &pWin->pNextWin; + } + pSel->pWin = pWin; + pWin->ppThis = &pSel->pWin; + } +} + +/* +** Return 0 if the two window objects are identical, 1 if they are +** different, or 2 if it cannot be determined if the objects are identical +** or not. Identical window objects can be processed in a single scan. +*/ +SQLITE_PRIVATE int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){ + int res; + if( NEVER(p1==0) || NEVER(p2==0) ) return 1; + if( p1->eFrmType!=p2->eFrmType ) return 1; + if( p1->eStart!=p2->eStart ) return 1; + if( p1->eEnd!=p2->eEnd ) return 1; + if( p1->eExclude!=p2->eExclude ) return 1; + if( sqlite3ExprCompare(pParse, p1->pStart, p2->pStart, -1) ) return 1; + if( sqlite3ExprCompare(pParse, p1->pEnd, p2->pEnd, -1) ) return 1; + if( (res = sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1)) ){ + return res; + } + if( (res = sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1)) ){ + return res; + } + if( bFilter ){ + if( (res = sqlite3ExprCompare(pParse, p1->pFilter, p2->pFilter, -1)) ){ + return res; + } + } + return 0; +} + + +/* +** This is called by code in select.c before it calls sqlite3WhereBegin() +** to begin iterating through the sub-query results. It is used to allocate +** and initialize registers and cursors used by sqlite3WindowCodeStep(). +*/ +SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ + int nEphExpr = pSelect->pSrc->a[0].pSelect->pEList->nExpr; + Window *pMWin = pSelect->pWin; + Window *pWin; + Vdbe *v = sqlite3GetVdbe(pParse); + + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, nEphExpr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+1, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+2, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+3, pMWin->iEphCsr); + + /* Allocate registers to use for PARTITION BY values, if any. Initialize + ** said registers to NULL. */ + if( pMWin->pPartition ){ + int nExpr = pMWin->pPartition->nExpr; + pMWin->regPart = pParse->nMem+1; + pParse->nMem += nExpr; + sqlite3VdbeAddOp3(v, OP_Null, 0, pMWin->regPart, pMWin->regPart+nExpr-1); + } + + pMWin->regOne = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regOne); + + if( pMWin->eExclude ){ + pMWin->regStartRowid = ++pParse->nMem; + pMWin->regEndRowid = ++pParse->nMem; + pMWin->csrApp = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regStartRowid); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regEndRowid); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->csrApp, pMWin->iEphCsr); + return; + } + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *p = pWin->pFunc; + if( (p->funcFlags & SQLITE_FUNC_MINMAX) && pWin->eStart!=TK_UNBOUNDED ){ + /* The inline versions of min() and max() require a single ephemeral + ** table and 3 registers. The registers are used as follows: + ** + ** regApp+0: slot to copy min()/max() argument to for MakeRecord + ** regApp+1: integer value used to ensure keys are unique + ** regApp+2: output of MakeRecord + */ + ExprList *pList = pWin->pOwner->x.pList; + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0); + pWin->csrApp = pParse->nTab++; + pWin->regApp = pParse->nMem+1; + pParse->nMem += 3; + if( pKeyInfo && pWin->pFunc->zName[1]=='i' ){ + assert( pKeyInfo->aSortFlags[0]==0 ); + pKeyInfo->aSortFlags[0] = KEYINFO_ORDER_DESC; + } + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pWin->csrApp, 2); + sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + } + else if( p->zName==nth_valueName || p->zName==first_valueName ){ + /* Allocate two registers at pWin->regApp. These will be used to + ** store the start and end index of the current frame. */ + pWin->regApp = pParse->nMem+1; + pWin->csrApp = pParse->nTab++; + pParse->nMem += 2; + sqlite3VdbeAddOp2(v, OP_OpenDup, pWin->csrApp, pMWin->iEphCsr); + } + else if( p->zName==leadName || p->zName==lagName ){ + pWin->csrApp = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_OpenDup, pWin->csrApp, pMWin->iEphCsr); + } + } +} + +#define WINDOW_STARTING_INT 0 +#define WINDOW_ENDING_INT 1 +#define WINDOW_NTH_VALUE_INT 2 +#define WINDOW_STARTING_NUM 3 +#define WINDOW_ENDING_NUM 4 + +/* +** A "PRECEDING " (eCond==0) or "FOLLOWING " (eCond==1) or the +** value of the second argument to nth_value() (eCond==2) has just been +** evaluated and the result left in register reg. This function generates VM +** code to check that the value is a non-negative integer and throws an +** exception if it is not. +*/ +static void windowCheckValue(Parse *pParse, int reg, int eCond){ + static const char *azErr[] = { + "frame starting offset must be a non-negative integer", + "frame ending offset must be a non-negative integer", + "second argument to nth_value must be a positive integer", + "frame starting offset must be a non-negative number", + "frame ending offset must be a non-negative number", + }; + static int aOp[] = { OP_Ge, OP_Ge, OP_Gt, OP_Ge, OP_Ge }; + Vdbe *v = sqlite3GetVdbe(pParse); + int regZero = sqlite3GetTempReg(pParse); + assert( eCond>=0 && eCond=WINDOW_STARTING_NUM ){ + int regString = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4(v, OP_String8, 0, regString, 0, "", P4_STATIC); + sqlite3VdbeAddOp3(v, OP_Ge, regString, sqlite3VdbeCurrentAddr(v)+2, reg); + sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC|SQLITE_JUMPIFNULL); + VdbeCoverage(v); + assert( eCond==3 || eCond==4 ); + VdbeCoverageIf(v, eCond==3); + VdbeCoverageIf(v, eCond==4); + }else{ + sqlite3VdbeAddOp2(v, OP_MustBeInt, reg, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + assert( eCond==0 || eCond==1 || eCond==2 ); + VdbeCoverageIf(v, eCond==0); + VdbeCoverageIf(v, eCond==1); + VdbeCoverageIf(v, eCond==2); + } + sqlite3VdbeAddOp3(v, aOp[eCond], regZero, sqlite3VdbeCurrentAddr(v)+2, reg); + VdbeCoverageNeverNullIf(v, eCond==0); /* NULL case captured by */ + VdbeCoverageNeverNullIf(v, eCond==1); /* the OP_MustBeInt */ + VdbeCoverageNeverNullIf(v, eCond==2); + VdbeCoverageNeverNullIf(v, eCond==3); /* NULL case caught by */ + VdbeCoverageNeverNullIf(v, eCond==4); /* the OP_Ge */ + sqlite3MayAbort(pParse); + sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort); + sqlite3VdbeAppendP4(v, (void*)azErr[eCond], P4_STATIC); + sqlite3ReleaseTempReg(pParse, regZero); +} + +/* +** Return the number of arguments passed to the window-function associated +** with the object passed as the only argument to this function. +*/ +static int windowArgCount(Window *pWin){ + ExprList *pList = pWin->pOwner->x.pList; + return (pList ? pList->nExpr : 0); +} + +typedef struct WindowCodeArg WindowCodeArg; +typedef struct WindowCsrAndReg WindowCsrAndReg; + +/* +** See comments above struct WindowCodeArg. +*/ +struct WindowCsrAndReg { + int csr; /* Cursor number */ + int reg; /* First in array of peer values */ +}; + +/* +** A single instance of this structure is allocated on the stack by +** sqlite3WindowCodeStep() and a pointer to it passed to the various helper +** routines. This is to reduce the number of arguments required by each +** helper function. +** +** regArg: +** Each window function requires an accumulator register (just as an +** ordinary aggregate function does). This variable is set to the first +** in an array of accumulator registers - one for each window function +** in the WindowCodeArg.pMWin list. +** +** eDelete: +** The window functions implementation sometimes caches the input rows +** that it processes in a temporary table. If it is not zero, this +** variable indicates when rows may be removed from the temp table (in +** order to reduce memory requirements - it would always be safe just +** to leave them there). Possible values for eDelete are: +** +** WINDOW_RETURN_ROW: +** An input row can be discarded after it is returned to the caller. +** +** WINDOW_AGGINVERSE: +** An input row can be discarded after the window functions xInverse() +** callbacks have been invoked in it. +** +** WINDOW_AGGSTEP: +** An input row can be discarded after the window functions xStep() +** callbacks have been invoked in it. +** +** start,current,end +** Consider a window-frame similar to the following: +** +** (ORDER BY a, b GROUPS BETWEEN 2 PRECEDING AND 2 FOLLOWING) +** +** The windows functions implmentation caches the input rows in a temp +** table, sorted by "a, b" (it actually populates the cache lazily, and +** aggressively removes rows once they are no longer required, but that's +** a mere detail). It keeps three cursors open on the temp table. One +** (current) that points to the next row to return to the query engine +** once its window function values have been calculated. Another (end) +** points to the next row to call the xStep() method of each window function +** on (so that it is 2 groups ahead of current). And a third (start) that +** points to the next row to call the xInverse() method of each window +** function on. +** +** Each cursor (start, current and end) consists of a VDBE cursor +** (WindowCsrAndReg.csr) and an array of registers (starting at +** WindowCodeArg.reg) that always contains a copy of the peer values +** read from the corresponding cursor. +** +** Depending on the window-frame in question, all three cursors may not +** be required. In this case both WindowCodeArg.csr and reg are set to +** 0. +*/ +struct WindowCodeArg { + Parse *pParse; /* Parse context */ + Window *pMWin; /* First in list of functions being processed */ + Vdbe *pVdbe; /* VDBE object */ + int addrGosub; /* OP_Gosub to this address to return one row */ + int regGosub; /* Register used with OP_Gosub(addrGosub) */ + int regArg; /* First in array of accumulator registers */ + int eDelete; /* See above */ + + WindowCsrAndReg start; + WindowCsrAndReg current; + WindowCsrAndReg end; +}; + +/* +** Generate VM code to read the window frames peer values from cursor csr into +** an array of registers starting at reg. +*/ +static void windowReadPeerValues( + WindowCodeArg *p, + int csr, + int reg +){ + Window *pMWin = p->pMWin; + ExprList *pOrderBy = pMWin->pOrderBy; + if( pOrderBy ){ + Vdbe *v = sqlite3GetVdbe(p->pParse); + ExprList *pPart = pMWin->pPartition; + int iColOff = pMWin->nBufferCol + (pPart ? pPart->nExpr : 0); + int i; + for(i=0; inExpr; i++){ + sqlite3VdbeAddOp3(v, OP_Column, csr, iColOff+i, reg+i); + } + } +} + +/* +** Generate VM code to invoke either xStep() (if bInverse is 0) or +** xInverse (if bInverse is non-zero) for each window function in the +** linked list starting at pMWin. Or, for built-in window functions +** that do not use the standard function API, generate the required +** inline VM code. +** +** If argument csr is greater than or equal to 0, then argument reg is +** the first register in an array of registers guaranteed to be large +** enough to hold the array of arguments for each function. In this case +** the arguments are extracted from the current row of csr into the +** array of registers before invoking OP_AggStep or OP_AggInverse +** +** Or, if csr is less than zero, then the array of registers at reg is +** already populated with all columns from the current row of the sub-query. +** +** If argument regPartSize is non-zero, then it is a register containing the +** number of rows in the current partition. +*/ +static void windowAggStep( + WindowCodeArg *p, + Window *pMWin, /* Linked list of window functions */ + int csr, /* Read arguments from this cursor */ + int bInverse, /* True to invoke xInverse instead of xStep */ + int reg /* Array of registers */ +){ + Parse *pParse = p->pParse; + Vdbe *v = sqlite3GetVdbe(pParse); + Window *pWin; + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pFunc; + int regArg; + int nArg = pWin->bExprArgs ? 0 : windowArgCount(pWin); + int i; + + assert( bInverse==0 || pWin->eStart!=TK_UNBOUNDED ); + + /* All OVER clauses in the same window function aggregate step must + ** be the same. */ + assert( pWin==pMWin || sqlite3WindowCompare(pParse,pWin,pMWin,0)!=1 ); + + for(i=0; izName!=nth_valueName ){ + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+i, reg+i); + }else{ + sqlite3VdbeAddOp3(v, OP_Column, pMWin->iEphCsr, pWin->iArgCol+i, reg+i); + } + } + regArg = reg; + + if( pMWin->regStartRowid==0 + && (pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->eStart!=TK_UNBOUNDED) + ){ + int addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regArg); + VdbeCoverage(v); + if( bInverse==0 ){ + sqlite3VdbeAddOp2(v, OP_AddImm, pWin->regApp+1, 1); + sqlite3VdbeAddOp2(v, OP_SCopy, regArg, pWin->regApp); + sqlite3VdbeAddOp3(v, OP_MakeRecord, pWin->regApp, 2, pWin->regApp+2); + sqlite3VdbeAddOp2(v, OP_IdxInsert, pWin->csrApp, pWin->regApp+2); + }else{ + sqlite3VdbeAddOp4Int(v, OP_SeekGE, pWin->csrApp, 0, regArg, 1); + VdbeCoverageNeverTaken(v); + sqlite3VdbeAddOp1(v, OP_Delete, pWin->csrApp); + sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); + } + sqlite3VdbeJumpHere(v, addrIsNull); + }else if( pWin->regApp ){ + assert( pFunc->zName==nth_valueName + || pFunc->zName==first_valueName + ); + assert( bInverse==0 || bInverse==1 ); + sqlite3VdbeAddOp2(v, OP_AddImm, pWin->regApp+1-bInverse, 1); + }else if( pFunc->xSFunc!=noopStepFunc ){ + int addrIf = 0; + if( pWin->pFilter ){ + int regTmp; + assert( pWin->bExprArgs || !nArg ||nArg==pWin->pOwner->x.pList->nExpr ); + assert( pWin->bExprArgs || nArg ||pWin->pOwner->x.pList==0 ); + regTmp = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+nArg,regTmp); + addrIf = sqlite3VdbeAddOp3(v, OP_IfNot, regTmp, 0, 1); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, regTmp); + } + + if( pWin->bExprArgs ){ + int iStart = sqlite3VdbeCurrentAddr(v); + VdbeOp *pOp, *pEnd; + + nArg = pWin->pOwner->x.pList->nExpr; + regArg = sqlite3GetTempRange(pParse, nArg); + sqlite3ExprCodeExprList(pParse, pWin->pOwner->x.pList, regArg, 0, 0); + + pEnd = sqlite3VdbeGetOp(v, -1); + for(pOp=sqlite3VdbeGetOp(v, iStart); pOp<=pEnd; pOp++){ + if( pOp->opcode==OP_Column && pOp->p1==pWin->iEphCsr ){ + pOp->p1 = csr; + } + } + } + if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + CollSeq *pColl; + assert( nArg>0 ); + pColl = sqlite3ExprNNCollSeq(pParse, pWin->pOwner->x.pList->a[0].pExpr); + sqlite3VdbeAddOp4(v, OP_CollSeq, 0,0,0, (const char*)pColl, P4_COLLSEQ); + } + sqlite3VdbeAddOp3(v, bInverse? OP_AggInverse : OP_AggStep, + bInverse, regArg, pWin->regAccum); + sqlite3VdbeAppendP4(v, pFunc, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, (u8)nArg); + if( pWin->bExprArgs ){ + sqlite3ReleaseTempRange(pParse, regArg, nArg); + } + if( addrIf ) sqlite3VdbeJumpHere(v, addrIf); + } + } +} + +/* +** Values that may be passed as the second argument to windowCodeOp(). +*/ +#define WINDOW_RETURN_ROW 1 +#define WINDOW_AGGINVERSE 2 +#define WINDOW_AGGSTEP 3 + +/* +** Generate VM code to invoke either xValue() (bFin==0) or xFinalize() +** (bFin==1) for each window function in the linked list starting at +** pMWin. Or, for built-in window-functions that do not use the standard +** API, generate the equivalent VM code. +*/ +static void windowAggFinal(WindowCodeArg *p, int bFin){ + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; + Vdbe *v = sqlite3GetVdbe(pParse); + Window *pWin; + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + if( pMWin->regStartRowid==0 + && (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->eStart!=TK_UNBOUNDED) + ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); + sqlite3VdbeAddOp1(v, OP_Last, pWin->csrApp); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Column, pWin->csrApp, 0, pWin->regResult); + sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); + }else if( pWin->regApp ){ + assert( pMWin->regStartRowid==0 ); + }else{ + int nArg = windowArgCount(pWin); + if( bFin ){ + sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, nArg); + sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); + sqlite3VdbeAddOp2(v, OP_Copy, pWin->regAccum, pWin->regResult); + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); + }else{ + sqlite3VdbeAddOp3(v, OP_AggValue,pWin->regAccum,nArg,pWin->regResult); + sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); + } + } + } +} + +/* +** Generate code to calculate the current values of all window functions in the +** p->pMWin list by doing a full scan of the current window frame. Store the +** results in the Window.regResult registers, ready to return the upper +** layer. +*/ +static void windowFullScan(WindowCodeArg *p){ + Window *pWin; + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; + Vdbe *v = p->pVdbe; + + int regCRowid = 0; /* Current rowid value */ + int regCPeer = 0; /* Current peer values */ + int regRowid = 0; /* AggStep rowid value */ + int regPeer = 0; /* AggStep peer values */ + + int nPeer; + int lblNext; + int lblBrk; + int addrNext; + int csr; + + VdbeModuleComment((v, "windowFullScan begin")); + + assert( pMWin!=0 ); + csr = pMWin->csrApp; + nPeer = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); + + lblNext = sqlite3VdbeMakeLabel(pParse); + lblBrk = sqlite3VdbeMakeLabel(pParse); + + regCRowid = sqlite3GetTempReg(pParse); + regRowid = sqlite3GetTempReg(pParse); + if( nPeer ){ + regCPeer = sqlite3GetTempRange(pParse, nPeer); + regPeer = sqlite3GetTempRange(pParse, nPeer); + } + + sqlite3VdbeAddOp2(v, OP_Rowid, pMWin->iEphCsr, regCRowid); + windowReadPeerValues(p, pMWin->iEphCsr, regCPeer); + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); + } + + sqlite3VdbeAddOp3(v, OP_SeekGE, csr, lblBrk, pMWin->regStartRowid); + VdbeCoverage(v); + addrNext = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Rowid, csr, regRowid); + sqlite3VdbeAddOp3(v, OP_Gt, pMWin->regEndRowid, lblBrk, regRowid); + VdbeCoverageNeverNull(v); + + if( pMWin->eExclude==TK_CURRENT ){ + sqlite3VdbeAddOp3(v, OP_Eq, regCRowid, lblNext, regRowid); + VdbeCoverageNeverNull(v); + }else if( pMWin->eExclude!=TK_NO ){ + int addr; + int addrEq = 0; + KeyInfo *pKeyInfo = 0; + + if( pMWin->pOrderBy ){ + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pMWin->pOrderBy, 0, 0); + } + if( pMWin->eExclude==TK_TIES ){ + addrEq = sqlite3VdbeAddOp3(v, OP_Eq, regCRowid, 0, regRowid); + VdbeCoverageNeverNull(v); + } + if( pKeyInfo ){ + windowReadPeerValues(p, csr, regPeer); + sqlite3VdbeAddOp3(v, OP_Compare, regPeer, regCPeer, nPeer); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + addr = sqlite3VdbeCurrentAddr(v)+1; + sqlite3VdbeAddOp3(v, OP_Jump, addr, lblNext, addr); + VdbeCoverageEqNe(v); + }else{ + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblNext); + } + if( addrEq ) sqlite3VdbeJumpHere(v, addrEq); + } + + windowAggStep(p, pMWin, csr, 0, p->regArg); + + sqlite3VdbeResolveLabel(v, lblNext); + sqlite3VdbeAddOp2(v, OP_Next, csr, addrNext); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrNext-1); + sqlite3VdbeJumpHere(v, addrNext+1); + sqlite3ReleaseTempReg(pParse, regRowid); + sqlite3ReleaseTempReg(pParse, regCRowid); + if( nPeer ){ + sqlite3ReleaseTempRange(pParse, regPeer, nPeer); + sqlite3ReleaseTempRange(pParse, regCPeer, nPeer); + } + + windowAggFinal(p, 1); + VdbeModuleComment((v, "windowFullScan end")); +} + +/* +** Invoke the sub-routine at regGosub (generated by code in select.c) to +** return the current row of Window.iEphCsr. If all window functions are +** aggregate window functions that use the standard API, a single +** OP_Gosub instruction is all that this routine generates. Extra VM code +** for per-row processing is only generated for the following built-in window +** functions: +** +** nth_value() +** first_value() +** lag() +** lead() +*/ +static void windowReturnOneRow(WindowCodeArg *p){ + Window *pMWin = p->pMWin; + Vdbe *v = p->pVdbe; + + if( pMWin->regStartRowid ){ + windowFullScan(p); + }else{ + Parse *pParse = p->pParse; + Window *pWin; + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pFunc; + if( pFunc->zName==nth_valueName + || pFunc->zName==first_valueName + ){ + int csr = pWin->csrApp; + int lbl = sqlite3VdbeMakeLabel(pParse); + int tmpReg = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); + + if( pFunc->zName==nth_valueName ){ + sqlite3VdbeAddOp3(v, OP_Column,pMWin->iEphCsr,pWin->iArgCol+1,tmpReg); + windowCheckValue(pParse, tmpReg, 2); + }else{ + sqlite3VdbeAddOp2(v, OP_Integer, 1, tmpReg); + } + sqlite3VdbeAddOp3(v, OP_Add, tmpReg, pWin->regApp, tmpReg); + sqlite3VdbeAddOp3(v, OP_Gt, pWin->regApp+1, lbl, tmpReg); + VdbeCoverageNeverNull(v); + sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, 0, tmpReg); + VdbeCoverageNeverTaken(v); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); + sqlite3VdbeResolveLabel(v, lbl); + sqlite3ReleaseTempReg(pParse, tmpReg); + } + else if( pFunc->zName==leadName || pFunc->zName==lagName ){ + int nArg = pWin->pOwner->x.pList->nExpr; + int csr = pWin->csrApp; + int lbl = sqlite3VdbeMakeLabel(pParse); + int tmpReg = sqlite3GetTempReg(pParse); + int iEph = pMWin->iEphCsr; + + if( nArg<3 ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); + }else{ + sqlite3VdbeAddOp3(v, OP_Column, iEph,pWin->iArgCol+2,pWin->regResult); + } + sqlite3VdbeAddOp2(v, OP_Rowid, iEph, tmpReg); + if( nArg<2 ){ + int val = (pFunc->zName==leadName ? 1 : -1); + sqlite3VdbeAddOp2(v, OP_AddImm, tmpReg, val); + }else{ + int op = (pFunc->zName==leadName ? OP_Add : OP_Subtract); + int tmpReg2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_Column, iEph, pWin->iArgCol+1, tmpReg2); + sqlite3VdbeAddOp3(v, op, tmpReg2, tmpReg, tmpReg); + sqlite3ReleaseTempReg(pParse, tmpReg2); + } + + sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, lbl, tmpReg); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); + sqlite3VdbeResolveLabel(v, lbl); + sqlite3ReleaseTempReg(pParse, tmpReg); + } + } + } + sqlite3VdbeAddOp2(v, OP_Gosub, p->regGosub, p->addrGosub); +} + +/* +** Generate code to set the accumulator register for each window function +** in the linked list passed as the second argument to NULL. And perform +** any equivalent initialization required by any built-in window functions +** in the list. +*/ +static int windowInitAccum(Parse *pParse, Window *pMWin){ + Vdbe *v = sqlite3GetVdbe(pParse); + int regArg; + int nArg = 0; + Window *pWin; + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pFunc; + assert( pWin->regAccum ); + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); + nArg = MAX(nArg, windowArgCount(pWin)); + if( pMWin->regStartRowid==0 ){ + if( pFunc->zName==nth_valueName || pFunc->zName==first_valueName ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + } + + if( (pFunc->funcFlags & SQLITE_FUNC_MINMAX) && pWin->csrApp ){ + assert( pWin->eStart!=TK_UNBOUNDED ); + sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + } + } + } + regArg = pParse->nMem+1; + pParse->nMem += nArg; + return regArg; +} + +/* +** Return true if the current frame should be cached in the ephemeral table, +** even if there are no xInverse() calls required. +*/ +static int windowCacheFrame(Window *pMWin){ + Window *pWin; + if( pMWin->regStartRowid ) return 1; + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pFunc; + if( (pFunc->zName==nth_valueName) + || (pFunc->zName==first_valueName) + || (pFunc->zName==leadName) + || (pFunc->zName==lagName) + ){ + return 1; + } + } + return 0; +} + +/* +** regOld and regNew are each the first register in an array of size +** pOrderBy->nExpr. This function generates code to compare the two +** arrays of registers using the collation sequences and other comparison +** parameters specified by pOrderBy. +** +** If the two arrays are not equal, the contents of regNew is copied to +** regOld and control falls through. Otherwise, if the contents of the arrays +** are equal, an OP_Goto is executed. The address of the OP_Goto is returned. +*/ +static void windowIfNewPeer( + Parse *pParse, + ExprList *pOrderBy, + int regNew, /* First in array of new values */ + int regOld, /* First in array of old values */ + int addr /* Jump here */ +){ + Vdbe *v = sqlite3GetVdbe(pParse); + if( pOrderBy ){ + int nVal = pOrderBy->nExpr; + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); + sqlite3VdbeAddOp3(v, OP_Compare, regOld, regNew, nVal); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, + sqlite3VdbeCurrentAddr(v)+1, addr, sqlite3VdbeCurrentAddr(v)+1 + ); + VdbeCoverageEqNe(v); + sqlite3VdbeAddOp3(v, OP_Copy, regNew, regOld, nVal-1); + }else{ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); + } +} + +/* +** This function is called as part of generating VM programs for RANGE +** offset PRECEDING/FOLLOWING frame boundaries. Assuming "ASC" order for +** the ORDER BY term in the window, and that argument op is OP_Ge, it generates +** code equivalent to: +** +** if( csr1.peerVal + regVal >= csr2.peerVal ) goto lbl; +** +** The value of parameter op may also be OP_Gt or OP_Le. In these cases the +** operator in the above pseudo-code is replaced with ">" or "<=", respectively. +** +** If the sort-order for the ORDER BY term in the window is DESC, then the +** comparison is reversed. Instead of adding regVal to csr1.peerVal, it is +** subtracted. And the comparison operator is inverted to - ">=" becomes "<=", +** ">" becomes "<", and so on. So, with DESC sort order, if the argument op +** is OP_Ge, the generated code is equivalent to: +** +** if( csr1.peerVal - regVal <= csr2.peerVal ) goto lbl; +** +** A special type of arithmetic is used such that if csr1.peerVal is not +** a numeric type (real or integer), then the result of the addition addition +** or subtraction is a a copy of csr1.peerVal. +*/ +static void windowCodeRangeTest( + WindowCodeArg *p, + int op, /* OP_Ge, OP_Gt, or OP_Le */ + int csr1, /* Cursor number for cursor 1 */ + int regVal, /* Register containing non-negative number */ + int csr2, /* Cursor number for cursor 2 */ + int lbl /* Jump destination if condition is true */ +){ + Parse *pParse = p->pParse; + Vdbe *v = sqlite3GetVdbe(pParse); + ExprList *pOrderBy = p->pMWin->pOrderBy; /* ORDER BY clause for window */ + int reg1 = sqlite3GetTempReg(pParse); /* Reg. for csr1.peerVal+regVal */ + int reg2 = sqlite3GetTempReg(pParse); /* Reg. for csr2.peerVal */ + int regString = ++pParse->nMem; /* Reg. for constant value '' */ + int arith = OP_Add; /* OP_Add or OP_Subtract */ + int addrGe; /* Jump destination */ + + assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); + assert( pOrderBy && pOrderBy->nExpr==1 ); + if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){ + switch( op ){ + case OP_Ge: op = OP_Le; break; + case OP_Gt: op = OP_Lt; break; + default: assert( op==OP_Le ); op = OP_Ge; break; + } + arith = OP_Subtract; + } + + /* Read the peer-value from each cursor into a register */ + windowReadPeerValues(p, csr1, reg1); + windowReadPeerValues(p, csr2, reg2); + + VdbeModuleComment((v, "CodeRangeTest: if( R%d %s R%d %s R%d ) goto lbl", + reg1, (arith==OP_Add ? "+" : "-"), regVal, + ((op==OP_Ge) ? ">=" : (op==OP_Le) ? "<=" : (op==OP_Gt) ? ">" : "<"), reg2 + )); + + /* Register reg1 currently contains csr1.peerVal (the peer-value from csr1). + ** This block adds (or subtracts for DESC) the numeric value in regVal + ** from it. Or, if reg1 is not numeric (it is a NULL, a text value or a blob), + ** then leave reg1 as it is. In pseudo-code, this is implemented as: + ** + ** if( reg1>='' ) goto addrGe; + ** reg1 = reg1 +/- regVal + ** addrGe: + ** + ** Since all strings and blobs are greater-than-or-equal-to an empty string, + ** the add/subtract is skipped for these, as required. If reg1 is a NULL, + ** then the arithmetic is performed, but since adding or subtracting from + ** NULL is always NULL anyway, this case is handled as required too. */ + sqlite3VdbeAddOp4(v, OP_String8, 0, regString, 0, "", P4_STATIC); + addrGe = sqlite3VdbeAddOp3(v, OP_Ge, regString, 0, reg1); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, arith, regVal, reg1, reg1); + sqlite3VdbeJumpHere(v, addrGe); + + /* If the BIGNULL flag is set for the ORDER BY, then it is required to + ** consider NULL values to be larger than all other values, instead of + ** the usual smaller. The VDBE opcodes OP_Ge and so on do not handle this + ** (and adding that capability causes a performance regression), so + ** instead if the BIGNULL flag is set then cases where either reg1 or + ** reg2 are NULL are handled separately in the following block. The code + ** generated is equivalent to: + ** + ** if( reg1 IS NULL ){ + ** if( op==OP_Ge ) goto lbl; + ** if( op==OP_Gt && reg2 IS NOT NULL ) goto lbl; + ** if( op==OP_Le && reg2 IS NULL ) goto lbl; + ** }else if( reg2 IS NULL ){ + ** if( op==OP_Le ) goto lbl; + ** } + ** + ** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is + ** not taken, control jumps over the comparison operator coded below this + ** block. */ + if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){ + /* This block runs if reg1 contains a NULL. */ + int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); + switch( op ){ + case OP_Ge: + sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); + break; + case OP_Gt: + sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); + VdbeCoverage(v); + break; + case OP_Le: + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); + VdbeCoverage(v); + break; + default: assert( op==OP_Lt ); /* no-op */ break; + } + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+3); + + /* This block runs if reg1 is not NULL, but reg2 is. */ + sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); + if( op==OP_Gt || op==OP_Ge ){ + sqlite3VdbeChangeP2(v, -1, sqlite3VdbeCurrentAddr(v)+1); + } + } + + /* Compare registers reg2 and reg1, taking the jump if required. Note that + ** control skips over this test if the BIGNULL flag is set and either + ** reg1 or reg2 contain a NULL value. */ + sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); + + assert( op==OP_Ge || op==OP_Gt || op==OP_Lt || op==OP_Le ); + testcase(op==OP_Ge); VdbeCoverageIf(v, op==OP_Ge); + testcase(op==OP_Lt); VdbeCoverageIf(v, op==OP_Lt); + testcase(op==OP_Le); VdbeCoverageIf(v, op==OP_Le); + testcase(op==OP_Gt); VdbeCoverageIf(v, op==OP_Gt); + sqlite3ReleaseTempReg(pParse, reg1); + sqlite3ReleaseTempReg(pParse, reg2); + + VdbeModuleComment((v, "CodeRangeTest: end")); +} + +/* +** Helper function for sqlite3WindowCodeStep(). Each call to this function +** generates VM code for a single RETURN_ROW, AGGSTEP or AGGINVERSE +** operation. Refer to the header comment for sqlite3WindowCodeStep() for +** details. +*/ +static int windowCodeOp( + WindowCodeArg *p, /* Context object */ + int op, /* WINDOW_RETURN_ROW, AGGSTEP or AGGINVERSE */ + int regCountdown, /* Register for OP_IfPos countdown */ + int jumpOnEof /* Jump here if stepped cursor reaches EOF */ +){ + int csr, reg; + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; + int ret = 0; + Vdbe *v = p->pVdbe; + int addrContinue = 0; + int bPeer = (pMWin->eFrmType!=TK_ROWS); + + int lblDone = sqlite3VdbeMakeLabel(pParse); + int addrNextRange = 0; + + /* Special case - WINDOW_AGGINVERSE is always a no-op if the frame + ** starts with UNBOUNDED PRECEDING. */ + if( op==WINDOW_AGGINVERSE && pMWin->eStart==TK_UNBOUNDED ){ + assert( regCountdown==0 && jumpOnEof==0 ); + return 0; + } + + if( regCountdown>0 ){ + if( pMWin->eFrmType==TK_RANGE ){ + addrNextRange = sqlite3VdbeCurrentAddr(v); + assert( op==WINDOW_AGGINVERSE || op==WINDOW_AGGSTEP ); + if( op==WINDOW_AGGINVERSE ){ + if( pMWin->eStart==TK_FOLLOWING ){ + windowCodeRangeTest( + p, OP_Le, p->current.csr, regCountdown, p->start.csr, lblDone + ); + }else{ + windowCodeRangeTest( + p, OP_Ge, p->start.csr, regCountdown, p->current.csr, lblDone + ); + } + }else{ + windowCodeRangeTest( + p, OP_Gt, p->end.csr, regCountdown, p->current.csr, lblDone + ); + } + }else{ + sqlite3VdbeAddOp3(v, OP_IfPos, regCountdown, lblDone, 1); + VdbeCoverage(v); + } + } + + if( op==WINDOW_RETURN_ROW && pMWin->regStartRowid==0 ){ + windowAggFinal(p, 0); + } + addrContinue = sqlite3VdbeCurrentAddr(v); + + /* If this is a (RANGE BETWEEN a FOLLOWING AND b FOLLOWING) or + ** (RANGE BETWEEN b PRECEDING AND a PRECEDING) frame, ensure the + ** start cursor does not advance past the end cursor within the + ** temporary table. It otherwise might, if (a>b). */ + if( pMWin->eStart==pMWin->eEnd && regCountdown + && pMWin->eFrmType==TK_RANGE && op==WINDOW_AGGINVERSE + ){ + int regRowid1 = sqlite3GetTempReg(pParse); + int regRowid2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Rowid, p->start.csr, regRowid1); + sqlite3VdbeAddOp2(v, OP_Rowid, p->end.csr, regRowid2); + sqlite3VdbeAddOp3(v, OP_Ge, regRowid2, lblDone, regRowid1); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, regRowid1); + sqlite3ReleaseTempReg(pParse, regRowid2); + assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING ); + } + + switch( op ){ + case WINDOW_RETURN_ROW: + csr = p->current.csr; + reg = p->current.reg; + windowReturnOneRow(p); + break; + + case WINDOW_AGGINVERSE: + csr = p->start.csr; + reg = p->start.reg; + if( pMWin->regStartRowid ){ + assert( pMWin->regEndRowid ); + sqlite3VdbeAddOp2(v, OP_AddImm, pMWin->regStartRowid, 1); + }else{ + windowAggStep(p, pMWin, csr, 1, p->regArg); + } + break; + + default: + assert( op==WINDOW_AGGSTEP ); + csr = p->end.csr; + reg = p->end.reg; + if( pMWin->regStartRowid ){ + assert( pMWin->regEndRowid ); + sqlite3VdbeAddOp2(v, OP_AddImm, pMWin->regEndRowid, 1); + }else{ + windowAggStep(p, pMWin, csr, 0, p->regArg); + } + break; + } + + if( op==p->eDelete ){ + sqlite3VdbeAddOp1(v, OP_Delete, csr); + sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION); + } + + if( jumpOnEof ){ + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + ret = sqlite3VdbeAddOp0(v, OP_Goto); + }else{ + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+1+bPeer); + VdbeCoverage(v); + if( bPeer ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblDone); + } + } + + if( bPeer ){ + int nReg = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); + int regTmp = (nReg ? sqlite3GetTempRange(pParse, nReg) : 0); + windowReadPeerValues(p, csr, regTmp); + windowIfNewPeer(pParse, pMWin->pOrderBy, regTmp, reg, addrContinue); + sqlite3ReleaseTempRange(pParse, regTmp, nReg); + } + + if( addrNextRange ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrNextRange); + } + sqlite3VdbeResolveLabel(v, lblDone); + return ret; +} + + +/* +** Allocate and return a duplicate of the Window object indicated by the +** third argument. Set the Window.pOwner field of the new object to +** pOwner. +*/ +SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ + Window *pNew = 0; + if( ALWAYS(p) ){ + pNew = sqlite3DbMallocZero(db, sizeof(Window)); + if( pNew ){ + pNew->zName = sqlite3DbStrDup(db, p->zName); + pNew->zBase = sqlite3DbStrDup(db, p->zBase); + pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); + pNew->pFunc = p->pFunc; + pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); + pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); + pNew->eFrmType = p->eFrmType; + pNew->eEnd = p->eEnd; + pNew->eStart = p->eStart; + pNew->eExclude = p->eExclude; + pNew->regResult = p->regResult; + pNew->regAccum = p->regAccum; + pNew->iArgCol = p->iArgCol; + pNew->iEphCsr = p->iEphCsr; + pNew->bExprArgs = p->bExprArgs; + pNew->pStart = sqlite3ExprDup(db, p->pStart, 0); + pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0); + pNew->pOwner = pOwner; + pNew->bImplicitFrame = p->bImplicitFrame; + } + } + return pNew; +} + +/* +** Return a copy of the linked list of Window objects passed as the +** second argument. +*/ +SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p){ + Window *pWin; + Window *pRet = 0; + Window **pp = &pRet; + + for(pWin=p; pWin; pWin=pWin->pNextWin){ + *pp = sqlite3WindowDup(db, 0, pWin); + if( *pp==0 ) break; + pp = &((*pp)->pNextWin); + } + + return pRet; +} + +/* +** Return true if it can be determined at compile time that expression +** pExpr evaluates to a value that, when cast to an integer, is greater +** than zero. False otherwise. +** +** If an OOM error occurs, this function sets the Parse.db.mallocFailed +** flag and returns zero. +*/ +static int windowExprGtZero(Parse *pParse, Expr *pExpr){ + int ret = 0; + sqlite3 *db = pParse->db; + sqlite3_value *pVal = 0; + sqlite3ValueFromExpr(db, pExpr, db->enc, SQLITE_AFF_NUMERIC, &pVal); + if( pVal && sqlite3_value_int(pVal)>0 ){ + ret = 1; + } + sqlite3ValueFree(pVal); + return ret; +} + +/* +** sqlite3WhereBegin() has already been called for the SELECT statement +** passed as the second argument when this function is invoked. It generates +** code to populate the Window.regResult register for each window function +** and invoke the sub-routine at instruction addrGosub once for each row. +** sqlite3WhereEnd() is always called before returning. +** +** This function handles several different types of window frames, which +** require slightly different processing. The following pseudo code is +** used to implement window frames of the form: +** +** ROWS BETWEEN PRECEDING AND FOLLOWING +** +** Other window frame types use variants of the following: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** +** if( first row of partition ){ +** // Rewind three cursors, all open on the eph table. +** Rewind(csrEnd); +** Rewind(csrStart); +** Rewind(csrCurrent); +** +** regEnd = // FOLLOWING expression +** regStart = // PRECEDING expression +** }else{ +** // First time this branch is taken, the eph table contains two +** // rows. The first row in the partition, which all three cursors +** // currently point to, and the following row. +** AGGSTEP +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** RETURN ROW +** if( csrCurrent is EOF ) break; +** if( (regStart--)<=0 ){ +** AggInverse(csrStart) +** Next(csrStart) +** } +** } +** +** The pseudo-code above uses the following shorthand: +** +** AGGSTEP: invoke the aggregate xStep() function for each window function +** with arguments read from the current row of cursor csrEnd, then +** step cursor csrEnd forward one row (i.e. sqlite3BtreeNext()). +** +** RETURN_ROW: return a row to the caller based on the contents of the +** current row of csrCurrent and the current state of all +** aggregates. Then step cursor csrCurrent forward one row. +** +** AGGINVERSE: invoke the aggregate xInverse() function for each window +** functions with arguments read from the current row of cursor +** csrStart. Then step csrStart forward one row. +** +** There are two other ROWS window frames that are handled significantly +** differently from the above - "BETWEEN PRECEDING AND PRECEDING" +** and "BETWEEN FOLLOWING AND FOLLOWING". These are special +** cases because they change the order in which the three cursors (csrStart, +** csrCurrent and csrEnd) iterate through the ephemeral table. Cases that +** use UNBOUNDED or CURRENT ROW are much simpler variations on one of these +** three. +** +** ROWS BETWEEN PRECEDING AND PRECEDING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** if( (regEnd--)<=0 ){ +** AGGSTEP +** } +** RETURN_ROW +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** flush: +** if( (regEnd--)<=0 ){ +** AGGSTEP +** } +** RETURN_ROW +** +** +** ROWS BETWEEN FOLLOWING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = regEnd - +** }else{ +** AGGSTEP +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** } +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** if( eof ) break; +** } +** if( (regStart--)<=0 ){ +** AGGINVERSE +** if( eof ) break +** } +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** For the most part, the patterns above are adapted to support UNBOUNDED by +** assuming that it is equivalent to "infinity PRECEDING/FOLLOWING" and +** CURRENT ROW by assuming that it is equivilent to "0 PRECEDING/FOLLOWING". +** This is optimized of course - branches that will never be taken and +** conditions that are always true are omitted from the VM code. The only +** exceptional case is: +** +** ROWS BETWEEN FOLLOWING AND UNBOUNDED FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regStart = +** }else{ +** AGGSTEP +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** if( (regStart--)<=0 ){ +** AGGINVERSE +** if( eof ) break +** } +** RETURN_ROW +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** Also requiring special handling are the cases: +** +** ROWS BETWEEN PRECEDING AND PRECEDING +** ROWS BETWEEN FOLLOWING AND FOLLOWING +** +** when (expr1 < expr2). This is detected at runtime, not by this function. +** To handle this case, the pseudo-code programs depicted above are modified +** slightly to be: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** if( regEnd < regStart ){ +** RETURN_ROW +** delete eph table contents +** continue +** } +** ... +** +** The new "continue" statement in the above jumps to the next iteration +** of the outer loop - the one started by sqlite3WhereBegin(). +** +** The various GROUPS cases are implemented using the same patterns as +** ROWS. The VM code is modified slightly so that: +** +** 1. The else branch in the main loop is only taken if the row just +** added to the ephemeral table is the start of a new group. In +** other words, it becomes: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else if( new group ){ +** ... +** } +** } +** +** 2. Instead of processing a single row, each RETURN_ROW, AGGSTEP or +** AGGINVERSE step processes the current row of the relevant cursor and +** all subsequent rows belonging to the same group. +** +** RANGE window frames are a little different again. As for GROUPS, the +** main loop runs once per group only. And RETURN_ROW, AGGSTEP and AGGINVERSE +** deal in groups instead of rows. As for ROWS and GROUPS, there are three +** basic cases: +** +** RANGE BETWEEN PRECEDING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** AGGSTEP +** while( (csrCurrent.key + regEnd) < csrEnd.key ){ +** RETURN_ROW +** while( csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** RETURN ROW +** if( csrCurrent is EOF ) break; +** while( csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** } +** } +** +** In the above notation, "csr.key" means the current value of the ORDER BY +** expression (there is only ever 1 for a RANGE that uses an FOLLOWING +** or PRECEDING AND PRECEDING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** while( (csrEnd.key + regEnd) <= csrCurrent.key ){ +** AGGSTEP +** } +** while( (csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** } +** } +** flush: +** while( (csrEnd.key + regEnd) <= csrCurrent.key ){ +** AGGSTEP +** } +** while( (csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** +** RANGE BETWEEN FOLLOWING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** AGGSTEP +** while( (csrCurrent.key + regEnd) < csrEnd.key ){ +** while( (csrCurrent.key + regStart) > csrStart.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** while( (csrCurrent.key + regStart) > csrStart.key ){ +** AGGINVERSE +** if( eof ) break "while( 1 )" loop. +** } +** RETURN_ROW +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** The text above leaves out many details. Refer to the code and comments +** below for a more complete picture. +*/ +SQLITE_PRIVATE void sqlite3WindowCodeStep( + Parse *pParse, /* Parse context */ + Select *p, /* Rewritten SELECT statement */ + WhereInfo *pWInfo, /* Context returned by sqlite3WhereBegin() */ + int regGosub, /* Register for OP_Gosub */ + int addrGosub /* OP_Gosub here to return each row */ +){ + Window *pMWin = p->pWin; + ExprList *pOrderBy = pMWin->pOrderBy; + Vdbe *v = sqlite3GetVdbe(pParse); + int csrWrite; /* Cursor used to write to eph. table */ + int csrInput = p->pSrc->a[0].iCursor; /* Cursor of sub-select */ + int nInput = p->pSrc->a[0].pTab->nCol; /* Number of cols returned by sub */ + int iInput; /* To iterate through sub cols */ + int addrNe; /* Address of OP_Ne */ + int addrGosubFlush = 0; /* Address of OP_Gosub to flush: */ + int addrInteger = 0; /* Address of OP_Integer */ + int addrEmpty; /* Address of OP_Rewind in flush: */ + int regNew; /* Array of registers holding new input row */ + int regRecord; /* regNew array in record form */ + int regRowid; /* Rowid for regRecord in eph table */ + int regNewPeer = 0; /* Peer values for new row (part of regNew) */ + int regPeer = 0; /* Peer values for current row */ + int regFlushPart = 0; /* Register for "Gosub flush_partition" */ + WindowCodeArg s; /* Context object for sub-routines */ + int lblWhereEnd; /* Label just before sqlite3WhereEnd() code */ + int regStart = 0; /* Value of PRECEDING */ + int regEnd = 0; /* Value of FOLLOWING */ + + assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_CURRENT + || pMWin->eStart==TK_FOLLOWING || pMWin->eStart==TK_UNBOUNDED + ); + assert( pMWin->eEnd==TK_FOLLOWING || pMWin->eEnd==TK_CURRENT + || pMWin->eEnd==TK_UNBOUNDED || pMWin->eEnd==TK_PRECEDING + ); + assert( pMWin->eExclude==0 || pMWin->eExclude==TK_CURRENT + || pMWin->eExclude==TK_GROUP || pMWin->eExclude==TK_TIES + || pMWin->eExclude==TK_NO + ); + + lblWhereEnd = sqlite3VdbeMakeLabel(pParse); + + /* Fill in the context object */ + memset(&s, 0, sizeof(WindowCodeArg)); + s.pParse = pParse; + s.pMWin = pMWin; + s.pVdbe = v; + s.regGosub = regGosub; + s.addrGosub = addrGosub; + s.current.csr = pMWin->iEphCsr; + csrWrite = s.current.csr+1; + s.start.csr = s.current.csr+2; + s.end.csr = s.current.csr+3; + + /* Figure out when rows may be deleted from the ephemeral table. There + ** are four options - they may never be deleted (eDelete==0), they may + ** be deleted as soon as they are no longer part of the window frame + ** (eDelete==WINDOW_AGGINVERSE), they may be deleted as after the row + ** has been returned to the caller (WINDOW_RETURN_ROW), or they may + ** be deleted after they enter the frame (WINDOW_AGGSTEP). */ + switch( pMWin->eStart ){ + case TK_FOLLOWING: + if( pMWin->eFrmType!=TK_RANGE + && windowExprGtZero(pParse, pMWin->pStart) + ){ + s.eDelete = WINDOW_RETURN_ROW; + } + break; + case TK_UNBOUNDED: + if( windowCacheFrame(pMWin)==0 ){ + if( pMWin->eEnd==TK_PRECEDING ){ + if( pMWin->eFrmType!=TK_RANGE + && windowExprGtZero(pParse, pMWin->pEnd) + ){ + s.eDelete = WINDOW_AGGSTEP; + } + }else{ + s.eDelete = WINDOW_RETURN_ROW; + } + } + break; + default: + s.eDelete = WINDOW_AGGINVERSE; + break; + } + + /* Allocate registers for the array of values from the sub-query, the + ** samve values in record form, and the rowid used to insert said record + ** into the ephemeral table. */ + regNew = pParse->nMem+1; + pParse->nMem += nInput; + regRecord = ++pParse->nMem; + regRowid = ++pParse->nMem; + + /* If the window frame contains an " PRECEDING" or " FOLLOWING" + ** clause, allocate registers to store the results of evaluating each + ** . */ + if( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING ){ + regStart = ++pParse->nMem; + } + if( pMWin->eEnd==TK_PRECEDING || pMWin->eEnd==TK_FOLLOWING ){ + regEnd = ++pParse->nMem; + } + + /* If this is not a "ROWS BETWEEN ..." frame, then allocate arrays of + ** registers to store copies of the ORDER BY expressions (peer values) + ** for the main loop, and for each cursor (start, current and end). */ + if( pMWin->eFrmType!=TK_ROWS ){ + int nPeer = (pOrderBy ? pOrderBy->nExpr : 0); + regNewPeer = regNew + pMWin->nBufferCol; + if( pMWin->pPartition ) regNewPeer += pMWin->pPartition->nExpr; + regPeer = pParse->nMem+1; pParse->nMem += nPeer; + s.start.reg = pParse->nMem+1; pParse->nMem += nPeer; + s.current.reg = pParse->nMem+1; pParse->nMem += nPeer; + s.end.reg = pParse->nMem+1; pParse->nMem += nPeer; + } + + /* Load the column values for the row returned by the sub-select + ** into an array of registers starting at regNew. Assemble them into + ** a record in register regRecord. */ + for(iInput=0; iInputpPartition ){ + int addr; + ExprList *pPart = pMWin->pPartition; + int nPart = pPart->nExpr; + int regNewPart = regNew + pMWin->nBufferCol; + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); + + regFlushPart = ++pParse->nMem; + addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPart, pMWin->regPart, nPart); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, addr+2, addr+4, addr+2); + VdbeCoverageEqNe(v); + addrGosubFlush = sqlite3VdbeAddOp1(v, OP_Gosub, regFlushPart); + VdbeComment((v, "call flush_partition")); + sqlite3VdbeAddOp3(v, OP_Copy, regNewPart, pMWin->regPart, nPart-1); + } + + /* Insert the new row into the ephemeral table */ + sqlite3VdbeAddOp2(v, OP_NewRowid, csrWrite, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, csrWrite, regRecord, regRowid); + addrNe = sqlite3VdbeAddOp3(v, OP_Ne, pMWin->regOne, 0, regRowid); + VdbeCoverageNeverNull(v); + + /* This block is run for the first row of each partition */ + s.regArg = windowInitAccum(pParse, pMWin); + + if( regStart ){ + sqlite3ExprCode(pParse, pMWin->pStart, regStart); + windowCheckValue(pParse, regStart, 0 + (pMWin->eFrmType==TK_RANGE?3:0)); + } + if( regEnd ){ + sqlite3ExprCode(pParse, pMWin->pEnd, regEnd); + windowCheckValue(pParse, regEnd, 1 + (pMWin->eFrmType==TK_RANGE?3:0)); + } + + if( pMWin->eFrmType!=TK_RANGE && pMWin->eStart==pMWin->eEnd && regStart ){ + int op = ((pMWin->eStart==TK_FOLLOWING) ? OP_Ge : OP_Le); + int addrGe = sqlite3VdbeAddOp3(v, op, regStart, 0, regEnd); + VdbeCoverageNeverNullIf(v, op==OP_Ge); /* NeverNull because bound */ + VdbeCoverageNeverNullIf(v, op==OP_Le); /* values previously checked */ + windowAggFinal(&s, 0); + sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1); + VdbeCoverageNeverTaken(v); + windowReturnOneRow(&s); + sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr); + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd); + sqlite3VdbeJumpHere(v, addrGe); + } + if( pMWin->eStart==TK_FOLLOWING && pMWin->eFrmType!=TK_RANGE && regEnd ){ + assert( pMWin->eEnd==TK_FOLLOWING ); + sqlite3VdbeAddOp3(v, OP_Subtract, regStart, regEnd, regStart); + } + + if( pMWin->eStart!=TK_UNBOUNDED ){ + sqlite3VdbeAddOp2(v, OP_Rewind, s.start.csr, 1); + VdbeCoverageNeverTaken(v); + } + sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1); + VdbeCoverageNeverTaken(v); + sqlite3VdbeAddOp2(v, OP_Rewind, s.end.csr, 1); + VdbeCoverageNeverTaken(v); + if( regPeer && pOrderBy ){ + sqlite3VdbeAddOp3(v, OP_Copy, regNewPeer, regPeer, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.start.reg, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.current.reg, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.end.reg, pOrderBy->nExpr-1); + } + + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd); + + sqlite3VdbeJumpHere(v, addrNe); + + /* Beginning of the block executed for the second and subsequent rows. */ + if( regPeer ){ + windowIfNewPeer(pParse, pOrderBy, regNewPeer, regPeer, lblWhereEnd); + } + if( pMWin->eStart==TK_FOLLOWING ){ + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eEnd!=TK_UNBOUNDED ){ + if( pMWin->eFrmType==TK_RANGE ){ + int lbl = sqlite3VdbeMakeLabel(pParse); + int addrNext = sqlite3VdbeCurrentAddr(v); + windowCodeRangeTest(&s, OP_Ge, s.current.csr, regEnd, s.end.csr, lbl); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrNext); + sqlite3VdbeResolveLabel(v, lbl); + }else{ + windowCodeOp(&s, WINDOW_RETURN_ROW, regEnd, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + } + } + }else + if( pMWin->eEnd==TK_PRECEDING ){ + int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE); + windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0); + if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + if( !bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + }else{ + int addr = 0; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eEnd!=TK_UNBOUNDED ){ + if( pMWin->eFrmType==TK_RANGE ){ + int lbl = 0; + addr = sqlite3VdbeCurrentAddr(v); + if( regEnd ){ + lbl = sqlite3VdbeMakeLabel(pParse); + windowCodeRangeTest(&s, OP_Ge, s.current.csr, regEnd, s.end.csr, lbl); + } + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + if( regEnd ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); + sqlite3VdbeResolveLabel(v, lbl); + } + }else{ + if( regEnd ){ + addr = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0, 1); + VdbeCoverage(v); + } + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + if( regEnd ) sqlite3VdbeJumpHere(v, addr); + } + } + } + + /* End of the main input loop */ + sqlite3VdbeResolveLabel(v, lblWhereEnd); + sqlite3WhereEnd(pWInfo); + + /* Fall through */ + if( pMWin->pPartition ){ + addrInteger = sqlite3VdbeAddOp2(v, OP_Integer, 0, regFlushPart); + sqlite3VdbeJumpHere(v, addrGosubFlush); + } + + addrEmpty = sqlite3VdbeAddOp1(v, OP_Rewind, csrWrite); + VdbeCoverage(v); + if( pMWin->eEnd==TK_PRECEDING ){ + int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE); + windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0); + if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + }else if( pMWin->eStart==TK_FOLLOWING ){ + int addrStart; + int addrBreak1; + int addrBreak2; + int addrBreak3; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eFrmType==TK_RANGE ){ + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 1); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + }else + if( pMWin->eEnd==TK_UNBOUNDED ){ + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, regStart, 1); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, 0, 1); + }else{ + assert( pMWin->eEnd==TK_FOLLOWING ); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, regEnd, 1); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 1); + } + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak2); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak3 = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak1); + sqlite3VdbeJumpHere(v, addrBreak3); + }else{ + int addrBreak; + int addrStart; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak); + } + sqlite3VdbeJumpHere(v, addrEmpty); + + sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr); + if( pMWin->pPartition ){ + if( pMWin->regStartRowid ){ + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regStartRowid); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regEndRowid); + } + sqlite3VdbeChangeP1(v, addrInteger, sqlite3VdbeCurrentAddr(v)); + sqlite3VdbeAddOp1(v, OP_Return, regFlushPart); + } +} + +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/************** End of window.c **********************************************/ +/************** Begin file parse.c *******************************************/ +/* +** 2000-05-29 +** +** 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. +** +************************************************************************* +** Driver template for the LEMON parser generator. +** +** The "lemon" program processes an LALR(1) input grammar file, then uses +** this template to construct a parser. The "lemon" program inserts text +** at each "%%" line. Also, any "P-a-r-s-e" identifer prefix (without the +** interstitial "-" characters) contained in this template is changed into +** the value of the %name directive from the grammar. Otherwise, the content +** of this template is copied straight through into the generate parser +** source file. +** +** The following is the concatenation of all %include directives from the +** input grammar file: +*/ +/* #include */ +/* #include */ +/************ Begin %include sections from the grammar ************************/ + +/* #include "sqliteInt.h" */ + +/* +** Disable all error recovery processing in the parser push-down +** automaton. +*/ +#define YYNOERRORRECOVERY 1 + +/* +** Make yytestcase() the same as testcase() +*/ +#define yytestcase(X) testcase(X) + +/* +** Indicate that sqlite3ParserFree() will never be called with a null +** pointer. +*/ +#define YYPARSEFREENEVERNULL 1 + +/* +** In the amalgamation, the parse.c file generated by lemon and the +** tokenize.c file are concatenated. In that case, sqlite3RunParser() +** has access to the the size of the yyParser object and so the parser +** engine can be allocated from stack. In that case, only the +** sqlite3ParserInit() and sqlite3ParserFinalize() routines are invoked +** and the sqlite3ParserAlloc() and sqlite3ParserFree() routines can be +** omitted. +*/ +#ifdef SQLITE_AMALGAMATION +# define sqlite3Parser_ENGINEALWAYSONSTACK 1 +#endif + +/* +** Alternative datatype for the argument to the malloc() routine passed +** into sqlite3ParserAlloc(). The default is size_t. +*/ +#define YYMALLOCARGTYPE u64 + +/* +** An instance of the following structure describes the event of a +** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, +** TK_DELETE, or TK_INSTEAD. If the event is of the form +** +** UPDATE ON (a,b,c) +** +** Then the "b" IdList records the list "a,b,c". +*/ +struct TrigEvent { int a; IdList * b; }; + +struct FrameBound { int eType; Expr *pExpr; }; + +/* +** Disable lookaside memory allocation for objects that might be +** shared across database connections. +*/ +static void disableLookaside(Parse *pParse){ + sqlite3 *db = pParse->db; + pParse->disableLookaside++; + DisableLookaside; +} + + + /* + ** For a compound SELECT statement, make sure p->pPrior->pNext==p for + ** all elements in the list. And make sure list length does not exceed + ** SQLITE_LIMIT_COMPOUND_SELECT. + */ + static void parserDoubleLinkSelect(Parse *pParse, Select *p){ + assert( p!=0 ); + if( p->pPrior ){ + Select *pNext = 0, *pLoop; + int mxSelect, cnt = 0; + for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ + pLoop->pNext = pNext; + pLoop->selFlags |= SF_Compound; + } + if( (p->selFlags & SF_MultiValue)==0 && + (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && + cnt>mxSelect + ){ + sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); + } + } + } + + + /* Construct a new Expr object from a single identifier. Use the + ** new Expr to populate pOut. Set the span of pOut to be the identifier + ** that created the expression. + */ + static Expr *tokenExpr(Parse *pParse, int op, Token t){ + Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); + if( p ){ + /* memset(p, 0, sizeof(Expr)); */ + p->op = (u8)op; + p->affExpr = 0; + p->flags = EP_Leaf; + ExprClearVVAProperties(p); + p->iAgg = -1; + p->pLeft = p->pRight = 0; + p->x.pList = 0; + p->pAggInfo = 0; + p->y.pTab = 0; + p->op2 = 0; + p->iTable = 0; + p->iColumn = 0; + p->u.zToken = (char*)&p[1]; + memcpy(p->u.zToken, t.z, t.n); + p->u.zToken[t.n] = 0; + if( sqlite3Isquote(p->u.zToken[0]) ){ + sqlite3DequoteExpr(p); + } +#if SQLITE_MAX_EXPR_DEPTH>0 + p->nHeight = 1; +#endif + if( IN_RENAME_OBJECT ){ + return (Expr*)sqlite3RenameTokenMap(pParse, (void*)p, &t); + } + } + return p; + } + + + /* A routine to convert a binary TK_IS or TK_ISNOT expression into a + ** unary TK_ISNULL or TK_NOTNULL expression. */ + static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ + sqlite3 *db = pParse->db; + if( pA && pY && pY->op==TK_NULL && !IN_RENAME_OBJECT ){ + pA->op = (u8)op; + sqlite3ExprDelete(db, pA->pRight); + pA->pRight = 0; + } + } + + /* Add a single new term to an ExprList that is used to store a + ** list of identifiers. Report an error if the ID list contains + ** a COLLATE clause or an ASC or DESC keyword, except ignore the + ** error while parsing a legacy schema. + */ + static ExprList *parserAddExprIdListTerm( + Parse *pParse, + ExprList *pPrior, + Token *pIdToken, + int hasCollate, + int sortOrder + ){ + ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0); + if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED) + && pParse->db->init.busy==0 + ){ + sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"", + pIdToken->n, pIdToken->z); + } + sqlite3ExprListSetName(pParse, p, pIdToken, 1); + return p; + } + +#if TK_SPAN>255 +# error too many tokens in the grammar +#endif +/**************** End of %include directives **********************************/ +/* These constants specify the various numeric values for terminal symbols +** in a format understandable to "makeheaders". This section is blank unless +** "lemon" is run with the "-m" command-line option. +***************** Begin makeheaders token definitions *************************/ +/**************** End makeheaders token definitions ***************************/ + +/* The next sections is a series of control #defines. +** various aspects of the generated parser. +** YYCODETYPE is the data type used to store the integer codes +** that represent terminal and non-terminal symbols. +** "unsigned char" is used if there are fewer than +** 256 symbols. Larger types otherwise. +** YYNOCODE is a number of type YYCODETYPE that is not used for +** any terminal or nonterminal symbol. +** YYFALLBACK If defined, this indicates that one or more tokens +** (also known as: "terminal symbols") have fall-back +** values which should be used if the original symbol +** would not parse. This permits keywords to sometimes +** be used as identifiers, for example. +** YYACTIONTYPE is the data type used for "action codes" - numbers +** that indicate what to do in response to the next +** token. +** sqlite3ParserTOKENTYPE is the data type used for minor type for terminal +** symbols. Background: A "minor type" is a semantic +** value associated with a terminal or non-terminal +** symbols. For example, for an "ID" terminal symbol, +** the minor type might be the name of the identifier. +** Each non-terminal can have a different minor type. +** Terminal symbols all have the same minor type, though. +** This macros defines the minor type for terminal +** symbols. +** YYMINORTYPE is the data type used for all minor types. +** This is typically a union of many types, one of +** which is sqlite3ParserTOKENTYPE. The entry in the union +** for terminal symbols is called "yy0". +** YYSTACKDEPTH is the maximum depth of the parser's stack. If +** zero the stack is dynamically sized using realloc() +** sqlite3ParserARG_SDECL A static variable declaration for the %extra_argument +** sqlite3ParserARG_PDECL A parameter declaration for the %extra_argument +** sqlite3ParserARG_PARAM Code to pass %extra_argument as a subroutine parameter +** sqlite3ParserARG_STORE Code to store %extra_argument into yypParser +** sqlite3ParserARG_FETCH Code to extract %extra_argument from yypParser +** sqlite3ParserCTX_* As sqlite3ParserARG_ except for %extra_context +** YYERRORSYMBOL is the code number of the error symbol. If not +** defined, then do no error processing. +** YYNSTATE the combined number of states. +** YYNRULE the number of rules in the grammar +** YYNTOKEN Number of terminal symbols +** YY_MAX_SHIFT Maximum value for shift actions +** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions +** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions +** YY_ERROR_ACTION The yy_action[] code for syntax error +** YY_ACCEPT_ACTION The yy_action[] code for accept +** YY_NO_ACTION The yy_action[] code for no-op +** YY_MIN_REDUCE Minimum value for reduce actions +** YY_MAX_REDUCE Maximum value for reduce actions +*/ +#ifndef INTERFACE +# define INTERFACE 1 +#endif +/************* Begin control #defines *****************************************/ +#define YYCODETYPE unsigned short int +#define YYNOCODE 310 +#define YYACTIONTYPE unsigned short int +#define YYWILDCARD 100 +#define sqlite3ParserTOKENTYPE Token +typedef union { + int yyinit; + sqlite3ParserTOKENTYPE yy0; + SrcList* yy47; + u8 yy58; + struct FrameBound yy77; + With* yy131; + int yy192; + Expr* yy202; + struct {int value; int mask;} yy207; + struct TrigEvent yy230; + ExprList* yy242; + Window* yy303; + Upsert* yy318; + const char* yy436; + TriggerStep* yy447; + Select* yy539; + IdList* yy600; +} YYMINORTYPE; +#ifndef YYSTACKDEPTH +#define YYSTACKDEPTH 100 +#endif +#define sqlite3ParserARG_SDECL +#define sqlite3ParserARG_PDECL +#define sqlite3ParserARG_PARAM +#define sqlite3ParserARG_FETCH +#define sqlite3ParserARG_STORE +#define sqlite3ParserCTX_SDECL Parse *pParse; +#define sqlite3ParserCTX_PDECL ,Parse *pParse +#define sqlite3ParserCTX_PARAM ,pParse +#define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse; +#define sqlite3ParserCTX_STORE yypParser->pParse=pParse; +#define YYFALLBACK 1 +#define YYNSTATE 551 +#define YYNRULE 385 +#define YYNRULE_WITH_ACTION 325 +#define YYNTOKEN 181 +#define YY_MAX_SHIFT 550 +#define YY_MIN_SHIFTREDUCE 801 +#define YY_MAX_SHIFTREDUCE 1185 +#define YY_ERROR_ACTION 1186 +#define YY_ACCEPT_ACTION 1187 +#define YY_NO_ACTION 1188 +#define YY_MIN_REDUCE 1189 +#define YY_MAX_REDUCE 1573 +/************* End control #defines *******************************************/ +#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) + +/* Define the yytestcase() macro to be a no-op if is not already defined +** otherwise. +** +** Applications can choose to define yytestcase() in the %include section +** to a macro that can assist in verifying code coverage. For production +** code the yytestcase() macro should be turned off. But it is useful +** for testing. +*/ +#ifndef yytestcase +# define yytestcase(X) +#endif + + +/* Next are the tables used to determine what action to take based on the +** current state and lookahead token. These tables are used to implement +** functions that take a state number and lookahead value and return an +** action integer. +** +** Suppose the action integer is N. Then the action is determined as +** follows +** +** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead +** token onto the stack and goto state N. +** +** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then +** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. +** +** N == YY_ERROR_ACTION A syntax error has occurred. +** +** N == YY_ACCEPT_ACTION The parser accepts its input. +** +** N == YY_NO_ACTION No such action. Denotes unused +** slots in the yy_action[] table. +** +** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE +** and YY_MAX_REDUCE +** +** The action table is constructed as a single large table named yy_action[]. +** Given state S and lookahead X, the action is computed as either: +** +** (A) N = yy_action[ yy_shift_ofst[S] + X ] +** (B) N = yy_default[S] +** +** The (A) formula is preferred. The B formula is used instead if +** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X. +** +** The formulas above are for computing the action when the lookahead is +** a terminal symbol. If the lookahead is a non-terminal (as occurs after +** a reduce action) then the yy_reduce_ofst[] array is used in place of +** the yy_shift_ofst[] array. +** +** The following are the tables generated in this section: +** +** yy_action[] A single table containing all actions. +** yy_lookahead[] A table containing the lookahead for each entry in +** yy_action. Used to detect hash collisions. +** yy_shift_ofst[] For each state, the offset into yy_action for +** shifting terminals. +** yy_reduce_ofst[] For each state, the offset into yy_action for +** shifting non-terminals after a reduce. +** yy_default[] Default action for each state. +** +*********** Begin parsing tables **********************************************/ +#define YY_ACTTAB_COUNT (1958) +static const YYACTIONTYPE yy_action[] = { + /* 0 */ 544, 1220, 544, 449, 1258, 544, 1237, 544, 114, 111, + /* 10 */ 211, 544, 1535, 544, 1258, 521, 114, 111, 211, 390, + /* 20 */ 1230, 342, 42, 42, 42, 42, 1223, 42, 42, 71, + /* 30 */ 71, 935, 1222, 71, 71, 71, 71, 1460, 1491, 936, + /* 40 */ 818, 451, 6, 121, 122, 112, 1163, 1163, 1004, 1007, + /* 50 */ 997, 997, 119, 119, 120, 120, 120, 120, 1541, 390, + /* 60 */ 1356, 1515, 550, 2, 1191, 194, 526, 434, 143, 291, + /* 70 */ 526, 136, 526, 369, 261, 502, 272, 383, 1271, 525, + /* 80 */ 501, 491, 164, 121, 122, 112, 1163, 1163, 1004, 1007, + /* 90 */ 997, 997, 119, 119, 120, 120, 120, 120, 1356, 440, + /* 100 */ 1512, 118, 118, 118, 118, 117, 117, 116, 116, 116, + /* 110 */ 115, 422, 266, 266, 266, 266, 1496, 356, 1498, 433, + /* 120 */ 355, 1496, 515, 522, 1483, 541, 1112, 541, 1112, 390, + /* 130 */ 403, 241, 208, 114, 111, 211, 98, 290, 535, 221, + /* 140 */ 1027, 118, 118, 118, 118, 117, 117, 116, 116, 116, + /* 150 */ 115, 422, 1140, 121, 122, 112, 1163, 1163, 1004, 1007, + /* 160 */ 997, 997, 119, 119, 120, 120, 120, 120, 404, 426, + /* 170 */ 117, 117, 116, 116, 116, 115, 422, 1416, 466, 123, + /* 180 */ 118, 118, 118, 118, 117, 117, 116, 116, 116, 115, + /* 190 */ 422, 116, 116, 116, 115, 422, 538, 538, 538, 390, + /* 200 */ 503, 120, 120, 120, 120, 113, 1049, 1140, 1141, 1142, + /* 210 */ 1049, 118, 118, 118, 118, 117, 117, 116, 116, 116, + /* 220 */ 115, 422, 1459, 121, 122, 112, 1163, 1163, 1004, 1007, + /* 230 */ 997, 997, 119, 119, 120, 120, 120, 120, 390, 442, + /* 240 */ 314, 83, 461, 81, 357, 380, 1140, 80, 118, 118, + /* 250 */ 118, 118, 117, 117, 116, 116, 116, 115, 422, 179, + /* 260 */ 432, 422, 121, 122, 112, 1163, 1163, 1004, 1007, 997, + /* 270 */ 997, 119, 119, 120, 120, 120, 120, 432, 431, 266, + /* 280 */ 266, 118, 118, 118, 118, 117, 117, 116, 116, 116, + /* 290 */ 115, 422, 541, 1107, 901, 504, 1140, 114, 111, 211, + /* 300 */ 1429, 1140, 1141, 1142, 206, 489, 1107, 390, 447, 1107, + /* 310 */ 543, 328, 120, 120, 120, 120, 298, 1429, 1431, 17, + /* 320 */ 118, 118, 118, 118, 117, 117, 116, 116, 116, 115, + /* 330 */ 422, 121, 122, 112, 1163, 1163, 1004, 1007, 997, 997, + /* 340 */ 119, 119, 120, 120, 120, 120, 390, 1356, 432, 1140, + /* 350 */ 480, 1140, 1141, 1142, 994, 994, 1005, 1008, 443, 118, + /* 360 */ 118, 118, 118, 117, 117, 116, 116, 116, 115, 422, + /* 370 */ 121, 122, 112, 1163, 1163, 1004, 1007, 997, 997, 119, + /* 380 */ 119, 120, 120, 120, 120, 1052, 1052, 463, 1429, 118, + /* 390 */ 118, 118, 118, 117, 117, 116, 116, 116, 115, 422, + /* 400 */ 1140, 449, 544, 1424, 1140, 1141, 1142, 233, 964, 1140, + /* 410 */ 479, 476, 475, 171, 358, 390, 164, 405, 412, 840, + /* 420 */ 474, 164, 185, 332, 71, 71, 1241, 998, 118, 118, + /* 430 */ 118, 118, 117, 117, 116, 116, 116, 115, 422, 121, + /* 440 */ 122, 112, 1163, 1163, 1004, 1007, 997, 997, 119, 119, + /* 450 */ 120, 120, 120, 120, 390, 1140, 1141, 1142, 833, 12, + /* 460 */ 313, 507, 163, 354, 1140, 1141, 1142, 114, 111, 211, + /* 470 */ 506, 290, 535, 544, 276, 180, 290, 535, 121, 122, + /* 480 */ 112, 1163, 1163, 1004, 1007, 997, 997, 119, 119, 120, + /* 490 */ 120, 120, 120, 343, 482, 71, 71, 118, 118, 118, + /* 500 */ 118, 117, 117, 116, 116, 116, 115, 422, 1140, 209, + /* 510 */ 409, 521, 1140, 1107, 1569, 376, 252, 269, 340, 485, + /* 520 */ 335, 484, 238, 390, 511, 362, 1107, 1125, 331, 1107, + /* 530 */ 191, 407, 286, 32, 455, 441, 118, 118, 118, 118, + /* 540 */ 117, 117, 116, 116, 116, 115, 422, 121, 122, 112, + /* 550 */ 1163, 1163, 1004, 1007, 997, 997, 119, 119, 120, 120, + /* 560 */ 120, 120, 390, 1140, 1141, 1142, 985, 1140, 1141, 1142, + /* 570 */ 1140, 233, 490, 1490, 479, 476, 475, 6, 163, 544, + /* 580 */ 510, 544, 115, 422, 474, 5, 121, 122, 112, 1163, + /* 590 */ 1163, 1004, 1007, 997, 997, 119, 119, 120, 120, 120, + /* 600 */ 120, 13, 13, 13, 13, 118, 118, 118, 118, 117, + /* 610 */ 117, 116, 116, 116, 115, 422, 401, 500, 406, 544, + /* 620 */ 1484, 542, 1140, 890, 890, 1140, 1141, 1142, 1471, 1140, + /* 630 */ 275, 390, 806, 807, 808, 969, 420, 420, 420, 16, + /* 640 */ 16, 55, 55, 1240, 118, 118, 118, 118, 117, 117, + /* 650 */ 116, 116, 116, 115, 422, 121, 122, 112, 1163, 1163, + /* 660 */ 1004, 1007, 997, 997, 119, 119, 120, 120, 120, 120, + /* 670 */ 390, 1187, 1, 1, 550, 2, 1191, 1140, 1141, 1142, + /* 680 */ 194, 291, 896, 136, 1140, 1141, 1142, 895, 519, 1490, + /* 690 */ 1271, 3, 378, 6, 121, 122, 112, 1163, 1163, 1004, + /* 700 */ 1007, 997, 997, 119, 119, 120, 120, 120, 120, 856, + /* 710 */ 544, 922, 544, 118, 118, 118, 118, 117, 117, 116, + /* 720 */ 116, 116, 115, 422, 266, 266, 1090, 1567, 1140, 549, + /* 730 */ 1567, 1191, 13, 13, 13, 13, 291, 541, 136, 390, + /* 740 */ 483, 419, 418, 964, 342, 1271, 466, 408, 857, 279, + /* 750 */ 140, 221, 118, 118, 118, 118, 117, 117, 116, 116, + /* 760 */ 116, 115, 422, 121, 122, 112, 1163, 1163, 1004, 1007, + /* 770 */ 997, 997, 119, 119, 120, 120, 120, 120, 544, 266, + /* 780 */ 266, 426, 390, 1140, 1141, 1142, 1170, 828, 1170, 466, + /* 790 */ 429, 145, 541, 1144, 399, 313, 437, 301, 836, 1488, + /* 800 */ 71, 71, 410, 6, 1088, 471, 221, 100, 112, 1163, + /* 810 */ 1163, 1004, 1007, 997, 997, 119, 119, 120, 120, 120, + /* 820 */ 120, 118, 118, 118, 118, 117, 117, 116, 116, 116, + /* 830 */ 115, 422, 237, 1423, 544, 449, 426, 287, 984, 544, + /* 840 */ 236, 235, 234, 828, 97, 527, 427, 1263, 1263, 1144, + /* 850 */ 492, 306, 428, 836, 975, 544, 71, 71, 974, 1239, + /* 860 */ 544, 51, 51, 300, 118, 118, 118, 118, 117, 117, + /* 870 */ 116, 116, 116, 115, 422, 194, 103, 70, 70, 266, + /* 880 */ 266, 544, 71, 71, 266, 266, 30, 389, 342, 974, + /* 890 */ 974, 976, 541, 526, 1107, 326, 390, 541, 493, 395, + /* 900 */ 1468, 195, 528, 13, 13, 1356, 240, 1107, 277, 280, + /* 910 */ 1107, 280, 303, 455, 305, 331, 390, 31, 188, 417, + /* 920 */ 121, 122, 112, 1163, 1163, 1004, 1007, 997, 997, 119, + /* 930 */ 119, 120, 120, 120, 120, 142, 390, 363, 455, 984, + /* 940 */ 121, 122, 112, 1163, 1163, 1004, 1007, 997, 997, 119, + /* 950 */ 119, 120, 120, 120, 120, 975, 321, 1140, 324, 974, + /* 960 */ 121, 110, 112, 1163, 1163, 1004, 1007, 997, 997, 119, + /* 970 */ 119, 120, 120, 120, 120, 462, 375, 1183, 118, 118, + /* 980 */ 118, 118, 117, 117, 116, 116, 116, 115, 422, 1140, + /* 990 */ 974, 974, 976, 304, 9, 364, 244, 360, 118, 118, + /* 1000 */ 118, 118, 117, 117, 116, 116, 116, 115, 422, 312, + /* 1010 */ 544, 342, 1140, 1141, 1142, 299, 290, 535, 118, 118, + /* 1020 */ 118, 118, 117, 117, 116, 116, 116, 115, 422, 1261, + /* 1030 */ 1261, 1161, 13, 13, 278, 419, 418, 466, 390, 921, + /* 1040 */ 260, 260, 289, 1167, 1140, 1141, 1142, 189, 1169, 266, + /* 1050 */ 266, 466, 388, 541, 1184, 544, 1168, 263, 144, 487, + /* 1060 */ 920, 544, 541, 122, 112, 1163, 1163, 1004, 1007, 997, + /* 1070 */ 997, 119, 119, 120, 120, 120, 120, 71, 71, 1140, + /* 1080 */ 1170, 1270, 1170, 13, 13, 896, 1068, 1161, 544, 466, + /* 1090 */ 895, 107, 536, 1489, 4, 1266, 1107, 6, 523, 1047, + /* 1100 */ 12, 1069, 1090, 1568, 311, 453, 1568, 518, 539, 1107, + /* 1110 */ 56, 56, 1107, 1487, 421, 1356, 1070, 6, 343, 285, + /* 1120 */ 118, 118, 118, 118, 117, 117, 116, 116, 116, 115, + /* 1130 */ 422, 423, 1269, 319, 1140, 1141, 1142, 876, 266, 266, + /* 1140 */ 1275, 107, 536, 533, 4, 1486, 293, 877, 1209, 6, + /* 1150 */ 210, 541, 541, 164, 1540, 494, 414, 865, 539, 267, + /* 1160 */ 267, 1212, 396, 509, 497, 204, 266, 266, 394, 529, + /* 1170 */ 8, 984, 541, 517, 544, 920, 456, 105, 105, 541, + /* 1180 */ 1088, 423, 266, 266, 106, 415, 423, 546, 545, 266, + /* 1190 */ 266, 974, 516, 533, 1371, 541, 15, 15, 266, 266, + /* 1200 */ 454, 1118, 541, 266, 266, 1068, 1370, 513, 290, 535, + /* 1210 */ 544, 541, 512, 97, 442, 314, 541, 544, 920, 125, + /* 1220 */ 1069, 984, 974, 974, 976, 977, 27, 105, 105, 399, + /* 1230 */ 341, 1509, 44, 44, 106, 1070, 423, 546, 545, 57, + /* 1240 */ 57, 974, 341, 1509, 107, 536, 544, 4, 460, 399, + /* 1250 */ 214, 1118, 457, 294, 375, 1089, 532, 297, 544, 537, + /* 1260 */ 396, 539, 290, 535, 104, 244, 102, 524, 58, 58, + /* 1270 */ 544, 109, 974, 974, 976, 977, 27, 1514, 1129, 425, + /* 1280 */ 59, 59, 270, 237, 423, 138, 95, 373, 373, 372, + /* 1290 */ 255, 370, 60, 60, 815, 1178, 533, 544, 273, 544, + /* 1300 */ 1161, 843, 387, 386, 544, 1307, 544, 215, 210, 296, + /* 1310 */ 513, 847, 544, 265, 208, 514, 1306, 295, 274, 61, + /* 1320 */ 61, 62, 62, 436, 984, 1160, 45, 45, 46, 46, + /* 1330 */ 105, 105, 1184, 920, 47, 47, 1474, 106, 544, 423, + /* 1340 */ 546, 545, 218, 544, 974, 935, 1085, 217, 544, 377, + /* 1350 */ 395, 107, 536, 936, 4, 156, 1161, 843, 158, 544, + /* 1360 */ 49, 49, 141, 544, 38, 50, 50, 544, 539, 307, + /* 1370 */ 63, 63, 544, 1448, 216, 974, 974, 976, 977, 27, + /* 1380 */ 444, 64, 64, 544, 1447, 65, 65, 544, 524, 14, + /* 1390 */ 14, 423, 458, 544, 66, 66, 310, 544, 316, 97, + /* 1400 */ 1034, 544, 961, 533, 268, 127, 127, 544, 391, 67, + /* 1410 */ 67, 544, 978, 290, 535, 52, 52, 513, 544, 68, + /* 1420 */ 68, 1294, 512, 69, 69, 397, 165, 855, 854, 53, + /* 1430 */ 53, 984, 966, 151, 151, 243, 430, 105, 105, 199, + /* 1440 */ 152, 152, 448, 1303, 106, 243, 423, 546, 545, 1129, + /* 1450 */ 425, 974, 320, 270, 862, 863, 1034, 220, 373, 373, + /* 1460 */ 372, 255, 370, 450, 323, 815, 243, 544, 978, 544, + /* 1470 */ 107, 536, 544, 4, 544, 938, 939, 325, 215, 1046, + /* 1480 */ 296, 1046, 974, 974, 976, 977, 27, 539, 295, 76, + /* 1490 */ 76, 54, 54, 327, 72, 72, 128, 128, 1503, 1254, + /* 1500 */ 107, 536, 544, 4, 1045, 544, 1045, 531, 1238, 544, + /* 1510 */ 423, 544, 315, 334, 544, 97, 544, 539, 217, 544, + /* 1520 */ 472, 1528, 533, 239, 73, 73, 156, 129, 129, 158, + /* 1530 */ 467, 130, 130, 126, 126, 344, 150, 150, 149, 149, + /* 1540 */ 423, 134, 134, 329, 1030, 216, 97, 239, 929, 345, + /* 1550 */ 984, 243, 533, 1315, 339, 544, 105, 105, 900, 1355, + /* 1560 */ 544, 1290, 258, 106, 338, 423, 546, 545, 544, 1301, + /* 1570 */ 974, 893, 99, 536, 109, 4, 544, 133, 133, 391, + /* 1580 */ 984, 197, 131, 131, 290, 535, 105, 105, 530, 539, + /* 1590 */ 132, 132, 1361, 106, 1219, 423, 546, 545, 75, 75, + /* 1600 */ 974, 974, 974, 976, 977, 27, 544, 430, 826, 1211, + /* 1610 */ 894, 139, 423, 109, 544, 1200, 1199, 1201, 1522, 544, + /* 1620 */ 201, 544, 11, 374, 533, 1287, 347, 349, 77, 77, + /* 1630 */ 1340, 974, 974, 976, 977, 27, 74, 74, 351, 213, + /* 1640 */ 435, 43, 43, 48, 48, 302, 477, 309, 1348, 382, + /* 1650 */ 353, 452, 984, 337, 1237, 1420, 1419, 205, 105, 105, + /* 1660 */ 192, 367, 193, 534, 1525, 106, 1178, 423, 546, 545, + /* 1670 */ 247, 167, 974, 270, 1467, 200, 1465, 1175, 373, 373, + /* 1680 */ 372, 255, 370, 398, 79, 815, 83, 82, 1425, 446, + /* 1690 */ 161, 177, 169, 95, 1337, 438, 172, 173, 215, 174, + /* 1700 */ 296, 175, 35, 974, 974, 976, 977, 27, 295, 1345, + /* 1710 */ 439, 470, 223, 36, 379, 445, 1414, 381, 459, 1351, + /* 1720 */ 181, 227, 88, 465, 259, 229, 1436, 318, 186, 468, + /* 1730 */ 322, 230, 384, 1202, 231, 486, 1257, 1256, 217, 411, + /* 1740 */ 1255, 1248, 90, 847, 206, 413, 156, 505, 1539, 158, + /* 1750 */ 1226, 1538, 283, 1508, 1227, 336, 385, 284, 1225, 496, + /* 1760 */ 1537, 1298, 94, 346, 348, 216, 1247, 499, 1299, 245, + /* 1770 */ 246, 1297, 416, 350, 1494, 124, 1493, 10, 524, 361, + /* 1780 */ 1400, 101, 96, 288, 508, 253, 1135, 1208, 34, 1296, + /* 1790 */ 547, 254, 256, 257, 392, 548, 1197, 1192, 359, 391, + /* 1800 */ 1280, 1279, 196, 365, 290, 535, 366, 352, 1452, 1322, + /* 1810 */ 1321, 1453, 153, 137, 281, 154, 802, 424, 155, 1451, + /* 1820 */ 1450, 198, 292, 202, 203, 78, 212, 430, 271, 135, + /* 1830 */ 1044, 1042, 958, 168, 219, 157, 170, 879, 308, 222, + /* 1840 */ 1058, 176, 159, 962, 400, 84, 402, 178, 85, 86, + /* 1850 */ 87, 166, 160, 393, 1061, 224, 225, 1057, 146, 18, + /* 1860 */ 226, 317, 1050, 1172, 243, 464, 182, 228, 37, 183, + /* 1870 */ 817, 469, 338, 232, 330, 481, 184, 89, 845, 19, + /* 1880 */ 20, 92, 473, 478, 333, 91, 162, 858, 147, 488, + /* 1890 */ 282, 1123, 148, 1010, 928, 1093, 39, 93, 40, 495, + /* 1900 */ 1094, 187, 498, 207, 262, 264, 923, 242, 1109, 109, + /* 1910 */ 1113, 1111, 1097, 33, 21, 1117, 520, 1025, 22, 23, + /* 1920 */ 24, 1116, 25, 190, 97, 1011, 1009, 26, 1013, 1067, + /* 1930 */ 248, 7, 1066, 249, 1014, 28, 41, 889, 979, 827, + /* 1940 */ 108, 29, 250, 540, 251, 1530, 371, 368, 1131, 1130, + /* 1950 */ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1529, +}; +static const YYCODETYPE yy_lookahead[] = { + /* 0 */ 189, 211, 189, 189, 218, 189, 220, 189, 267, 268, + /* 10 */ 269, 189, 210, 189, 228, 189, 267, 268, 269, 19, + /* 20 */ 218, 189, 211, 212, 211, 212, 211, 211, 212, 211, + /* 30 */ 212, 31, 211, 211, 212, 211, 212, 288, 300, 39, + /* 40 */ 21, 189, 304, 43, 44, 45, 46, 47, 48, 49, + /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 225, 19, + /* 60 */ 189, 183, 184, 185, 186, 189, 248, 263, 236, 191, + /* 70 */ 248, 193, 248, 197, 208, 257, 262, 201, 200, 257, + /* 80 */ 200, 257, 81, 43, 44, 45, 46, 47, 48, 49, + /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 189, 80, + /* 100 */ 189, 101, 102, 103, 104, 105, 106, 107, 108, 109, + /* 110 */ 110, 111, 234, 235, 234, 235, 305, 306, 305, 118, + /* 120 */ 307, 305, 306, 297, 298, 247, 86, 247, 88, 19, + /* 130 */ 259, 251, 252, 267, 268, 269, 26, 136, 137, 261, + /* 140 */ 121, 101, 102, 103, 104, 105, 106, 107, 108, 109, + /* 150 */ 110, 111, 59, 43, 44, 45, 46, 47, 48, 49, + /* 160 */ 50, 51, 52, 53, 54, 55, 56, 57, 259, 291, + /* 170 */ 105, 106, 107, 108, 109, 110, 111, 158, 189, 69, + /* 180 */ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + /* 190 */ 111, 107, 108, 109, 110, 111, 205, 206, 207, 19, + /* 200 */ 19, 54, 55, 56, 57, 58, 29, 114, 115, 116, + /* 210 */ 33, 101, 102, 103, 104, 105, 106, 107, 108, 109, + /* 220 */ 110, 111, 233, 43, 44, 45, 46, 47, 48, 49, + /* 230 */ 50, 51, 52, 53, 54, 55, 56, 57, 19, 126, + /* 240 */ 127, 148, 65, 24, 214, 200, 59, 67, 101, 102, + /* 250 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 22, + /* 260 */ 189, 111, 43, 44, 45, 46, 47, 48, 49, 50, + /* 270 */ 51, 52, 53, 54, 55, 56, 57, 206, 207, 234, + /* 280 */ 235, 101, 102, 103, 104, 105, 106, 107, 108, 109, + /* 290 */ 110, 111, 247, 76, 107, 114, 59, 267, 268, 269, + /* 300 */ 189, 114, 115, 116, 162, 163, 89, 19, 263, 92, + /* 310 */ 189, 23, 54, 55, 56, 57, 189, 206, 207, 22, + /* 320 */ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + /* 330 */ 111, 43, 44, 45, 46, 47, 48, 49, 50, 51, + /* 340 */ 52, 53, 54, 55, 56, 57, 19, 189, 277, 59, + /* 350 */ 23, 114, 115, 116, 46, 47, 48, 49, 61, 101, + /* 360 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + /* 370 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 380 */ 53, 54, 55, 56, 57, 125, 126, 127, 277, 101, + /* 390 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + /* 400 */ 59, 189, 189, 276, 114, 115, 116, 117, 73, 59, + /* 410 */ 120, 121, 122, 72, 214, 19, 81, 259, 19, 23, + /* 420 */ 130, 81, 72, 24, 211, 212, 221, 119, 101, 102, + /* 430 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 43, + /* 440 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + /* 450 */ 54, 55, 56, 57, 19, 114, 115, 116, 23, 208, + /* 460 */ 125, 248, 189, 189, 114, 115, 116, 267, 268, 269, + /* 470 */ 189, 136, 137, 189, 262, 22, 136, 137, 43, 44, + /* 480 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + /* 490 */ 55, 56, 57, 189, 95, 211, 212, 101, 102, 103, + /* 500 */ 104, 105, 106, 107, 108, 109, 110, 111, 59, 189, + /* 510 */ 111, 189, 59, 76, 294, 295, 117, 118, 119, 120, + /* 520 */ 121, 122, 123, 19, 87, 189, 89, 23, 129, 92, + /* 530 */ 279, 227, 248, 22, 189, 284, 101, 102, 103, 104, + /* 540 */ 105, 106, 107, 108, 109, 110, 111, 43, 44, 45, + /* 550 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + /* 560 */ 56, 57, 19, 114, 115, 116, 23, 114, 115, 116, + /* 570 */ 59, 117, 299, 300, 120, 121, 122, 304, 189, 189, + /* 580 */ 143, 189, 110, 111, 130, 22, 43, 44, 45, 46, + /* 590 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 600 */ 57, 211, 212, 211, 212, 101, 102, 103, 104, 105, + /* 610 */ 106, 107, 108, 109, 110, 111, 226, 189, 226, 189, + /* 620 */ 298, 132, 59, 134, 135, 114, 115, 116, 189, 59, + /* 630 */ 285, 19, 7, 8, 9, 23, 205, 206, 207, 211, + /* 640 */ 212, 211, 212, 221, 101, 102, 103, 104, 105, 106, + /* 650 */ 107, 108, 109, 110, 111, 43, 44, 45, 46, 47, + /* 660 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 670 */ 19, 181, 182, 183, 184, 185, 186, 114, 115, 116, + /* 680 */ 189, 191, 133, 193, 114, 115, 116, 138, 299, 300, + /* 690 */ 200, 22, 201, 304, 43, 44, 45, 46, 47, 48, + /* 700 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 35, + /* 710 */ 189, 141, 189, 101, 102, 103, 104, 105, 106, 107, + /* 720 */ 108, 109, 110, 111, 234, 235, 22, 23, 59, 184, + /* 730 */ 26, 186, 211, 212, 211, 212, 191, 247, 193, 19, + /* 740 */ 66, 105, 106, 73, 189, 200, 189, 226, 74, 226, + /* 750 */ 22, 261, 101, 102, 103, 104, 105, 106, 107, 108, + /* 760 */ 109, 110, 111, 43, 44, 45, 46, 47, 48, 49, + /* 770 */ 50, 51, 52, 53, 54, 55, 56, 57, 189, 234, + /* 780 */ 235, 291, 19, 114, 115, 116, 150, 59, 152, 189, + /* 790 */ 233, 236, 247, 59, 189, 125, 126, 127, 59, 300, + /* 800 */ 211, 212, 128, 304, 100, 19, 261, 156, 45, 46, + /* 810 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 820 */ 57, 101, 102, 103, 104, 105, 106, 107, 108, 109, + /* 830 */ 110, 111, 46, 233, 189, 189, 291, 248, 99, 189, + /* 840 */ 125, 126, 127, 115, 26, 200, 289, 230, 231, 115, + /* 850 */ 200, 16, 189, 114, 115, 189, 211, 212, 119, 221, + /* 860 */ 189, 211, 212, 258, 101, 102, 103, 104, 105, 106, + /* 870 */ 107, 108, 109, 110, 111, 189, 156, 211, 212, 234, + /* 880 */ 235, 189, 211, 212, 234, 235, 22, 201, 189, 150, + /* 890 */ 151, 152, 247, 248, 76, 16, 19, 247, 248, 113, + /* 900 */ 189, 24, 257, 211, 212, 189, 26, 89, 262, 223, + /* 910 */ 92, 225, 77, 189, 79, 129, 19, 53, 226, 248, + /* 920 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 930 */ 53, 54, 55, 56, 57, 236, 19, 271, 189, 99, + /* 940 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 950 */ 53, 54, 55, 56, 57, 115, 77, 59, 79, 119, + /* 960 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 970 */ 53, 54, 55, 56, 57, 259, 22, 23, 101, 102, + /* 980 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 59, + /* 990 */ 150, 151, 152, 158, 22, 244, 24, 246, 101, 102, + /* 1000 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 285, + /* 1010 */ 189, 189, 114, 115, 116, 200, 136, 137, 101, 102, + /* 1020 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 230, + /* 1030 */ 231, 59, 211, 212, 285, 105, 106, 189, 19, 141, + /* 1040 */ 234, 235, 239, 113, 114, 115, 116, 226, 118, 234, + /* 1050 */ 235, 189, 249, 247, 100, 189, 126, 23, 236, 107, + /* 1060 */ 26, 189, 247, 44, 45, 46, 47, 48, 49, 50, + /* 1070 */ 51, 52, 53, 54, 55, 56, 57, 211, 212, 59, + /* 1080 */ 150, 233, 152, 211, 212, 133, 12, 115, 189, 189, + /* 1090 */ 138, 19, 20, 300, 22, 233, 76, 304, 226, 11, + /* 1100 */ 208, 27, 22, 23, 200, 19, 26, 87, 36, 89, + /* 1110 */ 211, 212, 92, 300, 248, 189, 42, 304, 189, 250, + /* 1120 */ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + /* 1130 */ 111, 59, 200, 233, 114, 115, 116, 63, 234, 235, + /* 1140 */ 235, 19, 20, 71, 22, 300, 189, 73, 200, 304, + /* 1150 */ 116, 247, 247, 81, 23, 200, 227, 26, 36, 234, + /* 1160 */ 235, 203, 204, 143, 200, 26, 234, 235, 194, 200, + /* 1170 */ 48, 99, 247, 66, 189, 141, 284, 105, 106, 247, + /* 1180 */ 100, 59, 234, 235, 112, 259, 114, 115, 116, 234, + /* 1190 */ 235, 119, 85, 71, 266, 247, 211, 212, 234, 235, + /* 1200 */ 114, 94, 247, 234, 235, 12, 266, 85, 136, 137, + /* 1210 */ 189, 247, 90, 26, 126, 127, 247, 189, 26, 22, + /* 1220 */ 27, 99, 150, 151, 152, 153, 154, 105, 106, 189, + /* 1230 */ 302, 303, 211, 212, 112, 42, 114, 115, 116, 211, + /* 1240 */ 212, 119, 302, 303, 19, 20, 189, 22, 274, 189, + /* 1250 */ 15, 144, 278, 189, 22, 23, 63, 189, 189, 203, + /* 1260 */ 204, 36, 136, 137, 155, 24, 157, 143, 211, 212, + /* 1270 */ 189, 26, 150, 151, 152, 153, 154, 0, 1, 2, + /* 1280 */ 211, 212, 5, 46, 59, 161, 147, 10, 11, 12, + /* 1290 */ 13, 14, 211, 212, 17, 60, 71, 189, 258, 189, + /* 1300 */ 59, 59, 105, 106, 189, 189, 189, 30, 116, 32, + /* 1310 */ 85, 124, 189, 251, 252, 90, 189, 40, 258, 211, + /* 1320 */ 212, 211, 212, 189, 99, 26, 211, 212, 211, 212, + /* 1330 */ 105, 106, 100, 141, 211, 212, 189, 112, 189, 114, + /* 1340 */ 115, 116, 24, 189, 119, 31, 23, 70, 189, 26, + /* 1350 */ 113, 19, 20, 39, 22, 78, 115, 115, 81, 189, + /* 1360 */ 211, 212, 22, 189, 24, 211, 212, 189, 36, 189, + /* 1370 */ 211, 212, 189, 189, 97, 150, 151, 152, 153, 154, + /* 1380 */ 127, 211, 212, 189, 189, 211, 212, 189, 143, 211, + /* 1390 */ 212, 59, 189, 189, 211, 212, 23, 189, 189, 26, + /* 1400 */ 59, 189, 149, 71, 22, 211, 212, 189, 131, 211, + /* 1410 */ 212, 189, 59, 136, 137, 211, 212, 85, 189, 211, + /* 1420 */ 212, 253, 90, 211, 212, 292, 293, 118, 119, 211, + /* 1430 */ 212, 99, 23, 211, 212, 26, 159, 105, 106, 140, + /* 1440 */ 211, 212, 23, 189, 112, 26, 114, 115, 116, 1, + /* 1450 */ 2, 119, 189, 5, 7, 8, 115, 139, 10, 11, + /* 1460 */ 12, 13, 14, 23, 189, 17, 26, 189, 115, 189, + /* 1470 */ 19, 20, 189, 22, 189, 83, 84, 189, 30, 150, + /* 1480 */ 32, 152, 150, 151, 152, 153, 154, 36, 40, 211, + /* 1490 */ 212, 211, 212, 189, 211, 212, 211, 212, 309, 189, + /* 1500 */ 19, 20, 189, 22, 150, 189, 152, 231, 189, 189, + /* 1510 */ 59, 189, 23, 189, 189, 26, 189, 36, 70, 189, + /* 1520 */ 23, 139, 71, 26, 211, 212, 78, 211, 212, 81, + /* 1530 */ 281, 211, 212, 211, 212, 189, 211, 212, 211, 212, + /* 1540 */ 59, 211, 212, 23, 23, 97, 26, 26, 23, 189, + /* 1550 */ 99, 26, 71, 189, 119, 189, 105, 106, 107, 189, + /* 1560 */ 189, 189, 280, 112, 129, 114, 115, 116, 189, 189, + /* 1570 */ 119, 23, 19, 20, 26, 22, 189, 211, 212, 131, + /* 1580 */ 99, 237, 211, 212, 136, 137, 105, 106, 189, 36, + /* 1590 */ 211, 212, 189, 112, 189, 114, 115, 116, 211, 212, + /* 1600 */ 119, 150, 151, 152, 153, 154, 189, 159, 23, 189, + /* 1610 */ 23, 26, 59, 26, 189, 189, 189, 189, 189, 189, + /* 1620 */ 209, 189, 238, 187, 71, 250, 250, 250, 211, 212, + /* 1630 */ 241, 150, 151, 152, 153, 154, 211, 212, 250, 290, + /* 1640 */ 254, 211, 212, 211, 212, 254, 215, 286, 241, 241, + /* 1650 */ 254, 286, 99, 214, 220, 214, 214, 224, 105, 106, + /* 1660 */ 244, 240, 244, 273, 192, 112, 60, 114, 115, 116, + /* 1670 */ 139, 290, 119, 5, 196, 238, 196, 38, 10, 11, + /* 1680 */ 12, 13, 14, 196, 287, 17, 148, 287, 276, 113, + /* 1690 */ 43, 22, 229, 147, 241, 18, 232, 232, 30, 232, + /* 1700 */ 32, 232, 264, 150, 151, 152, 153, 154, 40, 265, + /* 1710 */ 196, 18, 195, 264, 241, 241, 241, 265, 196, 229, + /* 1720 */ 229, 195, 155, 62, 196, 195, 283, 282, 22, 216, + /* 1730 */ 196, 195, 216, 196, 195, 113, 213, 213, 70, 64, + /* 1740 */ 213, 222, 22, 124, 162, 111, 78, 142, 219, 81, + /* 1750 */ 215, 219, 275, 303, 213, 213, 216, 275, 213, 216, + /* 1760 */ 213, 256, 113, 255, 255, 97, 222, 216, 256, 196, + /* 1770 */ 91, 256, 82, 255, 308, 146, 308, 22, 143, 196, + /* 1780 */ 270, 155, 145, 272, 144, 25, 13, 199, 26, 256, + /* 1790 */ 198, 190, 190, 6, 296, 188, 188, 188, 244, 131, + /* 1800 */ 245, 245, 243, 242, 136, 137, 241, 255, 208, 260, + /* 1810 */ 260, 208, 202, 217, 217, 202, 4, 3, 202, 208, + /* 1820 */ 208, 22, 160, 209, 209, 208, 15, 159, 98, 16, + /* 1830 */ 23, 23, 137, 148, 24, 128, 140, 20, 16, 142, + /* 1840 */ 1, 140, 128, 149, 61, 53, 37, 148, 53, 53, + /* 1850 */ 53, 293, 128, 296, 114, 34, 139, 1, 5, 22, + /* 1860 */ 113, 158, 68, 75, 26, 41, 68, 139, 24, 113, + /* 1870 */ 20, 19, 129, 123, 23, 96, 22, 22, 59, 22, + /* 1880 */ 22, 147, 67, 67, 24, 22, 37, 28, 23, 22, + /* 1890 */ 67, 23, 23, 23, 114, 23, 22, 26, 22, 24, + /* 1900 */ 23, 22, 24, 139, 23, 23, 141, 34, 88, 26, + /* 1910 */ 75, 86, 23, 22, 34, 75, 24, 23, 34, 34, + /* 1920 */ 34, 93, 34, 26, 26, 23, 23, 34, 23, 23, + /* 1930 */ 26, 44, 23, 22, 11, 22, 22, 133, 23, 23, + /* 1940 */ 22, 22, 139, 26, 139, 139, 15, 23, 1, 1, + /* 1950 */ 310, 310, 310, 310, 310, 310, 310, 139, 310, 310, + /* 1960 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 1970 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 1980 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 1990 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2000 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2010 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2020 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2030 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2040 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2050 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2060 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2070 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2080 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2090 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2100 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2110 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2120 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + /* 2130 */ 310, 310, 310, 310, 310, 310, 310, 310, 310, +}; +#define YY_SHIFT_COUNT (550) +#define YY_SHIFT_MIN (0) +#define YY_SHIFT_MAX (1948) +static const unsigned short int yy_shift_ofst[] = { + /* 0 */ 1448, 1277, 1668, 1072, 1072, 340, 1122, 1225, 1332, 1481, + /* 10 */ 1481, 1481, 335, 0, 0, 180, 897, 1481, 1481, 1481, + /* 20 */ 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, + /* 30 */ 930, 930, 1020, 1020, 290, 1, 340, 340, 340, 340, + /* 40 */ 340, 340, 40, 110, 219, 288, 327, 396, 435, 504, + /* 50 */ 543, 612, 651, 720, 877, 897, 897, 897, 897, 897, + /* 60 */ 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, + /* 70 */ 897, 897, 897, 917, 897, 1019, 763, 763, 1451, 1481, + /* 80 */ 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, + /* 90 */ 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, + /* 100 */ 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, + /* 110 */ 1481, 1481, 1553, 1481, 1481, 1481, 1481, 1481, 1481, 1481, + /* 120 */ 1481, 1481, 1481, 1481, 1481, 1481, 147, 258, 258, 258, + /* 130 */ 258, 258, 79, 65, 84, 449, 19, 786, 449, 636, + /* 140 */ 636, 449, 880, 880, 880, 880, 113, 142, 142, 472, + /* 150 */ 150, 1958, 1958, 399, 399, 399, 93, 237, 341, 237, + /* 160 */ 237, 1074, 1074, 437, 350, 704, 1080, 449, 449, 449, + /* 170 */ 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + /* 180 */ 449, 449, 449, 449, 449, 449, 449, 449, 818, 818, + /* 190 */ 449, 1088, 217, 217, 734, 734, 1124, 1126, 1958, 1958, + /* 200 */ 1958, 739, 840, 840, 453, 454, 511, 187, 563, 570, + /* 210 */ 898, 669, 449, 449, 449, 449, 449, 449, 449, 449, + /* 220 */ 449, 670, 449, 449, 449, 449, 449, 449, 449, 449, + /* 230 */ 449, 449, 449, 449, 674, 674, 674, 449, 449, 449, + /* 240 */ 449, 1034, 449, 449, 449, 972, 1107, 449, 449, 1193, + /* 250 */ 449, 449, 449, 449, 449, 449, 449, 449, 260, 177, + /* 260 */ 489, 1241, 1241, 1241, 1241, 1192, 489, 489, 952, 1197, + /* 270 */ 625, 1235, 1139, 181, 181, 1086, 1139, 1139, 1086, 1187, + /* 280 */ 1131, 1237, 1314, 1314, 1314, 181, 1245, 1245, 1109, 1299, + /* 290 */ 549, 1340, 1606, 1531, 1531, 1639, 1639, 1531, 1538, 1576, + /* 300 */ 1669, 1647, 1546, 1677, 1677, 1677, 1677, 1531, 1693, 1546, + /* 310 */ 1546, 1576, 1669, 1647, 1647, 1546, 1531, 1693, 1567, 1661, + /* 320 */ 1531, 1693, 1706, 1531, 1693, 1531, 1693, 1706, 1622, 1622, + /* 330 */ 1622, 1675, 1720, 1720, 1706, 1622, 1619, 1622, 1675, 1622, + /* 340 */ 1622, 1582, 1706, 1634, 1634, 1706, 1605, 1649, 1605, 1649, + /* 350 */ 1605, 1649, 1605, 1649, 1531, 1679, 1679, 1690, 1690, 1629, + /* 360 */ 1635, 1755, 1531, 1626, 1629, 1637, 1640, 1546, 1760, 1762, + /* 370 */ 1773, 1773, 1787, 1787, 1787, 1958, 1958, 1958, 1958, 1958, + /* 380 */ 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, + /* 390 */ 308, 835, 954, 1232, 879, 715, 728, 1323, 864, 1318, + /* 400 */ 1253, 1373, 297, 1409, 1419, 1440, 1489, 1497, 1520, 1242, + /* 410 */ 1309, 1447, 1435, 1341, 1521, 1525, 1392, 1548, 1329, 1354, + /* 420 */ 1585, 1587, 1353, 1382, 1812, 1814, 1799, 1662, 1811, 1730, + /* 430 */ 1813, 1807, 1808, 1695, 1685, 1707, 1810, 1696, 1817, 1697, + /* 440 */ 1822, 1839, 1701, 1694, 1714, 1783, 1809, 1699, 1792, 1795, + /* 450 */ 1796, 1797, 1724, 1740, 1821, 1717, 1856, 1853, 1837, 1747, + /* 460 */ 1703, 1794, 1838, 1798, 1788, 1824, 1728, 1756, 1844, 1850, + /* 470 */ 1852, 1743, 1750, 1854, 1815, 1855, 1857, 1851, 1858, 1816, + /* 480 */ 1819, 1860, 1779, 1859, 1863, 1823, 1849, 1865, 1734, 1867, + /* 490 */ 1868, 1869, 1870, 1871, 1872, 1874, 1875, 1877, 1876, 1878, + /* 500 */ 1764, 1881, 1882, 1780, 1873, 1879, 1765, 1883, 1880, 1884, + /* 510 */ 1885, 1886, 1820, 1835, 1825, 1887, 1840, 1828, 1888, 1889, + /* 520 */ 1891, 1892, 1897, 1898, 1893, 1894, 1883, 1902, 1903, 1905, + /* 530 */ 1906, 1904, 1909, 1911, 1923, 1913, 1914, 1915, 1916, 1918, + /* 540 */ 1919, 1917, 1804, 1803, 1805, 1806, 1818, 1924, 1931, 1947, + /* 550 */ 1948, +}; +#define YY_REDUCE_COUNT (389) +#define YY_REDUCE_MIN (-262) +#define YY_REDUCE_MAX (1617) +static const short yy_reduce_ofst[] = { + /* 0 */ 490, -122, 545, 645, 650, -120, -189, -187, -184, -182, + /* 10 */ -178, -176, 45, 30, 200, -251, -134, 390, 392, 521, + /* 20 */ 523, 213, 692, 821, 284, 589, 872, 666, 671, 866, + /* 30 */ 71, 111, 273, 389, 686, 815, 904, 932, 948, 955, + /* 40 */ 964, 969, -259, -259, -259, -259, -259, -259, -259, -259, + /* 50 */ -259, -259, -259, -259, -259, -259, -259, -259, -259, -259, + /* 60 */ -259, -259, -259, -259, -259, -259, -259, -259, -259, -259, + /* 70 */ -259, -259, -259, -259, -259, -259, -259, -259, 428, 430, + /* 80 */ 899, 985, 1021, 1028, 1057, 1069, 1081, 1108, 1110, 1115, + /* 90 */ 1117, 1123, 1149, 1154, 1159, 1170, 1174, 1178, 1183, 1194, + /* 100 */ 1198, 1204, 1208, 1212, 1218, 1222, 1229, 1278, 1280, 1283, + /* 110 */ 1285, 1313, 1316, 1320, 1322, 1325, 1327, 1330, 1366, 1371, + /* 120 */ 1379, 1387, 1417, 1425, 1430, 1432, -259, -259, -259, -259, + /* 130 */ -259, -259, -259, -259, -259, 557, 974, -214, -174, -9, + /* 140 */ 431, -124, 806, 925, 806, 925, 251, 928, 940, -259, + /* 150 */ -259, -259, -259, -198, -198, -198, 127, -186, -168, 212, + /* 160 */ 646, 617, 799, -262, 555, 220, 220, 491, 605, 1040, + /* 170 */ 1060, 699, -11, 600, 848, 862, 345, -129, 724, -91, + /* 180 */ 158, 749, 716, 900, 304, 822, 929, 926, 499, 793, + /* 190 */ 322, 892, 813, 845, 958, 1056, 751, 905, 1133, 1062, + /* 200 */ 803, -210, -185, -179, -148, -167, -89, 121, 274, 281, + /* 210 */ 320, 336, 439, 663, 711, 957, 1064, 1068, 1116, 1127, + /* 220 */ 1134, -196, 1147, 1180, 1184, 1195, 1203, 1209, 1254, 1263, + /* 230 */ 1275, 1288, 1304, 1310, 205, 422, 638, 1319, 1324, 1346, + /* 240 */ 1360, 1168, 1364, 1370, 1372, 869, 1189, 1380, 1399, 1276, + /* 250 */ 1403, 121, 1405, 1420, 1426, 1427, 1428, 1429, 1249, 1282, + /* 260 */ 1344, 1375, 1376, 1377, 1388, 1168, 1344, 1344, 1384, 1411, + /* 270 */ 1436, 1349, 1389, 1386, 1391, 1361, 1407, 1408, 1365, 1431, + /* 280 */ 1433, 1434, 1439, 1441, 1442, 1396, 1416, 1418, 1390, 1421, + /* 290 */ 1437, 1472, 1381, 1478, 1480, 1397, 1400, 1487, 1412, 1444, + /* 300 */ 1438, 1463, 1453, 1464, 1465, 1467, 1469, 1514, 1517, 1473, + /* 310 */ 1474, 1452, 1449, 1490, 1491, 1475, 1522, 1526, 1443, 1445, + /* 320 */ 1528, 1530, 1513, 1534, 1536, 1537, 1539, 1516, 1523, 1524, + /* 330 */ 1527, 1519, 1529, 1532, 1540, 1541, 1535, 1542, 1544, 1545, + /* 340 */ 1547, 1450, 1543, 1477, 1482, 1551, 1505, 1508, 1512, 1509, + /* 350 */ 1515, 1518, 1533, 1552, 1573, 1466, 1468, 1549, 1550, 1555, + /* 360 */ 1554, 1510, 1583, 1511, 1556, 1559, 1561, 1565, 1588, 1592, + /* 370 */ 1601, 1602, 1607, 1608, 1609, 1498, 1557, 1558, 1610, 1600, + /* 380 */ 1603, 1611, 1612, 1613, 1596, 1597, 1614, 1615, 1617, 1616, +}; +static const YYACTIONTYPE yy_default[] = { + /* 0 */ 1573, 1573, 1573, 1409, 1186, 1295, 1186, 1186, 1186, 1409, + /* 10 */ 1409, 1409, 1186, 1325, 1325, 1462, 1217, 1186, 1186, 1186, + /* 20 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1408, 1186, 1186, + /* 30 */ 1186, 1186, 1492, 1492, 1186, 1186, 1186, 1186, 1186, 1186, + /* 40 */ 1186, 1186, 1186, 1334, 1186, 1186, 1186, 1186, 1186, 1186, + /* 50 */ 1410, 1411, 1186, 1186, 1186, 1461, 1463, 1426, 1344, 1343, + /* 60 */ 1342, 1341, 1444, 1312, 1339, 1332, 1336, 1404, 1405, 1403, + /* 70 */ 1407, 1411, 1410, 1186, 1335, 1375, 1389, 1374, 1186, 1186, + /* 80 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 90 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 100 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 110 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 120 */ 1186, 1186, 1186, 1186, 1186, 1186, 1383, 1388, 1394, 1387, + /* 130 */ 1384, 1377, 1376, 1378, 1379, 1186, 1207, 1259, 1186, 1186, + /* 140 */ 1186, 1186, 1480, 1479, 1186, 1186, 1217, 1369, 1368, 1380, + /* 150 */ 1381, 1391, 1390, 1469, 1527, 1526, 1427, 1186, 1186, 1186, + /* 160 */ 1186, 1186, 1186, 1492, 1186, 1186, 1186, 1186, 1186, 1186, + /* 170 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 180 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1492, 1492, + /* 190 */ 1186, 1217, 1492, 1492, 1213, 1213, 1319, 1186, 1475, 1295, + /* 200 */ 1286, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 210 */ 1186, 1186, 1186, 1186, 1186, 1466, 1464, 1186, 1186, 1186, + /* 220 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 230 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 240 */ 1186, 1186, 1186, 1186, 1186, 1291, 1186, 1186, 1186, 1186, + /* 250 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1521, 1186, 1439, + /* 260 */ 1273, 1291, 1291, 1291, 1291, 1293, 1274, 1272, 1285, 1218, + /* 270 */ 1193, 1565, 1338, 1314, 1314, 1562, 1338, 1338, 1562, 1234, + /* 280 */ 1543, 1229, 1325, 1325, 1325, 1314, 1319, 1319, 1406, 1292, + /* 290 */ 1285, 1186, 1565, 1300, 1300, 1564, 1564, 1300, 1427, 1347, + /* 300 */ 1353, 1262, 1338, 1268, 1268, 1268, 1268, 1300, 1204, 1338, + /* 310 */ 1338, 1347, 1353, 1262, 1262, 1338, 1300, 1204, 1443, 1559, + /* 320 */ 1300, 1204, 1417, 1300, 1204, 1300, 1204, 1417, 1260, 1260, + /* 330 */ 1260, 1249, 1186, 1186, 1417, 1260, 1234, 1260, 1249, 1260, + /* 340 */ 1260, 1510, 1417, 1421, 1421, 1417, 1318, 1313, 1318, 1313, + /* 350 */ 1318, 1313, 1318, 1313, 1300, 1502, 1502, 1328, 1328, 1333, + /* 360 */ 1319, 1412, 1300, 1186, 1333, 1331, 1329, 1338, 1210, 1252, + /* 370 */ 1524, 1524, 1520, 1520, 1520, 1570, 1570, 1475, 1536, 1217, + /* 380 */ 1217, 1217, 1217, 1536, 1236, 1236, 1218, 1218, 1217, 1536, + /* 390 */ 1186, 1186, 1186, 1186, 1186, 1186, 1531, 1186, 1428, 1304, + /* 400 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 410 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 420 */ 1186, 1186, 1186, 1358, 1186, 1189, 1472, 1186, 1186, 1470, + /* 430 */ 1186, 1186, 1186, 1186, 1186, 1186, 1305, 1186, 1186, 1186, + /* 440 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 450 */ 1186, 1186, 1186, 1186, 1186, 1561, 1186, 1186, 1186, 1186, + /* 460 */ 1186, 1186, 1442, 1441, 1186, 1186, 1302, 1186, 1186, 1186, + /* 470 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 480 */ 1232, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 490 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 500 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1330, 1186, 1186, + /* 510 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 520 */ 1186, 1186, 1507, 1320, 1186, 1186, 1552, 1186, 1186, 1186, + /* 530 */ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + /* 540 */ 1186, 1547, 1276, 1360, 1186, 1359, 1363, 1186, 1198, 1186, + /* 550 */ 1186, +}; +/********** End of lemon-generated parsing tables *****************************/ + +/* The next table maps tokens (terminal symbols) into fallback tokens. +** If a construct like the following: +** +** %fallback ID X Y Z. +** +** appears in the grammar, then ID becomes a fallback token for X, Y, +** and Z. Whenever one of the tokens X, Y, or Z is input to the parser +** but it does not parse, the type of the token is changed to ID and +** the parse is retried before an error is thrown. +** +** This feature can be used, for example, to cause some keywords in a language +** to revert to identifiers if they keyword does not apply in the context where +** it appears. +*/ +#ifdef YYFALLBACK +static const YYCODETYPE yyFallback[] = { + 0, /* $ => nothing */ + 0, /* SEMI => nothing */ + 59, /* EXPLAIN => ID */ + 59, /* QUERY => ID */ + 59, /* PLAN => ID */ + 59, /* BEGIN => ID */ + 0, /* TRANSACTION => nothing */ + 59, /* DEFERRED => ID */ + 59, /* IMMEDIATE => ID */ + 59, /* EXCLUSIVE => ID */ + 0, /* COMMIT => nothing */ + 59, /* END => ID */ + 59, /* ROLLBACK => ID */ + 59, /* SAVEPOINT => ID */ + 59, /* RELEASE => ID */ + 0, /* TO => nothing */ + 0, /* TABLE => nothing */ + 0, /* CREATE => nothing */ + 59, /* IF => ID */ + 0, /* NOT => nothing */ + 0, /* EXISTS => nothing */ + 59, /* TEMP => ID */ + 0, /* LP => nothing */ + 0, /* RP => nothing */ + 0, /* AS => nothing */ + 59, /* WITHOUT => ID */ + 0, /* COMMA => nothing */ + 59, /* ABORT => ID */ + 59, /* ACTION => ID */ + 59, /* AFTER => ID */ + 59, /* ANALYZE => ID */ + 59, /* ASC => ID */ + 59, /* ATTACH => ID */ + 59, /* BEFORE => ID */ + 59, /* BY => ID */ + 59, /* CASCADE => ID */ + 59, /* CAST => ID */ + 59, /* CONFLICT => ID */ + 59, /* DATABASE => ID */ + 59, /* DESC => ID */ + 59, /* DETACH => ID */ + 59, /* EACH => ID */ + 59, /* FAIL => ID */ + 0, /* OR => nothing */ + 0, /* AND => nothing */ + 0, /* IS => nothing */ + 59, /* MATCH => ID */ + 59, /* LIKE_KW => ID */ + 0, /* BETWEEN => nothing */ + 0, /* IN => nothing */ + 0, /* ISNULL => nothing */ + 0, /* NOTNULL => nothing */ + 0, /* NE => nothing */ + 0, /* EQ => nothing */ + 0, /* GT => nothing */ + 0, /* LE => nothing */ + 0, /* LT => nothing */ + 0, /* GE => nothing */ + 0, /* ESCAPE => nothing */ + 0, /* ID => nothing */ + 59, /* COLUMNKW => ID */ + 59, /* DO => ID */ + 59, /* FOR => ID */ + 59, /* IGNORE => ID */ + 59, /* INITIALLY => ID */ + 59, /* INSTEAD => ID */ + 59, /* NO => ID */ + 59, /* KEY => ID */ + 59, /* OF => ID */ + 59, /* OFFSET => ID */ + 59, /* PRAGMA => ID */ + 59, /* RAISE => ID */ + 59, /* RECURSIVE => ID */ + 59, /* REPLACE => ID */ + 59, /* RESTRICT => ID */ + 59, /* ROW => ID */ + 59, /* ROWS => ID */ + 59, /* TRIGGER => ID */ + 59, /* VACUUM => ID */ + 59, /* VIEW => ID */ + 59, /* VIRTUAL => ID */ + 59, /* WITH => ID */ + 59, /* NULLS => ID */ + 59, /* FIRST => ID */ + 59, /* LAST => ID */ + 59, /* CURRENT => ID */ + 59, /* FOLLOWING => ID */ + 59, /* PARTITION => ID */ + 59, /* PRECEDING => ID */ + 59, /* RANGE => ID */ + 59, /* UNBOUNDED => ID */ + 59, /* EXCLUDE => ID */ + 59, /* GROUPS => ID */ + 59, /* OTHERS => ID */ + 59, /* TIES => ID */ + 59, /* GENERATED => ID */ + 59, /* ALWAYS => ID */ + 59, /* REINDEX => ID */ + 59, /* RENAME => ID */ + 59, /* CTIME_KW => ID */ + 0, /* ANY => nothing */ + 0, /* BITAND => nothing */ + 0, /* BITOR => nothing */ + 0, /* LSHIFT => nothing */ + 0, /* RSHIFT => nothing */ + 0, /* PLUS => nothing */ + 0, /* MINUS => nothing */ + 0, /* STAR => nothing */ + 0, /* SLASH => nothing */ + 0, /* REM => nothing */ + 0, /* CONCAT => nothing */ + 0, /* COLLATE => nothing */ + 0, /* BITNOT => nothing */ + 0, /* ON => nothing */ + 0, /* INDEXED => nothing */ + 0, /* STRING => nothing */ + 0, /* JOIN_KW => nothing */ + 0, /* CONSTRAINT => nothing */ + 0, /* DEFAULT => nothing */ + 0, /* NULL => nothing */ + 0, /* PRIMARY => nothing */ + 0, /* UNIQUE => nothing */ + 0, /* CHECK => nothing */ + 0, /* REFERENCES => nothing */ + 0, /* AUTOINCR => nothing */ + 0, /* INSERT => nothing */ + 0, /* DELETE => nothing */ + 0, /* UPDATE => nothing */ + 0, /* SET => nothing */ + 0, /* DEFERRABLE => nothing */ + 0, /* FOREIGN => nothing */ + 0, /* DROP => nothing */ + 0, /* UNION => nothing */ + 0, /* ALL => nothing */ + 0, /* EXCEPT => nothing */ + 0, /* INTERSECT => nothing */ + 0, /* SELECT => nothing */ + 0, /* VALUES => nothing */ + 0, /* DISTINCT => nothing */ + 0, /* DOT => nothing */ + 0, /* FROM => nothing */ + 0, /* JOIN => nothing */ + 0, /* USING => nothing */ + 0, /* ORDER => nothing */ + 0, /* GROUP => nothing */ + 0, /* HAVING => nothing */ + 0, /* LIMIT => nothing */ + 0, /* WHERE => nothing */ + 0, /* INTO => nothing */ + 0, /* NOTHING => nothing */ + 0, /* FLOAT => nothing */ + 0, /* BLOB => nothing */ + 0, /* INTEGER => nothing */ + 0, /* VARIABLE => nothing */ + 0, /* CASE => nothing */ + 0, /* WHEN => nothing */ + 0, /* THEN => nothing */ + 0, /* ELSE => nothing */ + 0, /* INDEX => nothing */ + 0, /* ALTER => nothing */ + 0, /* ADD => nothing */ + 0, /* WINDOW => nothing */ + 0, /* OVER => nothing */ + 0, /* FILTER => nothing */ + 0, /* COLUMN => nothing */ + 0, /* AGG_FUNCTION => nothing */ + 0, /* AGG_COLUMN => nothing */ + 0, /* TRUEFALSE => nothing */ + 0, /* ISNOT => nothing */ + 0, /* FUNCTION => nothing */ + 0, /* UMINUS => nothing */ + 0, /* UPLUS => nothing */ + 0, /* TRUTH => nothing */ + 0, /* REGISTER => nothing */ + 0, /* VECTOR => nothing */ + 0, /* SELECT_COLUMN => nothing */ + 0, /* IF_NULL_ROW => nothing */ + 0, /* ASTERISK => nothing */ + 0, /* SPAN => nothing */ + 0, /* SPACE => nothing */ + 0, /* ILLEGAL => nothing */ +}; +#endif /* YYFALLBACK */ + +/* The following structure represents a single element of the +** parser's stack. Information stored includes: +** +** + The state number for the parser at this level of the stack. +** +** + The value of the token stored at this level of the stack. +** (In other words, the "major" token.) +** +** + The semantic value stored at this level of the stack. This is +** the information used by the action routines in the grammar. +** It is sometimes called the "minor" token. +** +** After the "shift" half of a SHIFTREDUCE action, the stateno field +** actually contains the reduce action for the second half of the +** SHIFTREDUCE. +*/ +struct yyStackEntry { + YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ + YYCODETYPE major; /* The major token value. This is the code + ** number for the token at this stack level */ + YYMINORTYPE minor; /* The user-supplied minor token value. This + ** is the value of the token */ +}; +typedef struct yyStackEntry yyStackEntry; + +/* The state of the parser is completely contained in an instance of +** the following structure */ +struct yyParser { + yyStackEntry *yytos; /* Pointer to top element of the stack */ +#ifdef YYTRACKMAXSTACKDEPTH + int yyhwm; /* High-water mark of the stack */ +#endif +#ifndef YYNOERRORRECOVERY + int yyerrcnt; /* Shifts left before out of the error */ +#endif + sqlite3ParserARG_SDECL /* A place to hold %extra_argument */ + sqlite3ParserCTX_SDECL /* A place to hold %extra_context */ +#if YYSTACKDEPTH<=0 + int yystksz; /* Current side of the stack */ + yyStackEntry *yystack; /* The parser's stack */ + yyStackEntry yystk0; /* First stack entry */ +#else + yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ + yyStackEntry *yystackEnd; /* Last entry in the stack */ +#endif +}; +typedef struct yyParser yyParser; + +#ifndef NDEBUG +/* #include */ +static FILE *yyTraceFILE = 0; +static char *yyTracePrompt = 0; +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* +** Turn parser tracing on by giving a stream to which to write the trace +** and a prompt to preface each trace message. Tracing is turned off +** by making either argument NULL +** +** Inputs: +**
      +**
    • A FILE* to which trace output should be written. +** If NULL, then tracing is turned off. +**
    • A prefix string written at the beginning of every +** line of trace output. If NULL, then tracing is +** turned off. +**
    +** +** Outputs: +** None. +*/ +SQLITE_PRIVATE void sqlite3ParserTrace(FILE *TraceFILE, char *zTracePrompt){ + yyTraceFILE = TraceFILE; + yyTracePrompt = zTracePrompt; + if( yyTraceFILE==0 ) yyTracePrompt = 0; + else if( yyTracePrompt==0 ) yyTraceFILE = 0; +} +#endif /* NDEBUG */ + +#if defined(YYCOVERAGE) || !defined(NDEBUG) +/* For tracing shifts, the names of all terminals and nonterminals +** are required. The following table supplies these names */ +static const char *const yyTokenName[] = { + /* 0 */ "$", + /* 1 */ "SEMI", + /* 2 */ "EXPLAIN", + /* 3 */ "QUERY", + /* 4 */ "PLAN", + /* 5 */ "BEGIN", + /* 6 */ "TRANSACTION", + /* 7 */ "DEFERRED", + /* 8 */ "IMMEDIATE", + /* 9 */ "EXCLUSIVE", + /* 10 */ "COMMIT", + /* 11 */ "END", + /* 12 */ "ROLLBACK", + /* 13 */ "SAVEPOINT", + /* 14 */ "RELEASE", + /* 15 */ "TO", + /* 16 */ "TABLE", + /* 17 */ "CREATE", + /* 18 */ "IF", + /* 19 */ "NOT", + /* 20 */ "EXISTS", + /* 21 */ "TEMP", + /* 22 */ "LP", + /* 23 */ "RP", + /* 24 */ "AS", + /* 25 */ "WITHOUT", + /* 26 */ "COMMA", + /* 27 */ "ABORT", + /* 28 */ "ACTION", + /* 29 */ "AFTER", + /* 30 */ "ANALYZE", + /* 31 */ "ASC", + /* 32 */ "ATTACH", + /* 33 */ "BEFORE", + /* 34 */ "BY", + /* 35 */ "CASCADE", + /* 36 */ "CAST", + /* 37 */ "CONFLICT", + /* 38 */ "DATABASE", + /* 39 */ "DESC", + /* 40 */ "DETACH", + /* 41 */ "EACH", + /* 42 */ "FAIL", + /* 43 */ "OR", + /* 44 */ "AND", + /* 45 */ "IS", + /* 46 */ "MATCH", + /* 47 */ "LIKE_KW", + /* 48 */ "BETWEEN", + /* 49 */ "IN", + /* 50 */ "ISNULL", + /* 51 */ "NOTNULL", + /* 52 */ "NE", + /* 53 */ "EQ", + /* 54 */ "GT", + /* 55 */ "LE", + /* 56 */ "LT", + /* 57 */ "GE", + /* 58 */ "ESCAPE", + /* 59 */ "ID", + /* 60 */ "COLUMNKW", + /* 61 */ "DO", + /* 62 */ "FOR", + /* 63 */ "IGNORE", + /* 64 */ "INITIALLY", + /* 65 */ "INSTEAD", + /* 66 */ "NO", + /* 67 */ "KEY", + /* 68 */ "OF", + /* 69 */ "OFFSET", + /* 70 */ "PRAGMA", + /* 71 */ "RAISE", + /* 72 */ "RECURSIVE", + /* 73 */ "REPLACE", + /* 74 */ "RESTRICT", + /* 75 */ "ROW", + /* 76 */ "ROWS", + /* 77 */ "TRIGGER", + /* 78 */ "VACUUM", + /* 79 */ "VIEW", + /* 80 */ "VIRTUAL", + /* 81 */ "WITH", + /* 82 */ "NULLS", + /* 83 */ "FIRST", + /* 84 */ "LAST", + /* 85 */ "CURRENT", + /* 86 */ "FOLLOWING", + /* 87 */ "PARTITION", + /* 88 */ "PRECEDING", + /* 89 */ "RANGE", + /* 90 */ "UNBOUNDED", + /* 91 */ "EXCLUDE", + /* 92 */ "GROUPS", + /* 93 */ "OTHERS", + /* 94 */ "TIES", + /* 95 */ "GENERATED", + /* 96 */ "ALWAYS", + /* 97 */ "REINDEX", + /* 98 */ "RENAME", + /* 99 */ "CTIME_KW", + /* 100 */ "ANY", + /* 101 */ "BITAND", + /* 102 */ "BITOR", + /* 103 */ "LSHIFT", + /* 104 */ "RSHIFT", + /* 105 */ "PLUS", + /* 106 */ "MINUS", + /* 107 */ "STAR", + /* 108 */ "SLASH", + /* 109 */ "REM", + /* 110 */ "CONCAT", + /* 111 */ "COLLATE", + /* 112 */ "BITNOT", + /* 113 */ "ON", + /* 114 */ "INDEXED", + /* 115 */ "STRING", + /* 116 */ "JOIN_KW", + /* 117 */ "CONSTRAINT", + /* 118 */ "DEFAULT", + /* 119 */ "NULL", + /* 120 */ "PRIMARY", + /* 121 */ "UNIQUE", + /* 122 */ "CHECK", + /* 123 */ "REFERENCES", + /* 124 */ "AUTOINCR", + /* 125 */ "INSERT", + /* 126 */ "DELETE", + /* 127 */ "UPDATE", + /* 128 */ "SET", + /* 129 */ "DEFERRABLE", + /* 130 */ "FOREIGN", + /* 131 */ "DROP", + /* 132 */ "UNION", + /* 133 */ "ALL", + /* 134 */ "EXCEPT", + /* 135 */ "INTERSECT", + /* 136 */ "SELECT", + /* 137 */ "VALUES", + /* 138 */ "DISTINCT", + /* 139 */ "DOT", + /* 140 */ "FROM", + /* 141 */ "JOIN", + /* 142 */ "USING", + /* 143 */ "ORDER", + /* 144 */ "GROUP", + /* 145 */ "HAVING", + /* 146 */ "LIMIT", + /* 147 */ "WHERE", + /* 148 */ "INTO", + /* 149 */ "NOTHING", + /* 150 */ "FLOAT", + /* 151 */ "BLOB", + /* 152 */ "INTEGER", + /* 153 */ "VARIABLE", + /* 154 */ "CASE", + /* 155 */ "WHEN", + /* 156 */ "THEN", + /* 157 */ "ELSE", + /* 158 */ "INDEX", + /* 159 */ "ALTER", + /* 160 */ "ADD", + /* 161 */ "WINDOW", + /* 162 */ "OVER", + /* 163 */ "FILTER", + /* 164 */ "COLUMN", + /* 165 */ "AGG_FUNCTION", + /* 166 */ "AGG_COLUMN", + /* 167 */ "TRUEFALSE", + /* 168 */ "ISNOT", + /* 169 */ "FUNCTION", + /* 170 */ "UMINUS", + /* 171 */ "UPLUS", + /* 172 */ "TRUTH", + /* 173 */ "REGISTER", + /* 174 */ "VECTOR", + /* 175 */ "SELECT_COLUMN", + /* 176 */ "IF_NULL_ROW", + /* 177 */ "ASTERISK", + /* 178 */ "SPAN", + /* 179 */ "SPACE", + /* 180 */ "ILLEGAL", + /* 181 */ "input", + /* 182 */ "cmdlist", + /* 183 */ "ecmd", + /* 184 */ "cmdx", + /* 185 */ "explain", + /* 186 */ "cmd", + /* 187 */ "transtype", + /* 188 */ "trans_opt", + /* 189 */ "nm", + /* 190 */ "savepoint_opt", + /* 191 */ "create_table", + /* 192 */ "create_table_args", + /* 193 */ "createkw", + /* 194 */ "temp", + /* 195 */ "ifnotexists", + /* 196 */ "dbnm", + /* 197 */ "columnlist", + /* 198 */ "conslist_opt", + /* 199 */ "table_options", + /* 200 */ "select", + /* 201 */ "columnname", + /* 202 */ "carglist", + /* 203 */ "typetoken", + /* 204 */ "typename", + /* 205 */ "signed", + /* 206 */ "plus_num", + /* 207 */ "minus_num", + /* 208 */ "scanpt", + /* 209 */ "scantok", + /* 210 */ "ccons", + /* 211 */ "term", + /* 212 */ "expr", + /* 213 */ "onconf", + /* 214 */ "sortorder", + /* 215 */ "autoinc", + /* 216 */ "eidlist_opt", + /* 217 */ "refargs", + /* 218 */ "defer_subclause", + /* 219 */ "generated", + /* 220 */ "refarg", + /* 221 */ "refact", + /* 222 */ "init_deferred_pred_opt", + /* 223 */ "conslist", + /* 224 */ "tconscomma", + /* 225 */ "tcons", + /* 226 */ "sortlist", + /* 227 */ "eidlist", + /* 228 */ "defer_subclause_opt", + /* 229 */ "orconf", + /* 230 */ "resolvetype", + /* 231 */ "raisetype", + /* 232 */ "ifexists", + /* 233 */ "fullname", + /* 234 */ "selectnowith", + /* 235 */ "oneselect", + /* 236 */ "wqlist", + /* 237 */ "multiselect_op", + /* 238 */ "distinct", + /* 239 */ "selcollist", + /* 240 */ "from", + /* 241 */ "where_opt", + /* 242 */ "groupby_opt", + /* 243 */ "having_opt", + /* 244 */ "orderby_opt", + /* 245 */ "limit_opt", + /* 246 */ "window_clause", + /* 247 */ "values", + /* 248 */ "nexprlist", + /* 249 */ "sclp", + /* 250 */ "as", + /* 251 */ "seltablist", + /* 252 */ "stl_prefix", + /* 253 */ "joinop", + /* 254 */ "indexed_opt", + /* 255 */ "on_opt", + /* 256 */ "using_opt", + /* 257 */ "exprlist", + /* 258 */ "xfullname", + /* 259 */ "idlist", + /* 260 */ "nulls", + /* 261 */ "with", + /* 262 */ "setlist", + /* 263 */ "insert_cmd", + /* 264 */ "idlist_opt", + /* 265 */ "upsert", + /* 266 */ "filter_over", + /* 267 */ "likeop", + /* 268 */ "between_op", + /* 269 */ "in_op", + /* 270 */ "paren_exprlist", + /* 271 */ "case_operand", + /* 272 */ "case_exprlist", + /* 273 */ "case_else", + /* 274 */ "uniqueflag", + /* 275 */ "collate", + /* 276 */ "vinto", + /* 277 */ "nmnum", + /* 278 */ "trigger_decl", + /* 279 */ "trigger_cmd_list", + /* 280 */ "trigger_time", + /* 281 */ "trigger_event", + /* 282 */ "foreach_clause", + /* 283 */ "when_clause", + /* 284 */ "trigger_cmd", + /* 285 */ "trnm", + /* 286 */ "tridxby", + /* 287 */ "database_kw_opt", + /* 288 */ "key_opt", + /* 289 */ "add_column_fullname", + /* 290 */ "kwcolumn_opt", + /* 291 */ "create_vtab", + /* 292 */ "vtabarglist", + /* 293 */ "vtabarg", + /* 294 */ "vtabargtoken", + /* 295 */ "lp", + /* 296 */ "anylist", + /* 297 */ "windowdefn_list", + /* 298 */ "windowdefn", + /* 299 */ "window", + /* 300 */ "frame_opt", + /* 301 */ "part_opt", + /* 302 */ "filter_clause", + /* 303 */ "over_clause", + /* 304 */ "range_or_rows", + /* 305 */ "frame_bound", + /* 306 */ "frame_bound_s", + /* 307 */ "frame_bound_e", + /* 308 */ "frame_exclude_opt", + /* 309 */ "frame_exclude", +}; +#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ + +#ifndef NDEBUG +/* For tracing reduce actions, the names of all rules are required. +*/ +static const char *const yyRuleName[] = { + /* 0 */ "explain ::= EXPLAIN", + /* 1 */ "explain ::= EXPLAIN QUERY PLAN", + /* 2 */ "cmdx ::= cmd", + /* 3 */ "cmd ::= BEGIN transtype trans_opt", + /* 4 */ "transtype ::=", + /* 5 */ "transtype ::= DEFERRED", + /* 6 */ "transtype ::= IMMEDIATE", + /* 7 */ "transtype ::= EXCLUSIVE", + /* 8 */ "cmd ::= COMMIT|END trans_opt", + /* 9 */ "cmd ::= ROLLBACK trans_opt", + /* 10 */ "cmd ::= SAVEPOINT nm", + /* 11 */ "cmd ::= RELEASE savepoint_opt nm", + /* 12 */ "cmd ::= ROLLBACK trans_opt TO savepoint_opt nm", + /* 13 */ "create_table ::= createkw temp TABLE ifnotexists nm dbnm", + /* 14 */ "createkw ::= CREATE", + /* 15 */ "ifnotexists ::=", + /* 16 */ "ifnotexists ::= IF NOT EXISTS", + /* 17 */ "temp ::= TEMP", + /* 18 */ "temp ::=", + /* 19 */ "create_table_args ::= LP columnlist conslist_opt RP table_options", + /* 20 */ "create_table_args ::= AS select", + /* 21 */ "table_options ::=", + /* 22 */ "table_options ::= WITHOUT nm", + /* 23 */ "columnname ::= nm typetoken", + /* 24 */ "typetoken ::=", + /* 25 */ "typetoken ::= typename LP signed RP", + /* 26 */ "typetoken ::= typename LP signed COMMA signed RP", + /* 27 */ "typename ::= typename ID|STRING", + /* 28 */ "scanpt ::=", + /* 29 */ "scantok ::=", + /* 30 */ "ccons ::= CONSTRAINT nm", + /* 31 */ "ccons ::= DEFAULT scantok term", + /* 32 */ "ccons ::= DEFAULT LP expr RP", + /* 33 */ "ccons ::= DEFAULT PLUS scantok term", + /* 34 */ "ccons ::= DEFAULT MINUS scantok term", + /* 35 */ "ccons ::= DEFAULT scantok ID|INDEXED", + /* 36 */ "ccons ::= NOT NULL onconf", + /* 37 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc", + /* 38 */ "ccons ::= UNIQUE onconf", + /* 39 */ "ccons ::= CHECK LP expr RP", + /* 40 */ "ccons ::= REFERENCES nm eidlist_opt refargs", + /* 41 */ "ccons ::= defer_subclause", + /* 42 */ "ccons ::= COLLATE ID|STRING", + /* 43 */ "generated ::= LP expr RP", + /* 44 */ "generated ::= LP expr RP ID", + /* 45 */ "autoinc ::=", + /* 46 */ "autoinc ::= AUTOINCR", + /* 47 */ "refargs ::=", + /* 48 */ "refargs ::= refargs refarg", + /* 49 */ "refarg ::= MATCH nm", + /* 50 */ "refarg ::= ON INSERT refact", + /* 51 */ "refarg ::= ON DELETE refact", + /* 52 */ "refarg ::= ON UPDATE refact", + /* 53 */ "refact ::= SET NULL", + /* 54 */ "refact ::= SET DEFAULT", + /* 55 */ "refact ::= CASCADE", + /* 56 */ "refact ::= RESTRICT", + /* 57 */ "refact ::= NO ACTION", + /* 58 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", + /* 59 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", + /* 60 */ "init_deferred_pred_opt ::=", + /* 61 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", + /* 62 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", + /* 63 */ "conslist_opt ::=", + /* 64 */ "tconscomma ::= COMMA", + /* 65 */ "tcons ::= CONSTRAINT nm", + /* 66 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf", + /* 67 */ "tcons ::= UNIQUE LP sortlist RP onconf", + /* 68 */ "tcons ::= CHECK LP expr RP onconf", + /* 69 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt", + /* 70 */ "defer_subclause_opt ::=", + /* 71 */ "onconf ::=", + /* 72 */ "onconf ::= ON CONFLICT resolvetype", + /* 73 */ "orconf ::=", + /* 74 */ "orconf ::= OR resolvetype", + /* 75 */ "resolvetype ::= IGNORE", + /* 76 */ "resolvetype ::= REPLACE", + /* 77 */ "cmd ::= DROP TABLE ifexists fullname", + /* 78 */ "ifexists ::= IF EXISTS", + /* 79 */ "ifexists ::=", + /* 80 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select", + /* 81 */ "cmd ::= DROP VIEW ifexists fullname", + /* 82 */ "cmd ::= select", + /* 83 */ "select ::= WITH wqlist selectnowith", + /* 84 */ "select ::= WITH RECURSIVE wqlist selectnowith", + /* 85 */ "select ::= selectnowith", + /* 86 */ "selectnowith ::= selectnowith multiselect_op oneselect", + /* 87 */ "multiselect_op ::= UNION", + /* 88 */ "multiselect_op ::= UNION ALL", + /* 89 */ "multiselect_op ::= EXCEPT|INTERSECT", + /* 90 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", + /* 91 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt", + /* 92 */ "values ::= VALUES LP nexprlist RP", + /* 93 */ "values ::= values COMMA LP nexprlist RP", + /* 94 */ "distinct ::= DISTINCT", + /* 95 */ "distinct ::= ALL", + /* 96 */ "distinct ::=", + /* 97 */ "sclp ::=", + /* 98 */ "selcollist ::= sclp scanpt expr scanpt as", + /* 99 */ "selcollist ::= sclp scanpt STAR", + /* 100 */ "selcollist ::= sclp scanpt nm DOT STAR", + /* 101 */ "as ::= AS nm", + /* 102 */ "as ::=", + /* 103 */ "from ::=", + /* 104 */ "from ::= FROM seltablist", + /* 105 */ "stl_prefix ::= seltablist joinop", + /* 106 */ "stl_prefix ::=", + /* 107 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", + /* 108 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt", + /* 109 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", + /* 110 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", + /* 111 */ "dbnm ::=", + /* 112 */ "dbnm ::= DOT nm", + /* 113 */ "fullname ::= nm", + /* 114 */ "fullname ::= nm DOT nm", + /* 115 */ "xfullname ::= nm", + /* 116 */ "xfullname ::= nm DOT nm", + /* 117 */ "xfullname ::= nm DOT nm AS nm", + /* 118 */ "xfullname ::= nm AS nm", + /* 119 */ "joinop ::= COMMA|JOIN", + /* 120 */ "joinop ::= JOIN_KW JOIN", + /* 121 */ "joinop ::= JOIN_KW nm JOIN", + /* 122 */ "joinop ::= JOIN_KW nm nm JOIN", + /* 123 */ "on_opt ::= ON expr", + /* 124 */ "on_opt ::=", + /* 125 */ "indexed_opt ::=", + /* 126 */ "indexed_opt ::= INDEXED BY nm", + /* 127 */ "indexed_opt ::= NOT INDEXED", + /* 128 */ "using_opt ::= USING LP idlist RP", + /* 129 */ "using_opt ::=", + /* 130 */ "orderby_opt ::=", + /* 131 */ "orderby_opt ::= ORDER BY sortlist", + /* 132 */ "sortlist ::= sortlist COMMA expr sortorder nulls", + /* 133 */ "sortlist ::= expr sortorder nulls", + /* 134 */ "sortorder ::= ASC", + /* 135 */ "sortorder ::= DESC", + /* 136 */ "sortorder ::=", + /* 137 */ "nulls ::= NULLS FIRST", + /* 138 */ "nulls ::= NULLS LAST", + /* 139 */ "nulls ::=", + /* 140 */ "groupby_opt ::=", + /* 141 */ "groupby_opt ::= GROUP BY nexprlist", + /* 142 */ "having_opt ::=", + /* 143 */ "having_opt ::= HAVING expr", + /* 144 */ "limit_opt ::=", + /* 145 */ "limit_opt ::= LIMIT expr", + /* 146 */ "limit_opt ::= LIMIT expr OFFSET expr", + /* 147 */ "limit_opt ::= LIMIT expr COMMA expr", + /* 148 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt", + /* 149 */ "where_opt ::=", + /* 150 */ "where_opt ::= WHERE expr", + /* 151 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt", + /* 152 */ "setlist ::= setlist COMMA nm EQ expr", + /* 153 */ "setlist ::= setlist COMMA LP idlist RP EQ expr", + /* 154 */ "setlist ::= nm EQ expr", + /* 155 */ "setlist ::= LP idlist RP EQ expr", + /* 156 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert", + /* 157 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES", + /* 158 */ "upsert ::=", + /* 159 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt", + /* 160 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING", + /* 161 */ "upsert ::= ON CONFLICT DO NOTHING", + /* 162 */ "insert_cmd ::= INSERT orconf", + /* 163 */ "insert_cmd ::= REPLACE", + /* 164 */ "idlist_opt ::=", + /* 165 */ "idlist_opt ::= LP idlist RP", + /* 166 */ "idlist ::= idlist COMMA nm", + /* 167 */ "idlist ::= nm", + /* 168 */ "expr ::= LP expr RP", + /* 169 */ "expr ::= ID|INDEXED", + /* 170 */ "expr ::= JOIN_KW", + /* 171 */ "expr ::= nm DOT nm", + /* 172 */ "expr ::= nm DOT nm DOT nm", + /* 173 */ "term ::= NULL|FLOAT|BLOB", + /* 174 */ "term ::= STRING", + /* 175 */ "term ::= INTEGER", + /* 176 */ "expr ::= VARIABLE", + /* 177 */ "expr ::= expr COLLATE ID|STRING", + /* 178 */ "expr ::= CAST LP expr AS typetoken RP", + /* 179 */ "expr ::= ID|INDEXED LP distinct exprlist RP", + /* 180 */ "expr ::= ID|INDEXED LP STAR RP", + /* 181 */ "expr ::= ID|INDEXED LP distinct exprlist RP filter_over", + /* 182 */ "expr ::= ID|INDEXED LP STAR RP filter_over", + /* 183 */ "term ::= CTIME_KW", + /* 184 */ "expr ::= LP nexprlist COMMA expr RP", + /* 185 */ "expr ::= expr AND expr", + /* 186 */ "expr ::= expr OR expr", + /* 187 */ "expr ::= expr LT|GT|GE|LE expr", + /* 188 */ "expr ::= expr EQ|NE expr", + /* 189 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", + /* 190 */ "expr ::= expr PLUS|MINUS expr", + /* 191 */ "expr ::= expr STAR|SLASH|REM expr", + /* 192 */ "expr ::= expr CONCAT expr", + /* 193 */ "likeop ::= NOT LIKE_KW|MATCH", + /* 194 */ "expr ::= expr likeop expr", + /* 195 */ "expr ::= expr likeop expr ESCAPE expr", + /* 196 */ "expr ::= expr ISNULL|NOTNULL", + /* 197 */ "expr ::= expr NOT NULL", + /* 198 */ "expr ::= expr IS expr", + /* 199 */ "expr ::= expr IS NOT expr", + /* 200 */ "expr ::= NOT expr", + /* 201 */ "expr ::= BITNOT expr", + /* 202 */ "expr ::= PLUS|MINUS expr", + /* 203 */ "between_op ::= BETWEEN", + /* 204 */ "between_op ::= NOT BETWEEN", + /* 205 */ "expr ::= expr between_op expr AND expr", + /* 206 */ "in_op ::= IN", + /* 207 */ "in_op ::= NOT IN", + /* 208 */ "expr ::= expr in_op LP exprlist RP", + /* 209 */ "expr ::= LP select RP", + /* 210 */ "expr ::= expr in_op LP select RP", + /* 211 */ "expr ::= expr in_op nm dbnm paren_exprlist", + /* 212 */ "expr ::= EXISTS LP select RP", + /* 213 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 214 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 215 */ "case_exprlist ::= WHEN expr THEN expr", + /* 216 */ "case_else ::= ELSE expr", + /* 217 */ "case_else ::=", + /* 218 */ "case_operand ::= expr", + /* 219 */ "case_operand ::=", + /* 220 */ "exprlist ::=", + /* 221 */ "nexprlist ::= nexprlist COMMA expr", + /* 222 */ "nexprlist ::= expr", + /* 223 */ "paren_exprlist ::=", + /* 224 */ "paren_exprlist ::= LP exprlist RP", + /* 225 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", + /* 226 */ "uniqueflag ::= UNIQUE", + /* 227 */ "uniqueflag ::=", + /* 228 */ "eidlist_opt ::=", + /* 229 */ "eidlist_opt ::= LP eidlist RP", + /* 230 */ "eidlist ::= eidlist COMMA nm collate sortorder", + /* 231 */ "eidlist ::= nm collate sortorder", + /* 232 */ "collate ::=", + /* 233 */ "collate ::= COLLATE ID|STRING", + /* 234 */ "cmd ::= DROP INDEX ifexists fullname", + /* 235 */ "cmd ::= VACUUM vinto", + /* 236 */ "cmd ::= VACUUM nm vinto", + /* 237 */ "vinto ::= INTO expr", + /* 238 */ "vinto ::=", + /* 239 */ "cmd ::= PRAGMA nm dbnm", + /* 240 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 241 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 242 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 243 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 244 */ "plus_num ::= PLUS INTEGER|FLOAT", + /* 245 */ "minus_num ::= MINUS INTEGER|FLOAT", + /* 246 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 247 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 248 */ "trigger_time ::= BEFORE|AFTER", + /* 249 */ "trigger_time ::= INSTEAD OF", + /* 250 */ "trigger_time ::=", + /* 251 */ "trigger_event ::= DELETE|INSERT", + /* 252 */ "trigger_event ::= UPDATE", + /* 253 */ "trigger_event ::= UPDATE OF idlist", + /* 254 */ "when_clause ::=", + /* 255 */ "when_clause ::= WHEN expr", + /* 256 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 257 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 258 */ "trnm ::= nm DOT nm", + /* 259 */ "tridxby ::= INDEXED BY nm", + /* 260 */ "tridxby ::= NOT INDEXED", + /* 261 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt", + /* 262 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", + /* 263 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", + /* 264 */ "trigger_cmd ::= scanpt select scanpt", + /* 265 */ "expr ::= RAISE LP IGNORE RP", + /* 266 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 267 */ "raisetype ::= ROLLBACK", + /* 268 */ "raisetype ::= ABORT", + /* 269 */ "raisetype ::= FAIL", + /* 270 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 271 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 272 */ "cmd ::= DETACH database_kw_opt expr", + /* 273 */ "key_opt ::=", + /* 274 */ "key_opt ::= KEY expr", + /* 275 */ "cmd ::= REINDEX", + /* 276 */ "cmd ::= REINDEX nm dbnm", + /* 277 */ "cmd ::= ANALYZE", + /* 278 */ "cmd ::= ANALYZE nm dbnm", + /* 279 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 280 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", + /* 281 */ "add_column_fullname ::= fullname", + /* 282 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", + /* 283 */ "cmd ::= create_vtab", + /* 284 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 285 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 286 */ "vtabarg ::=", + /* 287 */ "vtabargtoken ::= ANY", + /* 288 */ "vtabargtoken ::= lp anylist RP", + /* 289 */ "lp ::= LP", + /* 290 */ "with ::= WITH wqlist", + /* 291 */ "with ::= WITH RECURSIVE wqlist", + /* 292 */ "wqlist ::= nm eidlist_opt AS LP select RP", + /* 293 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", + /* 294 */ "windowdefn_list ::= windowdefn", + /* 295 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", + /* 296 */ "windowdefn ::= nm AS LP window RP", + /* 297 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", + /* 298 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", + /* 299 */ "window ::= ORDER BY sortlist frame_opt", + /* 300 */ "window ::= nm ORDER BY sortlist frame_opt", + /* 301 */ "window ::= frame_opt", + /* 302 */ "window ::= nm frame_opt", + /* 303 */ "frame_opt ::=", + /* 304 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", + /* 305 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", + /* 306 */ "range_or_rows ::= RANGE|ROWS|GROUPS", + /* 307 */ "frame_bound_s ::= frame_bound", + /* 308 */ "frame_bound_s ::= UNBOUNDED PRECEDING", + /* 309 */ "frame_bound_e ::= frame_bound", + /* 310 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", + /* 311 */ "frame_bound ::= expr PRECEDING|FOLLOWING", + /* 312 */ "frame_bound ::= CURRENT ROW", + /* 313 */ "frame_exclude_opt ::=", + /* 314 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", + /* 315 */ "frame_exclude ::= NO OTHERS", + /* 316 */ "frame_exclude ::= CURRENT ROW", + /* 317 */ "frame_exclude ::= GROUP|TIES", + /* 318 */ "window_clause ::= WINDOW windowdefn_list", + /* 319 */ "filter_over ::= filter_clause over_clause", + /* 320 */ "filter_over ::= over_clause", + /* 321 */ "filter_over ::= filter_clause", + /* 322 */ "over_clause ::= OVER LP window RP", + /* 323 */ "over_clause ::= OVER nm", + /* 324 */ "filter_clause ::= FILTER LP WHERE expr RP", + /* 325 */ "input ::= cmdlist", + /* 326 */ "cmdlist ::= cmdlist ecmd", + /* 327 */ "cmdlist ::= ecmd", + /* 328 */ "ecmd ::= SEMI", + /* 329 */ "ecmd ::= cmdx SEMI", + /* 330 */ "ecmd ::= explain cmdx SEMI", + /* 331 */ "trans_opt ::=", + /* 332 */ "trans_opt ::= TRANSACTION", + /* 333 */ "trans_opt ::= TRANSACTION nm", + /* 334 */ "savepoint_opt ::= SAVEPOINT", + /* 335 */ "savepoint_opt ::=", + /* 336 */ "cmd ::= create_table create_table_args", + /* 337 */ "columnlist ::= columnlist COMMA columnname carglist", + /* 338 */ "columnlist ::= columnname carglist", + /* 339 */ "nm ::= ID|INDEXED", + /* 340 */ "nm ::= STRING", + /* 341 */ "nm ::= JOIN_KW", + /* 342 */ "typetoken ::= typename", + /* 343 */ "typename ::= ID|STRING", + /* 344 */ "signed ::= plus_num", + /* 345 */ "signed ::= minus_num", + /* 346 */ "carglist ::= carglist ccons", + /* 347 */ "carglist ::=", + /* 348 */ "ccons ::= NULL onconf", + /* 349 */ "ccons ::= GENERATED ALWAYS AS generated", + /* 350 */ "ccons ::= AS generated", + /* 351 */ "conslist_opt ::= COMMA conslist", + /* 352 */ "conslist ::= conslist tconscomma tcons", + /* 353 */ "conslist ::= tcons", + /* 354 */ "tconscomma ::=", + /* 355 */ "defer_subclause_opt ::= defer_subclause", + /* 356 */ "resolvetype ::= raisetype", + /* 357 */ "selectnowith ::= oneselect", + /* 358 */ "oneselect ::= values", + /* 359 */ "sclp ::= selcollist COMMA", + /* 360 */ "as ::= ID|STRING", + /* 361 */ "expr ::= term", + /* 362 */ "likeop ::= LIKE_KW|MATCH", + /* 363 */ "exprlist ::= nexprlist", + /* 364 */ "nmnum ::= plus_num", + /* 365 */ "nmnum ::= nm", + /* 366 */ "nmnum ::= ON", + /* 367 */ "nmnum ::= DELETE", + /* 368 */ "nmnum ::= DEFAULT", + /* 369 */ "plus_num ::= INTEGER|FLOAT", + /* 370 */ "foreach_clause ::=", + /* 371 */ "foreach_clause ::= FOR EACH ROW", + /* 372 */ "trnm ::= nm", + /* 373 */ "tridxby ::=", + /* 374 */ "database_kw_opt ::= DATABASE", + /* 375 */ "database_kw_opt ::=", + /* 376 */ "kwcolumn_opt ::=", + /* 377 */ "kwcolumn_opt ::= COLUMNKW", + /* 378 */ "vtabarglist ::= vtabarg", + /* 379 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 380 */ "vtabarg ::= vtabarg vtabargtoken", + /* 381 */ "anylist ::=", + /* 382 */ "anylist ::= anylist LP anylist RP", + /* 383 */ "anylist ::= anylist ANY", + /* 384 */ "with ::=", +}; +#endif /* NDEBUG */ + + +#if YYSTACKDEPTH<=0 +/* +** Try to increase the size of the parser stack. Return the number +** of errors. Return 0 on success. +*/ +static int yyGrowStack(yyParser *p){ + int newSize; + int idx; + yyStackEntry *pNew; + + newSize = p->yystksz*2 + 100; + idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; + if( p->yystack==&p->yystk0 ){ + pNew = malloc(newSize*sizeof(pNew[0])); + if( pNew ) pNew[0] = p->yystk0; + }else{ + pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); + } + if( pNew ){ + p->yystack = pNew; + p->yytos = &p->yystack[idx]; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", + yyTracePrompt, p->yystksz, newSize); + } +#endif + p->yystksz = newSize; + } + return pNew==0; +} +#endif + +/* Datatype of the argument to the memory allocated passed as the +** second argument to sqlite3ParserAlloc() below. This can be changed by +** putting an appropriate #define in the %include section of the input +** grammar. +*/ +#ifndef YYMALLOCARGTYPE +# define YYMALLOCARGTYPE size_t +#endif + +/* Initialize a new parser that has already been allocated. +*/ +SQLITE_PRIVATE void sqlite3ParserInit(void *yypRawParser sqlite3ParserCTX_PDECL){ + yyParser *yypParser = (yyParser*)yypRawParser; + sqlite3ParserCTX_STORE +#ifdef YYTRACKMAXSTACKDEPTH + yypParser->yyhwm = 0; +#endif +#if YYSTACKDEPTH<=0 + yypParser->yytos = NULL; + yypParser->yystack = NULL; + yypParser->yystksz = 0; + if( yyGrowStack(yypParser) ){ + yypParser->yystack = &yypParser->yystk0; + yypParser->yystksz = 1; + } +#endif +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + yypParser->yytos = yypParser->yystack; + yypParser->yystack[0].stateno = 0; + yypParser->yystack[0].major = 0; +#if YYSTACKDEPTH>0 + yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1]; +#endif +} + +#ifndef sqlite3Parser_ENGINEALWAYSONSTACK +/* +** This function allocates a new parser. +** The only argument is a pointer to a function which works like +** malloc. +** +** Inputs: +** A pointer to the function used to allocate memory. +** +** Outputs: +** A pointer to a parser. This pointer is used in subsequent calls +** to sqlite3Parser and sqlite3ParserFree. +*/ +SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE) sqlite3ParserCTX_PDECL){ + yyParser *yypParser; + yypParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); + if( yypParser ){ + sqlite3ParserCTX_STORE + sqlite3ParserInit(yypParser sqlite3ParserCTX_PARAM); + } + return (void*)yypParser; +} +#endif /* sqlite3Parser_ENGINEALWAYSONSTACK */ + + +/* The following function deletes the "minor type" or semantic value +** associated with a symbol. The symbol can be either a terminal +** or nonterminal. "yymajor" is the symbol code, and "yypminor" is +** a pointer to the value to be deleted. The code used to do the +** deletions is derived from the %destructor and/or %token_destructor +** directives of the input grammar. +*/ +static void yy_destructor( + yyParser *yypParser, /* The parser */ + YYCODETYPE yymajor, /* Type code for object to destroy */ + YYMINORTYPE *yypminor /* The object to be destroyed */ +){ + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH + switch( yymajor ){ + /* Here is inserted the actions which take place when a + ** terminal or non-terminal is destroyed. This can happen + ** when the symbol is popped from the stack during a + ** reduce or during error processing or when a parser is + ** being destroyed before it is finished parsing. + ** + ** Note: during a reduce, the only symbols destroyed are those + ** which appear on the RHS of the rule, but which are *not* used + ** inside the C code. + */ +/********* Begin destructor definitions ***************************************/ + case 200: /* select */ + case 234: /* selectnowith */ + case 235: /* oneselect */ + case 247: /* values */ +{ +sqlite3SelectDelete(pParse->db, (yypminor->yy539)); +} + break; + case 211: /* term */ + case 212: /* expr */ + case 241: /* where_opt */ + case 243: /* having_opt */ + case 255: /* on_opt */ + case 271: /* case_operand */ + case 273: /* case_else */ + case 276: /* vinto */ + case 283: /* when_clause */ + case 288: /* key_opt */ + case 302: /* filter_clause */ +{ +sqlite3ExprDelete(pParse->db, (yypminor->yy202)); +} + break; + case 216: /* eidlist_opt */ + case 226: /* sortlist */ + case 227: /* eidlist */ + case 239: /* selcollist */ + case 242: /* groupby_opt */ + case 244: /* orderby_opt */ + case 248: /* nexprlist */ + case 249: /* sclp */ + case 257: /* exprlist */ + case 262: /* setlist */ + case 270: /* paren_exprlist */ + case 272: /* case_exprlist */ + case 301: /* part_opt */ +{ +sqlite3ExprListDelete(pParse->db, (yypminor->yy242)); +} + break; + case 233: /* fullname */ + case 240: /* from */ + case 251: /* seltablist */ + case 252: /* stl_prefix */ + case 258: /* xfullname */ +{ +sqlite3SrcListDelete(pParse->db, (yypminor->yy47)); +} + break; + case 236: /* wqlist */ +{ +sqlite3WithDelete(pParse->db, (yypminor->yy131)); +} + break; + case 246: /* window_clause */ + case 297: /* windowdefn_list */ +{ +sqlite3WindowListDelete(pParse->db, (yypminor->yy303)); +} + break; + case 256: /* using_opt */ + case 259: /* idlist */ + case 264: /* idlist_opt */ +{ +sqlite3IdListDelete(pParse->db, (yypminor->yy600)); +} + break; + case 266: /* filter_over */ + case 298: /* windowdefn */ + case 299: /* window */ + case 300: /* frame_opt */ + case 303: /* over_clause */ +{ +sqlite3WindowDelete(pParse->db, (yypminor->yy303)); +} + break; + case 279: /* trigger_cmd_list */ + case 284: /* trigger_cmd */ +{ +sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy447)); +} + break; + case 281: /* trigger_event */ +{ +sqlite3IdListDelete(pParse->db, (yypminor->yy230).b); +} + break; + case 305: /* frame_bound */ + case 306: /* frame_bound_s */ + case 307: /* frame_bound_e */ +{ +sqlite3ExprDelete(pParse->db, (yypminor->yy77).pExpr); +} + break; +/********* End destructor definitions *****************************************/ + default: break; /* If no destructor action specified: do nothing */ + } +} + +/* +** Pop the parser's stack once. +** +** If there is a destructor routine associated with the token which +** is popped from the stack, then call it. +*/ +static void yy_pop_parser_stack(yyParser *pParser){ + yyStackEntry *yytos; + assert( pParser->yytos!=0 ); + assert( pParser->yytos > pParser->yystack ); + yytos = pParser->yytos--; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sPopping %s\n", + yyTracePrompt, + yyTokenName[yytos->major]); + } +#endif + yy_destructor(pParser, yytos->major, &yytos->minor); +} + +/* +** Clear all secondary memory allocations from the parser +*/ +SQLITE_PRIVATE void sqlite3ParserFinalize(void *p){ + yyParser *pParser = (yyParser*)p; + while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); +#if YYSTACKDEPTH<=0 + if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); +#endif +} + +#ifndef sqlite3Parser_ENGINEALWAYSONSTACK +/* +** Deallocate and destroy a parser. Destructors are called for +** all stack elements before shutting the parser down. +** +** If the YYPARSEFREENEVERNULL macro exists (for example because it +** is defined in a %include section of the input grammar) then it is +** assumed that the input pointer is never NULL. +*/ +SQLITE_PRIVATE void sqlite3ParserFree( + void *p, /* The parser to be deleted */ + void (*freeProc)(void*) /* Function used to reclaim memory */ +){ +#ifndef YYPARSEFREENEVERNULL + if( p==0 ) return; +#endif + sqlite3ParserFinalize(p); + (*freeProc)(p); +} +#endif /* sqlite3Parser_ENGINEALWAYSONSTACK */ + +/* +** Return the peak depth of the stack for a parser. +*/ +#ifdef YYTRACKMAXSTACKDEPTH +SQLITE_PRIVATE int sqlite3ParserStackPeak(void *p){ + yyParser *pParser = (yyParser*)p; + return pParser->yyhwm; +} +#endif + +/* This array of booleans keeps track of the parser statement +** coverage. The element yycoverage[X][Y] is set when the parser +** is in state X and has a lookahead token Y. In a well-tested +** systems, every element of this matrix should end up being set. +*/ +#if defined(YYCOVERAGE) +static unsigned char yycoverage[YYNSTATE][YYNTOKEN]; +#endif + +/* +** Write into out a description of every state/lookahead combination that +** +** (1) has not been used by the parser, and +** (2) is not a syntax error. +** +** Return the number of missed state/lookahead combinations. +*/ +#if defined(YYCOVERAGE) +SQLITE_PRIVATE int sqlite3ParserCoverage(FILE *out){ + int stateno, iLookAhead, i; + int nMissed = 0; + for(stateno=0; statenoYY_MAX_SHIFT ) return stateno; + assert( stateno <= YY_SHIFT_COUNT ); +#if defined(YYCOVERAGE) + yycoverage[stateno][iLookAhead] = 1; +#endif + do{ + i = yy_shift_ofst[stateno]; + assert( i>=0 ); + assert( i<=YY_ACTTAB_COUNT ); + assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); + assert( iLookAhead!=YYNOCODE ); + assert( iLookAhead < YYNTOKEN ); + i += iLookAhead; + assert( i<(int)YY_NLOOKAHEAD ); + if( yy_lookahead[i]!=iLookAhead ){ +#ifdef YYFALLBACK + YYCODETYPE iFallback; /* Fallback token */ + assert( iLookAhead %s\n", + yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); + } +#endif + assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ + iLookAhead = iFallback; + continue; + } +#endif +#ifdef YYWILDCARD + { + int j = i - iLookAhead + YYWILDCARD; + assert( j<(int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])) ); + if( yy_lookahead[j]==YYWILDCARD && iLookAhead>0 ){ +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", + yyTracePrompt, yyTokenName[iLookAhead], + yyTokenName[YYWILDCARD]); + } +#endif /* NDEBUG */ + return yy_action[j]; + } + } +#endif /* YYWILDCARD */ + return yy_default[stateno]; + }else{ + assert( i>=0 && iYY_REDUCE_COUNT ){ + return yy_default[stateno]; + } +#else + assert( stateno<=YY_REDUCE_COUNT ); +#endif + i = yy_reduce_ofst[stateno]; + assert( iLookAhead!=YYNOCODE ); + i += iLookAhead; +#ifdef YYERRORSYMBOL + if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ + return yy_default[stateno]; + } +#else + assert( i>=0 && iyytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will execute if the parser + ** stack every overflows */ +/******** Begin %stack_overflow code ******************************************/ + + sqlite3ErrorMsg(pParse, "parser stack overflow"); +/******** End %stack_overflow code ********************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument var */ + sqlite3ParserCTX_STORE +} + +/* +** Print tracing information for a SHIFT action +*/ +#ifndef NDEBUG +static void yyTraceShift(yyParser *yypParser, int yyNewState, const char *zTag){ + if( yyTraceFILE ){ + if( yyNewStateyytos->major], + yyNewState); + }else{ + fprintf(yyTraceFILE,"%s%s '%s', pending reduce %d\n", + yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major], + yyNewState - YY_MIN_REDUCE); + } + } +} +#else +# define yyTraceShift(X,Y,Z) +#endif + +/* +** Perform a shift action. +*/ +static void yy_shift( + yyParser *yypParser, /* The parser to be shifted */ + YYACTIONTYPE yyNewState, /* The new state to shift in */ + YYCODETYPE yyMajor, /* The major token to shift in */ + sqlite3ParserTOKENTYPE yyMinor /* The minor token to shift in */ +){ + yyStackEntry *yytos; + yypParser->yytos++; +#ifdef YYTRACKMAXSTACKDEPTH + if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ + yypParser->yyhwm++; + assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); + } +#endif +#if YYSTACKDEPTH>0 + if( yypParser->yytos>yypParser->yystackEnd ){ + yypParser->yytos--; + yyStackOverflow(yypParser); + return; + } +#else + if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ + if( yyGrowStack(yypParser) ){ + yypParser->yytos--; + yyStackOverflow(yypParser); + return; + } + } +#endif + if( yyNewState > YY_MAX_SHIFT ){ + yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; + } + yytos = yypParser->yytos; + yytos->stateno = yyNewState; + yytos->major = yyMajor; + yytos->minor.yy0 = yyMinor; + yyTraceShift(yypParser, yyNewState, "Shift"); +} + +/* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side +** of that rule */ +static const YYCODETYPE yyRuleInfoLhs[] = { + 185, /* (0) explain ::= EXPLAIN */ + 185, /* (1) explain ::= EXPLAIN QUERY PLAN */ + 184, /* (2) cmdx ::= cmd */ + 186, /* (3) cmd ::= BEGIN transtype trans_opt */ + 187, /* (4) transtype ::= */ + 187, /* (5) transtype ::= DEFERRED */ + 187, /* (6) transtype ::= IMMEDIATE */ + 187, /* (7) transtype ::= EXCLUSIVE */ + 186, /* (8) cmd ::= COMMIT|END trans_opt */ + 186, /* (9) cmd ::= ROLLBACK trans_opt */ + 186, /* (10) cmd ::= SAVEPOINT nm */ + 186, /* (11) cmd ::= RELEASE savepoint_opt nm */ + 186, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ + 191, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ + 193, /* (14) createkw ::= CREATE */ + 195, /* (15) ifnotexists ::= */ + 195, /* (16) ifnotexists ::= IF NOT EXISTS */ + 194, /* (17) temp ::= TEMP */ + 194, /* (18) temp ::= */ + 192, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */ + 192, /* (20) create_table_args ::= AS select */ + 199, /* (21) table_options ::= */ + 199, /* (22) table_options ::= WITHOUT nm */ + 201, /* (23) columnname ::= nm typetoken */ + 203, /* (24) typetoken ::= */ + 203, /* (25) typetoken ::= typename LP signed RP */ + 203, /* (26) typetoken ::= typename LP signed COMMA signed RP */ + 204, /* (27) typename ::= typename ID|STRING */ + 208, /* (28) scanpt ::= */ + 209, /* (29) scantok ::= */ + 210, /* (30) ccons ::= CONSTRAINT nm */ + 210, /* (31) ccons ::= DEFAULT scantok term */ + 210, /* (32) ccons ::= DEFAULT LP expr RP */ + 210, /* (33) ccons ::= DEFAULT PLUS scantok term */ + 210, /* (34) ccons ::= DEFAULT MINUS scantok term */ + 210, /* (35) ccons ::= DEFAULT scantok ID|INDEXED */ + 210, /* (36) ccons ::= NOT NULL onconf */ + 210, /* (37) ccons ::= PRIMARY KEY sortorder onconf autoinc */ + 210, /* (38) ccons ::= UNIQUE onconf */ + 210, /* (39) ccons ::= CHECK LP expr RP */ + 210, /* (40) ccons ::= REFERENCES nm eidlist_opt refargs */ + 210, /* (41) ccons ::= defer_subclause */ + 210, /* (42) ccons ::= COLLATE ID|STRING */ + 219, /* (43) generated ::= LP expr RP */ + 219, /* (44) generated ::= LP expr RP ID */ + 215, /* (45) autoinc ::= */ + 215, /* (46) autoinc ::= AUTOINCR */ + 217, /* (47) refargs ::= */ + 217, /* (48) refargs ::= refargs refarg */ + 220, /* (49) refarg ::= MATCH nm */ + 220, /* (50) refarg ::= ON INSERT refact */ + 220, /* (51) refarg ::= ON DELETE refact */ + 220, /* (52) refarg ::= ON UPDATE refact */ + 221, /* (53) refact ::= SET NULL */ + 221, /* (54) refact ::= SET DEFAULT */ + 221, /* (55) refact ::= CASCADE */ + 221, /* (56) refact ::= RESTRICT */ + 221, /* (57) refact ::= NO ACTION */ + 218, /* (58) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ + 218, /* (59) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + 222, /* (60) init_deferred_pred_opt ::= */ + 222, /* (61) init_deferred_pred_opt ::= INITIALLY DEFERRED */ + 222, /* (62) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ + 198, /* (63) conslist_opt ::= */ + 224, /* (64) tconscomma ::= COMMA */ + 225, /* (65) tcons ::= CONSTRAINT nm */ + 225, /* (66) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ + 225, /* (67) tcons ::= UNIQUE LP sortlist RP onconf */ + 225, /* (68) tcons ::= CHECK LP expr RP onconf */ + 225, /* (69) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ + 228, /* (70) defer_subclause_opt ::= */ + 213, /* (71) onconf ::= */ + 213, /* (72) onconf ::= ON CONFLICT resolvetype */ + 229, /* (73) orconf ::= */ + 229, /* (74) orconf ::= OR resolvetype */ + 230, /* (75) resolvetype ::= IGNORE */ + 230, /* (76) resolvetype ::= REPLACE */ + 186, /* (77) cmd ::= DROP TABLE ifexists fullname */ + 232, /* (78) ifexists ::= IF EXISTS */ + 232, /* (79) ifexists ::= */ + 186, /* (80) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ + 186, /* (81) cmd ::= DROP VIEW ifexists fullname */ + 186, /* (82) cmd ::= select */ + 200, /* (83) select ::= WITH wqlist selectnowith */ + 200, /* (84) select ::= WITH RECURSIVE wqlist selectnowith */ + 200, /* (85) select ::= selectnowith */ + 234, /* (86) selectnowith ::= selectnowith multiselect_op oneselect */ + 237, /* (87) multiselect_op ::= UNION */ + 237, /* (88) multiselect_op ::= UNION ALL */ + 237, /* (89) multiselect_op ::= EXCEPT|INTERSECT */ + 235, /* (90) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + 235, /* (91) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ + 247, /* (92) values ::= VALUES LP nexprlist RP */ + 247, /* (93) values ::= values COMMA LP nexprlist RP */ + 238, /* (94) distinct ::= DISTINCT */ + 238, /* (95) distinct ::= ALL */ + 238, /* (96) distinct ::= */ + 249, /* (97) sclp ::= */ + 239, /* (98) selcollist ::= sclp scanpt expr scanpt as */ + 239, /* (99) selcollist ::= sclp scanpt STAR */ + 239, /* (100) selcollist ::= sclp scanpt nm DOT STAR */ + 250, /* (101) as ::= AS nm */ + 250, /* (102) as ::= */ + 240, /* (103) from ::= */ + 240, /* (104) from ::= FROM seltablist */ + 252, /* (105) stl_prefix ::= seltablist joinop */ + 252, /* (106) stl_prefix ::= */ + 251, /* (107) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + 251, /* (108) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ + 251, /* (109) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + 251, /* (110) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + 196, /* (111) dbnm ::= */ + 196, /* (112) dbnm ::= DOT nm */ + 233, /* (113) fullname ::= nm */ + 233, /* (114) fullname ::= nm DOT nm */ + 258, /* (115) xfullname ::= nm */ + 258, /* (116) xfullname ::= nm DOT nm */ + 258, /* (117) xfullname ::= nm DOT nm AS nm */ + 258, /* (118) xfullname ::= nm AS nm */ + 253, /* (119) joinop ::= COMMA|JOIN */ + 253, /* (120) joinop ::= JOIN_KW JOIN */ + 253, /* (121) joinop ::= JOIN_KW nm JOIN */ + 253, /* (122) joinop ::= JOIN_KW nm nm JOIN */ + 255, /* (123) on_opt ::= ON expr */ + 255, /* (124) on_opt ::= */ + 254, /* (125) indexed_opt ::= */ + 254, /* (126) indexed_opt ::= INDEXED BY nm */ + 254, /* (127) indexed_opt ::= NOT INDEXED */ + 256, /* (128) using_opt ::= USING LP idlist RP */ + 256, /* (129) using_opt ::= */ + 244, /* (130) orderby_opt ::= */ + 244, /* (131) orderby_opt ::= ORDER BY sortlist */ + 226, /* (132) sortlist ::= sortlist COMMA expr sortorder nulls */ + 226, /* (133) sortlist ::= expr sortorder nulls */ + 214, /* (134) sortorder ::= ASC */ + 214, /* (135) sortorder ::= DESC */ + 214, /* (136) sortorder ::= */ + 260, /* (137) nulls ::= NULLS FIRST */ + 260, /* (138) nulls ::= NULLS LAST */ + 260, /* (139) nulls ::= */ + 242, /* (140) groupby_opt ::= */ + 242, /* (141) groupby_opt ::= GROUP BY nexprlist */ + 243, /* (142) having_opt ::= */ + 243, /* (143) having_opt ::= HAVING expr */ + 245, /* (144) limit_opt ::= */ + 245, /* (145) limit_opt ::= LIMIT expr */ + 245, /* (146) limit_opt ::= LIMIT expr OFFSET expr */ + 245, /* (147) limit_opt ::= LIMIT expr COMMA expr */ + 186, /* (148) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ + 241, /* (149) where_opt ::= */ + 241, /* (150) where_opt ::= WHERE expr */ + 186, /* (151) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ + 262, /* (152) setlist ::= setlist COMMA nm EQ expr */ + 262, /* (153) setlist ::= setlist COMMA LP idlist RP EQ expr */ + 262, /* (154) setlist ::= nm EQ expr */ + 262, /* (155) setlist ::= LP idlist RP EQ expr */ + 186, /* (156) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + 186, /* (157) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ + 265, /* (158) upsert ::= */ + 265, /* (159) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ + 265, /* (160) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ + 265, /* (161) upsert ::= ON CONFLICT DO NOTHING */ + 263, /* (162) insert_cmd ::= INSERT orconf */ + 263, /* (163) insert_cmd ::= REPLACE */ + 264, /* (164) idlist_opt ::= */ + 264, /* (165) idlist_opt ::= LP idlist RP */ + 259, /* (166) idlist ::= idlist COMMA nm */ + 259, /* (167) idlist ::= nm */ + 212, /* (168) expr ::= LP expr RP */ + 212, /* (169) expr ::= ID|INDEXED */ + 212, /* (170) expr ::= JOIN_KW */ + 212, /* (171) expr ::= nm DOT nm */ + 212, /* (172) expr ::= nm DOT nm DOT nm */ + 211, /* (173) term ::= NULL|FLOAT|BLOB */ + 211, /* (174) term ::= STRING */ + 211, /* (175) term ::= INTEGER */ + 212, /* (176) expr ::= VARIABLE */ + 212, /* (177) expr ::= expr COLLATE ID|STRING */ + 212, /* (178) expr ::= CAST LP expr AS typetoken RP */ + 212, /* (179) expr ::= ID|INDEXED LP distinct exprlist RP */ + 212, /* (180) expr ::= ID|INDEXED LP STAR RP */ + 212, /* (181) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ + 212, /* (182) expr ::= ID|INDEXED LP STAR RP filter_over */ + 211, /* (183) term ::= CTIME_KW */ + 212, /* (184) expr ::= LP nexprlist COMMA expr RP */ + 212, /* (185) expr ::= expr AND expr */ + 212, /* (186) expr ::= expr OR expr */ + 212, /* (187) expr ::= expr LT|GT|GE|LE expr */ + 212, /* (188) expr ::= expr EQ|NE expr */ + 212, /* (189) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ + 212, /* (190) expr ::= expr PLUS|MINUS expr */ + 212, /* (191) expr ::= expr STAR|SLASH|REM expr */ + 212, /* (192) expr ::= expr CONCAT expr */ + 267, /* (193) likeop ::= NOT LIKE_KW|MATCH */ + 212, /* (194) expr ::= expr likeop expr */ + 212, /* (195) expr ::= expr likeop expr ESCAPE expr */ + 212, /* (196) expr ::= expr ISNULL|NOTNULL */ + 212, /* (197) expr ::= expr NOT NULL */ + 212, /* (198) expr ::= expr IS expr */ + 212, /* (199) expr ::= expr IS NOT expr */ + 212, /* (200) expr ::= NOT expr */ + 212, /* (201) expr ::= BITNOT expr */ + 212, /* (202) expr ::= PLUS|MINUS expr */ + 268, /* (203) between_op ::= BETWEEN */ + 268, /* (204) between_op ::= NOT BETWEEN */ + 212, /* (205) expr ::= expr between_op expr AND expr */ + 269, /* (206) in_op ::= IN */ + 269, /* (207) in_op ::= NOT IN */ + 212, /* (208) expr ::= expr in_op LP exprlist RP */ + 212, /* (209) expr ::= LP select RP */ + 212, /* (210) expr ::= expr in_op LP select RP */ + 212, /* (211) expr ::= expr in_op nm dbnm paren_exprlist */ + 212, /* (212) expr ::= EXISTS LP select RP */ + 212, /* (213) expr ::= CASE case_operand case_exprlist case_else END */ + 272, /* (214) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + 272, /* (215) case_exprlist ::= WHEN expr THEN expr */ + 273, /* (216) case_else ::= ELSE expr */ + 273, /* (217) case_else ::= */ + 271, /* (218) case_operand ::= expr */ + 271, /* (219) case_operand ::= */ + 257, /* (220) exprlist ::= */ + 248, /* (221) nexprlist ::= nexprlist COMMA expr */ + 248, /* (222) nexprlist ::= expr */ + 270, /* (223) paren_exprlist ::= */ + 270, /* (224) paren_exprlist ::= LP exprlist RP */ + 186, /* (225) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + 274, /* (226) uniqueflag ::= UNIQUE */ + 274, /* (227) uniqueflag ::= */ + 216, /* (228) eidlist_opt ::= */ + 216, /* (229) eidlist_opt ::= LP eidlist RP */ + 227, /* (230) eidlist ::= eidlist COMMA nm collate sortorder */ + 227, /* (231) eidlist ::= nm collate sortorder */ + 275, /* (232) collate ::= */ + 275, /* (233) collate ::= COLLATE ID|STRING */ + 186, /* (234) cmd ::= DROP INDEX ifexists fullname */ + 186, /* (235) cmd ::= VACUUM vinto */ + 186, /* (236) cmd ::= VACUUM nm vinto */ + 276, /* (237) vinto ::= INTO expr */ + 276, /* (238) vinto ::= */ + 186, /* (239) cmd ::= PRAGMA nm dbnm */ + 186, /* (240) cmd ::= PRAGMA nm dbnm EQ nmnum */ + 186, /* (241) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + 186, /* (242) cmd ::= PRAGMA nm dbnm EQ minus_num */ + 186, /* (243) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + 206, /* (244) plus_num ::= PLUS INTEGER|FLOAT */ + 207, /* (245) minus_num ::= MINUS INTEGER|FLOAT */ + 186, /* (246) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + 278, /* (247) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + 280, /* (248) trigger_time ::= BEFORE|AFTER */ + 280, /* (249) trigger_time ::= INSTEAD OF */ + 280, /* (250) trigger_time ::= */ + 281, /* (251) trigger_event ::= DELETE|INSERT */ + 281, /* (252) trigger_event ::= UPDATE */ + 281, /* (253) trigger_event ::= UPDATE OF idlist */ + 283, /* (254) when_clause ::= */ + 283, /* (255) when_clause ::= WHEN expr */ + 279, /* (256) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + 279, /* (257) trigger_cmd_list ::= trigger_cmd SEMI */ + 285, /* (258) trnm ::= nm DOT nm */ + 286, /* (259) tridxby ::= INDEXED BY nm */ + 286, /* (260) tridxby ::= NOT INDEXED */ + 284, /* (261) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ + 284, /* (262) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + 284, /* (263) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + 284, /* (264) trigger_cmd ::= scanpt select scanpt */ + 212, /* (265) expr ::= RAISE LP IGNORE RP */ + 212, /* (266) expr ::= RAISE LP raisetype COMMA nm RP */ + 231, /* (267) raisetype ::= ROLLBACK */ + 231, /* (268) raisetype ::= ABORT */ + 231, /* (269) raisetype ::= FAIL */ + 186, /* (270) cmd ::= DROP TRIGGER ifexists fullname */ + 186, /* (271) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + 186, /* (272) cmd ::= DETACH database_kw_opt expr */ + 288, /* (273) key_opt ::= */ + 288, /* (274) key_opt ::= KEY expr */ + 186, /* (275) cmd ::= REINDEX */ + 186, /* (276) cmd ::= REINDEX nm dbnm */ + 186, /* (277) cmd ::= ANALYZE */ + 186, /* (278) cmd ::= ANALYZE nm dbnm */ + 186, /* (279) cmd ::= ALTER TABLE fullname RENAME TO nm */ + 186, /* (280) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + 289, /* (281) add_column_fullname ::= fullname */ + 186, /* (282) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + 186, /* (283) cmd ::= create_vtab */ + 186, /* (284) cmd ::= create_vtab LP vtabarglist RP */ + 291, /* (285) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 293, /* (286) vtabarg ::= */ + 294, /* (287) vtabargtoken ::= ANY */ + 294, /* (288) vtabargtoken ::= lp anylist RP */ + 295, /* (289) lp ::= LP */ + 261, /* (290) with ::= WITH wqlist */ + 261, /* (291) with ::= WITH RECURSIVE wqlist */ + 236, /* (292) wqlist ::= nm eidlist_opt AS LP select RP */ + 236, /* (293) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ + 297, /* (294) windowdefn_list ::= windowdefn */ + 297, /* (295) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + 298, /* (296) windowdefn ::= nm AS LP window RP */ + 299, /* (297) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + 299, /* (298) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + 299, /* (299) window ::= ORDER BY sortlist frame_opt */ + 299, /* (300) window ::= nm ORDER BY sortlist frame_opt */ + 299, /* (301) window ::= frame_opt */ + 299, /* (302) window ::= nm frame_opt */ + 300, /* (303) frame_opt ::= */ + 300, /* (304) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + 300, /* (305) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + 304, /* (306) range_or_rows ::= RANGE|ROWS|GROUPS */ + 306, /* (307) frame_bound_s ::= frame_bound */ + 306, /* (308) frame_bound_s ::= UNBOUNDED PRECEDING */ + 307, /* (309) frame_bound_e ::= frame_bound */ + 307, /* (310) frame_bound_e ::= UNBOUNDED FOLLOWING */ + 305, /* (311) frame_bound ::= expr PRECEDING|FOLLOWING */ + 305, /* (312) frame_bound ::= CURRENT ROW */ + 308, /* (313) frame_exclude_opt ::= */ + 308, /* (314) frame_exclude_opt ::= EXCLUDE frame_exclude */ + 309, /* (315) frame_exclude ::= NO OTHERS */ + 309, /* (316) frame_exclude ::= CURRENT ROW */ + 309, /* (317) frame_exclude ::= GROUP|TIES */ + 246, /* (318) window_clause ::= WINDOW windowdefn_list */ + 266, /* (319) filter_over ::= filter_clause over_clause */ + 266, /* (320) filter_over ::= over_clause */ + 266, /* (321) filter_over ::= filter_clause */ + 303, /* (322) over_clause ::= OVER LP window RP */ + 303, /* (323) over_clause ::= OVER nm */ + 302, /* (324) filter_clause ::= FILTER LP WHERE expr RP */ + 181, /* (325) input ::= cmdlist */ + 182, /* (326) cmdlist ::= cmdlist ecmd */ + 182, /* (327) cmdlist ::= ecmd */ + 183, /* (328) ecmd ::= SEMI */ + 183, /* (329) ecmd ::= cmdx SEMI */ + 183, /* (330) ecmd ::= explain cmdx SEMI */ + 188, /* (331) trans_opt ::= */ + 188, /* (332) trans_opt ::= TRANSACTION */ + 188, /* (333) trans_opt ::= TRANSACTION nm */ + 190, /* (334) savepoint_opt ::= SAVEPOINT */ + 190, /* (335) savepoint_opt ::= */ + 186, /* (336) cmd ::= create_table create_table_args */ + 197, /* (337) columnlist ::= columnlist COMMA columnname carglist */ + 197, /* (338) columnlist ::= columnname carglist */ + 189, /* (339) nm ::= ID|INDEXED */ + 189, /* (340) nm ::= STRING */ + 189, /* (341) nm ::= JOIN_KW */ + 203, /* (342) typetoken ::= typename */ + 204, /* (343) typename ::= ID|STRING */ + 205, /* (344) signed ::= plus_num */ + 205, /* (345) signed ::= minus_num */ + 202, /* (346) carglist ::= carglist ccons */ + 202, /* (347) carglist ::= */ + 210, /* (348) ccons ::= NULL onconf */ + 210, /* (349) ccons ::= GENERATED ALWAYS AS generated */ + 210, /* (350) ccons ::= AS generated */ + 198, /* (351) conslist_opt ::= COMMA conslist */ + 223, /* (352) conslist ::= conslist tconscomma tcons */ + 223, /* (353) conslist ::= tcons */ + 224, /* (354) tconscomma ::= */ + 228, /* (355) defer_subclause_opt ::= defer_subclause */ + 230, /* (356) resolvetype ::= raisetype */ + 234, /* (357) selectnowith ::= oneselect */ + 235, /* (358) oneselect ::= values */ + 249, /* (359) sclp ::= selcollist COMMA */ + 250, /* (360) as ::= ID|STRING */ + 212, /* (361) expr ::= term */ + 267, /* (362) likeop ::= LIKE_KW|MATCH */ + 257, /* (363) exprlist ::= nexprlist */ + 277, /* (364) nmnum ::= plus_num */ + 277, /* (365) nmnum ::= nm */ + 277, /* (366) nmnum ::= ON */ + 277, /* (367) nmnum ::= DELETE */ + 277, /* (368) nmnum ::= DEFAULT */ + 206, /* (369) plus_num ::= INTEGER|FLOAT */ + 282, /* (370) foreach_clause ::= */ + 282, /* (371) foreach_clause ::= FOR EACH ROW */ + 285, /* (372) trnm ::= nm */ + 286, /* (373) tridxby ::= */ + 287, /* (374) database_kw_opt ::= DATABASE */ + 287, /* (375) database_kw_opt ::= */ + 290, /* (376) kwcolumn_opt ::= */ + 290, /* (377) kwcolumn_opt ::= COLUMNKW */ + 292, /* (378) vtabarglist ::= vtabarg */ + 292, /* (379) vtabarglist ::= vtabarglist COMMA vtabarg */ + 293, /* (380) vtabarg ::= vtabarg vtabargtoken */ + 296, /* (381) anylist ::= */ + 296, /* (382) anylist ::= anylist LP anylist RP */ + 296, /* (383) anylist ::= anylist ANY */ + 261, /* (384) with ::= */ +}; + +/* For rule J, yyRuleInfoNRhs[J] contains the negative of the number +** of symbols on the right-hand side of that rule. */ +static const signed char yyRuleInfoNRhs[] = { + -1, /* (0) explain ::= EXPLAIN */ + -3, /* (1) explain ::= EXPLAIN QUERY PLAN */ + -1, /* (2) cmdx ::= cmd */ + -3, /* (3) cmd ::= BEGIN transtype trans_opt */ + 0, /* (4) transtype ::= */ + -1, /* (5) transtype ::= DEFERRED */ + -1, /* (6) transtype ::= IMMEDIATE */ + -1, /* (7) transtype ::= EXCLUSIVE */ + -2, /* (8) cmd ::= COMMIT|END trans_opt */ + -2, /* (9) cmd ::= ROLLBACK trans_opt */ + -2, /* (10) cmd ::= SAVEPOINT nm */ + -3, /* (11) cmd ::= RELEASE savepoint_opt nm */ + -5, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ + -6, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ + -1, /* (14) createkw ::= CREATE */ + 0, /* (15) ifnotexists ::= */ + -3, /* (16) ifnotexists ::= IF NOT EXISTS */ + -1, /* (17) temp ::= TEMP */ + 0, /* (18) temp ::= */ + -5, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */ + -2, /* (20) create_table_args ::= AS select */ + 0, /* (21) table_options ::= */ + -2, /* (22) table_options ::= WITHOUT nm */ + -2, /* (23) columnname ::= nm typetoken */ + 0, /* (24) typetoken ::= */ + -4, /* (25) typetoken ::= typename LP signed RP */ + -6, /* (26) typetoken ::= typename LP signed COMMA signed RP */ + -2, /* (27) typename ::= typename ID|STRING */ + 0, /* (28) scanpt ::= */ + 0, /* (29) scantok ::= */ + -2, /* (30) ccons ::= CONSTRAINT nm */ + -3, /* (31) ccons ::= DEFAULT scantok term */ + -4, /* (32) ccons ::= DEFAULT LP expr RP */ + -4, /* (33) ccons ::= DEFAULT PLUS scantok term */ + -4, /* (34) ccons ::= DEFAULT MINUS scantok term */ + -3, /* (35) ccons ::= DEFAULT scantok ID|INDEXED */ + -3, /* (36) ccons ::= NOT NULL onconf */ + -5, /* (37) ccons ::= PRIMARY KEY sortorder onconf autoinc */ + -2, /* (38) ccons ::= UNIQUE onconf */ + -4, /* (39) ccons ::= CHECK LP expr RP */ + -4, /* (40) ccons ::= REFERENCES nm eidlist_opt refargs */ + -1, /* (41) ccons ::= defer_subclause */ + -2, /* (42) ccons ::= COLLATE ID|STRING */ + -3, /* (43) generated ::= LP expr RP */ + -4, /* (44) generated ::= LP expr RP ID */ + 0, /* (45) autoinc ::= */ + -1, /* (46) autoinc ::= AUTOINCR */ + 0, /* (47) refargs ::= */ + -2, /* (48) refargs ::= refargs refarg */ + -2, /* (49) refarg ::= MATCH nm */ + -3, /* (50) refarg ::= ON INSERT refact */ + -3, /* (51) refarg ::= ON DELETE refact */ + -3, /* (52) refarg ::= ON UPDATE refact */ + -2, /* (53) refact ::= SET NULL */ + -2, /* (54) refact ::= SET DEFAULT */ + -1, /* (55) refact ::= CASCADE */ + -1, /* (56) refact ::= RESTRICT */ + -2, /* (57) refact ::= NO ACTION */ + -3, /* (58) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ + -2, /* (59) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + 0, /* (60) init_deferred_pred_opt ::= */ + -2, /* (61) init_deferred_pred_opt ::= INITIALLY DEFERRED */ + -2, /* (62) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ + 0, /* (63) conslist_opt ::= */ + -1, /* (64) tconscomma ::= COMMA */ + -2, /* (65) tcons ::= CONSTRAINT nm */ + -7, /* (66) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ + -5, /* (67) tcons ::= UNIQUE LP sortlist RP onconf */ + -5, /* (68) tcons ::= CHECK LP expr RP onconf */ + -10, /* (69) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ + 0, /* (70) defer_subclause_opt ::= */ + 0, /* (71) onconf ::= */ + -3, /* (72) onconf ::= ON CONFLICT resolvetype */ + 0, /* (73) orconf ::= */ + -2, /* (74) orconf ::= OR resolvetype */ + -1, /* (75) resolvetype ::= IGNORE */ + -1, /* (76) resolvetype ::= REPLACE */ + -4, /* (77) cmd ::= DROP TABLE ifexists fullname */ + -2, /* (78) ifexists ::= IF EXISTS */ + 0, /* (79) ifexists ::= */ + -9, /* (80) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ + -4, /* (81) cmd ::= DROP VIEW ifexists fullname */ + -1, /* (82) cmd ::= select */ + -3, /* (83) select ::= WITH wqlist selectnowith */ + -4, /* (84) select ::= WITH RECURSIVE wqlist selectnowith */ + -1, /* (85) select ::= selectnowith */ + -3, /* (86) selectnowith ::= selectnowith multiselect_op oneselect */ + -1, /* (87) multiselect_op ::= UNION */ + -2, /* (88) multiselect_op ::= UNION ALL */ + -1, /* (89) multiselect_op ::= EXCEPT|INTERSECT */ + -9, /* (90) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + -10, /* (91) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ + -4, /* (92) values ::= VALUES LP nexprlist RP */ + -5, /* (93) values ::= values COMMA LP nexprlist RP */ + -1, /* (94) distinct ::= DISTINCT */ + -1, /* (95) distinct ::= ALL */ + 0, /* (96) distinct ::= */ + 0, /* (97) sclp ::= */ + -5, /* (98) selcollist ::= sclp scanpt expr scanpt as */ + -3, /* (99) selcollist ::= sclp scanpt STAR */ + -5, /* (100) selcollist ::= sclp scanpt nm DOT STAR */ + -2, /* (101) as ::= AS nm */ + 0, /* (102) as ::= */ + 0, /* (103) from ::= */ + -2, /* (104) from ::= FROM seltablist */ + -2, /* (105) stl_prefix ::= seltablist joinop */ + 0, /* (106) stl_prefix ::= */ + -7, /* (107) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + -9, /* (108) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ + -7, /* (109) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + -7, /* (110) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + 0, /* (111) dbnm ::= */ + -2, /* (112) dbnm ::= DOT nm */ + -1, /* (113) fullname ::= nm */ + -3, /* (114) fullname ::= nm DOT nm */ + -1, /* (115) xfullname ::= nm */ + -3, /* (116) xfullname ::= nm DOT nm */ + -5, /* (117) xfullname ::= nm DOT nm AS nm */ + -3, /* (118) xfullname ::= nm AS nm */ + -1, /* (119) joinop ::= COMMA|JOIN */ + -2, /* (120) joinop ::= JOIN_KW JOIN */ + -3, /* (121) joinop ::= JOIN_KW nm JOIN */ + -4, /* (122) joinop ::= JOIN_KW nm nm JOIN */ + -2, /* (123) on_opt ::= ON expr */ + 0, /* (124) on_opt ::= */ + 0, /* (125) indexed_opt ::= */ + -3, /* (126) indexed_opt ::= INDEXED BY nm */ + -2, /* (127) indexed_opt ::= NOT INDEXED */ + -4, /* (128) using_opt ::= USING LP idlist RP */ + 0, /* (129) using_opt ::= */ + 0, /* (130) orderby_opt ::= */ + -3, /* (131) orderby_opt ::= ORDER BY sortlist */ + -5, /* (132) sortlist ::= sortlist COMMA expr sortorder nulls */ + -3, /* (133) sortlist ::= expr sortorder nulls */ + -1, /* (134) sortorder ::= ASC */ + -1, /* (135) sortorder ::= DESC */ + 0, /* (136) sortorder ::= */ + -2, /* (137) nulls ::= NULLS FIRST */ + -2, /* (138) nulls ::= NULLS LAST */ + 0, /* (139) nulls ::= */ + 0, /* (140) groupby_opt ::= */ + -3, /* (141) groupby_opt ::= GROUP BY nexprlist */ + 0, /* (142) having_opt ::= */ + -2, /* (143) having_opt ::= HAVING expr */ + 0, /* (144) limit_opt ::= */ + -2, /* (145) limit_opt ::= LIMIT expr */ + -4, /* (146) limit_opt ::= LIMIT expr OFFSET expr */ + -4, /* (147) limit_opt ::= LIMIT expr COMMA expr */ + -6, /* (148) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ + 0, /* (149) where_opt ::= */ + -2, /* (150) where_opt ::= WHERE expr */ + -8, /* (151) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ + -5, /* (152) setlist ::= setlist COMMA nm EQ expr */ + -7, /* (153) setlist ::= setlist COMMA LP idlist RP EQ expr */ + -3, /* (154) setlist ::= nm EQ expr */ + -5, /* (155) setlist ::= LP idlist RP EQ expr */ + -7, /* (156) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + -7, /* (157) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ + 0, /* (158) upsert ::= */ + -11, /* (159) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ + -8, /* (160) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ + -4, /* (161) upsert ::= ON CONFLICT DO NOTHING */ + -2, /* (162) insert_cmd ::= INSERT orconf */ + -1, /* (163) insert_cmd ::= REPLACE */ + 0, /* (164) idlist_opt ::= */ + -3, /* (165) idlist_opt ::= LP idlist RP */ + -3, /* (166) idlist ::= idlist COMMA nm */ + -1, /* (167) idlist ::= nm */ + -3, /* (168) expr ::= LP expr RP */ + -1, /* (169) expr ::= ID|INDEXED */ + -1, /* (170) expr ::= JOIN_KW */ + -3, /* (171) expr ::= nm DOT nm */ + -5, /* (172) expr ::= nm DOT nm DOT nm */ + -1, /* (173) term ::= NULL|FLOAT|BLOB */ + -1, /* (174) term ::= STRING */ + -1, /* (175) term ::= INTEGER */ + -1, /* (176) expr ::= VARIABLE */ + -3, /* (177) expr ::= expr COLLATE ID|STRING */ + -6, /* (178) expr ::= CAST LP expr AS typetoken RP */ + -5, /* (179) expr ::= ID|INDEXED LP distinct exprlist RP */ + -4, /* (180) expr ::= ID|INDEXED LP STAR RP */ + -6, /* (181) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ + -5, /* (182) expr ::= ID|INDEXED LP STAR RP filter_over */ + -1, /* (183) term ::= CTIME_KW */ + -5, /* (184) expr ::= LP nexprlist COMMA expr RP */ + -3, /* (185) expr ::= expr AND expr */ + -3, /* (186) expr ::= expr OR expr */ + -3, /* (187) expr ::= expr LT|GT|GE|LE expr */ + -3, /* (188) expr ::= expr EQ|NE expr */ + -3, /* (189) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ + -3, /* (190) expr ::= expr PLUS|MINUS expr */ + -3, /* (191) expr ::= expr STAR|SLASH|REM expr */ + -3, /* (192) expr ::= expr CONCAT expr */ + -2, /* (193) likeop ::= NOT LIKE_KW|MATCH */ + -3, /* (194) expr ::= expr likeop expr */ + -5, /* (195) expr ::= expr likeop expr ESCAPE expr */ + -2, /* (196) expr ::= expr ISNULL|NOTNULL */ + -3, /* (197) expr ::= expr NOT NULL */ + -3, /* (198) expr ::= expr IS expr */ + -4, /* (199) expr ::= expr IS NOT expr */ + -2, /* (200) expr ::= NOT expr */ + -2, /* (201) expr ::= BITNOT expr */ + -2, /* (202) expr ::= PLUS|MINUS expr */ + -1, /* (203) between_op ::= BETWEEN */ + -2, /* (204) between_op ::= NOT BETWEEN */ + -5, /* (205) expr ::= expr between_op expr AND expr */ + -1, /* (206) in_op ::= IN */ + -2, /* (207) in_op ::= NOT IN */ + -5, /* (208) expr ::= expr in_op LP exprlist RP */ + -3, /* (209) expr ::= LP select RP */ + -5, /* (210) expr ::= expr in_op LP select RP */ + -5, /* (211) expr ::= expr in_op nm dbnm paren_exprlist */ + -4, /* (212) expr ::= EXISTS LP select RP */ + -5, /* (213) expr ::= CASE case_operand case_exprlist case_else END */ + -5, /* (214) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + -4, /* (215) case_exprlist ::= WHEN expr THEN expr */ + -2, /* (216) case_else ::= ELSE expr */ + 0, /* (217) case_else ::= */ + -1, /* (218) case_operand ::= expr */ + 0, /* (219) case_operand ::= */ + 0, /* (220) exprlist ::= */ + -3, /* (221) nexprlist ::= nexprlist COMMA expr */ + -1, /* (222) nexprlist ::= expr */ + 0, /* (223) paren_exprlist ::= */ + -3, /* (224) paren_exprlist ::= LP exprlist RP */ + -12, /* (225) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + -1, /* (226) uniqueflag ::= UNIQUE */ + 0, /* (227) uniqueflag ::= */ + 0, /* (228) eidlist_opt ::= */ + -3, /* (229) eidlist_opt ::= LP eidlist RP */ + -5, /* (230) eidlist ::= eidlist COMMA nm collate sortorder */ + -3, /* (231) eidlist ::= nm collate sortorder */ + 0, /* (232) collate ::= */ + -2, /* (233) collate ::= COLLATE ID|STRING */ + -4, /* (234) cmd ::= DROP INDEX ifexists fullname */ + -2, /* (235) cmd ::= VACUUM vinto */ + -3, /* (236) cmd ::= VACUUM nm vinto */ + -2, /* (237) vinto ::= INTO expr */ + 0, /* (238) vinto ::= */ + -3, /* (239) cmd ::= PRAGMA nm dbnm */ + -5, /* (240) cmd ::= PRAGMA nm dbnm EQ nmnum */ + -6, /* (241) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + -5, /* (242) cmd ::= PRAGMA nm dbnm EQ minus_num */ + -6, /* (243) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + -2, /* (244) plus_num ::= PLUS INTEGER|FLOAT */ + -2, /* (245) minus_num ::= MINUS INTEGER|FLOAT */ + -5, /* (246) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + -11, /* (247) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + -1, /* (248) trigger_time ::= BEFORE|AFTER */ + -2, /* (249) trigger_time ::= INSTEAD OF */ + 0, /* (250) trigger_time ::= */ + -1, /* (251) trigger_event ::= DELETE|INSERT */ + -1, /* (252) trigger_event ::= UPDATE */ + -3, /* (253) trigger_event ::= UPDATE OF idlist */ + 0, /* (254) when_clause ::= */ + -2, /* (255) when_clause ::= WHEN expr */ + -3, /* (256) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + -2, /* (257) trigger_cmd_list ::= trigger_cmd SEMI */ + -3, /* (258) trnm ::= nm DOT nm */ + -3, /* (259) tridxby ::= INDEXED BY nm */ + -2, /* (260) tridxby ::= NOT INDEXED */ + -8, /* (261) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ + -8, /* (262) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + -6, /* (263) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + -3, /* (264) trigger_cmd ::= scanpt select scanpt */ + -4, /* (265) expr ::= RAISE LP IGNORE RP */ + -6, /* (266) expr ::= RAISE LP raisetype COMMA nm RP */ + -1, /* (267) raisetype ::= ROLLBACK */ + -1, /* (268) raisetype ::= ABORT */ + -1, /* (269) raisetype ::= FAIL */ + -4, /* (270) cmd ::= DROP TRIGGER ifexists fullname */ + -6, /* (271) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + -3, /* (272) cmd ::= DETACH database_kw_opt expr */ + 0, /* (273) key_opt ::= */ + -2, /* (274) key_opt ::= KEY expr */ + -1, /* (275) cmd ::= REINDEX */ + -3, /* (276) cmd ::= REINDEX nm dbnm */ + -1, /* (277) cmd ::= ANALYZE */ + -3, /* (278) cmd ::= ANALYZE nm dbnm */ + -6, /* (279) cmd ::= ALTER TABLE fullname RENAME TO nm */ + -7, /* (280) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + -1, /* (281) add_column_fullname ::= fullname */ + -8, /* (282) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + -1, /* (283) cmd ::= create_vtab */ + -4, /* (284) cmd ::= create_vtab LP vtabarglist RP */ + -8, /* (285) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 0, /* (286) vtabarg ::= */ + -1, /* (287) vtabargtoken ::= ANY */ + -3, /* (288) vtabargtoken ::= lp anylist RP */ + -1, /* (289) lp ::= LP */ + -2, /* (290) with ::= WITH wqlist */ + -3, /* (291) with ::= WITH RECURSIVE wqlist */ + -6, /* (292) wqlist ::= nm eidlist_opt AS LP select RP */ + -8, /* (293) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ + -1, /* (294) windowdefn_list ::= windowdefn */ + -3, /* (295) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + -5, /* (296) windowdefn ::= nm AS LP window RP */ + -5, /* (297) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + -6, /* (298) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + -4, /* (299) window ::= ORDER BY sortlist frame_opt */ + -5, /* (300) window ::= nm ORDER BY sortlist frame_opt */ + -1, /* (301) window ::= frame_opt */ + -2, /* (302) window ::= nm frame_opt */ + 0, /* (303) frame_opt ::= */ + -3, /* (304) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + -6, /* (305) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + -1, /* (306) range_or_rows ::= RANGE|ROWS|GROUPS */ + -1, /* (307) frame_bound_s ::= frame_bound */ + -2, /* (308) frame_bound_s ::= UNBOUNDED PRECEDING */ + -1, /* (309) frame_bound_e ::= frame_bound */ + -2, /* (310) frame_bound_e ::= UNBOUNDED FOLLOWING */ + -2, /* (311) frame_bound ::= expr PRECEDING|FOLLOWING */ + -2, /* (312) frame_bound ::= CURRENT ROW */ + 0, /* (313) frame_exclude_opt ::= */ + -2, /* (314) frame_exclude_opt ::= EXCLUDE frame_exclude */ + -2, /* (315) frame_exclude ::= NO OTHERS */ + -2, /* (316) frame_exclude ::= CURRENT ROW */ + -1, /* (317) frame_exclude ::= GROUP|TIES */ + -2, /* (318) window_clause ::= WINDOW windowdefn_list */ + -2, /* (319) filter_over ::= filter_clause over_clause */ + -1, /* (320) filter_over ::= over_clause */ + -1, /* (321) filter_over ::= filter_clause */ + -4, /* (322) over_clause ::= OVER LP window RP */ + -2, /* (323) over_clause ::= OVER nm */ + -5, /* (324) filter_clause ::= FILTER LP WHERE expr RP */ + -1, /* (325) input ::= cmdlist */ + -2, /* (326) cmdlist ::= cmdlist ecmd */ + -1, /* (327) cmdlist ::= ecmd */ + -1, /* (328) ecmd ::= SEMI */ + -2, /* (329) ecmd ::= cmdx SEMI */ + -3, /* (330) ecmd ::= explain cmdx SEMI */ + 0, /* (331) trans_opt ::= */ + -1, /* (332) trans_opt ::= TRANSACTION */ + -2, /* (333) trans_opt ::= TRANSACTION nm */ + -1, /* (334) savepoint_opt ::= SAVEPOINT */ + 0, /* (335) savepoint_opt ::= */ + -2, /* (336) cmd ::= create_table create_table_args */ + -4, /* (337) columnlist ::= columnlist COMMA columnname carglist */ + -2, /* (338) columnlist ::= columnname carglist */ + -1, /* (339) nm ::= ID|INDEXED */ + -1, /* (340) nm ::= STRING */ + -1, /* (341) nm ::= JOIN_KW */ + -1, /* (342) typetoken ::= typename */ + -1, /* (343) typename ::= ID|STRING */ + -1, /* (344) signed ::= plus_num */ + -1, /* (345) signed ::= minus_num */ + -2, /* (346) carglist ::= carglist ccons */ + 0, /* (347) carglist ::= */ + -2, /* (348) ccons ::= NULL onconf */ + -4, /* (349) ccons ::= GENERATED ALWAYS AS generated */ + -2, /* (350) ccons ::= AS generated */ + -2, /* (351) conslist_opt ::= COMMA conslist */ + -3, /* (352) conslist ::= conslist tconscomma tcons */ + -1, /* (353) conslist ::= tcons */ + 0, /* (354) tconscomma ::= */ + -1, /* (355) defer_subclause_opt ::= defer_subclause */ + -1, /* (356) resolvetype ::= raisetype */ + -1, /* (357) selectnowith ::= oneselect */ + -1, /* (358) oneselect ::= values */ + -2, /* (359) sclp ::= selcollist COMMA */ + -1, /* (360) as ::= ID|STRING */ + -1, /* (361) expr ::= term */ + -1, /* (362) likeop ::= LIKE_KW|MATCH */ + -1, /* (363) exprlist ::= nexprlist */ + -1, /* (364) nmnum ::= plus_num */ + -1, /* (365) nmnum ::= nm */ + -1, /* (366) nmnum ::= ON */ + -1, /* (367) nmnum ::= DELETE */ + -1, /* (368) nmnum ::= DEFAULT */ + -1, /* (369) plus_num ::= INTEGER|FLOAT */ + 0, /* (370) foreach_clause ::= */ + -3, /* (371) foreach_clause ::= FOR EACH ROW */ + -1, /* (372) trnm ::= nm */ + 0, /* (373) tridxby ::= */ + -1, /* (374) database_kw_opt ::= DATABASE */ + 0, /* (375) database_kw_opt ::= */ + 0, /* (376) kwcolumn_opt ::= */ + -1, /* (377) kwcolumn_opt ::= COLUMNKW */ + -1, /* (378) vtabarglist ::= vtabarg */ + -3, /* (379) vtabarglist ::= vtabarglist COMMA vtabarg */ + -2, /* (380) vtabarg ::= vtabarg vtabargtoken */ + 0, /* (381) anylist ::= */ + -4, /* (382) anylist ::= anylist LP anylist RP */ + -2, /* (383) anylist ::= anylist ANY */ + 0, /* (384) with ::= */ +}; + +static void yy_accept(yyParser*); /* Forward Declaration */ + +/* +** Perform a reduce action and the shift that must immediately +** follow the reduce. +** +** The yyLookahead and yyLookaheadToken parameters provide reduce actions +** access to the lookahead token (if any). The yyLookahead will be YYNOCODE +** if the lookahead token has already been consumed. As this procedure is +** only called from one place, optimizing compilers will in-line it, which +** means that the extra parameters have no performance impact. +*/ +static YYACTIONTYPE yy_reduce( + yyParser *yypParser, /* The parser */ + unsigned int yyruleno, /* Number of the rule by which to reduce */ + int yyLookahead, /* Lookahead token, or YYNOCODE if none */ + sqlite3ParserTOKENTYPE yyLookaheadToken /* Value of the lookahead token */ + sqlite3ParserCTX_PDECL /* %extra_context */ +){ + int yygoto; /* The next state */ + YYACTIONTYPE yyact; /* The next action */ + yyStackEntry *yymsp; /* The top of the parser's stack */ + int yysize; /* Amount to pop the stack */ + sqlite3ParserARG_FETCH + (void)yyLookahead; + (void)yyLookaheadToken; + yymsp = yypParser->yytos; +#ifndef NDEBUG + if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ + yysize = yyRuleInfoNRhs[yyruleno]; + if( yysize ){ + fprintf(yyTraceFILE, "%sReduce %d [%s]%s, pop back to state %d.\n", + yyTracePrompt, + yyruleno, yyRuleName[yyruleno], + yyrulenoyytos - yypParser->yystack)>yypParser->yyhwm ){ + yypParser->yyhwm++; + assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); + } +#endif +#if YYSTACKDEPTH>0 + if( yypParser->yytos>=yypParser->yystackEnd ){ + yyStackOverflow(yypParser); + /* The call to yyStackOverflow() above pops the stack until it is + ** empty, causing the main parser loop to exit. So the return value + ** is never used and does not matter. */ + return 0; + } +#else + if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ + if( yyGrowStack(yypParser) ){ + yyStackOverflow(yypParser); + /* The call to yyStackOverflow() above pops the stack until it is + ** empty, causing the main parser loop to exit. So the return value + ** is never used and does not matter. */ + return 0; + } + yymsp = yypParser->yytos; + } +#endif + } + + switch( yyruleno ){ + /* Beginning here are the reduction cases. A typical example + ** follows: + ** case 0: + ** #line + ** { ... } // User supplied code + ** #line + ** break; + */ +/********** Begin reduce actions **********************************************/ + YYMINORTYPE yylhsminor; + case 0: /* explain ::= EXPLAIN */ +{ pParse->explain = 1; } + break; + case 1: /* explain ::= EXPLAIN QUERY PLAN */ +{ pParse->explain = 2; } + break; + case 2: /* cmdx ::= cmd */ +{ sqlite3FinishCoding(pParse); } + break; + case 3: /* cmd ::= BEGIN transtype trans_opt */ +{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy192);} + break; + case 4: /* transtype ::= */ +{yymsp[1].minor.yy192 = TK_DEFERRED;} + break; + case 5: /* transtype ::= DEFERRED */ + case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); + case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); + case 306: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==306); +{yymsp[0].minor.yy192 = yymsp[0].major; /*A-overwrites-X*/} + break; + case 8: /* cmd ::= COMMIT|END trans_opt */ + case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9); +{sqlite3EndTransaction(pParse,yymsp[-1].major);} + break; + case 10: /* cmd ::= SAVEPOINT nm */ +{ + sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &yymsp[0].minor.yy0); +} + break; + case 11: /* cmd ::= RELEASE savepoint_opt nm */ +{ + sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &yymsp[0].minor.yy0); +} + break; + case 12: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ +{ + sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &yymsp[0].minor.yy0); +} + break; + case 13: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ +{ + sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy192,0,0,yymsp[-2].minor.yy192); +} + break; + case 14: /* createkw ::= CREATE */ +{disableLookaside(pParse);} + break; + case 15: /* ifnotexists ::= */ + case 18: /* temp ::= */ yytestcase(yyruleno==18); + case 21: /* table_options ::= */ yytestcase(yyruleno==21); + case 45: /* autoinc ::= */ yytestcase(yyruleno==45); + case 60: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==60); + case 70: /* defer_subclause_opt ::= */ yytestcase(yyruleno==70); + case 79: /* ifexists ::= */ yytestcase(yyruleno==79); + case 96: /* distinct ::= */ yytestcase(yyruleno==96); + case 232: /* collate ::= */ yytestcase(yyruleno==232); +{yymsp[1].minor.yy192 = 0;} + break; + case 16: /* ifnotexists ::= IF NOT EXISTS */ +{yymsp[-2].minor.yy192 = 1;} + break; + case 17: /* temp ::= TEMP */ + case 46: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==46); +{yymsp[0].minor.yy192 = 1;} + break; + case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_options */ +{ + sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy192,0); +} + break; + case 20: /* create_table_args ::= AS select */ +{ + sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy539); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy539); +} + break; + case 22: /* table_options ::= WITHOUT nm */ +{ + if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){ + yymsp[-1].minor.yy192 = TF_WithoutRowid | TF_NoVisibleRowid; + }else{ + yymsp[-1].minor.yy192 = 0; + sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); + } +} + break; + case 23: /* columnname ::= nm typetoken */ +{sqlite3AddColumn(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);} + break; + case 24: /* typetoken ::= */ + case 63: /* conslist_opt ::= */ yytestcase(yyruleno==63); + case 102: /* as ::= */ yytestcase(yyruleno==102); +{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;} + break; + case 25: /* typetoken ::= typename LP signed RP */ +{ + yymsp[-3].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z); +} + break; + case 26: /* typetoken ::= typename LP signed COMMA signed RP */ +{ + yymsp[-5].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z); +} + break; + case 27: /* typename ::= typename ID|STRING */ +{yymsp[-1].minor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);} + break; + case 28: /* scanpt ::= */ +{ + assert( yyLookahead!=YYNOCODE ); + yymsp[1].minor.yy436 = yyLookaheadToken.z; +} + break; + case 29: /* scantok ::= */ +{ + assert( yyLookahead!=YYNOCODE ); + yymsp[1].minor.yy0 = yyLookaheadToken; +} + break; + case 30: /* ccons ::= CONSTRAINT nm */ + case 65: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==65); +{pParse->constraintName = yymsp[0].minor.yy0;} + break; + case 31: /* ccons ::= DEFAULT scantok term */ +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy202,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} + break; + case 32: /* ccons ::= DEFAULT LP expr RP */ +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy202,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} + break; + case 33: /* ccons ::= DEFAULT PLUS scantok term */ +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy202,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} + break; + case 34: /* ccons ::= DEFAULT MINUS scantok term */ +{ + Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy202, 0); + sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]); +} + break; + case 35: /* ccons ::= DEFAULT scantok ID|INDEXED */ +{ + Expr *p = tokenExpr(pParse, TK_STRING, yymsp[0].minor.yy0); + if( p ){ + sqlite3ExprIdToTrueFalse(p); + testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) ); + } + sqlite3AddDefaultValue(pParse,p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.z+yymsp[0].minor.yy0.n); +} + break; + case 36: /* ccons ::= NOT NULL onconf */ +{sqlite3AddNotNull(pParse, yymsp[0].minor.yy192);} + break; + case 37: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ +{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy192,yymsp[0].minor.yy192,yymsp[-2].minor.yy192);} + break; + case 38: /* ccons ::= UNIQUE onconf */ +{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy192,0,0,0,0, + SQLITE_IDXTYPE_UNIQUE);} + break; + case 39: /* ccons ::= CHECK LP expr RP */ +{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy202);} + break; + case 40: /* ccons ::= REFERENCES nm eidlist_opt refargs */ +{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy242,yymsp[0].minor.yy192);} + break; + case 41: /* ccons ::= defer_subclause */ +{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy192);} + break; + case 42: /* ccons ::= COLLATE ID|STRING */ +{sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);} + break; + case 43: /* generated ::= LP expr RP */ +{sqlite3AddGenerated(pParse,yymsp[-1].minor.yy202,0);} + break; + case 44: /* generated ::= LP expr RP ID */ +{sqlite3AddGenerated(pParse,yymsp[-2].minor.yy202,&yymsp[0].minor.yy0);} + break; + case 47: /* refargs ::= */ +{ yymsp[1].minor.yy192 = OE_None*0x0101; /* EV: R-19803-45884 */} + break; + case 48: /* refargs ::= refargs refarg */ +{ yymsp[-1].minor.yy192 = (yymsp[-1].minor.yy192 & ~yymsp[0].minor.yy207.mask) | yymsp[0].minor.yy207.value; } + break; + case 49: /* refarg ::= MATCH nm */ +{ yymsp[-1].minor.yy207.value = 0; yymsp[-1].minor.yy207.mask = 0x000000; } + break; + case 50: /* refarg ::= ON INSERT refact */ +{ yymsp[-2].minor.yy207.value = 0; yymsp[-2].minor.yy207.mask = 0x000000; } + break; + case 51: /* refarg ::= ON DELETE refact */ +{ yymsp[-2].minor.yy207.value = yymsp[0].minor.yy192; yymsp[-2].minor.yy207.mask = 0x0000ff; } + break; + case 52: /* refarg ::= ON UPDATE refact */ +{ yymsp[-2].minor.yy207.value = yymsp[0].minor.yy192<<8; yymsp[-2].minor.yy207.mask = 0x00ff00; } + break; + case 53: /* refact ::= SET NULL */ +{ yymsp[-1].minor.yy192 = OE_SetNull; /* EV: R-33326-45252 */} + break; + case 54: /* refact ::= SET DEFAULT */ +{ yymsp[-1].minor.yy192 = OE_SetDflt; /* EV: R-33326-45252 */} + break; + case 55: /* refact ::= CASCADE */ +{ yymsp[0].minor.yy192 = OE_Cascade; /* EV: R-33326-45252 */} + break; + case 56: /* refact ::= RESTRICT */ +{ yymsp[0].minor.yy192 = OE_Restrict; /* EV: R-33326-45252 */} + break; + case 57: /* refact ::= NO ACTION */ +{ yymsp[-1].minor.yy192 = OE_None; /* EV: R-33326-45252 */} + break; + case 58: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ +{yymsp[-2].minor.yy192 = 0;} + break; + case 59: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + case 74: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==74); + case 162: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==162); +{yymsp[-1].minor.yy192 = yymsp[0].minor.yy192;} + break; + case 61: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ + case 78: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==78); + case 204: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==204); + case 207: /* in_op ::= NOT IN */ yytestcase(yyruleno==207); + case 233: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==233); +{yymsp[-1].minor.yy192 = 1;} + break; + case 62: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ +{yymsp[-1].minor.yy192 = 0;} + break; + case 64: /* tconscomma ::= COMMA */ +{pParse->constraintName.n = 0;} + break; + case 66: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ +{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy242,yymsp[0].minor.yy192,yymsp[-2].minor.yy192,0);} + break; + case 67: /* tcons ::= UNIQUE LP sortlist RP onconf */ +{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy242,yymsp[0].minor.yy192,0,0,0,0, + SQLITE_IDXTYPE_UNIQUE);} + break; + case 68: /* tcons ::= CHECK LP expr RP onconf */ +{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy202);} + break; + case 69: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ +{ + sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy242, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy242, yymsp[-1].minor.yy192); + sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy192); +} + break; + case 71: /* onconf ::= */ + case 73: /* orconf ::= */ yytestcase(yyruleno==73); +{yymsp[1].minor.yy192 = OE_Default;} + break; + case 72: /* onconf ::= ON CONFLICT resolvetype */ +{yymsp[-2].minor.yy192 = yymsp[0].minor.yy192;} + break; + case 75: /* resolvetype ::= IGNORE */ +{yymsp[0].minor.yy192 = OE_Ignore;} + break; + case 76: /* resolvetype ::= REPLACE */ + case 163: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==163); +{yymsp[0].minor.yy192 = OE_Replace;} + break; + case 77: /* cmd ::= DROP TABLE ifexists fullname */ +{ + sqlite3DropTable(pParse, yymsp[0].minor.yy47, 0, yymsp[-1].minor.yy192); +} + break; + case 80: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ +{ + sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy242, yymsp[0].minor.yy539, yymsp[-7].minor.yy192, yymsp[-5].minor.yy192); +} + break; + case 81: /* cmd ::= DROP VIEW ifexists fullname */ +{ + sqlite3DropTable(pParse, yymsp[0].minor.yy47, 1, yymsp[-1].minor.yy192); +} + break; + case 82: /* cmd ::= select */ +{ + SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; + sqlite3Select(pParse, yymsp[0].minor.yy539, &dest); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy539); +} + break; + case 83: /* select ::= WITH wqlist selectnowith */ +{ + Select *p = yymsp[0].minor.yy539; + if( p ){ + p->pWith = yymsp[-1].minor.yy131; + parserDoubleLinkSelect(pParse, p); + }else{ + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy131); + } + yymsp[-2].minor.yy539 = p; +} + break; + case 84: /* select ::= WITH RECURSIVE wqlist selectnowith */ +{ + Select *p = yymsp[0].minor.yy539; + if( p ){ + p->pWith = yymsp[-1].minor.yy131; + parserDoubleLinkSelect(pParse, p); + }else{ + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy131); + } + yymsp[-3].minor.yy539 = p; +} + break; + case 85: /* select ::= selectnowith */ +{ + Select *p = yymsp[0].minor.yy539; + if( p ){ + parserDoubleLinkSelect(pParse, p); + } + yymsp[0].minor.yy539 = p; /*A-overwrites-X*/ +} + break; + case 86: /* selectnowith ::= selectnowith multiselect_op oneselect */ +{ + Select *pRhs = yymsp[0].minor.yy539; + Select *pLhs = yymsp[-2].minor.yy539; + if( pRhs && pRhs->pPrior ){ + SrcList *pFrom; + Token x; + x.n = 0; + parserDoubleLinkSelect(pParse, pRhs); + pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); + pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); + } + if( pRhs ){ + pRhs->op = (u8)yymsp[-1].minor.yy192; + pRhs->pPrior = pLhs; + if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; + pRhs->selFlags &= ~SF_MultiValue; + if( yymsp[-1].minor.yy192!=TK_ALL ) pParse->hasCompound = 1; + }else{ + sqlite3SelectDelete(pParse->db, pLhs); + } + yymsp[-2].minor.yy539 = pRhs; +} + break; + case 87: /* multiselect_op ::= UNION */ + case 89: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==89); +{yymsp[0].minor.yy192 = yymsp[0].major; /*A-overwrites-OP*/} + break; + case 88: /* multiselect_op ::= UNION ALL */ +{yymsp[-1].minor.yy192 = TK_ALL;} + break; + case 90: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ +{ + yymsp[-8].minor.yy539 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy242,yymsp[-5].minor.yy47,yymsp[-4].minor.yy202,yymsp[-3].minor.yy242,yymsp[-2].minor.yy202,yymsp[-1].minor.yy242,yymsp[-7].minor.yy192,yymsp[0].minor.yy202); +} + break; + case 91: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ +{ + yymsp[-9].minor.yy539 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy242,yymsp[-6].minor.yy47,yymsp[-5].minor.yy202,yymsp[-4].minor.yy242,yymsp[-3].minor.yy202,yymsp[-1].minor.yy242,yymsp[-8].minor.yy192,yymsp[0].minor.yy202); + if( yymsp[-9].minor.yy539 ){ + yymsp[-9].minor.yy539->pWinDefn = yymsp[-2].minor.yy303; + }else{ + sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy303); + } +} + break; + case 92: /* values ::= VALUES LP nexprlist RP */ +{ + yymsp[-3].minor.yy539 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy242,0,0,0,0,0,SF_Values,0); +} + break; + case 93: /* values ::= values COMMA LP nexprlist RP */ +{ + Select *pRight, *pLeft = yymsp[-4].minor.yy539; + pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy242,0,0,0,0,0,SF_Values|SF_MultiValue,0); + if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; + if( pRight ){ + pRight->op = TK_ALL; + pRight->pPrior = pLeft; + yymsp[-4].minor.yy539 = pRight; + }else{ + yymsp[-4].minor.yy539 = pLeft; + } +} + break; + case 94: /* distinct ::= DISTINCT */ +{yymsp[0].minor.yy192 = SF_Distinct;} + break; + case 95: /* distinct ::= ALL */ +{yymsp[0].minor.yy192 = SF_All;} + break; + case 97: /* sclp ::= */ + case 130: /* orderby_opt ::= */ yytestcase(yyruleno==130); + case 140: /* groupby_opt ::= */ yytestcase(yyruleno==140); + case 220: /* exprlist ::= */ yytestcase(yyruleno==220); + case 223: /* paren_exprlist ::= */ yytestcase(yyruleno==223); + case 228: /* eidlist_opt ::= */ yytestcase(yyruleno==228); +{yymsp[1].minor.yy242 = 0;} + break; + case 98: /* selcollist ::= sclp scanpt expr scanpt as */ +{ + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy242, yymsp[-2].minor.yy202); + if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy242, &yymsp[0].minor.yy0, 1); + sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy242,yymsp[-3].minor.yy436,yymsp[-1].minor.yy436); +} + break; + case 99: /* selcollist ::= sclp scanpt STAR */ +{ + Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); + yymsp[-2].minor.yy242 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy242, p); +} + break; + case 100: /* selcollist ::= sclp scanpt nm DOT STAR */ +{ + Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); + Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); + Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy242, pDot); +} + break; + case 101: /* as ::= AS nm */ + case 112: /* dbnm ::= DOT nm */ yytestcase(yyruleno==112); + case 244: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==244); + case 245: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==245); +{yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} + break; + case 103: /* from ::= */ +{yymsp[1].minor.yy47 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy47));} + break; + case 104: /* from ::= FROM seltablist */ +{ + yymsp[-1].minor.yy47 = yymsp[0].minor.yy47; + sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy47); +} + break; + case 105: /* stl_prefix ::= seltablist joinop */ +{ + if( ALWAYS(yymsp[-1].minor.yy47 && yymsp[-1].minor.yy47->nSrc>0) ) yymsp[-1].minor.yy47->a[yymsp[-1].minor.yy47->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy192; +} + break; + case 106: /* stl_prefix ::= */ +{yymsp[1].minor.yy47 = 0;} + break; + case 107: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ +{ + yymsp[-6].minor.yy47 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy47,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy202,yymsp[0].minor.yy600); + sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy47, &yymsp[-2].minor.yy0); +} + break; + case 108: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ +{ + yymsp[-8].minor.yy47 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy47,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy202,yymsp[0].minor.yy600); + sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy47, yymsp[-4].minor.yy242); +} + break; + case 109: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ +{ + yymsp[-6].minor.yy47 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy47,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy539,yymsp[-1].minor.yy202,yymsp[0].minor.yy600); + } + break; + case 110: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ +{ + if( yymsp[-6].minor.yy47==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy202==0 && yymsp[0].minor.yy600==0 ){ + yymsp[-6].minor.yy47 = yymsp[-4].minor.yy47; + }else if( yymsp[-4].minor.yy47->nSrc==1 ){ + yymsp[-6].minor.yy47 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy47,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy202,yymsp[0].minor.yy600); + if( yymsp[-6].minor.yy47 ){ + struct SrcList_item *pNew = &yymsp[-6].minor.yy47->a[yymsp[-6].minor.yy47->nSrc-1]; + struct SrcList_item *pOld = yymsp[-4].minor.yy47->a; + pNew->zName = pOld->zName; + pNew->zDatabase = pOld->zDatabase; + pNew->pSelect = pOld->pSelect; + if( pOld->fg.isTabFunc ){ + pNew->u1.pFuncArg = pOld->u1.pFuncArg; + pOld->u1.pFuncArg = 0; + pOld->fg.isTabFunc = 0; + pNew->fg.isTabFunc = 1; + } + pOld->zName = pOld->zDatabase = 0; + pOld->pSelect = 0; + } + sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy47); + }else{ + Select *pSubquery; + sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy47); + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy47,0,0,0,0,SF_NestedFrom,0); + yymsp[-6].minor.yy47 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy47,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy202,yymsp[0].minor.yy600); + } + } + break; + case 111: /* dbnm ::= */ + case 125: /* indexed_opt ::= */ yytestcase(yyruleno==125); +{yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;} + break; + case 113: /* fullname ::= nm */ +{ + yylhsminor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); + if( IN_RENAME_OBJECT && yylhsminor.yy47 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy47->a[0].zName, &yymsp[0].minor.yy0); +} + yymsp[0].minor.yy47 = yylhsminor.yy47; + break; + case 114: /* fullname ::= nm DOT nm */ +{ + yylhsminor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); + if( IN_RENAME_OBJECT && yylhsminor.yy47 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy47->a[0].zName, &yymsp[0].minor.yy0); +} + yymsp[-2].minor.yy47 = yylhsminor.yy47; + break; + case 115: /* xfullname ::= nm */ +{yymsp[0].minor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} + break; + case 116: /* xfullname ::= nm DOT nm */ +{yymsp[-2].minor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} + break; + case 117: /* xfullname ::= nm DOT nm AS nm */ +{ + yymsp[-4].minor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ + if( yymsp[-4].minor.yy47 ) yymsp[-4].minor.yy47->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); +} + break; + case 118: /* xfullname ::= nm AS nm */ +{ + yymsp[-2].minor.yy47 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ + if( yymsp[-2].minor.yy47 ) yymsp[-2].minor.yy47->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); +} + break; + case 119: /* joinop ::= COMMA|JOIN */ +{ yymsp[0].minor.yy192 = JT_INNER; } + break; + case 120: /* joinop ::= JOIN_KW JOIN */ +{yymsp[-1].minor.yy192 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} + break; + case 121: /* joinop ::= JOIN_KW nm JOIN */ +{yymsp[-2].minor.yy192 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} + break; + case 122: /* joinop ::= JOIN_KW nm nm JOIN */ +{yymsp[-3].minor.yy192 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} + break; + case 123: /* on_opt ::= ON expr */ + case 143: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==143); + case 150: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==150); + case 216: /* case_else ::= ELSE expr */ yytestcase(yyruleno==216); + case 237: /* vinto ::= INTO expr */ yytestcase(yyruleno==237); +{yymsp[-1].minor.yy202 = yymsp[0].minor.yy202;} + break; + case 124: /* on_opt ::= */ + case 142: /* having_opt ::= */ yytestcase(yyruleno==142); + case 144: /* limit_opt ::= */ yytestcase(yyruleno==144); + case 149: /* where_opt ::= */ yytestcase(yyruleno==149); + case 217: /* case_else ::= */ yytestcase(yyruleno==217); + case 219: /* case_operand ::= */ yytestcase(yyruleno==219); + case 238: /* vinto ::= */ yytestcase(yyruleno==238); +{yymsp[1].minor.yy202 = 0;} + break; + case 126: /* indexed_opt ::= INDEXED BY nm */ +{yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} + break; + case 127: /* indexed_opt ::= NOT INDEXED */ +{yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} + break; + case 128: /* using_opt ::= USING LP idlist RP */ +{yymsp[-3].minor.yy600 = yymsp[-1].minor.yy600;} + break; + case 129: /* using_opt ::= */ + case 164: /* idlist_opt ::= */ yytestcase(yyruleno==164); +{yymsp[1].minor.yy600 = 0;} + break; + case 131: /* orderby_opt ::= ORDER BY sortlist */ + case 141: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==141); +{yymsp[-2].minor.yy242 = yymsp[0].minor.yy242;} + break; + case 132: /* sortlist ::= sortlist COMMA expr sortorder nulls */ +{ + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy242,yymsp[-2].minor.yy202); + sqlite3ExprListSetSortOrder(yymsp[-4].minor.yy242,yymsp[-1].minor.yy192,yymsp[0].minor.yy192); +} + break; + case 133: /* sortlist ::= expr sortorder nulls */ +{ + yymsp[-2].minor.yy242 = sqlite3ExprListAppend(pParse,0,yymsp[-2].minor.yy202); /*A-overwrites-Y*/ + sqlite3ExprListSetSortOrder(yymsp[-2].minor.yy242,yymsp[-1].minor.yy192,yymsp[0].minor.yy192); +} + break; + case 134: /* sortorder ::= ASC */ +{yymsp[0].minor.yy192 = SQLITE_SO_ASC;} + break; + case 135: /* sortorder ::= DESC */ +{yymsp[0].minor.yy192 = SQLITE_SO_DESC;} + break; + case 136: /* sortorder ::= */ + case 139: /* nulls ::= */ yytestcase(yyruleno==139); +{yymsp[1].minor.yy192 = SQLITE_SO_UNDEFINED;} + break; + case 137: /* nulls ::= NULLS FIRST */ +{yymsp[-1].minor.yy192 = SQLITE_SO_ASC;} + break; + case 138: /* nulls ::= NULLS LAST */ +{yymsp[-1].minor.yy192 = SQLITE_SO_DESC;} + break; + case 145: /* limit_opt ::= LIMIT expr */ +{yymsp[-1].minor.yy202 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy202,0);} + break; + case 146: /* limit_opt ::= LIMIT expr OFFSET expr */ +{yymsp[-3].minor.yy202 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy202,yymsp[0].minor.yy202);} + break; + case 147: /* limit_opt ::= LIMIT expr COMMA expr */ +{yymsp[-3].minor.yy202 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy202,yymsp[-2].minor.yy202);} + break; + case 148: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ +{ + sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy47, &yymsp[-1].minor.yy0); + sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy47,yymsp[0].minor.yy202,0,0); +} + break; + case 151: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ +{ + sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy47, &yymsp[-3].minor.yy0); + sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy242,"set list"); + sqlite3Update(pParse,yymsp[-4].minor.yy47,yymsp[-1].minor.yy242,yymsp[0].minor.yy202,yymsp[-5].minor.yy192,0,0,0); +} + break; + case 152: /* setlist ::= setlist COMMA nm EQ expr */ +{ + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy242, yymsp[0].minor.yy202); + sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy242, &yymsp[-2].minor.yy0, 1); +} + break; + case 153: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ +{ + yymsp[-6].minor.yy242 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy242, yymsp[-3].minor.yy600, yymsp[0].minor.yy202); +} + break; + case 154: /* setlist ::= nm EQ expr */ +{ + yylhsminor.yy242 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy202); + sqlite3ExprListSetName(pParse, yylhsminor.yy242, &yymsp[-2].minor.yy0, 1); +} + yymsp[-2].minor.yy242 = yylhsminor.yy242; + break; + case 155: /* setlist ::= LP idlist RP EQ expr */ +{ + yymsp[-4].minor.yy242 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy600, yymsp[0].minor.yy202); +} + break; + case 156: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ +{ + sqlite3Insert(pParse, yymsp[-3].minor.yy47, yymsp[-1].minor.yy539, yymsp[-2].minor.yy600, yymsp[-5].minor.yy192, yymsp[0].minor.yy318); +} + break; + case 157: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ +{ + sqlite3Insert(pParse, yymsp[-3].minor.yy47, 0, yymsp[-2].minor.yy600, yymsp[-5].minor.yy192, 0); +} + break; + case 158: /* upsert ::= */ +{ yymsp[1].minor.yy318 = 0; } + break; + case 159: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ +{ yymsp[-10].minor.yy318 = sqlite3UpsertNew(pParse->db,yymsp[-7].minor.yy242,yymsp[-5].minor.yy202,yymsp[-1].minor.yy242,yymsp[0].minor.yy202);} + break; + case 160: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ +{ yymsp[-7].minor.yy318 = sqlite3UpsertNew(pParse->db,yymsp[-4].minor.yy242,yymsp[-2].minor.yy202,0,0); } + break; + case 161: /* upsert ::= ON CONFLICT DO NOTHING */ +{ yymsp[-3].minor.yy318 = sqlite3UpsertNew(pParse->db,0,0,0,0); } + break; + case 165: /* idlist_opt ::= LP idlist RP */ +{yymsp[-2].minor.yy600 = yymsp[-1].minor.yy600;} + break; + case 166: /* idlist ::= idlist COMMA nm */ +{yymsp[-2].minor.yy600 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy600,&yymsp[0].minor.yy0);} + break; + case 167: /* idlist ::= nm */ +{yymsp[0].minor.yy600 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} + break; + case 168: /* expr ::= LP expr RP */ +{yymsp[-2].minor.yy202 = yymsp[-1].minor.yy202;} + break; + case 169: /* expr ::= ID|INDEXED */ + case 170: /* expr ::= JOIN_KW */ yytestcase(yyruleno==170); +{yymsp[0].minor.yy202=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} + break; + case 171: /* expr ::= nm DOT nm */ +{ + Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); + Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[0].minor.yy0); + sqlite3RenameTokenMap(pParse, (void*)temp1, &yymsp[-2].minor.yy0); + } + yylhsminor.yy202 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); +} + yymsp[-2].minor.yy202 = yylhsminor.yy202; + break; + case 172: /* expr ::= nm DOT nm DOT nm */ +{ + Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1); + Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); + Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); + Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenMap(pParse, (void*)temp3, &yymsp[0].minor.yy0); + sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[-2].minor.yy0); + } + yylhsminor.yy202 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); +} + yymsp[-4].minor.yy202 = yylhsminor.yy202; + break; + case 173: /* term ::= NULL|FLOAT|BLOB */ + case 174: /* term ::= STRING */ yytestcase(yyruleno==174); +{yymsp[0].minor.yy202=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} + break; + case 175: /* term ::= INTEGER */ +{ + yylhsminor.yy202 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); +} + yymsp[0].minor.yy202 = yylhsminor.yy202; + break; + case 176: /* expr ::= VARIABLE */ +{ + if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){ + u32 n = yymsp[0].minor.yy0.n; + yymsp[0].minor.yy202 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); + sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy202, n); + }else{ + /* When doing a nested parse, one can include terms in an expression + ** that look like this: #1 #2 ... These terms refer to registers + ** in the virtual machine. #N is the N-th register. */ + Token t = yymsp[0].minor.yy0; /*A-overwrites-X*/ + assert( t.n>=2 ); + if( pParse->nested==0 ){ + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); + yymsp[0].minor.yy202 = 0; + }else{ + yymsp[0].minor.yy202 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); + if( yymsp[0].minor.yy202 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy202->iTable); + } + } +} + break; + case 177: /* expr ::= expr COLLATE ID|STRING */ +{ + yymsp[-2].minor.yy202 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy202, &yymsp[0].minor.yy0, 1); +} + break; + case 178: /* expr ::= CAST LP expr AS typetoken RP */ +{ + yymsp[-5].minor.yy202 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); + sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy202, yymsp[-3].minor.yy202, 0); +} + break; + case 179: /* expr ::= ID|INDEXED LP distinct exprlist RP */ +{ + yylhsminor.yy202 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy242, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy192); +} + yymsp[-4].minor.yy202 = yylhsminor.yy202; + break; + case 180: /* expr ::= ID|INDEXED LP STAR RP */ +{ + yylhsminor.yy202 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); +} + yymsp[-3].minor.yy202 = yylhsminor.yy202; + break; + case 181: /* expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ +{ + yylhsminor.yy202 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy242, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy192); + sqlite3WindowAttach(pParse, yylhsminor.yy202, yymsp[0].minor.yy303); +} + yymsp[-5].minor.yy202 = yylhsminor.yy202; + break; + case 182: /* expr ::= ID|INDEXED LP STAR RP filter_over */ +{ + yylhsminor.yy202 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); + sqlite3WindowAttach(pParse, yylhsminor.yy202, yymsp[0].minor.yy303); +} + yymsp[-4].minor.yy202 = yylhsminor.yy202; + break; + case 183: /* term ::= CTIME_KW */ +{ + yylhsminor.yy202 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); +} + yymsp[0].minor.yy202 = yylhsminor.yy202; + break; + case 184: /* expr ::= LP nexprlist COMMA expr RP */ +{ + ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy242, yymsp[-1].minor.yy202); + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); + if( yymsp[-4].minor.yy202 ){ + yymsp[-4].minor.yy202->x.pList = pList; + if( ALWAYS(pList->nExpr) ){ + yymsp[-4].minor.yy202->flags |= pList->a[0].pExpr->flags & EP_Propagate; + } + }else{ + sqlite3ExprListDelete(pParse->db, pList); + } +} + break; + case 185: /* expr ::= expr AND expr */ +{yymsp[-2].minor.yy202=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy202,yymsp[0].minor.yy202);} + break; + case 186: /* expr ::= expr OR expr */ + case 187: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==187); + case 188: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==188); + case 189: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==189); + case 190: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==190); + case 191: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==191); + case 192: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==192); +{yymsp[-2].minor.yy202=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy202,yymsp[0].minor.yy202);} + break; + case 193: /* likeop ::= NOT LIKE_KW|MATCH */ +{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/} + break; + case 194: /* expr ::= expr likeop expr */ +{ + ExprList *pList; + int bNot = yymsp[-1].minor.yy0.n & 0x80000000; + yymsp[-1].minor.yy0.n &= 0x7fffffff; + pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy202); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy202); + yymsp[-2].minor.yy202 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); + if( bNot ) yymsp[-2].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy202, 0); + if( yymsp[-2].minor.yy202 ) yymsp[-2].minor.yy202->flags |= EP_InfixFunc; +} + break; + case 195: /* expr ::= expr likeop expr ESCAPE expr */ +{ + ExprList *pList; + int bNot = yymsp[-3].minor.yy0.n & 0x80000000; + yymsp[-3].minor.yy0.n &= 0x7fffffff; + pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy202); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy202); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy202); + yymsp[-4].minor.yy202 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); + if( bNot ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); + if( yymsp[-4].minor.yy202 ) yymsp[-4].minor.yy202->flags |= EP_InfixFunc; +} + break; + case 196: /* expr ::= expr ISNULL|NOTNULL */ +{yymsp[-1].minor.yy202 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy202,0);} + break; + case 197: /* expr ::= expr NOT NULL */ +{yymsp[-2].minor.yy202 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy202,0);} + break; + case 198: /* expr ::= expr IS expr */ +{ + yymsp[-2].minor.yy202 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy202,yymsp[0].minor.yy202); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy202, yymsp[-2].minor.yy202, TK_ISNULL); +} + break; + case 199: /* expr ::= expr IS NOT expr */ +{ + yymsp[-3].minor.yy202 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy202,yymsp[0].minor.yy202); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy202, yymsp[-3].minor.yy202, TK_NOTNULL); +} + break; + case 200: /* expr ::= NOT expr */ + case 201: /* expr ::= BITNOT expr */ yytestcase(yyruleno==201); +{yymsp[-1].minor.yy202 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy202, 0);/*A-overwrites-B*/} + break; + case 202: /* expr ::= PLUS|MINUS expr */ +{ + yymsp[-1].minor.yy202 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy202, 0); + /*A-overwrites-B*/ +} + break; + case 203: /* between_op ::= BETWEEN */ + case 206: /* in_op ::= IN */ yytestcase(yyruleno==206); +{yymsp[0].minor.yy192 = 0;} + break; + case 205: /* expr ::= expr between_op expr AND expr */ +{ + ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy202); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy202); + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy202, 0); + if( yymsp[-4].minor.yy202 ){ + yymsp[-4].minor.yy202->x.pList = pList; + }else{ + sqlite3ExprListDelete(pParse->db, pList); + } + if( yymsp[-3].minor.yy192 ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); +} + break; + case 208: /* expr ::= expr in_op LP exprlist RP */ +{ + if( yymsp[-1].minor.yy242==0 ){ + /* Expressions of the form + ** + ** expr1 IN () + ** expr1 NOT IN () + ** + ** simplify to constants 0 (false) and 1 (true), respectively, + ** regardless of the value of expr1. + */ + sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy202); + yymsp[-4].minor.yy202 = sqlite3Expr(pParse->db, TK_INTEGER, yymsp[-3].minor.yy192 ? "1" : "0"); + }else if( yymsp[-1].minor.yy242->nExpr==1 && sqlite3ExprIsConstant(yymsp[-1].minor.yy242->a[0].pExpr) ){ + Expr *pRHS = yymsp[-1].minor.yy242->a[0].pExpr; + yymsp[-1].minor.yy242->a[0].pExpr = 0; + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy242); + pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0); + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_EQ, yymsp[-4].minor.yy202, pRHS); + if( yymsp[-3].minor.yy192 ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); + }else{ + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy202, 0); + if( yymsp[-4].minor.yy202 ){ + yymsp[-4].minor.yy202->x.pList = yymsp[-1].minor.yy242; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy202); + }else{ + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy242); + } + if( yymsp[-3].minor.yy192 ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); + } + } + break; + case 209: /* expr ::= LP select RP */ +{ + yymsp[-2].minor.yy202 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); + sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy202, yymsp[-1].minor.yy539); + } + break; + case 210: /* expr ::= expr in_op LP select RP */ +{ + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy202, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy202, yymsp[-1].minor.yy539); + if( yymsp[-3].minor.yy192 ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); + } + break; + case 211: /* expr ::= expr in_op nm dbnm paren_exprlist */ +{ + SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); + Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); + if( yymsp[0].minor.yy242 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy242); + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy202, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy202, pSelect); + if( yymsp[-3].minor.yy192 ) yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy202, 0); + } + break; + case 212: /* expr ::= EXISTS LP select RP */ +{ + Expr *p; + p = yymsp[-3].minor.yy202 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); + sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy539); + } + break; + case 213: /* expr ::= CASE case_operand case_exprlist case_else END */ +{ + yymsp[-4].minor.yy202 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy202, 0); + if( yymsp[-4].minor.yy202 ){ + yymsp[-4].minor.yy202->x.pList = yymsp[-1].minor.yy202 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy242,yymsp[-1].minor.yy202) : yymsp[-2].minor.yy242; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy202); + }else{ + sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy242); + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy202); + } +} + break; + case 214: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ +{ + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy242, yymsp[-2].minor.yy202); + yymsp[-4].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy242, yymsp[0].minor.yy202); +} + break; + case 215: /* case_exprlist ::= WHEN expr THEN expr */ +{ + yymsp[-3].minor.yy242 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy202); + yymsp[-3].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy242, yymsp[0].minor.yy202); +} + break; + case 218: /* case_operand ::= expr */ +{yymsp[0].minor.yy202 = yymsp[0].minor.yy202; /*A-overwrites-X*/} + break; + case 221: /* nexprlist ::= nexprlist COMMA expr */ +{yymsp[-2].minor.yy242 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy242,yymsp[0].minor.yy202);} + break; + case 222: /* nexprlist ::= expr */ +{yymsp[0].minor.yy242 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy202); /*A-overwrites-Y*/} + break; + case 224: /* paren_exprlist ::= LP exprlist RP */ + case 229: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==229); +{yymsp[-2].minor.yy242 = yymsp[-1].minor.yy242;} + break; + case 225: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ +{ + sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, + sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy242, yymsp[-10].minor.yy192, + &yymsp[-11].minor.yy0, yymsp[0].minor.yy202, SQLITE_SO_ASC, yymsp[-8].minor.yy192, SQLITE_IDXTYPE_APPDEF); + if( IN_RENAME_OBJECT && pParse->pNewIndex ){ + sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &yymsp[-4].minor.yy0); + } +} + break; + case 226: /* uniqueflag ::= UNIQUE */ + case 268: /* raisetype ::= ABORT */ yytestcase(yyruleno==268); +{yymsp[0].minor.yy192 = OE_Abort;} + break; + case 227: /* uniqueflag ::= */ +{yymsp[1].minor.yy192 = OE_None;} + break; + case 230: /* eidlist ::= eidlist COMMA nm collate sortorder */ +{ + yymsp[-4].minor.yy242 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy242, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy192, yymsp[0].minor.yy192); +} + break; + case 231: /* eidlist ::= nm collate sortorder */ +{ + yymsp[-2].minor.yy242 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy192, yymsp[0].minor.yy192); /*A-overwrites-Y*/ +} + break; + case 234: /* cmd ::= DROP INDEX ifexists fullname */ +{sqlite3DropIndex(pParse, yymsp[0].minor.yy47, yymsp[-1].minor.yy192);} + break; + case 235: /* cmd ::= VACUUM vinto */ +{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy202);} + break; + case 236: /* cmd ::= VACUUM nm vinto */ +{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy202);} + break; + case 239: /* cmd ::= PRAGMA nm dbnm */ +{sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} + break; + case 240: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ +{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} + break; + case 241: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ +{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} + break; + case 242: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ +{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} + break; + case 243: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ +{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} + break; + case 246: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ +{ + Token all; + all.z = yymsp[-3].minor.yy0.z; + all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; + sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy447, &all); +} + break; + case 247: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ +{ + sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy192, yymsp[-4].minor.yy230.a, yymsp[-4].minor.yy230.b, yymsp[-2].minor.yy47, yymsp[0].minor.yy202, yymsp[-10].minor.yy192, yymsp[-8].minor.yy192); + yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ +} + break; + case 248: /* trigger_time ::= BEFORE|AFTER */ +{ yymsp[0].minor.yy192 = yymsp[0].major; /*A-overwrites-X*/ } + break; + case 249: /* trigger_time ::= INSTEAD OF */ +{ yymsp[-1].minor.yy192 = TK_INSTEAD;} + break; + case 250: /* trigger_time ::= */ +{ yymsp[1].minor.yy192 = TK_BEFORE; } + break; + case 251: /* trigger_event ::= DELETE|INSERT */ + case 252: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==252); +{yymsp[0].minor.yy230.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy230.b = 0;} + break; + case 253: /* trigger_event ::= UPDATE OF idlist */ +{yymsp[-2].minor.yy230.a = TK_UPDATE; yymsp[-2].minor.yy230.b = yymsp[0].minor.yy600;} + break; + case 254: /* when_clause ::= */ + case 273: /* key_opt ::= */ yytestcase(yyruleno==273); +{ yymsp[1].minor.yy202 = 0; } + break; + case 255: /* when_clause ::= WHEN expr */ + case 274: /* key_opt ::= KEY expr */ yytestcase(yyruleno==274); +{ yymsp[-1].minor.yy202 = yymsp[0].minor.yy202; } + break; + case 256: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ +{ + assert( yymsp[-2].minor.yy447!=0 ); + yymsp[-2].minor.yy447->pLast->pNext = yymsp[-1].minor.yy447; + yymsp[-2].minor.yy447->pLast = yymsp[-1].minor.yy447; +} + break; + case 257: /* trigger_cmd_list ::= trigger_cmd SEMI */ +{ + assert( yymsp[-1].minor.yy447!=0 ); + yymsp[-1].minor.yy447->pLast = yymsp[-1].minor.yy447; +} + break; + case 258: /* trnm ::= nm DOT nm */ +{ + yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; + sqlite3ErrorMsg(pParse, + "qualified table names are not allowed on INSERT, UPDATE, and DELETE " + "statements within triggers"); +} + break; + case 259: /* tridxby ::= INDEXED BY nm */ +{ + sqlite3ErrorMsg(pParse, + "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " + "within triggers"); +} + break; + case 260: /* tridxby ::= NOT INDEXED */ +{ + sqlite3ErrorMsg(pParse, + "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " + "within triggers"); +} + break; + case 261: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ +{yylhsminor.yy447 = sqlite3TriggerUpdateStep(pParse, &yymsp[-5].minor.yy0, yymsp[-2].minor.yy242, yymsp[-1].minor.yy202, yymsp[-6].minor.yy192, yymsp[-7].minor.yy0.z, yymsp[0].minor.yy436);} + yymsp[-7].minor.yy447 = yylhsminor.yy447; + break; + case 262: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ +{ + yylhsminor.yy447 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy600,yymsp[-2].minor.yy539,yymsp[-6].minor.yy192,yymsp[-1].minor.yy318,yymsp[-7].minor.yy436,yymsp[0].minor.yy436);/*yylhsminor.yy447-overwrites-yymsp[-6].minor.yy192*/ +} + yymsp[-7].minor.yy447 = yylhsminor.yy447; + break; + case 263: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ +{yylhsminor.yy447 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy202, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy436);} + yymsp[-5].minor.yy447 = yylhsminor.yy447; + break; + case 264: /* trigger_cmd ::= scanpt select scanpt */ +{yylhsminor.yy447 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy539, yymsp[-2].minor.yy436, yymsp[0].minor.yy436); /*yylhsminor.yy447-overwrites-yymsp[-1].minor.yy539*/} + yymsp[-2].minor.yy447 = yylhsminor.yy447; + break; + case 265: /* expr ::= RAISE LP IGNORE RP */ +{ + yymsp[-3].minor.yy202 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); + if( yymsp[-3].minor.yy202 ){ + yymsp[-3].minor.yy202->affExpr = OE_Ignore; + } +} + break; + case 266: /* expr ::= RAISE LP raisetype COMMA nm RP */ +{ + yymsp[-5].minor.yy202 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); + if( yymsp[-5].minor.yy202 ) { + yymsp[-5].minor.yy202->affExpr = (char)yymsp[-3].minor.yy192; + } +} + break; + case 267: /* raisetype ::= ROLLBACK */ +{yymsp[0].minor.yy192 = OE_Rollback;} + break; + case 269: /* raisetype ::= FAIL */ +{yymsp[0].minor.yy192 = OE_Fail;} + break; + case 270: /* cmd ::= DROP TRIGGER ifexists fullname */ +{ + sqlite3DropTrigger(pParse,yymsp[0].minor.yy47,yymsp[-1].minor.yy192); +} + break; + case 271: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ +{ + sqlite3Attach(pParse, yymsp[-3].minor.yy202, yymsp[-1].minor.yy202, yymsp[0].minor.yy202); +} + break; + case 272: /* cmd ::= DETACH database_kw_opt expr */ +{ + sqlite3Detach(pParse, yymsp[0].minor.yy202); +} + break; + case 275: /* cmd ::= REINDEX */ +{sqlite3Reindex(pParse, 0, 0);} + break; + case 276: /* cmd ::= REINDEX nm dbnm */ +{sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} + break; + case 277: /* cmd ::= ANALYZE */ +{sqlite3Analyze(pParse, 0, 0);} + break; + case 278: /* cmd ::= ANALYZE nm dbnm */ +{sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} + break; + case 279: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ +{ + sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy47,&yymsp[0].minor.yy0); +} + break; + case 280: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ +{ + yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; + sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); +} + break; + case 281: /* add_column_fullname ::= fullname */ +{ + disableLookaside(pParse); + sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy47); +} + break; + case 282: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ +{ + sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy47, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); +} + break; + case 283: /* cmd ::= create_vtab */ +{sqlite3VtabFinishParse(pParse,0);} + break; + case 284: /* cmd ::= create_vtab LP vtabarglist RP */ +{sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} + break; + case 285: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ +{ + sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy192); +} + break; + case 286: /* vtabarg ::= */ +{sqlite3VtabArgInit(pParse);} + break; + case 287: /* vtabargtoken ::= ANY */ + case 288: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==288); + case 289: /* lp ::= LP */ yytestcase(yyruleno==289); +{sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} + break; + case 290: /* with ::= WITH wqlist */ + case 291: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==291); +{ sqlite3WithPush(pParse, yymsp[0].minor.yy131, 1); } + break; + case 292: /* wqlist ::= nm eidlist_opt AS LP select RP */ +{ + yymsp[-5].minor.yy131 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy242, yymsp[-1].minor.yy539); /*A-overwrites-X*/ +} + break; + case 293: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ +{ + yymsp[-7].minor.yy131 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy131, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy242, yymsp[-1].minor.yy539); +} + break; + case 294: /* windowdefn_list ::= windowdefn */ +{ yylhsminor.yy303 = yymsp[0].minor.yy303; } + yymsp[0].minor.yy303 = yylhsminor.yy303; + break; + case 295: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ +{ + assert( yymsp[0].minor.yy303!=0 ); + sqlite3WindowChain(pParse, yymsp[0].minor.yy303, yymsp[-2].minor.yy303); + yymsp[0].minor.yy303->pNextWin = yymsp[-2].minor.yy303; + yylhsminor.yy303 = yymsp[0].minor.yy303; +} + yymsp[-2].minor.yy303 = yylhsminor.yy303; + break; + case 296: /* windowdefn ::= nm AS LP window RP */ +{ + if( ALWAYS(yymsp[-1].minor.yy303) ){ + yymsp[-1].minor.yy303->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); + } + yylhsminor.yy303 = yymsp[-1].minor.yy303; +} + yymsp[-4].minor.yy303 = yylhsminor.yy303; + break; + case 297: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ +{ + yymsp[-4].minor.yy303 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy303, yymsp[-2].minor.yy242, yymsp[-1].minor.yy242, 0); +} + break; + case 298: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ +{ + yylhsminor.yy303 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy303, yymsp[-2].minor.yy242, yymsp[-1].minor.yy242, &yymsp[-5].minor.yy0); +} + yymsp[-5].minor.yy303 = yylhsminor.yy303; + break; + case 299: /* window ::= ORDER BY sortlist frame_opt */ +{ + yymsp[-3].minor.yy303 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy303, 0, yymsp[-1].minor.yy242, 0); +} + break; + case 300: /* window ::= nm ORDER BY sortlist frame_opt */ +{ + yylhsminor.yy303 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy303, 0, yymsp[-1].minor.yy242, &yymsp[-4].minor.yy0); +} + yymsp[-4].minor.yy303 = yylhsminor.yy303; + break; + case 301: /* window ::= frame_opt */ + case 320: /* filter_over ::= over_clause */ yytestcase(yyruleno==320); +{ + yylhsminor.yy303 = yymsp[0].minor.yy303; +} + yymsp[0].minor.yy303 = yylhsminor.yy303; + break; + case 302: /* window ::= nm frame_opt */ +{ + yylhsminor.yy303 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy303, 0, 0, &yymsp[-1].minor.yy0); +} + yymsp[-1].minor.yy303 = yylhsminor.yy303; + break; + case 303: /* frame_opt ::= */ +{ + yymsp[1].minor.yy303 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); +} + break; + case 304: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ +{ + yylhsminor.yy303 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy192, yymsp[-1].minor.yy77.eType, yymsp[-1].minor.yy77.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy58); +} + yymsp[-2].minor.yy303 = yylhsminor.yy303; + break; + case 305: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ +{ + yylhsminor.yy303 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy192, yymsp[-3].minor.yy77.eType, yymsp[-3].minor.yy77.pExpr, yymsp[-1].minor.yy77.eType, yymsp[-1].minor.yy77.pExpr, yymsp[0].minor.yy58); +} + yymsp[-5].minor.yy303 = yylhsminor.yy303; + break; + case 307: /* frame_bound_s ::= frame_bound */ + case 309: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==309); +{yylhsminor.yy77 = yymsp[0].minor.yy77;} + yymsp[0].minor.yy77 = yylhsminor.yy77; + break; + case 308: /* frame_bound_s ::= UNBOUNDED PRECEDING */ + case 310: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==310); + case 312: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==312); +{yylhsminor.yy77.eType = yymsp[-1].major; yylhsminor.yy77.pExpr = 0;} + yymsp[-1].minor.yy77 = yylhsminor.yy77; + break; + case 311: /* frame_bound ::= expr PRECEDING|FOLLOWING */ +{yylhsminor.yy77.eType = yymsp[0].major; yylhsminor.yy77.pExpr = yymsp[-1].minor.yy202;} + yymsp[-1].minor.yy77 = yylhsminor.yy77; + break; + case 313: /* frame_exclude_opt ::= */ +{yymsp[1].minor.yy58 = 0;} + break; + case 314: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ +{yymsp[-1].minor.yy58 = yymsp[0].minor.yy58;} + break; + case 315: /* frame_exclude ::= NO OTHERS */ + case 316: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==316); +{yymsp[-1].minor.yy58 = yymsp[-1].major; /*A-overwrites-X*/} + break; + case 317: /* frame_exclude ::= GROUP|TIES */ +{yymsp[0].minor.yy58 = yymsp[0].major; /*A-overwrites-X*/} + break; + case 318: /* window_clause ::= WINDOW windowdefn_list */ +{ yymsp[-1].minor.yy303 = yymsp[0].minor.yy303; } + break; + case 319: /* filter_over ::= filter_clause over_clause */ +{ + yymsp[0].minor.yy303->pFilter = yymsp[-1].minor.yy202; + yylhsminor.yy303 = yymsp[0].minor.yy303; +} + yymsp[-1].minor.yy303 = yylhsminor.yy303; + break; + case 321: /* filter_over ::= filter_clause */ +{ + yylhsminor.yy303 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yylhsminor.yy303 ){ + yylhsminor.yy303->eFrmType = TK_FILTER; + yylhsminor.yy303->pFilter = yymsp[0].minor.yy202; + }else{ + sqlite3ExprDelete(pParse->db, yymsp[0].minor.yy202); + } +} + yymsp[0].minor.yy303 = yylhsminor.yy303; + break; + case 322: /* over_clause ::= OVER LP window RP */ +{ + yymsp[-3].minor.yy303 = yymsp[-1].minor.yy303; + assert( yymsp[-3].minor.yy303!=0 ); +} + break; + case 323: /* over_clause ::= OVER nm */ +{ + yymsp[-1].minor.yy303 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yymsp[-1].minor.yy303 ){ + yymsp[-1].minor.yy303->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); + } +} + break; + case 324: /* filter_clause ::= FILTER LP WHERE expr RP */ +{ yymsp[-4].minor.yy202 = yymsp[-1].minor.yy202; } + break; + default: + /* (325) input ::= cmdlist */ yytestcase(yyruleno==325); + /* (326) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==326); + /* (327) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=327); + /* (328) ecmd ::= SEMI */ yytestcase(yyruleno==328); + /* (329) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==329); + /* (330) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=330); + /* (331) trans_opt ::= */ yytestcase(yyruleno==331); + /* (332) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==332); + /* (333) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==333); + /* (334) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==334); + /* (335) savepoint_opt ::= */ yytestcase(yyruleno==335); + /* (336) cmd ::= create_table create_table_args */ yytestcase(yyruleno==336); + /* (337) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==337); + /* (338) columnlist ::= columnname carglist */ yytestcase(yyruleno==338); + /* (339) nm ::= ID|INDEXED */ yytestcase(yyruleno==339); + /* (340) nm ::= STRING */ yytestcase(yyruleno==340); + /* (341) nm ::= JOIN_KW */ yytestcase(yyruleno==341); + /* (342) typetoken ::= typename */ yytestcase(yyruleno==342); + /* (343) typename ::= ID|STRING */ yytestcase(yyruleno==343); + /* (344) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=344); + /* (345) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=345); + /* (346) carglist ::= carglist ccons */ yytestcase(yyruleno==346); + /* (347) carglist ::= */ yytestcase(yyruleno==347); + /* (348) ccons ::= NULL onconf */ yytestcase(yyruleno==348); + /* (349) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==349); + /* (350) ccons ::= AS generated */ yytestcase(yyruleno==350); + /* (351) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==351); + /* (352) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==352); + /* (353) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=353); + /* (354) tconscomma ::= */ yytestcase(yyruleno==354); + /* (355) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=355); + /* (356) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=356); + /* (357) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=357); + /* (358) oneselect ::= values */ yytestcase(yyruleno==358); + /* (359) sclp ::= selcollist COMMA */ yytestcase(yyruleno==359); + /* (360) as ::= ID|STRING */ yytestcase(yyruleno==360); + /* (361) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=361); + /* (362) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==362); + /* (363) exprlist ::= nexprlist */ yytestcase(yyruleno==363); + /* (364) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=364); + /* (365) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=365); + /* (366) nmnum ::= ON */ yytestcase(yyruleno==366); + /* (367) nmnum ::= DELETE */ yytestcase(yyruleno==367); + /* (368) nmnum ::= DEFAULT */ yytestcase(yyruleno==368); + /* (369) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==369); + /* (370) foreach_clause ::= */ yytestcase(yyruleno==370); + /* (371) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==371); + /* (372) trnm ::= nm */ yytestcase(yyruleno==372); + /* (373) tridxby ::= */ yytestcase(yyruleno==373); + /* (374) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==374); + /* (375) database_kw_opt ::= */ yytestcase(yyruleno==375); + /* (376) kwcolumn_opt ::= */ yytestcase(yyruleno==376); + /* (377) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==377); + /* (378) vtabarglist ::= vtabarg */ yytestcase(yyruleno==378); + /* (379) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==379); + /* (380) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==380); + /* (381) anylist ::= */ yytestcase(yyruleno==381); + /* (382) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==382); + /* (383) anylist ::= anylist ANY */ yytestcase(yyruleno==383); + /* (384) with ::= */ yytestcase(yyruleno==384); + break; +/********** End reduce actions ************************************************/ + }; + assert( yyrulenoYY_MAX_SHIFT && yyact<=YY_MAX_SHIFTREDUCE) ); + + /* It is not possible for a REDUCE to be followed by an error */ + assert( yyact!=YY_ERROR_ACTION ); + + yymsp += yysize+1; + yypParser->yytos = yymsp; + yymsp->stateno = (YYACTIONTYPE)yyact; + yymsp->major = (YYCODETYPE)yygoto; + yyTraceShift(yypParser, yyact, "... then shift"); + return yyact; +} + +/* +** The following code executes when the parse fails +*/ +#ifndef YYNOERRORRECOVERY +static void yy_parse_failed( + yyParser *yypParser /* The parser */ +){ + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); + } +#endif + while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will be executed whenever the + ** parser fails */ +/************ Begin %parse_failure code ***************************************/ +/************ End %parse_failure code *****************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3ParserCTX_STORE +} +#endif /* YYNOERRORRECOVERY */ + +/* +** The following code executes when a syntax error first occurs. +*/ +static void yy_syntax_error( + yyParser *yypParser, /* The parser */ + int yymajor, /* The major type of the error token */ + sqlite3ParserTOKENTYPE yyminor /* The minor type of the error token */ +){ + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH +#define TOKEN yyminor +/************ Begin %syntax_error code ****************************************/ + + UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ + if( TOKEN.z[0] ){ + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); + }else{ + sqlite3ErrorMsg(pParse, "incomplete input"); + } +/************ End %syntax_error code ******************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3ParserCTX_STORE +} + +/* +** The following is executed when the parser accepts +*/ +static void yy_accept( + yyParser *yypParser /* The parser */ +){ + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); + } +#endif +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + assert( yypParser->yytos==yypParser->yystack ); + /* Here code is inserted which will be executed whenever the + ** parser accepts */ +/*********** Begin %parse_accept code *****************************************/ +/*********** End %parse_accept code *******************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3ParserCTX_STORE +} + +/* The main parser program. +** The first argument is a pointer to a structure obtained from +** "sqlite3ParserAlloc" which describes the current state of the parser. +** The second argument is the major token number. The third is +** the minor token. The fourth optional argument is whatever the +** user wants (and specified in the grammar) and is available for +** use by the action routines. +** +** Inputs: +**
      +**
    • A pointer to the parser (an opaque structure.) +**
    • The major token number. +**
    • The minor token number. +**
    • An option argument of a grammar-specified type. +**
    +** +** Outputs: +** None. +*/ +SQLITE_PRIVATE void sqlite3Parser( + void *yyp, /* The parser */ + int yymajor, /* The major token code number */ + sqlite3ParserTOKENTYPE yyminor /* The value for the token */ + sqlite3ParserARG_PDECL /* Optional %extra_argument parameter */ +){ + YYMINORTYPE yyminorunion; + YYACTIONTYPE yyact; /* The parser action. */ +#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) + int yyendofinput; /* True if we are at the end of input */ +#endif +#ifdef YYERRORSYMBOL + int yyerrorhit = 0; /* True if yymajor has invoked an error */ +#endif + yyParser *yypParser = (yyParser*)yyp; /* The parser */ + sqlite3ParserCTX_FETCH + sqlite3ParserARG_STORE + + assert( yypParser->yytos!=0 ); +#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) + yyendofinput = (yymajor==0); +#endif + + yyact = yypParser->yytos->stateno; +#ifndef NDEBUG + if( yyTraceFILE ){ + if( yyact < YY_MIN_REDUCE ){ + fprintf(yyTraceFILE,"%sInput '%s' in state %d\n", + yyTracePrompt,yyTokenName[yymajor],yyact); + }else{ + fprintf(yyTraceFILE,"%sInput '%s' with pending reduce %d\n", + yyTracePrompt,yyTokenName[yymajor],yyact-YY_MIN_REDUCE); + } + } +#endif + + do{ + assert( yyact==yypParser->yytos->stateno ); + yyact = yy_find_shift_action((YYCODETYPE)yymajor,yyact); + if( yyact >= YY_MIN_REDUCE ){ + yyact = yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor, + yyminor sqlite3ParserCTX_PARAM); + }else if( yyact <= YY_MAX_SHIFTREDUCE ){ + yy_shift(yypParser,yyact,(YYCODETYPE)yymajor,yyminor); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt--; +#endif + break; + }else if( yyact==YY_ACCEPT_ACTION ){ + yypParser->yytos--; + yy_accept(yypParser); + return; + }else{ + assert( yyact == YY_ERROR_ACTION ); + yyminorunion.yy0 = yyminor; +#ifdef YYERRORSYMBOL + int yymx; +#endif +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); + } +#endif +#ifdef YYERRORSYMBOL + /* A syntax error has occurred. + ** The response to an error depends upon whether or not the + ** grammar defines an error token "ERROR". + ** + ** This is what we do if the grammar does define ERROR: + ** + ** * Call the %syntax_error function. + ** + ** * Begin popping the stack until we enter a state where + ** it is legal to shift the error symbol, then shift + ** the error symbol. + ** + ** * Set the error count to three. + ** + ** * Begin accepting and shifting new tokens. No new error + ** processing will occur until three tokens have been + ** shifted successfully. + ** + */ + if( yypParser->yyerrcnt<0 ){ + yy_syntax_error(yypParser,yymajor,yyminor); + } + yymx = yypParser->yytos->major; + if( yymx==YYERRORSYMBOL || yyerrorhit ){ +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sDiscard input token %s\n", + yyTracePrompt,yyTokenName[yymajor]); + } +#endif + yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); + yymajor = YYNOCODE; + }else{ + while( yypParser->yytos >= yypParser->yystack + && (yyact = yy_find_reduce_action( + yypParser->yytos->stateno, + YYERRORSYMBOL)) > YY_MAX_SHIFTREDUCE + ){ + yy_pop_parser_stack(yypParser); + } + if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + yy_parse_failed(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + yymajor = YYNOCODE; + }else if( yymx!=YYERRORSYMBOL ){ + yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); + } + } + yypParser->yyerrcnt = 3; + yyerrorhit = 1; + if( yymajor==YYNOCODE ) break; + yyact = yypParser->yytos->stateno; +#elif defined(YYNOERRORRECOVERY) + /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to + ** do any kind of error recovery. Instead, simply invoke the syntax + ** error routine and continue going as if nothing had happened. + ** + ** Applications can set this macro (for example inside %include) if + ** they intend to abandon the parse upon the first syntax error seen. + */ + yy_syntax_error(yypParser,yymajor, yyminor); + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + break; +#else /* YYERRORSYMBOL is not defined */ + /* This is what we do if the grammar does not define ERROR: + ** + ** * Report an error message, and throw away the input token. + ** + ** * If the input token is $, then fail the parse. + ** + ** As before, subsequent error messages are suppressed until + ** three input tokens have been successfully shifted. + */ + if( yypParser->yyerrcnt<=0 ){ + yy_syntax_error(yypParser,yymajor, yyminor); + } + yypParser->yyerrcnt = 3; + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + if( yyendofinput ){ + yy_parse_failed(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + } + break; +#endif + } + }while( yypParser->yytos>yypParser->yystack ); +#ifndef NDEBUG + if( yyTraceFILE ){ + yyStackEntry *i; + char cDiv = '['; + fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); + for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ + fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); + cDiv = ' '; + } + fprintf(yyTraceFILE,"]\n"); + } +#endif + return; +} + +/* +** Return the fallback token corresponding to canonical token iToken, or +** 0 if iToken has no fallback. +*/ +SQLITE_PRIVATE int sqlite3ParserFallback(int iToken){ +#ifdef YYFALLBACK + assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ); + return yyFallback[iToken]; +#else + (void)iToken; + return 0; +#endif +} + +/************** End of parse.c ***********************************************/ +/************** Begin file tokenize.c ****************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** An tokenizer for SQL +** +** This file contains C code that splits an SQL input string up into +** individual tokens and sends those tokens one-by-one over to the +** parser for analysis. +*/ +/* #include "sqliteInt.h" */ +/* #include */ + +/* Character classes for tokenizing +** +** In the sqlite3GetToken() function, a switch() on aiClass[c] is implemented +** using a lookup table, whereas a switch() directly on c uses a binary search. +** The lookup table is much faster. To maximize speed, and to ensure that +** a lookup table is used, all of the classes need to be small integers and +** all of them need to be used within the switch. +*/ +#define CC_X 0 /* The letter 'x', or start of BLOB literal */ +#define CC_KYWD 1 /* Alphabetics or '_'. Usable in a keyword */ +#define CC_ID 2 /* unicode characters usable in IDs */ +#define CC_DIGIT 3 /* Digits */ +#define CC_DOLLAR 4 /* '$' */ +#define CC_VARALPHA 5 /* '@', '#', ':'. Alphabetic SQL variables */ +#define CC_VARNUM 6 /* '?'. Numeric SQL variables */ +#define CC_SPACE 7 /* Space characters */ +#define CC_QUOTE 8 /* '"', '\'', or '`'. String literals, quoted ids */ +#define CC_QUOTE2 9 /* '['. [...] style quoted ids */ +#define CC_PIPE 10 /* '|'. Bitwise OR or concatenate */ +#define CC_MINUS 11 /* '-'. Minus or SQL-style comment */ +#define CC_LT 12 /* '<'. Part of < or <= or <> */ +#define CC_GT 13 /* '>'. Part of > or >= */ +#define CC_EQ 14 /* '='. Part of = or == */ +#define CC_BANG 15 /* '!'. Part of != */ +#define CC_SLASH 16 /* '/'. / or c-style comment */ +#define CC_LP 17 /* '(' */ +#define CC_RP 18 /* ')' */ +#define CC_SEMI 19 /* ';' */ +#define CC_PLUS 20 /* '+' */ +#define CC_STAR 21 /* '*' */ +#define CC_PERCENT 22 /* '%' */ +#define CC_COMMA 23 /* ',' */ +#define CC_AND 24 /* '&' */ +#define CC_TILDA 25 /* '~' */ +#define CC_DOT 26 /* '.' */ +#define CC_ILLEGAL 27 /* Illegal character */ +#define CC_NUL 28 /* 0x00 */ + +static const unsigned char aiClass[] = { +#ifdef SQLITE_ASCII +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */ +/* 0x */ 28, 27, 27, 27, 27, 27, 27, 27, 27, 7, 7, 27, 7, 7, 27, 27, +/* 1x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 2x */ 7, 15, 8, 5, 4, 22, 24, 8, 17, 18, 21, 20, 23, 11, 26, 16, +/* 3x */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 19, 12, 14, 13, 6, +/* 4x */ 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* 5x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 9, 27, 27, 27, 1, +/* 6x */ 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* 7x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 27, 10, 27, 25, 27, +/* 8x */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* 9x */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Ax */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Bx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Cx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Dx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Ex */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Fx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +#endif +#ifdef SQLITE_EBCDIC +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */ +/* 0x */ 27, 27, 27, 27, 27, 7, 27, 27, 27, 27, 27, 27, 7, 7, 27, 27, +/* 1x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 2x */ 27, 27, 27, 27, 27, 7, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 3x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 4x */ 7, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 12, 17, 20, 10, +/* 5x */ 24, 27, 27, 27, 27, 27, 27, 27, 27, 27, 15, 4, 21, 18, 19, 27, +/* 6x */ 11, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 23, 22, 1, 13, 6, +/* 7x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 8, 5, 5, 5, 8, 14, 8, +/* 8x */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* 9x */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* Ax */ 27, 25, 1, 1, 1, 1, 1, 0, 1, 1, 27, 27, 27, 27, 27, 27, +/* Bx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 9, 27, 27, 27, 27, 27, +/* Cx */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* Dx */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* Ex */ 27, 27, 1, 1, 1, 1, 1, 0, 1, 1, 27, 27, 27, 27, 27, 27, +/* Fx */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 27, 27, 27, 27, 27, 27, +#endif +}; + +/* +** The charMap() macro maps alphabetic characters (only) into their +** lower-case ASCII equivalent. On ASCII machines, this is just +** an upper-to-lower case map. On EBCDIC machines we also need +** to adjust the encoding. The mapping is only valid for alphabetics +** which are the only characters for which this feature is used. +** +** Used by keywordhash.h +*/ +#ifdef SQLITE_ASCII +# define charMap(X) sqlite3UpperToLower[(unsigned char)X] +#endif +#ifdef SQLITE_EBCDIC +# define charMap(X) ebcdicToAscii[(unsigned char)X] +const unsigned char ebcdicToAscii[] = { +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, /* 6x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */ + 0, 97, 98, 99,100,101,102,103,104,105, 0, 0, 0, 0, 0, 0, /* 8x */ + 0,106,107,108,109,110,111,112,113,114, 0, 0, 0, 0, 0, 0, /* 9x */ + 0, 0,115,116,117,118,119,120,121,122, 0, 0, 0, 0, 0, 0, /* Ax */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ + 0, 97, 98, 99,100,101,102,103,104,105, 0, 0, 0, 0, 0, 0, /* Cx */ + 0,106,107,108,109,110,111,112,113,114, 0, 0, 0, 0, 0, 0, /* Dx */ + 0, 0,115,116,117,118,119,120,121,122, 0, 0, 0, 0, 0, 0, /* Ex */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Fx */ +}; +#endif + +/* +** The sqlite3KeywordCode function looks up an identifier to determine if +** it is a keyword. If it is a keyword, the token code of that keyword is +** returned. If the input is not a keyword, TK_ID is returned. +** +** The implementation of this routine was generated by a program, +** mkkeywordhash.c, located in the tool subdirectory of the distribution. +** The output of the mkkeywordhash.c program is written into a file +** named keywordhash.h and then included into this source file by +** the #include below. +*/ +/************** Include keywordhash.h in the middle of tokenize.c ************/ +/************** Begin file keywordhash.h *************************************/ +/***** This file contains automatically generated code ****** +** +** The code in this file has been automatically generated by +** +** sqlite/tool/mkkeywordhash.c +** +** The code in this file implements a function that determines whether +** or not a given identifier is really an SQL keyword. The same thing +** might be implemented more directly using a hand-written hash table. +** But by using this automatically generated code, the size of the code +** is substantially reduced. This is important for embedded applications +** on platforms with limited memory. +*/ +/* Hash score: 227 */ +/* zKWText[] encodes 984 bytes of keyword text in 648 bytes */ +/* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */ +/* ABLEFTHENDEFERRABLELSEXCLUDELETEMPORARYISNULLSAVEPOINTERSECT */ +/* IESNOTNULLIKEXCEPTRANSACTIONATURALTERAISEXCLUSIVEXISTS */ +/* CONSTRAINTOFFSETRIGGERANGENERATEDETACHAVINGLOBEGINNEREFERENCES */ +/* UNIQUERYWITHOUTERELEASEATTACHBETWEENOTHINGROUPSCASCADEFAULT */ +/* CASECOLLATECREATECURRENT_DATEIMMEDIATEJOINSERTMATCHPLANALYZE */ +/* PRAGMABORTUPDATEVALUESVIRTUALWAYSWHENWHERECURSIVEAFTERENAMEAND */ +/* EFERREDISTINCTAUTOINCREMENTCASTCOLUMNCOMMITCONFLICTCROSS */ +/* CURRENT_TIMESTAMPARTITIONDROPRECEDINGFAILASTFILTEREPLACEFIRST */ +/* FOLLOWINGFROMFULLIMITIFORDERESTRICTOTHERSOVERIGHTROLLBACKROWS */ +/* UNBOUNDEDUNIONUSINGVACUUMVIEWINDOWBYINITIALLYPRIMARY */ +static const char zKWText[647] = { + 'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H', + 'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G', + 'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A', + 'S','E','L','E','C','T','A','B','L','E','F','T','H','E','N','D','E','F', + 'E','R','R','A','B','L','E','L','S','E','X','C','L','U','D','E','L','E', + 'T','E','M','P','O','R','A','R','Y','I','S','N','U','L','L','S','A','V', + 'E','P','O','I','N','T','E','R','S','E','C','T','I','E','S','N','O','T', + 'N','U','L','L','I','K','E','X','C','E','P','T','R','A','N','S','A','C', + 'T','I','O','N','A','T','U','R','A','L','T','E','R','A','I','S','E','X', + 'C','L','U','S','I','V','E','X','I','S','T','S','C','O','N','S','T','R', + 'A','I','N','T','O','F','F','S','E','T','R','I','G','G','E','R','A','N', + 'G','E','N','E','R','A','T','E','D','E','T','A','C','H','A','V','I','N', + 'G','L','O','B','E','G','I','N','N','E','R','E','F','E','R','E','N','C', + 'E','S','U','N','I','Q','U','E','R','Y','W','I','T','H','O','U','T','E', + 'R','E','L','E','A','S','E','A','T','T','A','C','H','B','E','T','W','E', + 'E','N','O','T','H','I','N','G','R','O','U','P','S','C','A','S','C','A', + 'D','E','F','A','U','L','T','C','A','S','E','C','O','L','L','A','T','E', + 'C','R','E','A','T','E','C','U','R','R','E','N','T','_','D','A','T','E', + 'I','M','M','E','D','I','A','T','E','J','O','I','N','S','E','R','T','M', + 'A','T','C','H','P','L','A','N','A','L','Y','Z','E','P','R','A','G','M', + 'A','B','O','R','T','U','P','D','A','T','E','V','A','L','U','E','S','V', + 'I','R','T','U','A','L','W','A','Y','S','W','H','E','N','W','H','E','R', + 'E','C','U','R','S','I','V','E','A','F','T','E','R','E','N','A','M','E', + 'A','N','D','E','F','E','R','R','E','D','I','S','T','I','N','C','T','A', + 'U','T','O','I','N','C','R','E','M','E','N','T','C','A','S','T','C','O', + 'L','U','M','N','C','O','M','M','I','T','C','O','N','F','L','I','C','T', + 'C','R','O','S','S','C','U','R','R','E','N','T','_','T','I','M','E','S', + 'T','A','M','P','A','R','T','I','T','I','O','N','D','R','O','P','R','E', + 'C','E','D','I','N','G','F','A','I','L','A','S','T','F','I','L','T','E', + 'R','E','P','L','A','C','E','F','I','R','S','T','F','O','L','L','O','W', + 'I','N','G','F','R','O','M','F','U','L','L','I','M','I','T','I','F','O', + 'R','D','E','R','E','S','T','R','I','C','T','O','T','H','E','R','S','O', + 'V','E','R','I','G','H','T','R','O','L','L','B','A','C','K','R','O','W', + 'S','U','N','B','O','U','N','D','E','D','U','N','I','O','N','U','S','I', + 'N','G','V','A','C','U','U','M','V','I','E','W','I','N','D','O','W','B', + 'Y','I','N','I','T','I','A','L','L','Y','P','R','I','M','A','R','Y', +}; +/* aKWHash[i] is the hash value for the i-th keyword */ +static const unsigned char aKWHash[127] = { + 84, 102, 132, 82, 114, 29, 0, 0, 91, 0, 85, 72, 0, + 53, 35, 86, 15, 0, 42, 94, 54, 126, 133, 19, 0, 0, + 138, 0, 40, 128, 0, 22, 104, 0, 9, 0, 0, 122, 80, + 0, 78, 6, 0, 65, 99, 145, 0, 134, 112, 0, 0, 48, + 0, 100, 24, 0, 17, 0, 27, 70, 23, 26, 5, 60, 140, + 107, 121, 0, 73, 101, 71, 143, 61, 119, 74, 0, 49, 0, + 11, 41, 0, 110, 0, 0, 0, 106, 10, 108, 113, 124, 14, + 50, 123, 0, 89, 0, 18, 120, 142, 56, 129, 137, 88, 83, + 37, 30, 125, 0, 0, 105, 51, 130, 127, 0, 34, 0, 0, + 44, 0, 95, 38, 39, 0, 20, 45, 116, 90, +}; +/* aKWNext[] forms the hash collision chain. If aKWHash[i]==0 +** then the i-th keyword has no more hash collisions. Otherwise, +** the next keyword with the same hash is aKWHash[i]-1. */ +static const unsigned char aKWNext[145] = { + 0, 0, 0, 0, 4, 0, 43, 0, 0, 103, 111, 0, 0, + 0, 2, 0, 0, 141, 0, 0, 0, 13, 0, 0, 0, 0, + 139, 0, 0, 118, 52, 0, 0, 135, 12, 0, 0, 62, 0, + 136, 0, 131, 0, 0, 36, 0, 0, 28, 77, 0, 0, 0, + 0, 59, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 0, 0, 0, 0, 0, 144, 3, 0, 58, 0, 1, + 75, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 64, 66, + 63, 0, 0, 0, 0, 46, 0, 16, 0, 115, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 81, 97, 0, 8, 0, 109, + 21, 7, 67, 0, 79, 93, 117, 0, 0, 68, 0, 0, 96, + 0, 55, 0, 76, 0, 92, 32, 33, 57, 25, 0, 98, 0, + 0, 87, +}; +/* aKWLen[i] is the length (in bytes) of the i-th keyword */ +static const unsigned char aKWLen[145] = { + 7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6, + 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 7, + 6, 9, 4, 2, 6, 5, 9, 9, 4, 7, 3, 2, 4, + 4, 6, 11, 6, 2, 7, 5, 5, 9, 6, 10, 4, 6, + 2, 3, 7, 5, 9, 6, 6, 4, 5, 5, 10, 6, 5, + 7, 4, 5, 7, 6, 7, 7, 6, 5, 7, 3, 7, 4, + 7, 6, 12, 9, 4, 6, 5, 4, 7, 6, 5, 6, 6, + 7, 6, 4, 5, 9, 5, 6, 3, 8, 8, 2, 13, 2, + 2, 4, 6, 6, 8, 5, 17, 12, 7, 9, 4, 9, 4, + 4, 6, 7, 5, 9, 4, 4, 5, 2, 5, 8, 6, 4, + 5, 8, 4, 3, 9, 5, 5, 6, 4, 6, 2, 2, 9, + 3, 7, +}; +/* aKWOffset[i] is the index into zKWText[] of the start of +** the text for the i-th keyword. */ +static const unsigned short int aKWOffset[145] = { + 0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33, + 36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81, + 86, 90, 90, 94, 99, 101, 105, 111, 119, 123, 123, 123, 126, + 129, 132, 137, 142, 146, 147, 152, 156, 160, 168, 174, 181, 184, + 184, 187, 189, 195, 198, 206, 211, 216, 219, 222, 226, 236, 239, + 244, 244, 248, 252, 259, 265, 271, 277, 277, 283, 284, 288, 295, + 299, 306, 312, 324, 333, 335, 341, 346, 348, 355, 360, 365, 371, + 377, 382, 388, 392, 395, 404, 408, 414, 416, 423, 424, 431, 433, + 435, 444, 448, 454, 460, 468, 473, 473, 473, 489, 498, 501, 510, + 513, 517, 522, 529, 534, 543, 547, 550, 555, 557, 561, 569, 575, + 578, 583, 591, 591, 595, 604, 609, 614, 620, 623, 626, 629, 631, + 636, 640, +}; +/* aKWCode[i] is the parser symbol code for the i-th keyword */ +static const unsigned char aKWCode[145] = { + TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE, + TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN, + TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD, + TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE, + TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE, + TK_EXCLUDE, TK_DELETE, TK_TEMP, TK_TEMP, TK_OR, + TK_ISNULL, TK_NULLS, TK_SAVEPOINT, TK_INTERSECT, TK_TIES, + TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, TK_LIKE_KW, + TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW, + TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_CONSTRAINT, + TK_INTO, TK_OFFSET, TK_OF, TK_SET, TK_TRIGGER, + TK_RANGE, TK_GENERATED, TK_DETACH, TK_HAVING, TK_LIKE_KW, + TK_BEGIN, TK_JOIN_KW, TK_REFERENCES, TK_UNIQUE, TK_QUERY, + TK_WITHOUT, TK_WITH, TK_JOIN_KW, TK_RELEASE, TK_ATTACH, + TK_BETWEEN, TK_NOTHING, TK_GROUPS, TK_GROUP, TK_CASCADE, + TK_ASC, TK_DEFAULT, TK_CASE, TK_COLLATE, TK_CREATE, + TK_CTIME_KW, TK_IMMEDIATE, TK_JOIN, TK_INSERT, TK_MATCH, + TK_PLAN, TK_ANALYZE, TK_PRAGMA, TK_ABORT, TK_UPDATE, + TK_VALUES, TK_VIRTUAL, TK_ALWAYS, TK_WHEN, TK_WHERE, + TK_RECURSIVE, TK_AFTER, TK_RENAME, TK_AND, TK_DEFERRED, + TK_DISTINCT, TK_IS, TK_AUTOINCR, TK_TO, TK_IN, + TK_CAST, TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, TK_JOIN_KW, + TK_CTIME_KW, TK_CTIME_KW, TK_CURRENT, TK_PARTITION, TK_DROP, + TK_PRECEDING, TK_FAIL, TK_LAST, TK_FILTER, TK_REPLACE, + TK_FIRST, TK_FOLLOWING, TK_FROM, TK_JOIN_KW, TK_LIMIT, + TK_IF, TK_ORDER, TK_RESTRICT, TK_OTHERS, TK_OVER, + TK_JOIN_KW, TK_ROLLBACK, TK_ROWS, TK_ROW, TK_UNBOUNDED, + TK_UNION, TK_USING, TK_VACUUM, TK_VIEW, TK_WINDOW, + TK_DO, TK_BY, TK_INITIALLY, TK_ALL, TK_PRIMARY, +}; +/* Hash table decoded: +** 0: INSERT +** 1: IS +** 2: ROLLBACK TRIGGER +** 3: IMMEDIATE +** 4: PARTITION +** 5: TEMP +** 6: +** 7: +** 8: VALUES WITHOUT +** 9: +** 10: MATCH +** 11: NOTHING +** 12: +** 13: OF +** 14: TIES IGNORE +** 15: PLAN +** 16: INSTEAD INDEXED +** 17: +** 18: TRANSACTION RIGHT +** 19: WHEN +** 20: SET HAVING +** 21: IF +** 22: ROWS +** 23: SELECT +** 24: +** 25: +** 26: VACUUM SAVEPOINT +** 27: +** 28: LIKE UNION VIRTUAL REFERENCES +** 29: RESTRICT +** 30: +** 31: THEN REGEXP +** 32: TO +** 33: +** 34: BEFORE +** 35: +** 36: +** 37: FOLLOWING COLLATE CASCADE +** 38: CREATE +** 39: +** 40: CASE REINDEX +** 41: EACH +** 42: +** 43: QUERY +** 44: AND ADD +** 45: PRIMARY ANALYZE +** 46: +** 47: ROW ASC DETACH +** 48: CURRENT_TIME CURRENT_DATE +** 49: +** 50: +** 51: EXCLUSIVE TEMPORARY +** 52: +** 53: DEFERRED +** 54: DEFERRABLE +** 55: +** 56: DATABASE +** 57: +** 58: DELETE VIEW GENERATED +** 59: ATTACH +** 60: END +** 61: EXCLUDE +** 62: ESCAPE DESC +** 63: GLOB +** 64: WINDOW ELSE +** 65: COLUMN +** 66: FIRST +** 67: +** 68: GROUPS ALL +** 69: DISTINCT DROP KEY +** 70: BETWEEN +** 71: INITIALLY +** 72: BEGIN +** 73: FILTER CHECK ACTION +** 74: GROUP INDEX +** 75: +** 76: EXISTS DEFAULT +** 77: +** 78: FOR CURRENT_TIMESTAMP +** 79: EXCEPT +** 80: +** 81: CROSS +** 82: +** 83: +** 84: +** 85: CAST +** 86: FOREIGN AUTOINCREMENT +** 87: COMMIT +** 88: CURRENT AFTER ALTER +** 89: FULL FAIL CONFLICT +** 90: EXPLAIN +** 91: CONSTRAINT +** 92: FROM ALWAYS +** 93: +** 94: ABORT +** 95: +** 96: AS DO +** 97: REPLACE WITH RELEASE +** 98: BY RENAME +** 99: RANGE RAISE +** 100: OTHERS +** 101: USING NULLS +** 102: PRAGMA +** 103: JOIN ISNULL OFFSET +** 104: NOT +** 105: OR LAST LEFT +** 106: LIMIT +** 107: +** 108: +** 109: IN +** 110: INTO +** 111: OVER RECURSIVE +** 112: ORDER OUTER +** 113: +** 114: INTERSECT UNBOUNDED +** 115: +** 116: +** 117: ON +** 118: +** 119: WHERE +** 120: NO INNER +** 121: NULL +** 122: +** 123: TABLE +** 124: NATURAL NOTNULL +** 125: PRECEDING +** 126: UPDATE UNIQUE +*/ +/* Check to see if z[0..n-1] is a keyword. If it is, write the +** parser symbol code for that keyword into *pType. Always +** return the integer n (the length of the token). */ +static int keywordCode(const char *z, int n, int *pType){ + int i, j; + const char *zKW; + if( n>=2 ){ + i = ((charMap(z[0])*4) ^ (charMap(z[n-1])*3) ^ n) % 127; + for(i=((int)aKWHash[i])-1; i>=0; i=((int)aKWNext[i])-1){ + if( aKWLen[i]!=n ) continue; + zKW = &zKWText[aKWOffset[i]]; +#ifdef SQLITE_ASCII + if( (z[0]&~0x20)!=zKW[0] ) continue; + if( (z[1]&~0x20)!=zKW[1] ) continue; + j = 2; + while( j=SQLITE_N_KEYWORD ) return SQLITE_ERROR; + *pzName = zKWText + aKWOffset[i]; + *pnName = aKWLen[i]; + return SQLITE_OK; +} +SQLITE_API int sqlite3_keyword_count(void){ return SQLITE_N_KEYWORD; } +SQLITE_API int sqlite3_keyword_check(const char *zName, int nName){ + return TK_ID!=sqlite3KeywordCode((const u8*)zName, nName); +} + +/************** End of keywordhash.h *****************************************/ +/************** Continuing where we left off in tokenize.c *******************/ + + +/* +** If X is a character that can be used in an identifier then +** IdChar(X) will be true. Otherwise it is false. +** +** For ASCII, any character with the high-order bit set is +** allowed in an identifier. For 7-bit characters, +** sqlite3IsIdChar[X] must be 1. +** +** For EBCDIC, the rules are more complex but have the same +** end result. +** +** Ticket #1066. the SQL standard does not allow '$' in the +** middle of identifiers. But many SQL implementations do. +** SQLite will allow '$' in identifiers for compatibility. +** But the feature is undocumented. +*/ +#ifdef SQLITE_ASCII +#define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0) +#endif +#ifdef SQLITE_EBCDIC +SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[] = { +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 4x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, /* 5x */ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, /* 6x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, /* 7x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, /* 8x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, /* 9x */ + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, /* Ax */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, /* Cx */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, /* Dx */ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, /* Ex */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, /* Fx */ +}; +#define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) +#endif + +/* Make the IdChar function accessible from ctime.c and alter.c */ +SQLITE_PRIVATE int sqlite3IsIdChar(u8 c){ return IdChar(c); } + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Return the id of the next token in string (*pz). Before returning, set +** (*pz) to point to the byte following the parsed token. +*/ +static int getToken(const unsigned char **pz){ + const unsigned char *z = *pz; + int t; /* Token type to return */ + do { + z += sqlite3GetToken(z, &t); + }while( t==TK_SPACE ); + if( t==TK_ID + || t==TK_STRING + || t==TK_JOIN_KW + || t==TK_WINDOW + || t==TK_OVER + || sqlite3ParserFallback(t)==TK_ID + ){ + t = TK_ID; + } + *pz = z; + return t; +} + +/* +** The following three functions are called immediately after the tokenizer +** reads the keywords WINDOW, OVER and FILTER, respectively, to determine +** whether the token should be treated as a keyword or an SQL identifier. +** This cannot be handled by the usual lemon %fallback method, due to +** the ambiguity in some constructions. e.g. +** +** SELECT sum(x) OVER ... +** +** In the above, "OVER" might be a keyword, or it might be an alias for the +** sum(x) expression. If a "%fallback ID OVER" directive were added to +** grammar, then SQLite would always treat "OVER" as an alias, making it +** impossible to call a window-function without a FILTER clause. +** +** WINDOW is treated as a keyword if: +** +** * the following token is an identifier, or a keyword that can fallback +** to being an identifier, and +** * the token after than one is TK_AS. +** +** OVER is a keyword if: +** +** * the previous token was TK_RP, and +** * the next token is either TK_LP or an identifier. +** +** FILTER is a keyword if: +** +** * the previous token was TK_RP, and +** * the next token is TK_LP. +*/ +static int analyzeWindowKeyword(const unsigned char *z){ + int t; + t = getToken(&z); + if( t!=TK_ID ) return TK_ID; + t = getToken(&z); + if( t!=TK_AS ) return TK_ID; + return TK_WINDOW; +} +static int analyzeOverKeyword(const unsigned char *z, int lastToken){ + if( lastToken==TK_RP ){ + int t = getToken(&z); + if( t==TK_LP || t==TK_ID ) return TK_OVER; + } + return TK_ID; +} +static int analyzeFilterKeyword(const unsigned char *z, int lastToken){ + if( lastToken==TK_RP && getToken(&z)==TK_LP ){ + return TK_FILTER; + } + return TK_ID; +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** Return the length (in bytes) of the token that begins at z[0]. +** Store the token type in *tokenType before returning. +*/ +SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ + int i, c; + switch( aiClass[*z] ){ /* Switch on the character-class of the first byte + ** of the token. See the comment on the CC_ defines + ** above. */ + case CC_SPACE: { + testcase( z[0]==' ' ); + testcase( z[0]=='\t' ); + testcase( z[0]=='\n' ); + testcase( z[0]=='\f' ); + testcase( z[0]=='\r' ); + for(i=1; sqlite3Isspace(z[i]); i++){} + *tokenType = TK_SPACE; + return i; + } + case CC_MINUS: { + if( z[1]=='-' ){ + for(i=2; (c=z[i])!=0 && c!='\n'; i++){} + *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ + return i; + } + *tokenType = TK_MINUS; + return 1; + } + case CC_LP: { + *tokenType = TK_LP; + return 1; + } + case CC_RP: { + *tokenType = TK_RP; + return 1; + } + case CC_SEMI: { + *tokenType = TK_SEMI; + return 1; + } + case CC_PLUS: { + *tokenType = TK_PLUS; + return 1; + } + case CC_STAR: { + *tokenType = TK_STAR; + return 1; + } + case CC_SLASH: { + if( z[1]!='*' || z[2]==0 ){ + *tokenType = TK_SLASH; + return 1; + } + for(i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){} + if( c ) i++; + *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ + return i; + } + case CC_PERCENT: { + *tokenType = TK_REM; + return 1; + } + case CC_EQ: { + *tokenType = TK_EQ; + return 1 + (z[1]=='='); + } + case CC_LT: { + if( (c=z[1])=='=' ){ + *tokenType = TK_LE; + return 2; + }else if( c=='>' ){ + *tokenType = TK_NE; + return 2; + }else if( c=='<' ){ + *tokenType = TK_LSHIFT; + return 2; + }else{ + *tokenType = TK_LT; + return 1; + } + } + case CC_GT: { + if( (c=z[1])=='=' ){ + *tokenType = TK_GE; + return 2; + }else if( c=='>' ){ + *tokenType = TK_RSHIFT; + return 2; + }else{ + *tokenType = TK_GT; + return 1; + } + } + case CC_BANG: { + if( z[1]!='=' ){ + *tokenType = TK_ILLEGAL; + return 1; + }else{ + *tokenType = TK_NE; + return 2; + } + } + case CC_PIPE: { + if( z[1]!='|' ){ + *tokenType = TK_BITOR; + return 1; + }else{ + *tokenType = TK_CONCAT; + return 2; + } + } + case CC_COMMA: { + *tokenType = TK_COMMA; + return 1; + } + case CC_AND: { + *tokenType = TK_BITAND; + return 1; + } + case CC_TILDA: { + *tokenType = TK_BITNOT; + return 1; + } + case CC_QUOTE: { + int delim = z[0]; + testcase( delim=='`' ); + testcase( delim=='\'' ); + testcase( delim=='"' ); + for(i=1; (c=z[i])!=0; i++){ + if( c==delim ){ + if( z[i+1]==delim ){ + i++; + }else{ + break; + } + } + } + if( c=='\'' ){ + *tokenType = TK_STRING; + return i+1; + }else if( c!=0 ){ + *tokenType = TK_ID; + return i+1; + }else{ + *tokenType = TK_ILLEGAL; + return i; + } + } + case CC_DOT: { +#ifndef SQLITE_OMIT_FLOATING_POINT + if( !sqlite3Isdigit(z[1]) ) +#endif + { + *tokenType = TK_DOT; + return 1; + } + /* If the next character is a digit, this is a floating point + ** number that begins with ".". Fall thru into the next case */ + } + case CC_DIGIT: { + testcase( z[0]=='0' ); testcase( z[0]=='1' ); testcase( z[0]=='2' ); + testcase( z[0]=='3' ); testcase( z[0]=='4' ); testcase( z[0]=='5' ); + testcase( z[0]=='6' ); testcase( z[0]=='7' ); testcase( z[0]=='8' ); + testcase( z[0]=='9' ); + *tokenType = TK_INTEGER; +#ifndef SQLITE_OMIT_HEX_INTEGER + if( z[0]=='0' && (z[1]=='x' || z[1]=='X') && sqlite3Isxdigit(z[2]) ){ + for(i=3; sqlite3Isxdigit(z[i]); i++){} + return i; + } +#endif + for(i=0; sqlite3Isdigit(z[i]); i++){} +#ifndef SQLITE_OMIT_FLOATING_POINT + if( z[i]=='.' ){ + i++; + while( sqlite3Isdigit(z[i]) ){ i++; } + *tokenType = TK_FLOAT; + } + if( (z[i]=='e' || z[i]=='E') && + ( sqlite3Isdigit(z[i+1]) + || ((z[i+1]=='+' || z[i+1]=='-') && sqlite3Isdigit(z[i+2])) + ) + ){ + i += 2; + while( sqlite3Isdigit(z[i]) ){ i++; } + *tokenType = TK_FLOAT; + } +#endif + while( IdChar(z[i]) ){ + *tokenType = TK_ILLEGAL; + i++; + } + return i; + } + case CC_QUOTE2: { + for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){} + *tokenType = c==']' ? TK_ID : TK_ILLEGAL; + return i; + } + case CC_VARNUM: { + *tokenType = TK_VARIABLE; + for(i=1; sqlite3Isdigit(z[i]); i++){} + return i; + } + case CC_DOLLAR: + case CC_VARALPHA: { + int n = 0; + testcase( z[0]=='$' ); testcase( z[0]=='@' ); + testcase( z[0]==':' ); testcase( z[0]=='#' ); + *tokenType = TK_VARIABLE; + for(i=1; (c=z[i])!=0; i++){ + if( IdChar(c) ){ + n++; +#ifndef SQLITE_OMIT_TCL_VARIABLE + }else if( c=='(' && n>0 ){ + do{ + i++; + }while( (c=z[i])!=0 && !sqlite3Isspace(c) && c!=')' ); + if( c==')' ){ + i++; + }else{ + *tokenType = TK_ILLEGAL; + } + break; + }else if( c==':' && z[i+1]==':' ){ + i++; +#endif + }else{ + break; + } + } + if( n==0 ) *tokenType = TK_ILLEGAL; + return i; + } + case CC_KYWD: { + for(i=1; aiClass[z[i]]<=CC_KYWD; i++){} + if( IdChar(z[i]) ){ + /* This token started out using characters that can appear in keywords, + ** but z[i] is a character not allowed within keywords, so this must + ** be an identifier instead */ + i++; + break; + } + *tokenType = TK_ID; + return keywordCode((char*)z, i, tokenType); + } + case CC_X: { +#ifndef SQLITE_OMIT_BLOB_LITERAL + testcase( z[0]=='x' ); testcase( z[0]=='X' ); + if( z[1]=='\'' ){ + *tokenType = TK_BLOB; + for(i=2; sqlite3Isxdigit(z[i]); i++){} + if( z[i]!='\'' || i%2 ){ + *tokenType = TK_ILLEGAL; + while( z[i] && z[i]!='\'' ){ i++; } + } + if( z[i] ) i++; + return i; + } +#endif + /* If it is not a BLOB literal, then it must be an ID, since no + ** SQL keywords start with the letter 'x'. Fall through */ + } + case CC_ID: { + i = 1; + break; + } + case CC_NUL: { + *tokenType = TK_ILLEGAL; + return 0; + } + default: { + *tokenType = TK_ILLEGAL; + return 1; + } + } + while( IdChar(z[i]) ){ i++; } + *tokenType = TK_ID; + return i; +} + +/* +** Run the parser on the given SQL string. The parser structure is +** passed in. An SQLITE_ status code is returned. If an error occurs +** then an and attempt is made to write an error message into +** memory obtained from sqlite3_malloc() and to make *pzErrMsg point to that +** error message. +*/ +SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ + int nErr = 0; /* Number of errors encountered */ + void *pEngine; /* The LEMON-generated LALR(1) parser */ + int n = 0; /* Length of the next token token */ + int tokenType; /* type of the next token */ + int lastTokenParsed = -1; /* type of the previous token */ + sqlite3 *db = pParse->db; /* The database connection */ + int mxSqlLen; /* Max length of an SQL string */ +#ifdef sqlite3Parser_ENGINEALWAYSONSTACK + yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ +#endif + VVA_ONLY( u8 startedWithOom = db->mallocFailed ); + + assert( zSql!=0 ); + mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; + if( db->nVdbeActive==0 ){ + AtomicStore(&db->u1.isInterrupted, 0); + } + pParse->rc = SQLITE_OK; + pParse->zTail = zSql; + assert( pzErrMsg!=0 ); +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_ParserTrace ){ + printf("parser: [[[%s]]]\n", zSql); + sqlite3ParserTrace(stdout, "parser: "); + }else{ + sqlite3ParserTrace(0, 0); + } +#endif +#ifdef sqlite3Parser_ENGINEALWAYSONSTACK + pEngine = &sEngine; + sqlite3ParserInit(pEngine, pParse); +#else + pEngine = sqlite3ParserAlloc(sqlite3Malloc, pParse); + if( pEngine==0 ){ + sqlite3OomFault(db); + return SQLITE_NOMEM_BKPT; + } +#endif + assert( pParse->pNewTable==0 ); + assert( pParse->pNewTrigger==0 ); + assert( pParse->nVar==0 ); + assert( pParse->pVList==0 ); + pParse->pParentParse = db->pParse; + db->pParse = pParse; + while( 1 ){ + n = sqlite3GetToken((u8*)zSql, &tokenType); + mxSqlLen -= n; + if( mxSqlLen<0 ){ + pParse->rc = SQLITE_TOOBIG; + break; + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( tokenType>=TK_WINDOW ){ + assert( tokenType==TK_SPACE || tokenType==TK_OVER || tokenType==TK_FILTER + || tokenType==TK_ILLEGAL || tokenType==TK_WINDOW + ); +#else + if( tokenType>=TK_SPACE ){ + assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL ); +#endif /* SQLITE_OMIT_WINDOWFUNC */ + if( AtomicLoad(&db->u1.isInterrupted) ){ + pParse->rc = SQLITE_INTERRUPT; + break; + } + if( tokenType==TK_SPACE ){ + zSql += n; + continue; + } + if( zSql[0]==0 ){ + /* Upon reaching the end of input, call the parser two more times + ** with tokens TK_SEMI and 0, in that order. */ + if( lastTokenParsed==TK_SEMI ){ + tokenType = 0; + }else if( lastTokenParsed==0 ){ + break; + }else{ + tokenType = TK_SEMI; + } + n = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + }else if( tokenType==TK_WINDOW ){ + assert( n==6 ); + tokenType = analyzeWindowKeyword((const u8*)&zSql[6]); + }else if( tokenType==TK_OVER ){ + assert( n==4 ); + tokenType = analyzeOverKeyword((const u8*)&zSql[4], lastTokenParsed); + }else if( tokenType==TK_FILTER ){ + assert( n==6 ); + tokenType = analyzeFilterKeyword((const u8*)&zSql[6], lastTokenParsed); +#endif /* SQLITE_OMIT_WINDOWFUNC */ + }else{ + sqlite3ErrorMsg(pParse, "unrecognized token: \"%.*s\"", n, zSql); + break; + } + } + pParse->sLastToken.z = zSql; + pParse->sLastToken.n = n; + sqlite3Parser(pEngine, tokenType, pParse->sLastToken); + lastTokenParsed = tokenType; + zSql += n; + assert( db->mallocFailed==0 || pParse->rc!=SQLITE_OK || startedWithOom ); + if( pParse->rc!=SQLITE_OK ) break; + } + assert( nErr==0 ); +#ifdef YYTRACKMAXSTACKDEPTH + sqlite3_mutex_enter(sqlite3MallocMutex()); + sqlite3StatusHighwater(SQLITE_STATUS_PARSER_STACK, + sqlite3ParserStackPeak(pEngine) + ); + sqlite3_mutex_leave(sqlite3MallocMutex()); +#endif /* YYDEBUG */ +#ifdef sqlite3Parser_ENGINEALWAYSONSTACK + sqlite3ParserFinalize(pEngine); +#else + sqlite3ParserFree(pEngine, sqlite3_free); +#endif + if( db->mallocFailed ){ + pParse->rc = SQLITE_NOMEM_BKPT; + } + if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){ + pParse->zErrMsg = sqlite3MPrintf(db, "%s", sqlite3ErrStr(pParse->rc)); + } + assert( pzErrMsg!=0 ); + if( pParse->zErrMsg ){ + *pzErrMsg = pParse->zErrMsg; + sqlite3_log(pParse->rc, "%s in \"%s\"", + *pzErrMsg, pParse->zTail); + pParse->zErrMsg = 0; + nErr++; + } + pParse->zTail = zSql; + if( pParse->pVdbe && pParse->nErr>0 && pParse->nested==0 ){ + sqlite3VdbeDelete(pParse->pVdbe); + pParse->pVdbe = 0; + } +#ifndef SQLITE_OMIT_SHARED_CACHE + if( pParse->nested==0 ){ + sqlite3DbFree(db, pParse->aTableLock); + pParse->aTableLock = 0; + pParse->nTableLock = 0; + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3_free(pParse->apVtabLock); +#endif + + if( !IN_SPECIAL_PARSE ){ + /* If the pParse->declareVtab flag is set, do not delete any table + ** structure built up in pParse->pNewTable. The calling code (see vtab.c) + ** will take responsibility for freeing the Table structure. + */ + sqlite3DeleteTable(db, pParse->pNewTable); + } + if( !IN_RENAME_OBJECT ){ + sqlite3DeleteTrigger(db, pParse->pNewTrigger); + } + + if( pParse->pWithToFree ) sqlite3WithDelete(db, pParse->pWithToFree); + sqlite3DbFree(db, pParse->pVList); + while( pParse->pAinc ){ + AutoincInfo *p = pParse->pAinc; + pParse->pAinc = p->pNext; + sqlite3DbFreeNN(db, p); + } + while( pParse->pZombieTab ){ + Table *p = pParse->pZombieTab; + pParse->pZombieTab = p->pNextZombie; + sqlite3DeleteTable(db, p); + } + db->pParse = pParse->pParentParse; + pParse->pParentParse = 0; + assert( nErr==0 || pParse->rc!=SQLITE_OK ); + return nErr; +} + + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Insert a single space character into pStr if the current string +** ends with an identifier +*/ +static void addSpaceSeparator(sqlite3_str *pStr){ + if( pStr->nChar && sqlite3IsIdChar(pStr->zText[pStr->nChar-1]) ){ + sqlite3_str_append(pStr, " ", 1); + } +} + +/* +** Compute a normalization of the SQL given by zSql[0..nSql-1]. Return +** the normalization in space obtained from sqlite3DbMalloc(). Or return +** NULL if anything goes wrong or if zSql is NULL. +*/ +SQLITE_PRIVATE char *sqlite3Normalize( + Vdbe *pVdbe, /* VM being reprepared */ + const char *zSql /* The original SQL string */ +){ + sqlite3 *db; /* The database connection */ + int i; /* Next unread byte of zSql[] */ + int n; /* length of current token */ + int tokenType; /* type of current token */ + int prevType = 0; /* Previous non-whitespace token */ + int nParen; /* Number of nested levels of parentheses */ + int iStartIN; /* Start of RHS of IN operator in z[] */ + int nParenAtIN; /* Value of nParent at start of RHS of IN operator */ + u32 j; /* Bytes of normalized SQL generated so far */ + sqlite3_str *pStr; /* The normalized SQL string under construction */ + + db = sqlite3VdbeDb(pVdbe); + tokenType = -1; + nParen = iStartIN = nParenAtIN = 0; + pStr = sqlite3_str_new(db); + assert( pStr!=0 ); /* sqlite3_str_new() never returns NULL */ + for(i=0; zSql[i] && pStr->accError==0; i+=n){ + if( tokenType!=TK_SPACE ){ + prevType = tokenType; + } + n = sqlite3GetToken((unsigned char*)zSql+i, &tokenType); + if( NEVER(n<=0) ) break; + switch( tokenType ){ + case TK_SPACE: { + break; + } + case TK_NULL: { + if( prevType==TK_IS || prevType==TK_NOT ){ + sqlite3_str_append(pStr, " NULL", 5); + break; + } + /* Fall through */ + } + case TK_STRING: + case TK_INTEGER: + case TK_FLOAT: + case TK_VARIABLE: + case TK_BLOB: { + sqlite3_str_append(pStr, "?", 1); + break; + } + case TK_LP: { + nParen++; + if( prevType==TK_IN ){ + iStartIN = pStr->nChar; + nParenAtIN = nParen; + } + sqlite3_str_append(pStr, "(", 1); + break; + } + case TK_RP: { + if( iStartIN>0 && nParen==nParenAtIN ){ + assert( pStr->nChar>=(u32)iStartIN ); + pStr->nChar = iStartIN+1; + sqlite3_str_append(pStr, "?,?,?", 5); + iStartIN = 0; + } + nParen--; + sqlite3_str_append(pStr, ")", 1); + break; + } + case TK_ID: { + iStartIN = 0; + j = pStr->nChar; + if( sqlite3Isquote(zSql[i]) ){ + char *zId = sqlite3DbStrNDup(db, zSql+i, n); + int nId; + int eType = 0; + if( zId==0 ) break; + sqlite3Dequote(zId); + if( zSql[i]=='"' && sqlite3VdbeUsesDoubleQuotedString(pVdbe, zId) ){ + sqlite3_str_append(pStr, "?", 1); + sqlite3DbFree(db, zId); + break; + } + nId = sqlite3Strlen30(zId); + if( sqlite3GetToken((u8*)zId, &eType)==nId && eType==TK_ID ){ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zId, nId); + }else{ + sqlite3_str_appendf(pStr, "\"%w\"", zId); + } + sqlite3DbFree(db, zId); + }else{ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zSql+i, n); + } + while( jnChar ){ + pStr->zText[j] = sqlite3Tolower(pStr->zText[j]); + j++; + } + break; + } + case TK_SELECT: { + iStartIN = 0; + /* fall through */ + } + default: { + if( sqlite3IsIdChar(zSql[i]) ) addSpaceSeparator(pStr); + j = pStr->nChar; + sqlite3_str_append(pStr, zSql+i, n); + while( jnChar ){ + pStr->zText[j] = sqlite3Toupper(pStr->zText[j]); + j++; + } + break; + } + } + } + if( tokenType!=TK_SEMI ) sqlite3_str_append(pStr, ";", 1); + return sqlite3_str_finish(pStr); +} +#endif /* SQLITE_ENABLE_NORMALIZE */ + +/************** End of tokenize.c ********************************************/ +/************** Begin file complete.c ****************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** An tokenizer for SQL +** +** This file contains C code that implements the sqlite3_complete() API. +** This code used to be part of the tokenizer.c source file. But by +** separating it out, the code will be automatically omitted from +** static links that do not use it. +*/ +/* #include "sqliteInt.h" */ +#ifndef SQLITE_OMIT_COMPLETE + +/* +** This is defined in tokenize.c. We just have to import the definition. +*/ +#ifndef SQLITE_AMALGAMATION +#ifdef SQLITE_ASCII +#define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0) +#endif +#ifdef SQLITE_EBCDIC +SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[]; +#define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) +#endif +#endif /* SQLITE_AMALGAMATION */ + + +/* +** Token types used by the sqlite3_complete() routine. See the header +** comments on that procedure for additional information. +*/ +#define tkSEMI 0 +#define tkWS 1 +#define tkOTHER 2 +#ifndef SQLITE_OMIT_TRIGGER +#define tkEXPLAIN 3 +#define tkCREATE 4 +#define tkTEMP 5 +#define tkTRIGGER 6 +#define tkEND 7 +#endif + +/* +** Return TRUE if the given SQL string ends in a semicolon. +** +** Special handling is require for CREATE TRIGGER statements. +** Whenever the CREATE TRIGGER keywords are seen, the statement +** must end with ";END;". +** +** This implementation uses a state machine with 8 states: +** +** (0) INVALID We have not yet seen a non-whitespace character. +** +** (1) START At the beginning or end of an SQL statement. This routine +** returns 1 if it ends in the START state and 0 if it ends +** in any other state. +** +** (2) NORMAL We are in the middle of statement which ends with a single +** semicolon. +** +** (3) EXPLAIN The keyword EXPLAIN has been seen at the beginning of +** a statement. +** +** (4) CREATE The keyword CREATE has been seen at the beginning of a +** statement, possibly preceded by EXPLAIN and/or followed by +** TEMP or TEMPORARY +** +** (5) TRIGGER We are in the middle of a trigger definition that must be +** ended by a semicolon, the keyword END, and another semicolon. +** +** (6) SEMI We've seen the first semicolon in the ";END;" that occurs at +** the end of a trigger definition. +** +** (7) END We've seen the ";END" of the ";END;" that occurs at the end +** of a trigger definition. +** +** Transitions between states above are determined by tokens extracted +** from the input. The following tokens are significant: +** +** (0) tkSEMI A semicolon. +** (1) tkWS Whitespace. +** (2) tkOTHER Any other SQL token. +** (3) tkEXPLAIN The "explain" keyword. +** (4) tkCREATE The "create" keyword. +** (5) tkTEMP The "temp" or "temporary" keyword. +** (6) tkTRIGGER The "trigger" keyword. +** (7) tkEND The "end" keyword. +** +** Whitespace never causes a state transition and is always ignored. +** This means that a SQL string of all whitespace is invalid. +** +** If we compile with SQLITE_OMIT_TRIGGER, all of the computation needed +** to recognize the end of a trigger can be omitted. All we have to do +** is look for a semicolon that is not part of an string or comment. +*/ +SQLITE_API int sqlite3_complete(const char *zSql){ + u8 state = 0; /* Current state, using numbers defined in header comment */ + u8 token; /* Value of the next token */ + +#ifndef SQLITE_OMIT_TRIGGER + /* A complex statement machine used to detect the end of a CREATE TRIGGER + ** statement. This is the normal case. + */ + static const u8 trans[8][8] = { + /* Token: */ + /* State: ** SEMI WS OTHER EXPLAIN CREATE TEMP TRIGGER END */ + /* 0 INVALID: */ { 1, 0, 2, 3, 4, 2, 2, 2, }, + /* 1 START: */ { 1, 1, 2, 3, 4, 2, 2, 2, }, + /* 2 NORMAL: */ { 1, 2, 2, 2, 2, 2, 2, 2, }, + /* 3 EXPLAIN: */ { 1, 3, 3, 2, 4, 2, 2, 2, }, + /* 4 CREATE: */ { 1, 4, 2, 2, 2, 4, 5, 2, }, + /* 5 TRIGGER: */ { 6, 5, 5, 5, 5, 5, 5, 5, }, + /* 6 SEMI: */ { 6, 6, 5, 5, 5, 5, 5, 7, }, + /* 7 END: */ { 1, 7, 5, 5, 5, 5, 5, 5, }, + }; +#else + /* If triggers are not supported by this compile then the statement machine + ** used to detect the end of a statement is much simpler + */ + static const u8 trans[3][3] = { + /* Token: */ + /* State: ** SEMI WS OTHER */ + /* 0 INVALID: */ { 1, 0, 2, }, + /* 1 START: */ { 1, 1, 2, }, + /* 2 NORMAL: */ { 1, 2, 2, }, + }; +#endif /* SQLITE_OMIT_TRIGGER */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( zSql==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + while( *zSql ){ + switch( *zSql ){ + case ';': { /* A semicolon */ + token = tkSEMI; + break; + } + case ' ': + case '\r': + case '\t': + case '\n': + case '\f': { /* White space is ignored */ + token = tkWS; + break; + } + case '/': { /* C-style comments */ + if( zSql[1]!='*' ){ + token = tkOTHER; + break; + } + zSql += 2; + while( zSql[0] && (zSql[0]!='*' || zSql[1]!='/') ){ zSql++; } + if( zSql[0]==0 ) return 0; + zSql++; + token = tkWS; + break; + } + case '-': { /* SQL-style comments from "--" to end of line */ + if( zSql[1]!='-' ){ + token = tkOTHER; + break; + } + while( *zSql && *zSql!='\n' ){ zSql++; } + if( *zSql==0 ) return state==1; + token = tkWS; + break; + } + case '[': { /* Microsoft-style identifiers in [...] */ + zSql++; + while( *zSql && *zSql!=']' ){ zSql++; } + if( *zSql==0 ) return 0; + token = tkOTHER; + break; + } + case '`': /* Grave-accent quoted symbols used by MySQL */ + case '"': /* single- and double-quoted strings */ + case '\'': { + int c = *zSql; + zSql++; + while( *zSql && *zSql!=c ){ zSql++; } + if( *zSql==0 ) return 0; + token = tkOTHER; + break; + } + default: { +#ifdef SQLITE_EBCDIC + unsigned char c; +#endif + if( IdChar((u8)*zSql) ){ + /* Keywords and unquoted identifiers */ + int nId; + for(nId=1; IdChar(zSql[nId]); nId++){} +#ifdef SQLITE_OMIT_TRIGGER + token = tkOTHER; +#else + switch( *zSql ){ + case 'c': case 'C': { + if( nId==6 && sqlite3StrNICmp(zSql, "create", 6)==0 ){ + token = tkCREATE; + }else{ + token = tkOTHER; + } + break; + } + case 't': case 'T': { + if( nId==7 && sqlite3StrNICmp(zSql, "trigger", 7)==0 ){ + token = tkTRIGGER; + }else if( nId==4 && sqlite3StrNICmp(zSql, "temp", 4)==0 ){ + token = tkTEMP; + }else if( nId==9 && sqlite3StrNICmp(zSql, "temporary", 9)==0 ){ + token = tkTEMP; + }else{ + token = tkOTHER; + } + break; + } + case 'e': case 'E': { + if( nId==3 && sqlite3StrNICmp(zSql, "end", 3)==0 ){ + token = tkEND; + }else +#ifndef SQLITE_OMIT_EXPLAIN + if( nId==7 && sqlite3StrNICmp(zSql, "explain", 7)==0 ){ + token = tkEXPLAIN; + }else +#endif + { + token = tkOTHER; + } + break; + } + default: { + token = tkOTHER; + break; + } + } +#endif /* SQLITE_OMIT_TRIGGER */ + zSql += nId-1; + }else{ + /* Operators and special symbols */ + token = tkOTHER; + } + break; + } + } + state = trans[state][token]; + zSql++; + } + return state==1; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** This routine is the same as the sqlite3_complete() routine described +** above, except that the parameter is required to be UTF-16 encoded, not +** UTF-8. +*/ +SQLITE_API int sqlite3_complete16(const void *zSql){ + sqlite3_value *pVal; + char const *zSql8; + int rc; + +#ifndef SQLITE_OMIT_AUTOINIT + rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + pVal = sqlite3ValueNew(0); + sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC); + zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8); + if( zSql8 ){ + rc = sqlite3_complete(zSql8); + }else{ + rc = SQLITE_NOMEM_BKPT; + } + sqlite3ValueFree(pVal); + return rc & 0xff; +} +#endif /* SQLITE_OMIT_UTF16 */ +#endif /* SQLITE_OMIT_COMPLETE */ + +/************** End of complete.c ********************************************/ +/************** Begin file main.c ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Main file for the SQLite library. The routines in this file +** implement the programmer interface to the library. Routines in +** other files are for internal use by SQLite and should not be +** accessed by users of the library. +*/ +/* #include "sqliteInt.h" */ + +#ifdef SQLITE_ENABLE_FTS3 +/************** Include fts3.h in the middle of main.c ***********************/ +/************** Begin file fts3.h ********************************************/ +/* +** 2006 Oct 10 +** +** 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 header file is used by programs that want to link against the +** FTS3 library. All it does is declare the sqlite3Fts3Init() interface. +*/ +/* #include "sqlite3.h" */ + +#if 0 +extern "C" { +#endif /* __cplusplus */ + +SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db); + +#if 0 +} /* extern "C" */ +#endif /* __cplusplus */ + +/************** End of fts3.h ************************************************/ +/************** Continuing where we left off in main.c ***********************/ +#endif +#ifdef SQLITE_ENABLE_RTREE +/************** Include rtree.h in the middle of main.c **********************/ +/************** Begin file rtree.h *******************************************/ +/* +** 2008 May 26 +** +** 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 header file is used by programs that want to link against the +** RTREE library. All it does is declare the sqlite3RtreeInit() interface. +*/ +/* #include "sqlite3.h" */ + +#ifdef SQLITE_OMIT_VIRTUALTABLE +# undef SQLITE_ENABLE_RTREE +#endif + +#if 0 +extern "C" { +#endif /* __cplusplus */ + +SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db); + +#if 0 +} /* extern "C" */ +#endif /* __cplusplus */ + +/************** End of rtree.h ***********************************************/ +/************** Continuing where we left off in main.c ***********************/ +#endif +#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) +/************** Include sqliteicu.h in the middle of main.c ******************/ +/************** Begin file sqliteicu.h ***************************************/ +/* +** 2008 May 26 +** +** 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 header file is used by programs that want to link against the +** ICU extension. All it does is declare the sqlite3IcuInit() interface. +*/ +/* #include "sqlite3.h" */ + +#if 0 +extern "C" { +#endif /* __cplusplus */ + +SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db); + +#if 0 +} /* extern "C" */ +#endif /* __cplusplus */ + + +/************** End of sqliteicu.h *******************************************/ +/************** Continuing where we left off in main.c ***********************/ +#endif + +/* +** This is an extension initializer that is a no-op and always +** succeeds, except that it fails if the fault-simulation is set +** to 500. +*/ +static int sqlite3TestExtInit(sqlite3 *db){ + (void)db; + return sqlite3FaultSim(500); +} + + +/* +** Forward declarations of external module initializer functions +** for modules that need them. +*/ +#ifdef SQLITE_ENABLE_FTS1 +SQLITE_PRIVATE int sqlite3Fts1Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_FTS2 +SQLITE_PRIVATE int sqlite3Fts2Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_FTS5 +SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_JSON1 +SQLITE_PRIVATE int sqlite3Json1Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_STMTVTAB +SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3*); +#endif + +/* +** An array of pointers to extension initializer functions for +** built-in extensions. +*/ +static int (*const sqlite3BuiltinExtensions[])(sqlite3*) = { +#ifdef SQLITE_ENABLE_FTS1 + sqlite3Fts1Init, +#endif +#ifdef SQLITE_ENABLE_FTS2 + sqlite3Fts2Init, +#endif +#ifdef SQLITE_ENABLE_FTS3 + sqlite3Fts3Init, +#endif +#ifdef SQLITE_ENABLE_FTS5 + sqlite3Fts5Init, +#endif +#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) + sqlite3IcuInit, +#endif +#ifdef SQLITE_ENABLE_RTREE + sqlite3RtreeInit, +#endif +#ifdef SQLITE_ENABLE_DBPAGE_VTAB + sqlite3DbpageRegister, +#endif +#ifdef SQLITE_ENABLE_DBSTAT_VTAB + sqlite3DbstatRegister, +#endif + sqlite3TestExtInit, +#ifdef SQLITE_ENABLE_JSON1 + sqlite3Json1Init, +#endif +#ifdef SQLITE_ENABLE_STMTVTAB + sqlite3StmtVtabInit, +#endif +#ifdef SQLITE_ENABLE_BYTECODE_VTAB + sqlite3VdbeBytecodeVtabInit, +#endif +}; + +#ifndef SQLITE_AMALGAMATION +/* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant +** contains the text of SQLITE_VERSION macro. +*/ +SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; +#endif + +/* IMPLEMENTATION-OF: R-53536-42575 The sqlite3_libversion() function returns +** a pointer to the to the sqlite3_version[] string constant. +*/ +SQLITE_API const char *sqlite3_libversion(void){ return sqlite3_version; } + +/* IMPLEMENTATION-OF: R-25063-23286 The sqlite3_sourceid() function returns a +** pointer to a string constant whose value is the same as the +** SQLITE_SOURCE_ID C preprocessor macro. Except if SQLite is built using +** an edited copy of the amalgamation, then the last four characters of +** the hash might be different from SQLITE_SOURCE_ID. +*/ +/* SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } */ + +/* IMPLEMENTATION-OF: R-35210-63508 The sqlite3_libversion_number() function +** returns an integer equal to SQLITE_VERSION_NUMBER. +*/ +SQLITE_API int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; } + +/* IMPLEMENTATION-OF: R-20790-14025 The sqlite3_threadsafe() function returns +** zero if and only if SQLite was compiled with mutexing code omitted due to +** the SQLITE_THREADSAFE compile-time option being set to 0. +*/ +SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } + +/* +** When compiling the test fixture or with debugging enabled (on Win32), +** this variable being set to non-zero will cause OSTRACE macros to emit +** extra diagnostic information. +*/ +#ifdef SQLITE_HAVE_OS_TRACE +# ifndef SQLITE_DEBUG_OS_TRACE +# define SQLITE_DEBUG_OS_TRACE 0 +# endif + int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE; +#endif + +#if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) +/* +** If the following function pointer is not NULL and if +** SQLITE_ENABLE_IOTRACE is enabled, then messages describing +** I/O active are written using this function. These messages +** are intended for debugging activity only. +*/ +SQLITE_API void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...) = 0; +#endif + +/* +** If the following global variable points to a string which is the +** name of a directory, then that directory will be used to store +** temporary files. +** +** See also the "PRAGMA temp_store_directory" SQL command. +*/ +SQLITE_API char *sqlite3_temp_directory = 0; + +/* +** If the following global variable points to a string which is the +** name of a directory, then that directory will be used to store +** all database files specified with a relative pathname. +** +** See also the "PRAGMA data_store_directory" SQL command. +*/ +SQLITE_API char *sqlite3_data_directory = 0; + +/* +** Initialize SQLite. +** +** This routine must be called to initialize the memory allocation, +** VFS, and mutex subsystems prior to doing any serious work with +** SQLite. But as long as you do not compile with SQLITE_OMIT_AUTOINIT +** this routine will be called automatically by key routines such as +** sqlite3_open(). +** +** This routine is a no-op except on its very first call for the process, +** or for the first call after a call to sqlite3_shutdown. +** +** The first thread to call this routine runs the initialization to +** completion. If subsequent threads call this routine before the first +** thread has finished the initialization process, then the subsequent +** threads must block until the first thread finishes with the initialization. +** +** The first thread might call this routine recursively. Recursive +** calls to this routine should not block, of course. Otherwise the +** initialization process would never complete. +** +** Let X be the first thread to enter this routine. Let Y be some other +** thread. Then while the initial invocation of this routine by X is +** incomplete, it is required that: +** +** * Calls to this routine from Y must block until the outer-most +** call by X completes. +** +** * Recursive calls to this routine from thread X return immediately +** without blocking. +*/ +SQLITE_API int sqlite3_initialize(void){ + MUTEX_LOGIC( sqlite3_mutex *pMaster; ) /* The main static mutex */ + int rc; /* Result code */ +#ifdef SQLITE_EXTRA_INIT + int bRunExtraInit = 0; /* Extra initialization needed */ +#endif + +#ifdef SQLITE_OMIT_WSD + rc = sqlite3_wsd_init(4096, 24); + if( rc!=SQLITE_OK ){ + return rc; + } +#endif + + /* If the following assert() fails on some obscure processor/compiler + ** combination, the work-around is to set the correct pointer + ** size at compile-time using -DSQLITE_PTRSIZE=n compile-time option */ + assert( SQLITE_PTRSIZE==sizeof(char*) ); + + /* If SQLite is already completely initialized, then this call + ** to sqlite3_initialize() should be a no-op. But the initialization + ** must be complete. So isInit must not be set until the very end + ** of this routine. + */ + if( sqlite3GlobalConfig.isInit ){ + sqlite3MemoryBarrier(); + return SQLITE_OK; + } + + /* Make sure the mutex subsystem is initialized. If unable to + ** initialize the mutex subsystem, return early with the error. + ** If the system is so sick that we are unable to allocate a mutex, + ** there is not much SQLite is going to be able to do. + ** + ** The mutex subsystem must take care of serializing its own + ** initialization. + */ + rc = sqlite3MutexInit(); + if( rc ) return rc; + + /* Initialize the malloc() system and the recursive pInitMutex mutex. + ** This operation is protected by the STATIC_MASTER mutex. Note that + ** MutexAlloc() is called for a static mutex prior to initializing the + ** malloc subsystem - this implies that the allocation of a static + ** mutex must not require support from the malloc subsystem. + */ + MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + sqlite3_mutex_enter(pMaster); + sqlite3GlobalConfig.isMutexInit = 1; + if( !sqlite3GlobalConfig.isMallocInit ){ + rc = sqlite3MallocInit(); + } + if( rc==SQLITE_OK ){ + sqlite3GlobalConfig.isMallocInit = 1; + if( !sqlite3GlobalConfig.pInitMutex ){ + sqlite3GlobalConfig.pInitMutex = + sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); + if( sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex ){ + rc = SQLITE_NOMEM_BKPT; + } + } + } + if( rc==SQLITE_OK ){ + sqlite3GlobalConfig.nRefInitMutex++; + } + sqlite3_mutex_leave(pMaster); + + /* If rc is not SQLITE_OK at this point, then either the malloc + ** subsystem could not be initialized or the system failed to allocate + ** the pInitMutex mutex. Return an error in either case. */ + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Do the rest of the initialization under the recursive mutex so + ** that we will be able to handle recursive calls into + ** sqlite3_initialize(). The recursive calls normally come through + ** sqlite3_os_init() when it invokes sqlite3_vfs_register(), but other + ** recursive calls might also be possible. + ** + ** IMPLEMENTATION-OF: R-00140-37445 SQLite automatically serializes calls + ** to the xInit method, so the xInit method need not be threadsafe. + ** + ** The following mutex is what serializes access to the appdef pcache xInit + ** methods. The sqlite3_pcache_methods.xInit() all is embedded in the + ** call to sqlite3PcacheInitialize(). + */ + sqlite3_mutex_enter(sqlite3GlobalConfig.pInitMutex); + if( sqlite3GlobalConfig.isInit==0 && sqlite3GlobalConfig.inProgress==0 ){ + sqlite3GlobalConfig.inProgress = 1; +#ifdef SQLITE_ENABLE_SQLLOG + { + extern void sqlite3_init_sqllog(void); + sqlite3_init_sqllog(); + } +#endif + memset(&sqlite3BuiltinFunctions, 0, sizeof(sqlite3BuiltinFunctions)); + sqlite3RegisterBuiltinFunctions(); + if( sqlite3GlobalConfig.isPCacheInit==0 ){ + rc = sqlite3PcacheInitialize(); + } + if( rc==SQLITE_OK ){ + sqlite3GlobalConfig.isPCacheInit = 1; + rc = sqlite3OsInit(); + } +#ifdef SQLITE_ENABLE_DESERIALIZE + if( rc==SQLITE_OK ){ + rc = sqlite3MemdbInit(); + } +#endif + if( rc==SQLITE_OK ){ + sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, + sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); + sqlite3MemoryBarrier(); + sqlite3GlobalConfig.isInit = 1; +#ifdef SQLITE_EXTRA_INIT + bRunExtraInit = 1; +#endif + } + sqlite3GlobalConfig.inProgress = 0; + } + sqlite3_mutex_leave(sqlite3GlobalConfig.pInitMutex); + + /* Go back under the static mutex and clean up the recursive + ** mutex to prevent a resource leak. + */ + sqlite3_mutex_enter(pMaster); + sqlite3GlobalConfig.nRefInitMutex--; + if( sqlite3GlobalConfig.nRefInitMutex<=0 ){ + assert( sqlite3GlobalConfig.nRefInitMutex==0 ); + sqlite3_mutex_free(sqlite3GlobalConfig.pInitMutex); + sqlite3GlobalConfig.pInitMutex = 0; + } + sqlite3_mutex_leave(pMaster); + + /* The following is just a sanity check to make sure SQLite has + ** been compiled correctly. It is important to run this code, but + ** we don't want to run it too often and soak up CPU cycles for no + ** reason. So we run it once during initialization. + */ +#ifndef NDEBUG +#ifndef SQLITE_OMIT_FLOATING_POINT + /* This section of code's only "output" is via assert() statements. */ + if( rc==SQLITE_OK ){ + u64 x = (((u64)1)<<63)-1; + double y; + assert(sizeof(x)==8); + assert(sizeof(x)==sizeof(y)); + memcpy(&y, &x, 8); + assert( sqlite3IsNaN(y) ); + } +#endif +#endif + + /* Do extra initialization steps requested by the SQLITE_EXTRA_INIT + ** compile-time option. + */ +#ifdef SQLITE_EXTRA_INIT + if( bRunExtraInit ){ + int SQLITE_EXTRA_INIT(const char*); + rc = SQLITE_EXTRA_INIT(0); + } +#endif + + return rc; +} + +/* +** Undo the effects of sqlite3_initialize(). Must not be called while +** there are outstanding database connections or memory allocations or +** while any part of SQLite is otherwise in use in any thread. This +** routine is not threadsafe. But it is safe to invoke this routine +** on when SQLite is already shut down. If SQLite is already shut down +** when this routine is invoked, then this routine is a harmless no-op. +*/ +SQLITE_API int sqlite3_shutdown(void){ +#ifdef SQLITE_OMIT_WSD + int rc = sqlite3_wsd_init(4096, 24); + if( rc!=SQLITE_OK ){ + return rc; + } +#endif + + if( sqlite3GlobalConfig.isInit ){ +#ifdef SQLITE_EXTRA_SHUTDOWN + void SQLITE_EXTRA_SHUTDOWN(void); + SQLITE_EXTRA_SHUTDOWN(); +#endif + sqlite3_os_end(); + sqlite3_reset_auto_extension(); + sqlite3GlobalConfig.isInit = 0; + } + if( sqlite3GlobalConfig.isPCacheInit ){ + sqlite3PcacheShutdown(); + sqlite3GlobalConfig.isPCacheInit = 0; + } + if( sqlite3GlobalConfig.isMallocInit ){ + sqlite3MallocEnd(); + sqlite3GlobalConfig.isMallocInit = 0; + +#ifndef SQLITE_OMIT_SHUTDOWN_DIRECTORIES + /* The heap subsystem has now been shutdown and these values are supposed + ** to be NULL or point to memory that was obtained from sqlite3_malloc(), + ** which would rely on that heap subsystem; therefore, make sure these + ** values cannot refer to heap memory that was just invalidated when the + ** heap subsystem was shutdown. This is only done if the current call to + ** this function resulted in the heap subsystem actually being shutdown. + */ + sqlite3_data_directory = 0; + sqlite3_temp_directory = 0; +#endif + } + if( sqlite3GlobalConfig.isMutexInit ){ + sqlite3MutexEnd(); + sqlite3GlobalConfig.isMutexInit = 0; + } + + return SQLITE_OK; +} + +/* +** This API allows applications to modify the global configuration of +** the SQLite library at run-time. +** +** This routine should only be called when there are no outstanding +** database connections or memory allocations. This routine is not +** threadsafe. Failure to heed these warnings can lead to unpredictable +** behavior. +*/ +SQLITE_API int sqlite3_config(int op, ...){ + va_list ap; + int rc = SQLITE_OK; + + /* sqlite3_config() shall return SQLITE_MISUSE if it is invoked while + ** the SQLite library is in use. */ + if( sqlite3GlobalConfig.isInit ) return SQLITE_MISUSE_BKPT; + + va_start(ap, op); + switch( op ){ + + /* Mutex configuration options are only available in a threadsafe + ** compile. + */ +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-54466-46756 */ + case SQLITE_CONFIG_SINGLETHREAD: { + /* EVIDENCE-OF: R-02748-19096 This option sets the threading mode to + ** Single-thread. */ + sqlite3GlobalConfig.bCoreMutex = 0; /* Disable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 0; /* Disable mutex on connections */ + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-20520-54086 */ + case SQLITE_CONFIG_MULTITHREAD: { + /* EVIDENCE-OF: R-14374-42468 This option sets the threading mode to + ** Multi-thread. */ + sqlite3GlobalConfig.bCoreMutex = 1; /* Enable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 0; /* Disable mutex on connections */ + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-59593-21810 */ + case SQLITE_CONFIG_SERIALIZED: { + /* EVIDENCE-OF: R-41220-51800 This option sets the threading mode to + ** Serialized. */ + sqlite3GlobalConfig.bCoreMutex = 1; /* Enable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 1; /* Enable mutex on connections */ + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-63666-48755 */ + case SQLITE_CONFIG_MUTEX: { + /* Specify an alternative mutex implementation */ + sqlite3GlobalConfig.mutex = *va_arg(ap, sqlite3_mutex_methods*); + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-14450-37597 */ + case SQLITE_CONFIG_GETMUTEX: { + /* Retrieve the current mutex implementation */ + *va_arg(ap, sqlite3_mutex_methods*) = sqlite3GlobalConfig.mutex; + break; + } +#endif + + case SQLITE_CONFIG_MALLOC: { + /* EVIDENCE-OF: R-55594-21030 The SQLITE_CONFIG_MALLOC option takes a + ** single argument which is a pointer to an instance of the + ** sqlite3_mem_methods structure. The argument specifies alternative + ** low-level memory allocation routines to be used in place of the memory + ** allocation routines built into SQLite. */ + sqlite3GlobalConfig.m = *va_arg(ap, sqlite3_mem_methods*); + break; + } + case SQLITE_CONFIG_GETMALLOC: { + /* EVIDENCE-OF: R-51213-46414 The SQLITE_CONFIG_GETMALLOC option takes a + ** single argument which is a pointer to an instance of the + ** sqlite3_mem_methods structure. The sqlite3_mem_methods structure is + ** filled with the currently defined memory allocation routines. */ + if( sqlite3GlobalConfig.m.xMalloc==0 ) sqlite3MemSetDefault(); + *va_arg(ap, sqlite3_mem_methods*) = sqlite3GlobalConfig.m; + break; + } + case SQLITE_CONFIG_MEMSTATUS: { + /* EVIDENCE-OF: R-61275-35157 The SQLITE_CONFIG_MEMSTATUS option takes + ** single argument of type int, interpreted as a boolean, which enables + ** or disables the collection of memory allocation statistics. */ + sqlite3GlobalConfig.bMemstat = va_arg(ap, int); + break; + } + case SQLITE_CONFIG_SMALL_MALLOC: { + sqlite3GlobalConfig.bSmallMalloc = va_arg(ap, int); + break; + } + case SQLITE_CONFIG_PAGECACHE: { + /* EVIDENCE-OF: R-18761-36601 There are three arguments to + ** SQLITE_CONFIG_PAGECACHE: A pointer to 8-byte aligned memory (pMem), + ** the size of each page cache line (sz), and the number of cache lines + ** (N). */ + sqlite3GlobalConfig.pPage = va_arg(ap, void*); + sqlite3GlobalConfig.szPage = va_arg(ap, int); + sqlite3GlobalConfig.nPage = va_arg(ap, int); + break; + } + case SQLITE_CONFIG_PCACHE_HDRSZ: { + /* EVIDENCE-OF: R-39100-27317 The SQLITE_CONFIG_PCACHE_HDRSZ option takes + ** a single parameter which is a pointer to an integer and writes into + ** that integer the number of extra bytes per page required for each page + ** in SQLITE_CONFIG_PAGECACHE. */ + *va_arg(ap, int*) = + sqlite3HeaderSizeBtree() + + sqlite3HeaderSizePcache() + + sqlite3HeaderSizePcache1(); + break; + } + + case SQLITE_CONFIG_PCACHE: { + /* no-op */ + break; + } + case SQLITE_CONFIG_GETPCACHE: { + /* now an error */ + rc = SQLITE_ERROR; + break; + } + + case SQLITE_CONFIG_PCACHE2: { + /* EVIDENCE-OF: R-63325-48378 The SQLITE_CONFIG_PCACHE2 option takes a + ** single argument which is a pointer to an sqlite3_pcache_methods2 + ** object. This object specifies the interface to a custom page cache + ** implementation. */ + sqlite3GlobalConfig.pcache2 = *va_arg(ap, sqlite3_pcache_methods2*); + break; + } + case SQLITE_CONFIG_GETPCACHE2: { + /* EVIDENCE-OF: R-22035-46182 The SQLITE_CONFIG_GETPCACHE2 option takes a + ** single argument which is a pointer to an sqlite3_pcache_methods2 + ** object. SQLite copies of the current page cache implementation into + ** that object. */ + if( sqlite3GlobalConfig.pcache2.xInit==0 ){ + sqlite3PCacheSetDefault(); + } + *va_arg(ap, sqlite3_pcache_methods2*) = sqlite3GlobalConfig.pcache2; + break; + } + +/* EVIDENCE-OF: R-06626-12911 The SQLITE_CONFIG_HEAP option is only +** available if SQLite is compiled with either SQLITE_ENABLE_MEMSYS3 or +** SQLITE_ENABLE_MEMSYS5 and returns SQLITE_ERROR if invoked otherwise. */ +#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) + case SQLITE_CONFIG_HEAP: { + /* EVIDENCE-OF: R-19854-42126 There are three arguments to + ** SQLITE_CONFIG_HEAP: An 8-byte aligned pointer to the memory, the + ** number of bytes in the memory buffer, and the minimum allocation size. + */ + sqlite3GlobalConfig.pHeap = va_arg(ap, void*); + sqlite3GlobalConfig.nHeap = va_arg(ap, int); + sqlite3GlobalConfig.mnReq = va_arg(ap, int); + + if( sqlite3GlobalConfig.mnReq<1 ){ + sqlite3GlobalConfig.mnReq = 1; + }else if( sqlite3GlobalConfig.mnReq>(1<<12) ){ + /* cap min request size at 2^12 */ + sqlite3GlobalConfig.mnReq = (1<<12); + } + + if( sqlite3GlobalConfig.pHeap==0 ){ + /* EVIDENCE-OF: R-49920-60189 If the first pointer (the memory pointer) + ** is NULL, then SQLite reverts to using its default memory allocator + ** (the system malloc() implementation), undoing any prior invocation of + ** SQLITE_CONFIG_MALLOC. + ** + ** Setting sqlite3GlobalConfig.m to all zeros will cause malloc to + ** revert to its default implementation when sqlite3_initialize() is run + */ + memset(&sqlite3GlobalConfig.m, 0, sizeof(sqlite3GlobalConfig.m)); + }else{ + /* EVIDENCE-OF: R-61006-08918 If the memory pointer is not NULL then the + ** alternative memory allocator is engaged to handle all of SQLites + ** memory allocation needs. */ +#ifdef SQLITE_ENABLE_MEMSYS3 + sqlite3GlobalConfig.m = *sqlite3MemGetMemsys3(); +#endif +#ifdef SQLITE_ENABLE_MEMSYS5 + sqlite3GlobalConfig.m = *sqlite3MemGetMemsys5(); +#endif + } + break; + } +#endif + + case SQLITE_CONFIG_LOOKASIDE: { + sqlite3GlobalConfig.szLookaside = va_arg(ap, int); + sqlite3GlobalConfig.nLookaside = va_arg(ap, int); + break; + } + + /* Record a pointer to the logger function and its first argument. + ** The default is NULL. Logging is disabled if the function pointer is + ** NULL. + */ + case SQLITE_CONFIG_LOG: { + /* MSVC is picky about pulling func ptrs from va lists. + ** http://support.microsoft.com/kb/47961 + ** sqlite3GlobalConfig.xLog = va_arg(ap, void(*)(void*,int,const char*)); + */ + typedef void(*LOGFUNC_t)(void*,int,const char*); + sqlite3GlobalConfig.xLog = va_arg(ap, LOGFUNC_t); + sqlite3GlobalConfig.pLogArg = va_arg(ap, void*); + break; + } + + /* EVIDENCE-OF: R-55548-33817 The compile-time setting for URI filenames + ** can be changed at start-time using the + ** sqlite3_config(SQLITE_CONFIG_URI,1) or + ** sqlite3_config(SQLITE_CONFIG_URI,0) configuration calls. + */ + case SQLITE_CONFIG_URI: { + /* EVIDENCE-OF: R-25451-61125 The SQLITE_CONFIG_URI option takes a single + ** argument of type int. If non-zero, then URI handling is globally + ** enabled. If the parameter is zero, then URI handling is globally + ** disabled. */ + sqlite3GlobalConfig.bOpenUri = va_arg(ap, int); + break; + } + + case SQLITE_CONFIG_COVERING_INDEX_SCAN: { + /* EVIDENCE-OF: R-36592-02772 The SQLITE_CONFIG_COVERING_INDEX_SCAN + ** option takes a single integer argument which is interpreted as a + ** boolean in order to enable or disable the use of covering indices for + ** full table scans in the query optimizer. */ + sqlite3GlobalConfig.bUseCis = va_arg(ap, int); + break; + } + +#ifdef SQLITE_ENABLE_SQLLOG + case SQLITE_CONFIG_SQLLOG: { + typedef void(*SQLLOGFUNC_t)(void*, sqlite3*, const char*, int); + sqlite3GlobalConfig.xSqllog = va_arg(ap, SQLLOGFUNC_t); + sqlite3GlobalConfig.pSqllogArg = va_arg(ap, void *); + break; + } +#endif + + case SQLITE_CONFIG_MMAP_SIZE: { + /* EVIDENCE-OF: R-58063-38258 SQLITE_CONFIG_MMAP_SIZE takes two 64-bit + ** integer (sqlite3_int64) values that are the default mmap size limit + ** (the default setting for PRAGMA mmap_size) and the maximum allowed + ** mmap size limit. */ + sqlite3_int64 szMmap = va_arg(ap, sqlite3_int64); + sqlite3_int64 mxMmap = va_arg(ap, sqlite3_int64); + /* EVIDENCE-OF: R-53367-43190 If either argument to this option is + ** negative, then that argument is changed to its compile-time default. + ** + ** EVIDENCE-OF: R-34993-45031 The maximum allowed mmap size will be + ** silently truncated if necessary so that it does not exceed the + ** compile-time maximum mmap size set by the SQLITE_MAX_MMAP_SIZE + ** compile-time option. + */ + if( mxMmap<0 || mxMmap>SQLITE_MAX_MMAP_SIZE ){ + mxMmap = SQLITE_MAX_MMAP_SIZE; + } + if( szMmap<0 ) szMmap = SQLITE_DEFAULT_MMAP_SIZE; + if( szMmap>mxMmap) szMmap = mxMmap; + sqlite3GlobalConfig.mxMmap = mxMmap; + sqlite3GlobalConfig.szMmap = szMmap; + break; + } + +#if SQLITE_OS_WIN && defined(SQLITE_WIN32_MALLOC) /* IMP: R-04780-55815 */ + case SQLITE_CONFIG_WIN32_HEAPSIZE: { + /* EVIDENCE-OF: R-34926-03360 SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit + ** unsigned integer value that specifies the maximum size of the created + ** heap. */ + sqlite3GlobalConfig.nHeap = va_arg(ap, int); + break; + } +#endif + + case SQLITE_CONFIG_PMASZ: { + sqlite3GlobalConfig.szPma = va_arg(ap, unsigned int); + break; + } + + case SQLITE_CONFIG_STMTJRNL_SPILL: { + sqlite3GlobalConfig.nStmtSpill = va_arg(ap, int); + break; + } + +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + case SQLITE_CONFIG_SORTERREF_SIZE: { + int iVal = va_arg(ap, int); + if( iVal<0 ){ + iVal = SQLITE_DEFAULT_SORTERREF_SIZE; + } + sqlite3GlobalConfig.szSorterRef = (u32)iVal; + break; + } +#endif /* SQLITE_ENABLE_SORTER_REFERENCES */ + +#ifdef SQLITE_ENABLE_DESERIALIZE + case SQLITE_CONFIG_MEMDB_MAXSIZE: { + sqlite3GlobalConfig.mxMemdbSize = va_arg(ap, sqlite3_int64); + break; + } +#endif /* SQLITE_ENABLE_DESERIALIZE */ + + default: { + rc = SQLITE_ERROR; + break; + } + } + va_end(ap); + return rc; +} + +/* +** Set up the lookaside buffers for a database connection. +** Return SQLITE_OK on success. +** If lookaside is already active, return SQLITE_BUSY. +** +** The sz parameter is the number of bytes in each lookaside slot. +** The cnt parameter is the number of slots. If pStart is NULL the +** space for the lookaside memory is obtained from sqlite3_malloc(). +** If pStart is not NULL then it is sz*cnt bytes of memory to use for +** the lookaside memory. +*/ +static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ +#ifndef SQLITE_OMIT_LOOKASIDE + void *pStart; + sqlite3_int64 szAlloc = sz*(sqlite3_int64)cnt; + int nBig; /* Number of full-size slots */ + int nSm; /* Number smaller LOOKASIDE_SMALL-byte slots */ + + if( sqlite3LookasideUsed(db,0)>0 ){ + return SQLITE_BUSY; + } + /* Free any existing lookaside buffer for this handle before + ** allocating a new one so we don't have to have space for + ** both at the same time. + */ + if( db->lookaside.bMalloced ){ + sqlite3_free(db->lookaside.pStart); + } + /* The size of a lookaside slot after ROUNDDOWN8 needs to be larger + ** than a pointer to be useful. + */ + sz = ROUNDDOWN8(sz); /* IMP: R-33038-09382 */ + if( sz<=(int)sizeof(LookasideSlot*) ) sz = 0; + if( cnt<0 ) cnt = 0; + if( sz==0 || cnt==0 ){ + sz = 0; + pStart = 0; + }else if( pBuf==0 ){ + sqlite3BeginBenignMalloc(); + pStart = sqlite3Malloc( szAlloc ); /* IMP: R-61949-35727 */ + sqlite3EndBenignMalloc(); + if( pStart ) szAlloc = sqlite3MallocSize(pStart); + }else{ + pStart = pBuf; + } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( sz>=LOOKASIDE_SMALL*3 ){ + nBig = szAlloc/(3*LOOKASIDE_SMALL+sz); + nSm = (szAlloc - sz*nBig)/LOOKASIDE_SMALL; + }else if( sz>=LOOKASIDE_SMALL*2 ){ + nBig = szAlloc/(LOOKASIDE_SMALL+sz); + nSm = (szAlloc - sz*nBig)/LOOKASIDE_SMALL; + }else +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + if( sz>0 ){ + nBig = szAlloc/sz; + nSm = 0; + }else{ + nBig = nSm = 0; + } + db->lookaside.pStart = pStart; + db->lookaside.pInit = 0; + db->lookaside.pFree = 0; + db->lookaside.sz = (u16)sz; + db->lookaside.szTrue = (u16)sz; + if( pStart ){ + int i; + LookasideSlot *p; + assert( sz > (int)sizeof(LookasideSlot*) ); + p = (LookasideSlot*)pStart; + for(i=0; ipNext = db->lookaside.pInit; + db->lookaside.pInit = p; + p = (LookasideSlot*)&((u8*)p)[sz]; + } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + db->lookaside.pSmallInit = 0; + db->lookaside.pSmallFree = 0; + db->lookaside.pMiddle = p; + for(i=0; ipNext = db->lookaside.pSmallInit; + db->lookaside.pSmallInit = p; + p = (LookasideSlot*)&((u8*)p)[LOOKASIDE_SMALL]; + } +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + assert( ((uptr)p)<=szAlloc + (uptr)pStart ); + db->lookaside.pEnd = p; + db->lookaside.bDisable = 0; + db->lookaside.bMalloced = pBuf==0 ?1:0; + db->lookaside.nSlot = nBig+nSm; + }else{ + db->lookaside.pStart = db; +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + db->lookaside.pSmallInit = 0; + db->lookaside.pSmallFree = 0; + db->lookaside.pMiddle = db; +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + db->lookaside.pEnd = db; + db->lookaside.bDisable = 1; + db->lookaside.sz = 0; + db->lookaside.bMalloced = 0; + db->lookaside.nSlot = 0; + } + assert( sqlite3LookasideUsed(db,0)==0 ); +#endif /* SQLITE_OMIT_LOOKASIDE */ + return SQLITE_OK; +} + +/* +** Return the mutex associated with a database connection. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->mutex; +} + +/* +** Free up as much memory as we can from the given database +** connection. +*/ +SQLITE_API int sqlite3_db_release_memory(sqlite3 *db){ + int i; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + Pager *pPager = sqlite3BtreePager(pBt); + sqlite3PagerShrink(pPager); + } + } + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Flush any dirty pages in the pager-cache for any attached database +** to disk. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3 *db){ + int i; + int rc = SQLITE_OK; + int bSeenBusy = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt && sqlite3BtreeIsInTrans(pBt) ){ + Pager *pPager = sqlite3BtreePager(pBt); + rc = sqlite3PagerFlush(pPager); + if( rc==SQLITE_BUSY ){ + bSeenBusy = 1; + rc = SQLITE_OK; + } + } + } + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + return ((rc==SQLITE_OK && bSeenBusy) ? SQLITE_BUSY : rc); +} + +/* +** Configuration settings for an individual database connection +*/ +SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ + va_list ap; + int rc; + va_start(ap, op); + switch( op ){ + case SQLITE_DBCONFIG_MAINDBNAME: { + /* IMP: R-06824-28531 */ + /* IMP: R-36257-52125 */ + db->aDb[0].zDbSName = va_arg(ap,char*); + rc = SQLITE_OK; + break; + } + case SQLITE_DBCONFIG_LOOKASIDE: { + void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */ + int sz = va_arg(ap, int); /* IMP: R-47871-25994 */ + int cnt = va_arg(ap, int); /* IMP: R-04460-53386 */ + rc = setupLookaside(db, pBuf, sz, cnt); + break; + } + default: { + static const struct { + int op; /* The opcode */ + u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */ + } aFlagOp[] = { + { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys }, + { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, + { SQLITE_DBCONFIG_ENABLE_VIEW, SQLITE_EnableView }, + { SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_Fts3Tokenizer }, + { SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension }, + { SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose }, + { SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_EnableQPSG }, + { SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_TriggerEQP }, + { SQLITE_DBCONFIG_RESET_DATABASE, SQLITE_ResetDatabase }, + { SQLITE_DBCONFIG_DEFENSIVE, SQLITE_Defensive }, + { SQLITE_DBCONFIG_WRITABLE_SCHEMA, SQLITE_WriteSchema| + SQLITE_NoSchemaError }, + { SQLITE_DBCONFIG_LEGACY_ALTER_TABLE, SQLITE_LegacyAlter }, + { SQLITE_DBCONFIG_DQS_DDL, SQLITE_DqsDDL }, + { SQLITE_DBCONFIG_DQS_DML, SQLITE_DqsDML }, + { SQLITE_DBCONFIG_LEGACY_FILE_FORMAT, SQLITE_LegacyFileFmt }, + { SQLITE_DBCONFIG_TRUSTED_SCHEMA, SQLITE_TrustedSchema }, + }; + unsigned int i; + rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ + for(i=0; iflags; + if( onoff>0 ){ + db->flags |= aFlagOp[i].mask; + }else if( onoff==0 ){ + db->flags &= ~(u64)aFlagOp[i].mask; + } + if( oldFlags!=db->flags ){ + sqlite3ExpirePreparedStatements(db, 0); + } + if( pRes ){ + *pRes = (db->flags & aFlagOp[i].mask)!=0; + } + rc = SQLITE_OK; + break; + } + } + break; + } + } + va_end(ap); + return rc; +} + +/* +** This is the default collating function named "BINARY" which is always +** available. +*/ +static int binCollFunc( + void *NotUsed, + int nKey1, const void *pKey1, + int nKey2, const void *pKey2 +){ + int rc, n; + UNUSED_PARAMETER(NotUsed); + n = nKey1xCmp!=binCollFunc || strcmp(p->zName,"BINARY")==0 ); + return p==0 || p->xCmp==binCollFunc; +} + +/* +** Another built-in collating sequence: NOCASE. +** +** This collating sequence is intended to be used for "case independent +** comparison". SQLite's knowledge of upper and lower case equivalents +** extends only to the 26 characters used in the English language. +** +** At the moment there is only a UTF-8 implementation. +*/ +static int nocaseCollatingFunc( + void *NotUsed, + int nKey1, const void *pKey1, + int nKey2, const void *pKey2 +){ + int r = sqlite3StrNICmp( + (const char *)pKey1, (const char *)pKey2, (nKey1lastRowid; +} + +/* +** Set the value returned by the sqlite3_last_insert_rowid() API function. +*/ +SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3 *db, sqlite3_int64 iRowid){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return; + } +#endif + sqlite3_mutex_enter(db->mutex); + db->lastRowid = iRowid; + sqlite3_mutex_leave(db->mutex); +} + +/* +** Return the number of changes in the most recent call to sqlite3_exec(). +*/ +SQLITE_API int sqlite3_changes(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->nChange; +} + +/* +** Return the number of changes since the database handle was opened. +*/ +SQLITE_API int sqlite3_total_changes(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->nTotalChange; +} + +/* +** Close all open savepoints. This function only manipulates fields of the +** database handle object, it does not close any savepoints that may be open +** at the b-tree/pager level. +*/ +SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *db){ + while( db->pSavepoint ){ + Savepoint *pTmp = db->pSavepoint; + db->pSavepoint = pTmp->pNext; + sqlite3DbFree(db, pTmp); + } + db->nSavepoint = 0; + db->nStatement = 0; + db->isTransactionSavepoint = 0; +} + +/* +** Invoke the destructor function associated with FuncDef p, if any. Except, +** if this is not the last copy of the function, do not invoke it. Multiple +** copies of a single function are created when create_function() is called +** with SQLITE_ANY as the encoding. +*/ +static void functionDestroy(sqlite3 *db, FuncDef *p){ + FuncDestructor *pDestructor = p->u.pDestructor; + if( pDestructor ){ + pDestructor->nRef--; + if( pDestructor->nRef==0 ){ + pDestructor->xDestroy(pDestructor->pUserData); + sqlite3DbFree(db, pDestructor); + } + } +} + +/* +** Disconnect all sqlite3_vtab objects that belong to database connection +** db. This is called when db is being closed. +*/ +static void disconnectAllVtab(sqlite3 *db){ +#ifndef SQLITE_OMIT_VIRTUALTABLE + int i; + HashElem *p; + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Schema *pSchema = db->aDb[i].pSchema; + if( pSchema ){ + for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){ + Table *pTab = (Table *)sqliteHashData(p); + if( IsVirtual(pTab) ) sqlite3VtabDisconnect(db, pTab); + } + } + } + for(p=sqliteHashFirst(&db->aModule); p; p=sqliteHashNext(p)){ + Module *pMod = (Module *)sqliteHashData(p); + if( pMod->pEpoTab ){ + sqlite3VtabDisconnect(db, pMod->pEpoTab); + } + } + sqlite3VtabUnlockList(db); + sqlite3BtreeLeaveAll(db); +#else + UNUSED_PARAMETER(db); +#endif +} + +/* +** Return TRUE if database connection db has unfinalized prepared +** statements or unfinished sqlite3_backup objects. +*/ +static int connectionIsBusy(sqlite3 *db){ + int j; + assert( sqlite3_mutex_held(db->mutex) ); + if( db->pVdbe ) return 1; + for(j=0; jnDb; j++){ + Btree *pBt = db->aDb[j].pBt; + if( pBt && sqlite3BtreeIsInBackup(pBt) ) return 1; + } + return 0; +} + +/* +** Close an existing SQLite database +*/ +static int sqlite3Close(sqlite3 *db, int forceZombie){ + if( !db ){ + /* EVIDENCE-OF: R-63257-11740 Calling sqlite3_close() or + ** sqlite3_close_v2() with a NULL pointer argument is a harmless no-op. */ + return SQLITE_OK; + } + if( !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + sqlite3_mutex_enter(db->mutex); + if( db->mTrace & SQLITE_TRACE_CLOSE ){ + db->xTrace(SQLITE_TRACE_CLOSE, db->pTraceArg, db, 0); + } + + /* Force xDisconnect calls on all virtual tables */ + disconnectAllVtab(db); + + /* If a transaction is open, the disconnectAllVtab() call above + ** will not have called the xDisconnect() method on any virtual + ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback() + ** call will do so. We need to do this before the check for active + ** SQL statements below, as the v-table implementation may be storing + ** some prepared statements internally. + */ + sqlite3VtabRollback(db); + + /* Legacy behavior (sqlite3_close() behavior) is to return + ** SQLITE_BUSY if the connection can not be closed immediately. + */ + if( !forceZombie && connectionIsBusy(db) ){ + sqlite3ErrorWithMsg(db, SQLITE_BUSY, "unable to close due to unfinalized " + "statements or unfinished backups"); + sqlite3_mutex_leave(db->mutex); + return SQLITE_BUSY; + } + +#ifdef SQLITE_ENABLE_SQLLOG + if( sqlite3GlobalConfig.xSqllog ){ + /* Closing the handle. Fourth parameter is passed the value 2. */ + sqlite3GlobalConfig.xSqllog(sqlite3GlobalConfig.pSqllogArg, db, 0, 2); + } +#endif + + /* Convert the connection into a zombie and then close it. + */ + db->magic = SQLITE_MAGIC_ZOMBIE; + sqlite3LeaveMutexAndCloseZombie(db); + return SQLITE_OK; +} + +/* +** Two variations on the public interface for closing a database +** connection. The sqlite3_close() version returns SQLITE_BUSY and +** leaves the connection option if there are unfinalized prepared +** statements or unfinished sqlite3_backups. The sqlite3_close_v2() +** version forces the connection to become a zombie if there are +** unclosed resources, and arranges for deallocation when the last +** prepare statement or sqlite3_backup closes. +*/ +SQLITE_API int sqlite3_close(sqlite3 *db){ return sqlite3Close(db,0); } +SQLITE_API int sqlite3_close_v2(sqlite3 *db){ return sqlite3Close(db,1); } + + +/* +** Close the mutex on database connection db. +** +** Furthermore, if database connection db is a zombie (meaning that there +** has been a prior call to sqlite3_close(db) or sqlite3_close_v2(db)) and +** every sqlite3_stmt has now been finalized and every sqlite3_backup has +** finished, then free all resources. +*/ +SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ + HashElem *i; /* Hash table iterator */ + int j; + + /* If there are outstanding sqlite3_stmt or sqlite3_backup objects + ** or if the connection has not yet been closed by sqlite3_close_v2(), + ** then just leave the mutex and return. + */ + if( db->magic!=SQLITE_MAGIC_ZOMBIE || connectionIsBusy(db) ){ + sqlite3_mutex_leave(db->mutex); + return; + } + + /* If we reach this point, it means that the database connection has + ** closed all sqlite3_stmt and sqlite3_backup objects and has been + ** passed to sqlite3_close (meaning that it is a zombie). Therefore, + ** go ahead and free all resources. + */ + + /* If a transaction is open, roll it back. This also ensures that if + ** any database schemas have been modified by an uncommitted transaction + ** they are reset. And that the required b-tree mutex is held to make + ** the pager rollback and schema reset an atomic operation. */ + sqlite3RollbackAll(db, SQLITE_OK); + + /* Free any outstanding Savepoint structures. */ + sqlite3CloseSavepoints(db); + + /* Close all database connections */ + for(j=0; jnDb; j++){ + struct Db *pDb = &db->aDb[j]; + if( pDb->pBt ){ + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + if( j!=1 ){ + pDb->pSchema = 0; + } + } + } + /* Clear the TEMP schema separately and last */ + if( db->aDb[1].pSchema ){ + sqlite3SchemaClear(db->aDb[1].pSchema); + } + sqlite3VtabUnlockList(db); + + /* Free up the array of auxiliary databases */ + sqlite3CollapseDatabaseArray(db); + assert( db->nDb<=2 ); + assert( db->aDb==db->aDbStatic ); + + /* Tell the code in notify.c that the connection no longer holds any + ** locks and does not require any further unlock-notify callbacks. + */ + sqlite3ConnectionClosed(db); + + for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){ + FuncDef *pNext, *p; + p = sqliteHashData(i); + do{ + functionDestroy(db, p); + pNext = p->pNext; + sqlite3DbFree(db, p); + p = pNext; + }while( p ); + } + sqlite3HashClear(&db->aFunc); + for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){ + CollSeq *pColl = (CollSeq *)sqliteHashData(i); + /* Invoke any destructors registered for collation sequence user data. */ + for(j=0; j<3; j++){ + if( pColl[j].xDel ){ + pColl[j].xDel(pColl[j].pUser); + } + } + sqlite3DbFree(db, pColl); + } + sqlite3HashClear(&db->aCollSeq); +#ifndef SQLITE_OMIT_VIRTUALTABLE + for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){ + Module *pMod = (Module *)sqliteHashData(i); + sqlite3VtabEponymousTableClear(db, pMod); + sqlite3VtabModuleUnref(db, pMod); + } + sqlite3HashClear(&db->aModule); +#endif + + sqlite3Error(db, SQLITE_OK); /* Deallocates any cached error strings. */ + sqlite3ValueFree(db->pErr); + sqlite3CloseExtensions(db); +#if SQLITE_USER_AUTHENTICATION + sqlite3_free(db->auth.zAuthUser); + sqlite3_free(db->auth.zAuthPW); +#endif + + db->magic = SQLITE_MAGIC_ERROR; + + /* The temp-database schema is allocated differently from the other schema + ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()). + ** So it needs to be freed here. Todo: Why not roll the temp schema into + ** the same sqliteMalloc() as the one that allocates the database + ** structure? + */ + sqlite3DbFree(db, db->aDb[1].pSchema); + sqlite3_mutex_leave(db->mutex); + db->magic = SQLITE_MAGIC_CLOSED; + sqlite3_mutex_free(db->mutex); + assert( sqlite3LookasideUsed(db,0)==0 ); + if( db->lookaside.bMalloced ){ + sqlite3_free(db->lookaside.pStart); + } + sqlite3_free(db); +} + +/* +** Rollback all database files. If tripCode is not SQLITE_OK, then +** any write cursors are invalidated ("tripped" - as in "tripping a circuit +** breaker") and made to return tripCode if there are any further +** attempts to use that cursor. Read cursors remain open and valid +** but are "saved" in case the table pages are moved around. +*/ +SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ + int i; + int inTrans = 0; + int schemaChange; + assert( sqlite3_mutex_held(db->mutex) ); + sqlite3BeginBenignMalloc(); + + /* Obtain all b-tree mutexes before making any calls to BtreeRollback(). + ** This is important in case the transaction being rolled back has + ** modified the database schema. If the b-tree mutexes are not taken + ** here, then another shared-cache connection might sneak in between + ** the database rollback and schema reset, which can cause false + ** corruption reports in some cases. */ + sqlite3BtreeEnterAll(db); + schemaChange = (db->mDbFlags & DBFLAG_SchemaChange)!=0 && db->init.busy==0; + + for(i=0; inDb; i++){ + Btree *p = db->aDb[i].pBt; + if( p ){ + if( sqlite3BtreeIsInTrans(p) ){ + inTrans = 1; + } + sqlite3BtreeRollback(p, tripCode, !schemaChange); + } + } + sqlite3VtabRollback(db); + sqlite3EndBenignMalloc(); + + if( schemaChange ){ + sqlite3ExpirePreparedStatements(db, 0); + sqlite3ResetAllSchemasOfConnection(db); + } + sqlite3BtreeLeaveAll(db); + + /* Any deferred constraint violations have now been resolved. */ + db->nDeferredCons = 0; + db->nDeferredImmCons = 0; + db->flags &= ~(u64)SQLITE_DeferFKs; + + /* If one has been configured, invoke the rollback-hook callback */ + if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ + db->xRollbackCallback(db->pRollbackArg); + } +} + +/* +** Return a static string containing the name corresponding to the error code +** specified in the argument. +*/ +#if defined(SQLITE_NEED_ERR_NAME) +SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ + const char *zName = 0; + int i, origRc = rc; + for(i=0; i<2 && zName==0; i++, rc &= 0xff){ + switch( rc ){ + case SQLITE_OK: zName = "SQLITE_OK"; break; + case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; + case SQLITE_ERROR_SNAPSHOT: zName = "SQLITE_ERROR_SNAPSHOT"; break; + case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break; + case SQLITE_PERM: zName = "SQLITE_PERM"; break; + case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; + case SQLITE_ABORT_ROLLBACK: zName = "SQLITE_ABORT_ROLLBACK"; break; + case SQLITE_BUSY: zName = "SQLITE_BUSY"; break; + case SQLITE_BUSY_RECOVERY: zName = "SQLITE_BUSY_RECOVERY"; break; + case SQLITE_BUSY_SNAPSHOT: zName = "SQLITE_BUSY_SNAPSHOT"; break; + case SQLITE_LOCKED: zName = "SQLITE_LOCKED"; break; + case SQLITE_LOCKED_SHAREDCACHE: zName = "SQLITE_LOCKED_SHAREDCACHE";break; + case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break; + case SQLITE_READONLY: zName = "SQLITE_READONLY"; break; + case SQLITE_READONLY_RECOVERY: zName = "SQLITE_READONLY_RECOVERY"; break; + case SQLITE_READONLY_CANTINIT: zName = "SQLITE_READONLY_CANTINIT"; break; + case SQLITE_READONLY_ROLLBACK: zName = "SQLITE_READONLY_ROLLBACK"; break; + case SQLITE_READONLY_DBMOVED: zName = "SQLITE_READONLY_DBMOVED"; break; + case SQLITE_READONLY_DIRECTORY: zName = "SQLITE_READONLY_DIRECTORY";break; + case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; + case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; + case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break; + case SQLITE_IOERR_SHORT_READ: zName = "SQLITE_IOERR_SHORT_READ"; break; + case SQLITE_IOERR_WRITE: zName = "SQLITE_IOERR_WRITE"; break; + case SQLITE_IOERR_FSYNC: zName = "SQLITE_IOERR_FSYNC"; break; + case SQLITE_IOERR_DIR_FSYNC: zName = "SQLITE_IOERR_DIR_FSYNC"; break; + case SQLITE_IOERR_TRUNCATE: zName = "SQLITE_IOERR_TRUNCATE"; break; + case SQLITE_IOERR_FSTAT: zName = "SQLITE_IOERR_FSTAT"; break; + case SQLITE_IOERR_UNLOCK: zName = "SQLITE_IOERR_UNLOCK"; break; + case SQLITE_IOERR_RDLOCK: zName = "SQLITE_IOERR_RDLOCK"; break; + case SQLITE_IOERR_DELETE: zName = "SQLITE_IOERR_DELETE"; break; + case SQLITE_IOERR_NOMEM: zName = "SQLITE_IOERR_NOMEM"; break; + case SQLITE_IOERR_ACCESS: zName = "SQLITE_IOERR_ACCESS"; break; + case SQLITE_IOERR_CHECKRESERVEDLOCK: + zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break; + case SQLITE_IOERR_LOCK: zName = "SQLITE_IOERR_LOCK"; break; + case SQLITE_IOERR_CLOSE: zName = "SQLITE_IOERR_CLOSE"; break; + case SQLITE_IOERR_DIR_CLOSE: zName = "SQLITE_IOERR_DIR_CLOSE"; break; + case SQLITE_IOERR_SHMOPEN: zName = "SQLITE_IOERR_SHMOPEN"; break; + case SQLITE_IOERR_SHMSIZE: zName = "SQLITE_IOERR_SHMSIZE"; break; + case SQLITE_IOERR_SHMLOCK: zName = "SQLITE_IOERR_SHMLOCK"; break; + case SQLITE_IOERR_SHMMAP: zName = "SQLITE_IOERR_SHMMAP"; break; + case SQLITE_IOERR_SEEK: zName = "SQLITE_IOERR_SEEK"; break; + case SQLITE_IOERR_DELETE_NOENT: zName = "SQLITE_IOERR_DELETE_NOENT";break; + case SQLITE_IOERR_MMAP: zName = "SQLITE_IOERR_MMAP"; break; + case SQLITE_IOERR_GETTEMPPATH: zName = "SQLITE_IOERR_GETTEMPPATH"; break; + case SQLITE_IOERR_CONVPATH: zName = "SQLITE_IOERR_CONVPATH"; break; + case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break; + case SQLITE_CORRUPT_VTAB: zName = "SQLITE_CORRUPT_VTAB"; break; + case SQLITE_NOTFOUND: zName = "SQLITE_NOTFOUND"; break; + case SQLITE_FULL: zName = "SQLITE_FULL"; break; + case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break; + case SQLITE_CANTOPEN_NOTEMPDIR: zName = "SQLITE_CANTOPEN_NOTEMPDIR";break; + case SQLITE_CANTOPEN_ISDIR: zName = "SQLITE_CANTOPEN_ISDIR"; break; + case SQLITE_CANTOPEN_FULLPATH: zName = "SQLITE_CANTOPEN_FULLPATH"; break; + case SQLITE_CANTOPEN_CONVPATH: zName = "SQLITE_CANTOPEN_CONVPATH"; break; + case SQLITE_CANTOPEN_SYMLINK: zName = "SQLITE_CANTOPEN_SYMLINK"; break; + case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break; + case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break; + case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break; + case SQLITE_TOOBIG: zName = "SQLITE_TOOBIG"; break; + case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break; + case SQLITE_CONSTRAINT_UNIQUE: zName = "SQLITE_CONSTRAINT_UNIQUE"; break; + case SQLITE_CONSTRAINT_TRIGGER: zName = "SQLITE_CONSTRAINT_TRIGGER";break; + case SQLITE_CONSTRAINT_FOREIGNKEY: + zName = "SQLITE_CONSTRAINT_FOREIGNKEY"; break; + case SQLITE_CONSTRAINT_CHECK: zName = "SQLITE_CONSTRAINT_CHECK"; break; + case SQLITE_CONSTRAINT_PRIMARYKEY: + zName = "SQLITE_CONSTRAINT_PRIMARYKEY"; break; + case SQLITE_CONSTRAINT_NOTNULL: zName = "SQLITE_CONSTRAINT_NOTNULL";break; + case SQLITE_CONSTRAINT_COMMITHOOK: + zName = "SQLITE_CONSTRAINT_COMMITHOOK"; break; + case SQLITE_CONSTRAINT_VTAB: zName = "SQLITE_CONSTRAINT_VTAB"; break; + case SQLITE_CONSTRAINT_FUNCTION: + zName = "SQLITE_CONSTRAINT_FUNCTION"; break; + case SQLITE_CONSTRAINT_ROWID: zName = "SQLITE_CONSTRAINT_ROWID"; break; + case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break; + case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break; + case SQLITE_NOLFS: zName = "SQLITE_NOLFS"; break; + case SQLITE_AUTH: zName = "SQLITE_AUTH"; break; + case SQLITE_FORMAT: zName = "SQLITE_FORMAT"; break; + case SQLITE_RANGE: zName = "SQLITE_RANGE"; break; + case SQLITE_NOTADB: zName = "SQLITE_NOTADB"; break; + case SQLITE_ROW: zName = "SQLITE_ROW"; break; + case SQLITE_NOTICE: zName = "SQLITE_NOTICE"; break; + case SQLITE_NOTICE_RECOVER_WAL: zName = "SQLITE_NOTICE_RECOVER_WAL";break; + case SQLITE_NOTICE_RECOVER_ROLLBACK: + zName = "SQLITE_NOTICE_RECOVER_ROLLBACK"; break; + case SQLITE_WARNING: zName = "SQLITE_WARNING"; break; + case SQLITE_WARNING_AUTOINDEX: zName = "SQLITE_WARNING_AUTOINDEX"; break; + case SQLITE_DONE: zName = "SQLITE_DONE"; break; + } + } + if( zName==0 ){ + static char zBuf[50]; + sqlite3_snprintf(sizeof(zBuf), zBuf, "SQLITE_UNKNOWN(%d)", origRc); + zName = zBuf; + } + return zName; +} +#endif + +/* +** Return a static string that describes the kind of error specified in the +** argument. +*/ +SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){ + static const char* const aMsg[] = { + /* SQLITE_OK */ "not an error", + /* SQLITE_ERROR */ "SQL logic error", + /* SQLITE_INTERNAL */ 0, + /* SQLITE_PERM */ "access permission denied", + /* SQLITE_ABORT */ "query aborted", + /* SQLITE_BUSY */ "database is locked", + /* SQLITE_LOCKED */ "database table is locked", + /* SQLITE_NOMEM */ "out of memory", + /* SQLITE_READONLY */ "attempt to write a readonly database", + /* SQLITE_INTERRUPT */ "interrupted", + /* SQLITE_IOERR */ "disk I/O error", + /* SQLITE_CORRUPT */ "database disk image is malformed", + /* SQLITE_NOTFOUND */ "unknown operation", + /* SQLITE_FULL */ "database or disk is full", + /* SQLITE_CANTOPEN */ "unable to open database file", + /* SQLITE_PROTOCOL */ "locking protocol", + /* SQLITE_EMPTY */ 0, + /* SQLITE_SCHEMA */ "database schema has changed", + /* SQLITE_TOOBIG */ "string or blob too big", + /* SQLITE_CONSTRAINT */ "constraint failed", + /* SQLITE_MISMATCH */ "datatype mismatch", + /* SQLITE_MISUSE */ "bad parameter or other API misuse", +#ifdef SQLITE_DISABLE_LFS + /* SQLITE_NOLFS */ "large file support is disabled", +#else + /* SQLITE_NOLFS */ 0, +#endif + /* SQLITE_AUTH */ "authorization denied", + /* SQLITE_FORMAT */ 0, + /* SQLITE_RANGE */ "column index out of range", + /* SQLITE_NOTADB */ "file is not a database", + /* SQLITE_NOTICE */ "notification message", + /* SQLITE_WARNING */ "warning message", + }; + const char *zErr = "unknown error"; + switch( rc ){ + case SQLITE_ABORT_ROLLBACK: { + zErr = "abort due to ROLLBACK"; + break; + } + case SQLITE_ROW: { + zErr = "another row available"; + break; + } + case SQLITE_DONE: { + zErr = "no more rows available"; + break; + } + default: { + rc &= 0xff; + if( ALWAYS(rc>=0) && rcbusyTimeout; + int delay, prior; + + assert( count>=0 ); + if( count < NDELAY ){ + delay = delays[count]; + prior = totals[count]; + }else{ + delay = delays[NDELAY-1]; + prior = totals[NDELAY-1] + delay*(count-(NDELAY-1)); + } + if( prior + delay > tmout ){ + delay = tmout - prior; + if( delay<=0 ) return 0; + } + sqlite3OsSleep(db->pVfs, delay*1000); + return 1; +#else + /* This case for unix systems that lack usleep() support. Sleeping + ** must be done in increments of whole seconds */ + sqlite3 *db = (sqlite3 *)ptr; + int tmout = ((sqlite3 *)ptr)->busyTimeout; + if( (count+1)*1000 > tmout ){ + return 0; + } + sqlite3OsSleep(db->pVfs, 1000000); + return 1; +#endif +} + +/* +** Invoke the given busy handler. +** +** This routine is called when an operation failed to acquire a +** lock on VFS file pFile. +** +** If this routine returns non-zero, the lock is retried. If it +** returns 0, the operation aborts with an SQLITE_BUSY error. +*/ +SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p){ + int rc; + if( p->xBusyHandler==0 || p->nBusy<0 ) return 0; + rc = p->xBusyHandler(p->pBusyArg, p->nBusy); + if( rc==0 ){ + p->nBusy = -1; + }else{ + p->nBusy++; + } + return rc; +} + +/* +** This routine sets the busy callback for an Sqlite database to the +** given callback function with the given argument. +*/ +SQLITE_API int sqlite3_busy_handler( + sqlite3 *db, + int (*xBusy)(void*,int), + void *pArg +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->busyHandler.xBusyHandler = xBusy; + db->busyHandler.pBusyArg = pArg; + db->busyHandler.nBusy = 0; + db->busyTimeout = 0; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK +/* +** This routine sets the progress callback for an Sqlite database to the +** given callback function with the given argument. The progress callback will +** be invoked every nOps opcodes. +*/ +SQLITE_API void sqlite3_progress_handler( + sqlite3 *db, + int nOps, + int (*xProgress)(void*), + void *pArg +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( nOps>0 ){ + db->xProgress = xProgress; + db->nProgressOps = (unsigned)nOps; + db->pProgressArg = pArg; + }else{ + db->xProgress = 0; + db->nProgressOps = 0; + db->pProgressArg = 0; + } + sqlite3_mutex_leave(db->mutex); +} +#endif + + +/* +** This routine installs a default busy handler that waits for the +** specified number of milliseconds before returning 0. +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + if( ms>0 ){ + sqlite3_busy_handler(db, (int(*)(void*,int))sqliteDefaultBusyCallback, + (void*)db); + db->busyTimeout = ms; + }else{ + sqlite3_busy_handler(db, 0, 0); + } + return SQLITE_OK; +} + +/* +** Cause any pending operation to stop at its earliest opportunity. +*/ +SQLITE_API void sqlite3_interrupt(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) && (db==0 || db->magic!=SQLITE_MAGIC_ZOMBIE) ){ + (void)SQLITE_MISUSE_BKPT; + return; + } +#endif + AtomicStore(&db->u1.isInterrupted, 1); +} + + +/* +** This function is exactly the same as sqlite3_create_function(), except +** that it is designed to be called by internal code. The difference is +** that if a malloc() fails in sqlite3_create_function(), an error code +** is returned and the mallocFailed flag cleared. +*/ +SQLITE_PRIVATE int sqlite3CreateFunc( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int enc, + void *pUserData, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInverse)(sqlite3_context*,int,sqlite3_value **), + FuncDestructor *pDestructor +){ + FuncDef *p; + int nName; + int extraFlags; + + assert( sqlite3_mutex_held(db->mutex) ); + assert( xValue==0 || xSFunc==0 ); + if( zFunctionName==0 /* Must have a valid name */ + || (xSFunc!=0 && xFinal!=0) /* Not both xSFunc and xFinal */ + || ((xFinal==0)!=(xStep==0)) /* Both or neither of xFinal and xStep */ + || ((xValue==0)!=(xInverse==0)) /* Both or neither of xValue, xInverse */ + || (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) + || (255<(nName = sqlite3Strlen30( zFunctionName))) + ){ + return SQLITE_MISUSE_BKPT; + } + + assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); + assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY ); + extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY| + SQLITE_SUBTYPE|SQLITE_INNOCUOUS); + enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); + + /* The SQLITE_INNOCUOUS flag is the same bit as SQLITE_FUNC_UNSAFE. But + ** the meaning is inverted. So flip the bit. */ + assert( SQLITE_FUNC_UNSAFE==SQLITE_INNOCUOUS ); + extraFlags ^= SQLITE_FUNC_UNSAFE; + + +#ifndef SQLITE_OMIT_UTF16 + /* If SQLITE_UTF16 is specified as the encoding type, transform this + ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the + ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. + ** + ** If SQLITE_ANY is specified, add three versions of the function + ** to the hash table. + */ + if( enc==SQLITE_UTF16 ){ + enc = SQLITE_UTF16NATIVE; + }else if( enc==SQLITE_ANY ){ + int rc; + rc = sqlite3CreateFunc(db, zFunctionName, nArg, + (SQLITE_UTF8|extraFlags)^SQLITE_FUNC_UNSAFE, + pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor); + if( rc==SQLITE_OK ){ + rc = sqlite3CreateFunc(db, zFunctionName, nArg, + (SQLITE_UTF16LE|extraFlags)^SQLITE_FUNC_UNSAFE, + pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor); + } + if( rc!=SQLITE_OK ){ + return rc; + } + enc = SQLITE_UTF16BE; + } +#else + enc = SQLITE_UTF8; +#endif + + /* Check if an existing function is being overridden or deleted. If so, + ** and there are active VMs, then return SQLITE_BUSY. If a function + ** is being overridden/deleted but there are no active VMs, allow the + ** operation to continue but invalidate all precompiled statements. + */ + p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 0); + if( p && (p->funcFlags & SQLITE_FUNC_ENCMASK)==(u32)enc && p->nArg==nArg ){ + if( db->nVdbeActive ){ + sqlite3ErrorWithMsg(db, SQLITE_BUSY, + "unable to delete/modify user-function due to active statements"); + assert( !db->mallocFailed ); + return SQLITE_BUSY; + }else{ + sqlite3ExpirePreparedStatements(db, 0); + } + } + + p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 1); + assert(p || db->mallocFailed); + if( !p ){ + return SQLITE_NOMEM_BKPT; + } + + /* If an older version of the function with a configured destructor is + ** being replaced invoke the destructor function here. */ + functionDestroy(db, p); + + if( pDestructor ){ + pDestructor->nRef++; + } + p->u.pDestructor = pDestructor; + p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags; + testcase( p->funcFlags & SQLITE_DETERMINISTIC ); + testcase( p->funcFlags & SQLITE_DIRECTONLY ); + p->xSFunc = xSFunc ? xSFunc : xStep; + p->xFinalize = xFinal; + p->xValue = xValue; + p->xInverse = xInverse; + p->pUserData = pUserData; + p->nArg = (u16)nArg; + return SQLITE_OK; +} + +/* +** Worker function used by utf-8 APIs that create new functions: +** +** sqlite3_create_function() +** sqlite3_create_function_v2() +** sqlite3_create_window_function() +*/ +static int createFunctionApi( + sqlite3 *db, + const char *zFunc, + int nArg, + int enc, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInverse)(sqlite3_context*,int,sqlite3_value**), + void(*xDestroy)(void*) +){ + int rc = SQLITE_ERROR; + FuncDestructor *pArg = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( xDestroy ){ + pArg = (FuncDestructor *)sqlite3Malloc(sizeof(FuncDestructor)); + if( !pArg ){ + sqlite3OomFault(db); + xDestroy(p); + goto out; + } + pArg->nRef = 0; + pArg->xDestroy = xDestroy; + pArg->pUserData = p; + } + rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, + xSFunc, xStep, xFinal, xValue, xInverse, pArg + ); + if( pArg && pArg->nRef==0 ){ + assert( rc!=SQLITE_OK ); + xDestroy(p); + sqlite3_free(pArg); + } + + out: + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Create new user functions. +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunc, + int nArg, + int enc, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*) +){ + return createFunctionApi(db, zFunc, nArg, enc, p, xSFunc, xStep, + xFinal, 0, 0, 0); +} +SQLITE_API int sqlite3_create_function_v2( + sqlite3 *db, + const char *zFunc, + int nArg, + int enc, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*), + void (*xDestroy)(void *) +){ + return createFunctionApi(db, zFunc, nArg, enc, p, xSFunc, xStep, + xFinal, 0, 0, xDestroy); +} +SQLITE_API int sqlite3_create_window_function( + sqlite3 *db, + const char *zFunc, + int nArg, + int enc, + void *p, + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInverse)(sqlite3_context*,int,sqlite3_value **), + void (*xDestroy)(void *) +){ + return createFunctionApi(db, zFunc, nArg, enc, p, 0, xStep, + xFinal, xValue, xInverse, xDestroy); +} + +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +){ + int rc; + char *zFunc8; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zFunctionName==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1, SQLITE_UTF16NATIVE); + rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xSFunc,xStep,xFinal,0,0,0); + sqlite3DbFree(db, zFunc8); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} +#endif + + +/* +** The following is the implementation of an SQL function that always +** fails with an error message stating that the function is used in the +** wrong context. The sqlite3_overload_function() API might construct +** SQL function that use this routine so that the functions will exist +** for name resolution but are actually overloaded by the xFindFunction +** method of virtual tables. +*/ +static void sqlite3InvalidFunction( + sqlite3_context *context, /* The function calling context */ + int NotUsed, /* Number of arguments to the function */ + sqlite3_value **NotUsed2 /* Value of each argument */ +){ + const char *zName = (const char*)sqlite3_user_data(context); + char *zErr; + UNUSED_PARAMETER2(NotUsed, NotUsed2); + zErr = sqlite3_mprintf( + "unable to use function %s in the requested context", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); +} + +/* +** Declare that a function has been overloaded by a virtual table. +** +** If the function already exists as a regular global function, then +** this routine is a no-op. If the function does not exist, then create +** a new one that always throws a run-time error. +** +** When virtual tables intend to provide an overloaded function, they +** should call this routine to make sure the global function exists. +** A global function must exist in order for name resolution to work +** properly. +*/ +SQLITE_API int sqlite3_overload_function( + sqlite3 *db, + const char *zName, + int nArg +){ + int rc; + char *zCopy; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 || nArg<-2 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + rc = sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)!=0; + sqlite3_mutex_leave(db->mutex); + if( rc ) return SQLITE_OK; + zCopy = sqlite3_mprintf(zName); + if( zCopy==0 ) return SQLITE_NOMEM; + return sqlite3_create_function_v2(db, zName, nArg, SQLITE_UTF8, + zCopy, sqlite3InvalidFunction, 0, 0, sqlite3_free); +} + +#ifndef SQLITE_OMIT_TRACE +/* +** Register a trace function. The pArg from the previously registered trace +** is returned. +** +** A NULL trace function means that no tracing is executes. A non-NULL +** trace is a pointer to a function that is invoked at the start of each +** SQL statement. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API void *sqlite3_trace(sqlite3 *db, void(*xTrace)(void*,const char*), void *pArg){ + void *pOld; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pOld = db->pTraceArg; + db->mTrace = xTrace ? SQLITE_TRACE_LEGACY : 0; + db->xTrace = (int(*)(u32,void*,void*,void*))xTrace; + db->pTraceArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pOld; +} +#endif /* SQLITE_OMIT_DEPRECATED */ + +/* Register a trace callback using the version-2 interface. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3 *db, /* Trace this connection */ + unsigned mTrace, /* Mask of events to be traced */ + int(*xTrace)(unsigned,void*,void*,void*), /* Callback to invoke */ + void *pArg /* Context */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( mTrace==0 ) xTrace = 0; + if( xTrace==0 ) mTrace = 0; + db->mTrace = mTrace; + db->xTrace = xTrace; + db->pTraceArg = pArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Register a profile function. The pArg from the previously registered +** profile function is returned. +** +** A NULL profile function means that no profiling is executes. A non-NULL +** profile is a pointer to a function that is invoked at the conclusion of +** each SQL statement that is run. +*/ +SQLITE_API void *sqlite3_profile( + sqlite3 *db, + void (*xProfile)(void*,const char*,sqlite_uint64), + void *pArg +){ + void *pOld; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pOld = db->pProfileArg; + db->xProfile = xProfile; + db->pProfileArg = pArg; + db->mTrace &= SQLITE_TRACE_NONLEGACY_MASK; + if( db->xProfile ) db->mTrace |= SQLITE_TRACE_XPROFILE; + sqlite3_mutex_leave(db->mutex); + return pOld; +} +#endif /* SQLITE_OMIT_DEPRECATED */ +#endif /* SQLITE_OMIT_TRACE */ + +/* +** Register a function to be invoked when a transaction commits. +** If the invoked function returns non-zero, then the commit becomes a +** rollback. +*/ +SQLITE_API void *sqlite3_commit_hook( + sqlite3 *db, /* Attach the hook to this database */ + int (*xCallback)(void*), /* Function to invoke on each commit */ + void *pArg /* Argument to the function */ +){ + void *pOld; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pOld = db->pCommitArg; + db->xCommitCallback = xCallback; + db->pCommitArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pOld; +} + +/* +** Register a callback to be invoked each time a row is updated, +** inserted or deleted using this database connection. +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3 *db, /* Attach the hook to this database */ + void (*xCallback)(void*,int,char const *,char const *,sqlite_int64), + void *pArg /* Argument to the function */ +){ + void *pRet; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pRet = db->pUpdateArg; + db->xUpdateCallback = xCallback; + db->pUpdateArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} + +/* +** Register a callback to be invoked each time a transaction is rolled +** back by this database connection. +*/ +SQLITE_API void *sqlite3_rollback_hook( + sqlite3 *db, /* Attach the hook to this database */ + void (*xCallback)(void*), /* Callback function */ + void *pArg /* Argument to the function */ +){ + void *pRet; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pRet = db->pRollbackArg; + db->xRollbackCallback = xCallback; + db->pRollbackArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Register a callback to be invoked each time a row is updated, +** inserted or deleted using this database connection. +*/ +SQLITE_API void *sqlite3_preupdate_hook( + sqlite3 *db, /* Attach the hook to this database */ + void(*xCallback)( /* Callback function */ + void*,sqlite3*,int,char const*,char const*,sqlite3_int64,sqlite3_int64), + void *pArg /* First callback argument */ +){ + void *pRet; + sqlite3_mutex_enter(db->mutex); + pRet = db->pPreUpdateArg; + db->xPreUpdateCallback = xCallback; + db->pPreUpdateArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifndef SQLITE_OMIT_WAL +/* +** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint(). +** Invoke sqlite3_wal_checkpoint if the number of frames in the log file +** is greater than sqlite3.pWalArg cast to an integer (the value configured by +** wal_autocheckpoint()). +*/ +SQLITE_PRIVATE int sqlite3WalDefaultHook( + void *pClientData, /* Argument */ + sqlite3 *db, /* Connection */ + const char *zDb, /* Database */ + int nFrame /* Size of WAL */ +){ + if( nFrame>=SQLITE_PTR_TO_INT(pClientData) ){ + sqlite3BeginBenignMalloc(); + sqlite3_wal_checkpoint(db, zDb); + sqlite3EndBenignMalloc(); + } + return SQLITE_OK; +} +#endif /* SQLITE_OMIT_WAL */ + +/* +** Configure an sqlite3_wal_hook() callback to automatically checkpoint +** a database after committing a transaction if there are nFrame or +** more frames in the log file. Passing zero or a negative value as the +** nFrame parameter disables automatic checkpoints entirely. +** +** The callback registered by this function replaces any existing callback +** registered using sqlite3_wal_hook(). Likewise, registering a callback +** using sqlite3_wal_hook() disables the automatic checkpoint mechanism +** configured by this function. +*/ +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int nFrame){ +#ifdef SQLITE_OMIT_WAL + UNUSED_PARAMETER(db); + UNUSED_PARAMETER(nFrame); +#else +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + if( nFrame>0 ){ + sqlite3_wal_hook(db, sqlite3WalDefaultHook, SQLITE_INT_TO_PTR(nFrame)); + }else{ + sqlite3_wal_hook(db, 0, 0); + } +#endif + return SQLITE_OK; +} + +/* +** Register a callback to be invoked each time a transaction is written +** into the write-ahead-log by this database connection. +*/ +SQLITE_API void *sqlite3_wal_hook( + sqlite3 *db, /* Attach the hook to this db handle */ + int(*xCallback)(void *, sqlite3*, const char*, int), + void *pArg /* First argument passed to xCallback() */ +){ +#ifndef SQLITE_OMIT_WAL + void *pRet; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pRet = db->pWalArg; + db->xWalCallback = xCallback; + db->pWalArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +#else + return 0; +#endif +} + +/* +** Checkpoint database zDb. +*/ +SQLITE_API int sqlite3_wal_checkpoint_v2( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of attached database (or NULL) */ + int eMode, /* SQLITE_CHECKPOINT_* value */ + int *pnLog, /* OUT: Size of WAL log in frames */ + int *pnCkpt /* OUT: Total number of frames checkpointed */ +){ +#ifdef SQLITE_OMIT_WAL + return SQLITE_OK; +#else + int rc; /* Return code */ + int iDb = SQLITE_MAX_ATTACHED; /* sqlite3.aDb[] index of db to checkpoint */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + + /* Initialize the output variables to -1 in case an error occurs. */ + if( pnLog ) *pnLog = -1; + if( pnCkpt ) *pnCkpt = -1; + + assert( SQLITE_CHECKPOINT_PASSIVE==0 ); + assert( SQLITE_CHECKPOINT_FULL==1 ); + assert( SQLITE_CHECKPOINT_RESTART==2 ); + assert( SQLITE_CHECKPOINT_TRUNCATE==3 ); + if( eModeSQLITE_CHECKPOINT_TRUNCATE ){ + /* EVIDENCE-OF: R-03996-12088 The M parameter must be a valid checkpoint + ** mode: */ + return SQLITE_MISUSE; + } + + sqlite3_mutex_enter(db->mutex); + if( zDb && zDb[0] ){ + iDb = sqlite3FindDbName(db, zDb); + } + if( iDb<0 ){ + rc = SQLITE_ERROR; + sqlite3ErrorWithMsg(db, SQLITE_ERROR, "unknown database: %s", zDb); + }else{ + db->busyHandler.nBusy = 0; + rc = sqlite3Checkpoint(db, iDb, eMode, pnLog, pnCkpt); + sqlite3Error(db, rc); + } + rc = sqlite3ApiExit(db, rc); + + /* If there are no active statements, clear the interrupt flag at this + ** point. */ + if( db->nVdbeActive==0 ){ + AtomicStore(&db->u1.isInterrupted, 0); + } + + sqlite3_mutex_leave(db->mutex); + return rc; +#endif +} + + +/* +** Checkpoint database zDb. If zDb is NULL, or if the buffer zDb points +** to contains a zero-length string, all attached databases are +** checkpointed. +*/ +SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){ + /* EVIDENCE-OF: R-41613-20553 The sqlite3_wal_checkpoint(D,X) is equivalent to + ** sqlite3_wal_checkpoint_v2(D,X,SQLITE_CHECKPOINT_PASSIVE,0,0). */ + return sqlite3_wal_checkpoint_v2(db,zDb,SQLITE_CHECKPOINT_PASSIVE,0,0); +} + +#ifndef SQLITE_OMIT_WAL +/* +** Run a checkpoint on database iDb. This is a no-op if database iDb is +** not currently open in WAL mode. +** +** If a transaction is open on the database being checkpointed, this +** function returns SQLITE_LOCKED and a checkpoint is not attempted. If +** an error occurs while running the checkpoint, an SQLite error code is +** returned (i.e. SQLITE_IOERR). Otherwise, SQLITE_OK. +** +** The mutex on database handle db should be held by the caller. The mutex +** associated with the specific b-tree being checkpointed is taken by +** this function while the checkpoint is running. +** +** If iDb is passed SQLITE_MAX_ATTACHED, then all attached databases are +** checkpointed. If an error is encountered it is returned immediately - +** no attempt is made to checkpoint any remaining databases. +** +** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL, RESTART +** or TRUNCATE. +*/ +SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3 *db, int iDb, int eMode, int *pnLog, int *pnCkpt){ + int rc = SQLITE_OK; /* Return code */ + int i; /* Used to iterate through attached dbs */ + int bBusy = 0; /* True if SQLITE_BUSY has been encountered */ + + assert( sqlite3_mutex_held(db->mutex) ); + assert( !pnLog || *pnLog==-1 ); + assert( !pnCkpt || *pnCkpt==-1 ); + + for(i=0; inDb && rc==SQLITE_OK; i++){ + if( i==iDb || iDb==SQLITE_MAX_ATTACHED ){ + rc = sqlite3BtreeCheckpoint(db->aDb[i].pBt, eMode, pnLog, pnCkpt); + pnLog = 0; + pnCkpt = 0; + if( rc==SQLITE_BUSY ){ + bBusy = 1; + rc = SQLITE_OK; + } + } + } + + return (rc==SQLITE_OK && bBusy) ? SQLITE_BUSY : rc; +} +#endif /* SQLITE_OMIT_WAL */ + +/* +** This function returns true if main-memory should be used instead of +** a temporary file for transient pager files and statement journals. +** The value returned depends on the value of db->temp_store (runtime +** parameter) and the compile time value of SQLITE_TEMP_STORE. The +** following table describes the relationship between these two values +** and this functions return value. +** +** SQLITE_TEMP_STORE db->temp_store Location of temporary database +** ----------------- -------------- ------------------------------ +** 0 any file (return 0) +** 1 1 file (return 0) +** 1 2 memory (return 1) +** 1 0 file (return 0) +** 2 1 file (return 0) +** 2 2 memory (return 1) +** 2 0 memory (return 1) +** 3 any memory (return 1) +*/ +SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3 *db){ +#if SQLITE_TEMP_STORE==1 + return ( db->temp_store==2 ); +#endif +#if SQLITE_TEMP_STORE==2 + return ( db->temp_store!=1 ); +#endif +#if SQLITE_TEMP_STORE==3 + UNUSED_PARAMETER(db); + return 1; +#endif +#if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3 + UNUSED_PARAMETER(db); + return 0; +#endif +} + +/* +** Return UTF-8 encoded English language explanation of the most recent +** error. +*/ +SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){ + const char *z; + if( !db ){ + return sqlite3ErrStr(SQLITE_NOMEM_BKPT); + } + if( !sqlite3SafetyCheckSickOrOk(db) ){ + return sqlite3ErrStr(SQLITE_MISUSE_BKPT); + } + sqlite3_mutex_enter(db->mutex); + if( db->mallocFailed ){ + z = sqlite3ErrStr(SQLITE_NOMEM_BKPT); + }else{ + testcase( db->pErr==0 ); + z = db->errCode ? (char*)sqlite3_value_text(db->pErr) : 0; + assert( !db->mallocFailed ); + if( z==0 ){ + z = sqlite3ErrStr(db->errCode); + } + } + sqlite3_mutex_leave(db->mutex); + return z; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Return UTF-16 encoded English language explanation of the most recent +** error. +*/ +SQLITE_API const void *sqlite3_errmsg16(sqlite3 *db){ + static const u16 outOfMem[] = { + 'o', 'u', 't', ' ', 'o', 'f', ' ', 'm', 'e', 'm', 'o', 'r', 'y', 0 + }; + static const u16 misuse[] = { + 'b', 'a', 'd', ' ', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', ' ', + 'o', 'r', ' ', 'o', 't', 'h', 'e', 'r', ' ', 'A', 'P', 'I', ' ', + 'm', 'i', 's', 'u', 's', 'e', 0 + }; + + const void *z; + if( !db ){ + return (void *)outOfMem; + } + if( !sqlite3SafetyCheckSickOrOk(db) ){ + return (void *)misuse; + } + sqlite3_mutex_enter(db->mutex); + if( db->mallocFailed ){ + z = (void *)outOfMem; + }else{ + z = sqlite3_value_text16(db->pErr); + if( z==0 ){ + sqlite3ErrorWithMsg(db, db->errCode, sqlite3ErrStr(db->errCode)); + z = sqlite3_value_text16(db->pErr); + } + /* A malloc() may have failed within the call to sqlite3_value_text16() + ** above. If this is the case, then the db->mallocFailed flag needs to + ** be cleared before returning. Do this directly, instead of via + ** sqlite3ApiExit(), to avoid setting the database handle error message. + */ + sqlite3OomClear(db); + } + sqlite3_mutex_leave(db->mutex); + return z; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Return the most recent error code generated by an SQLite routine. If NULL is +** passed to this function, we assume a malloc() failed during sqlite3_open(). +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db){ + if( db && !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + if( !db || db->mallocFailed ){ + return SQLITE_NOMEM_BKPT; + } + return db->errCode & db->errMask; +} +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db){ + if( db && !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + if( !db || db->mallocFailed ){ + return SQLITE_NOMEM_BKPT; + } + return db->errCode; +} +SQLITE_API int sqlite3_system_errno(sqlite3 *db){ + return db ? db->iSysErrno : 0; +} + +/* +** Return a string that describes the kind of error specified in the +** argument. For now, this simply calls the internal sqlite3ErrStr() +** function. +*/ +SQLITE_API const char *sqlite3_errstr(int rc){ + return sqlite3ErrStr(rc); +} + +/* +** Create a new collating function for database "db". The name is zName +** and the encoding is enc. +*/ +static int createCollation( + sqlite3* db, + const char *zName, + u8 enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDel)(void*) +){ + CollSeq *pColl; + int enc2; + + assert( sqlite3_mutex_held(db->mutex) ); + + /* If SQLITE_UTF16 is specified as the encoding type, transform this + ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the + ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. + */ + enc2 = enc; + testcase( enc2==SQLITE_UTF16 ); + testcase( enc2==SQLITE_UTF16_ALIGNED ); + if( enc2==SQLITE_UTF16 || enc2==SQLITE_UTF16_ALIGNED ){ + enc2 = SQLITE_UTF16NATIVE; + } + if( enc2SQLITE_UTF16BE ){ + return SQLITE_MISUSE_BKPT; + } + + /* Check if this call is removing or replacing an existing collation + ** sequence. If so, and there are active VMs, return busy. If there + ** are no active VMs, invalidate any pre-compiled statements. + */ + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 0); + if( pColl && pColl->xCmp ){ + if( db->nVdbeActive ){ + sqlite3ErrorWithMsg(db, SQLITE_BUSY, + "unable to delete/modify collation sequence due to active statements"); + return SQLITE_BUSY; + } + sqlite3ExpirePreparedStatements(db, 0); + + /* If collation sequence pColl was created directly by a call to + ** sqlite3_create_collation, and not generated by synthCollSeq(), + ** then any copies made by synthCollSeq() need to be invalidated. + ** Also, collation destructor - CollSeq.xDel() - function may need + ** to be called. + */ + if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){ + CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName); + int j; + for(j=0; j<3; j++){ + CollSeq *p = &aColl[j]; + if( p->enc==pColl->enc ){ + if( p->xDel ){ + p->xDel(p->pUser); + } + p->xCmp = 0; + } + } + } + } + + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 1); + if( pColl==0 ) return SQLITE_NOMEM_BKPT; + pColl->xCmp = xCompare; + pColl->pUser = pCtx; + pColl->xDel = xDel; + pColl->enc = (u8)(enc2 | (enc & SQLITE_UTF16_ALIGNED)); + sqlite3Error(db, SQLITE_OK); + return SQLITE_OK; +} + + +/* +** This array defines hard upper bounds on limit values. The +** initializer must be kept in sync with the SQLITE_LIMIT_* +** #defines in sqlite3.h. +*/ +static const int aHardLimit[] = { + SQLITE_MAX_LENGTH, + SQLITE_MAX_SQL_LENGTH, + SQLITE_MAX_COLUMN, + SQLITE_MAX_EXPR_DEPTH, + SQLITE_MAX_COMPOUND_SELECT, + SQLITE_MAX_VDBE_OP, + SQLITE_MAX_FUNCTION_ARG, + SQLITE_MAX_ATTACHED, + SQLITE_MAX_LIKE_PATTERN_LENGTH, + SQLITE_MAX_VARIABLE_NUMBER, /* IMP: R-38091-32352 */ + SQLITE_MAX_TRIGGER_DEPTH, + SQLITE_MAX_WORKER_THREADS, +}; + +/* +** Make sure the hard limits are set to reasonable values +*/ +#if SQLITE_MAX_LENGTH<100 +# error SQLITE_MAX_LENGTH must be at least 100 +#endif +#if SQLITE_MAX_SQL_LENGTH<100 +# error SQLITE_MAX_SQL_LENGTH must be at least 100 +#endif +#if SQLITE_MAX_SQL_LENGTH>SQLITE_MAX_LENGTH +# error SQLITE_MAX_SQL_LENGTH must not be greater than SQLITE_MAX_LENGTH +#endif +#if SQLITE_MAX_COMPOUND_SELECT<2 +# error SQLITE_MAX_COMPOUND_SELECT must be at least 2 +#endif +#if SQLITE_MAX_VDBE_OP<40 +# error SQLITE_MAX_VDBE_OP must be at least 40 +#endif +#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>127 +# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 127 +#endif +#if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>125 +# error SQLITE_MAX_ATTACHED must be between 0 and 125 +#endif +#if SQLITE_MAX_LIKE_PATTERN_LENGTH<1 +# error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1 +#endif +#if SQLITE_MAX_COLUMN>32767 +# error SQLITE_MAX_COLUMN must not exceed 32767 +#endif +#if SQLITE_MAX_TRIGGER_DEPTH<1 +# error SQLITE_MAX_TRIGGER_DEPTH must be at least 1 +#endif +#if SQLITE_MAX_WORKER_THREADS<0 || SQLITE_MAX_WORKER_THREADS>50 +# error SQLITE_MAX_WORKER_THREADS must be between 0 and 50 +#endif + + +/* +** Change the value of a limit. Report the old value. +** If an invalid limit index is supplied, report -1. +** Make no changes but still report the old value if the +** new limit is negative. +** +** A new lower limit does not shrink existing constructs. +** It merely prevents new constructs that exceed the limit +** from forming. +*/ +SQLITE_API int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){ + int oldLimit; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return -1; + } +#endif + + /* EVIDENCE-OF: R-30189-54097 For each limit category SQLITE_LIMIT_NAME + ** there is a hard upper bound set at compile-time by a C preprocessor + ** macro called SQLITE_MAX_NAME. (The "_LIMIT_" in the name is changed to + ** "_MAX_".) + */ + assert( aHardLimit[SQLITE_LIMIT_LENGTH]==SQLITE_MAX_LENGTH ); + assert( aHardLimit[SQLITE_LIMIT_SQL_LENGTH]==SQLITE_MAX_SQL_LENGTH ); + assert( aHardLimit[SQLITE_LIMIT_COLUMN]==SQLITE_MAX_COLUMN ); + assert( aHardLimit[SQLITE_LIMIT_EXPR_DEPTH]==SQLITE_MAX_EXPR_DEPTH ); + assert( aHardLimit[SQLITE_LIMIT_COMPOUND_SELECT]==SQLITE_MAX_COMPOUND_SELECT); + assert( aHardLimit[SQLITE_LIMIT_VDBE_OP]==SQLITE_MAX_VDBE_OP ); + assert( aHardLimit[SQLITE_LIMIT_FUNCTION_ARG]==SQLITE_MAX_FUNCTION_ARG ); + assert( aHardLimit[SQLITE_LIMIT_ATTACHED]==SQLITE_MAX_ATTACHED ); + assert( aHardLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]== + SQLITE_MAX_LIKE_PATTERN_LENGTH ); + assert( aHardLimit[SQLITE_LIMIT_VARIABLE_NUMBER]==SQLITE_MAX_VARIABLE_NUMBER); + assert( aHardLimit[SQLITE_LIMIT_TRIGGER_DEPTH]==SQLITE_MAX_TRIGGER_DEPTH ); + assert( aHardLimit[SQLITE_LIMIT_WORKER_THREADS]==SQLITE_MAX_WORKER_THREADS ); + assert( SQLITE_LIMIT_WORKER_THREADS==(SQLITE_N_LIMIT-1) ); + + + if( limitId<0 || limitId>=SQLITE_N_LIMIT ){ + return -1; + } + oldLimit = db->aLimit[limitId]; + if( newLimit>=0 ){ /* IMP: R-52476-28732 */ + if( newLimit>aHardLimit[limitId] ){ + newLimit = aHardLimit[limitId]; /* IMP: R-51463-25634 */ + } + db->aLimit[limitId] = newLimit; + } + return oldLimit; /* IMP: R-53341-35419 */ +} + +/* +** This function is used to parse both URIs and non-URI filenames passed by the +** user to API functions sqlite3_open() or sqlite3_open_v2(), and for database +** URIs specified as part of ATTACH statements. +** +** The first argument to this function is the name of the VFS to use (or +** a NULL to signify the default VFS) if the URI does not contain a "vfs=xxx" +** query parameter. The second argument contains the URI (or non-URI filename) +** itself. When this function is called the *pFlags variable should contain +** the default flags to open the database handle with. The value stored in +** *pFlags may be updated before returning if the URI filename contains +** "cache=xxx" or "mode=xxx" query parameters. +** +** If successful, SQLITE_OK is returned. In this case *ppVfs is set to point to +** the VFS that should be used to open the database file. *pzFile is set to +** point to a buffer containing the name of the file to open. The value +** stored in *pzFile is a database name acceptable to sqlite3_uri_parameter() +** and is in the same format as names created using sqlite3_create_filename(). +** The caller must invoke sqlite3_free_filename() (not sqlite3_free()!) on +** the value returned in *pzFile to avoid a memory leak. +** +** If an error occurs, then an SQLite error code is returned and *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to eventually release +** this buffer by calling sqlite3_free(). +*/ +SQLITE_PRIVATE int sqlite3ParseUri( + const char *zDefaultVfs, /* VFS to use if no "vfs=xxx" query option */ + const char *zUri, /* Nul-terminated URI to parse */ + unsigned int *pFlags, /* IN/OUT: SQLITE_OPEN_XXX flags */ + sqlite3_vfs **ppVfs, /* OUT: VFS to use */ + char **pzFile, /* OUT: Filename component of URI */ + char **pzErrMsg /* OUT: Error message (if rc!=SQLITE_OK) */ +){ + int rc = SQLITE_OK; + unsigned int flags = *pFlags; + const char *zVfs = zDefaultVfs; + char *zFile; + char c; + int nUri = sqlite3Strlen30(zUri); + + assert( *pzErrMsg==0 ); + + if( ((flags & SQLITE_OPEN_URI) /* IMP: R-48725-32206 */ + || sqlite3GlobalConfig.bOpenUri) /* IMP: R-51689-46548 */ + && nUri>=5 && memcmp(zUri, "file:", 5)==0 /* IMP: R-57884-37496 */ + ){ + char *zOpt; + int eState; /* Parser state when parsing URI */ + int iIn; /* Input character index */ + int iOut = 0; /* Output character index */ + u64 nByte = nUri+8; /* Bytes of space to allocate */ + + /* Make sure the SQLITE_OPEN_URI flag is set to indicate to the VFS xOpen + ** method that there may be extra parameters following the file-name. */ + flags |= SQLITE_OPEN_URI; + + for(iIn=0; iIn=0 && octet<256 ); + if( octet==0 ){ +#ifndef SQLITE_ENABLE_URI_00_ERROR + /* This branch is taken when "%00" appears within the URI. In this + ** case we ignore all text in the remainder of the path, name or + ** value currently being parsed. So ignore the current character + ** and skip to the next "?", "=" or "&", as appropriate. */ + while( (c = zUri[iIn])!=0 && c!='#' + && (eState!=0 || c!='?') + && (eState!=1 || (c!='=' && c!='&')) + && (eState!=2 || c!='&') + ){ + iIn++; + } + continue; +#else + /* If ENABLE_URI_00_ERROR is defined, "%00" in a URI is an error. */ + *pzErrMsg = sqlite3_mprintf("unexpected %%00 in uri"); + rc = SQLITE_ERROR; + goto parse_uri_out; +#endif + } + c = octet; + }else if( eState==1 && (c=='&' || c=='=') ){ + if( zFile[iOut-1]==0 ){ + /* An empty option name. Ignore this option altogether. */ + while( zUri[iIn] && zUri[iIn]!='#' && zUri[iIn-1]!='&' ) iIn++; + continue; + } + if( c=='&' ){ + zFile[iOut++] = '\0'; + }else{ + eState = 2; + } + c = 0; + }else if( (eState==0 && c=='?') || (eState==2 && c=='&') ){ + c = 0; + eState = 1; + } + zFile[iOut++] = c; + } + if( eState==1 ) zFile[iOut++] = '\0'; + memset(zFile+iOut, 0, 4); /* end-of-options + empty journal filenames */ + + /* Check if there were any options specified that should be interpreted + ** here. Options that are interpreted here include "vfs" and those that + ** correspond to flags that may be passed to the sqlite3_open_v2() + ** method. */ + zOpt = &zFile[sqlite3Strlen30(zFile)+1]; + while( zOpt[0] ){ + int nOpt = sqlite3Strlen30(zOpt); + char *zVal = &zOpt[nOpt+1]; + int nVal = sqlite3Strlen30(zVal); + + if( nOpt==3 && memcmp("vfs", zOpt, 3)==0 ){ + zVfs = zVal; + }else{ + struct OpenMode { + const char *z; + int mode; + } *aMode = 0; + char *zModeType = 0; + int mask = 0; + int limit = 0; + + if( nOpt==5 && memcmp("cache", zOpt, 5)==0 ){ + static struct OpenMode aCacheMode[] = { + { "shared", SQLITE_OPEN_SHAREDCACHE }, + { "private", SQLITE_OPEN_PRIVATECACHE }, + { 0, 0 } + }; + + mask = SQLITE_OPEN_SHAREDCACHE|SQLITE_OPEN_PRIVATECACHE; + aMode = aCacheMode; + limit = mask; + zModeType = "cache"; + } + if( nOpt==4 && memcmp("mode", zOpt, 4)==0 ){ + static struct OpenMode aOpenMode[] = { + { "ro", SQLITE_OPEN_READONLY }, + { "rw", SQLITE_OPEN_READWRITE }, + { "rwc", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE }, + { "memory", SQLITE_OPEN_MEMORY }, + { 0, 0 } + }; + + mask = SQLITE_OPEN_READONLY | SQLITE_OPEN_READWRITE + | SQLITE_OPEN_CREATE | SQLITE_OPEN_MEMORY; + aMode = aOpenMode; + limit = mask & flags; + zModeType = "access"; + } + + if( aMode ){ + int i; + int mode = 0; + for(i=0; aMode[i].z; i++){ + const char *z = aMode[i].z; + if( nVal==sqlite3Strlen30(z) && 0==memcmp(zVal, z, nVal) ){ + mode = aMode[i].mode; + break; + } + } + if( mode==0 ){ + *pzErrMsg = sqlite3_mprintf("no such %s mode: %s", zModeType, zVal); + rc = SQLITE_ERROR; + goto parse_uri_out; + } + if( (mode & ~SQLITE_OPEN_MEMORY)>limit ){ + *pzErrMsg = sqlite3_mprintf("%s mode not allowed: %s", + zModeType, zVal); + rc = SQLITE_PERM; + goto parse_uri_out; + } + flags = (flags & ~mask) | mode; + } + } + + zOpt = &zVal[nVal+1]; + } + + }else{ + zFile = sqlite3_malloc64(nUri+8); + if( !zFile ) return SQLITE_NOMEM_BKPT; + memset(zFile, 0, 4); + zFile += 4; + if( nUri ){ + memcpy(zFile, zUri, nUri); + } + memset(zFile+nUri, 0, 4); + flags &= ~SQLITE_OPEN_URI; + } + + *ppVfs = sqlite3_vfs_find(zVfs); + if( *ppVfs==0 ){ + *pzErrMsg = sqlite3_mprintf("no such vfs: %s", zVfs); + rc = SQLITE_ERROR; + } + parse_uri_out: + if( rc!=SQLITE_OK ){ + sqlite3_free_filename(zFile); + zFile = 0; + } + *pFlags = flags; + *pzFile = zFile; + return rc; +} + +/* +** This routine does the core work of extracting URI parameters from a +** database filename for the sqlite3_uri_parameter() interface. +*/ +static const char *uriParameter(const char *zFilename, const char *zParam){ + zFilename += sqlite3Strlen30(zFilename) + 1; + while( zFilename[0] ){ + int x = strcmp(zFilename, zParam); + zFilename += sqlite3Strlen30(zFilename) + 1; + if( x==0 ) return zFilename; + zFilename += sqlite3Strlen30(zFilename) + 1; + } + return 0; +} + + + +/* +** This routine does the work of opening a database on behalf of +** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" +** is UTF-8 encoded. +*/ +static int openDatabase( + const char *zFilename, /* Database filename UTF-8 encoded */ + sqlite3 **ppDb, /* OUT: Returned database handle */ + unsigned int flags, /* Operational flags */ + const char *zVfs /* Name of the VFS to use */ +){ + sqlite3 *db; /* Store allocated handle here */ + int rc; /* Return code */ + int isThreadsafe; /* True for threadsafe connections */ + char *zOpen = 0; /* Filename argument to pass to BtreeOpen() */ + char *zErrMsg = 0; /* Error message from sqlite3ParseUri() */ + int i; /* Loop counter */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppDb==0 ) return SQLITE_MISUSE_BKPT; +#endif + *ppDb = 0; +#ifndef SQLITE_OMIT_AUTOINIT + rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + + if( sqlite3GlobalConfig.bCoreMutex==0 ){ + isThreadsafe = 0; + }else if( flags & SQLITE_OPEN_NOMUTEX ){ + isThreadsafe = 0; + }else if( flags & SQLITE_OPEN_FULLMUTEX ){ + isThreadsafe = 1; + }else{ + isThreadsafe = sqlite3GlobalConfig.bFullMutex; + } + + if( flags & SQLITE_OPEN_PRIVATECACHE ){ + flags &= ~SQLITE_OPEN_SHAREDCACHE; + }else if( sqlite3GlobalConfig.sharedCacheEnabled ){ + flags |= SQLITE_OPEN_SHAREDCACHE; + } + + /* Remove harmful bits from the flags parameter + ** + ** The SQLITE_OPEN_NOMUTEX and SQLITE_OPEN_FULLMUTEX flags were + ** dealt with in the previous code block. Besides these, the only + ** valid input flags for sqlite3_open_v2() are SQLITE_OPEN_READONLY, + ** SQLITE_OPEN_READWRITE, SQLITE_OPEN_CREATE, SQLITE_OPEN_SHAREDCACHE, + ** SQLITE_OPEN_PRIVATECACHE, and some reserved bits. Silently mask + ** off all other flags. + */ + flags &= ~( SQLITE_OPEN_DELETEONCLOSE | + SQLITE_OPEN_EXCLUSIVE | + SQLITE_OPEN_MAIN_DB | + SQLITE_OPEN_TEMP_DB | + SQLITE_OPEN_TRANSIENT_DB | + SQLITE_OPEN_MAIN_JOURNAL | + SQLITE_OPEN_TEMP_JOURNAL | + SQLITE_OPEN_SUBJOURNAL | + SQLITE_OPEN_MASTER_JOURNAL | + SQLITE_OPEN_NOMUTEX | + SQLITE_OPEN_FULLMUTEX | + SQLITE_OPEN_WAL + ); + + /* Allocate the sqlite data structure */ + db = sqlite3MallocZero( sizeof(sqlite3) ); + if( db==0 ) goto opendb_out; + if( isThreadsafe +#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS + || sqlite3GlobalConfig.bCoreMutex +#endif + ){ + db->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); + if( db->mutex==0 ){ + sqlite3_free(db); + db = 0; + goto opendb_out; + } + if( isThreadsafe==0 ){ + sqlite3MutexWarnOnContention(db->mutex); + } + } + sqlite3_mutex_enter(db->mutex); + db->errMask = 0xff; + db->nDb = 2; + db->magic = SQLITE_MAGIC_BUSY; + db->aDb = db->aDbStatic; + db->lookaside.bDisable = 1; + db->lookaside.sz = 0; + + assert( sizeof(db->aLimit)==sizeof(aHardLimit) ); + memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit)); + db->aLimit[SQLITE_LIMIT_WORKER_THREADS] = SQLITE_DEFAULT_WORKER_THREADS; + db->autoCommit = 1; + db->nextAutovac = -1; + db->szMmap = sqlite3GlobalConfig.szMmap; + db->nextPagesize = 0; + db->nMaxSorterMmap = 0x7FFFFFFF; + db->flags |= SQLITE_ShortColNames + | SQLITE_EnableTrigger + | SQLITE_EnableView + | SQLITE_CacheSpill +#if !defined(SQLITE_TRUSTED_SCHEMA) || SQLITE_TRUSTED_SCHEMA+0!=0 + | SQLITE_TrustedSchema +#endif +/* The SQLITE_DQS compile-time option determines the default settings +** for SQLITE_DBCONFIG_DQS_DDL and SQLITE_DBCONFIG_DQS_DML. +** +** SQLITE_DQS SQLITE_DBCONFIG_DQS_DDL SQLITE_DBCONFIG_DQS_DML +** ---------- ----------------------- ----------------------- +** undefined on on +** 3 on on +** 2 on off +** 1 off on +** 0 off off +** +** Legacy behavior is 3 (double-quoted string literals are allowed anywhere) +** and so that is the default. But developers are encouranged to use +** -DSQLITE_DQS=0 (best) or -DSQLITE_DQS=1 (second choice) if possible. +*/ +#if !defined(SQLITE_DQS) +# define SQLITE_DQS 3 +#endif +#if (SQLITE_DQS&1)==1 + | SQLITE_DqsDML +#endif +#if (SQLITE_DQS&2)==2 + | SQLITE_DqsDDL +#endif + +#if !defined(SQLITE_DEFAULT_AUTOMATIC_INDEX) || SQLITE_DEFAULT_AUTOMATIC_INDEX + | SQLITE_AutoIndex +#endif +#if SQLITE_DEFAULT_CKPTFULLFSYNC + | SQLITE_CkptFullFSync +#endif +#if SQLITE_DEFAULT_FILE_FORMAT<4 + | SQLITE_LegacyFileFmt +#endif +#ifdef SQLITE_ENABLE_LOAD_EXTENSION + | SQLITE_LoadExtension +#endif +#if SQLITE_DEFAULT_RECURSIVE_TRIGGERS + | SQLITE_RecTriggers +#endif +#if defined(SQLITE_DEFAULT_FOREIGN_KEYS) && SQLITE_DEFAULT_FOREIGN_KEYS + | SQLITE_ForeignKeys +#endif +#if defined(SQLITE_REVERSE_UNORDERED_SELECTS) + | SQLITE_ReverseOrder +#endif +#if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK) + | SQLITE_CellSizeCk +#endif +#if defined(SQLITE_ENABLE_FTS3_TOKENIZER) + | SQLITE_Fts3Tokenizer +#endif +#if defined(SQLITE_ENABLE_QPSG) + | SQLITE_EnableQPSG +#endif +#if defined(SQLITE_DEFAULT_DEFENSIVE) + | SQLITE_Defensive +#endif +#if defined(SQLITE_DEFAULT_LEGACY_ALTER_TABLE) + | SQLITE_LegacyAlter +#endif + ; + sqlite3HashInit(&db->aCollSeq); +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3HashInit(&db->aModule); +#endif + + /* Add the default collation sequence BINARY. BINARY works for both UTF-8 + ** and UTF-16, so add a version for each to avoid any unnecessary + ** conversions. The only error that can occur here is a malloc() failure. + ** + ** EVIDENCE-OF: R-52786-44878 SQLite defines three built-in collating + ** functions: + */ + createCollation(db, sqlite3StrBINARY, SQLITE_UTF8, 0, binCollFunc, 0); + createCollation(db, sqlite3StrBINARY, SQLITE_UTF16BE, 0, binCollFunc, 0); + createCollation(db, sqlite3StrBINARY, SQLITE_UTF16LE, 0, binCollFunc, 0); + createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); + createCollation(db, "RTRIM", SQLITE_UTF8, 0, rtrimCollFunc, 0); + if( db->mallocFailed ){ + goto opendb_out; + } + + /* Parse the filename/URI argument + ** + ** Only allow sensible combinations of bits in the flags argument. + ** Throw an error if any non-sense combination is used. If we + ** do not block illegal combinations here, it could trigger + ** assert() statements in deeper layers. Sensible combinations + ** are: + ** + ** 1: SQLITE_OPEN_READONLY + ** 2: SQLITE_OPEN_READWRITE + ** 6: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE + */ + db->openFlags = flags; + assert( SQLITE_OPEN_READONLY == 0x01 ); + assert( SQLITE_OPEN_READWRITE == 0x02 ); + assert( SQLITE_OPEN_CREATE == 0x04 ); + testcase( (1<<(flags&7))==0x02 ); /* READONLY */ + testcase( (1<<(flags&7))==0x04 ); /* READWRITE */ + testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */ + if( ((1<<(flags&7)) & 0x46)==0 ){ + rc = SQLITE_MISUSE_BKPT; /* IMP: R-18321-05872 */ + }else{ + rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); + } + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + sqlite3ErrorWithMsg(db, rc, zErrMsg ? "%s" : 0, zErrMsg); + sqlite3_free(zErrMsg); + goto opendb_out; + } + + /* Open the backend database driver */ + rc = sqlite3BtreeOpen(db->pVfs, zOpen, db, &db->aDb[0].pBt, 0, + flags | SQLITE_OPEN_MAIN_DB); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_IOERR_NOMEM ){ + rc = SQLITE_NOMEM_BKPT; + } + sqlite3Error(db, rc); + goto opendb_out; + } + sqlite3BtreeEnter(db->aDb[0].pBt); + db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt); + if( !db->mallocFailed ){ + sqlite3SetTextEncoding(db, SCHEMA_ENC(db)); + } + sqlite3BtreeLeave(db->aDb[0].pBt); + db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); + + /* The default safety_level for the main database is FULL; for the temp + ** database it is OFF. This matches the pager layer defaults. + */ + db->aDb[0].zDbSName = "main"; + db->aDb[0].safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; + db->aDb[1].zDbSName = "temp"; + db->aDb[1].safety_level = PAGER_SYNCHRONOUS_OFF; + + db->magic = SQLITE_MAGIC_OPEN; + if( db->mallocFailed ){ + goto opendb_out; + } + + /* Register all built-in functions, but do not attempt to read the + ** database schema yet. This is delayed until the first time the database + ** is accessed. + */ + sqlite3Error(db, SQLITE_OK); + sqlite3RegisterPerConnectionBuiltinFunctions(db); + rc = sqlite3_errcode(db); + + + /* Load compiled-in extensions */ + for(i=0; rc==SQLITE_OK && imDbFlags |= DBFLAG_InternalFunc; +#endif + + /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking + ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking + ** mode. Doing nothing at all also makes NORMAL the default. + */ +#ifdef SQLITE_DEFAULT_LOCKING_MODE + db->dfltLockMode = SQLITE_DEFAULT_LOCKING_MODE; + sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt), + SQLITE_DEFAULT_LOCKING_MODE); +#endif + + if( rc ) sqlite3Error(db, rc); + + /* Enable the lookaside-malloc subsystem */ + setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside, + sqlite3GlobalConfig.nLookaside); + + sqlite3_wal_autocheckpoint(db, SQLITE_DEFAULT_WAL_AUTOCHECKPOINT); + +opendb_out: + if( db ){ + assert( db->mutex!=0 || isThreadsafe==0 + || sqlite3GlobalConfig.bFullMutex==0 ); + sqlite3_mutex_leave(db->mutex); + } + rc = sqlite3_errcode(db); + assert( db!=0 || rc==SQLITE_NOMEM ); + if( rc==SQLITE_NOMEM ){ + sqlite3_close(db); + db = 0; + }else if( rc!=SQLITE_OK ){ + db->magic = SQLITE_MAGIC_SICK; + } + *ppDb = db; +#ifdef SQLITE_ENABLE_SQLLOG + if( sqlite3GlobalConfig.xSqllog ){ + /* Opening a db handle. Fourth parameter is passed 0. */ + void *pArg = sqlite3GlobalConfig.pSqllogArg; + sqlite3GlobalConfig.xSqllog(pArg, db, zFilename, 0); + } +#endif + sqlite3_free_filename(zOpen); + return rc & 0xff; +} + + +/* +** Open a new database handle. +*/ +SQLITE_API int sqlite3_open( + const char *zFilename, + sqlite3 **ppDb +){ + return openDatabase(zFilename, ppDb, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); +} +SQLITE_API int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +){ + return openDatabase(filename, ppDb, (unsigned int)flags, zVfs); +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Open a new database handle. +*/ +SQLITE_API int sqlite3_open16( + const void *zFilename, + sqlite3 **ppDb +){ + char const *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */ + sqlite3_value *pVal; + int rc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppDb==0 ) return SQLITE_MISUSE_BKPT; +#endif + *ppDb = 0; +#ifndef SQLITE_OMIT_AUTOINIT + rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + if( zFilename==0 ) zFilename = "\000\000"; + pVal = sqlite3ValueNew(0); + sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC); + zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8); + if( zFilename8 ){ + rc = openDatabase(zFilename8, ppDb, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); + assert( *ppDb || rc==SQLITE_NOMEM ); + if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){ + SCHEMA_ENC(*ppDb) = ENC(*ppDb) = SQLITE_UTF16NATIVE; + } + }else{ + rc = SQLITE_NOMEM_BKPT; + } + sqlite3ValueFree(pVal); + + return rc & 0xff; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Register a new collation sequence with the database handle db. +*/ +SQLITE_API int sqlite3_create_collation( + sqlite3* db, + const char *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*) +){ + return sqlite3_create_collation_v2(db, zName, enc, pCtx, xCompare, 0); +} + +/* +** Register a new collation sequence with the database handle db. +*/ +SQLITE_API int sqlite3_create_collation_v2( + sqlite3* db, + const char *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDel)(void*) +){ + int rc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + rc = createCollation(db, zName, (u8)enc, pCtx, xCompare, xDel); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Register a new collation sequence with the database handle db. +*/ +SQLITE_API int sqlite3_create_collation16( + sqlite3* db, + const void *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*) +){ + int rc = SQLITE_OK; + char *zName8; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + zName8 = sqlite3Utf16to8(db, zName, -1, SQLITE_UTF16NATIVE); + if( zName8 ){ + rc = createCollation(db, zName8, (u8)enc, pCtx, xCompare, 0); + sqlite3DbFree(db, zName8); + } + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Register a collation sequence factory callback with the database handle +** db. Replace any previously installed collation sequence factory. +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3 *db, + void *pCollNeededArg, + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*) +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->xCollNeeded = xCollNeeded; + db->xCollNeeded16 = 0; + db->pCollNeededArg = pCollNeededArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Register a collation sequence factory callback with the database handle +** db. Replace any previously installed collation sequence factory. +*/ +SQLITE_API int sqlite3_collation_needed16( + sqlite3 *db, + void *pCollNeededArg, + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*) +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->xCollNeeded = 0; + db->xCollNeeded16 = xCollNeeded16; + db->pCollNeededArg = pCollNeededArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} +#endif /* SQLITE_OMIT_UTF16 */ + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** This function is now an anachronism. It used to be used to recover from a +** malloc() failure, but SQLite now does this automatically. +*/ +SQLITE_API int sqlite3_global_recover(void){ + return SQLITE_OK; +} +#endif + +/* +** Test to see whether or not the database connection is in autocommit +** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on +** by default. Autocommit is disabled by a BEGIN statement and reenabled +** by the next COMMIT or ROLLBACK. +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->autoCommit; +} + +/* +** The following routines are substitutes for constants SQLITE_CORRUPT, +** SQLITE_MISUSE, SQLITE_CANTOPEN, SQLITE_NOMEM and possibly other error +** constants. They serve two purposes: +** +** 1. Serve as a convenient place to set a breakpoint in a debugger +** to detect when version error conditions occurs. +** +** 2. Invoke sqlite3_log() to provide the source code location where +** a low-level error is first detected. +*/ +SQLITE_PRIVATE int sqlite3ReportError(int iErr, int lineno, const char *zType){ + sqlite3_log(iErr, "%s at line %d of [%.10s]", + zType, lineno, 20+sqlite3_sourceid()); + return iErr; +} +SQLITE_PRIVATE int sqlite3CorruptError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_CORRUPT, lineno, "database corruption"); +} +SQLITE_PRIVATE int sqlite3MisuseError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_MISUSE, lineno, "misuse"); +} +SQLITE_PRIVATE int sqlite3CantopenError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_CANTOPEN, lineno, "cannot open file"); +} +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_CORRUPT_PGNO) +SQLITE_PRIVATE int sqlite3CorruptPgnoError(int lineno, Pgno pgno){ + char zMsg[100]; + sqlite3_snprintf(sizeof(zMsg), zMsg, "database corruption page %d", pgno); + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg); +} +#endif +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NomemError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_NOMEM, lineno, "OOM"); +} +SQLITE_PRIVATE int sqlite3IoerrnomemError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error"); +} +#endif + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** This is a convenience routine that makes sure that all thread-specific +** data for this thread has been deallocated. +** +** SQLite no longer uses thread-specific data so this routine is now a +** no-op. It is retained for historical compatibility. +*/ +SQLITE_API void sqlite3_thread_cleanup(void){ +} +#endif + +/* +** Return meta information about a specific column of a database table. +** See comment in sqlite3.h (sqlite.h.in) for details. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +){ + int rc; + char *zErrMsg = 0; + Table *pTab = 0; + Column *pCol = 0; + int iCol = 0; + char const *zDataType = 0; + char const *zCollSeq = 0; + int notnull = 0; + int primarykey = 0; + int autoinc = 0; + + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zTableName==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + + /* Ensure the database schema has been loaded */ + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + rc = sqlite3Init(db, &zErrMsg); + if( SQLITE_OK!=rc ){ + goto error_out; + } + + /* Locate the table in question */ + pTab = sqlite3FindTable(db, zTableName, zDbName); + if( !pTab || pTab->pSelect ){ + pTab = 0; + goto error_out; + } + + /* Find the column for which info is requested */ + if( zColumnName==0 ){ + /* Query for existance of table only */ + }else{ + for(iCol=0; iColnCol; iCol++){ + pCol = &pTab->aCol[iCol]; + if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){ + break; + } + } + if( iCol==pTab->nCol ){ + if( HasRowid(pTab) && sqlite3IsRowid(zColumnName) ){ + iCol = pTab->iPKey; + pCol = iCol>=0 ? &pTab->aCol[iCol] : 0; + }else{ + pTab = 0; + goto error_out; + } + } + } + + /* The following block stores the meta information that will be returned + ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey + ** and autoinc. At this point there are two possibilities: + ** + ** 1. The specified column name was rowid", "oid" or "_rowid_" + ** and there is no explicitly declared IPK column. + ** + ** 2. The table is not a view and the column name identified an + ** explicitly declared column. Copy meta information from *pCol. + */ + if( pCol ){ + zDataType = sqlite3ColumnType(pCol,0); + zCollSeq = pCol->zColl; + notnull = pCol->notNull!=0; + primarykey = (pCol->colFlags & COLFLAG_PRIMKEY)!=0; + autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0; + }else{ + zDataType = "INTEGER"; + primarykey = 1; + } + if( !zCollSeq ){ + zCollSeq = sqlite3StrBINARY; + } + +error_out: + sqlite3BtreeLeaveAll(db); + + /* Whether the function call succeeded or failed, set the output parameters + ** to whatever their local counterparts contain. If an error did occur, + ** this has the effect of zeroing all output parameters. + */ + if( pzDataType ) *pzDataType = zDataType; + if( pzCollSeq ) *pzCollSeq = zCollSeq; + if( pNotNull ) *pNotNull = notnull; + if( pPrimaryKey ) *pPrimaryKey = primarykey; + if( pAutoinc ) *pAutoinc = autoinc; + + if( SQLITE_OK==rc && !pTab ){ + sqlite3DbFree(db, zErrMsg); + zErrMsg = sqlite3MPrintf(db, "no such table column: %s.%s", zTableName, + zColumnName); + rc = SQLITE_ERROR; + } + sqlite3ErrorWithMsg(db, rc, (zErrMsg?"%s":0), zErrMsg); + sqlite3DbFree(db, zErrMsg); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Sleep for a little while. Return the amount of time slept. +*/ +SQLITE_API int sqlite3_sleep(int ms){ + sqlite3_vfs *pVfs; + int rc; + pVfs = sqlite3_vfs_find(0); + if( pVfs==0 ) return 0; + + /* This function works in milliseconds, but the underlying OsSleep() + ** API uses microseconds. Hence the 1000's. + */ + rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000); + return rc; +} + +/* +** Enable or disable the extended result codes. +*/ +SQLITE_API int sqlite3_extended_result_codes(sqlite3 *db, int onoff){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->errMask = onoff ? 0xffffffff : 0xff; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Invoke the xFileControl method on a particular database. +*/ +SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ + int rc = SQLITE_ERROR; + Btree *pBtree; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + pBtree = sqlite3DbNameToBtree(db, zDbName); + if( pBtree ){ + Pager *pPager; + sqlite3_file *fd; + sqlite3BtreeEnter(pBtree); + pPager = sqlite3BtreePager(pBtree); + assert( pPager!=0 ); + fd = sqlite3PagerFile(pPager); + assert( fd!=0 ); + if( op==SQLITE_FCNTL_FILE_POINTER ){ + *(sqlite3_file**)pArg = fd; + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_VFS_POINTER ){ + *(sqlite3_vfs**)pArg = sqlite3PagerVfs(pPager); + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_JOURNAL_POINTER ){ + *(sqlite3_file**)pArg = sqlite3PagerJrnlFile(pPager); + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_DATA_VERSION ){ + *(unsigned int*)pArg = sqlite3PagerDataVersion(pPager); + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_RESERVE_BYTES ){ + int iNew = *(int*)pArg; + *(int*)pArg = sqlite3BtreeGetRequestedReserve(pBtree); + if( iNew>=0 && iNew<=255 ){ + sqlite3BtreeSetPageSize(pBtree, 0, iNew, 0); + } + rc = SQLITE_OK; + }else{ + rc = sqlite3OsFileControl(fd, op, pArg); + } + sqlite3BtreeLeave(pBtree); + } + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Interface to the testing logic. +*/ +SQLITE_API int sqlite3_test_control(int op, ...){ + int rc = 0; +#ifdef SQLITE_UNTESTABLE + UNUSED_PARAMETER(op); +#else + va_list ap; + va_start(ap, op); + switch( op ){ + + /* + ** Save the current state of the PRNG. + */ + case SQLITE_TESTCTRL_PRNG_SAVE: { + sqlite3PrngSaveState(); + break; + } + + /* + ** Restore the state of the PRNG to the last state saved using + ** PRNG_SAVE. If PRNG_SAVE has never before been called, then + ** this verb acts like PRNG_RESET. + */ + case SQLITE_TESTCTRL_PRNG_RESTORE: { + sqlite3PrngRestoreState(); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, int x, sqlite3 *db); + ** + ** Control the seed for the pseudo-random number generator (PRNG) that + ** is built into SQLite. Cases: + ** + ** x!=0 && db!=0 Seed the PRNG to the current value of the + ** schema cookie in the main database for db, or + ** x if the schema cookie is zero. This case + ** is convenient to use with database fuzzers + ** as it allows the fuzzer some control over the + ** the PRNG seed. + ** + ** x!=0 && db==0 Seed the PRNG to the value of x. + ** + ** x==0 && db==0 Revert to default behavior of using the + ** xRandomness method on the primary VFS. + ** + ** This test-control also resets the PRNG so that the new seed will + ** be used for the next call to sqlite3_randomness(). + */ +#ifndef SQLITE_OMIT_WSD + case SQLITE_TESTCTRL_PRNG_SEED: { + int x = va_arg(ap, int); + int y; + sqlite3 *db = va_arg(ap, sqlite3*); + assert( db==0 || db->aDb[0].pSchema!=0 ); + if( db && (y = db->aDb[0].pSchema->schema_cookie)!=0 ){ x = y; } + sqlite3Config.iPrngSeed = x; + sqlite3_randomness(0,0); + break; + } +#endif + + /* + ** sqlite3_test_control(BITVEC_TEST, size, program) + ** + ** Run a test against a Bitvec object of size. The program argument + ** is an array of integers that defines the test. Return -1 on a + ** memory allocation error, 0 on success, or non-zero for an error. + ** See the sqlite3BitvecBuiltinTest() for additional information. + */ + case SQLITE_TESTCTRL_BITVEC_TEST: { + int sz = va_arg(ap, int); + int *aProg = va_arg(ap, int*); + rc = sqlite3BitvecBuiltinTest(sz, aProg); + break; + } + + /* + ** sqlite3_test_control(FAULT_INSTALL, xCallback) + ** + ** Arrange to invoke xCallback() whenever sqlite3FaultSim() is called, + ** if xCallback is not NULL. + ** + ** As a test of the fault simulator mechanism itself, sqlite3FaultSim(0) + ** is called immediately after installing the new callback and the return + ** value from sqlite3FaultSim(0) becomes the return from + ** sqlite3_test_control(). + */ + case SQLITE_TESTCTRL_FAULT_INSTALL: { + /* MSVC is picky about pulling func ptrs from va lists. + ** http://support.microsoft.com/kb/47961 + ** sqlite3GlobalConfig.xTestCallback = va_arg(ap, int(*)(int)); + */ + typedef int(*TESTCALLBACKFUNC_t)(int); + sqlite3GlobalConfig.xTestCallback = va_arg(ap, TESTCALLBACKFUNC_t); + rc = sqlite3FaultSim(0); + break; + } + + /* + ** sqlite3_test_control(BENIGN_MALLOC_HOOKS, xBegin, xEnd) + ** + ** Register hooks to call to indicate which malloc() failures + ** are benign. + */ + case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: { + typedef void (*void_function)(void); + void_function xBenignBegin; + void_function xBenignEnd; + xBenignBegin = va_arg(ap, void_function); + xBenignEnd = va_arg(ap, void_function); + sqlite3BenignMallocHooks(xBenignBegin, xBenignEnd); + break; + } + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_PENDING_BYTE, unsigned int X) + ** + ** Set the PENDING byte to the value in the argument, if X>0. + ** Make no changes if X==0. Return the value of the pending byte + ** as it existing before this routine was called. + ** + ** IMPORTANT: Changing the PENDING byte from 0x40000000 results in + ** an incompatible database file format. Changing the PENDING byte + ** while any database connection is open results in undefined and + ** deleterious behavior. + */ + case SQLITE_TESTCTRL_PENDING_BYTE: { + rc = PENDING_BYTE; +#ifndef SQLITE_OMIT_WSD + { + unsigned int newVal = va_arg(ap, unsigned int); + if( newVal ) sqlite3PendingByte = newVal; + } +#endif + break; + } + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, int X) + ** + ** This action provides a run-time test to see whether or not + ** assert() was enabled at compile-time. If X is true and assert() + ** is enabled, then the return value is true. If X is true and + ** assert() is disabled, then the return value is zero. If X is + ** false and assert() is enabled, then the assertion fires and the + ** process aborts. If X is false and assert() is disabled, then the + ** return value is zero. + */ + case SQLITE_TESTCTRL_ASSERT: { + volatile int x = 0; + assert( /*side-effects-ok*/ (x = va_arg(ap,int))!=0 ); + rc = x; + break; + } + + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, int X) + ** + ** This action provides a run-time test to see how the ALWAYS and + ** NEVER macros were defined at compile-time. + ** + ** The return value is ALWAYS(X) if X is true, or 0 if X is false. + ** + ** The recommended test is X==2. If the return value is 2, that means + ** ALWAYS() and NEVER() are both no-op pass-through macros, which is the + ** default setting. If the return value is 1, then ALWAYS() is either + ** hard-coded to true or else it asserts if its argument is false. + ** The first behavior (hard-coded to true) is the case if + ** SQLITE_TESTCTRL_ASSERT shows that assert() is disabled and the second + ** behavior (assert if the argument to ALWAYS() is false) is the case if + ** SQLITE_TESTCTRL_ASSERT shows that assert() is enabled. + ** + ** The run-time test procedure might look something like this: + ** + ** if( sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, 2)==2 ){ + ** // ALWAYS() and NEVER() are no-op pass-through macros + ** }else if( sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, 1) ){ + ** // ALWAYS(x) asserts that x is true. NEVER(x) asserts x is false. + ** }else{ + ** // ALWAYS(x) is a constant 1. NEVER(x) is a constant 0. + ** } + */ + case SQLITE_TESTCTRL_ALWAYS: { + int x = va_arg(ap,int); + rc = x ? ALWAYS(x) : 0; + break; + } + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_BYTEORDER); + ** + ** The integer returned reveals the byte-order of the computer on which + ** SQLite is running: + ** + ** 1 big-endian, determined at run-time + ** 10 little-endian, determined at run-time + ** 432101 big-endian, determined at compile-time + ** 123410 little-endian, determined at compile-time + */ + case SQLITE_TESTCTRL_BYTEORDER: { + rc = SQLITE_BYTEORDER*100 + SQLITE_LITTLEENDIAN*10 + SQLITE_BIGENDIAN; + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, sqlite3 *db, int N) + ** + ** Enable or disable various optimizations for testing purposes. The + ** argument N is a bitmask of optimizations to be disabled. For normal + ** operation N should be 0. The idea is that a test program (like the + ** SQL Logic Test or SLT test module) can run the same SQL multiple times + ** with various optimizations disabled to verify that the same answer + ** is obtained in every case. + */ + case SQLITE_TESTCTRL_OPTIMIZATIONS: { + sqlite3 *db = va_arg(ap, sqlite3*); + db->dbOptFlags = (u16)(va_arg(ap, int) & 0xffff); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff); + ** + ** If parameter onoff is non-zero, subsequent calls to localtime() + ** and its variants fail. If onoff is zero, undo this setting. + */ + case SQLITE_TESTCTRL_LOCALTIME_FAULT: { + sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, sqlite3*); + ** + ** Toggle the ability to use internal functions on or off for + ** the database connection given in the argument. + */ + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: { + sqlite3 *db = va_arg(ap, sqlite3*); + db->mDbFlags ^= DBFLAG_InternalFunc; + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_NEVER_CORRUPT, int); + ** + ** Set or clear a flag that indicates that the database file is always well- + ** formed and never corrupt. This flag is clear by default, indicating that + ** database files might have arbitrary corruption. Setting the flag during + ** testing causes certain assert() statements in the code to be activated + ** that demonstrat invariants on well-formed database files. + */ + case SQLITE_TESTCTRL_NEVER_CORRUPT: { + sqlite3GlobalConfig.neverCorrupt = va_arg(ap, int); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS, int); + ** + ** Set or clear a flag that causes SQLite to verify that type, name, + ** and tbl_name fields of the sqlite_master table. This is normally + ** on, but it is sometimes useful to turn it off for testing. + */ + case SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS: { + sqlite3GlobalConfig.bExtraSchemaChecks = va_arg(ap, int); + break; + } + + /* Set the threshold at which OP_Once counters reset back to zero. + ** By default this is 0x7ffffffe (over 2 billion), but that value is + ** too big to test in a reasonable amount of time, so this control is + ** provided to set a small and easily reachable reset value. + */ + case SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD: { + sqlite3GlobalConfig.iOnceResetThreshold = va_arg(ap, int); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE, xCallback, ptr); + ** + ** Set the VDBE coverage callback function to xCallback with context + ** pointer ptr. + */ + case SQLITE_TESTCTRL_VDBE_COVERAGE: { +#ifdef SQLITE_VDBE_COVERAGE + typedef void (*branch_callback)(void*,unsigned int, + unsigned char,unsigned char); + sqlite3GlobalConfig.xVdbeBranch = va_arg(ap,branch_callback); + sqlite3GlobalConfig.pVdbeBranchArg = va_arg(ap,void*); +#endif + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_SORTER_MMAP, db, nMax); */ + case SQLITE_TESTCTRL_SORTER_MMAP: { + sqlite3 *db = va_arg(ap, sqlite3*); + db->nMaxSorterMmap = va_arg(ap, int); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_ISINIT); + ** + ** Return SQLITE_OK if SQLite has been initialized and SQLITE_ERROR if + ** not. + */ + case SQLITE_TESTCTRL_ISINIT: { + if( sqlite3GlobalConfig.isInit==0 ) rc = SQLITE_ERROR; + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, dbName, onOff, tnum); + ** + ** This test control is used to create imposter tables. "db" is a pointer + ** to the database connection. dbName is the database name (ex: "main" or + ** "temp") which will receive the imposter. "onOff" turns imposter mode on + ** or off. "tnum" is the root page of the b-tree to which the imposter + ** table should connect. + ** + ** Enable imposter mode only when the schema has already been parsed. Then + ** run a single CREATE TABLE statement to construct the imposter table in + ** the parsed schema. Then turn imposter mode back off again. + ** + ** If onOff==0 and tnum>0 then reset the schema for all databases, causing + ** the schema to be reparsed the next time it is needed. This has the + ** effect of erasing all imposter tables. + */ + case SQLITE_TESTCTRL_IMPOSTER: { + sqlite3 *db = va_arg(ap, sqlite3*); + sqlite3_mutex_enter(db->mutex); + db->init.iDb = sqlite3FindDbName(db, va_arg(ap,const char*)); + db->init.busy = db->init.imposterTable = va_arg(ap,int); + db->init.newTnum = va_arg(ap,int); + if( db->init.busy==0 && db->init.newTnum>0 ){ + sqlite3ResetAllSchemasOfConnection(db); + } + sqlite3_mutex_leave(db->mutex); + break; + } + +#if defined(YYCOVERAGE) + /* sqlite3_test_control(SQLITE_TESTCTRL_PARSER_COVERAGE, FILE *out) + ** + ** This test control (only available when SQLite is compiled with + ** -DYYCOVERAGE) writes a report onto "out" that shows all + ** state/lookahead combinations in the parser state machine + ** which are never exercised. If any state is missed, make the + ** return code SQLITE_ERROR. + */ + case SQLITE_TESTCTRL_PARSER_COVERAGE: { + FILE *out = va_arg(ap, FILE*); + if( sqlite3ParserCoverage(out) ) rc = SQLITE_ERROR; + break; + } +#endif /* defined(YYCOVERAGE) */ + + /* sqlite3_test_control(SQLITE_TESTCTRL_RESULT_INTREAL, sqlite3_context*); + ** + ** This test-control causes the most recent sqlite3_result_int64() value + ** to be interpreted as a MEM_IntReal instead of as an MEM_Int. Normally, + ** MEM_IntReal values only arise during an INSERT operation of integer + ** values into a REAL column, so they can be challenging to test. This + ** test-control enables us to write an intreal() SQL function that can + ** inject an intreal() value at arbitrary places in an SQL statement, + ** for testing purposes. + */ + case SQLITE_TESTCTRL_RESULT_INTREAL: { + sqlite3_context *pCtx = va_arg(ap, sqlite3_context*); + sqlite3ResultIntReal(pCtx); + break; + } + } + va_end(ap); +#endif /* SQLITE_UNTESTABLE */ + return rc; +} + +/* +** The Pager stores the Database filename, Journal filename, and WAL filename +** consecutively in memory, in that order. The database filename is prefixed +** by four zero bytes. Locate the start of the database filename by searching +** backwards for the first byte following four consecutive zero bytes. +** +** This only works if the filename passed in was obtained from the Pager. +*/ +static const char *databaseName(const char *zName){ + while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){ + zName--; + } + return zName; +} + +/* +** Append text z[] to the end of p[]. Return a pointer to the first +** character after then zero terminator on the new text in p[]. +*/ +static char *appendText(char *p, const char *z){ + size_t n = strlen(z); + memcpy(p, z, n+1); + return p+n+1; +} + +/* +** Allocate memory to hold names for a database, journal file, WAL file, +** and query parameters. The pointer returned is valid for use by +** sqlite3_filename_database() and sqlite3_uri_parameter() and related +** functions. +** +** Memory layout must be compatible with that generated by the pager +** and expected by sqlite3_uri_parameter() and databaseName(). +*/ +SQLITE_API char *sqlite3_create_filename( + const char *zDatabase, + const char *zJournal, + const char *zWal, + int nParam, + const char **azParam +){ + sqlite3_int64 nByte; + int i; + char *pResult, *p; + nByte = strlen(zDatabase) + strlen(zJournal) + strlen(zWal) + 10; + for(i=0; i0 ){ + zFilename += sqlite3Strlen30(zFilename) + 1; + zFilename += sqlite3Strlen30(zFilename) + 1; + } + return zFilename[0] ? zFilename : 0; +} + +/* +** Return a boolean value for a query parameter. +*/ +SQLITE_API int sqlite3_uri_boolean(const char *zFilename, const char *zParam, int bDflt){ + const char *z = sqlite3_uri_parameter(zFilename, zParam); + bDflt = bDflt!=0; + return z ? sqlite3GetBoolean(z, bDflt) : bDflt; +} + +/* +** Return a 64-bit integer value for a query parameter. +*/ +SQLITE_API sqlite3_int64 sqlite3_uri_int64( + const char *zFilename, /* Filename as passed to xOpen */ + const char *zParam, /* URI parameter sought */ + sqlite3_int64 bDflt /* return if parameter is missing */ +){ + const char *z = sqlite3_uri_parameter(zFilename, zParam); + sqlite3_int64 v; + if( z && sqlite3DecOrHexToI64(z, &v)==0 ){ + bDflt = v; + } + return bDflt; +} + +/* +** Translate a filename that was handed to a VFS routine into the corresponding +** database, journal, or WAL file. +** +** It is an error to pass this routine a filename string that was not +** passed into the VFS from the SQLite core. Doing so is similar to +** passing free() a pointer that was not obtained from malloc() - it is +** an error that we cannot easily detect but that will likely cause memory +** corruption. +*/ +SQLITE_API const char *sqlite3_filename_database(const char *zFilename){ + return databaseName(zFilename); +} +SQLITE_API const char *sqlite3_filename_journal(const char *zFilename){ + zFilename = databaseName(zFilename); + zFilename += sqlite3Strlen30(zFilename) + 1; + while( zFilename[0] ){ + zFilename += sqlite3Strlen30(zFilename) + 1; + zFilename += sqlite3Strlen30(zFilename) + 1; + } + return zFilename + 1; +} +SQLITE_API const char *sqlite3_filename_wal(const char *zFilename){ +#ifdef SQLITE_OMIT_WAL + return 0; +#else + zFilename = sqlite3_filename_journal(zFilename); + zFilename += sqlite3Strlen30(zFilename) + 1; + return zFilename; +#endif +} + +/* +** Return the Btree pointer identified by zDbName. Return NULL if not found. +*/ +SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){ + int iDb = zDbName ? sqlite3FindDbName(db, zDbName) : 0; + return iDb<0 ? 0 : db->aDb[iDb].pBt; +} + +/* +** Return the filename of the database associated with a database +** connection. +*/ +SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName){ + Btree *pBt; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + pBt = sqlite3DbNameToBtree(db, zDbName); + return pBt ? sqlite3BtreeGetFilename(pBt) : 0; +} + +/* +** Return 1 if database is read-only or 0 if read/write. Return -1 if +** no such database exists. +*/ +SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){ + Btree *pBt; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return -1; + } +#endif + pBt = sqlite3DbNameToBtree(db, zDbName); + return pBt ? sqlite3BtreeIsReadonly(pBt) : -1; +} + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Obtain a snapshot handle for the snapshot of database zDb currently +** being read by handle db. +*/ +SQLITE_API int sqlite3_snapshot_get( + sqlite3 *db, + const char *zDb, + sqlite3_snapshot **ppSnapshot +){ + int rc = SQLITE_ERROR; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + + if( db->autoCommit==0 ){ + int iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInTrans(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); + } + } + } + } + + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Open a read-transaction on the snapshot idendified by pSnapshot. +*/ +SQLITE_API int sqlite3_snapshot_open( + sqlite3 *db, + const char *zDb, + sqlite3_snapshot *pSnapshot +){ + int rc = SQLITE_ERROR; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( db->autoCommit==0 ){ + int iDb; + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( sqlite3BtreeIsInTrans(pBt)==0 ){ + Pager *pPager = sqlite3BtreePager(pBt); + int bUnlock = 0; + if( sqlite3BtreeIsInReadTrans(pBt) ){ + if( db->nVdbeActive==0 ){ + rc = sqlite3PagerSnapshotCheck(pPager, pSnapshot); + if( rc==SQLITE_OK ){ + bUnlock = 1; + rc = sqlite3BtreeCommit(pBt); + } + } + }else{ + rc = SQLITE_OK; + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotOpen(pPager, pSnapshot); + } + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pBt, 0, 0); + sqlite3PagerSnapshotOpen(pPager, 0); + } + if( bUnlock ){ + sqlite3PagerSnapshotUnlock(pPager); + } + } + } + } + + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Recover as many snapshots as possible from the wal file associated with +** schema zDb of database db. +*/ +SQLITE_API int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb){ + int rc = SQLITE_ERROR; + int iDb; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + + sqlite3_mutex_enter(db->mutex); + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInReadTrans(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotRecover(sqlite3BtreePager(pBt)); + sqlite3BtreeCommit(pBt); + } + } + } + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Free a snapshot handle obtained from sqlite3_snapshot_get(). +*/ +SQLITE_API void sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){ + sqlite3_free(pSnapshot); +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +/* +** Given the name of a compile-time option, return true if that option +** was used and false if not. +** +** The name can optionally begin with "SQLITE_" but the "SQLITE_" prefix +** is not required for a match. +*/ +SQLITE_API int sqlite3_compileoption_used(const char *zOptName){ + int i, n; + int nOpt; + const char **azCompileOpt; + +#if SQLITE_ENABLE_API_ARMOR + if( zOptName==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + azCompileOpt = sqlite3CompileOptions(&nOpt); + + if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; + n = sqlite3Strlen30(zOptName); + + /* Since nOpt is normally in single digits, a linear search is + ** adequate. No need for a binary search. */ + for(i=0; i=0 && NpNextBlocked){ + int seen = 0; + sqlite3 *p2; + + /* Verify property (1) */ + assert( p->pUnlockConnection || p->pBlockingConnection ); + + /* Verify property (2) */ + for(p2=sqlite3BlockedList; p2!=p; p2=p2->pNextBlocked){ + if( p2->xUnlockNotify==p->xUnlockNotify ) seen = 1; + assert( p2->xUnlockNotify==p->xUnlockNotify || !seen ); + assert( db==0 || p->pUnlockConnection!=db ); + assert( db==0 || p->pBlockingConnection!=db ); + } + } +} +#else +# define checkListProperties(x) +#endif + +/* +** Remove connection db from the blocked connections list. If connection +** db is not currently a part of the list, this function is a no-op. +*/ +static void removeFromBlockedList(sqlite3 *db){ + sqlite3 **pp; + assertMutexHeld(); + for(pp=&sqlite3BlockedList; *pp; pp = &(*pp)->pNextBlocked){ + if( *pp==db ){ + *pp = (*pp)->pNextBlocked; + break; + } + } +} + +/* +** Add connection db to the blocked connections list. It is assumed +** that it is not already a part of the list. +*/ +static void addToBlockedList(sqlite3 *db){ + sqlite3 **pp; + assertMutexHeld(); + for( + pp=&sqlite3BlockedList; + *pp && (*pp)->xUnlockNotify!=db->xUnlockNotify; + pp=&(*pp)->pNextBlocked + ); + db->pNextBlocked = *pp; + *pp = db; +} + +/* +** Obtain the STATIC_MASTER mutex. +*/ +static void enterMutex(void){ + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + checkListProperties(0); +} + +/* +** Release the STATIC_MASTER mutex. +*/ +static void leaveMutex(void){ + assertMutexHeld(); + checkListProperties(0); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); +} + +/* +** Register an unlock-notify callback. +** +** This is called after connection "db" has attempted some operation +** but has received an SQLITE_LOCKED error because another connection +** (call it pOther) in the same process was busy using the same shared +** cache. pOther is found by looking at db->pBlockingConnection. +** +** If there is no blocking connection, the callback is invoked immediately, +** before this routine returns. +** +** If pOther is already blocked on db, then report SQLITE_LOCKED, to indicate +** a deadlock. +** +** Otherwise, make arrangements to invoke xNotify when pOther drops +** its locks. +** +** Each call to this routine overrides any prior callbacks registered +** on the same "db". If xNotify==0 then any prior callbacks are immediately +** cancelled. +*/ +SQLITE_API int sqlite3_unlock_notify( + sqlite3 *db, + void (*xNotify)(void **, int), + void *pArg +){ + int rc = SQLITE_OK; + + sqlite3_mutex_enter(db->mutex); + enterMutex(); + + if( xNotify==0 ){ + removeFromBlockedList(db); + db->pBlockingConnection = 0; + db->pUnlockConnection = 0; + db->xUnlockNotify = 0; + db->pUnlockArg = 0; + }else if( 0==db->pBlockingConnection ){ + /* The blocking transaction has been concluded. Or there never was a + ** blocking transaction. In either case, invoke the notify callback + ** immediately. + */ + xNotify(&pArg, 1); + }else{ + sqlite3 *p; + + for(p=db->pBlockingConnection; p && p!=db; p=p->pUnlockConnection){} + if( p ){ + rc = SQLITE_LOCKED; /* Deadlock detected. */ + }else{ + db->pUnlockConnection = db->pBlockingConnection; + db->xUnlockNotify = xNotify; + db->pUnlockArg = pArg; + removeFromBlockedList(db); + addToBlockedList(db); + } + } + + leaveMutex(); + assert( !db->mallocFailed ); + sqlite3ErrorWithMsg(db, rc, (rc?"database is deadlocked":0)); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** This function is called while stepping or preparing a statement +** associated with connection db. The operation will return SQLITE_LOCKED +** to the user because it requires a lock that will not be available +** until connection pBlocker concludes its current transaction. +*/ +SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *db, sqlite3 *pBlocker){ + enterMutex(); + if( db->pBlockingConnection==0 && db->pUnlockConnection==0 ){ + addToBlockedList(db); + } + db->pBlockingConnection = pBlocker; + leaveMutex(); +} + +/* +** This function is called when +** the transaction opened by database db has just finished. Locks held +** by database connection db have been released. +** +** This function loops through each entry in the blocked connections +** list and does the following: +** +** 1) If the sqlite3.pBlockingConnection member of a list entry is +** set to db, then set pBlockingConnection=0. +** +** 2) If the sqlite3.pUnlockConnection member of a list entry is +** set to db, then invoke the configured unlock-notify callback and +** set pUnlockConnection=0. +** +** 3) If the two steps above mean that pBlockingConnection==0 and +** pUnlockConnection==0, remove the entry from the blocked connections +** list. +*/ +SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){ + void (*xUnlockNotify)(void **, int) = 0; /* Unlock-notify cb to invoke */ + int nArg = 0; /* Number of entries in aArg[] */ + sqlite3 **pp; /* Iterator variable */ + void **aArg; /* Arguments to the unlock callback */ + void **aDyn = 0; /* Dynamically allocated space for aArg[] */ + void *aStatic[16]; /* Starter space for aArg[]. No malloc required */ + + aArg = aStatic; + enterMutex(); /* Enter STATIC_MASTER mutex */ + + /* This loop runs once for each entry in the blocked-connections list. */ + for(pp=&sqlite3BlockedList; *pp; /* no-op */ ){ + sqlite3 *p = *pp; + + /* Step 1. */ + if( p->pBlockingConnection==db ){ + p->pBlockingConnection = 0; + } + + /* Step 2. */ + if( p->pUnlockConnection==db ){ + assert( p->xUnlockNotify ); + if( p->xUnlockNotify!=xUnlockNotify && nArg!=0 ){ + xUnlockNotify(aArg, nArg); + nArg = 0; + } + + sqlite3BeginBenignMalloc(); + assert( aArg==aDyn || (aDyn==0 && aArg==aStatic) ); + assert( nArg<=(int)ArraySize(aStatic) || aArg==aDyn ); + if( (!aDyn && nArg==(int)ArraySize(aStatic)) + || (aDyn && nArg==(int)(sqlite3MallocSize(aDyn)/sizeof(void*))) + ){ + /* The aArg[] array needs to grow. */ + void **pNew = (void **)sqlite3Malloc(nArg*sizeof(void *)*2); + if( pNew ){ + memcpy(pNew, aArg, nArg*sizeof(void *)); + sqlite3_free(aDyn); + aDyn = aArg = pNew; + }else{ + /* This occurs when the array of context pointers that need to + ** be passed to the unlock-notify callback is larger than the + ** aStatic[] array allocated on the stack and the attempt to + ** allocate a larger array from the heap has failed. + ** + ** This is a difficult situation to handle. Returning an error + ** code to the caller is insufficient, as even if an error code + ** is returned the transaction on connection db will still be + ** closed and the unlock-notify callbacks on blocked connections + ** will go unissued. This might cause the application to wait + ** indefinitely for an unlock-notify callback that will never + ** arrive. + ** + ** Instead, invoke the unlock-notify callback with the context + ** array already accumulated. We can then clear the array and + ** begin accumulating any further context pointers without + ** requiring any dynamic allocation. This is sub-optimal because + ** it means that instead of one callback with a large array of + ** context pointers the application will receive two or more + ** callbacks with smaller arrays of context pointers, which will + ** reduce the applications ability to prioritize multiple + ** connections. But it is the best that can be done under the + ** circumstances. + */ + xUnlockNotify(aArg, nArg); + nArg = 0; + } + } + sqlite3EndBenignMalloc(); + + aArg[nArg++] = p->pUnlockArg; + xUnlockNotify = p->xUnlockNotify; + p->pUnlockConnection = 0; + p->xUnlockNotify = 0; + p->pUnlockArg = 0; + } + + /* Step 3. */ + if( p->pBlockingConnection==0 && p->pUnlockConnection==0 ){ + /* Remove connection p from the blocked connections list. */ + *pp = p->pNextBlocked; + p->pNextBlocked = 0; + }else{ + pp = &p->pNextBlocked; + } + } + + if( nArg!=0 ){ + xUnlockNotify(aArg, nArg); + } + sqlite3_free(aDyn); + leaveMutex(); /* Leave STATIC_MASTER mutex */ +} + +/* +** This is called when the database connection passed as an argument is +** being closed. The connection is removed from the blocked list. +*/ +SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ + sqlite3ConnectionUnlocked(db); + enterMutex(); + removeFromBlockedList(db); + checkListProperties(db); + leaveMutex(); +} +#endif + +/************** End of notify.c **********************************************/ +/************** Begin file fts3.c ********************************************/ +/* +** 2006 Oct 10 +** +** 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 is an SQLite module implementing full-text search. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ + +/* The full-text index is stored in a series of b+tree (-like) +** structures called segments which map terms to doclists. The +** structures are like b+trees in layout, but are constructed from the +** bottom up in optimal fashion and are not updatable. Since trees +** are built from the bottom up, things will be described from the +** bottom up. +** +** +**** Varints **** +** The basic unit of encoding is a variable-length integer called a +** varint. We encode variable-length integers in little-endian order +** using seven bits * per byte as follows: +** +** KEY: +** A = 0xxxxxxx 7 bits of data and one flag bit +** B = 1xxxxxxx 7 bits of data and one flag bit +** +** 7 bits - A +** 14 bits - BA +** 21 bits - BBA +** and so on. +** +** This is similar in concept to how sqlite encodes "varints" but +** the encoding is not the same. SQLite varints are big-endian +** are are limited to 9 bytes in length whereas FTS3 varints are +** little-endian and can be up to 10 bytes in length (in theory). +** +** Example encodings: +** +** 1: 0x01 +** 127: 0x7f +** 128: 0x81 0x00 +** +** +**** Document lists **** +** A doclist (document list) holds a docid-sorted list of hits for a +** given term. Doclists hold docids and associated token positions. +** A docid is the unique integer identifier for a single document. +** A position is the index of a word within the document. The first +** word of the document has a position of 0. +** +** FTS3 used to optionally store character offsets using a compile-time +** option. But that functionality is no longer supported. +** +** A doclist is stored like this: +** +** array { +** varint docid; (delta from previous doclist) +** array { (position list for column 0) +** varint position; (2 more than the delta from previous position) +** } +** array { +** varint POS_COLUMN; (marks start of position list for new column) +** varint column; (index of new column) +** array { +** varint position; (2 more than the delta from previous position) +** } +** } +** varint POS_END; (marks end of positions for this document. +** } +** +** Here, array { X } means zero or more occurrences of X, adjacent in +** memory. A "position" is an index of a token in the token stream +** generated by the tokenizer. Note that POS_END and POS_COLUMN occur +** in the same logical place as the position element, and act as sentinals +** ending a position list array. POS_END is 0. POS_COLUMN is 1. +** The positions numbers are not stored literally but rather as two more +** than the difference from the prior position, or the just the position plus +** 2 for the first position. Example: +** +** label: A B C D E F G H I J K +** value: 123 5 9 1 1 14 35 0 234 72 0 +** +** The 123 value is the first docid. For column zero in this document +** there are two matches at positions 3 and 10 (5-2 and 9-2+3). The 1 +** at D signals the start of a new column; the 1 at E indicates that the +** new column is column number 1. There are two positions at 12 and 45 +** (14-2 and 35-2+12). The 0 at H indicate the end-of-document. The +** 234 at I is the delta to next docid (357). It has one position 70 +** (72-2) and then terminates with the 0 at K. +** +** A "position-list" is the list of positions for multiple columns for +** a single docid. A "column-list" is the set of positions for a single +** column. Hence, a position-list consists of one or more column-lists, +** a document record consists of a docid followed by a position-list and +** a doclist consists of one or more document records. +** +** A bare doclist omits the position information, becoming an +** array of varint-encoded docids. +** +**** Segment leaf nodes **** +** Segment leaf nodes store terms and doclists, ordered by term. Leaf +** nodes are written using LeafWriter, and read using LeafReader (to +** iterate through a single leaf node's data) and LeavesReader (to +** iterate through a segment's entire leaf layer). Leaf nodes have +** the format: +** +** varint iHeight; (height from leaf level, always 0) +** varint nTerm; (length of first term) +** char pTerm[nTerm]; (content of first term) +** varint nDoclist; (length of term's associated doclist) +** char pDoclist[nDoclist]; (content of doclist) +** array { +** (further terms are delta-encoded) +** varint nPrefix; (length of prefix shared with previous term) +** varint nSuffix; (length of unshared suffix) +** char pTermSuffix[nSuffix];(unshared suffix of next term) +** varint nDoclist; (length of term's associated doclist) +** char pDoclist[nDoclist]; (content of doclist) +** } +** +** Here, array { X } means zero or more occurrences of X, adjacent in +** memory. +** +** Leaf nodes are broken into blocks which are stored contiguously in +** the %_segments table in sorted order. This means that when the end +** of a node is reached, the next term is in the node with the next +** greater node id. +** +** New data is spilled to a new leaf node when the current node +** exceeds LEAF_MAX bytes (default 2048). New data which itself is +** larger than STANDALONE_MIN (default 1024) is placed in a standalone +** node (a leaf node with a single term and doclist). The goal of +** these settings is to pack together groups of small doclists while +** making it efficient to directly access large doclists. The +** assumption is that large doclists represent terms which are more +** likely to be query targets. +** +** TODO(shess) It may be useful for blocking decisions to be more +** dynamic. For instance, it may make more sense to have a 2.5k leaf +** node rather than splitting into 2k and .5k nodes. My intuition is +** that this might extend through 2x or 4x the pagesize. +** +** +**** Segment interior nodes **** +** Segment interior nodes store blockids for subtree nodes and terms +** to describe what data is stored by the each subtree. Interior +** nodes are written using InteriorWriter, and read using +** InteriorReader. InteriorWriters are created as needed when +** SegmentWriter creates new leaf nodes, or when an interior node +** itself grows too big and must be split. The format of interior +** nodes: +** +** varint iHeight; (height from leaf level, always >0) +** varint iBlockid; (block id of node's leftmost subtree) +** optional { +** varint nTerm; (length of first term) +** char pTerm[nTerm]; (content of first term) +** array { +** (further terms are delta-encoded) +** varint nPrefix; (length of shared prefix with previous term) +** varint nSuffix; (length of unshared suffix) +** char pTermSuffix[nSuffix]; (unshared suffix of next term) +** } +** } +** +** Here, optional { X } means an optional element, while array { X } +** means zero or more occurrences of X, adjacent in memory. +** +** An interior node encodes n terms separating n+1 subtrees. The +** subtree blocks are contiguous, so only the first subtree's blockid +** is encoded. The subtree at iBlockid will contain all terms less +** than the first term encoded (or all terms if no term is encoded). +** Otherwise, for terms greater than or equal to pTerm[i] but less +** than pTerm[i+1], the subtree for that term will be rooted at +** iBlockid+i. Interior nodes only store enough term data to +** distinguish adjacent children (if the rightmost term of the left +** child is "something", and the leftmost term of the right child is +** "wicked", only "w" is stored). +** +** New data is spilled to a new interior node at the same height when +** the current node exceeds INTERIOR_MAX bytes (default 2048). +** INTERIOR_MIN_TERMS (default 7) keeps large terms from monopolizing +** interior nodes and making the tree too skinny. The interior nodes +** at a given height are naturally tracked by interior nodes at +** height+1, and so on. +** +** +**** Segment directory **** +** The segment directory in table %_segdir stores meta-information for +** merging and deleting segments, and also the root node of the +** segment's tree. +** +** The root node is the top node of the segment's tree after encoding +** the entire segment, restricted to ROOT_MAX bytes (default 1024). +** This could be either a leaf node or an interior node. If the top +** node requires more than ROOT_MAX bytes, it is flushed to %_segments +** and a new root interior node is generated (which should always fit +** within ROOT_MAX because it only needs space for 2 varints, the +** height and the blockid of the previous root). +** +** The meta-information in the segment directory is: +** level - segment level (see below) +** idx - index within level +** - (level,idx uniquely identify a segment) +** start_block - first leaf node +** leaves_end_block - last leaf node +** end_block - last block (including interior nodes) +** root - contents of root node +** +** If the root node is a leaf node, then start_block, +** leaves_end_block, and end_block are all 0. +** +** +**** Segment merging **** +** To amortize update costs, segments are grouped into levels and +** merged in batches. Each increase in level represents exponentially +** more documents. +** +** New documents (actually, document updates) are tokenized and +** written individually (using LeafWriter) to a level 0 segment, with +** incrementing idx. When idx reaches MERGE_COUNT (default 16), all +** level 0 segments are merged into a single level 1 segment. Level 1 +** is populated like level 0, and eventually MERGE_COUNT level 1 +** segments are merged to a single level 2 segment (representing +** MERGE_COUNT^2 updates), and so on. +** +** A segment merge traverses all segments at a given level in +** parallel, performing a straightforward sorted merge. Since segment +** leaf nodes are written in to the %_segments table in order, this +** merge traverses the underlying sqlite disk structures efficiently. +** After the merge, all segment blocks from the merged level are +** deleted. +** +** MERGE_COUNT controls how often we merge segments. 16 seems to be +** somewhat of a sweet spot for insertion performance. 32 and 64 show +** very similar performance numbers to 16 on insertion, though they're +** a tiny bit slower (perhaps due to more overhead in merge-time +** sorting). 8 is about 20% slower than 16, 4 about 50% slower than +** 16, 2 about 66% slower than 16. +** +** At query time, high MERGE_COUNT increases the number of segments +** which need to be scanned and merged. For instance, with 100k docs +** inserted: +** +** MERGE_COUNT segments +** 16 25 +** 8 12 +** 4 10 +** 2 6 +** +** This appears to have only a moderate impact on queries for very +** frequent terms (which are somewhat dominated by segment merge +** costs), and infrequent and non-existent terms still seem to be fast +** even with many segments. +** +** TODO(shess) That said, it would be nice to have a better query-side +** argument for MERGE_COUNT of 16. Also, it is possible/likely that +** optimizations to things like doclist merging will swing the sweet +** spot around. +** +** +** +**** Handling of deletions and updates **** +** Since we're using a segmented structure, with no docid-oriented +** index into the term index, we clearly cannot simply update the term +** index when a document is deleted or updated. For deletions, we +** write an empty doclist (varint(docid) varint(POS_END)), for updates +** we simply write the new doclist. Segment merges overwrite older +** data for a particular docid with newer data, so deletes or updates +** will eventually overtake the earlier data and knock it out. The +** query logic likewise merges doclists so that newer data knocks out +** older data. +*/ + +/************** Include fts3Int.h in the middle of fts3.c ********************/ +/************** Begin file fts3Int.h *****************************************/ +/* +** 2009 Nov 12 +** +** 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. +** +****************************************************************************** +** +*/ +#ifndef _FTSINT_H +#define _FTSINT_H + +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + +/* FTS3/FTS4 require virtual tables */ +#ifdef SQLITE_OMIT_VIRTUALTABLE +# undef SQLITE_ENABLE_FTS3 +# undef SQLITE_ENABLE_FTS4 +#endif + +/* +** FTS4 is really an extension for FTS3. It is enabled using the +** SQLITE_ENABLE_FTS3 macro. But to avoid confusion we also all +** the SQLITE_ENABLE_FTS4 macro to serve as an alisse for SQLITE_ENABLE_FTS3. +*/ +#if defined(SQLITE_ENABLE_FTS4) && !defined(SQLITE_ENABLE_FTS3) +# define SQLITE_ENABLE_FTS3 +#endif + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* If not building as part of the core, include sqlite3ext.h. */ +#ifndef SQLITE_CORE +/* # include "sqlite3ext.h" */ +SQLITE_EXTENSION_INIT3 +#endif + +/* #include "sqlite3.h" */ +/************** Include fts3_tokenizer.h in the middle of fts3Int.h **********/ +/************** Begin file fts3_tokenizer.h **********************************/ +/* +** 2006 July 10 +** +** The author disclaims copyright to this source code. +** +************************************************************************* +** Defines the interface to tokenizers used by fulltext-search. There +** are three basic components: +** +** sqlite3_tokenizer_module is a singleton defining the tokenizer +** interface functions. This is essentially the class structure for +** tokenizers. +** +** sqlite3_tokenizer is used to define a particular tokenizer, perhaps +** including customization information defined at creation time. +** +** sqlite3_tokenizer_cursor is generated by a tokenizer to generate +** tokens from a particular input. +*/ +#ifndef _FTS3_TOKENIZER_H_ +#define _FTS3_TOKENIZER_H_ + +/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. +** If tokenizers are to be allowed to call sqlite3_*() functions, then +** we will need a way to register the API consistently. +*/ +/* #include "sqlite3.h" */ + +/* +** Structures used by the tokenizer interface. When a new tokenizer +** implementation is registered, the caller provides a pointer to +** an sqlite3_tokenizer_module containing pointers to the callback +** functions that make up an implementation. +** +** When an fts3 table is created, it passes any arguments passed to +** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the +** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer +** implementation. The xCreate() function in turn returns an +** sqlite3_tokenizer structure representing the specific tokenizer to +** be used for the fts3 table (customized by the tokenizer clause arguments). +** +** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() +** method is called. It returns an sqlite3_tokenizer_cursor object +** that may be used to tokenize a specific input buffer based on +** the tokenization rules supplied by a specific sqlite3_tokenizer +** object. +*/ +typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; +typedef struct sqlite3_tokenizer sqlite3_tokenizer; +typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; + +struct sqlite3_tokenizer_module { + + /* + ** Structure version. Should always be set to 0 or 1. + */ + int iVersion; + + /* + ** Create a new tokenizer. The values in the argv[] array are the + ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL + ** TABLE statement that created the fts3 table. For example, if + ** the following SQL is executed: + ** + ** CREATE .. USING fts3( ... , tokenizer arg1 arg2) + ** + ** then argc is set to 2, and the argv[] array contains pointers + ** to the strings "arg1" and "arg2". + ** + ** This method should return either SQLITE_OK (0), or an SQLite error + ** code. If SQLITE_OK is returned, then *ppTokenizer should be set + ** to point at the newly created tokenizer structure. The generic + ** sqlite3_tokenizer.pModule variable should not be initialized by + ** this callback. The caller will do so. + */ + int (*xCreate)( + int argc, /* Size of argv array */ + const char *const*argv, /* Tokenizer argument strings */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ + ); + + /* + ** Destroy an existing tokenizer. The fts3 module calls this method + ** exactly once for each successful call to xCreate(). + */ + int (*xDestroy)(sqlite3_tokenizer *pTokenizer); + + /* + ** Create a tokenizer cursor to tokenize an input buffer. The caller + ** is responsible for ensuring that the input buffer remains valid + ** until the cursor is closed (using the xClose() method). + */ + int (*xOpen)( + sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ + const char *pInput, int nBytes, /* Input buffer */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ + ); + + /* + ** Destroy an existing tokenizer cursor. The fts3 module calls this + ** method exactly once for each successful call to xOpen(). + */ + int (*xClose)(sqlite3_tokenizer_cursor *pCursor); + + /* + ** Retrieve the next token from the tokenizer cursor pCursor. This + ** method should either return SQLITE_OK and set the values of the + ** "OUT" variables identified below, or SQLITE_DONE to indicate that + ** the end of the buffer has been reached, or an SQLite error code. + ** + ** *ppToken should be set to point at a buffer containing the + ** normalized version of the token (i.e. after any case-folding and/or + ** stemming has been performed). *pnBytes should be set to the length + ** of this buffer in bytes. The input text that generated the token is + ** identified by the byte offsets returned in *piStartOffset and + ** *piEndOffset. *piStartOffset should be set to the index of the first + ** byte of the token in the input buffer. *piEndOffset should be set + ** to the index of the first byte just past the end of the token in + ** the input buffer. + ** + ** The buffer *ppToken is set to point at is managed by the tokenizer + ** implementation. It is only required to be valid until the next call + ** to xNext() or xClose(). + */ + /* TODO(shess) current implementation requires pInput to be + ** nul-terminated. This should either be fixed, or pInput/nBytes + ** should be converted to zInput. + */ + int (*xNext)( + sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ + const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ + int *piStartOffset, /* OUT: Byte offset of token in input buffer */ + int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ + int *piPosition /* OUT: Number of tokens returned before this one */ + ); + + /*********************************************************************** + ** Methods below this point are only available if iVersion>=1. + */ + + /* + ** Configure the language id of a tokenizer cursor. + */ + int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid); +}; + +struct sqlite3_tokenizer { + const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ + /* Tokenizer implementations will typically add additional fields */ +}; + +struct sqlite3_tokenizer_cursor { + sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ + /* Tokenizer implementations will typically add additional fields */ +}; + +int fts3_global_term_cnt(int iTerm, int iCol); +int fts3_term_cnt(int iTerm, int iCol); + + +#endif /* _FTS3_TOKENIZER_H_ */ + +/************** End of fts3_tokenizer.h **************************************/ +/************** Continuing where we left off in fts3Int.h ********************/ +/************** Include fts3_hash.h in the middle of fts3Int.h ***************/ +/************** Begin file fts3_hash.h ***************************************/ +/* +** 2001 September 22 +** +** 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 is the header file for the generic hash-table implementation +** used in SQLite. We've modified it slightly to serve as a standalone +** hash table implementation for the full-text indexing module. +** +*/ +#ifndef _FTS3_HASH_H_ +#define _FTS3_HASH_H_ + +/* Forward declarations of structures. */ +typedef struct Fts3Hash Fts3Hash; +typedef struct Fts3HashElem Fts3HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, many of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +*/ +struct Fts3Hash { + char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */ + char copyKey; /* True if copy of key made on insert */ + int count; /* Number of entries in this table */ + Fts3HashElem *first; /* The first element of the array */ + int htsize; /* Number of buckets in the hash table */ + struct _fts3ht { /* the hash table */ + int count; /* Number of entries with this hash */ + Fts3HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct Fts3HashElem { + Fts3HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + void *pKey; int nKey; /* Key associated with this element */ +}; + +/* +** There are 2 different modes of operation for a hash table: +** +** FTS3_HASH_STRING pKey points to a string that is nKey bytes long +** (including the null-terminator, if any). Case +** is respected in comparisons. +** +** FTS3_HASH_BINARY pKey points to binary data nKey bytes long. +** memcmp() is used to compare keys. +** +** A copy of the key is made if the copyKey parameter to fts3HashInit is 1. +*/ +#define FTS3_HASH_STRING 1 +#define FTS3_HASH_BINARY 2 + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +SQLITE_PRIVATE void sqlite3Fts3HashInit(Fts3Hash *pNew, char keyClass, char copyKey); +SQLITE_PRIVATE void *sqlite3Fts3HashInsert(Fts3Hash*, const void *pKey, int nKey, void *pData); +SQLITE_PRIVATE void *sqlite3Fts3HashFind(const Fts3Hash*, const void *pKey, int nKey); +SQLITE_PRIVATE void sqlite3Fts3HashClear(Fts3Hash*); +SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const void *, int); + +/* +** Shorthand for the functions above +*/ +#define fts3HashInit sqlite3Fts3HashInit +#define fts3HashInsert sqlite3Fts3HashInsert +#define fts3HashFind sqlite3Fts3HashFind +#define fts3HashClear sqlite3Fts3HashClear +#define fts3HashFindElem sqlite3Fts3HashFindElem + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** Fts3Hash h; +** Fts3HashElem *p; +** ... +** for(p=fts3HashFirst(&h); p; p=fts3HashNext(p)){ +** SomeStructure *pData = fts3HashData(p); +** // do something with pData +** } +*/ +#define fts3HashFirst(H) ((H)->first) +#define fts3HashNext(E) ((E)->next) +#define fts3HashData(E) ((E)->data) +#define fts3HashKey(E) ((E)->pKey) +#define fts3HashKeysize(E) ((E)->nKey) + +/* +** Number of entries in a hash table +*/ +#define fts3HashCount(H) ((H)->count) + +#endif /* _FTS3_HASH_H_ */ + +/************** End of fts3_hash.h *******************************************/ +/************** Continuing where we left off in fts3Int.h ********************/ + +/* +** This constant determines the maximum depth of an FTS expression tree +** that the library will create and use. FTS uses recursion to perform +** various operations on the query tree, so the disadvantage of a large +** limit is that it may allow very large queries to use large amounts +** of stack space (perhaps causing a stack overflow). +*/ +#ifndef SQLITE_FTS3_MAX_EXPR_DEPTH +# define SQLITE_FTS3_MAX_EXPR_DEPTH 12 +#endif + + +/* +** This constant controls how often segments are merged. Once there are +** FTS3_MERGE_COUNT segments of level N, they are merged into a single +** segment of level N+1. +*/ +#define FTS3_MERGE_COUNT 16 + +/* +** This is the maximum amount of data (in bytes) to store in the +** Fts3Table.pendingTerms hash table. Normally, the hash table is +** populated as documents are inserted/updated/deleted in a transaction +** and used to create a new segment when the transaction is committed. +** However if this limit is reached midway through a transaction, a new +** segment is created and the hash table cleared immediately. +*/ +#define FTS3_MAX_PENDING_DATA (1*1024*1024) + +/* +** Macro to return the number of elements in an array. SQLite has a +** similar macro called ArraySize(). Use a different name to avoid +** a collision when building an amalgamation with built-in FTS3. +*/ +#define SizeofArray(X) ((int)(sizeof(X)/sizeof(X[0]))) + + +#ifndef MIN +# define MIN(x,y) ((x)<(y)?(x):(y)) +#endif +#ifndef MAX +# define MAX(x,y) ((x)>(y)?(x):(y)) +#endif + +/* +** Maximum length of a varint encoded integer. The varint format is different +** from that used by SQLite, so the maximum length is 10, not 9. +*/ +#define FTS3_VARINT_MAX 10 + +#define FTS3_BUFFER_PADDING 8 + +/* +** FTS4 virtual tables may maintain multiple indexes - one index of all terms +** in the document set and zero or more prefix indexes. All indexes are stored +** as one or more b+-trees in the %_segments and %_segdir tables. +** +** It is possible to determine which index a b+-tree belongs to based on the +** value stored in the "%_segdir.level" column. Given this value L, the index +** that the b+-tree belongs to is (L<<10). In other words, all b+-trees with +** level values between 0 and 1023 (inclusive) belong to index 0, all levels +** between 1024 and 2047 to index 1, and so on. +** +** It is considered impossible for an index to use more than 1024 levels. In +** theory though this may happen, but only after at least +** (FTS3_MERGE_COUNT^1024) separate flushes of the pending-terms tables. +*/ +#define FTS3_SEGDIR_MAXLEVEL 1024 +#define FTS3_SEGDIR_MAXLEVEL_STR "1024" + +/* +** The testcase() macro is only used by the amalgamation. If undefined, +** make it a no-op. +*/ +#ifndef testcase +# define testcase(X) +#endif + +/* +** Terminator values for position-lists and column-lists. +*/ +#define POS_COLUMN (1) /* Column-list terminator */ +#define POS_END (0) /* Position-list terminator */ + +/* +** The assert_fts3_nc() macro is similar to the assert() macro, except that it +** is used for assert() conditions that are true only if it can be +** guranteed that the database is not corrupt. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_fts3_may_be_corrupt; +# define assert_fts3_nc(x) assert(sqlite3_fts3_may_be_corrupt || (x)) +#else +# define assert_fts3_nc(x) assert(x) +#endif + +/* +** This section provides definitions to allow the +** FTS3 extension to be compiled outside of the +** amalgamation. +*/ +#ifndef SQLITE_AMALGAMATION +/* +** Macros indicating that conditional expressions are always true or +** false. +*/ +#ifdef SQLITE_COVERAGE_TEST +# define ALWAYS(x) (1) +# define NEVER(X) (0) +#elif defined(SQLITE_DEBUG) +# define ALWAYS(x) sqlite3Fts3Always((x)!=0) +# define NEVER(x) sqlite3Fts3Never((x)!=0) +SQLITE_PRIVATE int sqlite3Fts3Always(int b); +SQLITE_PRIVATE int sqlite3Fts3Never(int b); +#else +# define ALWAYS(x) (x) +# define NEVER(x) (x) +#endif + +/* +** Internal types used by SQLite. +*/ +typedef unsigned char u8; /* 1-byte (or larger) unsigned integer */ +typedef short int i16; /* 2-byte (or larger) signed integer */ +typedef unsigned int u32; /* 4-byte unsigned integer */ +typedef sqlite3_uint64 u64; /* 8-byte unsigned integer */ +typedef sqlite3_int64 i64; /* 8-byte signed integer */ + +/* +** Macro used to suppress compiler warnings for unused parameters. +*/ +#define UNUSED_PARAMETER(x) (void)(x) + +/* +** Activate assert() only if SQLITE_TEST is enabled. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + +/* +** The TESTONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within testcase() and assert() macros. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) +# define TESTONLY(X) X +#else +# define TESTONLY(X) +#endif + +#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) +#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) + +#endif /* SQLITE_AMALGAMATION */ + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3Fts3Corrupt(void); +# define FTS_CORRUPT_VTAB sqlite3Fts3Corrupt() +#else +# define FTS_CORRUPT_VTAB SQLITE_CORRUPT_VTAB +#endif + +typedef struct Fts3Table Fts3Table; +typedef struct Fts3Cursor Fts3Cursor; +typedef struct Fts3Expr Fts3Expr; +typedef struct Fts3Phrase Fts3Phrase; +typedef struct Fts3PhraseToken Fts3PhraseToken; + +typedef struct Fts3Doclist Fts3Doclist; +typedef struct Fts3SegFilter Fts3SegFilter; +typedef struct Fts3DeferredToken Fts3DeferredToken; +typedef struct Fts3SegReader Fts3SegReader; +typedef struct Fts3MultiSegReader Fts3MultiSegReader; + +typedef struct MatchinfoBuffer MatchinfoBuffer; + +/* +** A connection to a fulltext index is an instance of the following +** structure. The xCreate and xConnect methods create an instance +** of this structure and xDestroy and xDisconnect free that instance. +** All other methods receive a pointer to the structure as one of their +** arguments. +*/ +struct Fts3Table { + sqlite3_vtab base; /* Base class used by SQLite core */ + sqlite3 *db; /* The database connection */ + const char *zDb; /* logical database name */ + const char *zName; /* virtual table name */ + int nColumn; /* number of named columns in virtual table */ + char **azColumn; /* column names. malloced */ + u8 *abNotindexed; /* True for 'notindexed' columns */ + sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ + char *zContentTbl; /* content=xxx option, or NULL */ + char *zLanguageid; /* languageid=xxx option, or NULL */ + int nAutoincrmerge; /* Value configured by 'automerge' */ + u32 nLeafAdd; /* Number of leaf blocks added this trans */ + int bLock; /* Used to prevent recursive content= tbls */ + + /* Precompiled statements used by the implementation. Each of these + ** statements is run and reset within a single virtual table API call. + */ + sqlite3_stmt *aStmt[40]; + sqlite3_stmt *pSeekStmt; /* Cache for fts3CursorSeekStmt() */ + + char *zReadExprlist; + char *zWriteExprlist; + + int nNodeSize; /* Soft limit for node size */ + u8 bFts4; /* True for FTS4, false for FTS3 */ + u8 bHasStat; /* True if %_stat table exists (2==unknown) */ + u8 bHasDocsize; /* True if %_docsize table exists */ + u8 bDescIdx; /* True if doclists are in reverse order */ + u8 bIgnoreSavepoint; /* True to ignore xSavepoint invocations */ + int nPgsz; /* Page size for host database */ + char *zSegmentsTbl; /* Name of %_segments table */ + sqlite3_blob *pSegments; /* Blob handle open on %_segments table */ + + /* + ** The following array of hash tables is used to buffer pending index + ** updates during transactions. All pending updates buffered at any one + ** time must share a common language-id (see the FTS4 langid= feature). + ** The current language id is stored in variable iPrevLangid. + ** + ** A single FTS4 table may have multiple full-text indexes. For each index + ** there is an entry in the aIndex[] array. Index 0 is an index of all the + ** terms that appear in the document set. Each subsequent index in aIndex[] + ** is an index of prefixes of a specific length. + ** + ** Variable nPendingData contains an estimate the memory consumed by the + ** pending data structures, including hash table overhead, but not including + ** malloc overhead. When nPendingData exceeds nMaxPendingData, all hash + ** tables are flushed to disk. Variable iPrevDocid is the docid of the most + ** recently inserted record. + */ + int nIndex; /* Size of aIndex[] */ + struct Fts3Index { + int nPrefix; /* Prefix length (0 for main terms index) */ + Fts3Hash hPending; /* Pending terms table for this index */ + } *aIndex; + int nMaxPendingData; /* Max pending data before flush to disk */ + int nPendingData; /* Current bytes of pending data */ + sqlite_int64 iPrevDocid; /* Docid of most recently inserted document */ + int iPrevLangid; /* Langid of recently inserted document */ + int bPrevDelete; /* True if last operation was a delete */ + +#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) + /* State variables used for validating that the transaction control + ** methods of the virtual table are called at appropriate times. These + ** values do not contribute to FTS functionality; they are used for + ** verifying the operation of the SQLite core. + */ + int inTransaction; /* True after xBegin but before xCommit/xRollback */ + int mxSavepoint; /* Largest valid xSavepoint integer */ +#endif + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* True to disable the incremental doclist optimization. This is controled + ** by special insert command 'test-no-incr-doclist'. */ + int bNoIncrDoclist; + + /* Number of segments in a level */ + int nMergeCount; +#endif +}; + +/* Macro to find the number of segments to merge */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) +# define MergeCount(P) ((P)->nMergeCount) +#else +# define MergeCount(P) FTS3_MERGE_COUNT +#endif + +/* +** When the core wants to read from the virtual table, it creates a +** virtual table cursor (an instance of the following structure) using +** the xOpen method. Cursors are destroyed using the xClose method. +*/ +struct Fts3Cursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + i16 eSearch; /* Search strategy (see below) */ + u8 isEof; /* True if at End Of Results */ + u8 isRequireSeek; /* True if must seek pStmt to %_content row */ + u8 bSeekStmt; /* True if pStmt is a seek */ + sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ + Fts3Expr *pExpr; /* Parsed MATCH query string */ + int iLangid; /* Language being queried for */ + int nPhrase; /* Number of matchable phrases in query */ + Fts3DeferredToken *pDeferred; /* Deferred search tokens, if any */ + sqlite3_int64 iPrevId; /* Previous id read from aDoclist */ + char *pNextId; /* Pointer into the body of aDoclist */ + char *aDoclist; /* List of docids for full-text queries */ + int nDoclist; /* Size of buffer at aDoclist */ + u8 bDesc; /* True to sort in descending order */ + int eEvalmode; /* An FTS3_EVAL_XX constant */ + int nRowAvg; /* Average size of database rows, in pages */ + sqlite3_int64 nDoc; /* Documents in table */ + i64 iMinDocid; /* Minimum docid to return */ + i64 iMaxDocid; /* Maximum docid to return */ + int isMatchinfoNeeded; /* True when aMatchinfo[] needs filling in */ + MatchinfoBuffer *pMIBuffer; /* Buffer for matchinfo data */ +}; + +#define FTS3_EVAL_FILTER 0 +#define FTS3_EVAL_NEXT 1 +#define FTS3_EVAL_MATCHINFO 2 + +/* +** The Fts3Cursor.eSearch member is always set to one of the following. +** Actualy, Fts3Cursor.eSearch can be greater than or equal to +** FTS3_FULLTEXT_SEARCH. If so, then Fts3Cursor.eSearch - 2 is the index +** of the column to be searched. For example, in +** +** CREATE VIRTUAL TABLE ex1 USING fts3(a,b,c,d); +** SELECT docid FROM ex1 WHERE b MATCH 'one two three'; +** +** Because the LHS of the MATCH operator is 2nd column "b", +** Fts3Cursor.eSearch will be set to FTS3_FULLTEXT_SEARCH+1. (+0 for a, +** +1 for b, +2 for c, +3 for d.) If the LHS of MATCH were "ex1" +** indicating that all columns should be searched, +** then eSearch would be set to FTS3_FULLTEXT_SEARCH+4. +*/ +#define FTS3_FULLSCAN_SEARCH 0 /* Linear scan of %_content table */ +#define FTS3_DOCID_SEARCH 1 /* Lookup by rowid on %_content table */ +#define FTS3_FULLTEXT_SEARCH 2 /* Full-text index search */ + +/* +** The lower 16-bits of the sqlite3_index_info.idxNum value set by +** the xBestIndex() method contains the Fts3Cursor.eSearch value described +** above. The upper 16-bits contain a combination of the following +** bits, used to describe extra constraints on full-text searches. +*/ +#define FTS3_HAVE_LANGID 0x00010000 /* languageid=? */ +#define FTS3_HAVE_DOCID_GE 0x00020000 /* docid>=? */ +#define FTS3_HAVE_DOCID_LE 0x00040000 /* docid<=? */ + +struct Fts3Doclist { + char *aAll; /* Array containing doclist (or NULL) */ + int nAll; /* Size of a[] in bytes */ + char *pNextDocid; /* Pointer to next docid */ + + sqlite3_int64 iDocid; /* Current docid (if pList!=0) */ + int bFreeList; /* True if pList should be sqlite3_free()d */ + char *pList; /* Pointer to position list following iDocid */ + int nList; /* Length of position list */ +}; + +/* +** A "phrase" is a sequence of one or more tokens that must match in +** sequence. A single token is the base case and the most common case. +** For a sequence of tokens contained in double-quotes (i.e. "one two three") +** nToken will be the number of tokens in the string. +*/ +struct Fts3PhraseToken { + char *z; /* Text of the token */ + int n; /* Number of bytes in buffer z */ + int isPrefix; /* True if token ends with a "*" character */ + int bFirst; /* True if token must appear at position 0 */ + + /* Variables above this point are populated when the expression is + ** parsed (by code in fts3_expr.c). Below this point the variables are + ** used when evaluating the expression. */ + Fts3DeferredToken *pDeferred; /* Deferred token object for this token */ + Fts3MultiSegReader *pSegcsr; /* Segment-reader for this token */ +}; + +struct Fts3Phrase { + /* Cache of doclist for this phrase. */ + Fts3Doclist doclist; + int bIncr; /* True if doclist is loaded incrementally */ + int iDoclistToken; + + /* Used by sqlite3Fts3EvalPhrasePoslist() if this is a descendent of an + ** OR condition. */ + char *pOrPoslist; + i64 iOrDocid; + + /* Variables below this point are populated by fts3_expr.c when parsing + ** a MATCH expression. Everything above is part of the evaluation phase. + */ + int nToken; /* Number of tokens in the phrase */ + int iColumn; /* Index of column this phrase must match */ + Fts3PhraseToken aToken[1]; /* One entry for each token in the phrase */ +}; + +/* +** A tree of these objects forms the RHS of a MATCH operator. +** +** If Fts3Expr.eType is FTSQUERY_PHRASE and isLoaded is true, then aDoclist +** points to a malloced buffer, size nDoclist bytes, containing the results +** of this phrase query in FTS3 doclist format. As usual, the initial +** "Length" field found in doclists stored on disk is omitted from this +** buffer. +** +** Variable aMI is used only for FTSQUERY_NEAR nodes to store the global +** matchinfo data. If it is not NULL, it points to an array of size nCol*3, +** where nCol is the number of columns in the queried FTS table. The array +** is populated as follows: +** +** aMI[iCol*3 + 0] = Undefined +** aMI[iCol*3 + 1] = Number of occurrences +** aMI[iCol*3 + 2] = Number of rows containing at least one instance +** +** The aMI array is allocated using sqlite3_malloc(). It should be freed +** when the expression node is. +*/ +struct Fts3Expr { + int eType; /* One of the FTSQUERY_XXX values defined below */ + int nNear; /* Valid if eType==FTSQUERY_NEAR */ + Fts3Expr *pParent; /* pParent->pLeft==this or pParent->pRight==this */ + Fts3Expr *pLeft; /* Left operand */ + Fts3Expr *pRight; /* Right operand */ + Fts3Phrase *pPhrase; /* Valid if eType==FTSQUERY_PHRASE */ + + /* The following are used by the fts3_eval.c module. */ + sqlite3_int64 iDocid; /* Current docid */ + u8 bEof; /* True this expression is at EOF already */ + u8 bStart; /* True if iDocid is valid */ + u8 bDeferred; /* True if this expression is entirely deferred */ + + /* The following are used by the fts3_snippet.c module. */ + int iPhrase; /* Index of this phrase in matchinfo() results */ + u32 *aMI; /* See above */ +}; + +/* +** Candidate values for Fts3Query.eType. Note that the order of the first +** four values is in order of precedence when parsing expressions. For +** example, the following: +** +** "a OR b AND c NOT d NEAR e" +** +** is equivalent to: +** +** "a OR (b AND (c NOT (d NEAR e)))" +*/ +#define FTSQUERY_NEAR 1 +#define FTSQUERY_NOT 2 +#define FTSQUERY_AND 3 +#define FTSQUERY_OR 4 +#define FTSQUERY_PHRASE 5 + + +/* fts3_write.c */ +SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(sqlite3_vtab*,int,sqlite3_value**,sqlite3_int64*); +SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *); +SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *); +SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *); +SQLITE_PRIVATE int sqlite3Fts3SegReaderNew(int, int, sqlite3_int64, + sqlite3_int64, sqlite3_int64, const char *, int, Fts3SegReader**); +SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( + Fts3Table*,int,const char*,int,int,Fts3SegReader**); +SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *); +SQLITE_PRIVATE int sqlite3Fts3AllSegdirs(Fts3Table*, int, int, int, sqlite3_stmt **); +SQLITE_PRIVATE int sqlite3Fts3ReadBlock(Fts3Table*, sqlite3_int64, char **, int*, int*); + +SQLITE_PRIVATE int sqlite3Fts3SelectDoctotal(Fts3Table *, sqlite3_stmt **); +SQLITE_PRIVATE int sqlite3Fts3SelectDocsize(Fts3Table *, sqlite3_int64, sqlite3_stmt **); + +#ifndef SQLITE_DISABLE_FTS4_DEFERRED +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *); +SQLITE_PRIVATE int sqlite3Fts3DeferToken(Fts3Cursor *, Fts3PhraseToken *, int); +SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *); +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *); +SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList(Fts3DeferredToken *, char **, int *); +#else +# define sqlite3Fts3FreeDeferredTokens(x) +# define sqlite3Fts3DeferToken(x,y,z) SQLITE_OK +# define sqlite3Fts3CacheDeferredDoclists(x) SQLITE_OK +# define sqlite3Fts3FreeDeferredDoclists(x) +# define sqlite3Fts3DeferredTokenList(x,y,z) SQLITE_OK +#endif + +SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *); +SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table *, int *); + +/* Special values interpreted by sqlite3SegReaderCursor() */ +#define FTS3_SEGCURSOR_PENDING -1 +#define FTS3_SEGCURSOR_ALL -2 + +SQLITE_PRIVATE int sqlite3Fts3SegReaderStart(Fts3Table*, Fts3MultiSegReader*, Fts3SegFilter*); +SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(Fts3Table *, Fts3MultiSegReader *); +SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(Fts3MultiSegReader *); + +SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(Fts3Table *, + int, int, int, const char *, int, int, int, Fts3MultiSegReader *); + +/* Flags allowed as part of the 4th argument to SegmentReaderIterate() */ +#define FTS3_SEGMENT_REQUIRE_POS 0x00000001 +#define FTS3_SEGMENT_IGNORE_EMPTY 0x00000002 +#define FTS3_SEGMENT_COLUMN_FILTER 0x00000004 +#define FTS3_SEGMENT_PREFIX 0x00000008 +#define FTS3_SEGMENT_SCAN 0x00000010 +#define FTS3_SEGMENT_FIRST 0x00000020 + +/* Type passed as 4th argument to SegmentReaderIterate() */ +struct Fts3SegFilter { + const char *zTerm; + int nTerm; + int iCol; + int flags; +}; + +struct Fts3MultiSegReader { + /* Used internally by sqlite3Fts3SegReaderXXX() calls */ + Fts3SegReader **apSegment; /* Array of Fts3SegReader objects */ + int nSegment; /* Size of apSegment array */ + int nAdvance; /* How many seg-readers to advance */ + Fts3SegFilter *pFilter; /* Pointer to filter object */ + char *aBuffer; /* Buffer to merge doclists in */ + int nBuffer; /* Allocated size of aBuffer[] in bytes */ + + int iColFilter; /* If >=0, filter for this column */ + int bRestart; + + /* Used by fts3.c only. */ + int nCost; /* Cost of running iterator */ + int bLookup; /* True if a lookup of a single entry. */ + + /* Output values. Valid only after Fts3SegReaderStep() returns SQLITE_ROW. */ + char *zTerm; /* Pointer to term buffer */ + int nTerm; /* Size of zTerm in bytes */ + char *aDoclist; /* Pointer to doclist buffer */ + int nDoclist; /* Size of aDoclist[] in bytes */ +}; + +SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table*,int,int); + +#define fts3GetVarint32(p, piVal) ( \ + (*(u8*)(p)&0x80) ? sqlite3Fts3GetVarint32(p, piVal) : (*piVal=*(u8*)(p), 1) \ +) + +/* fts3.c */ +SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char**,const char*,...); +SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *, sqlite3_int64); +SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *, sqlite_int64 *); +SQLITE_PRIVATE int sqlite3Fts3GetVarintU(const char *, sqlite_uint64 *); +SQLITE_PRIVATE int sqlite3Fts3GetVarintBounded(const char*,const char*,sqlite3_int64*); +SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *, int *); +SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64); +SQLITE_PRIVATE void sqlite3Fts3Dequote(char *); +SQLITE_PRIVATE void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,int*,u8*); +SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *); +SQLITE_PRIVATE int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *); +SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int*, Fts3Table*); +SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc); +SQLITE_PRIVATE int sqlite3Fts3ReadInt(const char *z, int *pnOut); + +/* fts3_tokenizer.c */ +SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *, int *); +SQLITE_PRIVATE int sqlite3Fts3InitHashTable(sqlite3 *, Fts3Hash *, const char *); +SQLITE_PRIVATE int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, const char *, + sqlite3_tokenizer **, char ** +); +SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char); + +/* fts3_snippet.c */ +SQLITE_PRIVATE void sqlite3Fts3Offsets(sqlite3_context*, Fts3Cursor*); +SQLITE_PRIVATE void sqlite3Fts3Snippet(sqlite3_context *, Fts3Cursor *, const char *, + const char *, const char *, int, int +); +SQLITE_PRIVATE void sqlite3Fts3Matchinfo(sqlite3_context *, Fts3Cursor *, const char *); +SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p); + +/* fts3_expr.c */ +SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int, + char **, int, int, int, const char *, int, Fts3Expr **, char ** +); +SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *); +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash*); +SQLITE_PRIVATE int sqlite3Fts3InitTerm(sqlite3 *db); +#endif + +SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer(sqlite3_tokenizer *, int, const char *, int, + sqlite3_tokenizer_cursor ** +); + +/* fts3_aux.c */ +SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db); + +SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *); + +SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart( + Fts3Table*, Fts3MultiSegReader*, int, const char*, int); +SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( + Fts3Table *, Fts3MultiSegReader *, sqlite3_int64 *, char **, int *); +SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(Fts3Cursor *, Fts3Expr *, int iCol, char **); +SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(Fts3Cursor *, Fts3MultiSegReader *, int *); +SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr); + +/* fts3_tokenize_vtab.c */ +SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3*, Fts3Hash *); + +/* fts3_unicode2.c (functions generated by parsing unicode text files) */ +#ifndef SQLITE_DISABLE_FTS3_UNICODE +SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int, int); +SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int); +SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int); +#endif + +#endif /* !SQLITE_CORE || SQLITE_ENABLE_FTS3 */ +#endif /* _FTSINT_H */ + +/************** End of fts3Int.h *********************************************/ +/************** Continuing where we left off in fts3.c ***********************/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +#if defined(SQLITE_ENABLE_FTS3) && !defined(SQLITE_CORE) +# define SQLITE_CORE 1 +#endif + +/* #include */ +/* #include */ +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3.h" */ +#ifndef SQLITE_CORE +/* # include "sqlite3ext.h" */ + SQLITE_EXTENSION_INIT1 +#endif + +static int fts3EvalNext(Fts3Cursor *pCsr); +static int fts3EvalStart(Fts3Cursor *pCsr); +static int fts3TermSegReaderCursor( + Fts3Cursor *, const char *, int, int, Fts3MultiSegReader **); + +#ifndef SQLITE_AMALGAMATION +# if defined(SQLITE_DEBUG) +SQLITE_PRIVATE int sqlite3Fts3Always(int b) { assert( b ); return b; } +SQLITE_PRIVATE int sqlite3Fts3Never(int b) { assert( !b ); return b; } +# endif +#endif + +/* +** This variable is set to false when running tests for which the on disk +** structures should not be corrupt. Otherwise, true. If it is false, extra +** assert() conditions in the fts3 code are activated - conditions that are +** only true if it is guaranteed that the fts3 database is not corrupt. +*/ +SQLITE_API int sqlite3_fts3_may_be_corrupt = 1; + +/* +** Write a 64-bit variable-length integer to memory starting at p[0]. +** The length of data written will be between 1 and FTS3_VARINT_MAX bytes. +** The number of bytes written is returned. +*/ +SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){ + unsigned char *q = (unsigned char *) p; + sqlite_uint64 vu = v; + do{ + *q++ = (unsigned char) ((vu & 0x7f) | 0x80); + vu >>= 7; + }while( vu!=0 ); + q[-1] &= 0x7f; /* turn off high bit in final byte */ + assert( q - (unsigned char *)p <= FTS3_VARINT_MAX ); + return (int) (q - (unsigned char *)p); +} + +#define GETVARINT_STEP(v, ptr, shift, mask1, mask2, var, ret) \ + v = (v & mask1) | ( (*(const unsigned char*)(ptr++)) << shift ); \ + if( (v & mask2)==0 ){ var = v; return ret; } +#define GETVARINT_INIT(v, ptr, shift, mask1, mask2, var, ret) \ + v = (*ptr++); \ + if( (v & mask2)==0 ){ var = v; return ret; } + +SQLITE_PRIVATE int sqlite3Fts3GetVarintU(const char *pBuf, sqlite_uint64 *v){ + const unsigned char *p = (const unsigned char*)pBuf; + const unsigned char *pStart = p; + u32 a; + u64 b; + int shift; + + GETVARINT_INIT(a, p, 0, 0x00, 0x80, *v, 1); + GETVARINT_STEP(a, p, 7, 0x7F, 0x4000, *v, 2); + GETVARINT_STEP(a, p, 14, 0x3FFF, 0x200000, *v, 3); + GETVARINT_STEP(a, p, 21, 0x1FFFFF, 0x10000000, *v, 4); + b = (a & 0x0FFFFFFF ); + + for(shift=28; shift<=63; shift+=7){ + u64 c = *p++; + b += (c&0x7F) << shift; + if( (c & 0x80)==0 ) break; + } + *v = b; + return (int)(p - pStart); +} + +/* +** Read a 64-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read, or 0 on error. +** The value is stored in *v. +*/ +SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ + return sqlite3Fts3GetVarintU(pBuf, (sqlite3_uint64*)v); +} + +/* +** Read a 64-bit variable-length integer from memory starting at p[0] and +** not extending past pEnd[-1]. +** Return the number of bytes read, or 0 on error. +** The value is stored in *v. +*/ +SQLITE_PRIVATE int sqlite3Fts3GetVarintBounded( + const char *pBuf, + const char *pEnd, + sqlite_int64 *v +){ + const unsigned char *p = (const unsigned char*)pBuf; + const unsigned char *pStart = p; + const unsigned char *pX = (const unsigned char*)pEnd; + u64 b = 0; + int shift; + for(shift=0; shift<=63; shift+=7){ + u64 c = p=0 ); + return 5; +} + +/* +** Return the number of bytes required to encode v as a varint +*/ +SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64 v){ + int i = 0; + do{ + i++; + v >>= 7; + }while( v!=0 ); + return i; +} + +/* +** Convert an SQL-style quoted string into a normal string by removing +** the quote characters. The conversion is done in-place. If the +** input does not begin with a quote character, then this routine +** is a no-op. +** +** Examples: +** +** "abc" becomes abc +** 'xyz' becomes xyz +** [pqr] becomes pqr +** `mno` becomes mno +** +*/ +SQLITE_PRIVATE void sqlite3Fts3Dequote(char *z){ + char quote; /* Quote character (if any ) */ + + quote = z[0]; + if( quote=='[' || quote=='\'' || quote=='"' || quote=='`' ){ + int iIn = 1; /* Index of next byte to read from input */ + int iOut = 0; /* Index of next byte to write to output */ + + /* If the first byte was a '[', then the close-quote character is a ']' */ + if( quote=='[' ) quote = ']'; + + while( z[iIn] ){ + if( z[iIn]==quote ){ + if( z[iIn+1]!=quote ) break; + z[iOut++] = quote; + iIn += 2; + }else{ + z[iOut++] = z[iIn++]; + } + } + z[iOut] = '\0'; + } +} + +/* +** Read a single varint from the doclist at *pp and advance *pp to point +** to the first byte past the end of the varint. Add the value of the varint +** to *pVal. +*/ +static void fts3GetDeltaVarint(char **pp, sqlite3_int64 *pVal){ + sqlite3_int64 iVal; + *pp += sqlite3Fts3GetVarint(*pp, &iVal); + *pVal += iVal; +} + +/* +** When this function is called, *pp points to the first byte following a +** varint that is part of a doclist (or position-list, or any other list +** of varints). This function moves *pp to point to the start of that varint, +** and sets *pVal by the varint value. +** +** Argument pStart points to the first byte of the doclist that the +** varint is part of. +*/ +static void fts3GetReverseVarint( + char **pp, + char *pStart, + sqlite3_int64 *pVal +){ + sqlite3_int64 iVal; + char *p; + + /* Pointer p now points at the first byte past the varint we are + ** interested in. So, unless the doclist is corrupt, the 0x80 bit is + ** clear on character p[-1]. */ + for(p = (*pp)-2; p>=pStart && *p&0x80; p--); + p++; + *pp = p; + + sqlite3Fts3GetVarint(p, &iVal); + *pVal = iVal; +} + +/* +** The xDisconnect() virtual table method. +*/ +static int fts3DisconnectMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table *)pVtab; + int i; + + assert( p->nPendingData==0 ); + assert( p->pSegments==0 ); + + /* Free any prepared statements held */ + sqlite3_finalize(p->pSeekStmt); + for(i=0; iaStmt); i++){ + sqlite3_finalize(p->aStmt[i]); + } + sqlite3_free(p->zSegmentsTbl); + sqlite3_free(p->zReadExprlist); + sqlite3_free(p->zWriteExprlist); + sqlite3_free(p->zContentTbl); + sqlite3_free(p->zLanguageid); + + /* Invoke the tokenizer destructor to free the tokenizer. */ + p->pTokenizer->pModule->xDestroy(p->pTokenizer); + + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Write an error message into *pzErr +*/ +SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char **pzErr, const char *zFormat, ...){ + va_list ap; + sqlite3_free(*pzErr); + va_start(ap, zFormat); + *pzErr = sqlite3_vmprintf(zFormat, ap); + va_end(ap); +} + +/* +** Construct one or more SQL statements from the format string given +** and then evaluate those statements. The success code is written +** into *pRc. +** +** If *pRc is initially non-zero then this routine is a no-op. +*/ +static void fts3DbExec( + int *pRc, /* Success code */ + sqlite3 *db, /* Database in which to run SQL */ + const char *zFormat, /* Format string for SQL */ + ... /* Arguments to the format string */ +){ + va_list ap; + char *zSql; + if( *pRc ) return; + va_start(ap, zFormat); + zSql = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + if( zSql==0 ){ + *pRc = SQLITE_NOMEM; + }else{ + *pRc = sqlite3_exec(db, zSql, 0, 0, 0); + sqlite3_free(zSql); + } +} + +/* +** The xDestroy() virtual table method. +*/ +static int fts3DestroyMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table *)pVtab; + int rc = SQLITE_OK; /* Return code */ + const char *zDb = p->zDb; /* Name of database (e.g. "main", "temp") */ + sqlite3 *db = p->db; /* Database handle */ + + /* Drop the shadow tables */ + fts3DbExec(&rc, db, + "DROP TABLE IF EXISTS %Q.'%q_segments';" + "DROP TABLE IF EXISTS %Q.'%q_segdir';" + "DROP TABLE IF EXISTS %Q.'%q_docsize';" + "DROP TABLE IF EXISTS %Q.'%q_stat';" + "%s DROP TABLE IF EXISTS %Q.'%q_content';", + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + (p->zContentTbl ? "--" : ""), zDb,p->zName + ); + + /* If everything has worked, invoke fts3DisconnectMethod() to free the + ** memory associated with the Fts3Table structure and return SQLITE_OK. + ** Otherwise, return an SQLite error code. + */ + return (rc==SQLITE_OK ? fts3DisconnectMethod(pVtab) : rc); +} + + +/* +** Invoke sqlite3_declare_vtab() to declare the schema for the FTS3 table +** passed as the first argument. This is done as part of the xConnect() +** and xCreate() methods. +** +** If *pRc is non-zero when this function is called, it is a no-op. +** Otherwise, if an error occurs, an SQLite error code is stored in *pRc +** before returning. +*/ +static void fts3DeclareVtab(int *pRc, Fts3Table *p){ + if( *pRc==SQLITE_OK ){ + int i; /* Iterator variable */ + int rc; /* Return code */ + char *zSql; /* SQL statement passed to declare_vtab() */ + char *zCols; /* List of user defined columns */ + const char *zLanguageid; + + zLanguageid = (p->zLanguageid ? p->zLanguageid : "__langid"); + sqlite3_vtab_config(p->db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + + /* Create a list of user columns for the virtual table */ + zCols = sqlite3_mprintf("%Q, ", p->azColumn[0]); + for(i=1; zCols && inColumn; i++){ + zCols = sqlite3_mprintf("%z%Q, ", zCols, p->azColumn[i]); + } + + /* Create the whole "CREATE TABLE" statement to pass to SQLite */ + zSql = sqlite3_mprintf( + "CREATE TABLE x(%s %Q HIDDEN, docid HIDDEN, %Q HIDDEN)", + zCols, p->zName, zLanguageid + ); + if( !zCols || !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_declare_vtab(p->db, zSql); + } + + sqlite3_free(zSql); + sqlite3_free(zCols); + *pRc = rc; + } +} + +/* +** Create the %_stat table if it does not already exist. +*/ +SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int *pRc, Fts3Table *p){ + fts3DbExec(pRc, p->db, + "CREATE TABLE IF NOT EXISTS %Q.'%q_stat'" + "(id INTEGER PRIMARY KEY, value BLOB);", + p->zDb, p->zName + ); + if( (*pRc)==SQLITE_OK ) p->bHasStat = 1; +} + +/* +** Create the backing store tables (%_content, %_segments and %_segdir) +** required by the FTS3 table passed as the only argument. This is done +** as part of the vtab xCreate() method. +** +** If the p->bHasDocsize boolean is true (indicating that this is an +** FTS4 table, not an FTS3 table) then also create the %_docsize and +** %_stat tables required by FTS4. +*/ +static int fts3CreateTables(Fts3Table *p){ + int rc = SQLITE_OK; /* Return code */ + int i; /* Iterator variable */ + sqlite3 *db = p->db; /* The database connection */ + + if( p->zContentTbl==0 ){ + const char *zLanguageid = p->zLanguageid; + char *zContentCols; /* Columns of %_content table */ + + /* Create a list of user columns for the content table */ + zContentCols = sqlite3_mprintf("docid INTEGER PRIMARY KEY"); + for(i=0; zContentCols && inColumn; i++){ + char *z = p->azColumn[i]; + zContentCols = sqlite3_mprintf("%z, 'c%d%q'", zContentCols, i, z); + } + if( zLanguageid && zContentCols ){ + zContentCols = sqlite3_mprintf("%z, langid", zContentCols, zLanguageid); + } + if( zContentCols==0 ) rc = SQLITE_NOMEM; + + /* Create the content table */ + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_content'(%s)", + p->zDb, p->zName, zContentCols + ); + sqlite3_free(zContentCols); + } + + /* Create other tables */ + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_segments'(blockid INTEGER PRIMARY KEY, block BLOB);", + p->zDb, p->zName + ); + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_segdir'(" + "level INTEGER," + "idx INTEGER," + "start_block INTEGER," + "leaves_end_block INTEGER," + "end_block INTEGER," + "root BLOB," + "PRIMARY KEY(level, idx)" + ");", + p->zDb, p->zName + ); + if( p->bHasDocsize ){ + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_docsize'(docid INTEGER PRIMARY KEY, size BLOB);", + p->zDb, p->zName + ); + } + assert( p->bHasStat==p->bFts4 ); + if( p->bHasStat ){ + sqlite3Fts3CreateStatTable(&rc, p); + } + return rc; +} + +/* +** Store the current database page-size in bytes in p->nPgsz. +** +** If *pRc is non-zero when this function is called, it is a no-op. +** Otherwise, if an error occurs, an SQLite error code is stored in *pRc +** before returning. +*/ +static void fts3DatabasePageSize(int *pRc, Fts3Table *p){ + if( *pRc==SQLITE_OK ){ + int rc; /* Return code */ + char *zSql; /* SQL text "PRAGMA %Q.page_size" */ + sqlite3_stmt *pStmt; /* Compiled "PRAGMA %Q.page_size" statement */ + + zSql = sqlite3_mprintf("PRAGMA %Q.page_size", p->zDb); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_step(pStmt); + p->nPgsz = sqlite3_column_int(pStmt, 0); + rc = sqlite3_finalize(pStmt); + }else if( rc==SQLITE_AUTH ){ + p->nPgsz = 1024; + rc = SQLITE_OK; + } + } + assert( p->nPgsz>0 || rc!=SQLITE_OK ); + sqlite3_free(zSql); + *pRc = rc; + } +} + +/* +** "Special" FTS4 arguments are column specifications of the following form: +** +** = +** +** There may not be whitespace surrounding the "=" character. The +** term may be quoted, but the may not. +*/ +static int fts3IsSpecialColumn( + const char *z, + int *pnKey, + char **pzValue +){ + char *zValue; + const char *zCsr = z; + + while( *zCsr!='=' ){ + if( *zCsr=='\0' ) return 0; + zCsr++; + } + + *pnKey = (int)(zCsr-z); + zValue = sqlite3_mprintf("%s", &zCsr[1]); + if( zValue ){ + sqlite3Fts3Dequote(zValue); + } + *pzValue = zValue; + return 1; +} + +/* +** Append the output of a printf() style formatting to an existing string. +*/ +static void fts3Appendf( + int *pRc, /* IN/OUT: Error code */ + char **pz, /* IN/OUT: Pointer to string buffer */ + const char *zFormat, /* Printf format string to append */ + ... /* Arguments for printf format string */ +){ + if( *pRc==SQLITE_OK ){ + va_list ap; + char *z; + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + if( z && *pz ){ + char *z2 = sqlite3_mprintf("%s%s", *pz, z); + sqlite3_free(z); + z = z2; + } + if( z==0 ) *pRc = SQLITE_NOMEM; + sqlite3_free(*pz); + *pz = z; + } +} + +/* +** Return a copy of input string zInput enclosed in double-quotes (") and +** with all double quote characters escaped. For example: +** +** fts3QuoteId("un \"zip\"") -> "un \"\"zip\"\"" +** +** The pointer returned points to memory obtained from sqlite3_malloc(). It +** is the callers responsibility to call sqlite3_free() to release this +** memory. +*/ +static char *fts3QuoteId(char const *zInput){ + sqlite3_int64 nRet; + char *zRet; + nRet = 2 + (int)strlen(zInput)*2 + 1; + zRet = sqlite3_malloc64(nRet); + if( zRet ){ + int i; + char *z = zRet; + *(z++) = '"'; + for(i=0; zInput[i]; i++){ + if( zInput[i]=='"' ) *(z++) = '"'; + *(z++) = zInput[i]; + } + *(z++) = '"'; + *(z++) = '\0'; + } + return zRet; +} + +/* +** Return a list of comma separated SQL expressions and a FROM clause that +** could be used in a SELECT statement such as the following: +** +** SELECT FROM %_content AS x ... +** +** to return the docid, followed by each column of text data in order +** from left to write. If parameter zFunc is not NULL, then instead of +** being returned directly each column of text data is passed to an SQL +** function named zFunc first. For example, if zFunc is "unzip" and the +** table has the three user-defined columns "a", "b", and "c", the following +** string is returned: +** +** "docid, unzip(x.'a'), unzip(x.'b'), unzip(x.'c') FROM %_content AS x" +** +** The pointer returned points to a buffer allocated by sqlite3_malloc(). It +** is the responsibility of the caller to eventually free it. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op (and +** a NULL pointer is returned). Otherwise, if an OOM error is encountered +** by this function, NULL is returned and *pRc is set to SQLITE_NOMEM. If +** no error occurs, *pRc is left unmodified. +*/ +static char *fts3ReadExprList(Fts3Table *p, const char *zFunc, int *pRc){ + char *zRet = 0; + char *zFree = 0; + char *zFunction; + int i; + + if( p->zContentTbl==0 ){ + if( !zFunc ){ + zFunction = ""; + }else{ + zFree = zFunction = fts3QuoteId(zFunc); + } + fts3Appendf(pRc, &zRet, "docid"); + for(i=0; inColumn; i++){ + fts3Appendf(pRc, &zRet, ",%s(x.'c%d%q')", zFunction, i, p->azColumn[i]); + } + if( p->zLanguageid ){ + fts3Appendf(pRc, &zRet, ", x.%Q", "langid"); + } + sqlite3_free(zFree); + }else{ + fts3Appendf(pRc, &zRet, "rowid"); + for(i=0; inColumn; i++){ + fts3Appendf(pRc, &zRet, ", x.'%q'", p->azColumn[i]); + } + if( p->zLanguageid ){ + fts3Appendf(pRc, &zRet, ", x.%Q", p->zLanguageid); + } + } + fts3Appendf(pRc, &zRet, " FROM '%q'.'%q%s' AS x", + p->zDb, + (p->zContentTbl ? p->zContentTbl : p->zName), + (p->zContentTbl ? "" : "_content") + ); + return zRet; +} + +/* +** Return a list of N comma separated question marks, where N is the number +** of columns in the %_content table (one for the docid plus one for each +** user-defined text column). +** +** If argument zFunc is not NULL, then all but the first question mark +** is preceded by zFunc and an open bracket, and followed by a closed +** bracket. For example, if zFunc is "zip" and the FTS3 table has three +** user-defined text columns, the following string is returned: +** +** "?, zip(?), zip(?), zip(?)" +** +** The pointer returned points to a buffer allocated by sqlite3_malloc(). It +** is the responsibility of the caller to eventually free it. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op (and +** a NULL pointer is returned). Otherwise, if an OOM error is encountered +** by this function, NULL is returned and *pRc is set to SQLITE_NOMEM. If +** no error occurs, *pRc is left unmodified. +*/ +static char *fts3WriteExprList(Fts3Table *p, const char *zFunc, int *pRc){ + char *zRet = 0; + char *zFree = 0; + char *zFunction; + int i; + + if( !zFunc ){ + zFunction = ""; + }else{ + zFree = zFunction = fts3QuoteId(zFunc); + } + fts3Appendf(pRc, &zRet, "?"); + for(i=0; inColumn; i++){ + fts3Appendf(pRc, &zRet, ",%s(?)", zFunction); + } + if( p->zLanguageid ){ + fts3Appendf(pRc, &zRet, ", ?"); + } + sqlite3_free(zFree); + return zRet; +} + +/* +** Buffer z contains a positive integer value encoded as utf-8 text. +** Decode this value and store it in *pnOut, returning the number of bytes +** consumed. If an overflow error occurs return a negative value. +*/ +SQLITE_PRIVATE int sqlite3Fts3ReadInt(const char *z, int *pnOut){ + u64 iVal = 0; + int i; + for(i=0; z[i]>='0' && z[i]<='9'; i++){ + iVal = iVal*10 + (z[i] - '0'); + if( iVal>0x7FFFFFFF ) return -1; + } + *pnOut = (int)iVal; + return i; +} + +/* +** This function interprets the string at (*pp) as a non-negative integer +** value. It reads the integer and sets *pnOut to the value read, then +** sets *pp to point to the byte immediately following the last byte of +** the integer value. +** +** Only decimal digits ('0'..'9') may be part of an integer value. +** +** If *pp does not being with a decimal digit SQLITE_ERROR is returned and +** the output value undefined. Otherwise SQLITE_OK is returned. +** +** This function is used when parsing the "prefix=" FTS4 parameter. +*/ +static int fts3GobbleInt(const char **pp, int *pnOut){ + const int MAX_NPREFIX = 10000000; + int nInt = 0; /* Output value */ + int nByte; + nByte = sqlite3Fts3ReadInt(*pp, &nInt); + if( nInt>MAX_NPREFIX ){ + nInt = 0; + } + if( nByte==0 ){ + return SQLITE_ERROR; + } + *pnOut = nInt; + *pp += nByte; + return SQLITE_OK; +} + +/* +** This function is called to allocate an array of Fts3Index structures +** representing the indexes maintained by the current FTS table. FTS tables +** always maintain the main "terms" index, but may also maintain one or +** more "prefix" indexes, depending on the value of the "prefix=" parameter +** (if any) specified as part of the CREATE VIRTUAL TABLE statement. +** +** Argument zParam is passed the value of the "prefix=" option if one was +** specified, or NULL otherwise. +** +** If no error occurs, SQLITE_OK is returned and *apIndex set to point to +** the allocated array. *pnIndex is set to the number of elements in the +** array. If an error does occur, an SQLite error code is returned. +** +** Regardless of whether or not an error is returned, it is the responsibility +** of the caller to call sqlite3_free() on the output array to free it. +*/ +static int fts3PrefixParameter( + const char *zParam, /* ABC in prefix=ABC parameter to parse */ + int *pnIndex, /* OUT: size of *apIndex[] array */ + struct Fts3Index **apIndex /* OUT: Array of indexes for this table */ +){ + struct Fts3Index *aIndex; /* Allocated array */ + int nIndex = 1; /* Number of entries in array */ + + if( zParam && zParam[0] ){ + const char *p; + nIndex++; + for(p=zParam; *p; p++){ + if( *p==',' ) nIndex++; + } + } + + aIndex = sqlite3_malloc64(sizeof(struct Fts3Index) * nIndex); + *apIndex = aIndex; + if( !aIndex ){ + return SQLITE_NOMEM; + } + + memset(aIndex, 0, sizeof(struct Fts3Index) * nIndex); + if( zParam ){ + const char *p = zParam; + int i; + for(i=1; i=0 ); + if( nPrefix==0 ){ + nIndex--; + i--; + }else{ + aIndex[i].nPrefix = nPrefix; + } + p++; + } + } + + *pnIndex = nIndex; + return SQLITE_OK; +} + +/* +** This function is called when initializing an FTS4 table that uses the +** content=xxx option. It determines the number of and names of the columns +** of the new FTS4 table. +** +** The third argument passed to this function is the value passed to the +** config=xxx option (i.e. "xxx"). This function queries the database for +** a table of that name. If found, the output variables are populated +** as follows: +** +** *pnCol: Set to the number of columns table xxx has, +** +** *pnStr: Set to the total amount of space required to store a copy +** of each columns name, including the nul-terminator. +** +** *pazCol: Set to point to an array of *pnCol strings. Each string is +** the name of the corresponding column in table xxx. The array +** and its contents are allocated using a single allocation. It +** is the responsibility of the caller to free this allocation +** by eventually passing the *pazCol value to sqlite3_free(). +** +** If the table cannot be found, an error code is returned and the output +** variables are undefined. Or, if an OOM is encountered, SQLITE_NOMEM is +** returned (and the output variables are undefined). +*/ +static int fts3ContentColumns( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (i.e. "main", "temp" etc.) */ + const char *zTbl, /* Name of content table */ + const char ***pazCol, /* OUT: Malloc'd array of column names */ + int *pnCol, /* OUT: Size of array *pazCol */ + int *pnStr, /* OUT: Bytes of string content */ + char **pzErr /* OUT: error message */ +){ + int rc = SQLITE_OK; /* Return code */ + char *zSql; /* "SELECT *" statement on zTbl */ + sqlite3_stmt *pStmt = 0; /* Compiled version of zSql */ + + zSql = sqlite3_mprintf("SELECT * FROM %Q.%Q", zDb, zTbl); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + sqlite3Fts3ErrMsg(pzErr, "%s", sqlite3_errmsg(db)); + } + } + sqlite3_free(zSql); + + if( rc==SQLITE_OK ){ + const char **azCol; /* Output array */ + sqlite3_int64 nStr = 0; /* Size of all column names (incl. 0x00) */ + int nCol; /* Number of table columns */ + int i; /* Used to iterate through columns */ + + /* Loop through the returned columns. Set nStr to the number of bytes of + ** space required to store a copy of each column name, including the + ** nul-terminator byte. */ + nCol = sqlite3_column_count(pStmt); + for(i=0; i module name ("fts3" or "fts4") +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> "column name" and other module argument fields. +*/ +static int fts3InitVtab( + int isCreate, /* True for xCreate, false for xConnect */ + sqlite3 *db, /* The SQLite database connection */ + void *pAux, /* Hash table containing tokenizers */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVTab, /* Write the resulting vtab structure here */ + char **pzErr /* Write any error message here */ +){ + Fts3Hash *pHash = (Fts3Hash *)pAux; + Fts3Table *p = 0; /* Pointer to allocated vtab */ + int rc = SQLITE_OK; /* Return code */ + int i; /* Iterator variable */ + sqlite3_int64 nByte; /* Size of allocation used for *p */ + int iCol; /* Column index */ + int nString = 0; /* Bytes required to hold all column names */ + int nCol = 0; /* Number of columns in the FTS table */ + char *zCsr; /* Space for holding column names */ + int nDb; /* Bytes required to hold database name */ + int nName; /* Bytes required to hold table name */ + int isFts4 = (argv[0][3]=='4'); /* True for FTS4, false for FTS3 */ + const char **aCol; /* Array of column names */ + sqlite3_tokenizer *pTokenizer = 0; /* Tokenizer for this table */ + + int nIndex = 0; /* Size of aIndex[] array */ + struct Fts3Index *aIndex = 0; /* Array of indexes for this table */ + + /* The results of parsing supported FTS4 key=value options: */ + int bNoDocsize = 0; /* True to omit %_docsize table */ + int bDescIdx = 0; /* True to store descending indexes */ + char *zPrefix = 0; /* Prefix parameter value (or NULL) */ + char *zCompress = 0; /* compress=? parameter (or NULL) */ + char *zUncompress = 0; /* uncompress=? parameter (or NULL) */ + char *zContent = 0; /* content=? parameter (or NULL) */ + char *zLanguageid = 0; /* languageid=? parameter (or NULL) */ + char **azNotindexed = 0; /* The set of notindexed= columns */ + int nNotindexed = 0; /* Size of azNotindexed[] array */ + + assert( strlen(argv[0])==4 ); + assert( (sqlite3_strnicmp(argv[0], "fts4", 4)==0 && isFts4) + || (sqlite3_strnicmp(argv[0], "fts3", 4)==0 && !isFts4) + ); + + nDb = (int)strlen(argv[1]) + 1; + nName = (int)strlen(argv[2]) + 1; + + nByte = sizeof(const char *) * (argc-2); + aCol = (const char **)sqlite3_malloc64(nByte); + if( aCol ){ + memset((void*)aCol, 0, nByte); + azNotindexed = (char **)sqlite3_malloc64(nByte); + } + if( azNotindexed ){ + memset(azNotindexed, 0, nByte); + } + if( !aCol || !azNotindexed ){ + rc = SQLITE_NOMEM; + goto fts3_init_out; + } + + /* Loop through all of the arguments passed by the user to the FTS3/4 + ** module (i.e. all the column names and special arguments). This loop + ** does the following: + ** + ** + Figures out the number of columns the FTSX table will have, and + ** the number of bytes of space that must be allocated to store copies + ** of the column names. + ** + ** + If there is a tokenizer specification included in the arguments, + ** initializes the tokenizer pTokenizer. + */ + for(i=3; rc==SQLITE_OK && i8 + && 0==sqlite3_strnicmp(z, "tokenize", 8) + && 0==sqlite3Fts3IsIdChar(z[8]) + ){ + rc = sqlite3Fts3InitTokenizer(pHash, &z[9], &pTokenizer, pzErr); + } + + /* Check if it is an FTS4 special argument. */ + else if( isFts4 && fts3IsSpecialColumn(z, &nKey, &zVal) ){ + struct Fts4Option { + const char *zOpt; + int nOpt; + } aFts4Opt[] = { + { "matchinfo", 9 }, /* 0 -> MATCHINFO */ + { "prefix", 6 }, /* 1 -> PREFIX */ + { "compress", 8 }, /* 2 -> COMPRESS */ + { "uncompress", 10 }, /* 3 -> UNCOMPRESS */ + { "order", 5 }, /* 4 -> ORDER */ + { "content", 7 }, /* 5 -> CONTENT */ + { "languageid", 10 }, /* 6 -> LANGUAGEID */ + { "notindexed", 10 } /* 7 -> NOTINDEXED */ + }; + + int iOpt; + if( !zVal ){ + rc = SQLITE_NOMEM; + }else{ + for(iOpt=0; iOptnOpt && !sqlite3_strnicmp(z, pOp->zOpt, pOp->nOpt) ){ + break; + } + } + switch( iOpt ){ + case 0: /* MATCHINFO */ + if( strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "fts3", 4) ){ + sqlite3Fts3ErrMsg(pzErr, "unrecognized matchinfo: %s", zVal); + rc = SQLITE_ERROR; + } + bNoDocsize = 1; + break; + + case 1: /* PREFIX */ + sqlite3_free(zPrefix); + zPrefix = zVal; + zVal = 0; + break; + + case 2: /* COMPRESS */ + sqlite3_free(zCompress); + zCompress = zVal; + zVal = 0; + break; + + case 3: /* UNCOMPRESS */ + sqlite3_free(zUncompress); + zUncompress = zVal; + zVal = 0; + break; + + case 4: /* ORDER */ + if( (strlen(zVal)!=3 || sqlite3_strnicmp(zVal, "asc", 3)) + && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 4)) + ){ + sqlite3Fts3ErrMsg(pzErr, "unrecognized order: %s", zVal); + rc = SQLITE_ERROR; + } + bDescIdx = (zVal[0]=='d' || zVal[0]=='D'); + break; + + case 5: /* CONTENT */ + sqlite3_free(zContent); + zContent = zVal; + zVal = 0; + break; + + case 6: /* LANGUAGEID */ + assert( iOpt==6 ); + sqlite3_free(zLanguageid); + zLanguageid = zVal; + zVal = 0; + break; + + case 7: /* NOTINDEXED */ + azNotindexed[nNotindexed++] = zVal; + zVal = 0; + break; + + default: + assert( iOpt==SizeofArray(aFts4Opt) ); + sqlite3Fts3ErrMsg(pzErr, "unrecognized parameter: %s", z); + rc = SQLITE_ERROR; + break; + } + sqlite3_free(zVal); + } + } + + /* Otherwise, the argument is a column name. */ + else { + nString += (int)(strlen(z) + 1); + aCol[nCol++] = z; + } + } + + /* If a content=xxx option was specified, the following: + ** + ** 1. Ignore any compress= and uncompress= options. + ** + ** 2. If no column names were specified as part of the CREATE VIRTUAL + ** TABLE statement, use all columns from the content table. + */ + if( rc==SQLITE_OK && zContent ){ + sqlite3_free(zCompress); + sqlite3_free(zUncompress); + zCompress = 0; + zUncompress = 0; + if( nCol==0 ){ + sqlite3_free((void*)aCol); + aCol = 0; + rc = fts3ContentColumns(db, argv[1], zContent,&aCol,&nCol,&nString,pzErr); + + /* If a languageid= option was specified, remove the language id + ** column from the aCol[] array. */ + if( rc==SQLITE_OK && zLanguageid ){ + int j; + for(j=0; jdb = db; + p->nColumn = nCol; + p->nPendingData = 0; + p->azColumn = (char **)&p[1]; + p->pTokenizer = pTokenizer; + p->nMaxPendingData = FTS3_MAX_PENDING_DATA; + p->bHasDocsize = (isFts4 && bNoDocsize==0); + p->bHasStat = (u8)isFts4; + p->bFts4 = (u8)isFts4; + p->bDescIdx = (u8)bDescIdx; + p->nAutoincrmerge = 0xff; /* 0xff means setting unknown */ + p->zContentTbl = zContent; + p->zLanguageid = zLanguageid; + zContent = 0; + zLanguageid = 0; + TESTONLY( p->inTransaction = -1 ); + TESTONLY( p->mxSavepoint = -1 ); + + p->aIndex = (struct Fts3Index *)&p->azColumn[nCol]; + memcpy(p->aIndex, aIndex, sizeof(struct Fts3Index) * nIndex); + p->nIndex = nIndex; + for(i=0; iaIndex[i].hPending, FTS3_HASH_STRING, 1); + } + p->abNotindexed = (u8 *)&p->aIndex[nIndex]; + + /* Fill in the zName and zDb fields of the vtab structure. */ + zCsr = (char *)&p->abNotindexed[nCol]; + p->zName = zCsr; + memcpy(zCsr, argv[2], nName); + zCsr += nName; + p->zDb = zCsr; + memcpy(zCsr, argv[1], nDb); + zCsr += nDb; + + /* Fill in the azColumn array */ + for(iCol=0; iCol0 ){ + memcpy(zCsr, z, n); + } + zCsr[n] = '\0'; + sqlite3Fts3Dequote(zCsr); + p->azColumn[iCol] = zCsr; + zCsr += n+1; + assert( zCsr <= &((char *)p)[nByte] ); + } + + /* Fill in the abNotindexed array */ + for(iCol=0; iColazColumn[iCol]); + for(i=0; iazColumn[iCol], zNot, n) + ){ + p->abNotindexed[iCol] = 1; + sqlite3_free(zNot); + azNotindexed[i] = 0; + } + } + } + for(i=0; izReadExprlist = fts3ReadExprList(p, zUncompress, &rc); + p->zWriteExprlist = fts3WriteExprList(p, zCompress, &rc); + if( rc!=SQLITE_OK ) goto fts3_init_out; + + /* If this is an xCreate call, create the underlying tables in the + ** database. TODO: For xConnect(), it could verify that said tables exist. + */ + if( isCreate ){ + rc = fts3CreateTables(p); + } + + /* Check to see if a legacy fts3 table has been "upgraded" by the + ** addition of a %_stat table so that it can use incremental merge. + */ + if( !isFts4 && !isCreate ){ + p->bHasStat = 2; + } + + /* Figure out the page-size for the database. This is required in order to + ** estimate the cost of loading large doclists from the database. */ + fts3DatabasePageSize(&rc, p); + p->nNodeSize = p->nPgsz-35; + +#if defined(SQLITE_DEBUG)||defined(SQLITE_TEST) + p->nMergeCount = FTS3_MERGE_COUNT; +#endif + + /* Declare the table schema to SQLite. */ + fts3DeclareVtab(&rc, p); + +fts3_init_out: + sqlite3_free(zPrefix); + sqlite3_free(aIndex); + sqlite3_free(zCompress); + sqlite3_free(zUncompress); + sqlite3_free(zContent); + sqlite3_free(zLanguageid); + for(i=0; ipModule->xDestroy(pTokenizer); + } + }else{ + assert( p->pSegments==0 ); + *ppVTab = &p->base; + } + return rc; +} + +/* +** The xConnect() and xCreate() methods for the virtual table. All the +** work is done in function fts3InitVtab(). +*/ +static int fts3ConnectMethod( + sqlite3 *db, /* Database connection */ + void *pAux, /* Pointer to tokenizer hash table */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + return fts3InitVtab(0, db, pAux, argc, argv, ppVtab, pzErr); +} +static int fts3CreateMethod( + sqlite3 *db, /* Database connection */ + void *pAux, /* Pointer to tokenizer hash table */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + return fts3InitVtab(1, db, pAux, argc, argv, ppVtab, pzErr); +} + +/* +** Set the pIdxInfo->estimatedRows variable to nRow. Unless this +** extension is currently being used by a version of SQLite too old to +** support estimatedRows. In that case this function is a no-op. +*/ +static void fts3SetEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ +#if SQLITE_VERSION_NUMBER>=3008002 + if( sqlite3_libversion_number()>=3008002 ){ + pIdxInfo->estimatedRows = nRow; + } +#endif +} + +/* +** Set the SQLITE_INDEX_SCAN_UNIQUE flag in pIdxInfo->flags. Unless this +** extension is currently being used by a version of SQLite too old to +** support index-info flags. In that case this function is a no-op. +*/ +static void fts3SetUniqueFlag(sqlite3_index_info *pIdxInfo){ +#if SQLITE_VERSION_NUMBER>=3008012 + if( sqlite3_libversion_number()>=3008012 ){ + pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE; + } +#endif +} + +/* +** Implementation of the xBestIndex method for FTS3 tables. There +** are three possible strategies, in order of preference: +** +** 1. Direct lookup by rowid or docid. +** 2. Full-text search using a MATCH operator on a non-docid column. +** 3. Linear scan of %_content table. +*/ +static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ + Fts3Table *p = (Fts3Table *)pVTab; + int i; /* Iterator variable */ + int iCons = -1; /* Index of constraint to use */ + + int iLangidCons = -1; /* Index of langid=x constraint, if present */ + int iDocidGe = -1; /* Index of docid>=x constraint, if present */ + int iDocidLe = -1; /* Index of docid<=x constraint, if present */ + int iIdx; + + if( p->bLock ){ + return SQLITE_ERROR; + } + + /* By default use a full table scan. This is an expensive option, + ** so search through the constraints to see if a more efficient + ** strategy is possible. + */ + pInfo->idxNum = FTS3_FULLSCAN_SEARCH; + pInfo->estimatedCost = 5000000; + for(i=0; inConstraint; i++){ + int bDocid; /* True if this constraint is on docid */ + struct sqlite3_index_constraint *pCons = &pInfo->aConstraint[i]; + if( pCons->usable==0 ){ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ + /* There exists an unusable MATCH constraint. This means that if + ** the planner does elect to use the results of this call as part + ** of the overall query plan the user will see an "unable to use + ** function MATCH in the requested context" error. To discourage + ** this, return a very high cost here. */ + pInfo->idxNum = FTS3_FULLSCAN_SEARCH; + pInfo->estimatedCost = 1e50; + fts3SetEstimatedRows(pInfo, ((sqlite3_int64)1) << 50); + return SQLITE_OK; + } + continue; + } + + bDocid = (pCons->iColumn<0 || pCons->iColumn==p->nColumn+1); + + /* A direct lookup on the rowid or docid column. Assign a cost of 1.0. */ + if( iCons<0 && pCons->op==SQLITE_INDEX_CONSTRAINT_EQ && bDocid ){ + pInfo->idxNum = FTS3_DOCID_SEARCH; + pInfo->estimatedCost = 1.0; + iCons = i; + } + + /* A MATCH constraint. Use a full-text search. + ** + ** If there is more than one MATCH constraint available, use the first + ** one encountered. If there is both a MATCH constraint and a direct + ** rowid/docid lookup, prefer the MATCH strategy. This is done even + ** though the rowid/docid lookup is faster than a MATCH query, selecting + ** it would lead to an "unable to use function MATCH in the requested + ** context" error. + */ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_MATCH + && pCons->iColumn>=0 && pCons->iColumn<=p->nColumn + ){ + pInfo->idxNum = FTS3_FULLTEXT_SEARCH + pCons->iColumn; + pInfo->estimatedCost = 2.0; + iCons = i; + } + + /* Equality constraint on the langid column */ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ + && pCons->iColumn==p->nColumn + 2 + ){ + iLangidCons = i; + } + + if( bDocid ){ + switch( pCons->op ){ + case SQLITE_INDEX_CONSTRAINT_GE: + case SQLITE_INDEX_CONSTRAINT_GT: + iDocidGe = i; + break; + + case SQLITE_INDEX_CONSTRAINT_LE: + case SQLITE_INDEX_CONSTRAINT_LT: + iDocidLe = i; + break; + } + } + } + + /* If using a docid=? or rowid=? strategy, set the UNIQUE flag. */ + if( pInfo->idxNum==FTS3_DOCID_SEARCH ) fts3SetUniqueFlag(pInfo); + + iIdx = 1; + if( iCons>=0 ){ + pInfo->aConstraintUsage[iCons].argvIndex = iIdx++; + pInfo->aConstraintUsage[iCons].omit = 1; + } + if( iLangidCons>=0 ){ + pInfo->idxNum |= FTS3_HAVE_LANGID; + pInfo->aConstraintUsage[iLangidCons].argvIndex = iIdx++; + } + if( iDocidGe>=0 ){ + pInfo->idxNum |= FTS3_HAVE_DOCID_GE; + pInfo->aConstraintUsage[iDocidGe].argvIndex = iIdx++; + } + if( iDocidLe>=0 ){ + pInfo->idxNum |= FTS3_HAVE_DOCID_LE; + pInfo->aConstraintUsage[iDocidLe].argvIndex = iIdx++; + } + + /* Regardless of the strategy selected, FTS can deliver rows in rowid (or + ** docid) order. Both ascending and descending are possible. + */ + if( pInfo->nOrderBy==1 ){ + struct sqlite3_index_orderby *pOrder = &pInfo->aOrderBy[0]; + if( pOrder->iColumn<0 || pOrder->iColumn==p->nColumn+1 ){ + if( pOrder->desc ){ + pInfo->idxStr = "DESC"; + }else{ + pInfo->idxStr = "ASC"; + } + pInfo->orderByConsumed = 1; + } + } + + assert( p->pSegments==0 ); + return SQLITE_OK; +} + +/* +** Implementation of xOpen method. +*/ +static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + sqlite3_vtab_cursor *pCsr; /* Allocated cursor */ + + UNUSED_PARAMETER(pVTab); + + /* Allocate a buffer large enough for an Fts3Cursor structure. If the + ** allocation succeeds, zero it and return SQLITE_OK. Otherwise, + ** if the allocation fails, return SQLITE_NOMEM. + */ + *ppCsr = pCsr = (sqlite3_vtab_cursor *)sqlite3_malloc(sizeof(Fts3Cursor)); + if( !pCsr ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(Fts3Cursor)); + return SQLITE_OK; +} + +/* +** Finalize the statement handle at pCsr->pStmt. +** +** Or, if that statement handle is one created by fts3CursorSeekStmt(), +** and the Fts3Table.pSeekStmt slot is currently NULL, save the statement +** pointer there instead of finalizing it. +*/ +static void fts3CursorFinalizeStmt(Fts3Cursor *pCsr){ + if( pCsr->bSeekStmt ){ + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; + if( p->pSeekStmt==0 ){ + p->pSeekStmt = pCsr->pStmt; + sqlite3_reset(pCsr->pStmt); + pCsr->pStmt = 0; + } + pCsr->bSeekStmt = 0; + } + sqlite3_finalize(pCsr->pStmt); +} + +/* +** Free all resources currently held by the cursor passed as the only +** argument. +*/ +static void fts3ClearCursor(Fts3Cursor *pCsr){ + fts3CursorFinalizeStmt(pCsr); + sqlite3Fts3FreeDeferredTokens(pCsr); + sqlite3_free(pCsr->aDoclist); + sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); + sqlite3Fts3ExprFree(pCsr->pExpr); + memset(&(&pCsr->base)[1], 0, sizeof(Fts3Cursor)-sizeof(sqlite3_vtab_cursor)); +} + +/* +** Close the cursor. For additional information see the documentation +** on the xClose method of the virtual table interface. +*/ +static int fts3CloseMethod(sqlite3_vtab_cursor *pCursor){ + Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + fts3ClearCursor(pCsr); + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** If pCsr->pStmt has not been prepared (i.e. if pCsr->pStmt==0), then +** compose and prepare an SQL statement of the form: +** +** "SELECT FROM %_content WHERE rowid = ?" +** +** (or the equivalent for a content=xxx table) and set pCsr->pStmt to +** it. If an error occurs, return an SQLite error code. +*/ +static int fts3CursorSeekStmt(Fts3Cursor *pCsr){ + int rc = SQLITE_OK; + if( pCsr->pStmt==0 ){ + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; + char *zSql; + if( p->pSeekStmt ){ + pCsr->pStmt = p->pSeekStmt; + p->pSeekStmt = 0; + }else{ + zSql = sqlite3_mprintf("SELECT %s WHERE rowid = ?", p->zReadExprlist); + if( !zSql ) return SQLITE_NOMEM; + p->bLock++; + rc = sqlite3_prepare_v3( + p->db, zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0 + ); + p->bLock--; + sqlite3_free(zSql); + } + if( rc==SQLITE_OK ) pCsr->bSeekStmt = 1; + } + return rc; +} + +/* +** Position the pCsr->pStmt statement so that it is on the row +** of the %_content table that contains the last match. Return +** SQLITE_OK on success. +*/ +static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ + int rc = SQLITE_OK; + if( pCsr->isRequireSeek ){ + rc = fts3CursorSeekStmt(pCsr); + if( rc==SQLITE_OK ){ + Fts3Table *pTab = (Fts3Table*)pCsr->base.pVtab; + pTab->bLock++; + sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iPrevId); + pCsr->isRequireSeek = 0; + if( SQLITE_ROW==sqlite3_step(pCsr->pStmt) ){ + pTab->bLock--; + return SQLITE_OK; + }else{ + pTab->bLock--; + rc = sqlite3_reset(pCsr->pStmt); + if( rc==SQLITE_OK && ((Fts3Table *)pCsr->base.pVtab)->zContentTbl==0 ){ + /* If no row was found and no error has occurred, then the %_content + ** table is missing a row that is present in the full-text index. + ** The data structures are corrupt. */ + rc = FTS_CORRUPT_VTAB; + pCsr->isEof = 1; + } + } + } + } + + if( rc!=SQLITE_OK && pContext ){ + sqlite3_result_error_code(pContext, rc); + } + return rc; +} + +/* +** This function is used to process a single interior node when searching +** a b-tree for a term or term prefix. The node data is passed to this +** function via the zNode/nNode parameters. The term to search for is +** passed in zTerm/nTerm. +** +** If piFirst is not NULL, then this function sets *piFirst to the blockid +** of the child node that heads the sub-tree that may contain the term. +** +** If piLast is not NULL, then *piLast is set to the right-most child node +** that heads a sub-tree that may contain a term for which zTerm/nTerm is +** a prefix. +** +** If an OOM error occurs, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK. +*/ +static int fts3ScanInteriorNode( + const char *zTerm, /* Term to select leaves for */ + int nTerm, /* Size of term zTerm in bytes */ + const char *zNode, /* Buffer containing segment interior node */ + int nNode, /* Size of buffer at zNode */ + sqlite3_int64 *piFirst, /* OUT: Selected child node */ + sqlite3_int64 *piLast /* OUT: Selected child node */ +){ + int rc = SQLITE_OK; /* Return code */ + const char *zCsr = zNode; /* Cursor to iterate through node */ + const char *zEnd = &zCsr[nNode];/* End of interior node buffer */ + char *zBuffer = 0; /* Buffer to load terms into */ + i64 nAlloc = 0; /* Size of allocated buffer */ + int isFirstTerm = 1; /* True when processing first term on page */ + sqlite3_int64 iChild; /* Block id of child node to descend to */ + int nBuffer = 0; /* Total term size */ + + /* Skip over the 'height' varint that occurs at the start of every + ** interior node. Then load the blockid of the left-child of the b-tree + ** node into variable iChild. + ** + ** Even if the data structure on disk is corrupted, this (reading two + ** varints from the buffer) does not risk an overread. If zNode is a + ** root node, then the buffer comes from a SELECT statement. SQLite does + ** not make this guarantee explicitly, but in practice there are always + ** either more than 20 bytes of allocated space following the nNode bytes of + ** contents, or two zero bytes. Or, if the node is read from the %_segments + ** table, then there are always 20 bytes of zeroed padding following the + ** nNode bytes of content (see sqlite3Fts3ReadBlock() for details). + */ + zCsr += sqlite3Fts3GetVarint(zCsr, &iChild); + zCsr += sqlite3Fts3GetVarint(zCsr, &iChild); + if( zCsr>zEnd ){ + return FTS_CORRUPT_VTAB; + } + + while( zCsrnBuffer ){ + rc = FTS_CORRUPT_VTAB; + goto finish_scan; + } + } + isFirstTerm = 0; + zCsr += fts3GetVarint32(zCsr, &nSuffix); + + assert( nPrefix>=0 && nSuffix>=0 ); + if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr || nSuffix==0 ){ + rc = FTS_CORRUPT_VTAB; + goto finish_scan; + } + if( (i64)nPrefix+nSuffix>nAlloc ){ + char *zNew; + nAlloc = ((i64)nPrefix+nSuffix) * 2; + zNew = (char *)sqlite3_realloc64(zBuffer, nAlloc); + if( !zNew ){ + rc = SQLITE_NOMEM; + goto finish_scan; + } + zBuffer = zNew; + } + assert( zBuffer ); + memcpy(&zBuffer[nPrefix], zCsr, nSuffix); + nBuffer = nPrefix + nSuffix; + zCsr += nSuffix; + + /* Compare the term we are searching for with the term just loaded from + ** the interior node. If the specified term is greater than or equal + ** to the term from the interior node, then all terms on the sub-tree + ** headed by node iChild are smaller than zTerm. No need to search + ** iChild. + ** + ** If the interior node term is larger than the specified term, then + ** the tree headed by iChild may contain the specified term. + */ + cmp = memcmp(zTerm, zBuffer, (nBuffer>nTerm ? nTerm : nBuffer)); + if( piFirst && (cmp<0 || (cmp==0 && nBuffer>nTerm)) ){ + *piFirst = iChild; + piFirst = 0; + } + + if( piLast && cmp<0 ){ + *piLast = iChild; + piLast = 0; + } + + iChild++; + }; + + if( piFirst ) *piFirst = iChild; + if( piLast ) *piLast = iChild; + + finish_scan: + sqlite3_free(zBuffer); + return rc; +} + + +/* +** The buffer pointed to by argument zNode (size nNode bytes) contains an +** interior node of a b-tree segment. The zTerm buffer (size nTerm bytes) +** contains a term. This function searches the sub-tree headed by the zNode +** node for the range of leaf nodes that may contain the specified term +** or terms for which the specified term is a prefix. +** +** If piLeaf is not NULL, then *piLeaf is set to the blockid of the +** left-most leaf node in the tree that may contain the specified term. +** If piLeaf2 is not NULL, then *piLeaf2 is set to the blockid of the +** right-most leaf node that may contain a term for which the specified +** term is a prefix. +** +** It is possible that the range of returned leaf nodes does not contain +** the specified term or any terms for which it is a prefix. However, if the +** segment does contain any such terms, they are stored within the identified +** range. Because this function only inspects interior segment nodes (and +** never loads leaf nodes into memory), it is not possible to be sure. +** +** If an error occurs, an error code other than SQLITE_OK is returned. +*/ +static int fts3SelectLeaf( + Fts3Table *p, /* Virtual table handle */ + const char *zTerm, /* Term to select leaves for */ + int nTerm, /* Size of term zTerm in bytes */ + const char *zNode, /* Buffer containing segment interior node */ + int nNode, /* Size of buffer at zNode */ + sqlite3_int64 *piLeaf, /* Selected leaf node */ + sqlite3_int64 *piLeaf2 /* Selected leaf node */ +){ + int rc = SQLITE_OK; /* Return code */ + int iHeight; /* Height of this node in tree */ + + assert( piLeaf || piLeaf2 ); + + fts3GetVarint32(zNode, &iHeight); + rc = fts3ScanInteriorNode(zTerm, nTerm, zNode, nNode, piLeaf, piLeaf2); + assert_fts3_nc( !piLeaf2 || !piLeaf || rc!=SQLITE_OK || (*piLeaf<=*piLeaf2) ); + + if( rc==SQLITE_OK && iHeight>1 ){ + char *zBlob = 0; /* Blob read from %_segments table */ + int nBlob = 0; /* Size of zBlob in bytes */ + + if( piLeaf && piLeaf2 && (*piLeaf!=*piLeaf2) ){ + rc = sqlite3Fts3ReadBlock(p, *piLeaf, &zBlob, &nBlob, 0); + if( rc==SQLITE_OK ){ + rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, 0); + } + sqlite3_free(zBlob); + piLeaf = 0; + zBlob = 0; + } + + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3ReadBlock(p, piLeaf?*piLeaf:*piLeaf2, &zBlob, &nBlob, 0); + } + if( rc==SQLITE_OK ){ + int iNewHeight = 0; + fts3GetVarint32(zBlob, &iNewHeight); + if( iNewHeight>=iHeight ){ + rc = FTS_CORRUPT_VTAB; + }else{ + rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, piLeaf2); + } + } + sqlite3_free(zBlob); + } + + return rc; +} + +/* +** This function is used to create delta-encoded serialized lists of FTS3 +** varints. Each call to this function appends a single varint to a list. +*/ +static void fts3PutDeltaVarint( + char **pp, /* IN/OUT: Output pointer */ + sqlite3_int64 *piPrev, /* IN/OUT: Previous value written to list */ + sqlite3_int64 iVal /* Write this value to the list */ +){ + assert( iVal-*piPrev > 0 || (*piPrev==0 && iVal==0) ); + *pp += sqlite3Fts3PutVarint(*pp, iVal-*piPrev); + *piPrev = iVal; +} + +/* +** When this function is called, *ppPoslist is assumed to point to the +** start of a position-list. After it returns, *ppPoslist points to the +** first byte after the position-list. +** +** A position list is list of positions (delta encoded) and columns for +** a single document record of a doclist. So, in other words, this +** routine advances *ppPoslist so that it points to the next docid in +** the doclist, or to the first byte past the end of the doclist. +** +** If pp is not NULL, then the contents of the position list are copied +** to *pp. *pp is set to point to the first byte past the last byte copied +** before this function returns. +*/ +static void fts3PoslistCopy(char **pp, char **ppPoslist){ + char *pEnd = *ppPoslist; + char c = 0; + + /* The end of a position list is marked by a zero encoded as an FTS3 + ** varint. A single POS_END (0) byte. Except, if the 0 byte is preceded by + ** a byte with the 0x80 bit set, then it is not a varint 0, but the tail + ** of some other, multi-byte, value. + ** + ** The following while-loop moves pEnd to point to the first byte that is not + ** immediately preceded by a byte with the 0x80 bit set. Then increments + ** pEnd once more so that it points to the byte immediately following the + ** last byte in the position-list. + */ + while( *pEnd | c ){ + c = *pEnd++ & 0x80; + testcase( c!=0 && (*pEnd)==0 ); + } + pEnd++; /* Advance past the POS_END terminator byte */ + + if( pp ){ + int n = (int)(pEnd - *ppPoslist); + char *p = *pp; + memcpy(p, *ppPoslist, n); + p += n; + *pp = p; + } + *ppPoslist = pEnd; +} + +/* +** When this function is called, *ppPoslist is assumed to point to the +** start of a column-list. After it returns, *ppPoslist points to the +** to the terminator (POS_COLUMN or POS_END) byte of the column-list. +** +** A column-list is list of delta-encoded positions for a single column +** within a single document within a doclist. +** +** The column-list is terminated either by a POS_COLUMN varint (1) or +** a POS_END varint (0). This routine leaves *ppPoslist pointing to +** the POS_COLUMN or POS_END that terminates the column-list. +** +** If pp is not NULL, then the contents of the column-list are copied +** to *pp. *pp is set to point to the first byte past the last byte copied +** before this function returns. The POS_COLUMN or POS_END terminator +** is not copied into *pp. +*/ +static void fts3ColumnlistCopy(char **pp, char **ppPoslist){ + char *pEnd = *ppPoslist; + char c = 0; + + /* A column-list is terminated by either a 0x01 or 0x00 byte that is + ** not part of a multi-byte varint. + */ + while( 0xFE & (*pEnd | c) ){ + c = *pEnd++ & 0x80; + testcase( c!=0 && ((*pEnd)&0xfe)==0 ); + } + if( pp ){ + int n = (int)(pEnd - *ppPoslist); + char *p = *pp; + memcpy(p, *ppPoslist, n); + p += n; + *pp = p; + } + *ppPoslist = pEnd; +} + +/* +** Value used to signify the end of an position-list. This must be +** as large or larger than any value that might appear on the +** position-list, even a position list that has been corrupted. +*/ +#define POSITION_LIST_END LARGEST_INT64 + +/* +** This function is used to help parse position-lists. When this function is +** called, *pp may point to the start of the next varint in the position-list +** being parsed, or it may point to 1 byte past the end of the position-list +** (in which case **pp will be a terminator bytes POS_END (0) or +** (1)). +** +** If *pp points past the end of the current position-list, set *pi to +** POSITION_LIST_END and return. Otherwise, read the next varint from *pp, +** increment the current value of *pi by the value read, and set *pp to +** point to the next value before returning. +** +** Before calling this routine *pi must be initialized to the value of +** the previous position, or zero if we are reading the first position +** in the position-list. Because positions are delta-encoded, the value +** of the previous position is needed in order to compute the value of +** the next position. +*/ +static void fts3ReadNextPos( + char **pp, /* IN/OUT: Pointer into position-list buffer */ + sqlite3_int64 *pi /* IN/OUT: Value read from position-list */ +){ + if( (**pp)&0xFE ){ + int iVal; + *pp += fts3GetVarint32((*pp), &iVal); + *pi += iVal; + *pi -= 2; + }else{ + *pi = POSITION_LIST_END; + } +} + +/* +** If parameter iCol is not 0, write an POS_COLUMN (1) byte followed by +** the value of iCol encoded as a varint to *pp. This will start a new +** column list. +** +** Set *pp to point to the byte just after the last byte written before +** returning (do not modify it if iCol==0). Return the total number of bytes +** written (0 if iCol==0). +*/ +static int fts3PutColNumber(char **pp, int iCol){ + int n = 0; /* Number of bytes written */ + if( iCol ){ + char *p = *pp; /* Output pointer */ + n = 1 + sqlite3Fts3PutVarint(&p[1], iCol); + *p = 0x01; + *pp = &p[n]; + } + return n; +} + +/* +** Compute the union of two position lists. The output written +** into *pp contains all positions of both *pp1 and *pp2 in sorted +** order and with any duplicates removed. All pointers are +** updated appropriately. The caller is responsible for insuring +** that there is enough space in *pp to hold the complete output. +*/ +static int fts3PoslistMerge( + char **pp, /* Output buffer */ + char **pp1, /* Left input list */ + char **pp2 /* Right input list */ +){ + char *p = *pp; + char *p1 = *pp1; + char *p2 = *pp2; + + while( *p1 || *p2 ){ + int iCol1; /* The current column index in pp1 */ + int iCol2; /* The current column index in pp2 */ + + if( *p1==POS_COLUMN ){ + fts3GetVarint32(&p1[1], &iCol1); + if( iCol1==0 ) return FTS_CORRUPT_VTAB; + } + else if( *p1==POS_END ) iCol1 = 0x7fffffff; + else iCol1 = 0; + + if( *p2==POS_COLUMN ){ + fts3GetVarint32(&p2[1], &iCol2); + if( iCol2==0 ) return FTS_CORRUPT_VTAB; + } + else if( *p2==POS_END ) iCol2 = 0x7fffffff; + else iCol2 = 0; + + if( iCol1==iCol2 ){ + sqlite3_int64 i1 = 0; /* Last position from pp1 */ + sqlite3_int64 i2 = 0; /* Last position from pp2 */ + sqlite3_int64 iPrev = 0; + int n = fts3PutColNumber(&p, iCol1); + p1 += n; + p2 += n; + + /* At this point, both p1 and p2 point to the start of column-lists + ** for the same column (the column with index iCol1 and iCol2). + ** A column-list is a list of non-negative delta-encoded varints, each + ** incremented by 2 before being stored. Each list is terminated by a + ** POS_END (0) or POS_COLUMN (1). The following block merges the two lists + ** and writes the results to buffer p. p is left pointing to the byte + ** after the list written. No terminator (POS_END or POS_COLUMN) is + ** written to the output. + */ + fts3GetDeltaVarint(&p1, &i1); + fts3GetDeltaVarint(&p2, &i2); + if( i1<2 || i2<2 ){ + break; + } + do { + fts3PutDeltaVarint(&p, &iPrev, (i1pos(*pp1) && pos(*pp2)-pos(*pp1)<=nToken). i.e. +** when the *pp1 token appears before the *pp2 token, but not more than nToken +** slots before it. +** +** e.g. nToken==1 searches for adjacent positions. +*/ +static int fts3PoslistPhraseMerge( + char **pp, /* IN/OUT: Preallocated output buffer */ + int nToken, /* Maximum difference in token positions */ + int isSaveLeft, /* Save the left position */ + int isExact, /* If *pp1 is exactly nTokens before *pp2 */ + char **pp1, /* IN/OUT: Left input list */ + char **pp2 /* IN/OUT: Right input list */ +){ + char *p = *pp; + char *p1 = *pp1; + char *p2 = *pp2; + int iCol1 = 0; + int iCol2 = 0; + + /* Never set both isSaveLeft and isExact for the same invocation. */ + assert( isSaveLeft==0 || isExact==0 ); + + assert_fts3_nc( p!=0 && *p1!=0 && *p2!=0 ); + if( *p1==POS_COLUMN ){ + p1++; + p1 += fts3GetVarint32(p1, &iCol1); + } + if( *p2==POS_COLUMN ){ + p2++; + p2 += fts3GetVarint32(p2, &iCol2); + } + + while( 1 ){ + if( iCol1==iCol2 ){ + char *pSave = p; + sqlite3_int64 iPrev = 0; + sqlite3_int64 iPos1 = 0; + sqlite3_int64 iPos2 = 0; + + if( iCol1 ){ + *p++ = POS_COLUMN; + p += sqlite3Fts3PutVarint(p, iCol1); + } + + fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2; + fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2; + if( iPos1<0 || iPos2<0 ) break; + + while( 1 ){ + if( iPos2==iPos1+nToken + || (isExact==0 && iPos2>iPos1 && iPos2<=iPos1+nToken) + ){ + sqlite3_int64 iSave; + iSave = isSaveLeft ? iPos1 : iPos2; + fts3PutDeltaVarint(&p, &iPrev, iSave+2); iPrev -= 2; + pSave = 0; + assert( p ); + } + if( (!isSaveLeft && iPos2<=(iPos1+nToken)) || iPos2<=iPos1 ){ + if( (*p2&0xFE)==0 ) break; + fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2; + }else{ + if( (*p1&0xFE)==0 ) break; + fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2; + } + } + + if( pSave ){ + assert( pp && p ); + p = pSave; + } + + fts3ColumnlistCopy(0, &p1); + fts3ColumnlistCopy(0, &p2); + assert( (*p1&0xFE)==0 && (*p2&0xFE)==0 ); + if( 0==*p1 || 0==*p2 ) break; + + p1++; + p1 += fts3GetVarint32(p1, &iCol1); + p2++; + p2 += fts3GetVarint32(p2, &iCol2); + } + + /* Advance pointer p1 or p2 (whichever corresponds to the smaller of + ** iCol1 and iCol2) so that it points to either the 0x00 that marks the + ** end of the position list, or the 0x01 that precedes the next + ** column-number in the position list. + */ + else if( iCol1=pEnd ){ + *pp = 0; + }else{ + u64 iVal; + *pp += sqlite3Fts3GetVarintU(*pp, &iVal); + if( bDescIdx ){ + *pVal = (i64)((u64)*pVal - iVal); + }else{ + *pVal = (i64)((u64)*pVal + iVal); + } + } +} + +/* +** This function is used to write a single varint to a buffer. The varint +** is written to *pp. Before returning, *pp is set to point 1 byte past the +** end of the value written. +** +** If *pbFirst is zero when this function is called, the value written to +** the buffer is that of parameter iVal. +** +** If *pbFirst is non-zero when this function is called, then the value +** written is either (iVal-*piPrev) (if bDescIdx is zero) or (*piPrev-iVal) +** (if bDescIdx is non-zero). +** +** Before returning, this function always sets *pbFirst to 1 and *piPrev +** to the value of parameter iVal. +*/ +static void fts3PutDeltaVarint3( + char **pp, /* IN/OUT: Output pointer */ + int bDescIdx, /* True for descending docids */ + sqlite3_int64 *piPrev, /* IN/OUT: Previous value written to list */ + int *pbFirst, /* IN/OUT: True after first int written */ + sqlite3_int64 iVal /* Write this value to the list */ +){ + sqlite3_uint64 iWrite; + if( bDescIdx==0 || *pbFirst==0 ){ + assert_fts3_nc( *pbFirst==0 || iVal>=*piPrev ); + iWrite = (u64)iVal - (u64)*piPrev; + }else{ + assert_fts3_nc( *piPrev>=iVal ); + iWrite = (u64)*piPrev - (u64)iVal; + } + assert( *pbFirst || *piPrev==0 ); + assert_fts3_nc( *pbFirst==0 || iWrite>0 ); + *pp += sqlite3Fts3PutVarint(*pp, iWrite); + *piPrev = iVal; + *pbFirst = 1; +} + + +/* +** This macro is used by various functions that merge doclists. The two +** arguments are 64-bit docid values. If the value of the stack variable +** bDescDoclist is 0 when this macro is invoked, then it returns (i1-i2). +** Otherwise, (i2-i1). +** +** Using this makes it easier to write code that can merge doclists that are +** sorted in either ascending or descending order. +*/ +/* #define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i64)((u64)i1-i2)) */ +#define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i1>i2?1:((i1==i2)?0:-1))) + +/* +** This function does an "OR" merge of two doclists (output contains all +** positions contained in either argument doclist). If the docids in the +** input doclists are sorted in ascending order, parameter bDescDoclist +** should be false. If they are sorted in ascending order, it should be +** passed a non-zero value. +** +** If no error occurs, *paOut is set to point at an sqlite3_malloc'd buffer +** containing the output doclist and SQLITE_OK is returned. In this case +** *pnOut is set to the number of bytes in the output doclist. +** +** If an error occurs, an SQLite error code is returned. The output values +** are undefined in this case. +*/ +static int fts3DoclistOrMerge( + int bDescDoclist, /* True if arguments are desc */ + char *a1, int n1, /* First doclist */ + char *a2, int n2, /* Second doclist */ + char **paOut, int *pnOut /* OUT: Malloc'd doclist */ +){ + int rc = SQLITE_OK; + sqlite3_int64 i1 = 0; + sqlite3_int64 i2 = 0; + sqlite3_int64 iPrev = 0; + char *pEnd1 = &a1[n1]; + char *pEnd2 = &a2[n2]; + char *p1 = a1; + char *p2 = a2; + char *p; + char *aOut; + int bFirstOut = 0; + + *paOut = 0; + *pnOut = 0; + + /* Allocate space for the output. Both the input and output doclists + ** are delta encoded. If they are in ascending order (bDescDoclist==0), + ** then the first docid in each list is simply encoded as a varint. For + ** each subsequent docid, the varint stored is the difference between the + ** current and previous docid (a positive number - since the list is in + ** ascending order). + ** + ** The first docid written to the output is therefore encoded using the + ** same number of bytes as it is in whichever of the input lists it is + ** read from. And each subsequent docid read from the same input list + ** consumes either the same or less bytes as it did in the input (since + ** the difference between it and the previous value in the output must + ** be a positive value less than or equal to the delta value read from + ** the input list). The same argument applies to all but the first docid + ** read from the 'other' list. And to the contents of all position lists + ** that will be copied and merged from the input to the output. + ** + ** However, if the first docid copied to the output is a negative number, + ** then the encoding of the first docid from the 'other' input list may + ** be larger in the output than it was in the input (since the delta value + ** may be a larger positive integer than the actual docid). + ** + ** The space required to store the output is therefore the sum of the + ** sizes of the two inputs, plus enough space for exactly one of the input + ** docids to grow. + ** + ** A symetric argument may be made if the doclists are in descending + ** order. + */ + aOut = sqlite3_malloc64((i64)n1+n2+FTS3_VARINT_MAX-1+FTS3_BUFFER_PADDING); + if( !aOut ) return SQLITE_NOMEM; + + p = aOut; + fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2); + while( p1 || p2 ){ + sqlite3_int64 iDiff = DOCID_CMP(i1, i2); + + if( p2 && p1 && iDiff==0 ){ + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); + rc = fts3PoslistMerge(&p, &p1, &p2); + if( rc ) break; + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + }else if( !p2 || (p1 && iDiff<0) ){ + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); + fts3PoslistCopy(&p, &p1); + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + }else{ + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i2); + fts3PoslistCopy(&p, &p2); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + } + + assert( (p-aOut)<=((p1?(p1-a1):n1)+(p2?(p2-a2):n2)+FTS3_VARINT_MAX-1) ); + } + + if( rc!=SQLITE_OK ){ + sqlite3_free(aOut); + p = aOut = 0; + }else{ + assert( (p-aOut)<=n1+n2+FTS3_VARINT_MAX-1 ); + memset(&aOut[(p-aOut)], 0, FTS3_BUFFER_PADDING); + } + *paOut = aOut; + *pnOut = (int)(p-aOut); + return rc; +} + +/* +** This function does a "phrase" merge of two doclists. In a phrase merge, +** the output contains a copy of each position from the right-hand input +** doclist for which there is a position in the left-hand input doclist +** exactly nDist tokens before it. +** +** If the docids in the input doclists are sorted in ascending order, +** parameter bDescDoclist should be false. If they are sorted in ascending +** order, it should be passed a non-zero value. +** +** The right-hand input doclist is overwritten by this function. +*/ +static int fts3DoclistPhraseMerge( + int bDescDoclist, /* True if arguments are desc */ + int nDist, /* Distance from left to right (1=adjacent) */ + char *aLeft, int nLeft, /* Left doclist */ + char **paRight, int *pnRight /* IN/OUT: Right/output doclist */ +){ + sqlite3_int64 i1 = 0; + sqlite3_int64 i2 = 0; + sqlite3_int64 iPrev = 0; + char *aRight = *paRight; + char *pEnd1 = &aLeft[nLeft]; + char *pEnd2 = &aRight[*pnRight]; + char *p1 = aLeft; + char *p2 = aRight; + char *p; + int bFirstOut = 0; + char *aOut; + + assert( nDist>0 ); + if( bDescDoclist ){ + aOut = sqlite3_malloc64((sqlite3_int64)*pnRight + FTS3_VARINT_MAX); + if( aOut==0 ) return SQLITE_NOMEM; + }else{ + aOut = aRight; + } + p = aOut; + + fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2); + + while( p1 && p2 ){ + sqlite3_int64 iDiff = DOCID_CMP(i1, i2); + if( iDiff==0 ){ + char *pSave = p; + sqlite3_int64 iPrevSave = iPrev; + int bFirstOutSave = bFirstOut; + + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); + if( 0==fts3PoslistPhraseMerge(&p, nDist, 0, 1, &p1, &p2) ){ + p = pSave; + iPrev = iPrevSave; + bFirstOut = bFirstOutSave; + } + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + }else if( iDiff<0 ){ + fts3PoslistCopy(0, &p1); + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + }else{ + fts3PoslistCopy(0, &p2); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + } + } + + *pnRight = (int)(p - aOut); + if( bDescDoclist ){ + sqlite3_free(aRight); + *paRight = aOut; + } + + return SQLITE_OK; +} + +/* +** Argument pList points to a position list nList bytes in size. This +** function checks to see if the position list contains any entries for +** a token in position 0 (of any column). If so, it writes argument iDelta +** to the output buffer pOut, followed by a position list consisting only +** of the entries from pList at position 0, and terminated by an 0x00 byte. +** The value returned is the number of bytes written to pOut (if any). +*/ +SQLITE_PRIVATE int sqlite3Fts3FirstFilter( + sqlite3_int64 iDelta, /* Varint that may be written to pOut */ + char *pList, /* Position list (no 0x00 term) */ + int nList, /* Size of pList in bytes */ + char *pOut /* Write output here */ +){ + int nOut = 0; + int bWritten = 0; /* True once iDelta has been written */ + char *p = pList; + char *pEnd = &pList[nList]; + + if( *p!=0x01 ){ + if( *p==0x02 ){ + nOut += sqlite3Fts3PutVarint(&pOut[nOut], iDelta); + pOut[nOut++] = 0x02; + bWritten = 1; + } + fts3ColumnlistCopy(0, &p); + } + + while( paaOutput); i++){ + if( pTS->aaOutput[i] ){ + if( !aOut ){ + aOut = pTS->aaOutput[i]; + nOut = pTS->anOutput[i]; + pTS->aaOutput[i] = 0; + }else{ + int nNew; + char *aNew; + + int rc = fts3DoclistOrMerge(p->bDescIdx, + pTS->aaOutput[i], pTS->anOutput[i], aOut, nOut, &aNew, &nNew + ); + if( rc!=SQLITE_OK ){ + sqlite3_free(aOut); + return rc; + } + + sqlite3_free(pTS->aaOutput[i]); + sqlite3_free(aOut); + pTS->aaOutput[i] = 0; + aOut = aNew; + nOut = nNew; + } + } + } + + pTS->aaOutput[0] = aOut; + pTS->anOutput[0] = nOut; + return SQLITE_OK; +} + +/* +** Merge the doclist aDoclist/nDoclist into the TermSelect object passed +** as the first argument. The merge is an "OR" merge (see function +** fts3DoclistOrMerge() for details). +** +** This function is called with the doclist for each term that matches +** a queried prefix. It merges all these doclists into one, the doclist +** for the specified prefix. Since there can be a very large number of +** doclists to merge, the merging is done pair-wise using the TermSelect +** object. +** +** This function returns SQLITE_OK if the merge is successful, or an +** SQLite error code (SQLITE_NOMEM) if an error occurs. +*/ +static int fts3TermSelectMerge( + Fts3Table *p, /* FTS table handle */ + TermSelect *pTS, /* TermSelect object to merge into */ + char *aDoclist, /* Pointer to doclist */ + int nDoclist /* Size of aDoclist in bytes */ +){ + if( pTS->aaOutput[0]==0 ){ + /* If this is the first term selected, copy the doclist to the output + ** buffer using memcpy(). + ** + ** Add FTS3_VARINT_MAX bytes of unused space to the end of the + ** allocation. This is so as to ensure that the buffer is big enough + ** to hold the current doclist AND'd with any other doclist. If the + ** doclists are stored in order=ASC order, this padding would not be + ** required (since the size of [doclistA AND doclistB] is always less + ** than or equal to the size of [doclistA] in that case). But this is + ** not true for order=DESC. For example, a doclist containing (1, -1) + ** may be smaller than (-1), as in the first example the -1 may be stored + ** as a single-byte delta, whereas in the second it must be stored as a + ** FTS3_VARINT_MAX byte varint. + ** + ** Similar padding is added in the fts3DoclistOrMerge() function. + */ + pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1); + pTS->anOutput[0] = nDoclist; + if( pTS->aaOutput[0] ){ + memcpy(pTS->aaOutput[0], aDoclist, nDoclist); + memset(&pTS->aaOutput[0][nDoclist], 0, FTS3_VARINT_MAX); + }else{ + return SQLITE_NOMEM; + } + }else{ + char *aMerge = aDoclist; + int nMerge = nDoclist; + int iOut; + + for(iOut=0; iOutaaOutput); iOut++){ + if( pTS->aaOutput[iOut]==0 ){ + assert( iOut>0 ); + pTS->aaOutput[iOut] = aMerge; + pTS->anOutput[iOut] = nMerge; + break; + }else{ + char *aNew; + int nNew; + + int rc = fts3DoclistOrMerge(p->bDescIdx, aMerge, nMerge, + pTS->aaOutput[iOut], pTS->anOutput[iOut], &aNew, &nNew + ); + if( rc!=SQLITE_OK ){ + if( aMerge!=aDoclist ) sqlite3_free(aMerge); + return rc; + } + + if( aMerge!=aDoclist ) sqlite3_free(aMerge); + sqlite3_free(pTS->aaOutput[iOut]); + pTS->aaOutput[iOut] = 0; + + aMerge = aNew; + nMerge = nNew; + if( (iOut+1)==SizeofArray(pTS->aaOutput) ){ + pTS->aaOutput[iOut] = aMerge; + pTS->anOutput[iOut] = nMerge; + } + } + } + } + return SQLITE_OK; +} + +/* +** Append SegReader object pNew to the end of the pCsr->apSegment[] array. +*/ +static int fts3SegReaderCursorAppend( + Fts3MultiSegReader *pCsr, + Fts3SegReader *pNew +){ + if( (pCsr->nSegment%16)==0 ){ + Fts3SegReader **apNew; + sqlite3_int64 nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); + apNew = (Fts3SegReader **)sqlite3_realloc64(pCsr->apSegment, nByte); + if( !apNew ){ + sqlite3Fts3SegReaderFree(pNew); + return SQLITE_NOMEM; + } + pCsr->apSegment = apNew; + } + pCsr->apSegment[pCsr->nSegment++] = pNew; + return SQLITE_OK; +} + +/* +** Add seg-reader objects to the Fts3MultiSegReader object passed as the +** 8th argument. +** +** This function returns SQLITE_OK if successful, or an SQLite error code +** otherwise. +*/ +static int fts3SegReaderCursor( + Fts3Table *p, /* FTS3 table handle */ + int iLangid, /* Language id */ + int iIndex, /* Index to search (from 0 to p->nIndex-1) */ + int iLevel, /* Level of segments to scan */ + const char *zTerm, /* Term to query for */ + int nTerm, /* Size of zTerm in bytes */ + int isPrefix, /* True for a prefix search */ + int isScan, /* True to scan from zTerm to EOF */ + Fts3MultiSegReader *pCsr /* Cursor object to populate */ +){ + int rc = SQLITE_OK; /* Error code */ + sqlite3_stmt *pStmt = 0; /* Statement to iterate through segments */ + int rc2; /* Result of sqlite3_reset() */ + + /* If iLevel is less than 0 and this is not a scan, include a seg-reader + ** for the pending-terms. If this is a scan, then this call must be being + ** made by an fts4aux module, not an FTS table. In this case calling + ** Fts3SegReaderPending might segfault, as the data structures used by + ** fts4aux are not completely populated. So it's easiest to filter these + ** calls out here. */ + if( iLevel<0 && p->aIndex && p->iPrevLangid==iLangid ){ + Fts3SegReader *pSeg = 0; + rc = sqlite3Fts3SegReaderPending(p, iIndex, zTerm, nTerm, isPrefix||isScan, &pSeg); + if( rc==SQLITE_OK && pSeg ){ + rc = fts3SegReaderCursorAppend(pCsr, pSeg); + } + } + + if( iLevel!=FTS3_SEGCURSOR_PENDING ){ + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3AllSegdirs(p, iLangid, iIndex, iLevel, &pStmt); + } + + while( rc==SQLITE_OK && SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){ + Fts3SegReader *pSeg = 0; + + /* Read the values returned by the SELECT into local variables. */ + sqlite3_int64 iStartBlock = sqlite3_column_int64(pStmt, 1); + sqlite3_int64 iLeavesEndBlock = sqlite3_column_int64(pStmt, 2); + sqlite3_int64 iEndBlock = sqlite3_column_int64(pStmt, 3); + int nRoot = sqlite3_column_bytes(pStmt, 4); + char const *zRoot = sqlite3_column_blob(pStmt, 4); + + /* If zTerm is not NULL, and this segment is not stored entirely on its + ** root node, the range of leaves scanned can be reduced. Do this. */ + if( iStartBlock && zTerm && zRoot ){ + sqlite3_int64 *pi = (isPrefix ? &iLeavesEndBlock : 0); + rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &iStartBlock, pi); + if( rc!=SQLITE_OK ) goto finished; + if( isPrefix==0 && isScan==0 ) iLeavesEndBlock = iStartBlock; + } + + rc = sqlite3Fts3SegReaderNew(pCsr->nSegment+1, + (isPrefix==0 && isScan==0), + iStartBlock, iLeavesEndBlock, + iEndBlock, zRoot, nRoot, &pSeg + ); + if( rc!=SQLITE_OK ) goto finished; + rc = fts3SegReaderCursorAppend(pCsr, pSeg); + } + } + + finished: + rc2 = sqlite3_reset(pStmt); + if( rc==SQLITE_DONE ) rc = rc2; + + return rc; +} + +/* +** Set up a cursor object for iterating through a full-text index or a +** single level therein. +*/ +SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor( + Fts3Table *p, /* FTS3 table handle */ + int iLangid, /* Language-id to search */ + int iIndex, /* Index to search (from 0 to p->nIndex-1) */ + int iLevel, /* Level of segments to scan */ + const char *zTerm, /* Term to query for */ + int nTerm, /* Size of zTerm in bytes */ + int isPrefix, /* True for a prefix search */ + int isScan, /* True to scan from zTerm to EOF */ + Fts3MultiSegReader *pCsr /* Cursor object to populate */ +){ + assert( iIndex>=0 && iIndexnIndex ); + assert( iLevel==FTS3_SEGCURSOR_ALL + || iLevel==FTS3_SEGCURSOR_PENDING + || iLevel>=0 + ); + assert( iLevelbase.pVtab; + + if( isPrefix ){ + for(i=1; bFound==0 && inIndex; i++){ + if( p->aIndex[i].nPrefix==nTerm ){ + bFound = 1; + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0, pSegcsr + ); + pSegcsr->bLookup = 1; + } + } + + for(i=1; bFound==0 && inIndex; i++){ + if( p->aIndex[i].nPrefix==nTerm+1 ){ + bFound = 1; + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 1, 0, pSegcsr + ); + if( rc==SQLITE_OK ){ + rc = fts3SegReaderCursorAddZero( + p, pCsr->iLangid, zTerm, nTerm, pSegcsr + ); + } + } + } + } + + if( bFound==0 ){ + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, isPrefix, 0, pSegcsr + ); + pSegcsr->bLookup = !isPrefix; + } + } + + *ppSegcsr = pSegcsr; + return rc; +} + +/* +** Free an Fts3MultiSegReader allocated by fts3TermSegReaderCursor(). +*/ +static void fts3SegReaderCursorFree(Fts3MultiSegReader *pSegcsr){ + sqlite3Fts3SegReaderFinish(pSegcsr); + sqlite3_free(pSegcsr); +} + +/* +** This function retrieves the doclist for the specified term (or term +** prefix) from the database. +*/ +static int fts3TermSelect( + Fts3Table *p, /* Virtual table handle */ + Fts3PhraseToken *pTok, /* Token to query for */ + int iColumn, /* Column to query (or -ve for all columns) */ + int *pnOut, /* OUT: Size of buffer at *ppOut */ + char **ppOut /* OUT: Malloced result buffer */ +){ + int rc; /* Return code */ + Fts3MultiSegReader *pSegcsr; /* Seg-reader cursor for this term */ + TermSelect tsc; /* Object for pair-wise doclist merging */ + Fts3SegFilter filter; /* Segment term filter configuration */ + + pSegcsr = pTok->pSegcsr; + memset(&tsc, 0, sizeof(TermSelect)); + + filter.flags = FTS3_SEGMENT_IGNORE_EMPTY | FTS3_SEGMENT_REQUIRE_POS + | (pTok->isPrefix ? FTS3_SEGMENT_PREFIX : 0) + | (pTok->bFirst ? FTS3_SEGMENT_FIRST : 0) + | (iColumnnColumn ? FTS3_SEGMENT_COLUMN_FILTER : 0); + filter.iCol = iColumn; + filter.zTerm = pTok->z; + filter.nTerm = pTok->n; + + rc = sqlite3Fts3SegReaderStart(p, pSegcsr, &filter); + while( SQLITE_OK==rc + && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pSegcsr)) + ){ + rc = fts3TermSelectMerge(p, &tsc, pSegcsr->aDoclist, pSegcsr->nDoclist); + } + + if( rc==SQLITE_OK ){ + rc = fts3TermSelectFinishMerge(p, &tsc); + } + if( rc==SQLITE_OK ){ + *ppOut = tsc.aaOutput[0]; + *pnOut = tsc.anOutput[0]; + }else{ + int i; + for(i=0; ipSegcsr = 0; + return rc; +} + +/* +** This function counts the total number of docids in the doclist stored +** in buffer aList[], size nList bytes. +** +** If the isPoslist argument is true, then it is assumed that the doclist +** contains a position-list following each docid. Otherwise, it is assumed +** that the doclist is simply a list of docids stored as delta encoded +** varints. +*/ +static int fts3DoclistCountDocids(char *aList, int nList){ + int nDoc = 0; /* Return value */ + if( aList ){ + char *aEnd = &aList[nList]; /* Pointer to one byte after EOF */ + char *p = aList; /* Cursor */ + while( peSearch==FTS3_DOCID_SEARCH || pCsr->eSearch==FTS3_FULLSCAN_SEARCH ){ + Fts3Table *pTab = (Fts3Table*)pCursor->pVtab; + pTab->bLock++; + if( SQLITE_ROW!=sqlite3_step(pCsr->pStmt) ){ + pCsr->isEof = 1; + rc = sqlite3_reset(pCsr->pStmt); + }else{ + pCsr->iPrevId = sqlite3_column_int64(pCsr->pStmt, 0); + rc = SQLITE_OK; + } + pTab->bLock--; + }else{ + rc = fts3EvalNext((Fts3Cursor *)pCursor); + } + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + return rc; +} + +/* +** If the numeric type of argument pVal is "integer", then return it +** converted to a 64-bit signed integer. Otherwise, return a copy of +** the second parameter, iDefault. +*/ +static sqlite3_int64 fts3DocidRange(sqlite3_value *pVal, i64 iDefault){ + if( pVal ){ + int eType = sqlite3_value_numeric_type(pVal); + if( eType==SQLITE_INTEGER ){ + return sqlite3_value_int64(pVal); + } + } + return iDefault; +} + +/* +** This is the xFilter interface for the virtual table. See +** the virtual table xFilter method documentation for additional +** information. +** +** If idxNum==FTS3_FULLSCAN_SEARCH then do a full table scan against +** the %_content table. +** +** If idxNum==FTS3_DOCID_SEARCH then do a docid lookup for a single entry +** in the %_content table. +** +** If idxNum>=FTS3_FULLTEXT_SEARCH then use the full text index. The +** column on the left-hand side of the MATCH operator is column +** number idxNum-FTS3_FULLTEXT_SEARCH, 0 indexed. argv[0] is the right-hand +** side of the MATCH operator. +*/ +static int fts3FilterMethod( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, /* Strategy index */ + const char *idxStr, /* Unused */ + int nVal, /* Number of elements in apVal */ + sqlite3_value **apVal /* Arguments for the indexing scheme */ +){ + int rc = SQLITE_OK; + char *zSql; /* SQL statement used to access %_content */ + int eSearch; + Fts3Table *p = (Fts3Table *)pCursor->pVtab; + Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; + + sqlite3_value *pCons = 0; /* The MATCH or rowid constraint, if any */ + sqlite3_value *pLangid = 0; /* The "langid = ?" constraint, if any */ + sqlite3_value *pDocidGe = 0; /* The "docid >= ?" constraint, if any */ + sqlite3_value *pDocidLe = 0; /* The "docid <= ?" constraint, if any */ + int iIdx; + + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(nVal); + + if( p->bLock ){ + return SQLITE_ERROR; + } + + eSearch = (idxNum & 0x0000FFFF); + assert( eSearch>=0 && eSearch<=(FTS3_FULLTEXT_SEARCH+p->nColumn) ); + assert( p->pSegments==0 ); + + /* Collect arguments into local variables */ + iIdx = 0; + if( eSearch!=FTS3_FULLSCAN_SEARCH ) pCons = apVal[iIdx++]; + if( idxNum & FTS3_HAVE_LANGID ) pLangid = apVal[iIdx++]; + if( idxNum & FTS3_HAVE_DOCID_GE ) pDocidGe = apVal[iIdx++]; + if( idxNum & FTS3_HAVE_DOCID_LE ) pDocidLe = apVal[iIdx++]; + assert( iIdx==nVal ); + + /* In case the cursor has been used before, clear it now. */ + fts3ClearCursor(pCsr); + + /* Set the lower and upper bounds on docids to return */ + pCsr->iMinDocid = fts3DocidRange(pDocidGe, SMALLEST_INT64); + pCsr->iMaxDocid = fts3DocidRange(pDocidLe, LARGEST_INT64); + + if( idxStr ){ + pCsr->bDesc = (idxStr[0]=='D'); + }else{ + pCsr->bDesc = p->bDescIdx; + } + pCsr->eSearch = (i16)eSearch; + + if( eSearch!=FTS3_DOCID_SEARCH && eSearch!=FTS3_FULLSCAN_SEARCH ){ + int iCol = eSearch-FTS3_FULLTEXT_SEARCH; + const char *zQuery = (const char *)sqlite3_value_text(pCons); + + if( zQuery==0 && sqlite3_value_type(pCons)!=SQLITE_NULL ){ + return SQLITE_NOMEM; + } + + pCsr->iLangid = 0; + if( pLangid ) pCsr->iLangid = sqlite3_value_int(pLangid); + + assert( p->base.zErrMsg==0 ); + rc = sqlite3Fts3ExprParse(p->pTokenizer, pCsr->iLangid, + p->azColumn, p->bFts4, p->nColumn, iCol, zQuery, -1, &pCsr->pExpr, + &p->base.zErrMsg + ); + if( rc!=SQLITE_OK ){ + return rc; + } + + rc = fts3EvalStart(pCsr); + sqlite3Fts3SegmentsClose(p); + if( rc!=SQLITE_OK ) return rc; + pCsr->pNextId = pCsr->aDoclist; + pCsr->iPrevId = 0; + } + + /* Compile a SELECT statement for this cursor. For a full-table-scan, the + ** statement loops through all rows of the %_content table. For a + ** full-text query or docid lookup, the statement retrieves a single + ** row by docid. + */ + if( eSearch==FTS3_FULLSCAN_SEARCH ){ + if( pDocidGe || pDocidLe ){ + zSql = sqlite3_mprintf( + "SELECT %s WHERE rowid BETWEEN %lld AND %lld ORDER BY rowid %s", + p->zReadExprlist, pCsr->iMinDocid, pCsr->iMaxDocid, + (pCsr->bDesc ? "DESC" : "ASC") + ); + }else{ + zSql = sqlite3_mprintf("SELECT %s ORDER BY rowid %s", + p->zReadExprlist, (pCsr->bDesc ? "DESC" : "ASC") + ); + } + if( zSql ){ + p->bLock++; + rc = sqlite3_prepare_v3( + p->db,zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0 + ); + p->bLock--; + sqlite3_free(zSql); + }else{ + rc = SQLITE_NOMEM; + } + }else if( eSearch==FTS3_DOCID_SEARCH ){ + rc = fts3CursorSeekStmt(pCsr); + if( rc==SQLITE_OK ){ + rc = sqlite3_bind_value(pCsr->pStmt, 1, pCons); + } + } + if( rc!=SQLITE_OK ) return rc; + + return fts3NextMethod(pCursor); +} + +/* +** This is the xEof method of the virtual table. SQLite calls this +** routine to find out if it has reached the end of a result set. +*/ +static int fts3EofMethod(sqlite3_vtab_cursor *pCursor){ + Fts3Cursor *pCsr = (Fts3Cursor*)pCursor; + if( pCsr->isEof ){ + fts3ClearCursor(pCsr); + pCsr->isEof = 1; + } + return pCsr->isEof; +} + +/* +** This is the xRowid method. The SQLite core calls this routine to +** retrieve the rowid for the current row of the result set. fts3 +** exposes %_content.docid as the rowid for the virtual table. The +** rowid should be written to *pRowid. +*/ +static int fts3RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + Fts3Cursor *pCsr = (Fts3Cursor *) pCursor; + *pRowid = pCsr->iPrevId; + return SQLITE_OK; +} + +/* +** This is the xColumn method, called by SQLite to request a value from +** the row that the supplied cursor currently points to. +** +** If: +** +** (iCol < p->nColumn) -> The value of the iCol'th user column. +** (iCol == p->nColumn) -> Magic column with the same name as the table. +** (iCol == p->nColumn+1) -> Docid column +** (iCol == p->nColumn+2) -> Langid column +*/ +static int fts3ColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + int rc = SQLITE_OK; /* Return Code */ + Fts3Cursor *pCsr = (Fts3Cursor *) pCursor; + Fts3Table *p = (Fts3Table *)pCursor->pVtab; + + /* The column value supplied by SQLite must be in range. */ + assert( iCol>=0 && iCol<=p->nColumn+2 ); + + switch( iCol-p->nColumn ){ + case 0: + /* The special 'table-name' column */ + sqlite3_result_pointer(pCtx, pCsr, "fts3cursor", 0); + break; + + case 1: + /* The docid column */ + sqlite3_result_int64(pCtx, pCsr->iPrevId); + break; + + case 2: + if( pCsr->pExpr ){ + sqlite3_result_int64(pCtx, pCsr->iLangid); + break; + }else if( p->zLanguageid==0 ){ + sqlite3_result_int(pCtx, 0); + break; + }else{ + iCol = p->nColumn; + /* fall-through */ + } + + default: + /* A user column. Or, if this is a full-table scan, possibly the + ** language-id column. Seek the cursor. */ + rc = fts3CursorSeek(0, pCsr); + if( rc==SQLITE_OK && sqlite3_data_count(pCsr->pStmt)-1>iCol ){ + sqlite3_result_value(pCtx, sqlite3_column_value(pCsr->pStmt, iCol+1)); + } + break; + } + + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + return rc; +} + +/* +** This function is the implementation of the xUpdate callback used by +** FTS3 virtual tables. It is invoked by SQLite each time a row is to be +** inserted, updated or deleted. +*/ +static int fts3UpdateMethod( + sqlite3_vtab *pVtab, /* Virtual table handle */ + int nArg, /* Size of argument array */ + sqlite3_value **apVal, /* Array of arguments */ + sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ +){ + return sqlite3Fts3UpdateMethod(pVtab, nArg, apVal, pRowid); +} + +/* +** Implementation of xSync() method. Flush the contents of the pending-terms +** hash-table to the database. +*/ +static int fts3SyncMethod(sqlite3_vtab *pVtab){ + + /* Following an incremental-merge operation, assuming that the input + ** segments are not completely consumed (the usual case), they are updated + ** in place to remove the entries that have already been merged. This + ** involves updating the leaf block that contains the smallest unmerged + ** entry and each block (if any) between the leaf and the root node. So + ** if the height of the input segment b-trees is N, and input segments + ** are merged eight at a time, updating the input segments at the end + ** of an incremental-merge requires writing (8*(1+N)) blocks. N is usually + ** small - often between 0 and 2. So the overhead of the incremental + ** merge is somewhere between 8 and 24 blocks. To avoid this overhead + ** dwarfing the actual productive work accomplished, the incremental merge + ** is only attempted if it will write at least 64 leaf blocks. Hence + ** nMinMerge. + ** + ** Of course, updating the input segments also involves deleting a bunch + ** of blocks from the segments table. But this is not considered overhead + ** as it would also be required by a crisis-merge that used the same input + ** segments. + */ + const u32 nMinMerge = 64; /* Minimum amount of incr-merge work to do */ + + Fts3Table *p = (Fts3Table*)pVtab; + int rc; + i64 iLastRowid = sqlite3_last_insert_rowid(p->db); + + rc = sqlite3Fts3PendingTermsFlush(p); + if( rc==SQLITE_OK + && p->nLeafAdd>(nMinMerge/16) + && p->nAutoincrmerge && p->nAutoincrmerge!=0xff + ){ + int mxLevel = 0; /* Maximum relative level value in db */ + int A; /* Incr-merge parameter A */ + + rc = sqlite3Fts3MaxLevel(p, &mxLevel); + assert( rc==SQLITE_OK || mxLevel==0 ); + A = p->nLeafAdd * mxLevel; + A += (A/2); + if( A>(int)nMinMerge ) rc = sqlite3Fts3Incrmerge(p, A, p->nAutoincrmerge); + } + sqlite3Fts3SegmentsClose(p); + sqlite3_set_last_insert_rowid(p->db, iLastRowid); + return rc; +} + +/* +** If it is currently unknown whether or not the FTS table has an %_stat +** table (if p->bHasStat==2), attempt to determine this (set p->bHasStat +** to 0 or 1). Return SQLITE_OK if successful, or an SQLite error code +** if an error occurs. +*/ +static int fts3SetHasStat(Fts3Table *p){ + int rc = SQLITE_OK; + if( p->bHasStat==2 ){ + char *zTbl = sqlite3_mprintf("%s_stat", p->zName); + if( zTbl ){ + int res = sqlite3_table_column_metadata(p->db, p->zDb, zTbl, 0,0,0,0,0,0); + sqlite3_free(zTbl); + p->bHasStat = (res==SQLITE_OK); + }else{ + rc = SQLITE_NOMEM; + } + } + return rc; +} + +/* +** Implementation of xBegin() method. +*/ +static int fts3BeginMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table*)pVtab; + UNUSED_PARAMETER(pVtab); + assert( p->pSegments==0 ); + assert( p->nPendingData==0 ); + assert( p->inTransaction!=1 ); + TESTONLY( p->inTransaction = 1 ); + TESTONLY( p->mxSavepoint = -1; ); + p->nLeafAdd = 0; + return fts3SetHasStat(p); +} + +/* +** Implementation of xCommit() method. This is a no-op. The contents of +** the pending-terms hash-table have already been flushed into the database +** by fts3SyncMethod(). +*/ +static int fts3CommitMethod(sqlite3_vtab *pVtab){ + TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); + UNUSED_PARAMETER(pVtab); + assert( p->nPendingData==0 ); + assert( p->inTransaction!=0 ); + assert( p->pSegments==0 ); + TESTONLY( p->inTransaction = 0 ); + TESTONLY( p->mxSavepoint = -1; ); + return SQLITE_OK; +} + +/* +** Implementation of xRollback(). Discard the contents of the pending-terms +** hash-table. Any changes made to the database are reverted by SQLite. +*/ +static int fts3RollbackMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table*)pVtab; + sqlite3Fts3PendingTermsClear(p); + assert( p->inTransaction!=0 ); + TESTONLY( p->inTransaction = 0 ); + TESTONLY( p->mxSavepoint = -1; ); + return SQLITE_OK; +} + +/* +** When called, *ppPoslist must point to the byte immediately following the +** end of a position-list. i.e. ( (*ppPoslist)[-1]==POS_END ). This function +** moves *ppPoslist so that it instead points to the first byte of the +** same position list. +*/ +static void fts3ReversePoslist(char *pStart, char **ppPoslist){ + char *p = &(*ppPoslist)[-2]; + char c = 0; + + /* Skip backwards passed any trailing 0x00 bytes added by NearTrim() */ + while( p>pStart && (c=*p--)==0 ); + + /* Search backwards for a varint with value zero (the end of the previous + ** poslist). This is an 0x00 byte preceded by some byte that does not + ** have the 0x80 bit set. */ + while( p>pStart && (*p & 0x80) | c ){ + c = *p--; + } + assert( p==pStart || c==0 ); + + /* At this point p points to that preceding byte without the 0x80 bit + ** set. So to find the start of the poslist, skip forward 2 bytes then + ** over a varint. + ** + ** Normally. The other case is that p==pStart and the poslist to return + ** is the first in the doclist. In this case do not skip forward 2 bytes. + ** The second part of the if condition (c==0 && *ppPoslist>&p[2]) + ** is required for cases where the first byte of a doclist and the + ** doclist is empty. For example, if the first docid is 10, a doclist + ** that begins with: + ** + ** 0x0A 0x00 + */ + if( p>pStart || (c==0 && *ppPoslist>&p[2]) ){ p = &p[2]; } + while( *p++&0x80 ); + *ppPoslist = p; +} + +/* +** Helper function used by the implementation of the overloaded snippet(), +** offsets() and optimize() SQL functions. +** +** If the value passed as the third argument is a blob of size +** sizeof(Fts3Cursor*), then the blob contents are copied to the +** output variable *ppCsr and SQLITE_OK is returned. Otherwise, an error +** message is written to context pContext and SQLITE_ERROR returned. The +** string passed via zFunc is used as part of the error message. +*/ +static int fts3FunctionArg( + sqlite3_context *pContext, /* SQL function call context */ + const char *zFunc, /* Function name */ + sqlite3_value *pVal, /* argv[0] passed to function */ + Fts3Cursor **ppCsr /* OUT: Store cursor handle here */ +){ + int rc; + *ppCsr = (Fts3Cursor*)sqlite3_value_pointer(pVal, "fts3cursor"); + if( (*ppCsr)!=0 ){ + rc = SQLITE_OK; + }else{ + char *zErr = sqlite3_mprintf("illegal first argument to %s", zFunc); + sqlite3_result_error(pContext, zErr, -1); + sqlite3_free(zErr); + rc = SQLITE_ERROR; + } + return rc; +} + +/* +** Implementation of the snippet() function for FTS3 +*/ +static void fts3SnippetFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of apVal[] array */ + sqlite3_value **apVal /* Array of arguments */ +){ + Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */ + const char *zStart = ""; + const char *zEnd = ""; + const char *zEllipsis = "..."; + int iCol = -1; + int nToken = 15; /* Default number of tokens in snippet */ + + /* There must be at least one argument passed to this function (otherwise + ** the non-overloaded version would have been called instead of this one). + */ + assert( nVal>=1 ); + + if( nVal>6 ){ + sqlite3_result_error(pContext, + "wrong number of arguments to function snippet()", -1); + return; + } + if( fts3FunctionArg(pContext, "snippet", apVal[0], &pCsr) ) return; + + switch( nVal ){ + case 6: nToken = sqlite3_value_int(apVal[5]); + case 5: iCol = sqlite3_value_int(apVal[4]); + case 4: zEllipsis = (const char*)sqlite3_value_text(apVal[3]); + case 3: zEnd = (const char*)sqlite3_value_text(apVal[2]); + case 2: zStart = (const char*)sqlite3_value_text(apVal[1]); + } + if( !zEllipsis || !zEnd || !zStart ){ + sqlite3_result_error_nomem(pContext); + }else if( nToken==0 ){ + sqlite3_result_text(pContext, "", -1, SQLITE_STATIC); + }else if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){ + sqlite3Fts3Snippet(pContext, pCsr, zStart, zEnd, zEllipsis, iCol, nToken); + } +} + +/* +** Implementation of the offsets() function for FTS3 +*/ +static void fts3OffsetsFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of argument array */ + sqlite3_value **apVal /* Array of arguments */ +){ + Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */ + + UNUSED_PARAMETER(nVal); + + assert( nVal==1 ); + if( fts3FunctionArg(pContext, "offsets", apVal[0], &pCsr) ) return; + assert( pCsr ); + if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){ + sqlite3Fts3Offsets(pContext, pCsr); + } +} + +/* +** Implementation of the special optimize() function for FTS3. This +** function merges all segments in the database to a single segment. +** Example usage is: +** +** SELECT optimize(t) FROM t LIMIT 1; +** +** where 't' is the name of an FTS3 table. +*/ +static void fts3OptimizeFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of argument array */ + sqlite3_value **apVal /* Array of arguments */ +){ + int rc; /* Return code */ + Fts3Table *p; /* Virtual table handle */ + Fts3Cursor *pCursor; /* Cursor handle passed through apVal[0] */ + + UNUSED_PARAMETER(nVal); + + assert( nVal==1 ); + if( fts3FunctionArg(pContext, "optimize", apVal[0], &pCursor) ) return; + p = (Fts3Table *)pCursor->base.pVtab; + assert( p ); + + rc = sqlite3Fts3Optimize(p); + + switch( rc ){ + case SQLITE_OK: + sqlite3_result_text(pContext, "Index optimized", -1, SQLITE_STATIC); + break; + case SQLITE_DONE: + sqlite3_result_text(pContext, "Index already optimal", -1, SQLITE_STATIC); + break; + default: + sqlite3_result_error_code(pContext, rc); + break; + } +} + +/* +** Implementation of the matchinfo() function for FTS3 +*/ +static void fts3MatchinfoFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of argument array */ + sqlite3_value **apVal /* Array of arguments */ +){ + Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */ + assert( nVal==1 || nVal==2 ); + if( SQLITE_OK==fts3FunctionArg(pContext, "matchinfo", apVal[0], &pCsr) ){ + const char *zArg = 0; + if( nVal>1 ){ + zArg = (const char *)sqlite3_value_text(apVal[1]); + } + sqlite3Fts3Matchinfo(pContext, pCsr, zArg); + } +} + +/* +** This routine implements the xFindFunction method for the FTS3 +** virtual table. +*/ +static int fts3FindFunctionMethod( + sqlite3_vtab *pVtab, /* Virtual table handle */ + int nArg, /* Number of SQL function arguments */ + const char *zName, /* Name of SQL function */ + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ + void **ppArg /* Unused */ +){ + struct Overloaded { + const char *zName; + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } aOverload[] = { + { "snippet", fts3SnippetFunc }, + { "offsets", fts3OffsetsFunc }, + { "optimize", fts3OptimizeFunc }, + { "matchinfo", fts3MatchinfoFunc }, + }; + int i; /* Iterator variable */ + + UNUSED_PARAMETER(pVtab); + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(ppArg); + + for(i=0; idb; /* Database connection */ + int rc; /* Return Code */ + + /* At this point it must be known if the %_stat table exists or not. + ** So bHasStat may not be 2. */ + rc = fts3SetHasStat(p); + + /* As it happens, the pending terms table is always empty here. This is + ** because an "ALTER TABLE RENAME TABLE" statement inside a transaction + ** always opens a savepoint transaction. And the xSavepoint() method + ** flushes the pending terms table. But leave the (no-op) call to + ** PendingTermsFlush() in in case that changes. + */ + assert( p->nPendingData==0 ); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3PendingTermsFlush(p); + } + + if( p->zContentTbl==0 ){ + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';", + p->zDb, p->zName, zName + ); + } + + if( p->bHasDocsize ){ + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_docsize' RENAME TO '%q_docsize';", + p->zDb, p->zName, zName + ); + } + if( p->bHasStat ){ + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_stat' RENAME TO '%q_stat';", + p->zDb, p->zName, zName + ); + } + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';", + p->zDb, p->zName, zName + ); + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';", + p->zDb, p->zName, zName + ); + return rc; +} + +/* +** The xSavepoint() method. +** +** Flush the contents of the pending-terms table to disk. +*/ +static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ + int rc = SQLITE_OK; + UNUSED_PARAMETER(iSavepoint); + assert( ((Fts3Table *)pVtab)->inTransaction ); + assert( ((Fts3Table *)pVtab)->mxSavepoint <= iSavepoint ); + TESTONLY( ((Fts3Table *)pVtab)->mxSavepoint = iSavepoint ); + if( ((Fts3Table *)pVtab)->bIgnoreSavepoint==0 ){ + rc = fts3SyncMethod(pVtab); + } + return rc; +} + +/* +** The xRelease() method. +** +** This is a no-op. +*/ +static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ + TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); + UNUSED_PARAMETER(iSavepoint); + UNUSED_PARAMETER(pVtab); + assert( p->inTransaction ); + assert( p->mxSavepoint >= iSavepoint ); + TESTONLY( p->mxSavepoint = iSavepoint-1 ); + return SQLITE_OK; +} + +/* +** The xRollbackTo() method. +** +** Discard the contents of the pending terms table. +*/ +static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ + Fts3Table *p = (Fts3Table*)pVtab; + UNUSED_PARAMETER(iSavepoint); + assert( p->inTransaction ); + TESTONLY( p->mxSavepoint = iSavepoint ); + sqlite3Fts3PendingTermsClear(p); + return SQLITE_OK; +} + +/* +** Return true if zName is the extension on one of the shadow tables used +** by this module. +*/ +static int fts3ShadowName(const char *zName){ + static const char *azName[] = { + "content", "docsize", "segdir", "segments", "stat", + }; + unsigned int i; + for(i=0; ieType==FTSQUERY_PHRASE ){ + int i; + int nToken = pExpr->pPhrase->nToken; + *pnToken += nToken; + for(i=0; ipPhrase->aToken[i]; + int rc = fts3TermSegReaderCursor(pCsr, + pToken->z, pToken->n, pToken->isPrefix, &pToken->pSegcsr + ); + if( rc!=SQLITE_OK ){ + *pRc = rc; + return; + } + } + assert( pExpr->pPhrase->iDoclistToken==0 ); + pExpr->pPhrase->iDoclistToken = -1; + }else{ + *pnOr += (pExpr->eType==FTSQUERY_OR); + fts3EvalAllocateReaders(pCsr, pExpr->pLeft, pnToken, pnOr, pRc); + fts3EvalAllocateReaders(pCsr, pExpr->pRight, pnToken, pnOr, pRc); + } + } +} + +/* +** Arguments pList/nList contain the doclist for token iToken of phrase p. +** It is merged into the main doclist stored in p->doclist.aAll/nAll. +** +** This function assumes that pList points to a buffer allocated using +** sqlite3_malloc(). This function takes responsibility for eventually +** freeing the buffer. +** +** SQLITE_OK is returned if successful, or SQLITE_NOMEM if an error occurs. +*/ +static int fts3EvalPhraseMergeToken( + Fts3Table *pTab, /* FTS Table pointer */ + Fts3Phrase *p, /* Phrase to merge pList/nList into */ + int iToken, /* Token pList/nList corresponds to */ + char *pList, /* Pointer to doclist */ + int nList /* Number of bytes in pList */ +){ + int rc = SQLITE_OK; + assert( iToken!=p->iDoclistToken ); + + if( pList==0 ){ + sqlite3_free(p->doclist.aAll); + p->doclist.aAll = 0; + p->doclist.nAll = 0; + } + + else if( p->iDoclistToken<0 ){ + p->doclist.aAll = pList; + p->doclist.nAll = nList; + } + + else if( p->doclist.aAll==0 ){ + sqlite3_free(pList); + } + + else { + char *pLeft; + char *pRight; + int nLeft; + int nRight; + int nDiff; + + if( p->iDoclistTokendoclist.aAll; + nLeft = p->doclist.nAll; + pRight = pList; + nRight = nList; + nDiff = iToken - p->iDoclistToken; + }else{ + pRight = p->doclist.aAll; + nRight = p->doclist.nAll; + pLeft = pList; + nLeft = nList; + nDiff = p->iDoclistToken - iToken; + } + + rc = fts3DoclistPhraseMerge( + pTab->bDescIdx, nDiff, pLeft, nLeft, &pRight, &nRight + ); + sqlite3_free(pLeft); + p->doclist.aAll = pRight; + p->doclist.nAll = nRight; + } + + if( iToken>p->iDoclistToken ) p->iDoclistToken = iToken; + return rc; +} + +/* +** Load the doclist for phrase p into p->doclist.aAll/nAll. The loaded doclist +** does not take deferred tokens into account. +** +** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. +*/ +static int fts3EvalPhraseLoad( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Phrase *p /* Phrase object */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int iToken; + int rc = SQLITE_OK; + + for(iToken=0; rc==SQLITE_OK && iTokennToken; iToken++){ + Fts3PhraseToken *pToken = &p->aToken[iToken]; + assert( pToken->pDeferred==0 || pToken->pSegcsr==0 ); + + if( pToken->pSegcsr ){ + int nThis = 0; + char *pThis = 0; + rc = fts3TermSelect(pTab, pToken, p->iColumn, &nThis, &pThis); + if( rc==SQLITE_OK ){ + rc = fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis); + } + } + assert( pToken->pSegcsr==0 ); + } + + return rc; +} + +#ifndef SQLITE_DISABLE_FTS4_DEFERRED +/* +** This function is called on each phrase after the position lists for +** any deferred tokens have been loaded into memory. It updates the phrases +** current position list to include only those positions that are really +** instances of the phrase (after considering deferred tokens). If this +** means that the phrase does not appear in the current row, doclist.pList +** and doclist.nList are both zeroed. +** +** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. +*/ +static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ + int iToken; /* Used to iterate through phrase tokens */ + char *aPoslist = 0; /* Position list for deferred tokens */ + int nPoslist = 0; /* Number of bytes in aPoslist */ + int iPrev = -1; /* Token number of previous deferred token */ + + assert( pPhrase->doclist.bFreeList==0 ); + + for(iToken=0; iTokennToken; iToken++){ + Fts3PhraseToken *pToken = &pPhrase->aToken[iToken]; + Fts3DeferredToken *pDeferred = pToken->pDeferred; + + if( pDeferred ){ + char *pList; + int nList; + int rc = sqlite3Fts3DeferredTokenList(pDeferred, &pList, &nList); + if( rc!=SQLITE_OK ) return rc; + + if( pList==0 ){ + sqlite3_free(aPoslist); + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + return SQLITE_OK; + + }else if( aPoslist==0 ){ + aPoslist = pList; + nPoslist = nList; + + }else{ + char *aOut = pList; + char *p1 = aPoslist; + char *p2 = aOut; + + assert( iPrev>=0 ); + fts3PoslistPhraseMerge(&aOut, iToken-iPrev, 0, 1, &p1, &p2); + sqlite3_free(aPoslist); + aPoslist = pList; + nPoslist = (int)(aOut - aPoslist); + if( nPoslist==0 ){ + sqlite3_free(aPoslist); + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + return SQLITE_OK; + } + } + iPrev = iToken; + } + } + + if( iPrev>=0 ){ + int nMaxUndeferred = pPhrase->iDoclistToken; + if( nMaxUndeferred<0 ){ + pPhrase->doclist.pList = aPoslist; + pPhrase->doclist.nList = nPoslist; + pPhrase->doclist.iDocid = pCsr->iPrevId; + pPhrase->doclist.bFreeList = 1; + }else{ + int nDistance; + char *p1; + char *p2; + char *aOut; + + if( nMaxUndeferred>iPrev ){ + p1 = aPoslist; + p2 = pPhrase->doclist.pList; + nDistance = nMaxUndeferred - iPrev; + }else{ + p1 = pPhrase->doclist.pList; + p2 = aPoslist; + nDistance = iPrev - nMaxUndeferred; + } + + aOut = (char *)sqlite3_malloc(nPoslist+8); + if( !aOut ){ + sqlite3_free(aPoslist); + return SQLITE_NOMEM; + } + + pPhrase->doclist.pList = aOut; + if( fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2) ){ + pPhrase->doclist.bFreeList = 1; + pPhrase->doclist.nList = (int)(aOut - pPhrase->doclist.pList); + }else{ + sqlite3_free(aOut); + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + } + sqlite3_free(aPoslist); + } + } + + return SQLITE_OK; +} +#endif /* SQLITE_DISABLE_FTS4_DEFERRED */ + +/* +** Maximum number of tokens a phrase may have to be considered for the +** incremental doclists strategy. +*/ +#define MAX_INCR_PHRASE_TOKENS 4 + +/* +** This function is called for each Fts3Phrase in a full-text query +** expression to initialize the mechanism for returning rows. Once this +** function has been called successfully on an Fts3Phrase, it may be +** used with fts3EvalPhraseNext() to iterate through the matching docids. +** +** If parameter bOptOk is true, then the phrase may (or may not) use the +** incremental loading strategy. Otherwise, the entire doclist is loaded into +** memory within this call. +** +** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. +*/ +static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; /* Error code */ + int i; + + /* Determine if doclists may be loaded from disk incrementally. This is + ** possible if the bOptOk argument is true, the FTS doclists will be + ** scanned in forward order, and the phrase consists of + ** MAX_INCR_PHRASE_TOKENS or fewer tokens, none of which are are "^first" + ** tokens or prefix tokens that cannot use a prefix-index. */ + int bHaveIncr = 0; + int bIncrOk = (bOptOk + && pCsr->bDesc==pTab->bDescIdx + && p->nToken<=MAX_INCR_PHRASE_TOKENS && p->nToken>0 +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + && pTab->bNoIncrDoclist==0 +#endif + ); + for(i=0; bIncrOk==1 && inToken; i++){ + Fts3PhraseToken *pToken = &p->aToken[i]; + if( pToken->bFirst || (pToken->pSegcsr!=0 && !pToken->pSegcsr->bLookup) ){ + bIncrOk = 0; + } + if( pToken->pSegcsr ) bHaveIncr = 1; + } + + if( bIncrOk && bHaveIncr ){ + /* Use the incremental approach. */ + int iCol = (p->iColumn >= pTab->nColumn ? -1 : p->iColumn); + for(i=0; rc==SQLITE_OK && inToken; i++){ + Fts3PhraseToken *pToken = &p->aToken[i]; + Fts3MultiSegReader *pSegcsr = pToken->pSegcsr; + if( pSegcsr ){ + rc = sqlite3Fts3MsrIncrStart(pTab, pSegcsr, iCol, pToken->z, pToken->n); + } + } + p->bIncr = 1; + }else{ + /* Load the full doclist for the phrase into memory. */ + rc = fts3EvalPhraseLoad(pCsr, p); + p->bIncr = 0; + } + + assert( rc!=SQLITE_OK || p->nToken<1 || p->aToken[0].pSegcsr==0 || p->bIncr ); + return rc; +} + +/* +** This function is used to iterate backwards (from the end to start) +** through doclists. It is used by this module to iterate through phrase +** doclists in reverse and by the fts3_write.c module to iterate through +** pending-terms lists when writing to databases with "order=desc". +** +** The doclist may be sorted in ascending (parameter bDescIdx==0) or +** descending (parameter bDescIdx==1) order of docid. Regardless, this +** function iterates from the end of the doclist to the beginning. +*/ +SQLITE_PRIVATE void sqlite3Fts3DoclistPrev( + int bDescIdx, /* True if the doclist is desc */ + char *aDoclist, /* Pointer to entire doclist */ + int nDoclist, /* Length of aDoclist in bytes */ + char **ppIter, /* IN/OUT: Iterator pointer */ + sqlite3_int64 *piDocid, /* IN/OUT: Docid pointer */ + int *pnList, /* OUT: List length pointer */ + u8 *pbEof /* OUT: End-of-file flag */ +){ + char *p = *ppIter; + + assert( nDoclist>0 ); + assert( *pbEof==0 ); + assert( p || *piDocid==0 ); + assert( !p || (p>aDoclist && p<&aDoclist[nDoclist]) ); + + if( p==0 ){ + sqlite3_int64 iDocid = 0; + char *pNext = 0; + char *pDocid = aDoclist; + char *pEnd = &aDoclist[nDoclist]; + int iMul = 1; + + while( pDocid0 ); + assert( *pbEof==0 ); + assert_fts3_nc( p || *piDocid==0 ); + assert( !p || (p>=aDoclist && p<=&aDoclist[nDoclist]) ); + + if( p==0 ){ + p = aDoclist; + p += sqlite3Fts3GetVarint(p, piDocid); + }else{ + fts3PoslistCopy(0, &p); + while( p<&aDoclist[nDoclist] && *p==0 ) p++; + if( p>=&aDoclist[nDoclist] ){ + *pbEof = 1; + }else{ + sqlite3_int64 iVar; + p += sqlite3Fts3GetVarint(p, &iVar); + *piDocid += ((bDescIdx ? -1 : 1) * iVar); + } + } + + *ppIter = p; +} + +/* +** Advance the iterator pDL to the next entry in pDL->aAll/nAll. Set *pbEof +** to true if EOF is reached. +*/ +static void fts3EvalDlPhraseNext( + Fts3Table *pTab, + Fts3Doclist *pDL, + u8 *pbEof +){ + char *pIter; /* Used to iterate through aAll */ + char *pEnd; /* 1 byte past end of aAll */ + + if( pDL->pNextDocid ){ + pIter = pDL->pNextDocid; + assert( pDL->aAll!=0 || pIter==0 ); + }else{ + pIter = pDL->aAll; + } + + if( pIter==0 || pIter>=(pEnd = pDL->aAll + pDL->nAll) ){ + /* We have already reached the end of this doclist. EOF. */ + *pbEof = 1; + }else{ + sqlite3_int64 iDelta; + pIter += sqlite3Fts3GetVarint(pIter, &iDelta); + if( pTab->bDescIdx==0 || pDL->pNextDocid==0 ){ + pDL->iDocid += iDelta; + }else{ + pDL->iDocid -= iDelta; + } + pDL->pList = pIter; + fts3PoslistCopy(0, &pIter); + pDL->nList = (int)(pIter - pDL->pList); + + /* pIter now points just past the 0x00 that terminates the position- + ** list for document pDL->iDocid. However, if this position-list was + ** edited in place by fts3EvalNearTrim(), then pIter may not actually + ** point to the start of the next docid value. The following line deals + ** with this case by advancing pIter past the zero-padding added by + ** fts3EvalNearTrim(). */ + while( pIterpNextDocid = pIter; + assert( pIter>=&pDL->aAll[pDL->nAll] || *pIter ); + *pbEof = 0; + } +} + +/* +** Helper type used by fts3EvalIncrPhraseNext() and incrPhraseTokenNext(). +*/ +typedef struct TokenDoclist TokenDoclist; +struct TokenDoclist { + int bIgnore; + sqlite3_int64 iDocid; + char *pList; + int nList; +}; + +/* +** Token pToken is an incrementally loaded token that is part of a +** multi-token phrase. Advance it to the next matching document in the +** database and populate output variable *p with the details of the new +** entry. Or, if the iterator has reached EOF, set *pbEof to true. +** +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. +*/ +static int incrPhraseTokenNext( + Fts3Table *pTab, /* Virtual table handle */ + Fts3Phrase *pPhrase, /* Phrase to advance token of */ + int iToken, /* Specific token to advance */ + TokenDoclist *p, /* OUT: Docid and doclist for new entry */ + u8 *pbEof /* OUT: True if iterator is at EOF */ +){ + int rc = SQLITE_OK; + + if( pPhrase->iDoclistToken==iToken ){ + assert( p->bIgnore==0 ); + assert( pPhrase->aToken[iToken].pSegcsr==0 ); + fts3EvalDlPhraseNext(pTab, &pPhrase->doclist, pbEof); + p->pList = pPhrase->doclist.pList; + p->nList = pPhrase->doclist.nList; + p->iDocid = pPhrase->doclist.iDocid; + }else{ + Fts3PhraseToken *pToken = &pPhrase->aToken[iToken]; + assert( pToken->pDeferred==0 ); + assert( pToken->pSegcsr || pPhrase->iDoclistToken>=0 ); + if( pToken->pSegcsr ){ + assert( p->bIgnore==0 ); + rc = sqlite3Fts3MsrIncrNext( + pTab, pToken->pSegcsr, &p->iDocid, &p->pList, &p->nList + ); + if( p->pList==0 ) *pbEof = 1; + }else{ + p->bIgnore = 1; + } + } + + return rc; +} + + +/* +** The phrase iterator passed as the second argument: +** +** * features at least one token that uses an incremental doclist, and +** +** * does not contain any deferred tokens. +** +** Advance it to the next matching documnent in the database and populate +** the Fts3Doclist.pList and nList fields. +** +** If there is no "next" entry and no error occurs, then *pbEof is set to +** 1 before returning. Otherwise, if no error occurs and the iterator is +** successfully advanced, *pbEof is set to 0. +** +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. +*/ +static int fts3EvalIncrPhraseNext( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Phrase *p, /* Phrase object to advance to next docid */ + u8 *pbEof /* OUT: Set to 1 if EOF */ +){ + int rc = SQLITE_OK; + Fts3Doclist *pDL = &p->doclist; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + u8 bEof = 0; + + /* This is only called if it is guaranteed that the phrase has at least + ** one incremental token. In which case the bIncr flag is set. */ + assert( p->bIncr==1 ); + + if( p->nToken==1 ){ + rc = sqlite3Fts3MsrIncrNext(pTab, p->aToken[0].pSegcsr, + &pDL->iDocid, &pDL->pList, &pDL->nList + ); + if( pDL->pList==0 ) bEof = 1; + }else{ + int bDescDoclist = pCsr->bDesc; + struct TokenDoclist a[MAX_INCR_PHRASE_TOKENS]; + + memset(a, 0, sizeof(a)); + assert( p->nToken<=MAX_INCR_PHRASE_TOKENS ); + assert( p->iDoclistTokennToken && bEof==0; i++){ + rc = incrPhraseTokenNext(pTab, p, i, &a[i], &bEof); + if( a[i].bIgnore==0 && (bMaxSet==0 || DOCID_CMP(iMax, a[i].iDocid)<0) ){ + iMax = a[i].iDocid; + bMaxSet = 1; + } + } + assert( rc!=SQLITE_OK || (p->nToken>=1 && a[p->nToken-1].bIgnore==0) ); + assert( rc!=SQLITE_OK || bMaxSet ); + + /* Keep advancing iterators until they all point to the same document */ + for(i=0; inToken; i++){ + while( rc==SQLITE_OK && bEof==0 + && a[i].bIgnore==0 && DOCID_CMP(a[i].iDocid, iMax)<0 + ){ + rc = incrPhraseTokenNext(pTab, p, i, &a[i], &bEof); + if( DOCID_CMP(a[i].iDocid, iMax)>0 ){ + iMax = a[i].iDocid; + i = 0; + } + } + } + + /* Check if the current entries really are a phrase match */ + if( bEof==0 ){ + int nList = 0; + int nByte = a[p->nToken-1].nList; + char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); + if( !aDoclist ) return SQLITE_NOMEM; + memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); + memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); + + for(i=0; i<(p->nToken-1); i++){ + if( a[i].bIgnore==0 ){ + char *pL = a[i].pList; + char *pR = aDoclist; + char *pOut = aDoclist; + int nDist = p->nToken-1-i; + int res = fts3PoslistPhraseMerge(&pOut, nDist, 0, 1, &pL, &pR); + if( res==0 ) break; + nList = (int)(pOut - aDoclist); + } + } + if( i==(p->nToken-1) ){ + pDL->iDocid = iMax; + pDL->pList = aDoclist; + pDL->nList = nList; + pDL->bFreeList = 1; + break; + } + sqlite3_free(aDoclist); + } + } + } + + *pbEof = bEof; + return rc; +} + +/* +** Attempt to move the phrase iterator to point to the next matching docid. +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. +** +** If there is no "next" entry and no error occurs, then *pbEof is set to +** 1 before returning. Otherwise, if no error occurs and the iterator is +** successfully advanced, *pbEof is set to 0. +*/ +static int fts3EvalPhraseNext( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Phrase *p, /* Phrase object to advance to next docid */ + u8 *pbEof /* OUT: Set to 1 if EOF */ +){ + int rc = SQLITE_OK; + Fts3Doclist *pDL = &p->doclist; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + + if( p->bIncr ){ + rc = fts3EvalIncrPhraseNext(pCsr, p, pbEof); + }else if( pCsr->bDesc!=pTab->bDescIdx && pDL->nAll ){ + sqlite3Fts3DoclistPrev(pTab->bDescIdx, pDL->aAll, pDL->nAll, + &pDL->pNextDocid, &pDL->iDocid, &pDL->nList, pbEof + ); + pDL->pList = pDL->pNextDocid; + }else{ + fts3EvalDlPhraseNext(pTab, pDL, pbEof); + } + + return rc; +} + +/* +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, fts3EvalPhraseStart() is called on all phrases within the +** expression. Also the Fts3Expr.bDeferred variable is set to true for any +** expressions for which all descendent tokens are deferred. +** +** If parameter bOptOk is zero, then it is guaranteed that the +** Fts3Phrase.doclist.aAll/nAll variables contain the entire doclist for +** each phrase in the expression (subject to deferred token processing). +** Or, if bOptOk is non-zero, then one or more tokens within the expression +** may be loaded incrementally, meaning doclist.aAll/nAll is not available. +** +** If an error occurs within this function, *pRc is set to an SQLite error +** code before returning. +*/ +static void fts3EvalStartReaders( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pExpr, /* Expression to initialize phrases in */ + int *pRc /* IN/OUT: Error code */ +){ + if( pExpr && SQLITE_OK==*pRc ){ + if( pExpr->eType==FTSQUERY_PHRASE ){ + int nToken = pExpr->pPhrase->nToken; + if( nToken ){ + int i; + for(i=0; ipPhrase->aToken[i].pDeferred==0 ) break; + } + pExpr->bDeferred = (i==nToken); + } + *pRc = fts3EvalPhraseStart(pCsr, 1, pExpr->pPhrase); + }else{ + fts3EvalStartReaders(pCsr, pExpr->pLeft, pRc); + fts3EvalStartReaders(pCsr, pExpr->pRight, pRc); + pExpr->bDeferred = (pExpr->pLeft->bDeferred && pExpr->pRight->bDeferred); + } + } +} + +/* +** An array of the following structures is assembled as part of the process +** of selecting tokens to defer before the query starts executing (as part +** of the xFilter() method). There is one element in the array for each +** token in the FTS expression. +** +** Tokens are divided into AND/NEAR clusters. All tokens in a cluster belong +** to phrases that are connected only by AND and NEAR operators (not OR or +** NOT). When determining tokens to defer, each AND/NEAR cluster is considered +** separately. The root of a tokens AND/NEAR cluster is stored in +** Fts3TokenAndCost.pRoot. +*/ +typedef struct Fts3TokenAndCost Fts3TokenAndCost; +struct Fts3TokenAndCost { + Fts3Phrase *pPhrase; /* The phrase the token belongs to */ + int iToken; /* Position of token in phrase */ + Fts3PhraseToken *pToken; /* The token itself */ + Fts3Expr *pRoot; /* Root of NEAR/AND cluster */ + int nOvfl; /* Number of overflow pages to load doclist */ + int iCol; /* The column the token must match */ +}; + +/* +** This function is used to populate an allocated Fts3TokenAndCost array. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, if an error occurs during execution, *pRc is set to an +** SQLite error code. +*/ +static void fts3EvalTokenCosts( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pRoot, /* Root of current AND/NEAR cluster */ + Fts3Expr *pExpr, /* Expression to consider */ + Fts3TokenAndCost **ppTC, /* Write new entries to *(*ppTC)++ */ + Fts3Expr ***ppOr, /* Write new OR root to *(*ppOr)++ */ + int *pRc /* IN/OUT: Error code */ +){ + if( *pRc==SQLITE_OK ){ + if( pExpr->eType==FTSQUERY_PHRASE ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + int i; + for(i=0; *pRc==SQLITE_OK && inToken; i++){ + Fts3TokenAndCost *pTC = (*ppTC)++; + pTC->pPhrase = pPhrase; + pTC->iToken = i; + pTC->pRoot = pRoot; + pTC->pToken = &pPhrase->aToken[i]; + pTC->iCol = pPhrase->iColumn; + *pRc = sqlite3Fts3MsrOvfl(pCsr, pTC->pToken->pSegcsr, &pTC->nOvfl); + } + }else if( pExpr->eType!=FTSQUERY_NOT ){ + assert( pExpr->eType==FTSQUERY_OR + || pExpr->eType==FTSQUERY_AND + || pExpr->eType==FTSQUERY_NEAR + ); + assert( pExpr->pLeft && pExpr->pRight ); + if( pExpr->eType==FTSQUERY_OR ){ + pRoot = pExpr->pLeft; + **ppOr = pRoot; + (*ppOr)++; + } + fts3EvalTokenCosts(pCsr, pRoot, pExpr->pLeft, ppTC, ppOr, pRc); + if( pExpr->eType==FTSQUERY_OR ){ + pRoot = pExpr->pRight; + **ppOr = pRoot; + (*ppOr)++; + } + fts3EvalTokenCosts(pCsr, pRoot, pExpr->pRight, ppTC, ppOr, pRc); + } + } +} + +/* +** Determine the average document (row) size in pages. If successful, +** write this value to *pnPage and return SQLITE_OK. Otherwise, return +** an SQLite error code. +** +** The average document size in pages is calculated by first calculating +** determining the average size in bytes, B. If B is less than the amount +** of data that will fit on a single leaf page of an intkey table in +** this database, then the average docsize is 1. Otherwise, it is 1 plus +** the number of overflow pages consumed by a record B bytes in size. +*/ +static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ + int rc = SQLITE_OK; + if( pCsr->nRowAvg==0 ){ + /* The average document size, which is required to calculate the cost + ** of each doclist, has not yet been determined. Read the required + ** data from the %_stat table to calculate it. + ** + ** Entry 0 of the %_stat table is a blob containing (nCol+1) FTS3 + ** varints, where nCol is the number of columns in the FTS3 table. + ** The first varint is the number of documents currently stored in + ** the table. The following nCol varints contain the total amount of + ** data stored in all rows of each column of the table, from left + ** to right. + */ + Fts3Table *p = (Fts3Table*)pCsr->base.pVtab; + sqlite3_stmt *pStmt; + sqlite3_int64 nDoc = 0; + sqlite3_int64 nByte = 0; + const char *pEnd; + const char *a; + + rc = sqlite3Fts3SelectDoctotal(p, &pStmt); + if( rc!=SQLITE_OK ) return rc; + a = sqlite3_column_blob(pStmt, 0); + testcase( a==0 ); /* If %_stat.value set to X'' */ + if( a ){ + pEnd = &a[sqlite3_column_bytes(pStmt, 0)]; + a += sqlite3Fts3GetVarintBounded(a, pEnd, &nDoc); + while( anDoc = nDoc; + pCsr->nRowAvg = (int)(((nByte / nDoc) + p->nPgsz) / p->nPgsz); + assert( pCsr->nRowAvg>0 ); + rc = sqlite3_reset(pStmt); + } + + *pnPage = pCsr->nRowAvg; + return rc; +} + +/* +** This function is called to select the tokens (if any) that will be +** deferred. The array aTC[] has already been populated when this is +** called. +** +** This function is called once for each AND/NEAR cluster in the +** expression. Each invocation determines which tokens to defer within +** the cluster with root node pRoot. See comments above the definition +** of struct Fts3TokenAndCost for more details. +** +** If no error occurs, SQLITE_OK is returned and sqlite3Fts3DeferToken() +** called on each token to defer. Otherwise, an SQLite error code is +** returned. +*/ +static int fts3EvalSelectDeferred( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pRoot, /* Consider tokens with this root node */ + Fts3TokenAndCost *aTC, /* Array of expression tokens and costs */ + int nTC /* Number of entries in aTC[] */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int nDocSize = 0; /* Number of pages per doc loaded */ + int rc = SQLITE_OK; /* Return code */ + int ii; /* Iterator variable for various purposes */ + int nOvfl = 0; /* Total overflow pages used by doclists */ + int nToken = 0; /* Total number of tokens in cluster */ + + int nMinEst = 0; /* The minimum count for any phrase so far. */ + int nLoad4 = 1; /* (Phrases that will be loaded)^4. */ + + /* Tokens are never deferred for FTS tables created using the content=xxx + ** option. The reason being that it is not guaranteed that the content + ** table actually contains the same data as the index. To prevent this from + ** causing any problems, the deferred token optimization is completely + ** disabled for content=xxx tables. */ + if( pTab->zContentTbl ){ + return SQLITE_OK; + } + + /* Count the tokens in this AND/NEAR cluster. If none of the doclists + ** associated with the tokens spill onto overflow pages, or if there is + ** only 1 token, exit early. No tokens to defer in this case. */ + for(ii=0; ii0 ); + + + /* Iterate through all tokens in this AND/NEAR cluster, in ascending order + ** of the number of overflow pages that will be loaded by the pager layer + ** to retrieve the entire doclist for the token from the full-text index. + ** Load the doclists for tokens that are either: + ** + ** a. The cheapest token in the entire query (i.e. the one visited by the + ** first iteration of this loop), or + ** + ** b. Part of a multi-token phrase. + ** + ** After each token doclist is loaded, merge it with the others from the + ** same phrase and count the number of documents that the merged doclist + ** contains. Set variable "nMinEst" to the smallest number of documents in + ** any phrase doclist for which 1 or more token doclists have been loaded. + ** Let nOther be the number of other phrases for which it is certain that + ** one or more tokens will not be deferred. + ** + ** Then, for each token, defer it if loading the doclist would result in + ** loading N or more overflow pages into memory, where N is computed as: + ** + ** (nMinEst + 4^nOther - 1) / (4^nOther) + */ + for(ii=0; iinOvfl) + ){ + pTC = &aTC[iTC]; + } + } + assert( pTC ); + + if( ii && pTC->nOvfl>=((nMinEst+(nLoad4/4)-1)/(nLoad4/4))*nDocSize ){ + /* The number of overflow pages to load for this (and therefore all + ** subsequent) tokens is greater than the estimated number of pages + ** that will be loaded if all subsequent tokens are deferred. + */ + Fts3PhraseToken *pToken = pTC->pToken; + rc = sqlite3Fts3DeferToken(pCsr, pToken, pTC->iCol); + fts3SegReaderCursorFree(pToken->pSegcsr); + pToken->pSegcsr = 0; + }else{ + /* Set nLoad4 to the value of (4^nOther) for the next iteration of the + ** for-loop. Except, limit the value to 2^24 to prevent it from + ** overflowing the 32-bit integer it is stored in. */ + if( ii<12 ) nLoad4 = nLoad4*4; + + if( ii==0 || (pTC->pPhrase->nToken>1 && ii!=nToken-1) ){ + /* Either this is the cheapest token in the entire query, or it is + ** part of a multi-token phrase. Either way, the entire doclist will + ** (eventually) be loaded into memory. It may as well be now. */ + Fts3PhraseToken *pToken = pTC->pToken; + int nList = 0; + char *pList = 0; + rc = fts3TermSelect(pTab, pToken, pTC->iCol, &nList, &pList); + assert( rc==SQLITE_OK || pList==0 ); + if( rc==SQLITE_OK ){ + rc = fts3EvalPhraseMergeToken( + pTab, pTC->pPhrase, pTC->iToken,pList,nList + ); + } + if( rc==SQLITE_OK ){ + int nCount; + nCount = fts3DoclistCountDocids( + pTC->pPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll + ); + if( ii==0 || nCountpToken = 0; + } + + return rc; +} + +/* +** This function is called from within the xFilter method. It initializes +** the full-text query currently stored in pCsr->pExpr. To iterate through +** the results of a query, the caller does: +** +** fts3EvalStart(pCsr); +** while( 1 ){ +** fts3EvalNext(pCsr); +** if( pCsr->bEof ) break; +** ... return row pCsr->iPrevId to the caller ... +** } +*/ +static int fts3EvalStart(Fts3Cursor *pCsr){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int nToken = 0; + int nOr = 0; + + /* Allocate a MultiSegReader for each token in the expression. */ + fts3EvalAllocateReaders(pCsr, pCsr->pExpr, &nToken, &nOr, &rc); + + /* Determine which, if any, tokens in the expression should be deferred. */ +#ifndef SQLITE_DISABLE_FTS4_DEFERRED + if( rc==SQLITE_OK && nToken>1 && pTab->bFts4 ){ + Fts3TokenAndCost *aTC; + Fts3Expr **apOr; + aTC = (Fts3TokenAndCost *)sqlite3_malloc64( + sizeof(Fts3TokenAndCost) * nToken + + sizeof(Fts3Expr *) * nOr * 2 + ); + apOr = (Fts3Expr **)&aTC[nToken]; + + if( !aTC ){ + rc = SQLITE_NOMEM; + }else{ + int ii; + Fts3TokenAndCost *pTC = aTC; + Fts3Expr **ppOr = apOr; + + fts3EvalTokenCosts(pCsr, 0, pCsr->pExpr, &pTC, &ppOr, &rc); + nToken = (int)(pTC-aTC); + nOr = (int)(ppOr-apOr); + + if( rc==SQLITE_OK ){ + rc = fts3EvalSelectDeferred(pCsr, 0, aTC, nToken); + for(ii=0; rc==SQLITE_OK && iipExpr, &rc); + return rc; +} + +/* +** Invalidate the current position list for phrase pPhrase. +*/ +static void fts3EvalInvalidatePoslist(Fts3Phrase *pPhrase){ + if( pPhrase->doclist.bFreeList ){ + sqlite3_free(pPhrase->doclist.pList); + } + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + pPhrase->doclist.bFreeList = 0; +} + +/* +** This function is called to edit the position list associated with +** the phrase object passed as the fifth argument according to a NEAR +** condition. For example: +** +** abc NEAR/5 "def ghi" +** +** Parameter nNear is passed the NEAR distance of the expression (5 in +** the example above). When this function is called, *paPoslist points to +** the position list, and *pnToken is the number of phrase tokens in the +** phrase on the other side of the NEAR operator to pPhrase. For example, +** if pPhrase refers to the "def ghi" phrase, then *paPoslist points to +** the position list associated with phrase "abc". +** +** All positions in the pPhrase position list that are not sufficiently +** close to a position in the *paPoslist position list are removed. If this +** leaves 0 positions, zero is returned. Otherwise, non-zero. +** +** Before returning, *paPoslist is set to point to the position lsit +** associated with pPhrase. And *pnToken is set to the number of tokens in +** pPhrase. +*/ +static int fts3EvalNearTrim( + int nNear, /* NEAR distance. As in "NEAR/nNear". */ + char *aTmp, /* Temporary space to use */ + char **paPoslist, /* IN/OUT: Position list */ + int *pnToken, /* IN/OUT: Tokens in phrase of *paPoslist */ + Fts3Phrase *pPhrase /* The phrase object to trim the doclist of */ +){ + int nParam1 = nNear + pPhrase->nToken; + int nParam2 = nNear + *pnToken; + int nNew; + char *p2; + char *pOut; + int res; + + assert( pPhrase->doclist.pList ); + + p2 = pOut = pPhrase->doclist.pList; + res = fts3PoslistNearMerge( + &pOut, aTmp, nParam1, nParam2, paPoslist, &p2 + ); + if( res ){ + nNew = (int)(pOut - pPhrase->doclist.pList) - 1; + assert( pPhrase->doclist.pList[nNew]=='\0' ); + assert( nNew<=pPhrase->doclist.nList && nNew>0 ); + memset(&pPhrase->doclist.pList[nNew], 0, pPhrase->doclist.nList - nNew); + pPhrase->doclist.nList = nNew; + *paPoslist = pPhrase->doclist.pList; + *pnToken = pPhrase->nToken; + } + + return res; +} + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is called. +** Otherwise, it advances the expression passed as the second argument to +** point to the next matching row in the database. Expressions iterate through +** matching rows in docid order. Ascending order if Fts3Cursor.bDesc is zero, +** or descending if it is non-zero. +** +** If an error occurs, *pRc is set to an SQLite error code. Otherwise, if +** successful, the following variables in pExpr are set: +** +** Fts3Expr.bEof (non-zero if EOF - there is no next row) +** Fts3Expr.iDocid (valid if bEof==0. The docid of the next row) +** +** If the expression is of type FTSQUERY_PHRASE, and the expression is not +** at EOF, then the following variables are populated with the position list +** for the phrase for the visited row: +** +** FTs3Expr.pPhrase->doclist.nList (length of pList in bytes) +** FTs3Expr.pPhrase->doclist.pList (pointer to position list) +** +** It says above that this function advances the expression to the next +** matching row. This is usually true, but there are the following exceptions: +** +** 1. Deferred tokens are not taken into account. If a phrase consists +** entirely of deferred tokens, it is assumed to match every row in +** the db. In this case the position-list is not populated at all. +** +** Or, if a phrase contains one or more deferred tokens and one or +** more non-deferred tokens, then the expression is advanced to the +** next possible match, considering only non-deferred tokens. In other +** words, if the phrase is "A B C", and "B" is deferred, the expression +** is advanced to the next row that contains an instance of "A * C", +** where "*" may match any single token. The position list in this case +** is populated as for "A * C" before returning. +** +** 2. NEAR is treated as AND. If the expression is "x NEAR y", it is +** advanced to point to the next row that matches "x AND y". +** +** See sqlite3Fts3EvalTestDeferred() for details on testing if a row is +** really a match, taking into account deferred tokens and NEAR operators. +*/ +static void fts3EvalNextRow( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pExpr, /* Expr. to advance to next matching row */ + int *pRc /* IN/OUT: Error code */ +){ + if( *pRc==SQLITE_OK ){ + int bDescDoclist = pCsr->bDesc; /* Used by DOCID_CMP() macro */ + assert( pExpr->bEof==0 ); + pExpr->bStart = 1; + + switch( pExpr->eType ){ + case FTSQUERY_NEAR: + case FTSQUERY_AND: { + Fts3Expr *pLeft = pExpr->pLeft; + Fts3Expr *pRight = pExpr->pRight; + assert( !pLeft->bDeferred || !pRight->bDeferred ); + + if( pLeft->bDeferred ){ + /* LHS is entirely deferred. So we assume it matches every row. + ** Advance the RHS iterator to find the next row visited. */ + fts3EvalNextRow(pCsr, pRight, pRc); + pExpr->iDocid = pRight->iDocid; + pExpr->bEof = pRight->bEof; + }else if( pRight->bDeferred ){ + /* RHS is entirely deferred. So we assume it matches every row. + ** Advance the LHS iterator to find the next row visited. */ + fts3EvalNextRow(pCsr, pLeft, pRc); + pExpr->iDocid = pLeft->iDocid; + pExpr->bEof = pLeft->bEof; + }else{ + /* Neither the RHS or LHS are deferred. */ + fts3EvalNextRow(pCsr, pLeft, pRc); + fts3EvalNextRow(pCsr, pRight, pRc); + while( !pLeft->bEof && !pRight->bEof && *pRc==SQLITE_OK ){ + sqlite3_int64 iDiff = DOCID_CMP(pLeft->iDocid, pRight->iDocid); + if( iDiff==0 ) break; + if( iDiff<0 ){ + fts3EvalNextRow(pCsr, pLeft, pRc); + }else{ + fts3EvalNextRow(pCsr, pRight, pRc); + } + } + pExpr->iDocid = pLeft->iDocid; + pExpr->bEof = (pLeft->bEof || pRight->bEof); + if( pExpr->eType==FTSQUERY_NEAR && pExpr->bEof ){ + assert( pRight->eType==FTSQUERY_PHRASE ); + if( pRight->pPhrase->doclist.aAll ){ + Fts3Doclist *pDl = &pRight->pPhrase->doclist; + while( *pRc==SQLITE_OK && pRight->bEof==0 ){ + memset(pDl->pList, 0, pDl->nList); + fts3EvalNextRow(pCsr, pRight, pRc); + } + } + if( pLeft->pPhrase && pLeft->pPhrase->doclist.aAll ){ + Fts3Doclist *pDl = &pLeft->pPhrase->doclist; + while( *pRc==SQLITE_OK && pLeft->bEof==0 ){ + memset(pDl->pList, 0, pDl->nList); + fts3EvalNextRow(pCsr, pLeft, pRc); + } + } + pRight->bEof = pLeft->bEof = 1; + } + } + break; + } + + case FTSQUERY_OR: { + Fts3Expr *pLeft = pExpr->pLeft; + Fts3Expr *pRight = pExpr->pRight; + sqlite3_int64 iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid); + + assert( pLeft->bStart || pLeft->iDocid==pRight->iDocid ); + assert( pRight->bStart || pLeft->iDocid==pRight->iDocid ); + + if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){ + fts3EvalNextRow(pCsr, pLeft, pRc); + }else if( pLeft->bEof || iCmp>0 ){ + fts3EvalNextRow(pCsr, pRight, pRc); + }else{ + fts3EvalNextRow(pCsr, pLeft, pRc); + fts3EvalNextRow(pCsr, pRight, pRc); + } + + pExpr->bEof = (pLeft->bEof && pRight->bEof); + iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid); + if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){ + pExpr->iDocid = pLeft->iDocid; + }else{ + pExpr->iDocid = pRight->iDocid; + } + + break; + } + + case FTSQUERY_NOT: { + Fts3Expr *pLeft = pExpr->pLeft; + Fts3Expr *pRight = pExpr->pRight; + + if( pRight->bStart==0 ){ + fts3EvalNextRow(pCsr, pRight, pRc); + assert( *pRc!=SQLITE_OK || pRight->bStart ); + } + + fts3EvalNextRow(pCsr, pLeft, pRc); + if( pLeft->bEof==0 ){ + while( !*pRc + && !pRight->bEof + && DOCID_CMP(pLeft->iDocid, pRight->iDocid)>0 + ){ + fts3EvalNextRow(pCsr, pRight, pRc); + } + } + pExpr->iDocid = pLeft->iDocid; + pExpr->bEof = pLeft->bEof; + break; + } + + default: { + Fts3Phrase *pPhrase = pExpr->pPhrase; + fts3EvalInvalidatePoslist(pPhrase); + *pRc = fts3EvalPhraseNext(pCsr, pPhrase, &pExpr->bEof); + pExpr->iDocid = pPhrase->doclist.iDocid; + break; + } + } + } +} + +/* +** If *pRc is not SQLITE_OK, or if pExpr is not the root node of a NEAR +** cluster, then this function returns 1 immediately. +** +** Otherwise, it checks if the current row really does match the NEAR +** expression, using the data currently stored in the position lists +** (Fts3Expr->pPhrase.doclist.pList/nList) for each phrase in the expression. +** +** If the current row is a match, the position list associated with each +** phrase in the NEAR expression is edited in place to contain only those +** phrase instances sufficiently close to their peers to satisfy all NEAR +** constraints. In this case it returns 1. If the NEAR expression does not +** match the current row, 0 is returned. The position lists may or may not +** be edited if 0 is returned. +*/ +static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ + int res = 1; + + /* The following block runs if pExpr is the root of a NEAR query. + ** For example, the query: + ** + ** "w" NEAR "x" NEAR "y" NEAR "z" + ** + ** which is represented in tree form as: + ** + ** | + ** +--NEAR--+ <-- root of NEAR query + ** | | + ** +--NEAR--+ "z" + ** | | + ** +--NEAR--+ "y" + ** | | + ** "w" "x" + ** + ** The right-hand child of a NEAR node is always a phrase. The + ** left-hand child may be either a phrase or a NEAR node. There are + ** no exceptions to this - it's the way the parser in fts3_expr.c works. + */ + if( *pRc==SQLITE_OK + && pExpr->eType==FTSQUERY_NEAR + && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) + ){ + Fts3Expr *p; + sqlite3_int64 nTmp = 0; /* Bytes of temp space */ + char *aTmp; /* Temp space for PoslistNearMerge() */ + + /* Allocate temporary working space. */ + for(p=pExpr; p->pLeft; p=p->pLeft){ + assert( p->pRight->pPhrase->doclist.nList>0 ); + nTmp += p->pRight->pPhrase->doclist.nList; + } + nTmp += p->pPhrase->doclist.nList; + aTmp = sqlite3_malloc64(nTmp*2); + if( !aTmp ){ + *pRc = SQLITE_NOMEM; + res = 0; + }else{ + char *aPoslist = p->pPhrase->doclist.pList; + int nToken = p->pPhrase->nToken; + + for(p=p->pParent;res && p && p->eType==FTSQUERY_NEAR; p=p->pParent){ + Fts3Phrase *pPhrase = p->pRight->pPhrase; + int nNear = p->nNear; + res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); + } + + aPoslist = pExpr->pRight->pPhrase->doclist.pList; + nToken = pExpr->pRight->pPhrase->nToken; + for(p=pExpr->pLeft; p && res; p=p->pLeft){ + int nNear; + Fts3Phrase *pPhrase; + assert( p->pParent && p->pParent->pLeft==p ); + nNear = p->pParent->nNear; + pPhrase = ( + p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase + ); + res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); + } + } + + sqlite3_free(aTmp); + } + + return res; +} + +/* +** This function is a helper function for sqlite3Fts3EvalTestDeferred(). +** Assuming no error occurs or has occurred, It returns non-zero if the +** expression passed as the second argument matches the row that pCsr +** currently points to, or zero if it does not. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** If an error occurs during execution of this function, *pRc is set to +** the appropriate SQLite error code. In this case the returned value is +** undefined. +*/ +static int fts3EvalTestExpr( + Fts3Cursor *pCsr, /* FTS cursor handle */ + Fts3Expr *pExpr, /* Expr to test. May or may not be root. */ + int *pRc /* IN/OUT: Error code */ +){ + int bHit = 1; /* Return value */ + if( *pRc==SQLITE_OK ){ + switch( pExpr->eType ){ + case FTSQUERY_NEAR: + case FTSQUERY_AND: + bHit = ( + fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc) + && fts3EvalTestExpr(pCsr, pExpr->pRight, pRc) + && fts3EvalNearTest(pExpr, pRc) + ); + + /* If the NEAR expression does not match any rows, zero the doclist for + ** all phrases involved in the NEAR. This is because the snippet(), + ** offsets() and matchinfo() functions are not supposed to recognize + ** any instances of phrases that are part of unmatched NEAR queries. + ** For example if this expression: + ** + ** ... MATCH 'a OR (b NEAR c)' + ** + ** is matched against a row containing: + ** + ** 'a b d e' + ** + ** then any snippet() should ony highlight the "a" term, not the "b" + ** (as "b" is part of a non-matching NEAR clause). + */ + if( bHit==0 + && pExpr->eType==FTSQUERY_NEAR + && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) + ){ + Fts3Expr *p; + for(p=pExpr; p->pPhrase==0; p=p->pLeft){ + if( p->pRight->iDocid==pCsr->iPrevId ){ + fts3EvalInvalidatePoslist(p->pRight->pPhrase); + } + } + if( p->iDocid==pCsr->iPrevId ){ + fts3EvalInvalidatePoslist(p->pPhrase); + } + } + + break; + + case FTSQUERY_OR: { + int bHit1 = fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc); + int bHit2 = fts3EvalTestExpr(pCsr, pExpr->pRight, pRc); + bHit = bHit1 || bHit2; + break; + } + + case FTSQUERY_NOT: + bHit = ( + fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc) + && !fts3EvalTestExpr(pCsr, pExpr->pRight, pRc) + ); + break; + + default: { +#ifndef SQLITE_DISABLE_FTS4_DEFERRED + if( pCsr->pDeferred + && (pExpr->iDocid==pCsr->iPrevId || pExpr->bDeferred) + ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + assert( pExpr->bDeferred || pPhrase->doclist.bFreeList==0 ); + if( pExpr->bDeferred ){ + fts3EvalInvalidatePoslist(pPhrase); + } + *pRc = fts3EvalDeferredPhrase(pCsr, pPhrase); + bHit = (pPhrase->doclist.pList!=0); + pExpr->iDocid = pCsr->iPrevId; + }else +#endif + { + bHit = (pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId); + } + break; + } + } + } + return bHit; +} + +/* +** This function is called as the second part of each xNext operation when +** iterating through the results of a full-text query. At this point the +** cursor points to a row that matches the query expression, with the +** following caveats: +** +** * Up until this point, "NEAR" operators in the expression have been +** treated as "AND". +** +** * Deferred tokens have not yet been considered. +** +** If *pRc is not SQLITE_OK when this function is called, it immediately +** returns 0. Otherwise, it tests whether or not after considering NEAR +** operators and deferred tokens the current row is still a match for the +** expression. It returns 1 if both of the following are true: +** +** 1. *pRc is SQLITE_OK when this function returns, and +** +** 2. After scanning the current FTS table row for the deferred tokens, +** it is determined that the row does *not* match the query. +** +** Or, if no error occurs and it seems the current row does match the FTS +** query, return 0. +*/ +SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc){ + int rc = *pRc; + int bMiss = 0; + if( rc==SQLITE_OK ){ + + /* If there are one or more deferred tokens, load the current row into + ** memory and scan it to determine the position list for each deferred + ** token. Then, see if this row is really a match, considering deferred + ** tokens and NEAR operators (neither of which were taken into account + ** earlier, by fts3EvalNextRow()). + */ + if( pCsr->pDeferred ){ + rc = fts3CursorSeek(0, pCsr); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3CacheDeferredDoclists(pCsr); + } + } + bMiss = (0==fts3EvalTestExpr(pCsr, pCsr->pExpr, &rc)); + + /* Free the position-lists accumulated for each deferred token above. */ + sqlite3Fts3FreeDeferredDoclists(pCsr); + *pRc = rc; + } + return (rc==SQLITE_OK && bMiss); +} + +/* +** Advance to the next document that matches the FTS expression in +** Fts3Cursor.pExpr. +*/ +static int fts3EvalNext(Fts3Cursor *pCsr){ + int rc = SQLITE_OK; /* Return Code */ + Fts3Expr *pExpr = pCsr->pExpr; + assert( pCsr->isEof==0 ); + if( pExpr==0 ){ + pCsr->isEof = 1; + }else{ + do { + if( pCsr->isRequireSeek==0 ){ + sqlite3_reset(pCsr->pStmt); + } + assert( sqlite3_data_count(pCsr->pStmt)==0 ); + fts3EvalNextRow(pCsr, pExpr, &rc); + pCsr->isEof = pExpr->bEof; + pCsr->isRequireSeek = 1; + pCsr->isMatchinfoNeeded = 1; + pCsr->iPrevId = pExpr->iDocid; + }while( pCsr->isEof==0 && sqlite3Fts3EvalTestDeferred(pCsr, &rc) ); + } + + /* Check if the cursor is past the end of the docid range specified + ** by Fts3Cursor.iMinDocid/iMaxDocid. If so, set the EOF flag. */ + if( rc==SQLITE_OK && ( + (pCsr->bDesc==0 && pCsr->iPrevId>pCsr->iMaxDocid) + || (pCsr->bDesc!=0 && pCsr->iPrevIdiMinDocid) + )){ + pCsr->isEof = 1; + } + + return rc; +} + +/* +** Restart interation for expression pExpr so that the next call to +** fts3EvalNext() visits the first row. Do not allow incremental +** loading or merging of phrase doclists for this iteration. +** +** If *pRc is other than SQLITE_OK when this function is called, it is +** a no-op. If an error occurs within this function, *pRc is set to an +** SQLite error code before returning. +*/ +static void fts3EvalRestart( + Fts3Cursor *pCsr, + Fts3Expr *pExpr, + int *pRc +){ + if( pExpr && *pRc==SQLITE_OK ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + + if( pPhrase ){ + fts3EvalInvalidatePoslist(pPhrase); + if( pPhrase->bIncr ){ + int i; + for(i=0; inToken; i++){ + Fts3PhraseToken *pToken = &pPhrase->aToken[i]; + assert( pToken->pDeferred==0 ); + if( pToken->pSegcsr ){ + sqlite3Fts3MsrIncrRestart(pToken->pSegcsr); + } + } + *pRc = fts3EvalPhraseStart(pCsr, 0, pPhrase); + } + pPhrase->doclist.pNextDocid = 0; + pPhrase->doclist.iDocid = 0; + pPhrase->pOrPoslist = 0; + } + + pExpr->iDocid = 0; + pExpr->bEof = 0; + pExpr->bStart = 0; + + fts3EvalRestart(pCsr, pExpr->pLeft, pRc); + fts3EvalRestart(pCsr, pExpr->pRight, pRc); + } +} + +/* +** After allocating the Fts3Expr.aMI[] array for each phrase in the +** expression rooted at pExpr, the cursor iterates through all rows matched +** by pExpr, calling this function for each row. This function increments +** the values in Fts3Expr.aMI[] according to the position-list currently +** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase +** expression nodes. +*/ +static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){ + if( pExpr ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + if( pPhrase && pPhrase->doclist.pList ){ + int iCol = 0; + char *p = pPhrase->doclist.pList; + + do{ + u8 c = 0; + int iCnt = 0; + while( 0xFE & (*p | c) ){ + if( (c&0x80)==0 ) iCnt++; + c = *p++ & 0x80; + } + + /* aMI[iCol*3 + 1] = Number of occurrences + ** aMI[iCol*3 + 2] = Number of rows containing at least one instance + */ + pExpr->aMI[iCol*3 + 1] += iCnt; + pExpr->aMI[iCol*3 + 2] += (iCnt>0); + if( *p==0x00 ) break; + p++; + p += fts3GetVarint32(p, &iCol); + }while( iColpLeft, nCol); + fts3EvalUpdateCounts(pExpr->pRight, nCol); + } +} + +/* +** Expression pExpr must be of type FTSQUERY_PHRASE. +** +** If it is not already allocated and populated, this function allocates and +** populates the Fts3Expr.aMI[] array for expression pExpr. If pExpr is part +** of a NEAR expression, then it also allocates and populates the same array +** for all other phrases that are part of the NEAR expression. +** +** SQLITE_OK is returned if the aMI[] array is successfully allocated and +** populated. Otherwise, if an error occurs, an SQLite error code is returned. +*/ +static int fts3EvalGatherStats( + Fts3Cursor *pCsr, /* Cursor object */ + Fts3Expr *pExpr /* FTSQUERY_PHRASE expression */ +){ + int rc = SQLITE_OK; /* Return code */ + + assert( pExpr->eType==FTSQUERY_PHRASE ); + if( pExpr->aMI==0 ){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + Fts3Expr *pRoot; /* Root of NEAR expression */ + Fts3Expr *p; /* Iterator used for several purposes */ + + sqlite3_int64 iPrevId = pCsr->iPrevId; + sqlite3_int64 iDocid; + u8 bEof; + + /* Find the root of the NEAR expression */ + pRoot = pExpr; + while( pRoot->pParent && pRoot->pParent->eType==FTSQUERY_NEAR ){ + pRoot = pRoot->pParent; + } + iDocid = pRoot->iDocid; + bEof = pRoot->bEof; + assert( pRoot->bStart ); + + /* Allocate space for the aMSI[] array of each FTSQUERY_PHRASE node */ + for(p=pRoot; p; p=p->pLeft){ + Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight); + assert( pE->aMI==0 ); + pE->aMI = (u32 *)sqlite3_malloc64(pTab->nColumn * 3 * sizeof(u32)); + if( !pE->aMI ) return SQLITE_NOMEM; + memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32)); + } + + fts3EvalRestart(pCsr, pRoot, &rc); + + while( pCsr->isEof==0 && rc==SQLITE_OK ){ + + do { + /* Ensure the %_content statement is reset. */ + if( pCsr->isRequireSeek==0 ) sqlite3_reset(pCsr->pStmt); + assert( sqlite3_data_count(pCsr->pStmt)==0 ); + + /* Advance to the next document */ + fts3EvalNextRow(pCsr, pRoot, &rc); + pCsr->isEof = pRoot->bEof; + pCsr->isRequireSeek = 1; + pCsr->isMatchinfoNeeded = 1; + pCsr->iPrevId = pRoot->iDocid; + }while( pCsr->isEof==0 + && pRoot->eType==FTSQUERY_NEAR + && sqlite3Fts3EvalTestDeferred(pCsr, &rc) + ); + + if( rc==SQLITE_OK && pCsr->isEof==0 ){ + fts3EvalUpdateCounts(pRoot, pTab->nColumn); + } + } + + pCsr->isEof = 0; + pCsr->iPrevId = iPrevId; + + if( bEof ){ + pRoot->bEof = bEof; + }else{ + /* Caution: pRoot may iterate through docids in ascending or descending + ** order. For this reason, even though it seems more defensive, the + ** do loop can not be written: + ** + ** do {...} while( pRoot->iDocidbEof==0 ); + }while( pRoot->iDocid!=iDocid && rc==SQLITE_OK ); + } + } + return rc; +} + +/* +** This function is used by the matchinfo() module to query a phrase +** expression node for the following information: +** +** 1. The total number of occurrences of the phrase in each column of +** the FTS table (considering all rows), and +** +** 2. For each column, the number of rows in the table for which the +** column contains at least one instance of the phrase. +** +** If no error occurs, SQLITE_OK is returned and the values for each column +** written into the array aiOut as follows: +** +** aiOut[iCol*3 + 1] = Number of occurrences +** aiOut[iCol*3 + 2] = Number of rows containing at least one instance +** +** Caveats: +** +** * If a phrase consists entirely of deferred tokens, then all output +** values are set to the number of documents in the table. In other +** words we assume that very common tokens occur exactly once in each +** column of each row of the table. +** +** * If a phrase contains some deferred tokens (and some non-deferred +** tokens), count the potential occurrence identified by considering +** the non-deferred tokens instead of actual phrase occurrences. +** +** * If the phrase is part of a NEAR expression, then only phrase instances +** that meet the NEAR constraint are included in the counts. +*/ +SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats( + Fts3Cursor *pCsr, /* FTS cursor handle */ + Fts3Expr *pExpr, /* Phrase expression */ + u32 *aiOut /* Array to write results into (see above) */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int iCol; + + if( pExpr->bDeferred && pExpr->pParent->eType!=FTSQUERY_NEAR ){ + assert( pCsr->nDoc>0 ); + for(iCol=0; iColnColumn; iCol++){ + aiOut[iCol*3 + 1] = (u32)pCsr->nDoc; + aiOut[iCol*3 + 2] = (u32)pCsr->nDoc; + } + }else{ + rc = fts3EvalGatherStats(pCsr, pExpr); + if( rc==SQLITE_OK ){ + assert( pExpr->aMI ); + for(iCol=0; iColnColumn; iCol++){ + aiOut[iCol*3 + 1] = pExpr->aMI[iCol*3 + 1]; + aiOut[iCol*3 + 2] = pExpr->aMI[iCol*3 + 2]; + } + } + } + + return rc; +} + +/* +** The expression pExpr passed as the second argument to this function +** must be of type FTSQUERY_PHRASE. +** +** The returned value is either NULL or a pointer to a buffer containing +** a position-list indicating the occurrences of the phrase in column iCol +** of the current row. +** +** More specifically, the returned buffer contains 1 varint for each +** occurrence of the phrase in the column, stored using the normal (delta+2) +** compression and is terminated by either an 0x01 or 0x00 byte. For example, +** if the requested column contains "a b X c d X X" and the position-list +** for 'X' is requested, the buffer returned may contain: +** +** 0x04 0x05 0x03 0x01 or 0x04 0x05 0x03 0x00 +** +** This function works regardless of whether or not the phrase is deferred, +** incremental, or neither. +*/ +SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist( + Fts3Cursor *pCsr, /* FTS3 cursor object */ + Fts3Expr *pExpr, /* Phrase to return doclist for */ + int iCol, /* Column to return position list for */ + char **ppOut /* OUT: Pointer to position list */ +){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + char *pIter; + int iThis; + sqlite3_int64 iDocid; + + /* If this phrase is applies specifically to some column other than + ** column iCol, return a NULL pointer. */ + *ppOut = 0; + assert( iCol>=0 && iColnColumn ); + if( (pPhrase->iColumnnColumn && pPhrase->iColumn!=iCol) ){ + return SQLITE_OK; + } + + iDocid = pExpr->iDocid; + pIter = pPhrase->doclist.pList; + if( iDocid!=pCsr->iPrevId || pExpr->bEof ){ + int rc = SQLITE_OK; + int bDescDoclist = pTab->bDescIdx; /* For DOCID_CMP macro */ + int bOr = 0; + u8 bTreeEof = 0; + Fts3Expr *p; /* Used to iterate from pExpr to root */ + Fts3Expr *pNear; /* Most senior NEAR ancestor (or pExpr) */ + int bMatch; + + /* Check if this phrase descends from an OR expression node. If not, + ** return NULL. Otherwise, the entry that corresponds to docid + ** pCsr->iPrevId may lie earlier in the doclist buffer. Or, if the + ** tree that the node is part of has been marked as EOF, but the node + ** itself is not EOF, then it may point to an earlier entry. */ + pNear = pExpr; + for(p=pExpr->pParent; p; p=p->pParent){ + if( p->eType==FTSQUERY_OR ) bOr = 1; + if( p->eType==FTSQUERY_NEAR ) pNear = p; + if( p->bEof ) bTreeEof = 1; + } + if( bOr==0 ) return SQLITE_OK; + + /* This is the descendent of an OR node. In this case we cannot use + ** an incremental phrase. Load the entire doclist for the phrase + ** into memory in this case. */ + if( pPhrase->bIncr ){ + int bEofSave = pNear->bEof; + fts3EvalRestart(pCsr, pNear, &rc); + while( rc==SQLITE_OK && !pNear->bEof ){ + fts3EvalNextRow(pCsr, pNear, &rc); + if( bEofSave==0 && pNear->iDocid==iDocid ) break; + } + assert( rc!=SQLITE_OK || pPhrase->bIncr==0 ); + } + if( bTreeEof ){ + while( rc==SQLITE_OK && !pNear->bEof ){ + fts3EvalNextRow(pCsr, pNear, &rc); + } + } + if( rc!=SQLITE_OK ) return rc; + + bMatch = 1; + for(p=pNear; p; p=p->pLeft){ + u8 bEof = 0; + Fts3Expr *pTest = p; + Fts3Phrase *pPh; + assert( pTest->eType==FTSQUERY_NEAR || pTest->eType==FTSQUERY_PHRASE ); + if( pTest->eType==FTSQUERY_NEAR ) pTest = pTest->pRight; + assert( pTest->eType==FTSQUERY_PHRASE ); + pPh = pTest->pPhrase; + + pIter = pPh->pOrPoslist; + iDocid = pPh->iOrDocid; + if( pCsr->bDesc==bDescDoclist ){ + bEof = !pPh->doclist.nAll || + (pIter >= (pPh->doclist.aAll + pPh->doclist.nAll)); + while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){ + sqlite3Fts3DoclistNext( + bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, + &pIter, &iDocid, &bEof + ); + } + }else{ + bEof = !pPh->doclist.nAll || (pIter && pIter<=pPh->doclist.aAll); + while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){ + int dummy; + sqlite3Fts3DoclistPrev( + bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, + &pIter, &iDocid, &dummy, &bEof + ); + } + } + pPh->pOrPoslist = pIter; + pPh->iOrDocid = iDocid; + if( bEof || iDocid!=pCsr->iPrevId ) bMatch = 0; + } + + if( bMatch ){ + pIter = pPhrase->pOrPoslist; + }else{ + pIter = 0; + } + } + if( pIter==0 ) return SQLITE_OK; + + if( *pIter==0x01 ){ + pIter++; + pIter += fts3GetVarint32(pIter, &iThis); + }else{ + iThis = 0; + } + while( iThisdoclist, and +** * any Fts3MultiSegReader objects held by phrase tokens. +*/ +SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *pPhrase){ + if( pPhrase ){ + int i; + sqlite3_free(pPhrase->doclist.aAll); + fts3EvalInvalidatePoslist(pPhrase); + memset(&pPhrase->doclist, 0, sizeof(Fts3Doclist)); + for(i=0; inToken; i++){ + fts3SegReaderCursorFree(pPhrase->aToken[i].pSegcsr); + pPhrase->aToken[i].pSegcsr = 0; + } + } +} + + +/* +** Return SQLITE_CORRUPT_VTAB. +*/ +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3Fts3Corrupt(){ + return SQLITE_CORRUPT_VTAB; +} +#endif + +#if !SQLITE_CORE +/* +** Initialize API pointer table, if required. +*/ +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_fts3_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3Fts3Init(db); +} +#endif + +#endif + +/************** End of fts3.c ************************************************/ +/************** Begin file fts3_aux.c ****************************************/ +/* +** 2011 Jan 27 +** +** 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. +** +****************************************************************************** +** +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +typedef struct Fts3auxTable Fts3auxTable; +typedef struct Fts3auxCursor Fts3auxCursor; + +struct Fts3auxTable { + sqlite3_vtab base; /* Base class used by SQLite core */ + Fts3Table *pFts3Tab; +}; + +struct Fts3auxCursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + Fts3MultiSegReader csr; /* Must be right after "base" */ + Fts3SegFilter filter; + char *zStop; + int nStop; /* Byte-length of string zStop */ + int iLangid; /* Language id to query */ + int isEof; /* True if cursor is at EOF */ + sqlite3_int64 iRowid; /* Current rowid */ + + int iCol; /* Current value of 'col' column */ + int nStat; /* Size of aStat[] array */ + struct Fts3auxColstats { + sqlite3_int64 nDoc; /* 'documents' values for current csr row */ + sqlite3_int64 nOcc; /* 'occurrences' values for current csr row */ + } *aStat; +}; + +/* +** Schema of the terms table. +*/ +#define FTS3_AUX_SCHEMA \ + "CREATE TABLE x(term, col, documents, occurrences, languageid HIDDEN)" + +/* +** This function does all the work for both the xConnect and xCreate methods. +** These tables have no persistent representation of their own, so xConnect +** and xCreate are identical operations. +*/ +static int fts3auxConnectMethod( + sqlite3 *db, /* Database connection */ + void *pUnused, /* Unused */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + char const *zDb; /* Name of database (e.g. "main") */ + char const *zFts3; /* Name of fts3 table */ + int nDb; /* Result of strlen(zDb) */ + int nFts3; /* Result of strlen(zFts3) */ + sqlite3_int64 nByte; /* Bytes of space to allocate here */ + int rc; /* value returned by declare_vtab() */ + Fts3auxTable *p; /* Virtual table object to return */ + + UNUSED_PARAMETER(pUnused); + + /* The user should invoke this in one of two forms: + ** + ** CREATE VIRTUAL TABLE xxx USING fts4aux(fts4-table); + ** CREATE VIRTUAL TABLE xxx USING fts4aux(fts4-table-db, fts4-table); + */ + if( argc!=4 && argc!=5 ) goto bad_args; + + zDb = argv[1]; + nDb = (int)strlen(zDb); + if( argc==5 ){ + if( nDb==4 && 0==sqlite3_strnicmp("temp", zDb, 4) ){ + zDb = argv[3]; + nDb = (int)strlen(zDb); + zFts3 = argv[4]; + }else{ + goto bad_args; + } + }else{ + zFts3 = argv[3]; + } + nFts3 = (int)strlen(zFts3); + + rc = sqlite3_declare_vtab(db, FTS3_AUX_SCHEMA); + if( rc!=SQLITE_OK ) return rc; + + nByte = sizeof(Fts3auxTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; + p = (Fts3auxTable *)sqlite3_malloc64(nByte); + if( !p ) return SQLITE_NOMEM; + memset(p, 0, nByte); + + p->pFts3Tab = (Fts3Table *)&p[1]; + p->pFts3Tab->zDb = (char *)&p->pFts3Tab[1]; + p->pFts3Tab->zName = &p->pFts3Tab->zDb[nDb+1]; + p->pFts3Tab->db = db; + p->pFts3Tab->nIndex = 1; + + memcpy((char *)p->pFts3Tab->zDb, zDb, nDb); + memcpy((char *)p->pFts3Tab->zName, zFts3, nFts3); + sqlite3Fts3Dequote((char *)p->pFts3Tab->zName); + + *ppVtab = (sqlite3_vtab *)p; + return SQLITE_OK; + + bad_args: + sqlite3Fts3ErrMsg(pzErr, "invalid arguments to fts4aux constructor"); + return SQLITE_ERROR; +} + +/* +** This function does the work for both the xDisconnect and xDestroy methods. +** These tables have no persistent representation of their own, so xDisconnect +** and xDestroy are identical operations. +*/ +static int fts3auxDisconnectMethod(sqlite3_vtab *pVtab){ + Fts3auxTable *p = (Fts3auxTable *)pVtab; + Fts3Table *pFts3 = p->pFts3Tab; + int i; + + /* Free any prepared statements held */ + for(i=0; iaStmt); i++){ + sqlite3_finalize(pFts3->aStmt[i]); + } + sqlite3_free(pFts3->zSegmentsTbl); + sqlite3_free(p); + return SQLITE_OK; +} + +#define FTS4AUX_EQ_CONSTRAINT 1 +#define FTS4AUX_GE_CONSTRAINT 2 +#define FTS4AUX_LE_CONSTRAINT 4 + +/* +** xBestIndex - Analyze a WHERE and ORDER BY clause. +*/ +static int fts3auxBestIndexMethod( + sqlite3_vtab *pVTab, + sqlite3_index_info *pInfo +){ + int i; + int iEq = -1; + int iGe = -1; + int iLe = -1; + int iLangid = -1; + int iNext = 1; /* Next free argvIndex value */ + + UNUSED_PARAMETER(pVTab); + + /* This vtab delivers always results in "ORDER BY term ASC" order. */ + if( pInfo->nOrderBy==1 + && pInfo->aOrderBy[0].iColumn==0 + && pInfo->aOrderBy[0].desc==0 + ){ + pInfo->orderByConsumed = 1; + } + + /* Search for equality and range constraints on the "term" column. + ** And equality constraints on the hidden "languageid" column. */ + for(i=0; inConstraint; i++){ + if( pInfo->aConstraint[i].usable ){ + int op = pInfo->aConstraint[i].op; + int iCol = pInfo->aConstraint[i].iColumn; + + if( iCol==0 ){ + if( op==SQLITE_INDEX_CONSTRAINT_EQ ) iEq = i; + if( op==SQLITE_INDEX_CONSTRAINT_LT ) iLe = i; + if( op==SQLITE_INDEX_CONSTRAINT_LE ) iLe = i; + if( op==SQLITE_INDEX_CONSTRAINT_GT ) iGe = i; + if( op==SQLITE_INDEX_CONSTRAINT_GE ) iGe = i; + } + if( iCol==4 ){ + if( op==SQLITE_INDEX_CONSTRAINT_EQ ) iLangid = i; + } + } + } + + if( iEq>=0 ){ + pInfo->idxNum = FTS4AUX_EQ_CONSTRAINT; + pInfo->aConstraintUsage[iEq].argvIndex = iNext++; + pInfo->estimatedCost = 5; + }else{ + pInfo->idxNum = 0; + pInfo->estimatedCost = 20000; + if( iGe>=0 ){ + pInfo->idxNum += FTS4AUX_GE_CONSTRAINT; + pInfo->aConstraintUsage[iGe].argvIndex = iNext++; + pInfo->estimatedCost /= 2; + } + if( iLe>=0 ){ + pInfo->idxNum += FTS4AUX_LE_CONSTRAINT; + pInfo->aConstraintUsage[iLe].argvIndex = iNext++; + pInfo->estimatedCost /= 2; + } + } + if( iLangid>=0 ){ + pInfo->aConstraintUsage[iLangid].argvIndex = iNext++; + pInfo->estimatedCost--; + } + + return SQLITE_OK; +} + +/* +** xOpen - Open a cursor. +*/ +static int fts3auxOpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + Fts3auxCursor *pCsr; /* Pointer to cursor object to return */ + + UNUSED_PARAMETER(pVTab); + + pCsr = (Fts3auxCursor *)sqlite3_malloc(sizeof(Fts3auxCursor)); + if( !pCsr ) return SQLITE_NOMEM; + memset(pCsr, 0, sizeof(Fts3auxCursor)); + + *ppCsr = (sqlite3_vtab_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** xClose - Close a cursor. +*/ +static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){ + Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab; + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + + sqlite3Fts3SegmentsClose(pFts3); + sqlite3Fts3SegReaderFinish(&pCsr->csr); + sqlite3_free((void *)pCsr->filter.zTerm); + sqlite3_free(pCsr->zStop); + sqlite3_free(pCsr->aStat); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ + if( nSize>pCsr->nStat ){ + struct Fts3auxColstats *aNew; + aNew = (struct Fts3auxColstats *)sqlite3_realloc64(pCsr->aStat, + sizeof(struct Fts3auxColstats) * nSize + ); + if( aNew==0 ) return SQLITE_NOMEM; + memset(&aNew[pCsr->nStat], 0, + sizeof(struct Fts3auxColstats) * (nSize - pCsr->nStat) + ); + pCsr->aStat = aNew; + pCsr->nStat = nSize; + } + return SQLITE_OK; +} + +/* +** xNext - Advance the cursor to the next row, if any. +*/ +static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab; + int rc; + + /* Increment our pretend rowid value. */ + pCsr->iRowid++; + + for(pCsr->iCol++; pCsr->iColnStat; pCsr->iCol++){ + if( pCsr->aStat[pCsr->iCol].nDoc>0 ) return SQLITE_OK; + } + + rc = sqlite3Fts3SegReaderStep(pFts3, &pCsr->csr); + if( rc==SQLITE_ROW ){ + int i = 0; + int nDoclist = pCsr->csr.nDoclist; + char *aDoclist = pCsr->csr.aDoclist; + int iCol; + + int eState = 0; + + if( pCsr->zStop ){ + int n = (pCsr->nStopcsr.nTerm) ? pCsr->nStop : pCsr->csr.nTerm; + int mc = memcmp(pCsr->zStop, pCsr->csr.zTerm, n); + if( mc<0 || (mc==0 && pCsr->csr.nTerm>pCsr->nStop) ){ + pCsr->isEof = 1; + return SQLITE_OK; + } + } + + if( fts3auxGrowStatArray(pCsr, 2) ) return SQLITE_NOMEM; + memset(pCsr->aStat, 0, sizeof(struct Fts3auxColstats) * pCsr->nStat); + iCol = 0; + + while( iaStat[0].nDoc++; + eState = 1; + iCol = 0; + break; + + /* State 1. In this state we are expecting either a 1, indicating + ** that the following integer will be a column number, or the + ** start of a position list for column 0. + ** + ** The only difference between state 1 and state 2 is that if the + ** integer encountered in state 1 is not 0 or 1, then we need to + ** increment the column 0 "nDoc" count for this term. + */ + case 1: + assert( iCol==0 ); + if( v>1 ){ + pCsr->aStat[1].nDoc++; + } + eState = 2; + /* fall through */ + + case 2: + if( v==0 ){ /* 0x00. Next integer will be a docid. */ + eState = 0; + }else if( v==1 ){ /* 0x01. Next integer will be a column number. */ + eState = 3; + }else{ /* 2 or greater. A position. */ + pCsr->aStat[iCol+1].nOcc++; + pCsr->aStat[0].nOcc++; + } + break; + + /* State 3. The integer just read is a column number. */ + default: assert( eState==3 ); + iCol = (int)v; + if( fts3auxGrowStatArray(pCsr, iCol+2) ) return SQLITE_NOMEM; + pCsr->aStat[iCol+1].nDoc++; + eState = 2; + break; + } + } + + pCsr->iCol = 0; + rc = SQLITE_OK; + }else{ + pCsr->isEof = 1; + } + return rc; +} + +/* +** xFilter - Initialize a cursor to point at the start of its data. +*/ +static int fts3auxFilterMethod( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, /* Strategy index */ + const char *idxStr, /* Unused */ + int nVal, /* Number of elements in apVal */ + sqlite3_value **apVal /* Arguments for the indexing scheme */ +){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab; + int rc; + int isScan = 0; + int iLangVal = 0; /* Language id to query */ + + int iEq = -1; /* Index of term=? value in apVal */ + int iGe = -1; /* Index of term>=? value in apVal */ + int iLe = -1; /* Index of term<=? value in apVal */ + int iLangid = -1; /* Index of languageid=? value in apVal */ + int iNext = 0; + + UNUSED_PARAMETER(nVal); + UNUSED_PARAMETER(idxStr); + + assert( idxStr==0 ); + assert( idxNum==FTS4AUX_EQ_CONSTRAINT || idxNum==0 + || idxNum==FTS4AUX_LE_CONSTRAINT || idxNum==FTS4AUX_GE_CONSTRAINT + || idxNum==(FTS4AUX_LE_CONSTRAINT|FTS4AUX_GE_CONSTRAINT) + ); + + if( idxNum==FTS4AUX_EQ_CONSTRAINT ){ + iEq = iNext++; + }else{ + isScan = 1; + if( idxNum & FTS4AUX_GE_CONSTRAINT ){ + iGe = iNext++; + } + if( idxNum & FTS4AUX_LE_CONSTRAINT ){ + iLe = iNext++; + } + } + if( iNextfilter.zTerm); + sqlite3Fts3SegReaderFinish(&pCsr->csr); + sqlite3_free((void *)pCsr->filter.zTerm); + sqlite3_free(pCsr->aStat); + memset(&pCsr->csr, 0, ((u8*)&pCsr[1]) - (u8*)&pCsr->csr); + + pCsr->filter.flags = FTS3_SEGMENT_REQUIRE_POS|FTS3_SEGMENT_IGNORE_EMPTY; + if( isScan ) pCsr->filter.flags |= FTS3_SEGMENT_SCAN; + + if( iEq>=0 || iGe>=0 ){ + const unsigned char *zStr = sqlite3_value_text(apVal[0]); + assert( (iEq==0 && iGe==-1) || (iEq==-1 && iGe==0) ); + if( zStr ){ + pCsr->filter.zTerm = sqlite3_mprintf("%s", zStr); + if( pCsr->filter.zTerm==0 ) return SQLITE_NOMEM; + pCsr->filter.nTerm = (int)strlen(pCsr->filter.zTerm); + } + } + + if( iLe>=0 ){ + pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iLe])); + if( pCsr->zStop==0 ) return SQLITE_NOMEM; + pCsr->nStop = (int)strlen(pCsr->zStop); + } + + if( iLangid>=0 ){ + iLangVal = sqlite3_value_int(apVal[iLangid]); + + /* If the user specified a negative value for the languageid, use zero + ** instead. This works, as the "languageid=?" constraint will also + ** be tested by the VDBE layer. The test will always be false (since + ** this module will not return a row with a negative languageid), and + ** so the overall query will return zero rows. */ + if( iLangVal<0 ) iLangVal = 0; + } + pCsr->iLangid = iLangVal; + + rc = sqlite3Fts3SegReaderCursor(pFts3, iLangVal, 0, FTS3_SEGCURSOR_ALL, + pCsr->filter.zTerm, pCsr->filter.nTerm, 0, isScan, &pCsr->csr + ); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3SegReaderStart(pFts3, &pCsr->csr, &pCsr->filter); + } + + if( rc==SQLITE_OK ) rc = fts3auxNextMethod(pCursor); + return rc; +} + +/* +** xEof - Return true if the cursor is at EOF, or false otherwise. +*/ +static int fts3auxEofMethod(sqlite3_vtab_cursor *pCursor){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + return pCsr->isEof; +} + +/* +** xColumn - Return a column value. +*/ +static int fts3auxColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + Fts3auxCursor *p = (Fts3auxCursor *)pCursor; + + assert( p->isEof==0 ); + switch( iCol ){ + case 0: /* term */ + sqlite3_result_text(pCtx, p->csr.zTerm, p->csr.nTerm, SQLITE_TRANSIENT); + break; + + case 1: /* col */ + if( p->iCol ){ + sqlite3_result_int(pCtx, p->iCol-1); + }else{ + sqlite3_result_text(pCtx, "*", -1, SQLITE_STATIC); + } + break; + + case 2: /* documents */ + sqlite3_result_int64(pCtx, p->aStat[p->iCol].nDoc); + break; + + case 3: /* occurrences */ + sqlite3_result_int64(pCtx, p->aStat[p->iCol].nOcc); + break; + + default: /* languageid */ + assert( iCol==4 ); + sqlite3_result_int(pCtx, p->iLangid); + break; + } + + return SQLITE_OK; +} + +/* +** xRowid - Return the current rowid for the cursor. +*/ +static int fts3auxRowidMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite_int64 *pRowid /* OUT: Rowid value */ +){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + *pRowid = pCsr->iRowid; + return SQLITE_OK; +} + +/* +** Register the fts3aux module with database connection db. Return SQLITE_OK +** if successful or an error code if sqlite3_create_module() fails. +*/ +SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ + static const sqlite3_module fts3aux_module = { + 0, /* iVersion */ + fts3auxConnectMethod, /* xCreate */ + fts3auxConnectMethod, /* xConnect */ + fts3auxBestIndexMethod, /* xBestIndex */ + fts3auxDisconnectMethod, /* xDisconnect */ + fts3auxDisconnectMethod, /* xDestroy */ + fts3auxOpenMethod, /* xOpen */ + fts3auxCloseMethod, /* xClose */ + fts3auxFilterMethod, /* xFilter */ + fts3auxNextMethod, /* xNext */ + fts3auxEofMethod, /* xEof */ + fts3auxColumnMethod, /* xColumn */ + fts3auxRowidMethod, /* xRowid */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindFunction */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ + }; + int rc; /* Return code */ + + rc = sqlite3_create_module(db, "fts4aux", &fts3aux_module, 0); + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_aux.c ********************************************/ +/************** Begin file fts3_expr.c ***************************************/ +/* +** 2008 Nov 28 +** +** 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 module contains code that implements a parser for fts3 query strings +** (the right-hand argument to the MATCH operator). Because the supported +** syntax is relatively simple, the whole tokenizer/parser system is +** hand-coded. +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* +** By default, this module parses the legacy syntax that has been +** traditionally used by fts3. Or, if SQLITE_ENABLE_FTS3_PARENTHESIS +** is defined, then it uses the new syntax. The differences between +** the new and the old syntaxes are: +** +** a) The new syntax supports parenthesis. The old does not. +** +** b) The new syntax supports the AND and NOT operators. The old does not. +** +** c) The old syntax supports the "-" token qualifier. This is not +** supported by the new syntax (it is replaced by the NOT operator). +** +** d) When using the old syntax, the OR operator has a greater precedence +** than an implicit AND. When using the new, both implicity and explicit +** AND operators have a higher precedence than OR. +** +** If compiled with SQLITE_TEST defined, then this module exports the +** symbol "int sqlite3_fts3_enable_parentheses". Setting this variable +** to zero causes the module to use the old syntax. If it is set to +** non-zero the new syntax is activated. This is so both syntaxes can +** be tested using a single build of testfixture. +** +** The following describes the syntax supported by the fts3 MATCH +** operator in a similar format to that used by the lemon parser +** generator. This module does not use actually lemon, it uses a +** custom parser. +** +** query ::= andexpr (OR andexpr)*. +** +** andexpr ::= notexpr (AND? notexpr)*. +** +** notexpr ::= nearexpr (NOT nearexpr|-TOKEN)*. +** notexpr ::= LP query RP. +** +** nearexpr ::= phrase (NEAR distance_opt nearexpr)*. +** +** distance_opt ::= . +** distance_opt ::= / INTEGER. +** +** phrase ::= TOKEN. +** phrase ::= COLUMN:TOKEN. +** phrase ::= "TOKEN TOKEN TOKEN...". +*/ + +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_fts3_enable_parentheses = 0; +#else +# ifdef SQLITE_ENABLE_FTS3_PARENTHESIS +# define sqlite3_fts3_enable_parentheses 1 +# else +# define sqlite3_fts3_enable_parentheses 0 +# endif +#endif + +/* +** Default span for NEAR operators. +*/ +#define SQLITE_FTS3_DEFAULT_NEAR_PARAM 10 + +/* #include */ +/* #include */ + +/* +** isNot: +** This variable is used by function getNextNode(). When getNextNode() is +** called, it sets ParseContext.isNot to true if the 'next node' is a +** FTSQUERY_PHRASE with a unary "-" attached to it. i.e. "mysql" in the +** FTS3 query "sqlite -mysql". Otherwise, ParseContext.isNot is set to +** zero. +*/ +typedef struct ParseContext ParseContext; +struct ParseContext { + sqlite3_tokenizer *pTokenizer; /* Tokenizer module */ + int iLangid; /* Language id used with tokenizer */ + const char **azCol; /* Array of column names for fts3 table */ + int bFts4; /* True to allow FTS4-only syntax */ + int nCol; /* Number of entries in azCol[] */ + int iDefaultCol; /* Default column to query */ + int isNot; /* True if getNextNode() sees a unary - */ + sqlite3_context *pCtx; /* Write error message here */ + int nNest; /* Number of nested brackets */ +}; + +/* +** This function is equivalent to the standard isspace() function. +** +** The standard isspace() can be awkward to use safely, because although it +** is defined to accept an argument of type int, its behavior when passed +** an integer that falls outside of the range of the unsigned char type +** is undefined (and sometimes, "undefined" means segfault). This wrapper +** is defined to accept an argument of type char, and always returns 0 for +** any values that fall outside of the range of the unsigned char type (i.e. +** negative values). +*/ +static int fts3isspace(char c){ + return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f'; +} + +/* +** Allocate nByte bytes of memory using sqlite3_malloc(). If successful, +** zero the memory before returning a pointer to it. If unsuccessful, +** return NULL. +*/ +static void *fts3MallocZero(sqlite3_int64 nByte){ + void *pRet = sqlite3_malloc64(nByte); + if( pRet ) memset(pRet, 0, nByte); + return pRet; +} + +SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer( + sqlite3_tokenizer *pTokenizer, + int iLangid, + const char *z, + int n, + sqlite3_tokenizer_cursor **ppCsr +){ + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + sqlite3_tokenizer_cursor *pCsr = 0; + int rc; + + rc = pModule->xOpen(pTokenizer, z, n, &pCsr); + assert( rc==SQLITE_OK || pCsr==0 ); + if( rc==SQLITE_OK ){ + pCsr->pTokenizer = pTokenizer; + if( pModule->iVersion>=1 ){ + rc = pModule->xLanguageid(pCsr, iLangid); + if( rc!=SQLITE_OK ){ + pModule->xClose(pCsr); + pCsr = 0; + } + } + } + *ppCsr = pCsr; + return rc; +} + +/* +** Function getNextNode(), which is called by fts3ExprParse(), may itself +** call fts3ExprParse(). So this forward declaration is required. +*/ +static int fts3ExprParse(ParseContext *, const char *, int, Fts3Expr **, int *); + +/* +** Extract the next token from buffer z (length n) using the tokenizer +** and other information (column names etc.) in pParse. Create an Fts3Expr +** structure of type FTSQUERY_PHRASE containing a phrase consisting of this +** single token and set *ppExpr to point to it. If the end of the buffer is +** reached before a token is found, set *ppExpr to zero. It is the +** responsibility of the caller to eventually deallocate the allocated +** Fts3Expr structure (if any) by passing it to sqlite3_free(). +** +** Return SQLITE_OK if successful, or SQLITE_NOMEM if a memory allocation +** fails. +*/ +static int getNextToken( + ParseContext *pParse, /* fts3 query parse context */ + int iCol, /* Value for Fts3Phrase.iColumn */ + const char *z, int n, /* Input string */ + Fts3Expr **ppExpr, /* OUT: expression */ + int *pnConsumed /* OUT: Number of bytes consumed */ +){ + sqlite3_tokenizer *pTokenizer = pParse->pTokenizer; + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + int rc; + sqlite3_tokenizer_cursor *pCursor; + Fts3Expr *pRet = 0; + int i = 0; + + /* Set variable i to the maximum number of bytes of input to tokenize. */ + for(i=0; iiLangid, z, i, &pCursor); + if( rc==SQLITE_OK ){ + const char *zToken; + int nToken = 0, iStart = 0, iEnd = 0, iPosition = 0; + sqlite3_int64 nByte; /* total space to allocate */ + + rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); + if( rc==SQLITE_OK ){ + nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase) + nToken; + pRet = (Fts3Expr *)fts3MallocZero(nByte); + if( !pRet ){ + rc = SQLITE_NOMEM; + }else{ + pRet->eType = FTSQUERY_PHRASE; + pRet->pPhrase = (Fts3Phrase *)&pRet[1]; + pRet->pPhrase->nToken = 1; + pRet->pPhrase->iColumn = iCol; + pRet->pPhrase->aToken[0].n = nToken; + pRet->pPhrase->aToken[0].z = (char *)&pRet->pPhrase[1]; + memcpy(pRet->pPhrase->aToken[0].z, zToken, nToken); + + if( iEndpPhrase->aToken[0].isPrefix = 1; + iEnd++; + } + + while( 1 ){ + if( !sqlite3_fts3_enable_parentheses + && iStart>0 && z[iStart-1]=='-' + ){ + pParse->isNot = 1; + iStart--; + }else if( pParse->bFts4 && iStart>0 && z[iStart-1]=='^' ){ + pRet->pPhrase->aToken[0].bFirst = 1; + iStart--; + }else{ + break; + } + } + + } + *pnConsumed = iEnd; + }else if( i && rc==SQLITE_DONE ){ + rc = SQLITE_OK; + } + + pModule->xClose(pCursor); + } + + *ppExpr = pRet; + return rc; +} + + +/* +** Enlarge a memory allocation. If an out-of-memory allocation occurs, +** then free the old allocation. +*/ +static void *fts3ReallocOrFree(void *pOrig, sqlite3_int64 nNew){ + void *pRet = sqlite3_realloc64(pOrig, nNew); + if( !pRet ){ + sqlite3_free(pOrig); + } + return pRet; +} + +/* +** Buffer zInput, length nInput, contains the contents of a quoted string +** that appeared as part of an fts3 query expression. Neither quote character +** is included in the buffer. This function attempts to tokenize the entire +** input buffer and create an Fts3Expr structure of type FTSQUERY_PHRASE +** containing the results. +** +** If successful, SQLITE_OK is returned and *ppExpr set to point at the +** allocated Fts3Expr structure. Otherwise, either SQLITE_NOMEM (out of memory +** error) or SQLITE_ERROR (tokenization error) is returned and *ppExpr set +** to 0. +*/ +static int getNextString( + ParseContext *pParse, /* fts3 query parse context */ + const char *zInput, int nInput, /* Input string */ + Fts3Expr **ppExpr /* OUT: expression */ +){ + sqlite3_tokenizer *pTokenizer = pParse->pTokenizer; + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + int rc; + Fts3Expr *p = 0; + sqlite3_tokenizer_cursor *pCursor = 0; + char *zTemp = 0; + int nTemp = 0; + + const int nSpace = sizeof(Fts3Expr) + sizeof(Fts3Phrase); + int nToken = 0; + + /* The final Fts3Expr data structure, including the Fts3Phrase, + ** Fts3PhraseToken structures token buffers are all stored as a single + ** allocation so that the expression can be freed with a single call to + ** sqlite3_free(). Setting this up requires a two pass approach. + ** + ** The first pass, in the block below, uses a tokenizer cursor to iterate + ** through the tokens in the expression. This pass uses fts3ReallocOrFree() + ** to assemble data in two dynamic buffers: + ** + ** Buffer p: Points to the Fts3Expr structure, followed by the Fts3Phrase + ** structure, followed by the array of Fts3PhraseToken + ** structures. This pass only populates the Fts3PhraseToken array. + ** + ** Buffer zTemp: Contains copies of all tokens. + ** + ** The second pass, in the block that begins "if( rc==SQLITE_DONE )" below, + ** appends buffer zTemp to buffer p, and fills in the Fts3Expr and Fts3Phrase + ** structures. + */ + rc = sqlite3Fts3OpenTokenizer( + pTokenizer, pParse->iLangid, zInput, nInput, &pCursor); + if( rc==SQLITE_OK ){ + int ii; + for(ii=0; rc==SQLITE_OK; ii++){ + const char *zByte; + int nByte = 0, iBegin = 0, iEnd = 0, iPos = 0; + rc = pModule->xNext(pCursor, &zByte, &nByte, &iBegin, &iEnd, &iPos); + if( rc==SQLITE_OK ){ + Fts3PhraseToken *pToken; + + p = fts3ReallocOrFree(p, nSpace + ii*sizeof(Fts3PhraseToken)); + if( !p ) goto no_mem; + + zTemp = fts3ReallocOrFree(zTemp, nTemp + nByte); + if( !zTemp ) goto no_mem; + + assert( nToken==ii ); + pToken = &((Fts3Phrase *)(&p[1]))->aToken[ii]; + memset(pToken, 0, sizeof(Fts3PhraseToken)); + + memcpy(&zTemp[nTemp], zByte, nByte); + nTemp += nByte; + + pToken->n = nByte; + pToken->isPrefix = (iEndbFirst = (iBegin>0 && zInput[iBegin-1]=='^'); + nToken = ii+1; + } + } + + pModule->xClose(pCursor); + pCursor = 0; + } + + if( rc==SQLITE_DONE ){ + int jj; + char *zBuf = 0; + + p = fts3ReallocOrFree(p, nSpace + nToken*sizeof(Fts3PhraseToken) + nTemp); + if( !p ) goto no_mem; + memset(p, 0, (char *)&(((Fts3Phrase *)&p[1])->aToken[0])-(char *)p); + p->eType = FTSQUERY_PHRASE; + p->pPhrase = (Fts3Phrase *)&p[1]; + p->pPhrase->iColumn = pParse->iDefaultCol; + p->pPhrase->nToken = nToken; + + zBuf = (char *)&p->pPhrase->aToken[nToken]; + if( zTemp ){ + memcpy(zBuf, zTemp, nTemp); + sqlite3_free(zTemp); + }else{ + assert( nTemp==0 ); + } + + for(jj=0; jjpPhrase->nToken; jj++){ + p->pPhrase->aToken[jj].z = zBuf; + zBuf += p->pPhrase->aToken[jj].n; + } + rc = SQLITE_OK; + } + + *ppExpr = p; + return rc; +no_mem: + + if( pCursor ){ + pModule->xClose(pCursor); + } + sqlite3_free(zTemp); + sqlite3_free(p); + *ppExpr = 0; + return SQLITE_NOMEM; +} + +/* +** The output variable *ppExpr is populated with an allocated Fts3Expr +** structure, or set to 0 if the end of the input buffer is reached. +** +** Returns an SQLite error code. SQLITE_OK if everything works, SQLITE_NOMEM +** if a malloc failure occurs, or SQLITE_ERROR if a parse error is encountered. +** If SQLITE_ERROR is returned, pContext is populated with an error message. +*/ +static int getNextNode( + ParseContext *pParse, /* fts3 query parse context */ + const char *z, int n, /* Input string */ + Fts3Expr **ppExpr, /* OUT: expression */ + int *pnConsumed /* OUT: Number of bytes consumed */ +){ + static const struct Fts3Keyword { + char *z; /* Keyword text */ + unsigned char n; /* Length of the keyword */ + unsigned char parenOnly; /* Only valid in paren mode */ + unsigned char eType; /* Keyword code */ + } aKeyword[] = { + { "OR" , 2, 0, FTSQUERY_OR }, + { "AND", 3, 1, FTSQUERY_AND }, + { "NOT", 3, 1, FTSQUERY_NOT }, + { "NEAR", 4, 0, FTSQUERY_NEAR } + }; + int ii; + int iCol; + int iColLen; + int rc; + Fts3Expr *pRet = 0; + + const char *zInput = z; + int nInput = n; + + pParse->isNot = 0; + + /* Skip over any whitespace before checking for a keyword, an open or + ** close bracket, or a quoted string. + */ + while( nInput>0 && fts3isspace(*zInput) ){ + nInput--; + zInput++; + } + if( nInput==0 ){ + return SQLITE_DONE; + } + + /* See if we are dealing with a keyword. */ + for(ii=0; ii<(int)(sizeof(aKeyword)/sizeof(struct Fts3Keyword)); ii++){ + const struct Fts3Keyword *pKey = &aKeyword[ii]; + + if( (pKey->parenOnly & ~sqlite3_fts3_enable_parentheses)!=0 ){ + continue; + } + + if( nInput>=pKey->n && 0==memcmp(zInput, pKey->z, pKey->n) ){ + int nNear = SQLITE_FTS3_DEFAULT_NEAR_PARAM; + int nKey = pKey->n; + char cNext; + + /* If this is a "NEAR" keyword, check for an explicit nearness. */ + if( pKey->eType==FTSQUERY_NEAR ){ + assert( nKey==4 ); + if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){ + nKey += 1+sqlite3Fts3ReadInt(&zInput[nKey+1], &nNear); + } + } + + /* At this point this is probably a keyword. But for that to be true, + ** the next byte must contain either whitespace, an open or close + ** parenthesis, a quote character, or EOF. + */ + cNext = zInput[nKey]; + if( fts3isspace(cNext) + || cNext=='"' || cNext=='(' || cNext==')' || cNext==0 + ){ + pRet = (Fts3Expr *)fts3MallocZero(sizeof(Fts3Expr)); + if( !pRet ){ + return SQLITE_NOMEM; + } + pRet->eType = pKey->eType; + pRet->nNear = nNear; + *ppExpr = pRet; + *pnConsumed = (int)((zInput - z) + nKey); + return SQLITE_OK; + } + + /* Turns out that wasn't a keyword after all. This happens if the + ** user has supplied a token such as "ORacle". Continue. + */ + } + } + + /* See if we are dealing with a quoted phrase. If this is the case, then + ** search for the closing quote and pass the whole string to getNextString() + ** for processing. This is easy to do, as fts3 has no syntax for escaping + ** a quote character embedded in a string. + */ + if( *zInput=='"' ){ + for(ii=1; iinNest++; + rc = fts3ExprParse(pParse, zInput+1, nInput-1, ppExpr, &nConsumed); + *pnConsumed = (int)(zInput - z) + 1 + nConsumed; + return rc; + }else if( *zInput==')' ){ + pParse->nNest--; + *pnConsumed = (int)((zInput - z) + 1); + *ppExpr = 0; + return SQLITE_DONE; + } + } + + /* If control flows to this point, this must be a regular token, or + ** the end of the input. Read a regular token using the sqlite3_tokenizer + ** interface. Before doing so, figure out if there is an explicit + ** column specifier for the token. + ** + ** TODO: Strangely, it is not possible to associate a column specifier + ** with a quoted phrase, only with a single token. Not sure if this was + ** an implementation artifact or an intentional decision when fts3 was + ** first implemented. Whichever it was, this module duplicates the + ** limitation. + */ + iCol = pParse->iDefaultCol; + iColLen = 0; + for(ii=0; iinCol; ii++){ + const char *zStr = pParse->azCol[ii]; + int nStr = (int)strlen(zStr); + if( nInput>nStr && zInput[nStr]==':' + && sqlite3_strnicmp(zStr, zInput, nStr)==0 + ){ + iCol = ii; + iColLen = (int)((zInput - z) + nStr + 1); + break; + } + } + rc = getNextToken(pParse, iCol, &z[iColLen], n-iColLen, ppExpr, pnConsumed); + *pnConsumed += iColLen; + return rc; +} + +/* +** The argument is an Fts3Expr structure for a binary operator (any type +** except an FTSQUERY_PHRASE). Return an integer value representing the +** precedence of the operator. Lower values have a higher precedence (i.e. +** group more tightly). For example, in the C language, the == operator +** groups more tightly than ||, and would therefore have a higher precedence. +** +** When using the new fts3 query syntax (when SQLITE_ENABLE_FTS3_PARENTHESIS +** is defined), the order of the operators in precedence from highest to +** lowest is: +** +** NEAR +** NOT +** AND (including implicit ANDs) +** OR +** +** Note that when using the old query syntax, the OR operator has a higher +** precedence than the AND operator. +*/ +static int opPrecedence(Fts3Expr *p){ + assert( p->eType!=FTSQUERY_PHRASE ); + if( sqlite3_fts3_enable_parentheses ){ + return p->eType; + }else if( p->eType==FTSQUERY_NEAR ){ + return 1; + }else if( p->eType==FTSQUERY_OR ){ + return 2; + } + assert( p->eType==FTSQUERY_AND ); + return 3; +} + +/* +** Argument ppHead contains a pointer to the current head of a query +** expression tree being parsed. pPrev is the expression node most recently +** inserted into the tree. This function adds pNew, which is always a binary +** operator node, into the expression tree based on the relative precedence +** of pNew and the existing nodes of the tree. This may result in the head +** of the tree changing, in which case *ppHead is set to the new root node. +*/ +static void insertBinaryOperator( + Fts3Expr **ppHead, /* Pointer to the root node of a tree */ + Fts3Expr *pPrev, /* Node most recently inserted into the tree */ + Fts3Expr *pNew /* New binary node to insert into expression tree */ +){ + Fts3Expr *pSplit = pPrev; + while( pSplit->pParent && opPrecedence(pSplit->pParent)<=opPrecedence(pNew) ){ + pSplit = pSplit->pParent; + } + + if( pSplit->pParent ){ + assert( pSplit->pParent->pRight==pSplit ); + pSplit->pParent->pRight = pNew; + pNew->pParent = pSplit->pParent; + }else{ + *ppHead = pNew; + } + pNew->pLeft = pSplit; + pSplit->pParent = pNew; +} + +/* +** Parse the fts3 query expression found in buffer z, length n. This function +** returns either when the end of the buffer is reached or an unmatched +** closing bracket - ')' - is encountered. +** +** If successful, SQLITE_OK is returned, *ppExpr is set to point to the +** parsed form of the expression and *pnConsumed is set to the number of +** bytes read from buffer z. Otherwise, *ppExpr is set to 0 and SQLITE_NOMEM +** (out of memory error) or SQLITE_ERROR (parse error) is returned. +*/ +static int fts3ExprParse( + ParseContext *pParse, /* fts3 query parse context */ + const char *z, int n, /* Text of MATCH query */ + Fts3Expr **ppExpr, /* OUT: Parsed query structure */ + int *pnConsumed /* OUT: Number of bytes consumed */ +){ + Fts3Expr *pRet = 0; + Fts3Expr *pPrev = 0; + Fts3Expr *pNotBranch = 0; /* Only used in legacy parse mode */ + int nIn = n; + const char *zIn = z; + int rc = SQLITE_OK; + int isRequirePhrase = 1; + + while( rc==SQLITE_OK ){ + Fts3Expr *p = 0; + int nByte = 0; + + rc = getNextNode(pParse, zIn, nIn, &p, &nByte); + assert( nByte>0 || (rc!=SQLITE_OK && p==0) ); + if( rc==SQLITE_OK ){ + if( p ){ + int isPhrase; + + if( !sqlite3_fts3_enable_parentheses + && p->eType==FTSQUERY_PHRASE && pParse->isNot + ){ + /* Create an implicit NOT operator. */ + Fts3Expr *pNot = fts3MallocZero(sizeof(Fts3Expr)); + if( !pNot ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_NOMEM; + goto exprparse_out; + } + pNot->eType = FTSQUERY_NOT; + pNot->pRight = p; + p->pParent = pNot; + if( pNotBranch ){ + pNot->pLeft = pNotBranch; + pNotBranch->pParent = pNot; + } + pNotBranch = pNot; + p = pPrev; + }else{ + int eType = p->eType; + isPhrase = (eType==FTSQUERY_PHRASE || p->pLeft); + + /* The isRequirePhrase variable is set to true if a phrase or + ** an expression contained in parenthesis is required. If a + ** binary operator (AND, OR, NOT or NEAR) is encounted when + ** isRequirePhrase is set, this is a syntax error. + */ + if( !isPhrase && isRequirePhrase ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_ERROR; + goto exprparse_out; + } + + if( isPhrase && !isRequirePhrase ){ + /* Insert an implicit AND operator. */ + Fts3Expr *pAnd; + assert( pRet && pPrev ); + pAnd = fts3MallocZero(sizeof(Fts3Expr)); + if( !pAnd ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_NOMEM; + goto exprparse_out; + } + pAnd->eType = FTSQUERY_AND; + insertBinaryOperator(&pRet, pPrev, pAnd); + pPrev = pAnd; + } + + /* This test catches attempts to make either operand of a NEAR + ** operator something other than a phrase. For example, either of + ** the following: + ** + ** (bracketed expression) NEAR phrase + ** phrase NEAR (bracketed expression) + ** + ** Return an error in either case. + */ + if( pPrev && ( + (eType==FTSQUERY_NEAR && !isPhrase && pPrev->eType!=FTSQUERY_PHRASE) + || (eType!=FTSQUERY_PHRASE && isPhrase && pPrev->eType==FTSQUERY_NEAR) + )){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_ERROR; + goto exprparse_out; + } + + if( isPhrase ){ + if( pRet ){ + assert( pPrev && pPrev->pLeft && pPrev->pRight==0 ); + pPrev->pRight = p; + p->pParent = pPrev; + }else{ + pRet = p; + } + }else{ + insertBinaryOperator(&pRet, pPrev, p); + } + isRequirePhrase = !isPhrase; + } + pPrev = p; + } + assert( nByte>0 ); + } + assert( rc!=SQLITE_OK || (nByte>0 && nByte<=nIn) ); + nIn -= nByte; + zIn += nByte; + } + + if( rc==SQLITE_DONE && pRet && isRequirePhrase ){ + rc = SQLITE_ERROR; + } + + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + if( !sqlite3_fts3_enable_parentheses && pNotBranch ){ + if( !pRet ){ + rc = SQLITE_ERROR; + }else{ + Fts3Expr *pIter = pNotBranch; + while( pIter->pLeft ){ + pIter = pIter->pLeft; + } + pIter->pLeft = pRet; + pRet->pParent = pIter; + pRet = pNotBranch; + } + } + } + *pnConsumed = n - nIn; + +exprparse_out: + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRet); + sqlite3Fts3ExprFree(pNotBranch); + pRet = 0; + } + *ppExpr = pRet; + return rc; +} + +/* +** Return SQLITE_ERROR if the maximum depth of the expression tree passed +** as the only argument is more than nMaxDepth. +*/ +static int fts3ExprCheckDepth(Fts3Expr *p, int nMaxDepth){ + int rc = SQLITE_OK; + if( p ){ + if( nMaxDepth<0 ){ + rc = SQLITE_TOOBIG; + }else{ + rc = fts3ExprCheckDepth(p->pLeft, nMaxDepth-1); + if( rc==SQLITE_OK ){ + rc = fts3ExprCheckDepth(p->pRight, nMaxDepth-1); + } + } + } + return rc; +} + +/* +** This function attempts to transform the expression tree at (*pp) to +** an equivalent but more balanced form. The tree is modified in place. +** If successful, SQLITE_OK is returned and (*pp) set to point to the +** new root expression node. +** +** nMaxDepth is the maximum allowable depth of the balanced sub-tree. +** +** Otherwise, if an error occurs, an SQLite error code is returned and +** expression (*pp) freed. +*/ +static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ + int rc = SQLITE_OK; /* Return code */ + Fts3Expr *pRoot = *pp; /* Initial root node */ + Fts3Expr *pFree = 0; /* List of free nodes. Linked by pParent. */ + int eType = pRoot->eType; /* Type of node in this tree */ + + if( nMaxDepth==0 ){ + rc = SQLITE_ERROR; + } + + if( rc==SQLITE_OK ){ + if( (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ + Fts3Expr **apLeaf; + apLeaf = (Fts3Expr **)sqlite3_malloc64(sizeof(Fts3Expr *) * nMaxDepth); + if( 0==apLeaf ){ + rc = SQLITE_NOMEM; + }else{ + memset(apLeaf, 0, sizeof(Fts3Expr *) * nMaxDepth); + } + + if( rc==SQLITE_OK ){ + int i; + Fts3Expr *p; + + /* Set $p to point to the left-most leaf in the tree of eType nodes. */ + for(p=pRoot; p->eType==eType; p=p->pLeft){ + assert( p->pParent==0 || p->pParent->pLeft==p ); + assert( p->pLeft && p->pRight ); + } + + /* This loop runs once for each leaf in the tree of eType nodes. */ + while( 1 ){ + int iLvl; + Fts3Expr *pParent = p->pParent; /* Current parent of p */ + + assert( pParent==0 || pParent->pLeft==p ); + p->pParent = 0; + if( pParent ){ + pParent->pLeft = 0; + }else{ + pRoot = 0; + } + rc = fts3ExprBalance(&p, nMaxDepth-1); + if( rc!=SQLITE_OK ) break; + + for(iLvl=0; p && iLvlpLeft = apLeaf[iLvl]; + pFree->pRight = p; + pFree->pLeft->pParent = pFree; + pFree->pRight->pParent = pFree; + + p = pFree; + pFree = pFree->pParent; + p->pParent = 0; + apLeaf[iLvl] = 0; + } + } + if( p ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_TOOBIG; + break; + } + + /* If that was the last leaf node, break out of the loop */ + if( pParent==0 ) break; + + /* Set $p to point to the next leaf in the tree of eType nodes */ + for(p=pParent->pRight; p->eType==eType; p=p->pLeft); + + /* Remove pParent from the original tree. */ + assert( pParent->pParent==0 || pParent->pParent->pLeft==pParent ); + pParent->pRight->pParent = pParent->pParent; + if( pParent->pParent ){ + pParent->pParent->pLeft = pParent->pRight; + }else{ + assert( pParent==pRoot ); + pRoot = pParent->pRight; + } + + /* Link pParent into the free node list. It will be used as an + ** internal node of the new tree. */ + pParent->pParent = pFree; + pFree = pParent; + } + + if( rc==SQLITE_OK ){ + p = 0; + for(i=0; ipParent = 0; + }else{ + assert( pFree!=0 ); + pFree->pRight = p; + pFree->pLeft = apLeaf[i]; + pFree->pLeft->pParent = pFree; + pFree->pRight->pParent = pFree; + + p = pFree; + pFree = pFree->pParent; + p->pParent = 0; + } + } + } + pRoot = p; + }else{ + /* An error occurred. Delete the contents of the apLeaf[] array + ** and pFree list. Everything else is cleaned up by the call to + ** sqlite3Fts3ExprFree(pRoot) below. */ + Fts3Expr *pDel; + for(i=0; ipParent; + sqlite3_free(pDel); + } + } + + assert( pFree==0 ); + sqlite3_free( apLeaf ); + } + }else if( eType==FTSQUERY_NOT ){ + Fts3Expr *pLeft = pRoot->pLeft; + Fts3Expr *pRight = pRoot->pRight; + + pRoot->pLeft = 0; + pRoot->pRight = 0; + pLeft->pParent = 0; + pRight->pParent = 0; + + rc = fts3ExprBalance(&pLeft, nMaxDepth-1); + if( rc==SQLITE_OK ){ + rc = fts3ExprBalance(&pRight, nMaxDepth-1); + } + + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRight); + sqlite3Fts3ExprFree(pLeft); + }else{ + assert( pLeft && pRight ); + pRoot->pLeft = pLeft; + pLeft->pParent = pRoot; + pRoot->pRight = pRight; + pRight->pParent = pRoot; + } + } + } + + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRoot); + pRoot = 0; + } + *pp = pRoot; + return rc; +} + +/* +** This function is similar to sqlite3Fts3ExprParse(), with the following +** differences: +** +** 1. It does not do expression rebalancing. +** 2. It does not check that the expression does not exceed the +** maximum allowable depth. +** 3. Even if it fails, *ppExpr may still be set to point to an +** expression tree. It should be deleted using sqlite3Fts3ExprFree() +** in this case. +*/ +static int fts3ExprParseUnbalanced( + sqlite3_tokenizer *pTokenizer, /* Tokenizer module */ + int iLangid, /* Language id for tokenizer */ + char **azCol, /* Array of column names for fts3 table */ + int bFts4, /* True to allow FTS4-only syntax */ + int nCol, /* Number of entries in azCol[] */ + int iDefaultCol, /* Default column to query */ + const char *z, int n, /* Text of MATCH query */ + Fts3Expr **ppExpr /* OUT: Parsed query structure */ +){ + int nParsed; + int rc; + ParseContext sParse; + + memset(&sParse, 0, sizeof(ParseContext)); + sParse.pTokenizer = pTokenizer; + sParse.iLangid = iLangid; + sParse.azCol = (const char **)azCol; + sParse.nCol = nCol; + sParse.iDefaultCol = iDefaultCol; + sParse.bFts4 = bFts4; + if( z==0 ){ + *ppExpr = 0; + return SQLITE_OK; + } + if( n<0 ){ + n = (int)strlen(z); + } + rc = fts3ExprParse(&sParse, z, n, ppExpr, &nParsed); + assert( rc==SQLITE_OK || *ppExpr==0 ); + + /* Check for mismatched parenthesis */ + if( rc==SQLITE_OK && sParse.nNest ){ + rc = SQLITE_ERROR; + } + + return rc; +} + +/* +** Parameters z and n contain a pointer to and length of a buffer containing +** an fts3 query expression, respectively. This function attempts to parse the +** query expression and create a tree of Fts3Expr structures representing the +** parsed expression. If successful, *ppExpr is set to point to the head +** of the parsed expression tree and SQLITE_OK is returned. If an error +** occurs, either SQLITE_NOMEM (out-of-memory error) or SQLITE_ERROR (parse +** error) is returned and *ppExpr is set to 0. +** +** If parameter n is a negative number, then z is assumed to point to a +** nul-terminated string and the length is determined using strlen(). +** +** The first parameter, pTokenizer, is passed the fts3 tokenizer module to +** use to normalize query tokens while parsing the expression. The azCol[] +** array, which is assumed to contain nCol entries, should contain the names +** of each column in the target fts3 table, in order from left to right. +** Column names must be nul-terminated strings. +** +** The iDefaultCol parameter should be passed the index of the table column +** that appears on the left-hand-side of the MATCH operator (the default +** column to match against for tokens for which a column name is not explicitly +** specified as part of the query string), or -1 if tokens may by default +** match any table column. +*/ +SQLITE_PRIVATE int sqlite3Fts3ExprParse( + sqlite3_tokenizer *pTokenizer, /* Tokenizer module */ + int iLangid, /* Language id for tokenizer */ + char **azCol, /* Array of column names for fts3 table */ + int bFts4, /* True to allow FTS4-only syntax */ + int nCol, /* Number of entries in azCol[] */ + int iDefaultCol, /* Default column to query */ + const char *z, int n, /* Text of MATCH query */ + Fts3Expr **ppExpr, /* OUT: Parsed query structure */ + char **pzErr /* OUT: Error message (sqlite3_malloc) */ +){ + int rc = fts3ExprParseUnbalanced( + pTokenizer, iLangid, azCol, bFts4, nCol, iDefaultCol, z, n, ppExpr + ); + + /* Rebalance the expression. And check that its depth does not exceed + ** SQLITE_FTS3_MAX_EXPR_DEPTH. */ + if( rc==SQLITE_OK && *ppExpr ){ + rc = fts3ExprBalance(ppExpr, SQLITE_FTS3_MAX_EXPR_DEPTH); + if( rc==SQLITE_OK ){ + rc = fts3ExprCheckDepth(*ppExpr, SQLITE_FTS3_MAX_EXPR_DEPTH); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(*ppExpr); + *ppExpr = 0; + if( rc==SQLITE_TOOBIG ){ + sqlite3Fts3ErrMsg(pzErr, + "FTS expression tree is too large (maximum depth %d)", + SQLITE_FTS3_MAX_EXPR_DEPTH + ); + rc = SQLITE_ERROR; + }else if( rc==SQLITE_ERROR ){ + sqlite3Fts3ErrMsg(pzErr, "malformed MATCH expression: [%s]", z); + } + } + + return rc; +} + +/* +** Free a single node of an expression tree. +*/ +static void fts3FreeExprNode(Fts3Expr *p){ + assert( p->eType==FTSQUERY_PHRASE || p->pPhrase==0 ); + sqlite3Fts3EvalPhraseCleanup(p->pPhrase); + sqlite3_free(p->aMI); + sqlite3_free(p); +} + +/* +** Free a parsed fts3 query expression allocated by sqlite3Fts3ExprParse(). +** +** This function would be simpler if it recursively called itself. But +** that would mean passing a sufficiently large expression to ExprParse() +** could cause a stack overflow. +*/ +SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *pDel){ + Fts3Expr *p; + assert( pDel==0 || pDel->pParent==0 ); + for(p=pDel; p && (p->pLeft||p->pRight); p=(p->pLeft ? p->pLeft : p->pRight)){ + assert( p->pParent==0 || p==p->pParent->pRight || p==p->pParent->pLeft ); + } + while( p ){ + Fts3Expr *pParent = p->pParent; + fts3FreeExprNode(p); + if( pParent && p==pParent->pLeft && pParent->pRight ){ + p = pParent->pRight; + while( p && (p->pLeft || p->pRight) ){ + assert( p==p->pParent->pRight || p==p->pParent->pLeft ); + p = (p->pLeft ? p->pLeft : p->pRight); + } + }else{ + p = pParent; + } + } +} + +/**************************************************************************** +***************************************************************************** +** Everything after this point is just test code. +*/ + +#ifdef SQLITE_TEST + +/* #include */ + +/* +** Return a pointer to a buffer containing a text representation of the +** expression passed as the first argument. The buffer is obtained from +** sqlite3_malloc(). It is the responsibility of the caller to use +** sqlite3_free() to release the memory. If an OOM condition is encountered, +** NULL is returned. +** +** If the second argument is not NULL, then its contents are prepended to +** the returned expression text and then freed using sqlite3_free(). +*/ +static char *exprToString(Fts3Expr *pExpr, char *zBuf){ + if( pExpr==0 ){ + return sqlite3_mprintf(""); + } + switch( pExpr->eType ){ + case FTSQUERY_PHRASE: { + Fts3Phrase *pPhrase = pExpr->pPhrase; + int i; + zBuf = sqlite3_mprintf( + "%zPHRASE %d 0", zBuf, pPhrase->iColumn); + for(i=0; zBuf && inToken; i++){ + zBuf = sqlite3_mprintf("%z %.*s%s", zBuf, + pPhrase->aToken[i].n, pPhrase->aToken[i].z, + (pPhrase->aToken[i].isPrefix?"+":"") + ); + } + return zBuf; + } + + case FTSQUERY_NEAR: + zBuf = sqlite3_mprintf("%zNEAR/%d ", zBuf, pExpr->nNear); + break; + case FTSQUERY_NOT: + zBuf = sqlite3_mprintf("%zNOT ", zBuf); + break; + case FTSQUERY_AND: + zBuf = sqlite3_mprintf("%zAND ", zBuf); + break; + case FTSQUERY_OR: + zBuf = sqlite3_mprintf("%zOR ", zBuf); + break; + } + + if( zBuf ) zBuf = sqlite3_mprintf("%z{", zBuf); + if( zBuf ) zBuf = exprToString(pExpr->pLeft, zBuf); + if( zBuf ) zBuf = sqlite3_mprintf("%z} {", zBuf); + + if( zBuf ) zBuf = exprToString(pExpr->pRight, zBuf); + if( zBuf ) zBuf = sqlite3_mprintf("%z}", zBuf); + + return zBuf; +} + +/* +** This is the implementation of a scalar SQL function used to test the +** expression parser. It should be called as follows: +** +** fts3_exprtest(, , , ...); +** +** The first argument, , is the name of the fts3 tokenizer used +** to parse the query expression (see README.tokenizers). The second argument +** is the query expression to parse. Each subsequent argument is the name +** of a column of the fts3 table that the query expression may refer to. +** For example: +** +** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2'); +*/ +static void fts3ExprTestCommon( + int bRebalance, + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + sqlite3_tokenizer *pTokenizer = 0; + int rc; + char **azCol = 0; + const char *zExpr; + int nExpr; + int nCol; + int ii; + Fts3Expr *pExpr; + char *zBuf = 0; + Fts3Hash *pHash = (Fts3Hash*)sqlite3_user_data(context); + const char *zTokenizer = 0; + char *zErr = 0; + + if( argc<3 ){ + sqlite3_result_error(context, + "Usage: fts3_exprtest(tokenizer, expr, col1, ...", -1 + ); + return; + } + + zTokenizer = (const char*)sqlite3_value_text(argv[0]); + rc = sqlite3Fts3InitTokenizer(pHash, zTokenizer, &pTokenizer, &zErr); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_result_error(context, zErr, -1); + } + sqlite3_free(zErr); + return; + } + + zExpr = (const char *)sqlite3_value_text(argv[1]); + nExpr = sqlite3_value_bytes(argv[1]); + nCol = argc-2; + azCol = (char **)sqlite3_malloc64(nCol*sizeof(char *)); + if( !azCol ){ + sqlite3_result_error_nomem(context); + goto exprtest_out; + } + for(ii=0; iipModule->xDestroy(pTokenizer); + } + sqlite3_free(azCol); +} + +static void fts3ExprTest( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + fts3ExprTestCommon(0, context, argc, argv); +} +static void fts3ExprTestRebalance( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + fts3ExprTestCommon(1, context, argc, argv); +} + +/* +** Register the query expression parser test function fts3_exprtest() +** with database connection db. +*/ +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash *pHash){ + int rc = sqlite3_create_function( + db, "fts3_exprtest", -1, SQLITE_UTF8, (void*)pHash, fts3ExprTest, 0, 0 + ); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "fts3_exprtest_rebalance", + -1, SQLITE_UTF8, (void*)pHash, fts3ExprTestRebalance, 0, 0 + ); + } + return rc; +} + +#endif +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_expr.c *******************************************/ +/************** Begin file fts3_hash.c ***************************************/ +/* +** 2001 September 22 +** +** 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 is the implementation of generic hash-tables used in SQLite. +** We've modified it slightly to serve as a standalone hash table +** implementation for the full-text indexing module. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_hash.h" */ + +/* +** Malloc and Free functions +*/ +static void *fts3HashMalloc(sqlite3_int64 n){ + void *p = sqlite3_malloc64(n); + if( p ){ + memset(p, 0, n); + } + return p; +} +static void fts3HashFree(void *p){ + sqlite3_free(p); +} + +/* Turn bulk memory into a hash table object by initializing the +** fields of the Hash structure. +** +** "pNew" is a pointer to the hash table that is to be initialized. +** keyClass is one of the constants +** FTS3_HASH_BINARY or FTS3_HASH_STRING. The value of keyClass +** determines what kind of key the hash table will use. "copyKey" is +** true if the hash table should make its own private copy of keys and +** false if it should just use the supplied pointer. +*/ +SQLITE_PRIVATE void sqlite3Fts3HashInit(Fts3Hash *pNew, char keyClass, char copyKey){ + assert( pNew!=0 ); + assert( keyClass>=FTS3_HASH_STRING && keyClass<=FTS3_HASH_BINARY ); + pNew->keyClass = keyClass; + pNew->copyKey = copyKey; + pNew->first = 0; + pNew->count = 0; + pNew->htsize = 0; + pNew->ht = 0; +} + +/* Remove all entries from a hash table. Reclaim all memory. +** Call this routine to delete a hash table or to reset a hash table +** to the empty state. +*/ +SQLITE_PRIVATE void sqlite3Fts3HashClear(Fts3Hash *pH){ + Fts3HashElem *elem; /* For looping over all elements of the table */ + + assert( pH!=0 ); + elem = pH->first; + pH->first = 0; + fts3HashFree(pH->ht); + pH->ht = 0; + pH->htsize = 0; + while( elem ){ + Fts3HashElem *next_elem = elem->next; + if( pH->copyKey && elem->pKey ){ + fts3HashFree(elem->pKey); + } + fts3HashFree(elem); + elem = next_elem; + } + pH->count = 0; +} + +/* +** Hash and comparison functions when the mode is FTS3_HASH_STRING +*/ +static int fts3StrHash(const void *pKey, int nKey){ + const char *z = (const char *)pKey; + unsigned h = 0; + if( nKey<=0 ) nKey = (int) strlen(z); + while( nKey > 0 ){ + h = (h<<3) ^ h ^ *z++; + nKey--; + } + return (int)(h & 0x7fffffff); +} +static int fts3StrCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return strncmp((const char*)pKey1,(const char*)pKey2,n1); +} + +/* +** Hash and comparison functions when the mode is FTS3_HASH_BINARY +*/ +static int fts3BinHash(const void *pKey, int nKey){ + int h = 0; + const char *z = (const char *)pKey; + while( nKey-- > 0 ){ + h = (h<<3) ^ h ^ *(z++); + } + return h & 0x7fffffff; +} +static int fts3BinCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return memcmp(pKey1,pKey2,n1); +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** The C syntax in this function definition may be unfamilar to some +** programmers, so we provide the following additional explanation: +** +** The name of the function is "ftsHashFunction". The function takes a +** single parameter "keyClass". The return value of ftsHashFunction() +** is a pointer to another function. Specifically, the return value +** of ftsHashFunction() is a pointer to a function that takes two parameters +** with types "const void*" and "int" and returns an "int". +*/ +static int (*ftsHashFunction(int keyClass))(const void*,int){ + if( keyClass==FTS3_HASH_STRING ){ + return &fts3StrHash; + }else{ + assert( keyClass==FTS3_HASH_BINARY ); + return &fts3BinHash; + } +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** For help in interpreted the obscure C code in the function definition, +** see the header comment on the previous function. +*/ +static int (*ftsCompareFunction(int keyClass))(const void*,int,const void*,int){ + if( keyClass==FTS3_HASH_STRING ){ + return &fts3StrCompare; + }else{ + assert( keyClass==FTS3_HASH_BINARY ); + return &fts3BinCompare; + } +} + +/* Link an element into the hash table +*/ +static void fts3HashInsertElement( + Fts3Hash *pH, /* The complete hash table */ + struct _fts3ht *pEntry, /* The entry into which pNew is inserted */ + Fts3HashElem *pNew /* The element to be inserted */ +){ + Fts3HashElem *pHead; /* First element already in pEntry */ + pHead = pEntry->chain; + if( pHead ){ + pNew->next = pHead; + pNew->prev = pHead->prev; + if( pHead->prev ){ pHead->prev->next = pNew; } + else { pH->first = pNew; } + pHead->prev = pNew; + }else{ + pNew->next = pH->first; + if( pH->first ){ pH->first->prev = pNew; } + pNew->prev = 0; + pH->first = pNew; + } + pEntry->count++; + pEntry->chain = pNew; +} + + +/* Resize the hash table so that it cantains "new_size" buckets. +** "new_size" must be a power of 2. The hash table might fail +** to resize if sqliteMalloc() fails. +** +** Return non-zero if a memory allocation error occurs. +*/ +static int fts3Rehash(Fts3Hash *pH, int new_size){ + struct _fts3ht *new_ht; /* The new hash table */ + Fts3HashElem *elem, *next_elem; /* For looping over existing elements */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( (new_size & (new_size-1))==0 ); + new_ht = (struct _fts3ht *)fts3HashMalloc( new_size*sizeof(struct _fts3ht) ); + if( new_ht==0 ) return 1; + fts3HashFree(pH->ht); + pH->ht = new_ht; + pH->htsize = new_size; + xHash = ftsHashFunction(pH->keyClass); + for(elem=pH->first, pH->first=0; elem; elem = next_elem){ + int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); + next_elem = elem->next; + fts3HashInsertElement(pH, &new_ht[h], elem); + } + return 0; +} + +/* This function (for internal use only) locates an element in an +** hash table that matches the given key. The hash for this key has +** already been computed and is passed as the 4th parameter. +*/ +static Fts3HashElem *fts3FindElementByHash( + const Fts3Hash *pH, /* The pH to be searched */ + const void *pKey, /* The key we are searching for */ + int nKey, + int h /* The hash for this key. */ +){ + Fts3HashElem *elem; /* Used to loop thru the element list */ + int count; /* Number of elements left to test */ + int (*xCompare)(const void*,int,const void*,int); /* comparison function */ + + if( pH->ht ){ + struct _fts3ht *pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + xCompare = ftsCompareFunction(pH->keyClass); + while( count-- && elem ){ + if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ + return elem; + } + elem = elem->next; + } + } + return 0; +} + +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. +*/ +static void fts3RemoveElementByHash( + Fts3Hash *pH, /* The pH containing "elem" */ + Fts3HashElem* elem, /* The element to be removed from the pH */ + int h /* Hash value for the element */ +){ + struct _fts3ht *pEntry; + if( elem->prev ){ + elem->prev->next = elem->next; + }else{ + pH->first = elem->next; + } + if( elem->next ){ + elem->next->prev = elem->prev; + } + pEntry = &pH->ht[h]; + if( pEntry->chain==elem ){ + pEntry->chain = elem->next; + } + pEntry->count--; + if( pEntry->count<=0 ){ + pEntry->chain = 0; + } + if( pH->copyKey && elem->pKey ){ + fts3HashFree(elem->pKey); + } + fts3HashFree( elem ); + pH->count--; + if( pH->count<=0 ){ + assert( pH->first==0 ); + assert( pH->count==0 ); + fts3HashClear(pH); + } +} + +SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem( + const Fts3Hash *pH, + const void *pKey, + int nKey +){ + int h; /* A hash on key */ + int (*xHash)(const void*,int); /* The hash function */ + + if( pH==0 || pH->ht==0 ) return 0; + xHash = ftsHashFunction(pH->keyClass); + assert( xHash!=0 ); + h = (*xHash)(pKey,nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + return fts3FindElementByHash(pH,pKey,nKey, h & (pH->htsize-1)); +} + +/* +** Attempt to locate an element of the hash table pH with a key +** that matches pKey,nKey. Return the data for this element if it is +** found, or NULL if there is no match. +*/ +SQLITE_PRIVATE void *sqlite3Fts3HashFind(const Fts3Hash *pH, const void *pKey, int nKey){ + Fts3HashElem *pElem; /* The element that matches key (if any) */ + + pElem = sqlite3Fts3HashFindElem(pH, pKey, nKey); + return pElem ? pElem->data : 0; +} + +/* Insert an element into the hash table pH. The key is pKey,nKey +** and the data is "data". +** +** If no element exists with a matching key, then a new +** element is created. A copy of the key is made if the copyKey +** flag is set. NULL is returned. +** +** If another element already exists with the same key, then the +** new data replaces the old data and the old data is returned. +** The key is not copied in this instance. If a malloc fails, then +** the new data is returned and the hash table is unchanged. +** +** If the "data" parameter to this function is NULL, then the +** element corresponding to "key" is removed from the hash table. +*/ +SQLITE_PRIVATE void *sqlite3Fts3HashInsert( + Fts3Hash *pH, /* The hash table to insert into */ + const void *pKey, /* The key */ + int nKey, /* Number of bytes in the key */ + void *data /* The data */ +){ + int hraw; /* Raw hash value of the key */ + int h; /* the hash of the key modulo hash table size */ + Fts3HashElem *elem; /* Used to loop thru the element list */ + Fts3HashElem *new_elem; /* New element added to the pH */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( pH!=0 ); + xHash = ftsHashFunction(pH->keyClass); + assert( xHash!=0 ); + hraw = (*xHash)(pKey, nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + elem = fts3FindElementByHash(pH,pKey,nKey,h); + if( elem ){ + void *old_data = elem->data; + if( data==0 ){ + fts3RemoveElementByHash(pH,elem,h); + }else{ + elem->data = data; + } + return old_data; + } + if( data==0 ) return 0; + if( (pH->htsize==0 && fts3Rehash(pH,8)) + || (pH->count>=pH->htsize && fts3Rehash(pH, pH->htsize*2)) + ){ + pH->count = 0; + return data; + } + assert( pH->htsize>0 ); + new_elem = (Fts3HashElem*)fts3HashMalloc( sizeof(Fts3HashElem) ); + if( new_elem==0 ) return data; + if( pH->copyKey && pKey!=0 ){ + new_elem->pKey = fts3HashMalloc( nKey ); + if( new_elem->pKey==0 ){ + fts3HashFree(new_elem); + return data; + } + memcpy((void*)new_elem->pKey, pKey, nKey); + }else{ + new_elem->pKey = (void*)pKey; + } + new_elem->nKey = nKey; + pH->count++; + assert( pH->htsize>0 ); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + fts3HashInsertElement(pH, &pH->ht[h], new_elem); + new_elem->data = data; + return 0; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_hash.c *******************************************/ +/************** Begin file fts3_porter.c *************************************/ +/* +** 2006 September 30 +** +** 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. +** +************************************************************************* +** Implementation of the full-text-search tokenizer that implements +** a Porter stemmer. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_tokenizer.h" */ + +/* +** Class derived from sqlite3_tokenizer +*/ +typedef struct porter_tokenizer { + sqlite3_tokenizer base; /* Base class */ +} porter_tokenizer; + +/* +** Class derived from sqlite3_tokenizer_cursor +*/ +typedef struct porter_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *zInput; /* input we are tokenizing */ + int nInput; /* size of the input */ + int iOffset; /* current position in zInput */ + int iToken; /* index of next token to be returned */ + char *zToken; /* storage for current token */ + int nAllocated; /* space allocated to zToken buffer */ +} porter_tokenizer_cursor; + + +/* +** Create a new tokenizer instance. +*/ +static int porterCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + porter_tokenizer *t; + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + + t = (porter_tokenizer *) sqlite3_malloc(sizeof(*t)); + if( t==NULL ) return SQLITE_NOMEM; + memset(t, 0, sizeof(*t)); + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int porterDestroy(sqlite3_tokenizer *pTokenizer){ + sqlite3_free(pTokenizer); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is zInput[0..nInput-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int porterOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, int nInput, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + porter_tokenizer_cursor *c; + + UNUSED_PARAMETER(pTokenizer); + + c = (porter_tokenizer_cursor *) sqlite3_malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + c->zInput = zInput; + if( zInput==0 ){ + c->nInput = 0; + }else if( nInput<0 ){ + c->nInput = (int)strlen(zInput); + }else{ + c->nInput = nInput; + } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->zToken = NULL; /* no space allocated, yet. */ + c->nAllocated = 0; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** porterOpen() above. +*/ +static int porterClose(sqlite3_tokenizer_cursor *pCursor){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + sqlite3_free(c->zToken); + sqlite3_free(c); + return SQLITE_OK; +} +/* +** Vowel or consonant +*/ +static const char cType[] = { + 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 2, 1 +}; + +/* +** isConsonant() and isVowel() determine if their first character in +** the string they point to is a consonant or a vowel, according +** to Porter ruls. +** +** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. +** 'Y' is a consonant unless it follows another consonant, +** in which case it is a vowel. +** +** In these routine, the letters are in reverse order. So the 'y' rule +** is that 'y' is a consonant unless it is followed by another +** consonent. +*/ +static int isVowel(const char*); +static int isConsonant(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return j; + return z[1]==0 || isVowel(z + 1); +} +static int isVowel(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return 1-j; + return isConsonant(z + 1); +} + +/* +** Let any sequence of one or more vowels be represented by V and let +** C be sequence of one or more consonants. Then every word can be +** represented as: +** +** [C] (VC){m} [V] +** +** In prose: A word is an optional consonant followed by zero or +** vowel-consonant pairs followed by an optional vowel. "m" is the +** number of vowel consonant pairs. This routine computes the value +** of m for the first i bytes of a word. +** +** Return true if the m-value for z is 1 or more. In other words, +** return true if z contains at least one vowel that is followed +** by a consonant. +** +** In this routine z[] is in reverse order. So we are really looking +** for an instance of a consonant followed by a vowel. +*/ +static int m_gt_0(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* Like mgt0 above except we are looking for a value of m which is +** exactly 1 +*/ +static int m_eq_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 1; + while( isConsonant(z) ){ z++; } + return *z==0; +} + +/* Like mgt0 above except we are looking for a value of m>1 instead +** or m>0 +*/ +static int m_gt_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** Return TRUE if there is a vowel anywhere within z[0..n-1] +*/ +static int hasVowel(const char *z){ + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** Return TRUE if the word ends in a double consonant. +** +** The text is reversed here. So we are really looking at +** the first two characters of z[]. +*/ +static int doubleConsonant(const char *z){ + return isConsonant(z) && z[0]==z[1]; +} + +/* +** Return TRUE if the word ends with three letters which +** are consonant-vowel-consonent and where the final consonant +** is not 'w', 'x', or 'y'. +** +** The word is reversed here. So we are really checking the +** first three letters and the first one cannot be in [wxy]. +*/ +static int star_oh(const char *z){ + return + isConsonant(z) && + z[0]!='w' && z[0]!='x' && z[0]!='y' && + isVowel(z+1) && + isConsonant(z+2); +} + +/* +** If the word ends with zFrom and xCond() is true for the stem +** of the word that preceeds the zFrom ending, then change the +** ending to zTo. +** +** The input word *pz and zFrom are both in reverse order. zTo +** is in normal order. +** +** Return TRUE if zFrom matches. Return FALSE if zFrom does not +** match. Not that TRUE is returned even if xCond() fails and +** no substitution occurs. +*/ +static int stem( + char **pz, /* The word being stemmed (Reversed) */ + const char *zFrom, /* If the ending matches this... (Reversed) */ + const char *zTo, /* ... change the ending to this (not reversed) */ + int (*xCond)(const char*) /* Condition that must be true */ +){ + char *z = *pz; + while( *zFrom && *zFrom==*z ){ z++; zFrom++; } + if( *zFrom!=0 ) return 0; + if( xCond && !xCond(z) ) return 1; + while( *zTo ){ + *(--z) = *(zTo++); + } + *pz = z; + return 1; +} + +/* +** This is the fallback stemmer used when the porter stemmer is +** inappropriate. The input word is copied into the output with +** US-ASCII case folding. If the input word is too long (more +** than 20 bytes if it contains no digits or more than 6 bytes if +** it contains digits) then word is truncated to 20 or 6 bytes +** by taking 10 or 3 bytes from the beginning and end. +*/ +static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ + int i, mx, j; + int hasDigit = 0; + for(i=0; i='A' && c<='Z' ){ + zOut[i] = c - 'A' + 'a'; + }else{ + if( c>='0' && c<='9' ) hasDigit = 1; + zOut[i] = c; + } + } + mx = hasDigit ? 3 : 10; + if( nIn>mx*2 ){ + for(j=mx, i=nIn-mx; i=(int)sizeof(zReverse)-7 ){ + /* The word is too big or too small for the porter stemmer. + ** Fallback to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + for(i=0, j=sizeof(zReverse)-6; i='A' && c<='Z' ){ + zReverse[j] = c + 'a' - 'A'; + }else if( c>='a' && c<='z' ){ + zReverse[j] = c; + }else{ + /* The use of a character not in [a-zA-Z] means that we fallback + ** to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + } + memset(&zReverse[sizeof(zReverse)-5], 0, 5); + z = &zReverse[j+1]; + + + /* Step 1a */ + if( z[0]=='s' ){ + if( + !stem(&z, "sess", "ss", 0) && + !stem(&z, "sei", "i", 0) && + !stem(&z, "ss", "ss", 0) + ){ + z++; + } + } + + /* Step 1b */ + z2 = z; + if( stem(&z, "dee", "ee", m_gt_0) ){ + /* Do nothing. The work was all in the test */ + }else if( + (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) + && z!=z2 + ){ + if( stem(&z, "ta", "ate", 0) || + stem(&z, "lb", "ble", 0) || + stem(&z, "zi", "ize", 0) ){ + /* Do nothing. The work was all in the test */ + }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){ + z++; + }else if( m_eq_1(z) && star_oh(z) ){ + *(--z) = 'e'; + } + } + + /* Step 1c */ + if( z[0]=='y' && hasVowel(z+1) ){ + z[0] = 'i'; + } + + /* Step 2 */ + switch( z[1] ){ + case 'a': + if( !stem(&z, "lanoita", "ate", m_gt_0) ){ + stem(&z, "lanoit", "tion", m_gt_0); + } + break; + case 'c': + if( !stem(&z, "icne", "ence", m_gt_0) ){ + stem(&z, "icna", "ance", m_gt_0); + } + break; + case 'e': + stem(&z, "rezi", "ize", m_gt_0); + break; + case 'g': + stem(&z, "igol", "log", m_gt_0); + break; + case 'l': + if( !stem(&z, "ilb", "ble", m_gt_0) + && !stem(&z, "illa", "al", m_gt_0) + && !stem(&z, "iltne", "ent", m_gt_0) + && !stem(&z, "ile", "e", m_gt_0) + ){ + stem(&z, "ilsuo", "ous", m_gt_0); + } + break; + case 'o': + if( !stem(&z, "noitazi", "ize", m_gt_0) + && !stem(&z, "noita", "ate", m_gt_0) + ){ + stem(&z, "rota", "ate", m_gt_0); + } + break; + case 's': + if( !stem(&z, "msila", "al", m_gt_0) + && !stem(&z, "ssenevi", "ive", m_gt_0) + && !stem(&z, "ssenluf", "ful", m_gt_0) + ){ + stem(&z, "ssensuo", "ous", m_gt_0); + } + break; + case 't': + if( !stem(&z, "itila", "al", m_gt_0) + && !stem(&z, "itivi", "ive", m_gt_0) + ){ + stem(&z, "itilib", "ble", m_gt_0); + } + break; + } + + /* Step 3 */ + switch( z[0] ){ + case 'e': + if( !stem(&z, "etaci", "ic", m_gt_0) + && !stem(&z, "evita", "", m_gt_0) + ){ + stem(&z, "ezila", "al", m_gt_0); + } + break; + case 'i': + stem(&z, "itici", "ic", m_gt_0); + break; + case 'l': + if( !stem(&z, "laci", "ic", m_gt_0) ){ + stem(&z, "luf", "", m_gt_0); + } + break; + case 's': + stem(&z, "ssen", "", m_gt_0); + break; + } + + /* Step 4 */ + switch( z[1] ){ + case 'a': + if( z[0]=='l' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'c': + if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'e': + if( z[0]=='r' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'i': + if( z[0]=='c' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'l': + if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'n': + if( z[0]=='t' ){ + if( z[2]=='a' ){ + if( m_gt_1(z+3) ){ + z += 3; + } + }else if( z[2]=='e' ){ + if( !stem(&z, "tneme", "", m_gt_1) + && !stem(&z, "tnem", "", m_gt_1) + ){ + stem(&z, "tne", "", m_gt_1); + } + } + } + break; + case 'o': + if( z[0]=='u' ){ + if( m_gt_1(z+2) ){ + z += 2; + } + }else if( z[3]=='s' || z[3]=='t' ){ + stem(&z, "noi", "", m_gt_1); + } + break; + case 's': + if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 't': + if( !stem(&z, "eta", "", m_gt_1) ){ + stem(&z, "iti", "", m_gt_1); + } + break; + case 'u': + if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 'v': + case 'z': + if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + } + + /* Step 5a */ + if( z[0]=='e' ){ + if( m_gt_1(z+1) ){ + z++; + }else if( m_eq_1(z+1) && !star_oh(z+1) ){ + z++; + } + } + + /* Step 5b */ + if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){ + z++; + } + + /* z[] is now the stemmed word in reverse order. Flip it back + ** around into forward order and return. + */ + *pnOut = i = (int)strlen(z); + zOut[i] = 0; + while( *z ){ + zOut[--i] = *(z++); + } +} + +/* +** Characters that can be part of a token. We assume any character +** whose value is greater than 0x80 (any UTF character) can be +** part of a token. In other words, delimiters all must have +** values of 0x7f or lower. +*/ +static const char porterIdChar[] = { +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ +}; +#define isDelim(C) (((ch=C)&0x80)==0 && (ch<0x30 || !porterIdChar[ch-0x30])) + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to porterOpen(). +*/ +static int porterNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by porterOpen */ + const char **pzToken, /* OUT: *pzToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + const char *z = c->zInput; + + while( c->iOffsetnInput ){ + int iStartOffset, ch; + + /* Scan past delimiter characters */ + while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int n = c->iOffset-iStartOffset; + if( n>c->nAllocated ){ + char *pNew; + c->nAllocated = n+20; + pNew = sqlite3_realloc(c->zToken, c->nAllocated); + if( !pNew ) return SQLITE_NOMEM; + c->zToken = pNew; + } + porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); + *pzToken = c->zToken; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the porter-stemmer tokenizer +*/ +static const sqlite3_tokenizer_module porterTokenizerModule = { + 0, + porterCreate, + porterDestroy, + porterOpen, + porterClose, + porterNext, + 0 +}; + +/* +** Allocate a new porter tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &porterTokenizerModule; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_porter.c *****************************************/ +/************** Begin file fts3_tokenizer.c **********************************/ +/* +** 2007 June 22 +** +** 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 is part of an SQLite module implementing full-text search. +** This particular file implements the generic tokenizer interface. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +/* +** Return true if the two-argument version of fts3_tokenizer() +** has been activated via a prior call to sqlite3_db_config(db, +** SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, 1, 0); +*/ +static int fts3TokenizerEnabled(sqlite3_context *context){ + sqlite3 *db = sqlite3_context_db_handle(context); + int isEnabled = 0; + sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,-1,&isEnabled); + return isEnabled; +} + +/* +** Implementation of the SQL scalar function for accessing the underlying +** hash table. This function may be called as follows: +** +** SELECT (); +** SELECT (, ); +** +** where is the name passed as the second argument +** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer'). +** +** If the argument is specified, it must be a blob value +** containing a pointer to be stored as the hash data corresponding +** to the string . If is not specified, then +** the string must already exist in the has table. Otherwise, +** an error is returned. +** +** Whether or not the argument is specified, the value returned +** is a blob containing the pointer stored as the hash data corresponding +** to string (after the hash-table is updated, if applicable). +*/ +static void fts3TokenizerFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + Fts3Hash *pHash; + void *pPtr = 0; + const unsigned char *zName; + int nName; + + assert( argc==1 || argc==2 ); + + pHash = (Fts3Hash *)sqlite3_user_data(context); + + zName = sqlite3_value_text(argv[0]); + nName = sqlite3_value_bytes(argv[0])+1; + + if( argc==2 ){ + if( fts3TokenizerEnabled(context) || sqlite3_value_frombind(argv[1]) ){ + void *pOld; + int n = sqlite3_value_bytes(argv[1]); + if( zName==0 || n!=sizeof(pPtr) ){ + sqlite3_result_error(context, "argument type mismatch", -1); + return; + } + pPtr = *(void **)sqlite3_value_blob(argv[1]); + pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr); + if( pOld==pPtr ){ + sqlite3_result_error(context, "out of memory", -1); + } + }else{ + sqlite3_result_error(context, "fts3tokenize disabled", -1); + return; + } + }else{ + if( zName ){ + pPtr = sqlite3Fts3HashFind(pHash, zName, nName); + } + if( !pPtr ){ + char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + } + if( fts3TokenizerEnabled(context) || sqlite3_value_frombind(argv[0]) ){ + sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + } +} + +SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char c){ + static const char isFtsIdChar[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ + }; + return (c&0x80 || isFtsIdChar[(int)(c)]); +} + +SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *zStr, int *pn){ + const char *z1; + const char *z2 = 0; + + /* Find the start of the next token. */ + z1 = zStr; + while( z2==0 ){ + char c = *z1; + switch( c ){ + case '\0': return 0; /* No more tokens here */ + case '\'': + case '"': + case '`': { + z2 = z1; + while( *++z2 && (*z2!=c || *++z2==c) ); + break; + } + case '[': + z2 = &z1[1]; + while( *z2 && z2[0]!=']' ) z2++; + if( *z2 ) z2++; + break; + + default: + if( sqlite3Fts3IsIdChar(*z1) ){ + z2 = &z1[1]; + while( sqlite3Fts3IsIdChar(*z2) ) z2++; + }else{ + z1++; + } + } + } + + *pn = (int)(z2-z1); + return z1; +} + +SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( + Fts3Hash *pHash, /* Tokenizer hash table */ + const char *zArg, /* Tokenizer name */ + sqlite3_tokenizer **ppTok, /* OUT: Tokenizer (if applicable) */ + char **pzErr /* OUT: Set to malloced error message */ +){ + int rc; + char *z = (char *)zArg; + int n = 0; + char *zCopy; + char *zEnd; /* Pointer to nul-term of zCopy */ + sqlite3_tokenizer_module *m; + + zCopy = sqlite3_mprintf("%s", zArg); + if( !zCopy ) return SQLITE_NOMEM; + zEnd = &zCopy[strlen(zCopy)]; + + z = (char *)sqlite3Fts3NextToken(zCopy, &n); + if( z==0 ){ + assert( n==0 ); + z = zCopy; + } + z[n] = '\0'; + sqlite3Fts3Dequote(z); + + m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash,z,(int)strlen(z)+1); + if( !m ){ + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer: %s", z); + rc = SQLITE_ERROR; + }else{ + char const **aArg = 0; + int iArg = 0; + z = &z[n+1]; + while( zxCreate(iArg, aArg, ppTok); + assert( rc!=SQLITE_OK || *ppTok ); + if( rc!=SQLITE_OK ){ + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer"); + }else{ + (*ppTok)->pModule = m; + } + sqlite3_free((void *)aArg); + } + + sqlite3_free(zCopy); + return rc; +} + + +#ifdef SQLITE_TEST + +#if defined(INCLUDE_SQLITE_TCL_H) +# include "sqlite_tcl.h" +#else +# include "tcl.h" +#endif +/* #include */ + +/* +** Implementation of a special SQL scalar function for testing tokenizers +** designed to be used in concert with the Tcl testing framework. This +** function must be called with two or more arguments: +** +** SELECT (, ..., ); +** +** where is the name passed as the second argument +** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer') +** concatenated with the string '_test' (e.g. 'fts3_tokenizer_test'). +** +** The return value is a string that may be interpreted as a Tcl +** list. For each token in the , three elements are +** added to the returned list. The first is the token position, the +** second is the token text (folded, stemmed, etc.) and the third is the +** substring of associated with the token. For example, +** using the built-in "simple" tokenizer: +** +** SELECT fts_tokenizer_test('simple', 'I don't see how'); +** +** will return the string: +** +** "{0 i I 1 dont don't 2 see see 3 how how}" +** +*/ +static void testFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + Fts3Hash *pHash; + sqlite3_tokenizer_module *p; + sqlite3_tokenizer *pTokenizer = 0; + sqlite3_tokenizer_cursor *pCsr = 0; + + const char *zErr = 0; + + const char *zName; + int nName; + const char *zInput; + int nInput; + + const char *azArg[64]; + + const char *zToken; + int nToken = 0; + int iStart = 0; + int iEnd = 0; + int iPos = 0; + int i; + + Tcl_Obj *pRet; + + if( argc<2 ){ + sqlite3_result_error(context, "insufficient arguments", -1); + return; + } + + nName = sqlite3_value_bytes(argv[0]); + zName = (const char *)sqlite3_value_text(argv[0]); + nInput = sqlite3_value_bytes(argv[argc-1]); + zInput = (const char *)sqlite3_value_text(argv[argc-1]); + + pHash = (Fts3Hash *)sqlite3_user_data(context); + p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); + + if( !p ){ + char *zErr2 = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr2, -1); + sqlite3_free(zErr2); + return; + } + + pRet = Tcl_NewObj(); + Tcl_IncrRefCount(pRet); + + for(i=1; ixCreate(argc-2, azArg, &pTokenizer) ){ + zErr = "error in xCreate()"; + goto finish; + } + pTokenizer->pModule = p; + if( sqlite3Fts3OpenTokenizer(pTokenizer, 0, zInput, nInput, &pCsr) ){ + zErr = "error in xOpen()"; + goto finish; + } + + while( SQLITE_OK==p->xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos) ){ + Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(iPos)); + Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); + zToken = &zInput[iStart]; + nToken = iEnd-iStart; + Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); + } + + if( SQLITE_OK!=p->xClose(pCsr) ){ + zErr = "error in xClose()"; + goto finish; + } + if( SQLITE_OK!=p->xDestroy(pTokenizer) ){ + zErr = "error in xDestroy()"; + goto finish; + } + +finish: + if( zErr ){ + sqlite3_result_error(context, zErr, -1); + }else{ + sqlite3_result_text(context, Tcl_GetString(pRet), -1, SQLITE_TRANSIENT); + } + Tcl_DecrRefCount(pRet); +} + +static +int registerTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module *p +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?, ?)"; + + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); + sqlite3_step(pStmt); + + return sqlite3_finalize(pStmt); +} + + +static +int queryTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module **pp +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?)"; + + *pp = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB + && sqlite3_column_bytes(pStmt, 0)==sizeof(*pp) + ){ + memcpy((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + } + } + + return sqlite3_finalize(pStmt); +} + +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); + +/* +** Implementation of the scalar function fts3_tokenizer_internal_test(). +** This function is used for testing only, it is not included in the +** build unless SQLITE_TEST is defined. +** +** The purpose of this is to test that the fts3_tokenizer() function +** can be used as designed by the C-code in the queryTokenizer and +** registerTokenizer() functions above. These two functions are repeated +** in the README.tokenizer file as an example, so it is important to +** test them. +** +** To run the tests, evaluate the fts3_tokenizer_internal_test() scalar +** function with no arguments. An assert() will fail if a problem is +** detected. i.e.: +** +** SELECT fts3_tokenizer_internal_test(); +** +*/ +static void intTestFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int rc; + const sqlite3_tokenizer_module *p1; + const sqlite3_tokenizer_module *p2; + sqlite3 *db = (sqlite3 *)sqlite3_user_data(context); + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + + /* Test the query function */ + sqlite3Fts3SimpleTokenizerModule(&p1); + rc = queryTokenizer(db, "simple", &p2); + assert( rc==SQLITE_OK ); + assert( p1==p2 ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_ERROR ); + assert( p2==0 ); + assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") ); + + /* Test the storage function */ + if( fts3TokenizerEnabled(context) ){ + rc = registerTokenizer(db, "nosuchtokenizer", p1); + assert( rc==SQLITE_OK ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_OK ); + assert( p2==p1 ); + } + + sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); +} + +#endif + +/* +** Set up SQL objects in database db used to access the contents of +** the hash table pointed to by argument pHash. The hash table must +** been initialized to use string keys, and to take a private copy +** of the key when a value is inserted. i.e. by a call similar to: +** +** sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); +** +** This function adds a scalar function (see header comment above +** fts3TokenizerFunc() in this file for details) and, if ENABLE_TABLE is +** defined at compilation time, a temporary virtual table (see header +** comment above struct HashTableVtab) to the database schema. Both +** provide read/write access to the contents of *pHash. +** +** The third argument to this function, zName, is used as the name +** of both the scalar and, if created, the virtual table. +*/ +SQLITE_PRIVATE int sqlite3Fts3InitHashTable( + sqlite3 *db, + Fts3Hash *pHash, + const char *zName +){ + int rc = SQLITE_OK; + void *p = (void *)pHash; + const int any = SQLITE_UTF8|SQLITE_DIRECTONLY; + +#ifdef SQLITE_TEST + char *zTest = 0; + char *zTest2 = 0; + void *pdb = (void *)db; + zTest = sqlite3_mprintf("%s_test", zName); + zTest2 = sqlite3_mprintf("%s_internal_test", zName); + if( !zTest || !zTest2 ){ + rc = SQLITE_NOMEM; + } +#endif + + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zName, 1, any, p, fts3TokenizerFunc, 0, 0); + } + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zName, 2, any, p, fts3TokenizerFunc, 0, 0); + } +#ifdef SQLITE_TEST + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zTest, -1, any, p, testFunc, 0, 0); + } + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0); + } +#endif + +#ifdef SQLITE_TEST + sqlite3_free(zTest); + sqlite3_free(zTest2); +#endif + + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_tokenizer.c **************************************/ +/************** Begin file fts3_tokenizer1.c *********************************/ +/* +** 2006 Oct 10 +** +** 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. +** +****************************************************************************** +** +** Implementation of the "simple" full-text-search tokenizer. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_tokenizer.h" */ + +typedef struct simple_tokenizer { + sqlite3_tokenizer base; + char delim[128]; /* flag ASCII delimiters */ +} simple_tokenizer; + +typedef struct simple_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *pInput; /* input we are tokenizing */ + int nBytes; /* size of the input */ + int iOffset; /* current position in pInput */ + int iToken; /* index of next token to be returned */ + char *pToken; /* storage for current token */ + int nTokenAllocated; /* space allocated to zToken buffer */ +} simple_tokenizer_cursor; + + +static int simpleDelim(simple_tokenizer *t, unsigned char c){ + return c<0x80 && t->delim[c]; +} +static int fts3_isalnum(int x){ + return (x>='0' && x<='9') || (x>='A' && x<='Z') || (x>='a' && x<='z'); +} + +/* +** Create a new tokenizer instance. +*/ +static int simpleCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + simple_tokenizer *t; + + t = (simple_tokenizer *) sqlite3_malloc(sizeof(*t)); + if( t==NULL ) return SQLITE_NOMEM; + memset(t, 0, sizeof(*t)); + + /* TODO(shess) Delimiters need to remain the same from run to run, + ** else we need to reindex. One solution would be a meta-table to + ** track such information in the database, then we'd only want this + ** information on the initial create. + */ + if( argc>1 ){ + int i, n = (int)strlen(argv[1]); + for(i=0; i=0x80 ){ + sqlite3_free(t); + return SQLITE_ERROR; + } + t->delim[ch] = 1; + } + } else { + /* Mark non-alphanumeric ASCII characters as delimiters */ + int i; + for(i=1; i<0x80; i++){ + t->delim[i] = !fts3_isalnum(i) ? -1 : 0; + } + } + + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ + sqlite3_free(pTokenizer); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int simpleOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *pInput, int nBytes, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + simple_tokenizer_cursor *c; + + UNUSED_PARAMETER(pTokenizer); + + c = (simple_tokenizer_cursor *) sqlite3_malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + c->pInput = pInput; + if( pInput==0 ){ + c->nBytes = 0; + }else if( nBytes<0 ){ + c->nBytes = (int)strlen(pInput); + }else{ + c->nBytes = nBytes; + } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->pToken = NULL; /* no space allocated, yet. */ + c->nTokenAllocated = 0; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** simpleOpen() above. +*/ +static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + sqlite3_free(c->pToken); + sqlite3_free(c); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to simpleOpen(). +*/ +static int simpleNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ + const char **ppToken, /* OUT: *ppToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer; + unsigned char *p = (unsigned char *)c->pInput; + + while( c->iOffsetnBytes ){ + int iStartOffset; + + /* Scan past delimiter characters */ + while( c->iOffsetnBytes && simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnBytes && !simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int i, n = c->iOffset-iStartOffset; + if( n>c->nTokenAllocated ){ + char *pNew; + c->nTokenAllocated = n+20; + pNew = sqlite3_realloc(c->pToken, c->nTokenAllocated); + if( !pNew ) return SQLITE_NOMEM; + c->pToken = pNew; + } + for(i=0; ipToken[i] = (char)((ch>='A' && ch<='Z') ? ch-'A'+'a' : ch); + } + *ppToken = c->pToken; + *pnBytes = n; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module simpleTokenizerModule = { + 0, + simpleCreate, + simpleDestroy, + simpleOpen, + simpleClose, + simpleNext, + 0, +}; + +/* +** Allocate a new simple tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &simpleTokenizerModule; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_tokenizer1.c *************************************/ +/************** Begin file fts3_tokenize_vtab.c ******************************/ +/* +** 2013 Apr 22 +** +** 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 code for the "fts3tokenize" virtual table module. +** An fts3tokenize virtual table is created as follows: +** +** CREATE VIRTUAL TABLE USING fts3tokenize( +** , , ... +** ); +** +** The table created has the following schema: +** +** CREATE TABLE (input, token, start, end, position) +** +** When queried, the query must include a WHERE clause of type: +** +** input = +** +** The virtual table module tokenizes this , using the FTS3 +** tokenizer specified by the arguments to the CREATE VIRTUAL TABLE +** statement and returns one row for each token in the result. With +** fields set as follows: +** +** input: Always set to a copy of +** token: A token from the input. +** start: Byte offset of the token within the input . +** end: Byte offset of the byte immediately following the end of the +** token within the input string. +** pos: Token offset of token within input. +** +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +typedef struct Fts3tokTable Fts3tokTable; +typedef struct Fts3tokCursor Fts3tokCursor; + +/* +** Virtual table structure. +*/ +struct Fts3tokTable { + sqlite3_vtab base; /* Base class used by SQLite core */ + const sqlite3_tokenizer_module *pMod; + sqlite3_tokenizer *pTok; +}; + +/* +** Virtual table cursor structure. +*/ +struct Fts3tokCursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + char *zInput; /* Input string */ + sqlite3_tokenizer_cursor *pCsr; /* Cursor to iterate through zInput */ + int iRowid; /* Current 'rowid' value */ + const char *zToken; /* Current 'token' value */ + int nToken; /* Size of zToken in bytes */ + int iStart; /* Current 'start' value */ + int iEnd; /* Current 'end' value */ + int iPos; /* Current 'pos' value */ +}; + +/* +** Query FTS for the tokenizer implementation named zName. +*/ +static int fts3tokQueryTokenizer( + Fts3Hash *pHash, + const char *zName, + const sqlite3_tokenizer_module **pp, + char **pzErr +){ + sqlite3_tokenizer_module *p; + int nName = (int)strlen(zName); + + p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); + if( !p ){ + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer: %s", zName); + return SQLITE_ERROR; + } + + *pp = p; + return SQLITE_OK; +} + +/* +** The second argument, argv[], is an array of pointers to nul-terminated +** strings. This function makes a copy of the array and strings into a +** single block of memory. It then dequotes any of the strings that appear +** to be quoted. +** +** If successful, output parameter *pazDequote is set to point at the +** array of dequoted strings and SQLITE_OK is returned. The caller is +** responsible for eventually calling sqlite3_free() to free the array +** in this case. Or, if an error occurs, an SQLite error code is returned. +** The final value of *pazDequote is undefined in this case. +*/ +static int fts3tokDequoteArray( + int argc, /* Number of elements in argv[] */ + const char * const *argv, /* Input array */ + char ***pazDequote /* Output array */ +){ + int rc = SQLITE_OK; /* Return code */ + if( argc==0 ){ + *pazDequote = 0; + }else{ + int i; + int nByte = 0; + char **azDequote; + + for(i=0; ixCreate((nDequote>1 ? nDequote-1 : 0), azArg, &pTok); + } + + if( rc==SQLITE_OK ){ + pTab = (Fts3tokTable *)sqlite3_malloc(sizeof(Fts3tokTable)); + if( pTab==0 ){ + rc = SQLITE_NOMEM; + } + } + + if( rc==SQLITE_OK ){ + memset(pTab, 0, sizeof(Fts3tokTable)); + pTab->pMod = pMod; + pTab->pTok = pTok; + *ppVtab = &pTab->base; + }else{ + if( pTok ){ + pMod->xDestroy(pTok); + } + } + + sqlite3_free(azDequote); + return rc; +} + +/* +** This function does the work for both the xDisconnect and xDestroy methods. +** These tables have no persistent representation of their own, so xDisconnect +** and xDestroy are identical operations. +*/ +static int fts3tokDisconnectMethod(sqlite3_vtab *pVtab){ + Fts3tokTable *pTab = (Fts3tokTable *)pVtab; + + pTab->pMod->xDestroy(pTab->pTok); + sqlite3_free(pTab); + return SQLITE_OK; +} + +/* +** xBestIndex - Analyze a WHERE and ORDER BY clause. +*/ +static int fts3tokBestIndexMethod( + sqlite3_vtab *pVTab, + sqlite3_index_info *pInfo +){ + int i; + UNUSED_PARAMETER(pVTab); + + for(i=0; inConstraint; i++){ + if( pInfo->aConstraint[i].usable + && pInfo->aConstraint[i].iColumn==0 + && pInfo->aConstraint[i].op==SQLITE_INDEX_CONSTRAINT_EQ + ){ + pInfo->idxNum = 1; + pInfo->aConstraintUsage[i].argvIndex = 1; + pInfo->aConstraintUsage[i].omit = 1; + pInfo->estimatedCost = 1; + return SQLITE_OK; + } + } + + pInfo->idxNum = 0; + assert( pInfo->estimatedCost>1000000.0 ); + + return SQLITE_OK; +} + +/* +** xOpen - Open a cursor. +*/ +static int fts3tokOpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + Fts3tokCursor *pCsr; + UNUSED_PARAMETER(pVTab); + + pCsr = (Fts3tokCursor *)sqlite3_malloc(sizeof(Fts3tokCursor)); + if( pCsr==0 ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(Fts3tokCursor)); + + *ppCsr = (sqlite3_vtab_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** Reset the tokenizer cursor passed as the only argument. As if it had +** just been returned by fts3tokOpenMethod(). +*/ +static void fts3tokResetCursor(Fts3tokCursor *pCsr){ + if( pCsr->pCsr ){ + Fts3tokTable *pTab = (Fts3tokTable *)(pCsr->base.pVtab); + pTab->pMod->xClose(pCsr->pCsr); + pCsr->pCsr = 0; + } + sqlite3_free(pCsr->zInput); + pCsr->zInput = 0; + pCsr->zToken = 0; + pCsr->nToken = 0; + pCsr->iStart = 0; + pCsr->iEnd = 0; + pCsr->iPos = 0; + pCsr->iRowid = 0; +} + +/* +** xClose - Close a cursor. +*/ +static int fts3tokCloseMethod(sqlite3_vtab_cursor *pCursor){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + + fts3tokResetCursor(pCsr); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** xNext - Advance the cursor to the next row, if any. +*/ +static int fts3tokNextMethod(sqlite3_vtab_cursor *pCursor){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + Fts3tokTable *pTab = (Fts3tokTable *)(pCursor->pVtab); + int rc; /* Return code */ + + pCsr->iRowid++; + rc = pTab->pMod->xNext(pCsr->pCsr, + &pCsr->zToken, &pCsr->nToken, + &pCsr->iStart, &pCsr->iEnd, &pCsr->iPos + ); + + if( rc!=SQLITE_OK ){ + fts3tokResetCursor(pCsr); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + + return rc; +} + +/* +** xFilter - Initialize a cursor to point at the start of its data. +*/ +static int fts3tokFilterMethod( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, /* Strategy index */ + const char *idxStr, /* Unused */ + int nVal, /* Number of elements in apVal */ + sqlite3_value **apVal /* Arguments for the indexing scheme */ +){ + int rc = SQLITE_ERROR; + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + Fts3tokTable *pTab = (Fts3tokTable *)(pCursor->pVtab); + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(nVal); + + fts3tokResetCursor(pCsr); + if( idxNum==1 ){ + const char *zByte = (const char *)sqlite3_value_text(apVal[0]); + int nByte = sqlite3_value_bytes(apVal[0]); + pCsr->zInput = sqlite3_malloc64(nByte+1); + if( pCsr->zInput==0 ){ + rc = SQLITE_NOMEM; + }else{ + if( nByte>0 ) memcpy(pCsr->zInput, zByte, nByte); + pCsr->zInput[nByte] = 0; + rc = pTab->pMod->xOpen(pTab->pTok, pCsr->zInput, nByte, &pCsr->pCsr); + if( rc==SQLITE_OK ){ + pCsr->pCsr->pTokenizer = pTab->pTok; + } + } + } + + if( rc!=SQLITE_OK ) return rc; + return fts3tokNextMethod(pCursor); +} + +/* +** xEof - Return true if the cursor is at EOF, or false otherwise. +*/ +static int fts3tokEofMethod(sqlite3_vtab_cursor *pCursor){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + return (pCsr->zToken==0); +} + +/* +** xColumn - Return a column value. +*/ +static int fts3tokColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + + /* CREATE TABLE x(input, token, start, end, position) */ + switch( iCol ){ + case 0: + sqlite3_result_text(pCtx, pCsr->zInput, -1, SQLITE_TRANSIENT); + break; + case 1: + sqlite3_result_text(pCtx, pCsr->zToken, pCsr->nToken, SQLITE_TRANSIENT); + break; + case 2: + sqlite3_result_int(pCtx, pCsr->iStart); + break; + case 3: + sqlite3_result_int(pCtx, pCsr->iEnd); + break; + default: + assert( iCol==4 ); + sqlite3_result_int(pCtx, pCsr->iPos); + break; + } + return SQLITE_OK; +} + +/* +** xRowid - Return the current rowid for the cursor. +*/ +static int fts3tokRowidMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite_int64 *pRowid /* OUT: Rowid value */ +){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + *pRowid = (sqlite3_int64)pCsr->iRowid; + return SQLITE_OK; +} + +/* +** Register the fts3tok module with database connection db. Return SQLITE_OK +** if successful or an error code if sqlite3_create_module() fails. +*/ +SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){ + static const sqlite3_module fts3tok_module = { + 0, /* iVersion */ + fts3tokConnectMethod, /* xCreate */ + fts3tokConnectMethod, /* xConnect */ + fts3tokBestIndexMethod, /* xBestIndex */ + fts3tokDisconnectMethod, /* xDisconnect */ + fts3tokDisconnectMethod, /* xDestroy */ + fts3tokOpenMethod, /* xOpen */ + fts3tokCloseMethod, /* xClose */ + fts3tokFilterMethod, /* xFilter */ + fts3tokNextMethod, /* xNext */ + fts3tokEofMethod, /* xEof */ + fts3tokColumnMethod, /* xColumn */ + fts3tokRowidMethod, /* xRowid */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindFunction */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ + }; + int rc; /* Return code */ + + rc = sqlite3_create_module(db, "fts3tokenize", &fts3tok_module, (void*)pHash); + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_tokenize_vtab.c **********************************/ +/************** Begin file fts3_write.c **************************************/ +/* +** 2009 Oct 23 +** +** 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 is part of the SQLite FTS3 extension module. Specifically, +** this file contains code to insert, update and delete rows from FTS3 +** tables. It also contains code to merge FTS3 b-tree segments. Some +** of the sub-routines used to merge segments are also used by the query +** code in fts3.c. +*/ + +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +#define FTS_MAX_APPENDABLE_HEIGHT 16 + +/* +** When full-text index nodes are loaded from disk, the buffer that they +** are loaded into has the following number of bytes of padding at the end +** of it. i.e. if a full-text index node is 900 bytes in size, then a buffer +** of 920 bytes is allocated for it. +** +** This means that if we have a pointer into a buffer containing node data, +** it is always safe to read up to two varints from it without risking an +** overread, even if the node data is corrupted. +*/ +#define FTS3_NODE_PADDING (FTS3_VARINT_MAX*2) + +/* +** Under certain circumstances, b-tree nodes (doclists) can be loaded into +** memory incrementally instead of all at once. This can be a big performance +** win (reduced IO and CPU) if SQLite stops calling the virtual table xNext() +** method before retrieving all query results (as may happen, for example, +** if a query has a LIMIT clause). +** +** Incremental loading is used for b-tree nodes FTS3_NODE_CHUNK_THRESHOLD +** bytes and larger. Nodes are loaded in chunks of FTS3_NODE_CHUNKSIZE bytes. +** The code is written so that the hard lower-limit for each of these values +** is 1. Clearly such small values would be inefficient, but can be useful +** for testing purposes. +** +** If this module is built with SQLITE_TEST defined, these constants may +** be overridden at runtime for testing purposes. File fts3_test.c contains +** a Tcl interface to read and write the values. +*/ +#ifdef SQLITE_TEST +int test_fts3_node_chunksize = (4*1024); +int test_fts3_node_chunk_threshold = (4*1024)*4; +# define FTS3_NODE_CHUNKSIZE test_fts3_node_chunksize +# define FTS3_NODE_CHUNK_THRESHOLD test_fts3_node_chunk_threshold +#else +# define FTS3_NODE_CHUNKSIZE (4*1024) +# define FTS3_NODE_CHUNK_THRESHOLD (FTS3_NODE_CHUNKSIZE*4) +#endif + +/* +** The values that may be meaningfully bound to the :1 parameter in +** statements SQL_REPLACE_STAT and SQL_SELECT_STAT. +*/ +#define FTS_STAT_DOCTOTAL 0 +#define FTS_STAT_INCRMERGEHINT 1 +#define FTS_STAT_AUTOINCRMERGE 2 + +/* +** If FTS_LOG_MERGES is defined, call sqlite3_log() to report each automatic +** and incremental merge operation that takes place. This is used for +** debugging FTS only, it should not usually be turned on in production +** systems. +*/ +#ifdef FTS3_LOG_MERGES +static void fts3LogMerge(int nMerge, sqlite3_int64 iAbsLevel){ + sqlite3_log(SQLITE_OK, "%d-way merge from level %d", nMerge, (int)iAbsLevel); +} +#else +#define fts3LogMerge(x, y) +#endif + + +typedef struct PendingList PendingList; +typedef struct SegmentNode SegmentNode; +typedef struct SegmentWriter SegmentWriter; + +/* +** An instance of the following data structure is used to build doclists +** incrementally. See function fts3PendingListAppend() for details. +*/ +struct PendingList { + int nData; + char *aData; + int nSpace; + sqlite3_int64 iLastDocid; + sqlite3_int64 iLastCol; + sqlite3_int64 iLastPos; +}; + + +/* +** Each cursor has a (possibly empty) linked list of the following objects. +*/ +struct Fts3DeferredToken { + Fts3PhraseToken *pToken; /* Pointer to corresponding expr token */ + int iCol; /* Column token must occur in */ + Fts3DeferredToken *pNext; /* Next in list of deferred tokens */ + PendingList *pList; /* Doclist is assembled here */ +}; + +/* +** An instance of this structure is used to iterate through the terms on +** a contiguous set of segment b-tree leaf nodes. Although the details of +** this structure are only manipulated by code in this file, opaque handles +** of type Fts3SegReader* are also used by code in fts3.c to iterate through +** terms when querying the full-text index. See functions: +** +** sqlite3Fts3SegReaderNew() +** sqlite3Fts3SegReaderFree() +** sqlite3Fts3SegReaderIterate() +** +** Methods used to manipulate Fts3SegReader structures: +** +** fts3SegReaderNext() +** fts3SegReaderFirstDocid() +** fts3SegReaderNextDocid() +*/ +struct Fts3SegReader { + int iIdx; /* Index within level, or 0x7FFFFFFF for PT */ + u8 bLookup; /* True for a lookup only */ + u8 rootOnly; /* True for a root-only reader */ + + sqlite3_int64 iStartBlock; /* Rowid of first leaf block to traverse */ + sqlite3_int64 iLeafEndBlock; /* Rowid of final leaf block to traverse */ + sqlite3_int64 iEndBlock; /* Rowid of final block in segment (or 0) */ + sqlite3_int64 iCurrentBlock; /* Current leaf block (or 0) */ + + char *aNode; /* Pointer to node data (or NULL) */ + int nNode; /* Size of buffer at aNode (or 0) */ + int nPopulate; /* If >0, bytes of buffer aNode[] loaded */ + sqlite3_blob *pBlob; /* If not NULL, blob handle to read node */ + + Fts3HashElem **ppNextElem; + + /* Variables set by fts3SegReaderNext(). These may be read directly + ** by the caller. They are valid from the time SegmentReaderNew() returns + ** until SegmentReaderNext() returns something other than SQLITE_OK + ** (i.e. SQLITE_DONE). + */ + int nTerm; /* Number of bytes in current term */ + char *zTerm; /* Pointer to current term */ + int nTermAlloc; /* Allocated size of zTerm buffer */ + char *aDoclist; /* Pointer to doclist of current entry */ + int nDoclist; /* Size of doclist in current entry */ + + /* The following variables are used by fts3SegReaderNextDocid() to iterate + ** through the current doclist (aDoclist/nDoclist). + */ + char *pOffsetList; + int nOffsetList; /* For descending pending seg-readers only */ + sqlite3_int64 iDocid; +}; + +#define fts3SegReaderIsPending(p) ((p)->ppNextElem!=0) +#define fts3SegReaderIsRootOnly(p) ((p)->rootOnly!=0) + +/* +** An instance of this structure is used to create a segment b-tree in the +** database. The internal details of this type are only accessed by the +** following functions: +** +** fts3SegWriterAdd() +** fts3SegWriterFlush() +** fts3SegWriterFree() +*/ +struct SegmentWriter { + SegmentNode *pTree; /* Pointer to interior tree structure */ + sqlite3_int64 iFirst; /* First slot in %_segments written */ + sqlite3_int64 iFree; /* Next free slot in %_segments */ + char *zTerm; /* Pointer to previous term buffer */ + int nTerm; /* Number of bytes in zTerm */ + int nMalloc; /* Size of malloc'd buffer at zMalloc */ + char *zMalloc; /* Malloc'd space (possibly) used for zTerm */ + int nSize; /* Size of allocation at aData */ + int nData; /* Bytes of data in aData */ + char *aData; /* Pointer to block from malloc() */ + i64 nLeafData; /* Number of bytes of leaf data written */ +}; + +/* +** Type SegmentNode is used by the following three functions to create +** the interior part of the segment b+-tree structures (everything except +** the leaf nodes). These functions and type are only ever used by code +** within the fts3SegWriterXXX() family of functions described above. +** +** fts3NodeAddTerm() +** fts3NodeWrite() +** fts3NodeFree() +** +** When a b+tree is written to the database (either as a result of a merge +** or the pending-terms table being flushed), leaves are written into the +** database file as soon as they are completely populated. The interior of +** the tree is assembled in memory and written out only once all leaves have +** been populated and stored. This is Ok, as the b+-tree fanout is usually +** very large, meaning that the interior of the tree consumes relatively +** little memory. +*/ +struct SegmentNode { + SegmentNode *pParent; /* Parent node (or NULL for root node) */ + SegmentNode *pRight; /* Pointer to right-sibling */ + SegmentNode *pLeftmost; /* Pointer to left-most node of this depth */ + int nEntry; /* Number of terms written to node so far */ + char *zTerm; /* Pointer to previous term buffer */ + int nTerm; /* Number of bytes in zTerm */ + int nMalloc; /* Size of malloc'd buffer at zMalloc */ + char *zMalloc; /* Malloc'd space (possibly) used for zTerm */ + int nData; /* Bytes of valid data so far */ + char *aData; /* Node data */ +}; + +/* +** Valid values for the second argument to fts3SqlStmt(). +*/ +#define SQL_DELETE_CONTENT 0 +#define SQL_IS_EMPTY 1 +#define SQL_DELETE_ALL_CONTENT 2 +#define SQL_DELETE_ALL_SEGMENTS 3 +#define SQL_DELETE_ALL_SEGDIR 4 +#define SQL_DELETE_ALL_DOCSIZE 5 +#define SQL_DELETE_ALL_STAT 6 +#define SQL_SELECT_CONTENT_BY_ROWID 7 +#define SQL_NEXT_SEGMENT_INDEX 8 +#define SQL_INSERT_SEGMENTS 9 +#define SQL_NEXT_SEGMENTS_ID 10 +#define SQL_INSERT_SEGDIR 11 +#define SQL_SELECT_LEVEL 12 +#define SQL_SELECT_LEVEL_RANGE 13 +#define SQL_SELECT_LEVEL_COUNT 14 +#define SQL_SELECT_SEGDIR_MAX_LEVEL 15 +#define SQL_DELETE_SEGDIR_LEVEL 16 +#define SQL_DELETE_SEGMENTS_RANGE 17 +#define SQL_CONTENT_INSERT 18 +#define SQL_DELETE_DOCSIZE 19 +#define SQL_REPLACE_DOCSIZE 20 +#define SQL_SELECT_DOCSIZE 21 +#define SQL_SELECT_STAT 22 +#define SQL_REPLACE_STAT 23 + +#define SQL_SELECT_ALL_PREFIX_LEVEL 24 +#define SQL_DELETE_ALL_TERMS_SEGDIR 25 +#define SQL_DELETE_SEGDIR_RANGE 26 +#define SQL_SELECT_ALL_LANGID 27 +#define SQL_FIND_MERGE_LEVEL 28 +#define SQL_MAX_LEAF_NODE_ESTIMATE 29 +#define SQL_DELETE_SEGDIR_ENTRY 30 +#define SQL_SHIFT_SEGDIR_ENTRY 31 +#define SQL_SELECT_SEGDIR 32 +#define SQL_CHOMP_SEGDIR 33 +#define SQL_SEGMENT_IS_APPENDABLE 34 +#define SQL_SELECT_INDEXES 35 +#define SQL_SELECT_MXLEVEL 36 + +#define SQL_SELECT_LEVEL_RANGE2 37 +#define SQL_UPDATE_LEVEL_IDX 38 +#define SQL_UPDATE_LEVEL 39 + +/* +** This function is used to obtain an SQLite prepared statement handle +** for the statement identified by the second argument. If successful, +** *pp is set to the requested statement handle and SQLITE_OK returned. +** Otherwise, an SQLite error code is returned and *pp is set to 0. +** +** If argument apVal is not NULL, then it must point to an array with +** at least as many entries as the requested statement has bound +** parameters. The values are bound to the statements parameters before +** returning. +*/ +static int fts3SqlStmt( + Fts3Table *p, /* Virtual table handle */ + int eStmt, /* One of the SQL_XXX constants above */ + sqlite3_stmt **pp, /* OUT: Statement handle */ + sqlite3_value **apVal /* Values to bind to statement */ +){ + const char *azSql[] = { +/* 0 */ "DELETE FROM %Q.'%q_content' WHERE rowid = ?", +/* 1 */ "SELECT NOT EXISTS(SELECT docid FROM %Q.'%q_content' WHERE rowid!=?)", +/* 2 */ "DELETE FROM %Q.'%q_content'", +/* 3 */ "DELETE FROM %Q.'%q_segments'", +/* 4 */ "DELETE FROM %Q.'%q_segdir'", +/* 5 */ "DELETE FROM %Q.'%q_docsize'", +/* 6 */ "DELETE FROM %Q.'%q_stat'", +/* 7 */ "SELECT %s WHERE rowid=?", +/* 8 */ "SELECT (SELECT max(idx) FROM %Q.'%q_segdir' WHERE level = ?) + 1", +/* 9 */ "REPLACE INTO %Q.'%q_segments'(blockid, block) VALUES(?, ?)", +/* 10 */ "SELECT coalesce((SELECT max(blockid) FROM %Q.'%q_segments') + 1, 1)", +/* 11 */ "REPLACE INTO %Q.'%q_segdir' VALUES(?,?,?,?,?,?)", + + /* Return segments in order from oldest to newest.*/ +/* 12 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level = ? ORDER BY idx ASC", +/* 13 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?" + "ORDER BY level DESC, idx ASC", + +/* 14 */ "SELECT count(*) FROM %Q.'%q_segdir' WHERE level = ?", +/* 15 */ "SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?", + +/* 16 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ?", +/* 17 */ "DELETE FROM %Q.'%q_segments' WHERE blockid BETWEEN ? AND ?", +/* 18 */ "INSERT INTO %Q.'%q_content' VALUES(%s)", +/* 19 */ "DELETE FROM %Q.'%q_docsize' WHERE docid = ?", +/* 20 */ "REPLACE INTO %Q.'%q_docsize' VALUES(?,?)", +/* 21 */ "SELECT size FROM %Q.'%q_docsize' WHERE docid=?", +/* 22 */ "SELECT value FROM %Q.'%q_stat' WHERE id=?", +/* 23 */ "REPLACE INTO %Q.'%q_stat' VALUES(?,?)", +/* 24 */ "", +/* 25 */ "", + +/* 26 */ "DELETE FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?", +/* 27 */ "SELECT ? UNION SELECT level / (1024 * ?) FROM %Q.'%q_segdir'", + +/* This statement is used to determine which level to read the input from +** when performing an incremental merge. It returns the absolute level number +** of the oldest level in the db that contains at least ? segments. Or, +** if no level in the FTS index contains more than ? segments, the statement +** returns zero rows. */ +/* 28 */ "SELECT level, count(*) AS cnt FROM %Q.'%q_segdir' " + " GROUP BY level HAVING cnt>=?" + " ORDER BY (level %% 1024) ASC, 2 DESC LIMIT 1", + +/* Estimate the upper limit on the number of leaf nodes in a new segment +** created by merging the oldest :2 segments from absolute level :1. See +** function sqlite3Fts3Incrmerge() for details. */ +/* 29 */ "SELECT 2 * total(1 + leaves_end_block - start_block) " + " FROM %Q.'%q_segdir' WHERE level = ? AND idx < ?", + +/* SQL_DELETE_SEGDIR_ENTRY +** Delete the %_segdir entry on absolute level :1 with index :2. */ +/* 30 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?", + +/* SQL_SHIFT_SEGDIR_ENTRY +** Modify the idx value for the segment with idx=:3 on absolute level :2 +** to :1. */ +/* 31 */ "UPDATE %Q.'%q_segdir' SET idx = ? WHERE level=? AND idx=?", + +/* SQL_SELECT_SEGDIR +** Read a single entry from the %_segdir table. The entry from absolute +** level :1 with index value :2. */ +/* 32 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?", + +/* SQL_CHOMP_SEGDIR +** Update the start_block (:1) and root (:2) fields of the %_segdir +** entry located on absolute level :3 with index :4. */ +/* 33 */ "UPDATE %Q.'%q_segdir' SET start_block = ?, root = ?" + "WHERE level = ? AND idx = ?", + +/* SQL_SEGMENT_IS_APPENDABLE +** Return a single row if the segment with end_block=? is appendable. Or +** no rows otherwise. */ +/* 34 */ "SELECT 1 FROM %Q.'%q_segments' WHERE blockid=? AND block IS NULL", + +/* SQL_SELECT_INDEXES +** Return the list of valid segment indexes for absolute level ? */ +/* 35 */ "SELECT idx FROM %Q.'%q_segdir' WHERE level=? ORDER BY 1 ASC", + +/* SQL_SELECT_MXLEVEL +** Return the largest relative level in the FTS index or indexes. */ +/* 36 */ "SELECT max( level %% 1024 ) FROM %Q.'%q_segdir'", + + /* Return segments in order from oldest to newest.*/ +/* 37 */ "SELECT level, idx, end_block " + "FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? " + "ORDER BY level DESC, idx ASC", + + /* Update statements used while promoting segments */ +/* 38 */ "UPDATE OR FAIL %Q.'%q_segdir' SET level=-1,idx=? " + "WHERE level=? AND idx=?", +/* 39 */ "UPDATE OR FAIL %Q.'%q_segdir' SET level=? WHERE level=-1" + + }; + int rc = SQLITE_OK; + sqlite3_stmt *pStmt; + + assert( SizeofArray(azSql)==SizeofArray(p->aStmt) ); + assert( eStmt=0 ); + + pStmt = p->aStmt[eStmt]; + if( !pStmt ){ + int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; + char *zSql; + if( eStmt==SQL_CONTENT_INSERT ){ + zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName, p->zWriteExprlist); + }else if( eStmt==SQL_SELECT_CONTENT_BY_ROWID ){ + f &= ~SQLITE_PREPARE_NO_VTAB; + zSql = sqlite3_mprintf(azSql[eStmt], p->zReadExprlist); + }else{ + zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName); + } + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v3(p->db, zSql, -1, f, &pStmt, NULL); + sqlite3_free(zSql); + assert( rc==SQLITE_OK || pStmt==0 ); + p->aStmt[eStmt] = pStmt; + } + } + if( apVal ){ + int i; + int nParam = sqlite3_bind_parameter_count(pStmt); + for(i=0; rc==SQLITE_OK && inPendingData==0 ){ + sqlite3_stmt *pStmt; + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_LEVEL, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_null(pStmt, 1); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + } + } + + return rc; +} + +/* +** FTS maintains a separate indexes for each language-id (a 32-bit integer). +** Within each language id, a separate index is maintained to store the +** document terms, and each configured prefix size (configured the FTS +** "prefix=" option). And each index consists of multiple levels ("relative +** levels"). +** +** All three of these values (the language id, the specific index and the +** level within the index) are encoded in 64-bit integer values stored +** in the %_segdir table on disk. This function is used to convert three +** separate component values into the single 64-bit integer value that +** can be used to query the %_segdir table. +** +** Specifically, each language-id/index combination is allocated 1024 +** 64-bit integer level values ("absolute levels"). The main terms index +** for language-id 0 is allocate values 0-1023. The first prefix index +** (if any) for language-id 0 is allocated values 1024-2047. And so on. +** Language 1 indexes are allocated immediately following language 0. +** +** So, for a system with nPrefix prefix indexes configured, the block of +** absolute levels that corresponds to language-id iLangid and index +** iIndex starts at absolute level ((iLangid * (nPrefix+1) + iIndex) * 1024). +*/ +static sqlite3_int64 getAbsoluteLevel( + Fts3Table *p, /* FTS3 table handle */ + int iLangid, /* Language id */ + int iIndex, /* Index in p->aIndex[] */ + int iLevel /* Level of segments */ +){ + sqlite3_int64 iBase; /* First absolute level for iLangid/iIndex */ + assert_fts3_nc( iLangid>=0 ); + assert( p->nIndex>0 ); + assert( iIndex>=0 && iIndexnIndex ); + + iBase = ((sqlite3_int64)iLangid * p->nIndex + iIndex) * FTS3_SEGDIR_MAXLEVEL; + return iBase + iLevel; +} + +/* +** Set *ppStmt to a statement handle that may be used to iterate through +** all rows in the %_segdir table, from oldest to newest. If successful, +** return SQLITE_OK. If an error occurs while preparing the statement, +** return an SQLite error code. +** +** There is only ever one instance of this SQL statement compiled for +** each FTS3 table. +** +** The statement returns the following columns from the %_segdir table: +** +** 0: idx +** 1: start_block +** 2: leaves_end_block +** 3: end_block +** 4: root +*/ +SQLITE_PRIVATE int sqlite3Fts3AllSegdirs( + Fts3Table *p, /* FTS3 table */ + int iLangid, /* Language being queried */ + int iIndex, /* Index for p->aIndex[] */ + int iLevel, /* Level to select (relative level) */ + sqlite3_stmt **ppStmt /* OUT: Compiled statement */ +){ + int rc; + sqlite3_stmt *pStmt = 0; + + assert( iLevel==FTS3_SEGCURSOR_ALL || iLevel>=0 ); + assert( iLevel=0 && iIndexnIndex ); + + if( iLevel<0 ){ + /* "SELECT * FROM %_segdir WHERE level BETWEEN ? AND ? ORDER BY ..." */ + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_RANGE, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); + sqlite3_bind_int64(pStmt, 2, + getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) + ); + } + }else{ + /* "SELECT * FROM %_segdir WHERE level = ? ORDER BY ..." */ + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex,iLevel)); + } + } + *ppStmt = pStmt; + return rc; +} + + +/* +** Append a single varint to a PendingList buffer. SQLITE_OK is returned +** if successful, or an SQLite error code otherwise. +** +** This function also serves to allocate the PendingList structure itself. +** For example, to create a new PendingList structure containing two +** varints: +** +** PendingList *p = 0; +** fts3PendingListAppendVarint(&p, 1); +** fts3PendingListAppendVarint(&p, 2); +*/ +static int fts3PendingListAppendVarint( + PendingList **pp, /* IN/OUT: Pointer to PendingList struct */ + sqlite3_int64 i /* Value to append to data */ +){ + PendingList *p = *pp; + + /* Allocate or grow the PendingList as required. */ + if( !p ){ + p = sqlite3_malloc(sizeof(*p) + 100); + if( !p ){ + return SQLITE_NOMEM; + } + p->nSpace = 100; + p->aData = (char *)&p[1]; + p->nData = 0; + } + else if( p->nData+FTS3_VARINT_MAX+1>p->nSpace ){ + int nNew = p->nSpace * 2; + p = sqlite3_realloc(p, sizeof(*p) + nNew); + if( !p ){ + sqlite3_free(*pp); + *pp = 0; + return SQLITE_NOMEM; + } + p->nSpace = nNew; + p->aData = (char *)&p[1]; + } + + /* Append the new serialized varint to the end of the list. */ + p->nData += sqlite3Fts3PutVarint(&p->aData[p->nData], i); + p->aData[p->nData] = '\0'; + *pp = p; + return SQLITE_OK; +} + +/* +** Add a docid/column/position entry to a PendingList structure. Non-zero +** is returned if the structure is sqlite3_realloced as part of adding +** the entry. Otherwise, zero. +** +** If an OOM error occurs, *pRc is set to SQLITE_NOMEM before returning. +** Zero is always returned in this case. Otherwise, if no OOM error occurs, +** it is set to SQLITE_OK. +*/ +static int fts3PendingListAppend( + PendingList **pp, /* IN/OUT: PendingList structure */ + sqlite3_int64 iDocid, /* Docid for entry to add */ + sqlite3_int64 iCol, /* Column for entry to add */ + sqlite3_int64 iPos, /* Position of term for entry to add */ + int *pRc /* OUT: Return code */ +){ + PendingList *p = *pp; + int rc = SQLITE_OK; + + assert( !p || p->iLastDocid<=iDocid ); + + if( !p || p->iLastDocid!=iDocid ){ + u64 iDelta = (u64)iDocid - (u64)(p ? p->iLastDocid : 0); + if( p ){ + assert( p->nDatanSpace ); + assert( p->aData[p->nData]==0 ); + p->nData++; + } + if( SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, iDelta)) ){ + goto pendinglistappend_out; + } + p->iLastCol = -1; + p->iLastPos = 0; + p->iLastDocid = iDocid; + } + if( iCol>0 && p->iLastCol!=iCol ){ + if( SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, 1)) + || SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, iCol)) + ){ + goto pendinglistappend_out; + } + p->iLastCol = iCol; + p->iLastPos = 0; + } + if( iCol>=0 ){ + assert( iPos>p->iLastPos || (iPos==0 && p->iLastPos==0) ); + rc = fts3PendingListAppendVarint(&p, 2+iPos-p->iLastPos); + if( rc==SQLITE_OK ){ + p->iLastPos = iPos; + } + } + + pendinglistappend_out: + *pRc = rc; + if( p!=*pp ){ + *pp = p; + return 1; + } + return 0; +} + +/* +** Free a PendingList object allocated by fts3PendingListAppend(). +*/ +static void fts3PendingListDelete(PendingList *pList){ + sqlite3_free(pList); +} + +/* +** Add an entry to one of the pending-terms hash tables. +*/ +static int fts3PendingTermsAddOne( + Fts3Table *p, + int iCol, + int iPos, + Fts3Hash *pHash, /* Pending terms hash table to add entry to */ + const char *zToken, + int nToken +){ + PendingList *pList; + int rc = SQLITE_OK; + + pList = (PendingList *)fts3HashFind(pHash, zToken, nToken); + if( pList ){ + p->nPendingData -= (pList->nData + nToken + sizeof(Fts3HashElem)); + } + if( fts3PendingListAppend(&pList, p->iPrevDocid, iCol, iPos, &rc) ){ + if( pList==fts3HashInsert(pHash, zToken, nToken, pList) ){ + /* Malloc failed while inserting the new entry. This can only + ** happen if there was no previous entry for this token. + */ + assert( 0==fts3HashFind(pHash, zToken, nToken) ); + sqlite3_free(pList); + rc = SQLITE_NOMEM; + } + } + if( rc==SQLITE_OK ){ + p->nPendingData += (pList->nData + nToken + sizeof(Fts3HashElem)); + } + return rc; +} + +/* +** Tokenize the nul-terminated string zText and add all tokens to the +** pending-terms hash-table. The docid used is that currently stored in +** p->iPrevDocid, and the column is specified by argument iCol. +** +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. +*/ +static int fts3PendingTermsAdd( + Fts3Table *p, /* Table into which text will be inserted */ + int iLangid, /* Language id to use */ + const char *zText, /* Text of document to be inserted */ + int iCol, /* Column into which text is being inserted */ + u32 *pnWord /* IN/OUT: Incr. by number tokens inserted */ +){ + int rc; + int iStart = 0; + int iEnd = 0; + int iPos = 0; + int nWord = 0; + + char const *zToken; + int nToken = 0; + + sqlite3_tokenizer *pTokenizer = p->pTokenizer; + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + sqlite3_tokenizer_cursor *pCsr; + int (*xNext)(sqlite3_tokenizer_cursor *pCursor, + const char**,int*,int*,int*,int*); + + assert( pTokenizer && pModule ); + + /* If the user has inserted a NULL value, this function may be called with + ** zText==0. In this case, add zero token entries to the hash table and + ** return early. */ + if( zText==0 ){ + *pnWord = 0; + return SQLITE_OK; + } + + rc = sqlite3Fts3OpenTokenizer(pTokenizer, iLangid, zText, -1, &pCsr); + if( rc!=SQLITE_OK ){ + return rc; + } + + xNext = pModule->xNext; + while( SQLITE_OK==rc + && SQLITE_OK==(rc = xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos)) + ){ + int i; + if( iPos>=nWord ) nWord = iPos+1; + + /* Positions cannot be negative; we use -1 as a terminator internally. + ** Tokens must have a non-zero length. + */ + if( iPos<0 || !zToken || nToken<=0 ){ + rc = SQLITE_ERROR; + break; + } + + /* Add the term to the terms index */ + rc = fts3PendingTermsAddOne( + p, iCol, iPos, &p->aIndex[0].hPending, zToken, nToken + ); + + /* Add the term to each of the prefix indexes that it is not too + ** short for. */ + for(i=1; rc==SQLITE_OK && inIndex; i++){ + struct Fts3Index *pIndex = &p->aIndex[i]; + if( nTokennPrefix ) continue; + rc = fts3PendingTermsAddOne( + p, iCol, iPos, &pIndex->hPending, zToken, pIndex->nPrefix + ); + } + } + + pModule->xClose(pCsr); + *pnWord += nWord; + return (rc==SQLITE_DONE ? SQLITE_OK : rc); +} + +/* +** Calling this function indicates that subsequent calls to +** fts3PendingTermsAdd() are to add term/position-list pairs for the +** contents of the document with docid iDocid. +*/ +static int fts3PendingTermsDocid( + Fts3Table *p, /* Full-text table handle */ + int bDelete, /* True if this op is a delete */ + int iLangid, /* Language id of row being written */ + sqlite_int64 iDocid /* Docid of row being written */ +){ + assert( iLangid>=0 ); + assert( bDelete==1 || bDelete==0 ); + + /* TODO(shess) Explore whether partially flushing the buffer on + ** forced-flush would provide better performance. I suspect that if + ** we ordered the doclists by size and flushed the largest until the + ** buffer was half empty, that would let the less frequent terms + ** generate longer doclists. + */ + if( iDocidiPrevDocid + || (iDocid==p->iPrevDocid && p->bPrevDelete==0) + || p->iPrevLangid!=iLangid + || p->nPendingData>p->nMaxPendingData + ){ + int rc = sqlite3Fts3PendingTermsFlush(p); + if( rc!=SQLITE_OK ) return rc; + } + p->iPrevDocid = iDocid; + p->iPrevLangid = iLangid; + p->bPrevDelete = bDelete; + return SQLITE_OK; +} + +/* +** Discard the contents of the pending-terms hash tables. +*/ +SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *p){ + int i; + for(i=0; inIndex; i++){ + Fts3HashElem *pElem; + Fts3Hash *pHash = &p->aIndex[i].hPending; + for(pElem=fts3HashFirst(pHash); pElem; pElem=fts3HashNext(pElem)){ + PendingList *pList = (PendingList *)fts3HashData(pElem); + fts3PendingListDelete(pList); + } + fts3HashClear(pHash); + } + p->nPendingData = 0; +} + +/* +** This function is called by the xUpdate() method as part of an INSERT +** operation. It adds entries for each term in the new record to the +** pendingTerms hash table. +** +** Argument apVal is the same as the similarly named argument passed to +** fts3InsertData(). Parameter iDocid is the docid of the new row. +*/ +static int fts3InsertTerms( + Fts3Table *p, + int iLangid, + sqlite3_value **apVal, + u32 *aSz +){ + int i; /* Iterator variable */ + for(i=2; inColumn+2; i++){ + int iCol = i-2; + if( p->abNotindexed[iCol]==0 ){ + const char *zText = (const char *)sqlite3_value_text(apVal[i]); + int rc = fts3PendingTermsAdd(p, iLangid, zText, iCol, &aSz[iCol]); + if( rc!=SQLITE_OK ){ + return rc; + } + aSz[p->nColumn] += sqlite3_value_bytes(apVal[i]); + } + } + return SQLITE_OK; +} + +/* +** This function is called by the xUpdate() method for an INSERT operation. +** The apVal parameter is passed a copy of the apVal argument passed by +** SQLite to the xUpdate() method. i.e: +** +** apVal[0] Not used for INSERT. +** apVal[1] rowid +** apVal[2] Left-most user-defined column +** ... +** apVal[p->nColumn+1] Right-most user-defined column +** apVal[p->nColumn+2] Hidden column with same name as table +** apVal[p->nColumn+3] Hidden "docid" column (alias for rowid) +** apVal[p->nColumn+4] Hidden languageid column +*/ +static int fts3InsertData( + Fts3Table *p, /* Full-text table */ + sqlite3_value **apVal, /* Array of values to insert */ + sqlite3_int64 *piDocid /* OUT: Docid for row just inserted */ +){ + int rc; /* Return code */ + sqlite3_stmt *pContentInsert; /* INSERT INTO %_content VALUES(...) */ + + if( p->zContentTbl ){ + sqlite3_value *pRowid = apVal[p->nColumn+3]; + if( sqlite3_value_type(pRowid)==SQLITE_NULL ){ + pRowid = apVal[1]; + } + if( sqlite3_value_type(pRowid)!=SQLITE_INTEGER ){ + return SQLITE_CONSTRAINT; + } + *piDocid = sqlite3_value_int64(pRowid); + return SQLITE_OK; + } + + /* Locate the statement handle used to insert data into the %_content + ** table. The SQL for this statement is: + ** + ** INSERT INTO %_content VALUES(?, ?, ?, ...) + ** + ** The statement features N '?' variables, where N is the number of user + ** defined columns in the FTS3 table, plus one for the docid field. + */ + rc = fts3SqlStmt(p, SQL_CONTENT_INSERT, &pContentInsert, &apVal[1]); + if( rc==SQLITE_OK && p->zLanguageid ){ + rc = sqlite3_bind_int( + pContentInsert, p->nColumn+2, + sqlite3_value_int(apVal[p->nColumn+4]) + ); + } + if( rc!=SQLITE_OK ) return rc; + + /* There is a quirk here. The users INSERT statement may have specified + ** a value for the "rowid" field, for the "docid" field, or for both. + ** Which is a problem, since "rowid" and "docid" are aliases for the + ** same value. For example: + ** + ** INSERT INTO fts3tbl(rowid, docid) VALUES(1, 2); + ** + ** In FTS3, this is an error. It is an error to specify non-NULL values + ** for both docid and some other rowid alias. + */ + if( SQLITE_NULL!=sqlite3_value_type(apVal[3+p->nColumn]) ){ + if( SQLITE_NULL==sqlite3_value_type(apVal[0]) + && SQLITE_NULL!=sqlite3_value_type(apVal[1]) + ){ + /* A rowid/docid conflict. */ + return SQLITE_ERROR; + } + rc = sqlite3_bind_value(pContentInsert, 1, apVal[3+p->nColumn]); + if( rc!=SQLITE_OK ) return rc; + } + + /* Execute the statement to insert the record. Set *piDocid to the + ** new docid value. + */ + sqlite3_step(pContentInsert); + rc = sqlite3_reset(pContentInsert); + + *piDocid = sqlite3_last_insert_rowid(p->db); + return rc; +} + + + +/* +** Remove all data from the FTS3 table. Clear the hash table containing +** pending terms. +*/ +static int fts3DeleteAll(Fts3Table *p, int bContent){ + int rc = SQLITE_OK; /* Return code */ + + /* Discard the contents of the pending-terms hash table. */ + sqlite3Fts3PendingTermsClear(p); + + /* Delete everything from the shadow tables. Except, leave %_content as + ** is if bContent is false. */ + assert( p->zContentTbl==0 || bContent==0 ); + if( bContent ) fts3SqlExec(&rc, p, SQL_DELETE_ALL_CONTENT, 0); + fts3SqlExec(&rc, p, SQL_DELETE_ALL_SEGMENTS, 0); + fts3SqlExec(&rc, p, SQL_DELETE_ALL_SEGDIR, 0); + if( p->bHasDocsize ){ + fts3SqlExec(&rc, p, SQL_DELETE_ALL_DOCSIZE, 0); + } + if( p->bHasStat ){ + fts3SqlExec(&rc, p, SQL_DELETE_ALL_STAT, 0); + } + return rc; +} + +/* +** +*/ +static int langidFromSelect(Fts3Table *p, sqlite3_stmt *pSelect){ + int iLangid = 0; + if( p->zLanguageid ) iLangid = sqlite3_column_int(pSelect, p->nColumn+1); + return iLangid; +} + +/* +** The first element in the apVal[] array is assumed to contain the docid +** (an integer) of a row about to be deleted. Remove all terms from the +** full-text index. +*/ +static void fts3DeleteTerms( + int *pRC, /* Result code */ + Fts3Table *p, /* The FTS table to delete from */ + sqlite3_value *pRowid, /* The docid to be deleted */ + u32 *aSz, /* Sizes of deleted document written here */ + int *pbFound /* OUT: Set to true if row really does exist */ +){ + int rc; + sqlite3_stmt *pSelect; + + assert( *pbFound==0 ); + if( *pRC ) return; + rc = fts3SqlStmt(p, SQL_SELECT_CONTENT_BY_ROWID, &pSelect, &pRowid); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pSelect) ){ + int i; + int iLangid = langidFromSelect(p, pSelect); + i64 iDocid = sqlite3_column_int64(pSelect, 0); + rc = fts3PendingTermsDocid(p, 1, iLangid, iDocid); + for(i=1; rc==SQLITE_OK && i<=p->nColumn; i++){ + int iCol = i-1; + if( p->abNotindexed[iCol]==0 ){ + const char *zText = (const char *)sqlite3_column_text(pSelect, i); + rc = fts3PendingTermsAdd(p, iLangid, zText, -1, &aSz[iCol]); + aSz[p->nColumn] += sqlite3_column_bytes(pSelect, i); + } + } + if( rc!=SQLITE_OK ){ + sqlite3_reset(pSelect); + *pRC = rc; + return; + } + *pbFound = 1; + } + rc = sqlite3_reset(pSelect); + }else{ + sqlite3_reset(pSelect); + } + *pRC = rc; +} + +/* +** Forward declaration to account for the circular dependency between +** functions fts3SegmentMerge() and fts3AllocateSegdirIdx(). +*/ +static int fts3SegmentMerge(Fts3Table *, int, int, int); + +/* +** This function allocates a new level iLevel index in the segdir table. +** Usually, indexes are allocated within a level sequentially starting +** with 0, so the allocated index is one greater than the value returned +** by: +** +** SELECT max(idx) FROM %_segdir WHERE level = :iLevel +** +** However, if there are already FTS3_MERGE_COUNT indexes at the requested +** level, they are merged into a single level (iLevel+1) segment and the +** allocated index is 0. +** +** If successful, *piIdx is set to the allocated index slot and SQLITE_OK +** returned. Otherwise, an SQLite error code is returned. +*/ +static int fts3AllocateSegdirIdx( + Fts3Table *p, + int iLangid, /* Language id */ + int iIndex, /* Index for p->aIndex */ + int iLevel, + int *piIdx +){ + int rc; /* Return Code */ + sqlite3_stmt *pNextIdx; /* Query for next idx at level iLevel */ + int iNext = 0; /* Result of query pNextIdx */ + + assert( iLangid>=0 ); + assert( p->nIndex>=1 ); + + /* Set variable iNext to the next available segdir index at level iLevel. */ + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENT_INDEX, &pNextIdx, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64( + pNextIdx, 1, getAbsoluteLevel(p, iLangid, iIndex, iLevel) + ); + if( SQLITE_ROW==sqlite3_step(pNextIdx) ){ + iNext = sqlite3_column_int(pNextIdx, 0); + } + rc = sqlite3_reset(pNextIdx); + } + + if( rc==SQLITE_OK ){ + /* If iNext is FTS3_MERGE_COUNT, indicating that level iLevel is already + ** full, merge all segments in level iLevel into a single iLevel+1 + ** segment and allocate (newly freed) index 0 at level iLevel. Otherwise, + ** if iNext is less than FTS3_MERGE_COUNT, allocate index iNext. + */ + if( iNext>=MergeCount(p) ){ + fts3LogMerge(16, getAbsoluteLevel(p, iLangid, iIndex, iLevel)); + rc = fts3SegmentMerge(p, iLangid, iIndex, iLevel); + *piIdx = 0; + }else{ + *piIdx = iNext; + } + } + + return rc; +} + +/* +** The %_segments table is declared as follows: +** +** CREATE TABLE %_segments(blockid INTEGER PRIMARY KEY, block BLOB) +** +** This function reads data from a single row of the %_segments table. The +** specific row is identified by the iBlockid parameter. If paBlob is not +** NULL, then a buffer is allocated using sqlite3_malloc() and populated +** with the contents of the blob stored in the "block" column of the +** identified table row is. Whether or not paBlob is NULL, *pnBlob is set +** to the size of the blob in bytes before returning. +** +** If an error occurs, or the table does not contain the specified row, +** an SQLite error code is returned. Otherwise, SQLITE_OK is returned. If +** paBlob is non-NULL, then it is the responsibility of the caller to +** eventually free the returned buffer. +** +** This function may leave an open sqlite3_blob* handle in the +** Fts3Table.pSegments variable. This handle is reused by subsequent calls +** to this function. The handle may be closed by calling the +** sqlite3Fts3SegmentsClose() function. Reusing a blob handle is a handy +** performance improvement, but the blob handle should always be closed +** before control is returned to the user (to prevent a lock being held +** on the database file for longer than necessary). Thus, any virtual table +** method (xFilter etc.) that may directly or indirectly call this function +** must call sqlite3Fts3SegmentsClose() before returning. +*/ +SQLITE_PRIVATE int sqlite3Fts3ReadBlock( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iBlockid, /* Access the row with blockid=$iBlockid */ + char **paBlob, /* OUT: Blob data in malloc'd buffer */ + int *pnBlob, /* OUT: Size of blob data */ + int *pnLoad /* OUT: Bytes actually loaded */ +){ + int rc; /* Return code */ + + /* pnBlob must be non-NULL. paBlob may be NULL or non-NULL. */ + assert( pnBlob ); + + if( p->pSegments ){ + rc = sqlite3_blob_reopen(p->pSegments, iBlockid); + }else{ + if( 0==p->zSegmentsTbl ){ + p->zSegmentsTbl = sqlite3_mprintf("%s_segments", p->zName); + if( 0==p->zSegmentsTbl ) return SQLITE_NOMEM; + } + rc = sqlite3_blob_open( + p->db, p->zDb, p->zSegmentsTbl, "block", iBlockid, 0, &p->pSegments + ); + } + + if( rc==SQLITE_OK ){ + int nByte = sqlite3_blob_bytes(p->pSegments); + *pnBlob = nByte; + if( paBlob ){ + char *aByte = sqlite3_malloc(nByte + FTS3_NODE_PADDING); + if( !aByte ){ + rc = SQLITE_NOMEM; + }else{ + if( pnLoad && nByte>(FTS3_NODE_CHUNK_THRESHOLD) ){ + nByte = FTS3_NODE_CHUNKSIZE; + *pnLoad = nByte; + } + rc = sqlite3_blob_read(p->pSegments, aByte, nByte, 0); + memset(&aByte[nByte], 0, FTS3_NODE_PADDING); + if( rc!=SQLITE_OK ){ + sqlite3_free(aByte); + aByte = 0; + } + } + *paBlob = aByte; + } + }else if( rc==SQLITE_ERROR ){ + rc = FTS_CORRUPT_VTAB; + } + + return rc; +} + +/* +** Close the blob handle at p->pSegments, if it is open. See comments above +** the sqlite3Fts3ReadBlock() function for details. +*/ +SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *p){ + sqlite3_blob_close(p->pSegments); + p->pSegments = 0; +} + +static int fts3SegReaderIncrRead(Fts3SegReader *pReader){ + int nRead; /* Number of bytes to read */ + int rc; /* Return code */ + + nRead = MIN(pReader->nNode - pReader->nPopulate, FTS3_NODE_CHUNKSIZE); + rc = sqlite3_blob_read( + pReader->pBlob, + &pReader->aNode[pReader->nPopulate], + nRead, + pReader->nPopulate + ); + + if( rc==SQLITE_OK ){ + pReader->nPopulate += nRead; + memset(&pReader->aNode[pReader->nPopulate], 0, FTS3_NODE_PADDING); + if( pReader->nPopulate==pReader->nNode ){ + sqlite3_blob_close(pReader->pBlob); + pReader->pBlob = 0; + pReader->nPopulate = 0; + } + } + return rc; +} + +static int fts3SegReaderRequire(Fts3SegReader *pReader, char *pFrom, int nByte){ + int rc = SQLITE_OK; + assert( !pReader->pBlob + || (pFrom>=pReader->aNode && pFrom<&pReader->aNode[pReader->nNode]) + ); + while( pReader->pBlob && rc==SQLITE_OK + && (pFrom - pReader->aNode + nByte)>pReader->nPopulate + ){ + rc = fts3SegReaderIncrRead(pReader); + } + return rc; +} + +/* +** Set an Fts3SegReader cursor to point at EOF. +*/ +static void fts3SegReaderSetEof(Fts3SegReader *pSeg){ + if( !fts3SegReaderIsRootOnly(pSeg) ){ + sqlite3_free(pSeg->aNode); + sqlite3_blob_close(pSeg->pBlob); + pSeg->pBlob = 0; + } + pSeg->aNode = 0; +} + +/* +** Move the iterator passed as the first argument to the next term in the +** segment. If successful, SQLITE_OK is returned. If there is no next term, +** SQLITE_DONE. Otherwise, an SQLite error code. +*/ +static int fts3SegReaderNext( + Fts3Table *p, + Fts3SegReader *pReader, + int bIncr +){ + int rc; /* Return code of various sub-routines */ + char *pNext; /* Cursor variable */ + int nPrefix; /* Number of bytes in term prefix */ + int nSuffix; /* Number of bytes in term suffix */ + + if( !pReader->aDoclist ){ + pNext = pReader->aNode; + }else{ + pNext = &pReader->aDoclist[pReader->nDoclist]; + } + + if( !pNext || pNext>=&pReader->aNode[pReader->nNode] ){ + + if( fts3SegReaderIsPending(pReader) ){ + Fts3HashElem *pElem = *(pReader->ppNextElem); + sqlite3_free(pReader->aNode); + pReader->aNode = 0; + if( pElem ){ + char *aCopy; + PendingList *pList = (PendingList *)fts3HashData(pElem); + int nCopy = pList->nData+1; + pReader->zTerm = (char *)fts3HashKey(pElem); + pReader->nTerm = fts3HashKeysize(pElem); + aCopy = (char*)sqlite3_malloc(nCopy); + if( !aCopy ) return SQLITE_NOMEM; + memcpy(aCopy, pList->aData, nCopy); + pReader->nNode = pReader->nDoclist = nCopy; + pReader->aNode = pReader->aDoclist = aCopy; + pReader->ppNextElem++; + assert( pReader->aNode ); + } + return SQLITE_OK; + } + + fts3SegReaderSetEof(pReader); + + /* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf + ** blocks have already been traversed. */ +#ifdef CORRUPT_DB + assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock || CORRUPT_DB ); +#endif + if( pReader->iCurrentBlock>=pReader->iLeafEndBlock ){ + return SQLITE_OK; + } + + rc = sqlite3Fts3ReadBlock( + p, ++pReader->iCurrentBlock, &pReader->aNode, &pReader->nNode, + (bIncr ? &pReader->nPopulate : 0) + ); + if( rc!=SQLITE_OK ) return rc; + assert( pReader->pBlob==0 ); + if( bIncr && pReader->nPopulatenNode ){ + pReader->pBlob = p->pSegments; + p->pSegments = 0; + } + pNext = pReader->aNode; + } + + assert( !fts3SegReaderIsPending(pReader) ); + + rc = fts3SegReaderRequire(pReader, pNext, FTS3_VARINT_MAX*2); + if( rc!=SQLITE_OK ) return rc; + + /* Because of the FTS3_NODE_PADDING bytes of padding, the following is + ** safe (no risk of overread) even if the node data is corrupted. */ + pNext += fts3GetVarint32(pNext, &nPrefix); + pNext += fts3GetVarint32(pNext, &nSuffix); + if( nSuffix<=0 + || (&pReader->aNode[pReader->nNode] - pNext)pReader->nTerm + ){ + return FTS_CORRUPT_VTAB; + } + + /* Both nPrefix and nSuffix were read by fts3GetVarint32() and so are + ** between 0 and 0x7FFFFFFF. But the sum of the two may cause integer + ** overflow - hence the (i64) casts. */ + if( (i64)nPrefix+nSuffix>(i64)pReader->nTermAlloc ){ + i64 nNew = ((i64)nPrefix+nSuffix)*2; + char *zNew = sqlite3_realloc64(pReader->zTerm, nNew); + if( !zNew ){ + return SQLITE_NOMEM; + } + pReader->zTerm = zNew; + pReader->nTermAlloc = nNew; + } + + rc = fts3SegReaderRequire(pReader, pNext, nSuffix+FTS3_VARINT_MAX); + if( rc!=SQLITE_OK ) return rc; + + memcpy(&pReader->zTerm[nPrefix], pNext, nSuffix); + pReader->nTerm = nPrefix+nSuffix; + pNext += nSuffix; + pNext += fts3GetVarint32(pNext, &pReader->nDoclist); + pReader->aDoclist = pNext; + pReader->pOffsetList = 0; + + /* Check that the doclist does not appear to extend past the end of the + ** b-tree node. And that the final byte of the doclist is 0x00. If either + ** of these statements is untrue, then the data structure is corrupt. + */ + if( pReader->nDoclist > pReader->nNode-(pReader->aDoclist-pReader->aNode) + || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) + || pReader->nDoclist==0 + ){ + return FTS_CORRUPT_VTAB; + } + return SQLITE_OK; +} + +/* +** Set the SegReader to point to the first docid in the doclist associated +** with the current term. +*/ +static int fts3SegReaderFirstDocid(Fts3Table *pTab, Fts3SegReader *pReader){ + int rc = SQLITE_OK; + assert( pReader->aDoclist ); + assert( !pReader->pOffsetList ); + if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){ + u8 bEof = 0; + pReader->iDocid = 0; + pReader->nOffsetList = 0; + sqlite3Fts3DoclistPrev(0, + pReader->aDoclist, pReader->nDoclist, &pReader->pOffsetList, + &pReader->iDocid, &pReader->nOffsetList, &bEof + ); + }else{ + rc = fts3SegReaderRequire(pReader, pReader->aDoclist, FTS3_VARINT_MAX); + if( rc==SQLITE_OK ){ + int n = sqlite3Fts3GetVarint(pReader->aDoclist, &pReader->iDocid); + pReader->pOffsetList = &pReader->aDoclist[n]; + } + } + return rc; +} + +/* +** Advance the SegReader to point to the next docid in the doclist +** associated with the current term. +** +** If arguments ppOffsetList and pnOffsetList are not NULL, then +** *ppOffsetList is set to point to the first column-offset list +** in the doclist entry (i.e. immediately past the docid varint). +** *pnOffsetList is set to the length of the set of column-offset +** lists, not including the nul-terminator byte. For example: +*/ +static int fts3SegReaderNextDocid( + Fts3Table *pTab, + Fts3SegReader *pReader, /* Reader to advance to next docid */ + char **ppOffsetList, /* OUT: Pointer to current position-list */ + int *pnOffsetList /* OUT: Length of *ppOffsetList in bytes */ +){ + int rc = SQLITE_OK; + char *p = pReader->pOffsetList; + char c = 0; + + assert( p ); + + if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){ + /* A pending-terms seg-reader for an FTS4 table that uses order=desc. + ** Pending-terms doclists are always built up in ascending order, so + ** we have to iterate through them backwards here. */ + u8 bEof = 0; + if( ppOffsetList ){ + *ppOffsetList = pReader->pOffsetList; + *pnOffsetList = pReader->nOffsetList - 1; + } + sqlite3Fts3DoclistPrev(0, + pReader->aDoclist, pReader->nDoclist, &p, &pReader->iDocid, + &pReader->nOffsetList, &bEof + ); + if( bEof ){ + pReader->pOffsetList = 0; + }else{ + pReader->pOffsetList = p; + } + }else{ + char *pEnd = &pReader->aDoclist[pReader->nDoclist]; + + /* Pointer p currently points at the first byte of an offset list. The + ** following block advances it to point one byte past the end of + ** the same offset list. */ + while( 1 ){ + + /* The following line of code (and the "p++" below the while() loop) is + ** normally all that is required to move pointer p to the desired + ** position. The exception is if this node is being loaded from disk + ** incrementally and pointer "p" now points to the first byte past + ** the populated part of pReader->aNode[]. + */ + while( *p | c ) c = *p++ & 0x80; + assert( *p==0 ); + + if( pReader->pBlob==0 || p<&pReader->aNode[pReader->nPopulate] ) break; + rc = fts3SegReaderIncrRead(pReader); + if( rc!=SQLITE_OK ) return rc; + } + p++; + + /* If required, populate the output variables with a pointer to and the + ** size of the previous offset-list. + */ + if( ppOffsetList ){ + *ppOffsetList = pReader->pOffsetList; + *pnOffsetList = (int)(p - pReader->pOffsetList - 1); + } + + /* List may have been edited in place by fts3EvalNearTrim() */ + while( p=pEnd ){ + pReader->pOffsetList = 0; + }else{ + rc = fts3SegReaderRequire(pReader, p, FTS3_VARINT_MAX); + if( rc==SQLITE_OK ){ + u64 iDelta; + pReader->pOffsetList = p + sqlite3Fts3GetVarintU(p, &iDelta); + if( pTab->bDescIdx ){ + pReader->iDocid = (i64)((u64)pReader->iDocid - iDelta); + }else{ + pReader->iDocid = (i64)((u64)pReader->iDocid + iDelta); + } + } + } + } + + return rc; +} + + +SQLITE_PRIVATE int sqlite3Fts3MsrOvfl( + Fts3Cursor *pCsr, + Fts3MultiSegReader *pMsr, + int *pnOvfl +){ + Fts3Table *p = (Fts3Table*)pCsr->base.pVtab; + int nOvfl = 0; + int ii; + int rc = SQLITE_OK; + int pgsz = p->nPgsz; + + assert( p->bFts4 ); + assert( pgsz>0 ); + + for(ii=0; rc==SQLITE_OK && iinSegment; ii++){ + Fts3SegReader *pReader = pMsr->apSegment[ii]; + if( !fts3SegReaderIsPending(pReader) + && !fts3SegReaderIsRootOnly(pReader) + ){ + sqlite3_int64 jj; + for(jj=pReader->iStartBlock; jj<=pReader->iLeafEndBlock; jj++){ + int nBlob; + rc = sqlite3Fts3ReadBlock(p, jj, 0, &nBlob, 0); + if( rc!=SQLITE_OK ) break; + if( (nBlob+35)>pgsz ){ + nOvfl += (nBlob + 34)/pgsz; + } + } + } + } + *pnOvfl = nOvfl; + return rc; +} + +/* +** Free all allocations associated with the iterator passed as the +** second argument. +*/ +SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){ + if( pReader ){ + if( !fts3SegReaderIsPending(pReader) ){ + sqlite3_free(pReader->zTerm); + } + if( !fts3SegReaderIsRootOnly(pReader) ){ + sqlite3_free(pReader->aNode); + } + sqlite3_blob_close(pReader->pBlob); + } + sqlite3_free(pReader); +} + +/* +** Allocate a new SegReader object. +*/ +SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( + int iAge, /* Segment "age". */ + int bLookup, /* True for a lookup only */ + sqlite3_int64 iStartLeaf, /* First leaf to traverse */ + sqlite3_int64 iEndLeaf, /* Final leaf to traverse */ + sqlite3_int64 iEndBlock, /* Final block of segment */ + const char *zRoot, /* Buffer containing root node */ + int nRoot, /* Size of buffer containing root node */ + Fts3SegReader **ppReader /* OUT: Allocated Fts3SegReader */ +){ + Fts3SegReader *pReader; /* Newly allocated SegReader object */ + int nExtra = 0; /* Bytes to allocate segment root node */ + + assert( zRoot!=0 || nRoot==0 ); +#ifdef CORRUPT_DB + assert( zRoot!=0 || CORRUPT_DB ); +#endif + + if( iStartLeaf==0 ){ + if( iEndLeaf!=0 ) return FTS_CORRUPT_VTAB; + nExtra = nRoot + FTS3_NODE_PADDING; + } + + pReader = (Fts3SegReader *)sqlite3_malloc(sizeof(Fts3SegReader) + nExtra); + if( !pReader ){ + return SQLITE_NOMEM; + } + memset(pReader, 0, sizeof(Fts3SegReader)); + pReader->iIdx = iAge; + pReader->bLookup = bLookup!=0; + pReader->iStartBlock = iStartLeaf; + pReader->iLeafEndBlock = iEndLeaf; + pReader->iEndBlock = iEndBlock; + + if( nExtra ){ + /* The entire segment is stored in the root node. */ + pReader->aNode = (char *)&pReader[1]; + pReader->rootOnly = 1; + pReader->nNode = nRoot; + if( nRoot ) memcpy(pReader->aNode, zRoot, nRoot); + memset(&pReader->aNode[nRoot], 0, FTS3_NODE_PADDING); + }else{ + pReader->iCurrentBlock = iStartLeaf-1; + } + *ppReader = pReader; + return SQLITE_OK; +} + +/* +** This is a comparison function used as a qsort() callback when sorting +** an array of pending terms by term. This occurs as part of flushing +** the contents of the pending-terms hash table to the database. +*/ +static int SQLITE_CDECL fts3CompareElemByTerm( + const void *lhs, + const void *rhs +){ + char *z1 = fts3HashKey(*(Fts3HashElem **)lhs); + char *z2 = fts3HashKey(*(Fts3HashElem **)rhs); + int n1 = fts3HashKeysize(*(Fts3HashElem **)lhs); + int n2 = fts3HashKeysize(*(Fts3HashElem **)rhs); + + int n = (n1aIndex */ + const char *zTerm, /* Term to search for */ + int nTerm, /* Size of buffer zTerm */ + int bPrefix, /* True for a prefix iterator */ + Fts3SegReader **ppReader /* OUT: SegReader for pending-terms */ +){ + Fts3SegReader *pReader = 0; /* Fts3SegReader object to return */ + Fts3HashElem *pE; /* Iterator variable */ + Fts3HashElem **aElem = 0; /* Array of term hash entries to scan */ + int nElem = 0; /* Size of array at aElem */ + int rc = SQLITE_OK; /* Return Code */ + Fts3Hash *pHash; + + pHash = &p->aIndex[iIndex].hPending; + if( bPrefix ){ + int nAlloc = 0; /* Size of allocated array at aElem */ + + for(pE=fts3HashFirst(pHash); pE; pE=fts3HashNext(pE)){ + char *zKey = (char *)fts3HashKey(pE); + int nKey = fts3HashKeysize(pE); + if( nTerm==0 || (nKey>=nTerm && 0==memcmp(zKey, zTerm, nTerm)) ){ + if( nElem==nAlloc ){ + Fts3HashElem **aElem2; + nAlloc += 16; + aElem2 = (Fts3HashElem **)sqlite3_realloc( + aElem, nAlloc*sizeof(Fts3HashElem *) + ); + if( !aElem2 ){ + rc = SQLITE_NOMEM; + nElem = 0; + break; + } + aElem = aElem2; + } + + aElem[nElem++] = pE; + } + } + + /* If more than one term matches the prefix, sort the Fts3HashElem + ** objects in term order using qsort(). This uses the same comparison + ** callback as is used when flushing terms to disk. + */ + if( nElem>1 ){ + qsort(aElem, nElem, sizeof(Fts3HashElem *), fts3CompareElemByTerm); + } + + }else{ + /* The query is a simple term lookup that matches at most one term in + ** the index. All that is required is a straight hash-lookup. + ** + ** Because the stack address of pE may be accessed via the aElem pointer + ** below, the "Fts3HashElem *pE" must be declared so that it is valid + ** within this entire function, not just this "else{...}" block. + */ + pE = fts3HashFindElem(pHash, zTerm, nTerm); + if( pE ){ + aElem = &pE; + nElem = 1; + } + } + + if( nElem>0 ){ + sqlite3_int64 nByte; + nByte = sizeof(Fts3SegReader) + (nElem+1)*sizeof(Fts3HashElem *); + pReader = (Fts3SegReader *)sqlite3_malloc64(nByte); + if( !pReader ){ + rc = SQLITE_NOMEM; + }else{ + memset(pReader, 0, nByte); + pReader->iIdx = 0x7FFFFFFF; + pReader->ppNextElem = (Fts3HashElem **)&pReader[1]; + memcpy(pReader->ppNextElem, aElem, nElem*sizeof(Fts3HashElem *)); + } + } + + if( bPrefix ){ + sqlite3_free(aElem); + } + *ppReader = pReader; + return rc; +} + +/* +** Compare the entries pointed to by two Fts3SegReader structures. +** Comparison is as follows: +** +** 1) EOF is greater than not EOF. +** +** 2) The current terms (if any) are compared using memcmp(). If one +** term is a prefix of another, the longer term is considered the +** larger. +** +** 3) By segment age. An older segment is considered larger. +*/ +static int fts3SegReaderCmp(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ + int rc; + if( pLhs->aNode && pRhs->aNode ){ + int rc2 = pLhs->nTerm - pRhs->nTerm; + if( rc2<0 ){ + rc = memcmp(pLhs->zTerm, pRhs->zTerm, pLhs->nTerm); + }else{ + rc = memcmp(pLhs->zTerm, pRhs->zTerm, pRhs->nTerm); + } + if( rc==0 ){ + rc = rc2; + } + }else{ + rc = (pLhs->aNode==0) - (pRhs->aNode==0); + } + if( rc==0 ){ + rc = pRhs->iIdx - pLhs->iIdx; + } + assert( rc!=0 ); + return rc; +} + +/* +** A different comparison function for SegReader structures. In this +** version, it is assumed that each SegReader points to an entry in +** a doclist for identical terms. Comparison is made as follows: +** +** 1) EOF (end of doclist in this case) is greater than not EOF. +** +** 2) By current docid. +** +** 3) By segment age. An older segment is considered larger. +*/ +static int fts3SegReaderDoclistCmp(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ + int rc = (pLhs->pOffsetList==0)-(pRhs->pOffsetList==0); + if( rc==0 ){ + if( pLhs->iDocid==pRhs->iDocid ){ + rc = pRhs->iIdx - pLhs->iIdx; + }else{ + rc = (pLhs->iDocid > pRhs->iDocid) ? 1 : -1; + } + } + assert( pLhs->aNode && pRhs->aNode ); + return rc; +} +static int fts3SegReaderDoclistCmpRev(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ + int rc = (pLhs->pOffsetList==0)-(pRhs->pOffsetList==0); + if( rc==0 ){ + if( pLhs->iDocid==pRhs->iDocid ){ + rc = pRhs->iIdx - pLhs->iIdx; + }else{ + rc = (pLhs->iDocid < pRhs->iDocid) ? 1 : -1; + } + } + assert( pLhs->aNode && pRhs->aNode ); + return rc; +} + +/* +** Compare the term that the Fts3SegReader object passed as the first argument +** points to with the term specified by arguments zTerm and nTerm. +** +** If the pSeg iterator is already at EOF, return 0. Otherwise, return +** -ve if the pSeg term is less than zTerm/nTerm, 0 if the two terms are +** equal, or +ve if the pSeg term is greater than zTerm/nTerm. +*/ +static int fts3SegReaderTermCmp( + Fts3SegReader *pSeg, /* Segment reader object */ + const char *zTerm, /* Term to compare to */ + int nTerm /* Size of term zTerm in bytes */ +){ + int res = 0; + if( pSeg->aNode ){ + if( pSeg->nTerm>nTerm ){ + res = memcmp(pSeg->zTerm, zTerm, nTerm); + }else{ + res = memcmp(pSeg->zTerm, zTerm, pSeg->nTerm); + } + if( res==0 ){ + res = pSeg->nTerm-nTerm; + } + } + return res; +} + +/* +** Argument apSegment is an array of nSegment elements. It is known that +** the final (nSegment-nSuspect) members are already in sorted order +** (according to the comparison function provided). This function shuffles +** the array around until all entries are in sorted order. +*/ +static void fts3SegReaderSort( + Fts3SegReader **apSegment, /* Array to sort entries of */ + int nSegment, /* Size of apSegment array */ + int nSuspect, /* Unsorted entry count */ + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) /* Comparison function */ +){ + int i; /* Iterator variable */ + + assert( nSuspect<=nSegment ); + + if( nSuspect==nSegment ) nSuspect--; + for(i=nSuspect-1; i>=0; i--){ + int j; + for(j=i; j<(nSegment-1); j++){ + Fts3SegReader *pTmp; + if( xCmp(apSegment[j], apSegment[j+1])<0 ) break; + pTmp = apSegment[j+1]; + apSegment[j+1] = apSegment[j]; + apSegment[j] = pTmp; + } + } + +#ifndef NDEBUG + /* Check that the list really is sorted now. */ + for(i=0; i<(nSuspect-1); i++){ + assert( xCmp(apSegment[i], apSegment[i+1])<0 ); + } +#endif +} + +/* +** Insert a record into the %_segments table. +*/ +static int fts3WriteSegment( + Fts3Table *p, /* Virtual table handle */ + sqlite3_int64 iBlock, /* Block id for new block */ + char *z, /* Pointer to buffer containing block data */ + int n /* Size of buffer z in bytes */ +){ + sqlite3_stmt *pStmt; + int rc = fts3SqlStmt(p, SQL_INSERT_SEGMENTS, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, iBlock); + sqlite3_bind_blob(pStmt, 2, z, n, SQLITE_STATIC); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + sqlite3_bind_null(pStmt, 2); + } + return rc; +} + +/* +** Find the largest relative level number in the table. If successful, set +** *pnMax to this value and return SQLITE_OK. Otherwise, if an error occurs, +** set *pnMax to zero and return an SQLite error code. +*/ +SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table *p, int *pnMax){ + int rc; + int mxLevel = 0; + sqlite3_stmt *pStmt = 0; + + rc = fts3SqlStmt(p, SQL_SELECT_MXLEVEL, &pStmt, 0); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + mxLevel = sqlite3_column_int(pStmt, 0); + } + rc = sqlite3_reset(pStmt); + } + *pnMax = mxLevel; + return rc; +} + +/* +** Insert a record into the %_segdir table. +*/ +static int fts3WriteSegdir( + Fts3Table *p, /* Virtual table handle */ + sqlite3_int64 iLevel, /* Value for "level" field (absolute level) */ + int iIdx, /* Value for "idx" field */ + sqlite3_int64 iStartBlock, /* Value for "start_block" field */ + sqlite3_int64 iLeafEndBlock, /* Value for "leaves_end_block" field */ + sqlite3_int64 iEndBlock, /* Value for "end_block" field */ + sqlite3_int64 nLeafData, /* Bytes of leaf data in segment */ + char *zRoot, /* Blob value for "root" field */ + int nRoot /* Number of bytes in buffer zRoot */ +){ + sqlite3_stmt *pStmt; + int rc = fts3SqlStmt(p, SQL_INSERT_SEGDIR, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, iLevel); + sqlite3_bind_int(pStmt, 2, iIdx); + sqlite3_bind_int64(pStmt, 3, iStartBlock); + sqlite3_bind_int64(pStmt, 4, iLeafEndBlock); + if( nLeafData==0 ){ + sqlite3_bind_int64(pStmt, 5, iEndBlock); + }else{ + char *zEnd = sqlite3_mprintf("%lld %lld", iEndBlock, nLeafData); + if( !zEnd ) return SQLITE_NOMEM; + sqlite3_bind_text(pStmt, 5, zEnd, -1, sqlite3_free); + } + sqlite3_bind_blob(pStmt, 6, zRoot, nRoot, SQLITE_STATIC); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + sqlite3_bind_null(pStmt, 6); + } + return rc; +} + +/* +** Return the size of the common prefix (if any) shared by zPrev and +** zNext, in bytes. For example, +** +** fts3PrefixCompress("abc", 3, "abcdef", 6) // returns 3 +** fts3PrefixCompress("abX", 3, "abcdef", 6) // returns 2 +** fts3PrefixCompress("abX", 3, "Xbcdef", 6) // returns 0 +*/ +static int fts3PrefixCompress( + const char *zPrev, /* Buffer containing previous term */ + int nPrev, /* Size of buffer zPrev in bytes */ + const char *zNext, /* Buffer containing next term */ + int nNext /* Size of buffer zNext in bytes */ +){ + int n; + UNUSED_PARAMETER(nNext); + for(n=0; nnData; /* Current size of node in bytes */ + int nReq = nData; /* Required space after adding zTerm */ + int nPrefix; /* Number of bytes of prefix compression */ + int nSuffix; /* Suffix length */ + + nPrefix = fts3PrefixCompress(pTree->zTerm, pTree->nTerm, zTerm, nTerm); + nSuffix = nTerm-nPrefix; + + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + + nReq += sqlite3Fts3VarintLen(nPrefix)+sqlite3Fts3VarintLen(nSuffix)+nSuffix; + if( nReq<=p->nNodeSize || !pTree->zTerm ){ + + if( nReq>p->nNodeSize ){ + /* An unusual case: this is the first term to be added to the node + ** and the static node buffer (p->nNodeSize bytes) is not large + ** enough. Use a separately malloced buffer instead This wastes + ** p->nNodeSize bytes, but since this scenario only comes about when + ** the database contain two terms that share a prefix of almost 2KB, + ** this is not expected to be a serious problem. + */ + assert( pTree->aData==(char *)&pTree[1] ); + pTree->aData = (char *)sqlite3_malloc(nReq); + if( !pTree->aData ){ + return SQLITE_NOMEM; + } + } + + if( pTree->zTerm ){ + /* There is no prefix-length field for first term in a node */ + nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nPrefix); + } + + nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nSuffix); + memcpy(&pTree->aData[nData], &zTerm[nPrefix], nSuffix); + pTree->nData = nData + nSuffix; + pTree->nEntry++; + + if( isCopyTerm ){ + if( pTree->nMalloczMalloc, nTerm*2); + if( !zNew ){ + return SQLITE_NOMEM; + } + pTree->nMalloc = nTerm*2; + pTree->zMalloc = zNew; + } + pTree->zTerm = pTree->zMalloc; + memcpy(pTree->zTerm, zTerm, nTerm); + pTree->nTerm = nTerm; + }else{ + pTree->zTerm = (char *)zTerm; + pTree->nTerm = nTerm; + } + return SQLITE_OK; + } + } + + /* If control flows to here, it was not possible to append zTerm to the + ** current node. Create a new node (a right-sibling of the current node). + ** If this is the first node in the tree, the term is added to it. + ** + ** Otherwise, the term is not added to the new node, it is left empty for + ** now. Instead, the term is inserted into the parent of pTree. If pTree + ** has no parent, one is created here. + */ + pNew = (SegmentNode *)sqlite3_malloc(sizeof(SegmentNode) + p->nNodeSize); + if( !pNew ){ + return SQLITE_NOMEM; + } + memset(pNew, 0, sizeof(SegmentNode)); + pNew->nData = 1 + FTS3_VARINT_MAX; + pNew->aData = (char *)&pNew[1]; + + if( pTree ){ + SegmentNode *pParent = pTree->pParent; + rc = fts3NodeAddTerm(p, &pParent, isCopyTerm, zTerm, nTerm); + if( pTree->pParent==0 ){ + pTree->pParent = pParent; + } + pTree->pRight = pNew; + pNew->pLeftmost = pTree->pLeftmost; + pNew->pParent = pParent; + pNew->zMalloc = pTree->zMalloc; + pNew->nMalloc = pTree->nMalloc; + pTree->zMalloc = 0; + }else{ + pNew->pLeftmost = pNew; + rc = fts3NodeAddTerm(p, &pNew, isCopyTerm, zTerm, nTerm); + } + + *ppTree = pNew; + return rc; +} + +/* +** Helper function for fts3NodeWrite(). +*/ +static int fts3TreeFinishNode( + SegmentNode *pTree, + int iHeight, + sqlite3_int64 iLeftChild +){ + int nStart; + assert( iHeight>=1 && iHeight<128 ); + nStart = FTS3_VARINT_MAX - sqlite3Fts3VarintLen(iLeftChild); + pTree->aData[nStart] = (char)iHeight; + sqlite3Fts3PutVarint(&pTree->aData[nStart+1], iLeftChild); + return nStart; +} + +/* +** Write the buffer for the segment node pTree and all of its peers to the +** database. Then call this function recursively to write the parent of +** pTree and its peers to the database. +** +** Except, if pTree is a root node, do not write it to the database. Instead, +** set output variables *paRoot and *pnRoot to contain the root node. +** +** If successful, SQLITE_OK is returned and output variable *piLast is +** set to the largest blockid written to the database (or zero if no +** blocks were written to the db). Otherwise, an SQLite error code is +** returned. +*/ +static int fts3NodeWrite( + Fts3Table *p, /* Virtual table handle */ + SegmentNode *pTree, /* SegmentNode handle */ + int iHeight, /* Height of this node in tree */ + sqlite3_int64 iLeaf, /* Block id of first leaf node */ + sqlite3_int64 iFree, /* Block id of next free slot in %_segments */ + sqlite3_int64 *piLast, /* OUT: Block id of last entry written */ + char **paRoot, /* OUT: Data for root node */ + int *pnRoot /* OUT: Size of root node in bytes */ +){ + int rc = SQLITE_OK; + + if( !pTree->pParent ){ + /* Root node of the tree. */ + int nStart = fts3TreeFinishNode(pTree, iHeight, iLeaf); + *piLast = iFree-1; + *pnRoot = pTree->nData - nStart; + *paRoot = &pTree->aData[nStart]; + }else{ + SegmentNode *pIter; + sqlite3_int64 iNextFree = iFree; + sqlite3_int64 iNextLeaf = iLeaf; + for(pIter=pTree->pLeftmost; pIter && rc==SQLITE_OK; pIter=pIter->pRight){ + int nStart = fts3TreeFinishNode(pIter, iHeight, iNextLeaf); + int nWrite = pIter->nData - nStart; + + rc = fts3WriteSegment(p, iNextFree, &pIter->aData[nStart], nWrite); + iNextFree++; + iNextLeaf += (pIter->nEntry+1); + } + if( rc==SQLITE_OK ){ + assert( iNextLeaf==iFree ); + rc = fts3NodeWrite( + p, pTree->pParent, iHeight+1, iFree, iNextFree, piLast, paRoot, pnRoot + ); + } + } + + return rc; +} + +/* +** Free all memory allocations associated with the tree pTree. +*/ +static void fts3NodeFree(SegmentNode *pTree){ + if( pTree ){ + SegmentNode *p = pTree->pLeftmost; + fts3NodeFree(p->pParent); + while( p ){ + SegmentNode *pRight = p->pRight; + if( p->aData!=(char *)&p[1] ){ + sqlite3_free(p->aData); + } + assert( pRight==0 || p->zMalloc==0 ); + sqlite3_free(p->zMalloc); + sqlite3_free(p); + p = pRight; + } + } +} + +/* +** Add a term to the segment being constructed by the SegmentWriter object +** *ppWriter. When adding the first term to a segment, *ppWriter should +** be passed NULL. This function will allocate a new SegmentWriter object +** and return it via the input/output variable *ppWriter in this case. +** +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. +*/ +static int fts3SegWriterAdd( + Fts3Table *p, /* Virtual table handle */ + SegmentWriter **ppWriter, /* IN/OUT: SegmentWriter handle */ + int isCopyTerm, /* True if buffer zTerm must be copied */ + const char *zTerm, /* Pointer to buffer containing term */ + int nTerm, /* Size of term in bytes */ + const char *aDoclist, /* Pointer to buffer containing doclist */ + int nDoclist /* Size of doclist in bytes */ +){ + int nPrefix; /* Size of term prefix in bytes */ + int nSuffix; /* Size of term suffix in bytes */ + int nReq; /* Number of bytes required on leaf page */ + int nData; + SegmentWriter *pWriter = *ppWriter; + + if( !pWriter ){ + int rc; + sqlite3_stmt *pStmt; + + /* Allocate the SegmentWriter structure */ + pWriter = (SegmentWriter *)sqlite3_malloc(sizeof(SegmentWriter)); + if( !pWriter ) return SQLITE_NOMEM; + memset(pWriter, 0, sizeof(SegmentWriter)); + *ppWriter = pWriter; + + /* Allocate a buffer in which to accumulate data */ + pWriter->aData = (char *)sqlite3_malloc(p->nNodeSize); + if( !pWriter->aData ) return SQLITE_NOMEM; + pWriter->nSize = p->nNodeSize; + + /* Find the next free blockid in the %_segments table */ + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENTS_ID, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + pWriter->iFree = sqlite3_column_int64(pStmt, 0); + pWriter->iFirst = pWriter->iFree; + } + rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ) return rc; + } + nData = pWriter->nData; + + nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm); + nSuffix = nTerm-nPrefix; + + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + + /* Figure out how many bytes are required by this new entry */ + nReq = sqlite3Fts3VarintLen(nPrefix) + /* varint containing prefix size */ + sqlite3Fts3VarintLen(nSuffix) + /* varint containing suffix size */ + nSuffix + /* Term suffix */ + sqlite3Fts3VarintLen(nDoclist) + /* Size of doclist */ + nDoclist; /* Doclist data */ + + if( nData>0 && nData+nReq>p->nNodeSize ){ + int rc; + + /* The current leaf node is full. Write it out to the database. */ + if( pWriter->iFree==LARGEST_INT64 ) return FTS_CORRUPT_VTAB; + rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, nData); + if( rc!=SQLITE_OK ) return rc; + p->nLeafAdd++; + + /* Add the current term to the interior node tree. The term added to + ** the interior tree must: + ** + ** a) be greater than the largest term on the leaf node just written + ** to the database (still available in pWriter->zTerm), and + ** + ** b) be less than or equal to the term about to be added to the new + ** leaf node (zTerm/nTerm). + ** + ** In other words, it must be the prefix of zTerm 1 byte longer than + ** the common prefix (if any) of zTerm and pWriter->zTerm. + */ + assert( nPrefixpTree, isCopyTerm, zTerm, nPrefix+1); + if( rc!=SQLITE_OK ) return rc; + + nData = 0; + pWriter->nTerm = 0; + + nPrefix = 0; + nSuffix = nTerm; + nReq = 1 + /* varint containing prefix size */ + sqlite3Fts3VarintLen(nTerm) + /* varint containing suffix size */ + nTerm + /* Term suffix */ + sqlite3Fts3VarintLen(nDoclist) + /* Size of doclist */ + nDoclist; /* Doclist data */ + } + + /* Increase the total number of bytes written to account for the new entry. */ + pWriter->nLeafData += nReq; + + /* If the buffer currently allocated is too small for this entry, realloc + ** the buffer to make it large enough. + */ + if( nReq>pWriter->nSize ){ + char *aNew = sqlite3_realloc(pWriter->aData, nReq); + if( !aNew ) return SQLITE_NOMEM; + pWriter->aData = aNew; + pWriter->nSize = nReq; + } + assert( nData+nReq<=pWriter->nSize ); + + /* Append the prefix-compressed term and doclist to the buffer. */ + nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nPrefix); + nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nSuffix); + assert( nSuffix>0 ); + memcpy(&pWriter->aData[nData], &zTerm[nPrefix], nSuffix); + nData += nSuffix; + nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nDoclist); + assert( nDoclist>0 ); + memcpy(&pWriter->aData[nData], aDoclist, nDoclist); + pWriter->nData = nData + nDoclist; + + /* Save the current term so that it can be used to prefix-compress the next. + ** If the isCopyTerm parameter is true, then the buffer pointed to by + ** zTerm is transient, so take a copy of the term data. Otherwise, just + ** store a copy of the pointer. + */ + if( isCopyTerm ){ + if( nTerm>pWriter->nMalloc ){ + char *zNew = sqlite3_realloc(pWriter->zMalloc, nTerm*2); + if( !zNew ){ + return SQLITE_NOMEM; + } + pWriter->nMalloc = nTerm*2; + pWriter->zMalloc = zNew; + pWriter->zTerm = zNew; + } + assert( pWriter->zTerm==pWriter->zMalloc ); + assert( nTerm>0 ); + memcpy(pWriter->zTerm, zTerm, nTerm); + }else{ + pWriter->zTerm = (char *)zTerm; + } + pWriter->nTerm = nTerm; + + return SQLITE_OK; +} + +/* +** Flush all data associated with the SegmentWriter object pWriter to the +** database. This function must be called after all terms have been added +** to the segment using fts3SegWriterAdd(). If successful, SQLITE_OK is +** returned. Otherwise, an SQLite error code. +*/ +static int fts3SegWriterFlush( + Fts3Table *p, /* Virtual table handle */ + SegmentWriter *pWriter, /* SegmentWriter to flush to the db */ + sqlite3_int64 iLevel, /* Value for 'level' column of %_segdir */ + int iIdx /* Value for 'idx' column of %_segdir */ +){ + int rc; /* Return code */ + if( pWriter->pTree ){ + sqlite3_int64 iLast = 0; /* Largest block id written to database */ + sqlite3_int64 iLastLeaf; /* Largest leaf block id written to db */ + char *zRoot = NULL; /* Pointer to buffer containing root node */ + int nRoot = 0; /* Size of buffer zRoot */ + + iLastLeaf = pWriter->iFree; + rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, pWriter->nData); + if( rc==SQLITE_OK ){ + rc = fts3NodeWrite(p, pWriter->pTree, 1, + pWriter->iFirst, pWriter->iFree, &iLast, &zRoot, &nRoot); + } + if( rc==SQLITE_OK ){ + rc = fts3WriteSegdir(p, iLevel, iIdx, + pWriter->iFirst, iLastLeaf, iLast, pWriter->nLeafData, zRoot, nRoot); + } + }else{ + /* The entire tree fits on the root node. Write it to the segdir table. */ + rc = fts3WriteSegdir(p, iLevel, iIdx, + 0, 0, 0, pWriter->nLeafData, pWriter->aData, pWriter->nData); + } + p->nLeafAdd++; + return rc; +} + +/* +** Release all memory held by the SegmentWriter object passed as the +** first argument. +*/ +static void fts3SegWriterFree(SegmentWriter *pWriter){ + if( pWriter ){ + sqlite3_free(pWriter->aData); + sqlite3_free(pWriter->zMalloc); + fts3NodeFree(pWriter->pTree); + sqlite3_free(pWriter); + } +} + +/* +** The first value in the apVal[] array is assumed to contain an integer. +** This function tests if there exist any documents with docid values that +** are different from that integer. i.e. if deleting the document with docid +** pRowid would mean the FTS3 table were empty. +** +** If successful, *pisEmpty is set to true if the table is empty except for +** document pRowid, or false otherwise, and SQLITE_OK is returned. If an +** error occurs, an SQLite error code is returned. +*/ +static int fts3IsEmpty(Fts3Table *p, sqlite3_value *pRowid, int *pisEmpty){ + sqlite3_stmt *pStmt; + int rc; + if( p->zContentTbl ){ + /* If using the content=xxx option, assume the table is never empty */ + *pisEmpty = 0; + rc = SQLITE_OK; + }else{ + rc = fts3SqlStmt(p, SQL_IS_EMPTY, &pStmt, &pRowid); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pisEmpty = sqlite3_column_int(pStmt, 0); + } + rc = sqlite3_reset(pStmt); + } + } + return rc; +} + +/* +** Set *pnMax to the largest segment level in the database for the index +** iIndex. +** +** Segment levels are stored in the 'level' column of the %_segdir table. +** +** Return SQLITE_OK if successful, or an SQLite error code if not. +*/ +static int fts3SegmentMaxLevel( + Fts3Table *p, + int iLangid, + int iIndex, + sqlite3_int64 *pnMax +){ + sqlite3_stmt *pStmt; + int rc; + assert( iIndex>=0 && iIndexnIndex ); + + /* Set pStmt to the compiled version of: + ** + ** SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? + ** + ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR). + */ + rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); + sqlite3_bind_int64(pStmt, 2, + getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) + ); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pnMax = sqlite3_column_int64(pStmt, 0); + } + return sqlite3_reset(pStmt); +} + +/* +** iAbsLevel is an absolute level that may be assumed to exist within +** the database. This function checks if it is the largest level number +** within its index. Assuming no error occurs, *pbMax is set to 1 if +** iAbsLevel is indeed the largest level, or 0 otherwise, and SQLITE_OK +** is returned. If an error occurs, an error code is returned and the +** final value of *pbMax is undefined. +*/ +static int fts3SegmentIsMaxLevel(Fts3Table *p, i64 iAbsLevel, int *pbMax){ + + /* Set pStmt to the compiled version of: + ** + ** SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? + ** + ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR). + */ + sqlite3_stmt *pStmt; + int rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + sqlite3_bind_int64(pStmt, 1, iAbsLevel+1); + sqlite3_bind_int64(pStmt, 2, + (((u64)iAbsLevel/FTS3_SEGDIR_MAXLEVEL)+1) * FTS3_SEGDIR_MAXLEVEL + ); + + *pbMax = 0; + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pbMax = sqlite3_column_type(pStmt, 0)==SQLITE_NULL; + } + return sqlite3_reset(pStmt); +} + +/* +** Delete all entries in the %_segments table associated with the segment +** opened with seg-reader pSeg. This function does not affect the contents +** of the %_segdir table. +*/ +static int fts3DeleteSegment( + Fts3Table *p, /* FTS table handle */ + Fts3SegReader *pSeg /* Segment to delete */ +){ + int rc = SQLITE_OK; /* Return code */ + if( pSeg->iStartBlock ){ + sqlite3_stmt *pDelete; /* SQL statement to delete rows */ + rc = fts3SqlStmt(p, SQL_DELETE_SEGMENTS_RANGE, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDelete, 1, pSeg->iStartBlock); + sqlite3_bind_int64(pDelete, 2, pSeg->iEndBlock); + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } + } + return rc; +} + +/* +** This function is used after merging multiple segments into a single large +** segment to delete the old, now redundant, segment b-trees. Specifically, +** it: +** +** 1) Deletes all %_segments entries for the segments associated with +** each of the SegReader objects in the array passed as the third +** argument, and +** +** 2) deletes all %_segdir entries with level iLevel, or all %_segdir +** entries regardless of level if (iLevel<0). +** +** SQLITE_OK is returned if successful, otherwise an SQLite error code. +*/ +static int fts3DeleteSegdir( + Fts3Table *p, /* Virtual table handle */ + int iLangid, /* Language id */ + int iIndex, /* Index for p->aIndex */ + int iLevel, /* Level of %_segdir entries to delete */ + Fts3SegReader **apSegment, /* Array of SegReader objects */ + int nReader /* Size of array apSegment */ +){ + int rc = SQLITE_OK; /* Return Code */ + int i; /* Iterator variable */ + sqlite3_stmt *pDelete = 0; /* SQL statement to delete rows */ + + for(i=0; rc==SQLITE_OK && i=0 || iLevel==FTS3_SEGCURSOR_ALL ); + if( iLevel==FTS3_SEGCURSOR_ALL ){ + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_RANGE, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDelete, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); + sqlite3_bind_int64(pDelete, 2, + getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) + ); + } + }else{ + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_LEVEL, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64( + pDelete, 1, getAbsoluteLevel(p, iLangid, iIndex, iLevel) + ); + } + } + + if( rc==SQLITE_OK ){ + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } + + return rc; +} + +/* +** When this function is called, buffer *ppList (size *pnList bytes) contains +** a position list that may (or may not) feature multiple columns. This +** function adjusts the pointer *ppList and the length *pnList so that they +** identify the subset of the position list that corresponds to column iCol. +** +** If there are no entries in the input position list for column iCol, then +** *pnList is set to zero before returning. +** +** If parameter bZero is non-zero, then any part of the input list following +** the end of the output list is zeroed before returning. +*/ +static void fts3ColumnFilter( + int iCol, /* Column to filter on */ + int bZero, /* Zero out anything following *ppList */ + char **ppList, /* IN/OUT: Pointer to position list */ + int *pnList /* IN/OUT: Size of buffer *ppList in bytes */ +){ + char *pList = *ppList; + int nList = *pnList; + char *pEnd = &pList[nList]; + int iCurrent = 0; + char *p = pList; + + assert( iCol>=0 ); + while( 1 ){ + char c = 0; + while( p0){ + memset(&pList[nList], 0, pEnd - &pList[nList]); + } + *ppList = pList; + *pnList = nList; +} + +/* +** Cache data in the Fts3MultiSegReader.aBuffer[] buffer (overwriting any +** existing data). Grow the buffer if required. +** +** If successful, return SQLITE_OK. Otherwise, if an OOM error is encountered +** trying to resize the buffer, return SQLITE_NOMEM. +*/ +static int fts3MsrBufferData( + Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */ + char *pList, + int nList +){ + if( nList>pMsr->nBuffer ){ + char *pNew; + pMsr->nBuffer = nList*2; + pNew = (char *)sqlite3_realloc(pMsr->aBuffer, pMsr->nBuffer); + if( !pNew ) return SQLITE_NOMEM; + pMsr->aBuffer = pNew; + } + + assert( nList>0 ); + memcpy(pMsr->aBuffer, pList, nList); + return SQLITE_OK; +} + +SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */ + sqlite3_int64 *piDocid, /* OUT: Docid value */ + char **paPoslist, /* OUT: Pointer to position list */ + int *pnPoslist /* OUT: Size of position list in bytes */ +){ + int nMerge = pMsr->nAdvance; + Fts3SegReader **apSegment = pMsr->apSegment; + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = ( + p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp + ); + + if( nMerge==0 ){ + *paPoslist = 0; + return SQLITE_OK; + } + + while( 1 ){ + Fts3SegReader *pSeg; + pSeg = pMsr->apSegment[0]; + + if( pSeg->pOffsetList==0 ){ + *paPoslist = 0; + break; + }else{ + int rc; + char *pList; + int nList; + int j; + sqlite3_int64 iDocid = apSegment[0]->iDocid; + + rc = fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList); + j = 1; + while( rc==SQLITE_OK + && jpOffsetList + && apSegment[j]->iDocid==iDocid + ){ + rc = fts3SegReaderNextDocid(p, apSegment[j], 0, 0); + j++; + } + if( rc!=SQLITE_OK ) return rc; + fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp); + + if( nList>0 && fts3SegReaderIsPending(apSegment[0]) ){ + rc = fts3MsrBufferData(pMsr, pList, nList+1); + if( rc!=SQLITE_OK ) return rc; + assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 ); + pList = pMsr->aBuffer; + } + + if( pMsr->iColFilter>=0 ){ + fts3ColumnFilter(pMsr->iColFilter, 1, &pList, &nList); + } + + if( nList>0 ){ + *paPoslist = pList; + *piDocid = iDocid; + *pnPoslist = nList; + break; + } + } + } + + return SQLITE_OK; +} + +static int fts3SegReaderStart( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr, /* Cursor object */ + const char *zTerm, /* Term searched for (or NULL) */ + int nTerm /* Length of zTerm in bytes */ +){ + int i; + int nSeg = pCsr->nSegment; + + /* If the Fts3SegFilter defines a specific term (or term prefix) to search + ** for, then advance each segment iterator until it points to a term of + ** equal or greater value than the specified term. This prevents many + ** unnecessary merge/sort operations for the case where single segment + ** b-tree leaf nodes contain more than one term. + */ + for(i=0; pCsr->bRestart==0 && inSegment; i++){ + int res = 0; + Fts3SegReader *pSeg = pCsr->apSegment[i]; + do { + int rc = fts3SegReaderNext(p, pSeg, 0); + if( rc!=SQLITE_OK ) return rc; + }while( zTerm && (res = fts3SegReaderTermCmp(pSeg, zTerm, nTerm))<0 ); + + if( pSeg->bLookup && res!=0 ){ + fts3SegReaderSetEof(pSeg); + } + } + fts3SegReaderSort(pCsr->apSegment, nSeg, nSeg, fts3SegReaderCmp); + + return SQLITE_OK; +} + +SQLITE_PRIVATE int sqlite3Fts3SegReaderStart( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr, /* Cursor object */ + Fts3SegFilter *pFilter /* Restrictions on range of iteration */ +){ + pCsr->pFilter = pFilter; + return fts3SegReaderStart(p, pCsr, pFilter->zTerm, pFilter->nTerm); +} + +SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr, /* Cursor object */ + int iCol, /* Column to match on. */ + const char *zTerm, /* Term to iterate through a doclist for */ + int nTerm /* Number of bytes in zTerm */ +){ + int i; + int rc; + int nSegment = pCsr->nSegment; + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = ( + p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp + ); + + assert( pCsr->pFilter==0 ); + assert( zTerm && nTerm>0 ); + + /* Advance each segment iterator until it points to the term zTerm/nTerm. */ + rc = fts3SegReaderStart(p, pCsr, zTerm, nTerm); + if( rc!=SQLITE_OK ) return rc; + + /* Determine how many of the segments actually point to zTerm/nTerm. */ + for(i=0; iapSegment[i]; + if( !pSeg->aNode || fts3SegReaderTermCmp(pSeg, zTerm, nTerm) ){ + break; + } + } + pCsr->nAdvance = i; + + /* Advance each of the segments to point to the first docid. */ + for(i=0; inAdvance; i++){ + rc = fts3SegReaderFirstDocid(p, pCsr->apSegment[i]); + if( rc!=SQLITE_OK ) return rc; + } + fts3SegReaderSort(pCsr->apSegment, i, i, xCmp); + + assert( iCol<0 || iColnColumn ); + pCsr->iColFilter = iCol; + + return SQLITE_OK; +} + +/* +** This function is called on a MultiSegReader that has been started using +** sqlite3Fts3MsrIncrStart(). One or more calls to MsrIncrNext() may also +** have been made. Calling this function puts the MultiSegReader in such +** a state that if the next two calls are: +** +** sqlite3Fts3SegReaderStart() +** sqlite3Fts3SegReaderStep() +** +** then the entire doclist for the term is available in +** MultiSegReader.aDoclist/nDoclist. +*/ +SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){ + int i; /* Used to iterate through segment-readers */ + + assert( pCsr->zTerm==0 ); + assert( pCsr->nTerm==0 ); + assert( pCsr->aDoclist==0 ); + assert( pCsr->nDoclist==0 ); + + pCsr->nAdvance = 0; + pCsr->bRestart = 1; + for(i=0; inSegment; i++){ + pCsr->apSegment[i]->pOffsetList = 0; + pCsr->apSegment[i]->nOffsetList = 0; + pCsr->apSegment[i]->iDocid = 0; + } + + return SQLITE_OK; +} + + +SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr /* Cursor object */ +){ + int rc = SQLITE_OK; + + int isIgnoreEmpty = (pCsr->pFilter->flags & FTS3_SEGMENT_IGNORE_EMPTY); + int isRequirePos = (pCsr->pFilter->flags & FTS3_SEGMENT_REQUIRE_POS); + int isColFilter = (pCsr->pFilter->flags & FTS3_SEGMENT_COLUMN_FILTER); + int isPrefix = (pCsr->pFilter->flags & FTS3_SEGMENT_PREFIX); + int isScan = (pCsr->pFilter->flags & FTS3_SEGMENT_SCAN); + int isFirst = (pCsr->pFilter->flags & FTS3_SEGMENT_FIRST); + + Fts3SegReader **apSegment = pCsr->apSegment; + int nSegment = pCsr->nSegment; + Fts3SegFilter *pFilter = pCsr->pFilter; + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = ( + p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp + ); + + if( pCsr->nSegment==0 ) return SQLITE_OK; + + do { + int nMerge; + int i; + + /* Advance the first pCsr->nAdvance entries in the apSegment[] array + ** forward. Then sort the list in order of current term again. + */ + for(i=0; inAdvance; i++){ + Fts3SegReader *pSeg = apSegment[i]; + if( pSeg->bLookup ){ + fts3SegReaderSetEof(pSeg); + }else{ + rc = fts3SegReaderNext(p, pSeg, 0); + } + if( rc!=SQLITE_OK ) return rc; + } + fts3SegReaderSort(apSegment, nSegment, pCsr->nAdvance, fts3SegReaderCmp); + pCsr->nAdvance = 0; + + /* If all the seg-readers are at EOF, we're finished. return SQLITE_OK. */ + assert( rc==SQLITE_OK ); + if( apSegment[0]->aNode==0 ) break; + + pCsr->nTerm = apSegment[0]->nTerm; + pCsr->zTerm = apSegment[0]->zTerm; + + /* If this is a prefix-search, and if the term that apSegment[0] points + ** to does not share a suffix with pFilter->zTerm/nTerm, then all + ** required callbacks have been made. In this case exit early. + ** + ** Similarly, if this is a search for an exact match, and the first term + ** of segment apSegment[0] is not a match, exit early. + */ + if( pFilter->zTerm && !isScan ){ + if( pCsr->nTermnTerm + || (!isPrefix && pCsr->nTerm>pFilter->nTerm) + || memcmp(pCsr->zTerm, pFilter->zTerm, pFilter->nTerm) + ){ + break; + } + } + + nMerge = 1; + while( nMergeaNode + && apSegment[nMerge]->nTerm==pCsr->nTerm + && 0==memcmp(pCsr->zTerm, apSegment[nMerge]->zTerm, pCsr->nTerm) + ){ + nMerge++; + } + + assert( isIgnoreEmpty || (isRequirePos && !isColFilter) ); + if( nMerge==1 + && !isIgnoreEmpty + && !isFirst + && (p->bDescIdx==0 || fts3SegReaderIsPending(apSegment[0])==0) + ){ + pCsr->nDoclist = apSegment[0]->nDoclist; + if( fts3SegReaderIsPending(apSegment[0]) ){ + rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, pCsr->nDoclist); + pCsr->aDoclist = pCsr->aBuffer; + }else{ + pCsr->aDoclist = apSegment[0]->aDoclist; + } + if( rc==SQLITE_OK ) rc = SQLITE_ROW; + }else{ + int nDoclist = 0; /* Size of doclist */ + sqlite3_int64 iPrev = 0; /* Previous docid stored in doclist */ + + /* The current term of the first nMerge entries in the array + ** of Fts3SegReader objects is the same. The doclists must be merged + ** and a single term returned with the merged doclist. + */ + for(i=0; ipOffsetList ){ + int j; /* Number of segments that share a docid */ + char *pList = 0; + int nList = 0; + int nByte; + sqlite3_int64 iDocid = apSegment[0]->iDocid; + fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList); + j = 1; + while( jpOffsetList + && apSegment[j]->iDocid==iDocid + ){ + fts3SegReaderNextDocid(p, apSegment[j], 0, 0); + j++; + } + + if( isColFilter ){ + fts3ColumnFilter(pFilter->iCol, 0, &pList, &nList); + } + + if( !isIgnoreEmpty || nList>0 ){ + + /* Calculate the 'docid' delta value to write into the merged + ** doclist. */ + sqlite3_int64 iDelta; + if( p->bDescIdx && nDoclist>0 ){ + if( iPrev<=iDocid ) return FTS_CORRUPT_VTAB; + iDelta = (i64)((u64)iPrev - (u64)iDocid); + }else{ + if( nDoclist>0 && iPrev>=iDocid ) return FTS_CORRUPT_VTAB; + iDelta = (i64)((u64)iDocid - (u64)iPrev); + } + + nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); + if( nDoclist+nByte>pCsr->nBuffer ){ + char *aNew; + pCsr->nBuffer = (nDoclist+nByte)*2; + aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer); + if( !aNew ){ + return SQLITE_NOMEM; + } + pCsr->aBuffer = aNew; + } + + if( isFirst ){ + char *a = &pCsr->aBuffer[nDoclist]; + int nWrite; + + nWrite = sqlite3Fts3FirstFilter(iDelta, pList, nList, a); + if( nWrite ){ + iPrev = iDocid; + nDoclist += nWrite; + } + }else{ + nDoclist += sqlite3Fts3PutVarint(&pCsr->aBuffer[nDoclist], iDelta); + iPrev = iDocid; + if( isRequirePos ){ + memcpy(&pCsr->aBuffer[nDoclist], pList, nList); + nDoclist += nList; + pCsr->aBuffer[nDoclist++] = '\0'; + } + } + } + + fts3SegReaderSort(apSegment, nMerge, j, xCmp); + } + if( nDoclist>0 ){ + pCsr->aDoclist = pCsr->aBuffer; + pCsr->nDoclist = nDoclist; + rc = SQLITE_ROW; + } + } + pCsr->nAdvance = nMerge; + }while( rc==SQLITE_OK ); + + return rc; +} + + +SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish( + Fts3MultiSegReader *pCsr /* Cursor object */ +){ + if( pCsr ){ + int i; + for(i=0; inSegment; i++){ + sqlite3Fts3SegReaderFree(pCsr->apSegment[i]); + } + sqlite3_free(pCsr->apSegment); + sqlite3_free(pCsr->aBuffer); + + pCsr->nSegment = 0; + pCsr->apSegment = 0; + pCsr->aBuffer = 0; + } +} + +/* +** Decode the "end_block" field, selected by column iCol of the SELECT +** statement passed as the first argument. +** +** The "end_block" field may contain either an integer, or a text field +** containing the text representation of two non-negative integers separated +** by one or more space (0x20) characters. In the first case, set *piEndBlock +** to the integer value and *pnByte to zero before returning. In the second, +** set *piEndBlock to the first value and *pnByte to the second. +*/ +static void fts3ReadEndBlockField( + sqlite3_stmt *pStmt, + int iCol, + i64 *piEndBlock, + i64 *pnByte +){ + const unsigned char *zText = sqlite3_column_text(pStmt, iCol); + if( zText ){ + int i; + int iMul = 1; + u64 iVal = 0; + for(i=0; zText[i]>='0' && zText[i]<='9'; i++){ + iVal = iVal*10 + (zText[i] - '0'); + } + *piEndBlock = (i64)iVal; + while( zText[i]==' ' ) i++; + iVal = 0; + if( zText[i]=='-' ){ + i++; + iMul = -1; + } + for(/* no-op */; zText[i]>='0' && zText[i]<='9'; i++){ + iVal = iVal*10 + (zText[i] - '0'); + } + *pnByte = ((i64)iVal * (i64)iMul); + } +} + + +/* +** A segment of size nByte bytes has just been written to absolute level +** iAbsLevel. Promote any segments that should be promoted as a result. +*/ +static int fts3PromoteSegments( + Fts3Table *p, /* FTS table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level just updated */ + sqlite3_int64 nByte /* Size of new segment at iAbsLevel */ +){ + int rc = SQLITE_OK; + sqlite3_stmt *pRange; + + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_RANGE2, &pRange, 0); + + if( rc==SQLITE_OK ){ + int bOk = 0; + i64 iLast = (iAbsLevel/FTS3_SEGDIR_MAXLEVEL + 1) * FTS3_SEGDIR_MAXLEVEL - 1; + i64 nLimit = (nByte*3)/2; + + /* Loop through all entries in the %_segdir table corresponding to + ** segments in this index on levels greater than iAbsLevel. If there is + ** at least one such segment, and it is possible to determine that all + ** such segments are smaller than nLimit bytes in size, they will be + ** promoted to level iAbsLevel. */ + sqlite3_bind_int64(pRange, 1, iAbsLevel+1); + sqlite3_bind_int64(pRange, 2, iLast); + while( SQLITE_ROW==sqlite3_step(pRange) ){ + i64 nSize = 0, dummy; + fts3ReadEndBlockField(pRange, 2, &dummy, &nSize); + if( nSize<=0 || nSize>nLimit ){ + /* If nSize==0, then the %_segdir.end_block field does not not + ** contain a size value. This happens if it was written by an + ** old version of FTS. In this case it is not possible to determine + ** the size of the segment, and so segment promotion does not + ** take place. */ + bOk = 0; + break; + } + bOk = 1; + } + rc = sqlite3_reset(pRange); + + if( bOk ){ + int iIdx = 0; + sqlite3_stmt *pUpdate1 = 0; + sqlite3_stmt *pUpdate2 = 0; + + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_UPDATE_LEVEL_IDX, &pUpdate1, 0); + } + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_UPDATE_LEVEL, &pUpdate2, 0); + } + + if( rc==SQLITE_OK ){ + + /* Loop through all %_segdir entries for segments in this index with + ** levels equal to or greater than iAbsLevel. As each entry is visited, + ** updated it to set (level = -1) and (idx = N), where N is 0 for the + ** oldest segment in the range, 1 for the next oldest, and so on. + ** + ** In other words, move all segments being promoted to level -1, + ** setting the "idx" fields as appropriate to keep them in the same + ** order. The contents of level -1 (which is never used, except + ** transiently here), will be moved back to level iAbsLevel below. */ + sqlite3_bind_int64(pRange, 1, iAbsLevel); + while( SQLITE_ROW==sqlite3_step(pRange) ){ + sqlite3_bind_int(pUpdate1, 1, iIdx++); + sqlite3_bind_int(pUpdate1, 2, sqlite3_column_int(pRange, 0)); + sqlite3_bind_int(pUpdate1, 3, sqlite3_column_int(pRange, 1)); + sqlite3_step(pUpdate1); + rc = sqlite3_reset(pUpdate1); + if( rc!=SQLITE_OK ){ + sqlite3_reset(pRange); + break; + } + } + } + if( rc==SQLITE_OK ){ + rc = sqlite3_reset(pRange); + } + + /* Move level -1 to level iAbsLevel */ + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pUpdate2, 1, iAbsLevel); + sqlite3_step(pUpdate2); + rc = sqlite3_reset(pUpdate2); + } + } + } + + + return rc; +} + +/* +** Merge all level iLevel segments in the database into a single +** iLevel+1 segment. Or, if iLevel<0, merge all segments into a +** single segment with a level equal to the numerically largest level +** currently present in the database. +** +** If this function is called with iLevel<0, but there is only one +** segment in the database, SQLITE_DONE is returned immediately. +** Otherwise, if successful, SQLITE_OK is returned. If an error occurs, +** an SQLite error code is returned. +*/ +static int fts3SegmentMerge( + Fts3Table *p, + int iLangid, /* Language id to merge */ + int iIndex, /* Index in p->aIndex[] to merge */ + int iLevel /* Level to merge */ +){ + int rc; /* Return code */ + int iIdx = 0; /* Index of new segment */ + sqlite3_int64 iNewLevel = 0; /* Level/index to create new segment at */ + SegmentWriter *pWriter = 0; /* Used to write the new, merged, segment */ + Fts3SegFilter filter; /* Segment term filter condition */ + Fts3MultiSegReader csr; /* Cursor to iterate through level(s) */ + int bIgnoreEmpty = 0; /* True to ignore empty segments */ + i64 iMaxLevel = 0; /* Max level number for this index/langid */ + + assert( iLevel==FTS3_SEGCURSOR_ALL + || iLevel==FTS3_SEGCURSOR_PENDING + || iLevel>=0 + ); + assert( iLevel=0 && iIndexnIndex ); + + rc = sqlite3Fts3SegReaderCursor(p, iLangid, iIndex, iLevel, 0, 0, 1, 0, &csr); + if( rc!=SQLITE_OK || csr.nSegment==0 ) goto finished; + + if( iLevel!=FTS3_SEGCURSOR_PENDING ){ + rc = fts3SegmentMaxLevel(p, iLangid, iIndex, &iMaxLevel); + if( rc!=SQLITE_OK ) goto finished; + } + + if( iLevel==FTS3_SEGCURSOR_ALL ){ + /* This call is to merge all segments in the database to a single + ** segment. The level of the new segment is equal to the numerically + ** greatest segment level currently present in the database for this + ** index. The idx of the new segment is always 0. */ + if( csr.nSegment==1 && 0==fts3SegReaderIsPending(csr.apSegment[0]) ){ + rc = SQLITE_DONE; + goto finished; + } + iNewLevel = iMaxLevel; + bIgnoreEmpty = 1; + + }else{ + /* This call is to merge all segments at level iLevel. find the next + ** available segment index at level iLevel+1. The call to + ** fts3AllocateSegdirIdx() will merge the segments at level iLevel+1 to + ** a single iLevel+2 segment if necessary. */ + assert( FTS3_SEGCURSOR_PENDING==-1 ); + iNewLevel = getAbsoluteLevel(p, iLangid, iIndex, iLevel+1); + rc = fts3AllocateSegdirIdx(p, iLangid, iIndex, iLevel+1, &iIdx); + bIgnoreEmpty = (iLevel!=FTS3_SEGCURSOR_PENDING) && (iNewLevel>iMaxLevel); + } + if( rc!=SQLITE_OK ) goto finished; + + assert( csr.nSegment>0 ); + assert_fts3_nc( iNewLevel>=getAbsoluteLevel(p, iLangid, iIndex, 0) ); + assert_fts3_nc( + iNewLevelnLeafData); + } + } + } + + finished: + fts3SegWriterFree(pWriter); + sqlite3Fts3SegReaderFinish(&csr); + return rc; +} + + +/* +** Flush the contents of pendingTerms to level 0 segments. +*/ +SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *p){ + int rc = SQLITE_OK; + int i; + + for(i=0; rc==SQLITE_OK && inIndex; i++){ + rc = fts3SegmentMerge(p, p->iPrevLangid, i, FTS3_SEGCURSOR_PENDING); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + sqlite3Fts3PendingTermsClear(p); + + /* Determine the auto-incr-merge setting if unknown. If enabled, + ** estimate the number of leaf blocks of content to be written + */ + if( rc==SQLITE_OK && p->bHasStat + && p->nAutoincrmerge==0xff && p->nLeafAdd>0 + ){ + sqlite3_stmt *pStmt = 0; + rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE); + rc = sqlite3_step(pStmt); + if( rc==SQLITE_ROW ){ + p->nAutoincrmerge = sqlite3_column_int(pStmt, 0); + if( p->nAutoincrmerge==1 ) p->nAutoincrmerge = 8; + }else if( rc==SQLITE_DONE ){ + p->nAutoincrmerge = 0; + } + rc = sqlite3_reset(pStmt); + } + } + return rc; +} + +/* +** Encode N integers as varints into a blob. +*/ +static void fts3EncodeIntArray( + int N, /* The number of integers to encode */ + u32 *a, /* The integer values */ + char *zBuf, /* Write the BLOB here */ + int *pNBuf /* Write number of bytes if zBuf[] used here */ +){ + int i, j; + for(i=j=0; iiPrevDocid. The sizes are encoded as +** a blob of varints. +*/ +static void fts3InsertDocsize( + int *pRC, /* Result code */ + Fts3Table *p, /* Table into which to insert */ + u32 *aSz /* Sizes of each column, in tokens */ +){ + char *pBlob; /* The BLOB encoding of the document size */ + int nBlob; /* Number of bytes in the BLOB */ + sqlite3_stmt *pStmt; /* Statement used to insert the encoding */ + int rc; /* Result code from subfunctions */ + + if( *pRC ) return; + pBlob = sqlite3_malloc64( 10*(sqlite3_int64)p->nColumn ); + if( pBlob==0 ){ + *pRC = SQLITE_NOMEM; + return; + } + fts3EncodeIntArray(p->nColumn, aSz, pBlob, &nBlob); + rc = fts3SqlStmt(p, SQL_REPLACE_DOCSIZE, &pStmt, 0); + if( rc ){ + sqlite3_free(pBlob); + *pRC = rc; + return; + } + sqlite3_bind_int64(pStmt, 1, p->iPrevDocid); + sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, sqlite3_free); + sqlite3_step(pStmt); + *pRC = sqlite3_reset(pStmt); +} + +/* +** Record 0 of the %_stat table contains a blob consisting of N varints, +** where N is the number of user defined columns in the fts3 table plus +** two. If nCol is the number of user defined columns, then values of the +** varints are set as follows: +** +** Varint 0: Total number of rows in the table. +** +** Varint 1..nCol: For each column, the total number of tokens stored in +** the column for all rows of the table. +** +** Varint 1+nCol: The total size, in bytes, of all text values in all +** columns of all rows of the table. +** +*/ +static void fts3UpdateDocTotals( + int *pRC, /* The result code */ + Fts3Table *p, /* Table being updated */ + u32 *aSzIns, /* Size increases */ + u32 *aSzDel, /* Size decreases */ + int nChng /* Change in the number of documents */ +){ + char *pBlob; /* Storage for BLOB written into %_stat */ + int nBlob; /* Size of BLOB written into %_stat */ + u32 *a; /* Array of integers that becomes the BLOB */ + sqlite3_stmt *pStmt; /* Statement for reading and writing */ + int i; /* Loop counter */ + int rc; /* Result code from subfunctions */ + + const int nStat = p->nColumn+2; + + if( *pRC ) return; + a = sqlite3_malloc64( (sizeof(u32)+10)*(sqlite3_int64)nStat ); + if( a==0 ){ + *pRC = SQLITE_NOMEM; + return; + } + pBlob = (char*)&a[nStat]; + rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pStmt, 0); + if( rc ){ + sqlite3_free(a); + *pRC = rc; + return; + } + sqlite3_bind_int(pStmt, 1, FTS_STAT_DOCTOTAL); + if( sqlite3_step(pStmt)==SQLITE_ROW ){ + fts3DecodeIntArray(nStat, a, + sqlite3_column_blob(pStmt, 0), + sqlite3_column_bytes(pStmt, 0)); + }else{ + memset(a, 0, sizeof(u32)*(nStat) ); + } + rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ){ + sqlite3_free(a); + *pRC = rc; + return; + } + if( nChng<0 && a[0]<(u32)(-nChng) ){ + a[0] = 0; + }else{ + a[0] += nChng; + } + for(i=0; inColumn+1; i++){ + u32 x = a[i+1]; + if( x+aSzIns[i] < aSzDel[i] ){ + x = 0; + }else{ + x = x + aSzIns[i] - aSzDel[i]; + } + a[i+1] = x; + } + fts3EncodeIntArray(nStat, a, pBlob, &nBlob); + rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pStmt, 0); + if( rc ){ + sqlite3_free(a); + *pRC = rc; + return; + } + sqlite3_bind_int(pStmt, 1, FTS_STAT_DOCTOTAL); + sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, SQLITE_STATIC); + sqlite3_step(pStmt); + *pRC = sqlite3_reset(pStmt); + sqlite3_bind_null(pStmt, 2); + sqlite3_free(a); +} + +/* +** Merge the entire database so that there is one segment for each +** iIndex/iLangid combination. +*/ +static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ + int bSeenDone = 0; + int rc; + sqlite3_stmt *pAllLangid = 0; + + rc = sqlite3Fts3PendingTermsFlush(p); + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); + } + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int(pAllLangid, 1, p->iPrevLangid); + sqlite3_bind_int(pAllLangid, 2, p->nIndex); + while( sqlite3_step(pAllLangid)==SQLITE_ROW ){ + int i; + int iLangid = sqlite3_column_int(pAllLangid, 0); + for(i=0; rc==SQLITE_OK && inIndex; i++){ + rc = fts3SegmentMerge(p, iLangid, i, FTS3_SEGCURSOR_ALL); + if( rc==SQLITE_DONE ){ + bSeenDone = 1; + rc = SQLITE_OK; + } + } + } + rc2 = sqlite3_reset(pAllLangid); + if( rc==SQLITE_OK ) rc = rc2; + } + + sqlite3Fts3SegmentsClose(p); + + return (rc==SQLITE_OK && bReturnDone && bSeenDone) ? SQLITE_DONE : rc; +} + +/* +** This function is called when the user executes the following statement: +** +** INSERT INTO () VALUES('rebuild'); +** +** The entire FTS index is discarded and rebuilt. If the table is one +** created using the content=xxx option, then the new index is based on +** the current contents of the xxx table. Otherwise, it is rebuilt based +** on the contents of the %_content table. +*/ +static int fts3DoRebuild(Fts3Table *p){ + int rc; /* Return Code */ + + rc = fts3DeleteAll(p, 0); + if( rc==SQLITE_OK ){ + u32 *aSz = 0; + u32 *aSzIns = 0; + u32 *aSzDel = 0; + sqlite3_stmt *pStmt = 0; + int nEntry = 0; + + /* Compose and prepare an SQL statement to loop through the content table */ + char *zSql = sqlite3_mprintf("SELECT %s" , p->zReadExprlist); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + } + + if( rc==SQLITE_OK ){ + sqlite3_int64 nByte = sizeof(u32) * ((sqlite3_int64)p->nColumn+1)*3; + aSz = (u32 *)sqlite3_malloc64(nByte); + if( aSz==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(aSz, 0, nByte); + aSzIns = &aSz[p->nColumn+1]; + aSzDel = &aSzIns[p->nColumn+1]; + } + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + int iCol; + int iLangid = langidFromSelect(p, pStmt); + rc = fts3PendingTermsDocid(p, 0, iLangid, sqlite3_column_int64(pStmt, 0)); + memset(aSz, 0, sizeof(aSz[0]) * (p->nColumn+1)); + for(iCol=0; rc==SQLITE_OK && iColnColumn; iCol++){ + if( p->abNotindexed[iCol]==0 ){ + const char *z = (const char *) sqlite3_column_text(pStmt, iCol+1); + rc = fts3PendingTermsAdd(p, iLangid, z, iCol, &aSz[iCol]); + aSz[p->nColumn] += sqlite3_column_bytes(pStmt, iCol+1); + } + } + if( p->bHasDocsize ){ + fts3InsertDocsize(&rc, p, aSz); + } + if( rc!=SQLITE_OK ){ + sqlite3_finalize(pStmt); + pStmt = 0; + }else{ + nEntry++; + for(iCol=0; iCol<=p->nColumn; iCol++){ + aSzIns[iCol] += aSz[iCol]; + } + } + } + if( p->bFts4 ){ + fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nEntry); + } + sqlite3_free(aSz); + + if( pStmt ){ + int rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + + return rc; +} + + +/* +** This function opens a cursor used to read the input data for an +** incremental merge operation. Specifically, it opens a cursor to scan +** the oldest nSeg segments (idx=0 through idx=(nSeg-1)) in absolute +** level iAbsLevel. +*/ +static int fts3IncrmergeCsr( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level to open */ + int nSeg, /* Number of segments to merge */ + Fts3MultiSegReader *pCsr /* Cursor object to populate */ +){ + int rc; /* Return Code */ + sqlite3_stmt *pStmt = 0; /* Statement used to read %_segdir entry */ + sqlite3_int64 nByte; /* Bytes allocated at pCsr->apSegment[] */ + + /* Allocate space for the Fts3MultiSegReader.aCsr[] array */ + memset(pCsr, 0, sizeof(*pCsr)); + nByte = sizeof(Fts3SegReader *) * nSeg; + pCsr->apSegment = (Fts3SegReader **)sqlite3_malloc64(nByte); + + if( pCsr->apSegment==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pCsr->apSegment, 0, nByte); + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0); + } + if( rc==SQLITE_OK ){ + int i; + int rc2; + sqlite3_bind_int64(pStmt, 1, iAbsLevel); + assert( pCsr->nSegment==0 ); + for(i=0; rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW && iapSegment[i] + ); + pCsr->nSegment++; + } + rc2 = sqlite3_reset(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + } + + return rc; +} + +typedef struct IncrmergeWriter IncrmergeWriter; +typedef struct NodeWriter NodeWriter; +typedef struct Blob Blob; +typedef struct NodeReader NodeReader; + +/* +** An instance of the following structure is used as a dynamic buffer +** to build up nodes or other blobs of data in. +** +** The function blobGrowBuffer() is used to extend the allocation. +*/ +struct Blob { + char *a; /* Pointer to allocation */ + int n; /* Number of valid bytes of data in a[] */ + int nAlloc; /* Allocated size of a[] (nAlloc>=n) */ +}; + +/* +** This structure is used to build up buffers containing segment b-tree +** nodes (blocks). +*/ +struct NodeWriter { + sqlite3_int64 iBlock; /* Current block id */ + Blob key; /* Last key written to the current block */ + Blob block; /* Current block image */ +}; + +/* +** An object of this type contains the state required to create or append +** to an appendable b-tree segment. +*/ +struct IncrmergeWriter { + int nLeafEst; /* Space allocated for leaf blocks */ + int nWork; /* Number of leaf pages flushed */ + sqlite3_int64 iAbsLevel; /* Absolute level of input segments */ + int iIdx; /* Index of *output* segment in iAbsLevel+1 */ + sqlite3_int64 iStart; /* Block number of first allocated block */ + sqlite3_int64 iEnd; /* Block number of last allocated block */ + sqlite3_int64 nLeafData; /* Bytes of leaf page data so far */ + u8 bNoLeafData; /* If true, store 0 for segment size */ + NodeWriter aNodeWriter[FTS_MAX_APPENDABLE_HEIGHT]; +}; + +/* +** An object of the following type is used to read data from a single +** FTS segment node. See the following functions: +** +** nodeReaderInit() +** nodeReaderNext() +** nodeReaderRelease() +*/ +struct NodeReader { + const char *aNode; + int nNode; + int iOff; /* Current offset within aNode[] */ + + /* Output variables. Containing the current node entry. */ + sqlite3_int64 iChild; /* Pointer to child node */ + Blob term; /* Current term */ + const char *aDoclist; /* Pointer to doclist */ + int nDoclist; /* Size of doclist in bytes */ +}; + +/* +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, if the allocation at pBlob->a is not already at least nMin +** bytes in size, extend (realloc) it to be so. +** +** If an OOM error occurs, set *pRc to SQLITE_NOMEM and leave pBlob->a +** unmodified. Otherwise, if the allocation succeeds, update pBlob->nAlloc +** to reflect the new size of the pBlob->a[] buffer. +*/ +static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){ + if( *pRc==SQLITE_OK && nMin>pBlob->nAlloc ){ + int nAlloc = nMin; + char *a = (char *)sqlite3_realloc(pBlob->a, nAlloc); + if( a ){ + pBlob->nAlloc = nAlloc; + pBlob->a = a; + }else{ + *pRc = SQLITE_NOMEM; + } + } +} + +/* +** Attempt to advance the node-reader object passed as the first argument to +** the next entry on the node. +** +** Return an error code if an error occurs (SQLITE_NOMEM is possible). +** Otherwise return SQLITE_OK. If there is no next entry on the node +** (e.g. because the current entry is the last) set NodeReader->aNode to +** NULL to indicate EOF. Otherwise, populate the NodeReader structure output +** variables for the new entry. +*/ +static int nodeReaderNext(NodeReader *p){ + int bFirst = (p->term.n==0); /* True for first term on the node */ + int nPrefix = 0; /* Bytes to copy from previous term */ + int nSuffix = 0; /* Bytes to append to the prefix */ + int rc = SQLITE_OK; /* Return code */ + + assert( p->aNode ); + if( p->iChild && bFirst==0 ) p->iChild++; + if( p->iOff>=p->nNode ){ + /* EOF */ + p->aNode = 0; + }else{ + if( bFirst==0 ){ + p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &nPrefix); + } + p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &nSuffix); + + if( nPrefix>p->term.n || nSuffix>p->nNode-p->iOff || nSuffix==0 ){ + return FTS_CORRUPT_VTAB; + } + blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc); + if( rc==SQLITE_OK ){ + memcpy(&p->term.a[nPrefix], &p->aNode[p->iOff], nSuffix); + p->term.n = nPrefix+nSuffix; + p->iOff += nSuffix; + if( p->iChild==0 ){ + p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist); + if( (p->nNode-p->iOff)nDoclist ){ + return FTS_CORRUPT_VTAB; + } + p->aDoclist = &p->aNode[p->iOff]; + p->iOff += p->nDoclist; + } + } + } + + assert_fts3_nc( p->iOff<=p->nNode ); + return rc; +} + +/* +** Release all dynamic resources held by node-reader object *p. +*/ +static void nodeReaderRelease(NodeReader *p){ + sqlite3_free(p->term.a); +} + +/* +** Initialize a node-reader object to read the node in buffer aNode/nNode. +** +** If successful, SQLITE_OK is returned and the NodeReader object set to +** point to the first entry on the node (if any). Otherwise, an SQLite +** error code is returned. +*/ +static int nodeReaderInit(NodeReader *p, const char *aNode, int nNode){ + memset(p, 0, sizeof(NodeReader)); + p->aNode = aNode; + p->nNode = nNode; + + /* Figure out if this is a leaf or an internal node. */ + if( aNode && aNode[0] ){ + /* An internal node. */ + p->iOff = 1 + sqlite3Fts3GetVarint(&p->aNode[1], &p->iChild); + }else{ + p->iOff = 1; + } + + return aNode ? nodeReaderNext(p) : SQLITE_OK; +} + +/* +** This function is called while writing an FTS segment each time a leaf o +** node is finished and written to disk. The key (zTerm/nTerm) is guaranteed +** to be greater than the largest key on the node just written, but smaller +** than or equal to the first key that will be written to the next leaf +** node. +** +** The block id of the leaf node just written to disk may be found in +** (pWriter->aNodeWriter[0].iBlock) when this function is called. +*/ +static int fts3IncrmergePush( + Fts3Table *p, /* Fts3 table handle */ + IncrmergeWriter *pWriter, /* Writer object */ + const char *zTerm, /* Term to write to internal node */ + int nTerm /* Bytes at zTerm */ +){ + sqlite3_int64 iPtr = pWriter->aNodeWriter[0].iBlock; + int iLayer; + + assert( nTerm>0 ); + for(iLayer=1; ALWAYS(iLayeraNodeWriter[iLayer]; + int rc = SQLITE_OK; + int nPrefix; + int nSuffix; + int nSpace; + + /* Figure out how much space the key will consume if it is written to + ** the current node of layer iLayer. Due to the prefix compression, + ** the space required changes depending on which node the key is to + ** be added to. */ + nPrefix = fts3PrefixCompress(pNode->key.a, pNode->key.n, zTerm, nTerm); + nSuffix = nTerm - nPrefix; + if(nSuffix<=0 ) return FTS_CORRUPT_VTAB; + nSpace = sqlite3Fts3VarintLen(nPrefix); + nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; + + if( pNode->key.n==0 || (pNode->block.n + nSpace)<=p->nNodeSize ){ + /* If the current node of layer iLayer contains zero keys, or if adding + ** the key to it will not cause it to grow to larger than nNodeSize + ** bytes in size, write the key here. */ + + Blob *pBlk = &pNode->block; + if( pBlk->n==0 ){ + blobGrowBuffer(pBlk, p->nNodeSize, &rc); + if( rc==SQLITE_OK ){ + pBlk->a[0] = (char)iLayer; + pBlk->n = 1 + sqlite3Fts3PutVarint(&pBlk->a[1], iPtr); + } + } + blobGrowBuffer(pBlk, pBlk->n + nSpace, &rc); + blobGrowBuffer(&pNode->key, nTerm, &rc); + + if( rc==SQLITE_OK ){ + if( pNode->key.n ){ + pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nPrefix); + } + pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nSuffix); + memcpy(&pBlk->a[pBlk->n], &zTerm[nPrefix], nSuffix); + pBlk->n += nSuffix; + + memcpy(pNode->key.a, zTerm, nTerm); + pNode->key.n = nTerm; + } + }else{ + /* Otherwise, flush the current node of layer iLayer to disk. + ** Then allocate a new, empty sibling node. The key will be written + ** into the parent of this node. */ + rc = fts3WriteSegment(p, pNode->iBlock, pNode->block.a, pNode->block.n); + + assert( pNode->block.nAlloc>=p->nNodeSize ); + pNode->block.a[0] = (char)iLayer; + pNode->block.n = 1 + sqlite3Fts3PutVarint(&pNode->block.a[1], iPtr+1); + + iNextPtr = pNode->iBlock; + pNode->iBlock++; + pNode->key.n = 0; + } + + if( rc!=SQLITE_OK || iNextPtr==0 ) return rc; + iPtr = iNextPtr; + } + + assert( 0 ); + return 0; +} + +/* +** Append a term and (optionally) doclist to the FTS segment node currently +** stored in blob *pNode. The node need not contain any terms, but the +** header must be written before this function is called. +** +** A node header is a single 0x00 byte for a leaf node, or a height varint +** followed by the left-hand-child varint for an internal node. +** +** The term to be appended is passed via arguments zTerm/nTerm. For a +** leaf node, the doclist is passed as aDoclist/nDoclist. For an internal +** node, both aDoclist and nDoclist must be passed 0. +** +** If the size of the value in blob pPrev is zero, then this is the first +** term written to the node. Otherwise, pPrev contains a copy of the +** previous term. Before this function returns, it is updated to contain a +** copy of zTerm/nTerm. +** +** It is assumed that the buffer associated with pNode is already large +** enough to accommodate the new entry. The buffer associated with pPrev +** is extended by this function if requrired. +** +** If an error (i.e. OOM condition) occurs, an SQLite error code is +** returned. Otherwise, SQLITE_OK. +*/ +static int fts3AppendToNode( + Blob *pNode, /* Current node image to append to */ + Blob *pPrev, /* Buffer containing previous term written */ + const char *zTerm, /* New term to write */ + int nTerm, /* Size of zTerm in bytes */ + const char *aDoclist, /* Doclist (or NULL) to write */ + int nDoclist /* Size of aDoclist in bytes */ +){ + int rc = SQLITE_OK; /* Return code */ + int bFirst = (pPrev->n==0); /* True if this is the first term written */ + int nPrefix; /* Size of term prefix in bytes */ + int nSuffix; /* Size of term suffix in bytes */ + + /* Node must have already been started. There must be a doclist for a + ** leaf node, and there must not be a doclist for an internal node. */ + assert( pNode->n>0 ); + assert_fts3_nc( (pNode->a[0]=='\0')==(aDoclist!=0) ); + + blobGrowBuffer(pPrev, nTerm, &rc); + if( rc!=SQLITE_OK ) return rc; + + nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm); + nSuffix = nTerm - nPrefix; + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + memcpy(pPrev->a, zTerm, nTerm); + pPrev->n = nTerm; + + if( bFirst==0 ){ + pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nPrefix); + } + pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nSuffix); + memcpy(&pNode->a[pNode->n], &zTerm[nPrefix], nSuffix); + pNode->n += nSuffix; + + if( aDoclist ){ + pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nDoclist); + memcpy(&pNode->a[pNode->n], aDoclist, nDoclist); + pNode->n += nDoclist; + } + + assert( pNode->n<=pNode->nAlloc ); + + return SQLITE_OK; +} + +/* +** Append the current term and doclist pointed to by cursor pCsr to the +** appendable b-tree segment opened for writing by pWriter. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. +*/ +static int fts3IncrmergeAppend( + Fts3Table *p, /* Fts3 table handle */ + IncrmergeWriter *pWriter, /* Writer object */ + Fts3MultiSegReader *pCsr /* Cursor containing term and doclist */ +){ + const char *zTerm = pCsr->zTerm; + int nTerm = pCsr->nTerm; + const char *aDoclist = pCsr->aDoclist; + int nDoclist = pCsr->nDoclist; + int rc = SQLITE_OK; /* Return code */ + int nSpace; /* Total space in bytes required on leaf */ + int nPrefix; /* Size of prefix shared with previous term */ + int nSuffix; /* Size of suffix (nTerm - nPrefix) */ + NodeWriter *pLeaf; /* Object used to write leaf nodes */ + + pLeaf = &pWriter->aNodeWriter[0]; + nPrefix = fts3PrefixCompress(pLeaf->key.a, pLeaf->key.n, zTerm, nTerm); + nSuffix = nTerm - nPrefix; + + nSpace = sqlite3Fts3VarintLen(nPrefix); + nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; + nSpace += sqlite3Fts3VarintLen(nDoclist) + nDoclist; + + /* If the current block is not empty, and if adding this term/doclist + ** to the current block would make it larger than Fts3Table.nNodeSize + ** bytes, write this block out to the database. */ + if( pLeaf->block.n>0 && (pLeaf->block.n + nSpace)>p->nNodeSize ){ + rc = fts3WriteSegment(p, pLeaf->iBlock, pLeaf->block.a, pLeaf->block.n); + pWriter->nWork++; + + /* Add the current term to the parent node. The term added to the + ** parent must: + ** + ** a) be greater than the largest term on the leaf node just written + ** to the database (still available in pLeaf->key), and + ** + ** b) be less than or equal to the term about to be added to the new + ** leaf node (zTerm/nTerm). + ** + ** In other words, it must be the prefix of zTerm 1 byte longer than + ** the common prefix (if any) of zTerm and pWriter->zTerm. + */ + if( rc==SQLITE_OK ){ + rc = fts3IncrmergePush(p, pWriter, zTerm, nPrefix+1); + } + + /* Advance to the next output block */ + pLeaf->iBlock++; + pLeaf->key.n = 0; + pLeaf->block.n = 0; + + nSuffix = nTerm; + nSpace = 1; + nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; + nSpace += sqlite3Fts3VarintLen(nDoclist) + nDoclist; + } + + pWriter->nLeafData += nSpace; + blobGrowBuffer(&pLeaf->block, pLeaf->block.n + nSpace, &rc); + if( rc==SQLITE_OK ){ + if( pLeaf->block.n==0 ){ + pLeaf->block.n = 1; + pLeaf->block.a[0] = '\0'; + } + rc = fts3AppendToNode( + &pLeaf->block, &pLeaf->key, zTerm, nTerm, aDoclist, nDoclist + ); + } + + return rc; +} + +/* +** This function is called to release all dynamic resources held by the +** merge-writer object pWriter, and if no error has occurred, to flush +** all outstanding node buffers held by pWriter to disk. +** +** If *pRc is not SQLITE_OK when this function is called, then no attempt +** is made to write any data to disk. Instead, this function serves only +** to release outstanding resources. +** +** Otherwise, if *pRc is initially SQLITE_OK and an error occurs while +** flushing buffers to disk, *pRc is set to an SQLite error code before +** returning. +*/ +static void fts3IncrmergeRelease( + Fts3Table *p, /* FTS3 table handle */ + IncrmergeWriter *pWriter, /* Merge-writer object */ + int *pRc /* IN/OUT: Error code */ +){ + int i; /* Used to iterate through non-root layers */ + int iRoot; /* Index of root in pWriter->aNodeWriter */ + NodeWriter *pRoot; /* NodeWriter for root node */ + int rc = *pRc; /* Error code */ + + /* Set iRoot to the index in pWriter->aNodeWriter[] of the output segment + ** root node. If the segment fits entirely on a single leaf node, iRoot + ** will be set to 0. If the root node is the parent of the leaves, iRoot + ** will be 1. And so on. */ + for(iRoot=FTS_MAX_APPENDABLE_HEIGHT-1; iRoot>=0; iRoot--){ + NodeWriter *pNode = &pWriter->aNodeWriter[iRoot]; + if( pNode->block.n>0 ) break; + assert( *pRc || pNode->block.nAlloc==0 ); + assert( *pRc || pNode->key.nAlloc==0 ); + sqlite3_free(pNode->block.a); + sqlite3_free(pNode->key.a); + } + + /* Empty output segment. This is a no-op. */ + if( iRoot<0 ) return; + + /* The entire output segment fits on a single node. Normally, this means + ** the node would be stored as a blob in the "root" column of the %_segdir + ** table. However, this is not permitted in this case. The problem is that + ** space has already been reserved in the %_segments table, and so the + ** start_block and end_block fields of the %_segdir table must be populated. + ** And, by design or by accident, released versions of FTS cannot handle + ** segments that fit entirely on the root node with start_block!=0. + ** + ** Instead, create a synthetic root node that contains nothing but a + ** pointer to the single content node. So that the segment consists of a + ** single leaf and a single interior (root) node. + ** + ** Todo: Better might be to defer allocating space in the %_segments + ** table until we are sure it is needed. + */ + if( iRoot==0 ){ + Blob *pBlock = &pWriter->aNodeWriter[1].block; + blobGrowBuffer(pBlock, 1 + FTS3_VARINT_MAX, &rc); + if( rc==SQLITE_OK ){ + pBlock->a[0] = 0x01; + pBlock->n = 1 + sqlite3Fts3PutVarint( + &pBlock->a[1], pWriter->aNodeWriter[0].iBlock + ); + } + iRoot = 1; + } + pRoot = &pWriter->aNodeWriter[iRoot]; + + /* Flush all currently outstanding nodes to disk. */ + for(i=0; iaNodeWriter[i]; + if( pNode->block.n>0 && rc==SQLITE_OK ){ + rc = fts3WriteSegment(p, pNode->iBlock, pNode->block.a, pNode->block.n); + } + sqlite3_free(pNode->block.a); + sqlite3_free(pNode->key.a); + } + + /* Write the %_segdir record. */ + if( rc==SQLITE_OK ){ + rc = fts3WriteSegdir(p, + pWriter->iAbsLevel+1, /* level */ + pWriter->iIdx, /* idx */ + pWriter->iStart, /* start_block */ + pWriter->aNodeWriter[0].iBlock, /* leaves_end_block */ + pWriter->iEnd, /* end_block */ + (pWriter->bNoLeafData==0 ? pWriter->nLeafData : 0), /* end_block */ + pRoot->block.a, pRoot->block.n /* root */ + ); + } + sqlite3_free(pRoot->block.a); + sqlite3_free(pRoot->key.a); + + *pRc = rc; +} + +/* +** Compare the term in buffer zLhs (size in bytes nLhs) with that in +** zRhs (size in bytes nRhs) using memcmp. If one term is a prefix of +** the other, it is considered to be smaller than the other. +** +** Return -ve if zLhs is smaller than zRhs, 0 if it is equal, or +ve +** if it is greater. +*/ +static int fts3TermCmp( + const char *zLhs, int nLhs, /* LHS of comparison */ + const char *zRhs, int nRhs /* RHS of comparison */ +){ + int nCmp = MIN(nLhs, nRhs); + int res; + + res = (nCmp ? memcmp(zLhs, zRhs, nCmp) : 0); + if( res==0 ) res = nLhs - nRhs; + + return res; +} + + +/* +** Query to see if the entry in the %_segments table with blockid iEnd is +** NULL. If no error occurs and the entry is NULL, set *pbRes 1 before +** returning. Otherwise, set *pbRes to 0. +** +** Or, if an error occurs while querying the database, return an SQLite +** error code. The final value of *pbRes is undefined in this case. +** +** This is used to test if a segment is an "appendable" segment. If it +** is, then a NULL entry has been inserted into the %_segments table +** with blockid %_segdir.end_block. +*/ +static int fts3IsAppendable(Fts3Table *p, sqlite3_int64 iEnd, int *pbRes){ + int bRes = 0; /* Result to set *pbRes to */ + sqlite3_stmt *pCheck = 0; /* Statement to query database with */ + int rc; /* Return code */ + + rc = fts3SqlStmt(p, SQL_SEGMENT_IS_APPENDABLE, &pCheck, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pCheck, 1, iEnd); + if( SQLITE_ROW==sqlite3_step(pCheck) ) bRes = 1; + rc = sqlite3_reset(pCheck); + } + + *pbRes = bRes; + return rc; +} + +/* +** This function is called when initializing an incremental-merge operation. +** It checks if the existing segment with index value iIdx at absolute level +** (iAbsLevel+1) can be appended to by the incremental merge. If it can, the +** merge-writer object *pWriter is initialized to write to it. +** +** An existing segment can be appended to by an incremental merge if: +** +** * It was initially created as an appendable segment (with all required +** space pre-allocated), and +** +** * The first key read from the input (arguments zKey and nKey) is +** greater than the largest key currently stored in the potential +** output segment. +*/ +static int fts3IncrmergeLoad( + Fts3Table *p, /* Fts3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level of input segments */ + int iIdx, /* Index of candidate output segment */ + const char *zKey, /* First key to write */ + int nKey, /* Number of bytes in nKey */ + IncrmergeWriter *pWriter /* Populate this object */ +){ + int rc; /* Return code */ + sqlite3_stmt *pSelect = 0; /* SELECT to read %_segdir entry */ + + rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR, &pSelect, 0); + if( rc==SQLITE_OK ){ + sqlite3_int64 iStart = 0; /* Value of %_segdir.start_block */ + sqlite3_int64 iLeafEnd = 0; /* Value of %_segdir.leaves_end_block */ + sqlite3_int64 iEnd = 0; /* Value of %_segdir.end_block */ + const char *aRoot = 0; /* Pointer to %_segdir.root buffer */ + int nRoot = 0; /* Size of aRoot[] in bytes */ + int rc2; /* Return code from sqlite3_reset() */ + int bAppendable = 0; /* Set to true if segment is appendable */ + + /* Read the %_segdir entry for index iIdx absolute level (iAbsLevel+1) */ + sqlite3_bind_int64(pSelect, 1, iAbsLevel+1); + sqlite3_bind_int(pSelect, 2, iIdx); + if( sqlite3_step(pSelect)==SQLITE_ROW ){ + iStart = sqlite3_column_int64(pSelect, 1); + iLeafEnd = sqlite3_column_int64(pSelect, 2); + fts3ReadEndBlockField(pSelect, 3, &iEnd, &pWriter->nLeafData); + if( pWriter->nLeafData<0 ){ + pWriter->nLeafData = pWriter->nLeafData * -1; + } + pWriter->bNoLeafData = (pWriter->nLeafData==0); + nRoot = sqlite3_column_bytes(pSelect, 4); + aRoot = sqlite3_column_blob(pSelect, 4); + if( aRoot==0 ){ + sqlite3_reset(pSelect); + return nRoot ? SQLITE_NOMEM : FTS_CORRUPT_VTAB; + } + }else{ + return sqlite3_reset(pSelect); + } + + /* Check for the zero-length marker in the %_segments table */ + rc = fts3IsAppendable(p, iEnd, &bAppendable); + + /* Check that zKey/nKey is larger than the largest key the candidate */ + if( rc==SQLITE_OK && bAppendable ){ + char *aLeaf = 0; + int nLeaf = 0; + + rc = sqlite3Fts3ReadBlock(p, iLeafEnd, &aLeaf, &nLeaf, 0); + if( rc==SQLITE_OK ){ + NodeReader reader; + for(rc = nodeReaderInit(&reader, aLeaf, nLeaf); + rc==SQLITE_OK && reader.aNode; + rc = nodeReaderNext(&reader) + ){ + assert( reader.aNode ); + } + if( fts3TermCmp(zKey, nKey, reader.term.a, reader.term.n)<=0 ){ + bAppendable = 0; + } + nodeReaderRelease(&reader); + } + sqlite3_free(aLeaf); + } + + if( rc==SQLITE_OK && bAppendable ){ + /* It is possible to append to this segment. Set up the IncrmergeWriter + ** object to do so. */ + int i; + int nHeight = (int)aRoot[0]; + NodeWriter *pNode; + if( nHeight<1 || nHeight>FTS_MAX_APPENDABLE_HEIGHT ){ + sqlite3_reset(pSelect); + return FTS_CORRUPT_VTAB; + } + + pWriter->nLeafEst = (int)((iEnd - iStart) + 1)/FTS_MAX_APPENDABLE_HEIGHT; + pWriter->iStart = iStart; + pWriter->iEnd = iEnd; + pWriter->iAbsLevel = iAbsLevel; + pWriter->iIdx = iIdx; + + for(i=nHeight+1; iaNodeWriter[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst; + } + + pNode = &pWriter->aNodeWriter[nHeight]; + pNode->iBlock = pWriter->iStart + pWriter->nLeafEst*nHeight; + blobGrowBuffer(&pNode->block, + MAX(nRoot, p->nNodeSize)+FTS3_NODE_PADDING, &rc + ); + if( rc==SQLITE_OK ){ + memcpy(pNode->block.a, aRoot, nRoot); + pNode->block.n = nRoot; + memset(&pNode->block.a[nRoot], 0, FTS3_NODE_PADDING); + } + + for(i=nHeight; i>=0 && rc==SQLITE_OK; i--){ + NodeReader reader; + pNode = &pWriter->aNodeWriter[i]; + + if( pNode->block.a){ + rc = nodeReaderInit(&reader, pNode->block.a, pNode->block.n); + while( reader.aNode && rc==SQLITE_OK ) rc = nodeReaderNext(&reader); + blobGrowBuffer(&pNode->key, reader.term.n, &rc); + if( rc==SQLITE_OK ){ + memcpy(pNode->key.a, reader.term.a, reader.term.n); + pNode->key.n = reader.term.n; + if( i>0 ){ + char *aBlock = 0; + int nBlock = 0; + pNode = &pWriter->aNodeWriter[i-1]; + pNode->iBlock = reader.iChild; + rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock, 0); + blobGrowBuffer(&pNode->block, + MAX(nBlock, p->nNodeSize)+FTS3_NODE_PADDING, &rc + ); + if( rc==SQLITE_OK ){ + memcpy(pNode->block.a, aBlock, nBlock); + pNode->block.n = nBlock; + memset(&pNode->block.a[nBlock], 0, FTS3_NODE_PADDING); + } + sqlite3_free(aBlock); + } + } + } + nodeReaderRelease(&reader); + } + } + + rc2 = sqlite3_reset(pSelect); + if( rc==SQLITE_OK ) rc = rc2; + } + + return rc; +} + +/* +** Determine the largest segment index value that exists within absolute +** level iAbsLevel+1. If no error occurs, set *piIdx to this value plus +** one before returning SQLITE_OK. Or, if there are no segments at all +** within level iAbsLevel, set *piIdx to zero. +** +** If an error occurs, return an SQLite error code. The final value of +** *piIdx is undefined in this case. +*/ +static int fts3IncrmergeOutputIdx( + Fts3Table *p, /* FTS Table handle */ + sqlite3_int64 iAbsLevel, /* Absolute index of input segments */ + int *piIdx /* OUT: Next free index at iAbsLevel+1 */ +){ + int rc; + sqlite3_stmt *pOutputIdx = 0; /* SQL used to find output index */ + + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENT_INDEX, &pOutputIdx, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pOutputIdx, 1, iAbsLevel+1); + sqlite3_step(pOutputIdx); + *piIdx = sqlite3_column_int(pOutputIdx, 0); + rc = sqlite3_reset(pOutputIdx); + } + + return rc; +} + +/* +** Allocate an appendable output segment on absolute level iAbsLevel+1 +** with idx value iIdx. +** +** In the %_segdir table, a segment is defined by the values in three +** columns: +** +** start_block +** leaves_end_block +** end_block +** +** When an appendable segment is allocated, it is estimated that the +** maximum number of leaf blocks that may be required is the sum of the +** number of leaf blocks consumed by the input segments, plus the number +** of input segments, multiplied by two. This value is stored in stack +** variable nLeafEst. +** +** A total of 16*nLeafEst blocks are allocated when an appendable segment +** is created ((1 + end_block - start_block)==16*nLeafEst). The contiguous +** array of leaf nodes starts at the first block allocated. The array +** of interior nodes that are parents of the leaf nodes start at block +** (start_block + (1 + end_block - start_block) / 16). And so on. +** +** In the actual code below, the value "16" is replaced with the +** pre-processor macro FTS_MAX_APPENDABLE_HEIGHT. +*/ +static int fts3IncrmergeWriter( + Fts3Table *p, /* Fts3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level of input segments */ + int iIdx, /* Index of new output segment */ + Fts3MultiSegReader *pCsr, /* Cursor that data will be read from */ + IncrmergeWriter *pWriter /* Populate this object */ +){ + int rc; /* Return Code */ + int i; /* Iterator variable */ + int nLeafEst = 0; /* Blocks allocated for leaf nodes */ + sqlite3_stmt *pLeafEst = 0; /* SQL used to determine nLeafEst */ + sqlite3_stmt *pFirstBlock = 0; /* SQL used to determine first block */ + + /* Calculate nLeafEst. */ + rc = fts3SqlStmt(p, SQL_MAX_LEAF_NODE_ESTIMATE, &pLeafEst, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pLeafEst, 1, iAbsLevel); + sqlite3_bind_int64(pLeafEst, 2, pCsr->nSegment); + if( SQLITE_ROW==sqlite3_step(pLeafEst) ){ + nLeafEst = sqlite3_column_int(pLeafEst, 0); + } + rc = sqlite3_reset(pLeafEst); + } + if( rc!=SQLITE_OK ) return rc; + + /* Calculate the first block to use in the output segment */ + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENTS_ID, &pFirstBlock, 0); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pFirstBlock) ){ + pWriter->iStart = sqlite3_column_int64(pFirstBlock, 0); + pWriter->iEnd = pWriter->iStart - 1; + pWriter->iEnd += nLeafEst * FTS_MAX_APPENDABLE_HEIGHT; + } + rc = sqlite3_reset(pFirstBlock); + } + if( rc!=SQLITE_OK ) return rc; + + /* Insert the marker in the %_segments table to make sure nobody tries + ** to steal the space just allocated. This is also used to identify + ** appendable segments. */ + rc = fts3WriteSegment(p, pWriter->iEnd, 0, 0); + if( rc!=SQLITE_OK ) return rc; + + pWriter->iAbsLevel = iAbsLevel; + pWriter->nLeafEst = nLeafEst; + pWriter->iIdx = iIdx; + + /* Set up the array of NodeWriter objects */ + for(i=0; iaNodeWriter[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst; + } + return SQLITE_OK; +} + +/* +** Remove an entry from the %_segdir table. This involves running the +** following two statements: +** +** DELETE FROM %_segdir WHERE level = :iAbsLevel AND idx = :iIdx +** UPDATE %_segdir SET idx = idx - 1 WHERE level = :iAbsLevel AND idx > :iIdx +** +** The DELETE statement removes the specific %_segdir level. The UPDATE +** statement ensures that the remaining segments have contiguously allocated +** idx values. +*/ +static int fts3RemoveSegdirEntry( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level to delete from */ + int iIdx /* Index of %_segdir entry to delete */ +){ + int rc; /* Return code */ + sqlite3_stmt *pDelete = 0; /* DELETE statement */ + + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_ENTRY, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDelete, 1, iAbsLevel); + sqlite3_bind_int(pDelete, 2, iIdx); + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } + + return rc; +} + +/* +** One or more segments have just been removed from absolute level iAbsLevel. +** Update the 'idx' values of the remaining segments in the level so that +** the idx values are a contiguous sequence starting from 0. +*/ +static int fts3RepackSegdirLevel( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel /* Absolute level to repack */ +){ + int rc; /* Return code */ + int *aIdx = 0; /* Array of remaining idx values */ + int nIdx = 0; /* Valid entries in aIdx[] */ + int nAlloc = 0; /* Allocated size of aIdx[] */ + int i; /* Iterator variable */ + sqlite3_stmt *pSelect = 0; /* Select statement to read idx values */ + sqlite3_stmt *pUpdate = 0; /* Update statement to modify idx values */ + + rc = fts3SqlStmt(p, SQL_SELECT_INDEXES, &pSelect, 0); + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int64(pSelect, 1, iAbsLevel); + while( SQLITE_ROW==sqlite3_step(pSelect) ){ + if( nIdx>=nAlloc ){ + int *aNew; + nAlloc += 16; + aNew = sqlite3_realloc(aIdx, nAlloc*sizeof(int)); + if( !aNew ){ + rc = SQLITE_NOMEM; + break; + } + aIdx = aNew; + } + aIdx[nIdx++] = sqlite3_column_int(pSelect, 0); + } + rc2 = sqlite3_reset(pSelect); + if( rc==SQLITE_OK ) rc = rc2; + } + + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_SHIFT_SEGDIR_ENTRY, &pUpdate, 0); + } + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pUpdate, 2, iAbsLevel); + } + + assert( p->bIgnoreSavepoint==0 ); + p->bIgnoreSavepoint = 1; + for(i=0; rc==SQLITE_OK && ibIgnoreSavepoint = 0; + + sqlite3_free(aIdx); + return rc; +} + +static void fts3StartNode(Blob *pNode, int iHeight, sqlite3_int64 iChild){ + pNode->a[0] = (char)iHeight; + if( iChild ){ + assert( pNode->nAlloc>=1+sqlite3Fts3VarintLen(iChild) ); + pNode->n = 1 + sqlite3Fts3PutVarint(&pNode->a[1], iChild); + }else{ + assert( pNode->nAlloc>=1 ); + pNode->n = 1; + } +} + +/* +** The first two arguments are a pointer to and the size of a segment b-tree +** node. The node may be a leaf or an internal node. +** +** This function creates a new node image in blob object *pNew by copying +** all terms that are greater than or equal to zTerm/nTerm (for leaf nodes) +** or greater than zTerm/nTerm (for internal nodes) from aNode/nNode. +*/ +static int fts3TruncateNode( + const char *aNode, /* Current node image */ + int nNode, /* Size of aNode in bytes */ + Blob *pNew, /* OUT: Write new node image here */ + const char *zTerm, /* Omit all terms smaller than this */ + int nTerm, /* Size of zTerm in bytes */ + sqlite3_int64 *piBlock /* OUT: Block number in next layer down */ +){ + NodeReader reader; /* Reader object */ + Blob prev = {0, 0, 0}; /* Previous term written to new node */ + int rc = SQLITE_OK; /* Return code */ + int bLeaf; /* True for a leaf node */ + + if( nNode<1 ) return FTS_CORRUPT_VTAB; + bLeaf = aNode[0]=='\0'; + + /* Allocate required output space */ + blobGrowBuffer(pNew, nNode, &rc); + if( rc!=SQLITE_OK ) return rc; + pNew->n = 0; + + /* Populate new node buffer */ + for(rc = nodeReaderInit(&reader, aNode, nNode); + rc==SQLITE_OK && reader.aNode; + rc = nodeReaderNext(&reader) + ){ + if( pNew->n==0 ){ + int res = fts3TermCmp(reader.term.a, reader.term.n, zTerm, nTerm); + if( res<0 || (bLeaf==0 && res==0) ) continue; + fts3StartNode(pNew, (int)aNode[0], reader.iChild); + *piBlock = reader.iChild; + } + rc = fts3AppendToNode( + pNew, &prev, reader.term.a, reader.term.n, + reader.aDoclist, reader.nDoclist + ); + if( rc!=SQLITE_OK ) break; + } + if( pNew->n==0 ){ + fts3StartNode(pNew, (int)aNode[0], reader.iChild); + *piBlock = reader.iChild; + } + assert( pNew->n<=pNew->nAlloc ); + + nodeReaderRelease(&reader); + sqlite3_free(prev.a); + return rc; +} + +/* +** Remove all terms smaller than zTerm/nTerm from segment iIdx in absolute +** level iAbsLevel. This may involve deleting entries from the %_segments +** table, and modifying existing entries in both the %_segments and %_segdir +** tables. +** +** SQLITE_OK is returned if the segment is updated successfully. Or an +** SQLite error code otherwise. +*/ +static int fts3TruncateSegment( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level of segment to modify */ + int iIdx, /* Index within level of segment to modify */ + const char *zTerm, /* Remove terms smaller than this */ + int nTerm /* Number of bytes in buffer zTerm */ +){ + int rc = SQLITE_OK; /* Return code */ + Blob root = {0,0,0}; /* New root page image */ + Blob block = {0,0,0}; /* Buffer used for any other block */ + sqlite3_int64 iBlock = 0; /* Block id */ + sqlite3_int64 iNewStart = 0; /* New value for iStartBlock */ + sqlite3_int64 iOldStart = 0; /* Old value for iStartBlock */ + sqlite3_stmt *pFetch = 0; /* Statement used to fetch segdir */ + + rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR, &pFetch, 0); + if( rc==SQLITE_OK ){ + int rc2; /* sqlite3_reset() return code */ + sqlite3_bind_int64(pFetch, 1, iAbsLevel); + sqlite3_bind_int(pFetch, 2, iIdx); + if( SQLITE_ROW==sqlite3_step(pFetch) ){ + const char *aRoot = sqlite3_column_blob(pFetch, 4); + int nRoot = sqlite3_column_bytes(pFetch, 4); + iOldStart = sqlite3_column_int64(pFetch, 1); + rc = fts3TruncateNode(aRoot, nRoot, &root, zTerm, nTerm, &iBlock); + } + rc2 = sqlite3_reset(pFetch); + if( rc==SQLITE_OK ) rc = rc2; + } + + while( rc==SQLITE_OK && iBlock ){ + char *aBlock = 0; + int nBlock = 0; + iNewStart = iBlock; + + rc = sqlite3Fts3ReadBlock(p, iBlock, &aBlock, &nBlock, 0); + if( rc==SQLITE_OK ){ + rc = fts3TruncateNode(aBlock, nBlock, &block, zTerm, nTerm, &iBlock); + } + if( rc==SQLITE_OK ){ + rc = fts3WriteSegment(p, iNewStart, block.a, block.n); + } + sqlite3_free(aBlock); + } + + /* Variable iNewStart now contains the first valid leaf node. */ + if( rc==SQLITE_OK && iNewStart ){ + sqlite3_stmt *pDel = 0; + rc = fts3SqlStmt(p, SQL_DELETE_SEGMENTS_RANGE, &pDel, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDel, 1, iOldStart); + sqlite3_bind_int64(pDel, 2, iNewStart-1); + sqlite3_step(pDel); + rc = sqlite3_reset(pDel); + } + } + + if( rc==SQLITE_OK ){ + sqlite3_stmt *pChomp = 0; + rc = fts3SqlStmt(p, SQL_CHOMP_SEGDIR, &pChomp, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pChomp, 1, iNewStart); + sqlite3_bind_blob(pChomp, 2, root.a, root.n, SQLITE_STATIC); + sqlite3_bind_int64(pChomp, 3, iAbsLevel); + sqlite3_bind_int(pChomp, 4, iIdx); + sqlite3_step(pChomp); + rc = sqlite3_reset(pChomp); + sqlite3_bind_null(pChomp, 2); + } + } + + sqlite3_free(root.a); + sqlite3_free(block.a); + return rc; +} + +/* +** This function is called after an incrmental-merge operation has run to +** merge (or partially merge) two or more segments from absolute level +** iAbsLevel. +** +** Each input segment is either removed from the db completely (if all of +** its data was copied to the output segment by the incrmerge operation) +** or modified in place so that it no longer contains those entries that +** have been duplicated in the output segment. +*/ +static int fts3IncrmergeChomp( + Fts3Table *p, /* FTS table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level containing segments */ + Fts3MultiSegReader *pCsr, /* Chomp all segments opened by this cursor */ + int *pnRem /* Number of segments not deleted */ +){ + int i; + int nRem = 0; + int rc = SQLITE_OK; + + for(i=pCsr->nSegment-1; i>=0 && rc==SQLITE_OK; i--){ + Fts3SegReader *pSeg = 0; + int j; + + /* Find the Fts3SegReader object with Fts3SegReader.iIdx==i. It is hiding + ** somewhere in the pCsr->apSegment[] array. */ + for(j=0; ALWAYS(jnSegment); j++){ + pSeg = pCsr->apSegment[j]; + if( pSeg->iIdx==i ) break; + } + assert( jnSegment && pSeg->iIdx==i ); + + if( pSeg->aNode==0 ){ + /* Seg-reader is at EOF. Remove the entire input segment. */ + rc = fts3DeleteSegment(p, pSeg); + if( rc==SQLITE_OK ){ + rc = fts3RemoveSegdirEntry(p, iAbsLevel, pSeg->iIdx); + } + *pnRem = 0; + }else{ + /* The incremental merge did not copy all the data from this + ** segment to the upper level. The segment is modified in place + ** so that it contains no keys smaller than zTerm/nTerm. */ + const char *zTerm = pSeg->zTerm; + int nTerm = pSeg->nTerm; + rc = fts3TruncateSegment(p, iAbsLevel, pSeg->iIdx, zTerm, nTerm); + nRem++; + } + } + + if( rc==SQLITE_OK && nRem!=pCsr->nSegment ){ + rc = fts3RepackSegdirLevel(p, iAbsLevel); + } + + *pnRem = nRem; + return rc; +} + +/* +** Store an incr-merge hint in the database. +*/ +static int fts3IncrmergeHintStore(Fts3Table *p, Blob *pHint){ + sqlite3_stmt *pReplace = 0; + int rc; /* Return code */ + + rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pReplace, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pReplace, 1, FTS_STAT_INCRMERGEHINT); + sqlite3_bind_blob(pReplace, 2, pHint->a, pHint->n, SQLITE_STATIC); + sqlite3_step(pReplace); + rc = sqlite3_reset(pReplace); + sqlite3_bind_null(pReplace, 2); + } + + return rc; +} + +/* +** Load an incr-merge hint from the database. The incr-merge hint, if one +** exists, is stored in the rowid==1 row of the %_stat table. +** +** If successful, populate blob *pHint with the value read from the %_stat +** table and return SQLITE_OK. Otherwise, if an error occurs, return an +** SQLite error code. +*/ +static int fts3IncrmergeHintLoad(Fts3Table *p, Blob *pHint){ + sqlite3_stmt *pSelect = 0; + int rc; + + pHint->n = 0; + rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pSelect, 0); + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int(pSelect, 1, FTS_STAT_INCRMERGEHINT); + if( SQLITE_ROW==sqlite3_step(pSelect) ){ + const char *aHint = sqlite3_column_blob(pSelect, 0); + int nHint = sqlite3_column_bytes(pSelect, 0); + if( aHint ){ + blobGrowBuffer(pHint, nHint, &rc); + if( rc==SQLITE_OK ){ + memcpy(pHint->a, aHint, nHint); + pHint->n = nHint; + } + } + } + rc2 = sqlite3_reset(pSelect); + if( rc==SQLITE_OK ) rc = rc2; + } + + return rc; +} + +/* +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, append an entry to the hint stored in blob *pHint. Each entry +** consists of two varints, the absolute level number of the input segments +** and the number of input segments. +** +** If successful, leave *pRc set to SQLITE_OK and return. If an error occurs, +** set *pRc to an SQLite error code before returning. +*/ +static void fts3IncrmergeHintPush( + Blob *pHint, /* Hint blob to append to */ + i64 iAbsLevel, /* First varint to store in hint */ + int nInput, /* Second varint to store in hint */ + int *pRc /* IN/OUT: Error code */ +){ + blobGrowBuffer(pHint, pHint->n + 2*FTS3_VARINT_MAX, pRc); + if( *pRc==SQLITE_OK ){ + pHint->n += sqlite3Fts3PutVarint(&pHint->a[pHint->n], iAbsLevel); + pHint->n += sqlite3Fts3PutVarint(&pHint->a[pHint->n], (i64)nInput); + } +} + +/* +** Read the last entry (most recently pushed) from the hint blob *pHint +** and then remove the entry. Write the two values read to *piAbsLevel and +** *pnInput before returning. +** +** If no error occurs, return SQLITE_OK. If the hint blob in *pHint does +** not contain at least two valid varints, return SQLITE_CORRUPT_VTAB. +*/ +static int fts3IncrmergeHintPop(Blob *pHint, i64 *piAbsLevel, int *pnInput){ + const int nHint = pHint->n; + int i; + + i = pHint->n-1; + if( (pHint->a[i] & 0x80) ) return FTS_CORRUPT_VTAB; + while( i>0 && (pHint->a[i-1] & 0x80) ) i--; + if( i==0 ) return FTS_CORRUPT_VTAB; + i--; + while( i>0 && (pHint->a[i-1] & 0x80) ) i--; + + pHint->n = i; + i += sqlite3Fts3GetVarint(&pHint->a[i], piAbsLevel); + i += fts3GetVarint32(&pHint->a[i], pnInput); + assert( i<=nHint ); + if( i!=nHint ) return FTS_CORRUPT_VTAB; + + return SQLITE_OK; +} + + +/* +** Attempt an incremental merge that writes nMerge leaf blocks. +** +** Incremental merges happen nMin segments at a time. The segments +** to be merged are the nMin oldest segments (the ones with the smallest +** values for the _segdir.idx field) in the highest level that contains +** at least nMin segments. Multiple merges might occur in an attempt to +** write the quota of nMerge leaf blocks. +*/ +SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ + int rc; /* Return code */ + int nRem = nMerge; /* Number of leaf pages yet to be written */ + Fts3MultiSegReader *pCsr; /* Cursor used to read input data */ + Fts3SegFilter *pFilter; /* Filter used with cursor pCsr */ + IncrmergeWriter *pWriter; /* Writer object */ + int nSeg = 0; /* Number of input segments */ + sqlite3_int64 iAbsLevel = 0; /* Absolute level number to work on */ + Blob hint = {0, 0, 0}; /* Hint read from %_stat table */ + int bDirtyHint = 0; /* True if blob 'hint' has been modified */ + + /* Allocate space for the cursor, filter and writer objects */ + const int nAlloc = sizeof(*pCsr) + sizeof(*pFilter) + sizeof(*pWriter); + pWriter = (IncrmergeWriter *)sqlite3_malloc(nAlloc); + if( !pWriter ) return SQLITE_NOMEM; + pFilter = (Fts3SegFilter *)&pWriter[1]; + pCsr = (Fts3MultiSegReader *)&pFilter[1]; + + rc = fts3IncrmergeHintLoad(p, &hint); + while( rc==SQLITE_OK && nRem>0 ){ + const i64 nMod = FTS3_SEGDIR_MAXLEVEL * p->nIndex; + sqlite3_stmt *pFindLevel = 0; /* SQL used to determine iAbsLevel */ + int bUseHint = 0; /* True if attempting to append */ + int iIdx = 0; /* Largest idx in level (iAbsLevel+1) */ + + /* Search the %_segdir table for the absolute level with the smallest + ** relative level number that contains at least nMin segments, if any. + ** If one is found, set iAbsLevel to the absolute level number and + ** nSeg to nMin. If no level with at least nMin segments can be found, + ** set nSeg to -1. + */ + rc = fts3SqlStmt(p, SQL_FIND_MERGE_LEVEL, &pFindLevel, 0); + sqlite3_bind_int(pFindLevel, 1, MAX(2, nMin)); + if( sqlite3_step(pFindLevel)==SQLITE_ROW ){ + iAbsLevel = sqlite3_column_int64(pFindLevel, 0); + nSeg = sqlite3_column_int(pFindLevel, 1); + assert( nSeg>=2 ); + }else{ + nSeg = -1; + } + rc = sqlite3_reset(pFindLevel); + + /* If the hint read from the %_stat table is not empty, check if the + ** last entry in it specifies a relative level smaller than or equal + ** to the level identified by the block above (if any). If so, this + ** iteration of the loop will work on merging at the hinted level. + */ + if( rc==SQLITE_OK && hint.n ){ + int nHint = hint.n; + sqlite3_int64 iHintAbsLevel = 0; /* Hint level */ + int nHintSeg = 0; /* Hint number of segments */ + + rc = fts3IncrmergeHintPop(&hint, &iHintAbsLevel, &nHintSeg); + if( nSeg<0 || (iAbsLevel % nMod) >= (iHintAbsLevel % nMod) ){ + /* Based on the scan in the block above, it is known that there + ** are no levels with a relative level smaller than that of + ** iAbsLevel with more than nSeg segments, or if nSeg is -1, + ** no levels with more than nMin segments. Use this to limit the + ** value of nHintSeg to avoid a large memory allocation in case the + ** merge-hint is corrupt*/ + iAbsLevel = iHintAbsLevel; + nSeg = MIN(MAX(nMin,nSeg), nHintSeg); + bUseHint = 1; + bDirtyHint = 1; + }else{ + /* This undoes the effect of the HintPop() above - so that no entry + ** is removed from the hint blob. */ + hint.n = nHint; + } + } + + /* If nSeg is less that zero, then there is no level with at least + ** nMin segments and no hint in the %_stat table. No work to do. + ** Exit early in this case. */ + if( nSeg<=0 ) break; + + assert( nMod<=0x7FFFFFFF ); + if( iAbsLevel<0 || iAbsLevel>(nMod<<32) ){ + rc = FTS_CORRUPT_VTAB; + break; + } + + /* Open a cursor to iterate through the contents of the oldest nSeg + ** indexes of absolute level iAbsLevel. If this cursor is opened using + ** the 'hint' parameters, it is possible that there are less than nSeg + ** segments available in level iAbsLevel. In this case, no work is + ** done on iAbsLevel - fall through to the next iteration of the loop + ** to start work on some other level. */ + memset(pWriter, 0, nAlloc); + pFilter->flags = FTS3_SEGMENT_REQUIRE_POS; + + if( rc==SQLITE_OK ){ + rc = fts3IncrmergeOutputIdx(p, iAbsLevel, &iIdx); + assert( bUseHint==1 || bUseHint==0 ); + if( iIdx==0 || (bUseHint && iIdx==1) ){ + int bIgnore = 0; + rc = fts3SegmentIsMaxLevel(p, iAbsLevel+1, &bIgnore); + if( bIgnore ){ + pFilter->flags |= FTS3_SEGMENT_IGNORE_EMPTY; + } + } + } + + if( rc==SQLITE_OK ){ + rc = fts3IncrmergeCsr(p, iAbsLevel, nSeg, pCsr); + } + if( SQLITE_OK==rc && pCsr->nSegment==nSeg + && SQLITE_OK==(rc = sqlite3Fts3SegReaderStart(p, pCsr, pFilter)) + ){ + int bEmpty = 0; + rc = sqlite3Fts3SegReaderStep(p, pCsr); + if( rc==SQLITE_OK ){ + bEmpty = 1; + }else if( rc!=SQLITE_ROW ){ + sqlite3Fts3SegReaderFinish(pCsr); + break; + } + if( bUseHint && iIdx>0 ){ + const char *zKey = pCsr->zTerm; + int nKey = pCsr->nTerm; + rc = fts3IncrmergeLoad(p, iAbsLevel, iIdx-1, zKey, nKey, pWriter); + }else{ + rc = fts3IncrmergeWriter(p, iAbsLevel, iIdx, pCsr, pWriter); + } + + if( rc==SQLITE_OK && pWriter->nLeafEst ){ + fts3LogMerge(nSeg, iAbsLevel); + if( bEmpty==0 ){ + do { + rc = fts3IncrmergeAppend(p, pWriter, pCsr); + if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, pCsr); + if( pWriter->nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK; + }while( rc==SQLITE_ROW ); + } + + /* Update or delete the input segments */ + if( rc==SQLITE_OK ){ + nRem -= (1 + pWriter->nWork); + rc = fts3IncrmergeChomp(p, iAbsLevel, pCsr, &nSeg); + if( nSeg!=0 ){ + bDirtyHint = 1; + fts3IncrmergeHintPush(&hint, iAbsLevel, nSeg, &rc); + } + } + } + + if( nSeg!=0 ){ + pWriter->nLeafData = pWriter->nLeafData * -1; + } + fts3IncrmergeRelease(p, pWriter, &rc); + if( nSeg==0 && pWriter->bNoLeafData==0 ){ + fts3PromoteSegments(p, iAbsLevel+1, pWriter->nLeafData); + } + } + + sqlite3Fts3SegReaderFinish(pCsr); + } + + /* Write the hint values into the %_stat table for the next incr-merger */ + if( bDirtyHint && rc==SQLITE_OK ){ + rc = fts3IncrmergeHintStore(p, &hint); + } + + sqlite3_free(pWriter); + sqlite3_free(hint.a); + return rc; +} + +/* +** Convert the text beginning at *pz into an integer and return +** its value. Advance *pz to point to the first character past +** the integer. +** +** This function used for parameters to merge= and incrmerge= +** commands. +*/ +static int fts3Getint(const char **pz){ + const char *z = *pz; + int i = 0; + while( (*z)>='0' && (*z)<='9' && i<214748363 ) i = 10*i + *(z++) - '0'; + *pz = z; + return i; +} + +/* +** Process statements of the form: +** +** INSERT INTO table(table) VALUES('merge=A,B'); +** +** A and B are integers that decode to be the number of leaf pages +** written for the merge, and the minimum number of segments on a level +** before it will be selected for a merge, respectively. +*/ +static int fts3DoIncrmerge( + Fts3Table *p, /* FTS3 table handle */ + const char *zParam /* Nul-terminated string containing "A,B" */ +){ + int rc; + int nMin = (MergeCount(p) / 2); + int nMerge = 0; + const char *z = zParam; + + /* Read the first integer value */ + nMerge = fts3Getint(&z); + + /* If the first integer value is followed by a ',', read the second + ** integer value. */ + if( z[0]==',' && z[1]!='\0' ){ + z++; + nMin = fts3Getint(&z); + } + + if( z[0]!='\0' || nMin<2 ){ + rc = SQLITE_ERROR; + }else{ + rc = SQLITE_OK; + if( !p->bHasStat ){ + assert( p->bFts4==0 ); + sqlite3Fts3CreateStatTable(&rc, p); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3Incrmerge(p, nMerge, nMin); + } + sqlite3Fts3SegmentsClose(p); + } + return rc; +} + +/* +** Process statements of the form: +** +** INSERT INTO table(table) VALUES('automerge=X'); +** +** where X is an integer. X==0 means to turn automerge off. X!=0 means +** turn it on. The setting is persistent. +*/ +static int fts3DoAutoincrmerge( + Fts3Table *p, /* FTS3 table handle */ + const char *zParam /* Nul-terminated string containing boolean */ +){ + int rc = SQLITE_OK; + sqlite3_stmt *pStmt = 0; + p->nAutoincrmerge = fts3Getint(&zParam); + if( p->nAutoincrmerge==1 || p->nAutoincrmerge>MergeCount(p) ){ + p->nAutoincrmerge = 8; + } + if( !p->bHasStat ){ + assert( p->bFts4==0 ); + sqlite3Fts3CreateStatTable(&rc, p); + if( rc ) return rc; + } + rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pStmt, 0); + if( rc ) return rc; + sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE); + sqlite3_bind_int(pStmt, 2, p->nAutoincrmerge); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + return rc; +} + +/* +** Return a 64-bit checksum for the FTS index entry specified by the +** arguments to this function. +*/ +static u64 fts3ChecksumEntry( + const char *zTerm, /* Pointer to buffer containing term */ + int nTerm, /* Size of zTerm in bytes */ + int iLangid, /* Language id for current row */ + int iIndex, /* Index (0..Fts3Table.nIndex-1) */ + i64 iDocid, /* Docid for current row. */ + int iCol, /* Column number */ + int iPos /* Position */ +){ + int i; + u64 ret = (u64)iDocid; + + ret += (ret<<3) + iLangid; + ret += (ret<<3) + iIndex; + ret += (ret<<3) + iCol; + ret += (ret<<3) + iPos; + for(i=0; inIndex-1) */ + int *pRc /* OUT: Return code */ +){ + Fts3SegFilter filter; + Fts3MultiSegReader csr; + int rc; + u64 cksum = 0; + + assert( *pRc==SQLITE_OK ); + + memset(&filter, 0, sizeof(filter)); + memset(&csr, 0, sizeof(csr)); + filter.flags = FTS3_SEGMENT_REQUIRE_POS|FTS3_SEGMENT_IGNORE_EMPTY; + filter.flags |= FTS3_SEGMENT_SCAN; + + rc = sqlite3Fts3SegReaderCursor( + p, iLangid, iIndex, FTS3_SEGCURSOR_ALL, 0, 0, 0, 1,&csr + ); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3SegReaderStart(p, &csr, &filter); + } + + if( rc==SQLITE_OK ){ + while( SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, &csr)) ){ + char *pCsr = csr.aDoclist; + char *pEnd = &pCsr[csr.nDoclist]; + + i64 iDocid = 0; + i64 iCol = 0; + u64 iPos = 0; + + pCsr += sqlite3Fts3GetVarint(pCsr, &iDocid); + while( pCsrbDescIdx ){ + iDocid = (i64)((u64)iDocid - iVal); + }else{ + iDocid = (i64)((u64)iDocid + iVal); + } + } + }else{ + iPos += (iVal - 2); + cksum = cksum ^ fts3ChecksumEntry( + csr.zTerm, csr.nTerm, iLangid, iIndex, iDocid, + (int)iCol, (int)iPos + ); + } + } + } + } + } + sqlite3Fts3SegReaderFinish(&csr); + + *pRc = rc; + return cksum; +} + +/* +** Check if the contents of the FTS index match the current contents of the +** content table. If no error occurs and the contents do match, set *pbOk +** to true and return SQLITE_OK. Or if the contents do not match, set *pbOk +** to false before returning. +** +** If an error occurs (e.g. an OOM or IO error), return an SQLite error +** code. The final value of *pbOk is undefined in this case. +*/ +static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ + int rc = SQLITE_OK; /* Return code */ + u64 cksum1 = 0; /* Checksum based on FTS index contents */ + u64 cksum2 = 0; /* Checksum based on %_content contents */ + sqlite3_stmt *pAllLangid = 0; /* Statement to return all language-ids */ + + /* This block calculates the checksum according to the FTS index. */ + rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int(pAllLangid, 1, p->iPrevLangid); + sqlite3_bind_int(pAllLangid, 2, p->nIndex); + while( rc==SQLITE_OK && sqlite3_step(pAllLangid)==SQLITE_ROW ){ + int iLangid = sqlite3_column_int(pAllLangid, 0); + int i; + for(i=0; inIndex; i++){ + cksum1 = cksum1 ^ fts3ChecksumIndex(p, iLangid, i, &rc); + } + } + rc2 = sqlite3_reset(pAllLangid); + if( rc==SQLITE_OK ) rc = rc2; + } + + /* This block calculates the checksum according to the %_content table */ + if( rc==SQLITE_OK ){ + sqlite3_tokenizer_module const *pModule = p->pTokenizer->pModule; + sqlite3_stmt *pStmt = 0; + char *zSql; + + zSql = sqlite3_mprintf("SELECT %s" , p->zReadExprlist); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + i64 iDocid = sqlite3_column_int64(pStmt, 0); + int iLang = langidFromSelect(p, pStmt); + int iCol; + + for(iCol=0; rc==SQLITE_OK && iColnColumn; iCol++){ + if( p->abNotindexed[iCol]==0 ){ + const char *zText = (const char *)sqlite3_column_text(pStmt, iCol+1); + sqlite3_tokenizer_cursor *pT = 0; + + rc = sqlite3Fts3OpenTokenizer(p->pTokenizer, iLang, zText, -1, &pT); + while( rc==SQLITE_OK ){ + char const *zToken; /* Buffer containing token */ + int nToken = 0; /* Number of bytes in token */ + int iDum1 = 0, iDum2 = 0; /* Dummy variables */ + int iPos = 0; /* Position of token in zText */ + + rc = pModule->xNext(pT, &zToken, &nToken, &iDum1, &iDum2, &iPos); + if( rc==SQLITE_OK ){ + int i; + cksum2 = cksum2 ^ fts3ChecksumEntry( + zToken, nToken, iLang, 0, iDocid, iCol, iPos + ); + for(i=1; inIndex; i++){ + if( p->aIndex[i].nPrefix<=nToken ){ + cksum2 = cksum2 ^ fts3ChecksumEntry( + zToken, p->aIndex[i].nPrefix, iLang, i, iDocid, iCol, iPos + ); + } + } + } + } + if( pT ) pModule->xClose(pT); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + } + } + + sqlite3_finalize(pStmt); + } + + *pbOk = (cksum1==cksum2); + return rc; +} + +/* +** Run the integrity-check. If no error occurs and the current contents of +** the FTS index are correct, return SQLITE_OK. Or, if the contents of the +** FTS index are incorrect, return SQLITE_CORRUPT_VTAB. +** +** Or, if an error (e.g. an OOM or IO error) occurs, return an SQLite +** error code. +** +** The integrity-check works as follows. For each token and indexed token +** prefix in the document set, a 64-bit checksum is calculated (by code +** in fts3ChecksumEntry()) based on the following: +** +** + The index number (0 for the main index, 1 for the first prefix +** index etc.), +** + The token (or token prefix) text itself, +** + The language-id of the row it appears in, +** + The docid of the row it appears in, +** + The column it appears in, and +** + The tokens position within that column. +** +** The checksums for all entries in the index are XORed together to create +** a single checksum for the entire index. +** +** The integrity-check code calculates the same checksum in two ways: +** +** 1. By scanning the contents of the FTS index, and +** 2. By scanning and tokenizing the content table. +** +** If the two checksums are identical, the integrity-check is deemed to have +** passed. +*/ +static int fts3DoIntegrityCheck( + Fts3Table *p /* FTS3 table handle */ +){ + int rc; + int bOk = 0; + rc = fts3IntegrityCheck(p, &bOk); + if( rc==SQLITE_OK && bOk==0 ) rc = FTS_CORRUPT_VTAB; + return rc; +} + +/* +** Handle a 'special' INSERT of the form: +** +** "INSERT INTO tbl(tbl) VALUES()" +** +** Argument pVal contains the result of . Currently the only +** meaningful value to insert is the text 'optimize'. +*/ +static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ + int rc = SQLITE_ERROR; /* Return Code */ + const char *zVal = (const char *)sqlite3_value_text(pVal); + int nVal = sqlite3_value_bytes(pVal); + + if( !zVal ){ + return SQLITE_NOMEM; + }else if( nVal==8 && 0==sqlite3_strnicmp(zVal, "optimize", 8) ){ + rc = fts3DoOptimize(p, 0); + }else if( nVal==7 && 0==sqlite3_strnicmp(zVal, "rebuild", 7) ){ + rc = fts3DoRebuild(p); + }else if( nVal==15 && 0==sqlite3_strnicmp(zVal, "integrity-check", 15) ){ + rc = fts3DoIntegrityCheck(p); + }else if( nVal>6 && 0==sqlite3_strnicmp(zVal, "merge=", 6) ){ + rc = fts3DoIncrmerge(p, &zVal[6]); + }else if( nVal>10 && 0==sqlite3_strnicmp(zVal, "automerge=", 10) ){ + rc = fts3DoAutoincrmerge(p, &zVal[10]); +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + }else{ + int v; + if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){ + v = atoi(&zVal[9]); + if( v>=24 && v<=p->nPgsz-35 ) p->nNodeSize = v; + rc = SQLITE_OK; + }else if( nVal>11 && 0==sqlite3_strnicmp(zVal, "maxpending=", 9) ){ + v = atoi(&zVal[11]); + if( v>=64 && v<=FTS3_MAX_PENDING_DATA ) p->nMaxPendingData = v; + rc = SQLITE_OK; + }else if( nVal>21 && 0==sqlite3_strnicmp(zVal,"test-no-incr-doclist=",21) ){ + p->bNoIncrDoclist = atoi(&zVal[21]); + rc = SQLITE_OK; + }else if( nVal>11 && 0==sqlite3_strnicmp(zVal,"mergecount=",11) ){ + v = atoi(&zVal[11]); + if( v>=4 && v<=FTS3_MERGE_COUNT && (v&1)==0 ) p->nMergeCount = v; + rc = SQLITE_OK; + } +#endif + } + return rc; +} + +#ifndef SQLITE_DISABLE_FTS4_DEFERRED +/* +** Delete all cached deferred doclists. Deferred doclists are cached +** (allocated) by the sqlite3Fts3CacheDeferredDoclists() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *pCsr){ + Fts3DeferredToken *pDef; + for(pDef=pCsr->pDeferred; pDef; pDef=pDef->pNext){ + fts3PendingListDelete(pDef->pList); + pDef->pList = 0; + } +} + +/* +** Free all entries in the pCsr->pDeffered list. Entries are added to +** this list using sqlite3Fts3DeferToken(). +*/ +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *pCsr){ + Fts3DeferredToken *pDef; + Fts3DeferredToken *pNext; + for(pDef=pCsr->pDeferred; pDef; pDef=pNext){ + pNext = pDef->pNext; + fts3PendingListDelete(pDef->pList); + sqlite3_free(pDef); + } + pCsr->pDeferred = 0; +} + +/* +** Generate deferred-doclists for all tokens in the pCsr->pDeferred list +** based on the row that pCsr currently points to. +** +** A deferred-doclist is like any other doclist with position information +** included, except that it only contains entries for a single row of the +** table, not for all rows. +*/ +SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *pCsr){ + int rc = SQLITE_OK; /* Return code */ + if( pCsr->pDeferred ){ + int i; /* Used to iterate through table columns */ + sqlite3_int64 iDocid; /* Docid of the row pCsr points to */ + Fts3DeferredToken *pDef; /* Used to iterate through deferred tokens */ + + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; + sqlite3_tokenizer *pT = p->pTokenizer; + sqlite3_tokenizer_module const *pModule = pT->pModule; + + assert( pCsr->isRequireSeek==0 ); + iDocid = sqlite3_column_int64(pCsr->pStmt, 0); + + for(i=0; inColumn && rc==SQLITE_OK; i++){ + if( p->abNotindexed[i]==0 ){ + const char *zText = (const char *)sqlite3_column_text(pCsr->pStmt, i+1); + sqlite3_tokenizer_cursor *pTC = 0; + + rc = sqlite3Fts3OpenTokenizer(pT, pCsr->iLangid, zText, -1, &pTC); + while( rc==SQLITE_OK ){ + char const *zToken; /* Buffer containing token */ + int nToken = 0; /* Number of bytes in token */ + int iDum1 = 0, iDum2 = 0; /* Dummy variables */ + int iPos = 0; /* Position of token in zText */ + + rc = pModule->xNext(pTC, &zToken, &nToken, &iDum1, &iDum2, &iPos); + for(pDef=pCsr->pDeferred; pDef && rc==SQLITE_OK; pDef=pDef->pNext){ + Fts3PhraseToken *pPT = pDef->pToken; + if( (pDef->iCol>=p->nColumn || pDef->iCol==i) + && (pPT->bFirst==0 || iPos==0) + && (pPT->n==nToken || (pPT->isPrefix && pPT->nz, pPT->n)) + ){ + fts3PendingListAppend(&pDef->pList, iDocid, i, iPos, &rc); + } + } + } + if( pTC ) pModule->xClose(pTC); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + } + + for(pDef=pCsr->pDeferred; pDef && rc==SQLITE_OK; pDef=pDef->pNext){ + if( pDef->pList ){ + rc = fts3PendingListAppendVarint(&pDef->pList, 0); + } + } + } + + return rc; +} + +SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList( + Fts3DeferredToken *p, + char **ppData, + int *pnData +){ + char *pRet; + int nSkip; + sqlite3_int64 dummy; + + *ppData = 0; + *pnData = 0; + + if( p->pList==0 ){ + return SQLITE_OK; + } + + pRet = (char *)sqlite3_malloc(p->pList->nData); + if( !pRet ) return SQLITE_NOMEM; + + nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy); + *pnData = p->pList->nData - nSkip; + *ppData = pRet; + + memcpy(pRet, &p->pList->aData[nSkip], *pnData); + return SQLITE_OK; +} + +/* +** Add an entry for token pToken to the pCsr->pDeferred list. +*/ +SQLITE_PRIVATE int sqlite3Fts3DeferToken( + Fts3Cursor *pCsr, /* Fts3 table cursor */ + Fts3PhraseToken *pToken, /* Token to defer */ + int iCol /* Column that token must appear in (or -1) */ +){ + Fts3DeferredToken *pDeferred; + pDeferred = sqlite3_malloc(sizeof(*pDeferred)); + if( !pDeferred ){ + return SQLITE_NOMEM; + } + memset(pDeferred, 0, sizeof(*pDeferred)); + pDeferred->pToken = pToken; + pDeferred->pNext = pCsr->pDeferred; + pDeferred->iCol = iCol; + pCsr->pDeferred = pDeferred; + + assert( pToken->pDeferred==0 ); + pToken->pDeferred = pDeferred; + + return SQLITE_OK; +} +#endif + +/* +** SQLite value pRowid contains the rowid of a row that may or may not be +** present in the FTS3 table. If it is, delete it and adjust the contents +** of subsiduary data structures accordingly. +*/ +static int fts3DeleteByRowid( + Fts3Table *p, + sqlite3_value *pRowid, + int *pnChng, /* IN/OUT: Decrement if row is deleted */ + u32 *aSzDel +){ + int rc = SQLITE_OK; /* Return code */ + int bFound = 0; /* True if *pRowid really is in the table */ + + fts3DeleteTerms(&rc, p, pRowid, aSzDel, &bFound); + if( bFound && rc==SQLITE_OK ){ + int isEmpty = 0; /* Deleting *pRowid leaves the table empty */ + rc = fts3IsEmpty(p, pRowid, &isEmpty); + if( rc==SQLITE_OK ){ + if( isEmpty ){ + /* Deleting this row means the whole table is empty. In this case + ** delete the contents of all three tables and throw away any + ** data in the pendingTerms hash table. */ + rc = fts3DeleteAll(p, 1); + *pnChng = 0; + memset(aSzDel, 0, sizeof(u32) * (p->nColumn+1) * 2); + }else{ + *pnChng = *pnChng - 1; + if( p->zContentTbl==0 ){ + fts3SqlExec(&rc, p, SQL_DELETE_CONTENT, &pRowid); + } + if( p->bHasDocsize ){ + fts3SqlExec(&rc, p, SQL_DELETE_DOCSIZE, &pRowid); + } + } + } + } + + return rc; +} + +/* +** This function does the work for the xUpdate method of FTS3 virtual +** tables. The schema of the virtual table being: +** +** CREATE TABLE
    ( +** , +**
    HIDDEN, +** docid HIDDEN, +** HIDDEN +** ); +** +** +*/ +SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( + sqlite3_vtab *pVtab, /* FTS3 vtab object */ + int nArg, /* Size of argument array */ + sqlite3_value **apVal, /* Array of arguments */ + sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ +){ + Fts3Table *p = (Fts3Table *)pVtab; + int rc = SQLITE_OK; /* Return Code */ + u32 *aSzIns = 0; /* Sizes of inserted documents */ + u32 *aSzDel = 0; /* Sizes of deleted documents */ + int nChng = 0; /* Net change in number of documents */ + int bInsertDone = 0; + + /* At this point it must be known if the %_stat table exists or not. + ** So bHasStat may not be 2. */ + assert( p->bHasStat==0 || p->bHasStat==1 ); + + assert( p->pSegments==0 ); + assert( + nArg==1 /* DELETE operations */ + || nArg==(2 + p->nColumn + 3) /* INSERT or UPDATE operations */ + ); + + /* Check for a "special" INSERT operation. One of the form: + ** + ** INSERT INTO xyz(xyz) VALUES('command'); + */ + if( nArg>1 + && sqlite3_value_type(apVal[0])==SQLITE_NULL + && sqlite3_value_type(apVal[p->nColumn+2])!=SQLITE_NULL + ){ + rc = fts3SpecialInsert(p, apVal[p->nColumn+2]); + goto update_out; + } + + if( nArg>1 && sqlite3_value_int(apVal[2 + p->nColumn + 2])<0 ){ + rc = SQLITE_CONSTRAINT; + goto update_out; + } + + /* Allocate space to hold the change in document sizes */ + aSzDel = sqlite3_malloc64(sizeof(aSzDel[0])*((sqlite3_int64)p->nColumn+1)*2); + if( aSzDel==0 ){ + rc = SQLITE_NOMEM; + goto update_out; + } + aSzIns = &aSzDel[p->nColumn+1]; + memset(aSzDel, 0, sizeof(aSzDel[0])*(p->nColumn+1)*2); + + rc = fts3Writelock(p); + if( rc!=SQLITE_OK ) goto update_out; + + /* If this is an INSERT operation, or an UPDATE that modifies the rowid + ** value, then this operation requires constraint handling. + ** + ** If the on-conflict mode is REPLACE, this means that the existing row + ** should be deleted from the database before inserting the new row. Or, + ** if the on-conflict mode is other than REPLACE, then this method must + ** detect the conflict and return SQLITE_CONSTRAINT before beginning to + ** modify the database file. + */ + if( nArg>1 && p->zContentTbl==0 ){ + /* Find the value object that holds the new rowid value. */ + sqlite3_value *pNewRowid = apVal[3+p->nColumn]; + if( sqlite3_value_type(pNewRowid)==SQLITE_NULL ){ + pNewRowid = apVal[1]; + } + + if( sqlite3_value_type(pNewRowid)!=SQLITE_NULL && ( + sqlite3_value_type(apVal[0])==SQLITE_NULL + || sqlite3_value_int64(apVal[0])!=sqlite3_value_int64(pNewRowid) + )){ + /* The new rowid is not NULL (in this case the rowid will be + ** automatically assigned and there is no chance of a conflict), and + ** the statement is either an INSERT or an UPDATE that modifies the + ** rowid column. So if the conflict mode is REPLACE, then delete any + ** existing row with rowid=pNewRowid. + ** + ** Or, if the conflict mode is not REPLACE, insert the new record into + ** the %_content table. If we hit the duplicate rowid constraint (or any + ** other error) while doing so, return immediately. + ** + ** This branch may also run if pNewRowid contains a value that cannot + ** be losslessly converted to an integer. In this case, the eventual + ** call to fts3InsertData() (either just below or further on in this + ** function) will return SQLITE_MISMATCH. If fts3DeleteByRowid is + ** invoked, it will delete zero rows (since no row will have + ** docid=$pNewRowid if $pNewRowid is not an integer value). + */ + if( sqlite3_vtab_on_conflict(p->db)==SQLITE_REPLACE ){ + rc = fts3DeleteByRowid(p, pNewRowid, &nChng, aSzDel); + }else{ + rc = fts3InsertData(p, apVal, pRowid); + bInsertDone = 1; + } + } + } + if( rc!=SQLITE_OK ){ + goto update_out; + } + + /* If this is a DELETE or UPDATE operation, remove the old record. */ + if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ + assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER ); + rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel); + } + + /* If this is an INSERT or UPDATE operation, insert the new record. */ + if( nArg>1 && rc==SQLITE_OK ){ + int iLangid = sqlite3_value_int(apVal[2 + p->nColumn + 2]); + if( bInsertDone==0 ){ + rc = fts3InsertData(p, apVal, pRowid); + if( rc==SQLITE_CONSTRAINT && p->zContentTbl==0 ){ + rc = FTS_CORRUPT_VTAB; + } + } + if( rc==SQLITE_OK ){ + rc = fts3PendingTermsDocid(p, 0, iLangid, *pRowid); + } + if( rc==SQLITE_OK ){ + assert( p->iPrevDocid==*pRowid ); + rc = fts3InsertTerms(p, iLangid, apVal, aSzIns); + } + if( p->bHasDocsize ){ + fts3InsertDocsize(&rc, p, aSzIns); + } + nChng++; + } + + if( p->bFts4 ){ + fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nChng); + } + + update_out: + sqlite3_free(aSzDel); + sqlite3Fts3SegmentsClose(p); + return rc; +} + +/* +** Flush any data in the pending-terms hash table to disk. If successful, +** merge all segments in the database (including the new segment, if +** there was any data to flush) into a single segment. +*/ +SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){ + int rc; + rc = sqlite3_exec(p->db, "SAVEPOINT fts3", 0, 0, 0); + if( rc==SQLITE_OK ){ + rc = fts3DoOptimize(p, 1); + if( rc==SQLITE_OK || rc==SQLITE_DONE ){ + int rc2 = sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0); + if( rc2!=SQLITE_OK ) rc = rc2; + }else{ + sqlite3_exec(p->db, "ROLLBACK TO fts3", 0, 0, 0); + sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0); + } + } + sqlite3Fts3SegmentsClose(p); + return rc; +} + +#endif + +/************** End of fts3_write.c ******************************************/ +/************** Begin file fts3_snippet.c ************************************/ +/* +** 2009 Oct 23 +** +** 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. +** +****************************************************************************** +*/ + +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +/* +** Characters that may appear in the second argument to matchinfo(). +*/ +#define FTS3_MATCHINFO_NPHRASE 'p' /* 1 value */ +#define FTS3_MATCHINFO_NCOL 'c' /* 1 value */ +#define FTS3_MATCHINFO_NDOC 'n' /* 1 value */ +#define FTS3_MATCHINFO_AVGLENGTH 'a' /* nCol values */ +#define FTS3_MATCHINFO_LENGTH 'l' /* nCol values */ +#define FTS3_MATCHINFO_LCS 's' /* nCol values */ +#define FTS3_MATCHINFO_HITS 'x' /* 3*nCol*nPhrase values */ +#define FTS3_MATCHINFO_LHITS 'y' /* nCol*nPhrase values */ +#define FTS3_MATCHINFO_LHITS_BM 'b' /* nCol*nPhrase values */ + +/* +** The default value for the second argument to matchinfo(). +*/ +#define FTS3_MATCHINFO_DEFAULT "pcx" + + +/* +** Used as an fts3ExprIterate() context when loading phrase doclists to +** Fts3Expr.aDoclist[]/nDoclist. +*/ +typedef struct LoadDoclistCtx LoadDoclistCtx; +struct LoadDoclistCtx { + Fts3Cursor *pCsr; /* FTS3 Cursor */ + int nPhrase; /* Number of phrases seen so far */ + int nToken; /* Number of tokens seen so far */ +}; + +/* +** The following types are used as part of the implementation of the +** fts3BestSnippet() routine. +*/ +typedef struct SnippetIter SnippetIter; +typedef struct SnippetPhrase SnippetPhrase; +typedef struct SnippetFragment SnippetFragment; + +struct SnippetIter { + Fts3Cursor *pCsr; /* Cursor snippet is being generated from */ + int iCol; /* Extract snippet from this column */ + int nSnippet; /* Requested snippet length (in tokens) */ + int nPhrase; /* Number of phrases in query */ + SnippetPhrase *aPhrase; /* Array of size nPhrase */ + int iCurrent; /* First token of current snippet */ +}; + +struct SnippetPhrase { + int nToken; /* Number of tokens in phrase */ + char *pList; /* Pointer to start of phrase position list */ + int iHead; /* Next value in position list */ + char *pHead; /* Position list data following iHead */ + int iTail; /* Next value in trailing position list */ + char *pTail; /* Position list data following iTail */ +}; + +struct SnippetFragment { + int iCol; /* Column snippet is extracted from */ + int iPos; /* Index of first token in snippet */ + u64 covered; /* Mask of query phrases covered */ + u64 hlmask; /* Mask of snippet terms to highlight */ +}; + +/* +** This type is used as an fts3ExprIterate() context object while +** accumulating the data returned by the matchinfo() function. +*/ +typedef struct MatchInfo MatchInfo; +struct MatchInfo { + Fts3Cursor *pCursor; /* FTS3 Cursor */ + int nCol; /* Number of columns in table */ + int nPhrase; /* Number of matchable phrases in query */ + sqlite3_int64 nDoc; /* Number of docs in database */ + char flag; + u32 *aMatchinfo; /* Pre-allocated buffer */ +}; + +/* +** An instance of this structure is used to manage a pair of buffers, each +** (nElem * sizeof(u32)) bytes in size. See the MatchinfoBuffer code below +** for details. +*/ +struct MatchinfoBuffer { + u8 aRef[3]; + int nElem; + int bGlobal; /* Set if global data is loaded */ + char *zMatchinfo; + u32 aMatchinfo[1]; +}; + + +/* +** The snippet() and offsets() functions both return text values. An instance +** of the following structure is used to accumulate those values while the +** functions are running. See fts3StringAppend() for details. +*/ +typedef struct StrBuffer StrBuffer; +struct StrBuffer { + char *z; /* Pointer to buffer containing string */ + int n; /* Length of z in bytes (excl. nul-term) */ + int nAlloc; /* Allocated size of buffer z in bytes */ +}; + + +/************************************************************************* +** Start of MatchinfoBuffer code. +*/ + +/* +** Allocate a two-slot MatchinfoBuffer object. +*/ +static MatchinfoBuffer *fts3MIBufferNew(size_t nElem, const char *zMatchinfo){ + MatchinfoBuffer *pRet; + sqlite3_int64 nByte = sizeof(u32) * (2*(sqlite3_int64)nElem + 1) + + sizeof(MatchinfoBuffer); + sqlite3_int64 nStr = strlen(zMatchinfo); + + pRet = sqlite3_malloc64(nByte + nStr+1); + if( pRet ){ + memset(pRet, 0, nByte); + pRet->aMatchinfo[0] = (u8*)(&pRet->aMatchinfo[1]) - (u8*)pRet; + pRet->aMatchinfo[1+nElem] = pRet->aMatchinfo[0] + + sizeof(u32)*((int)nElem+1); + pRet->nElem = (int)nElem; + pRet->zMatchinfo = ((char*)pRet) + nByte; + memcpy(pRet->zMatchinfo, zMatchinfo, nStr+1); + pRet->aRef[0] = 1; + } + + return pRet; +} + +static void fts3MIBufferFree(void *p){ + MatchinfoBuffer *pBuf = (MatchinfoBuffer*)((u8*)p - ((u32*)p)[-1]); + + assert( (u32*)p==&pBuf->aMatchinfo[1] + || (u32*)p==&pBuf->aMatchinfo[pBuf->nElem+2] + ); + if( (u32*)p==&pBuf->aMatchinfo[1] ){ + pBuf->aRef[1] = 0; + }else{ + pBuf->aRef[2] = 0; + } + + if( pBuf->aRef[0]==0 && pBuf->aRef[1]==0 && pBuf->aRef[2]==0 ){ + sqlite3_free(pBuf); + } +} + +static void (*fts3MIBufferAlloc(MatchinfoBuffer *p, u32 **paOut))(void*){ + void (*xRet)(void*) = 0; + u32 *aOut = 0; + + if( p->aRef[1]==0 ){ + p->aRef[1] = 1; + aOut = &p->aMatchinfo[1]; + xRet = fts3MIBufferFree; + } + else if( p->aRef[2]==0 ){ + p->aRef[2] = 1; + aOut = &p->aMatchinfo[p->nElem+2]; + xRet = fts3MIBufferFree; + }else{ + aOut = (u32*)sqlite3_malloc64(p->nElem * sizeof(u32)); + if( aOut ){ + xRet = sqlite3_free; + if( p->bGlobal ) memcpy(aOut, &p->aMatchinfo[1], p->nElem*sizeof(u32)); + } + } + + *paOut = aOut; + return xRet; +} + +static void fts3MIBufferSetGlobal(MatchinfoBuffer *p){ + p->bGlobal = 1; + memcpy(&p->aMatchinfo[2+p->nElem], &p->aMatchinfo[1], p->nElem*sizeof(u32)); +} + +/* +** Free a MatchinfoBuffer object allocated using fts3MIBufferNew() +*/ +SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p){ + if( p ){ + assert( p->aRef[0]==1 ); + p->aRef[0] = 0; + if( p->aRef[0]==0 && p->aRef[1]==0 && p->aRef[2]==0 ){ + sqlite3_free(p); + } + } +} + +/* +** End of MatchinfoBuffer code. +*************************************************************************/ + + +/* +** This function is used to help iterate through a position-list. A position +** list is a list of unique integers, sorted from smallest to largest. Each +** element of the list is represented by an FTS3 varint that takes the value +** of the difference between the current element and the previous one plus +** two. For example, to store the position-list: +** +** 4 9 113 +** +** the three varints: +** +** 6 7 106 +** +** are encoded. +** +** When this function is called, *pp points to the start of an element of +** the list. *piPos contains the value of the previous entry in the list. +** After it returns, *piPos contains the value of the next element of the +** list and *pp is advanced to the following varint. +*/ +static void fts3GetDeltaPosition(char **pp, int *piPos){ + int iVal; + *pp += fts3GetVarint32(*pp, &iVal); + *piPos += (iVal-2); +} + +/* +** Helper function for fts3ExprIterate() (see below). +*/ +static int fts3ExprIterate2( + Fts3Expr *pExpr, /* Expression to iterate phrases of */ + int *piPhrase, /* Pointer to phrase counter */ + int (*x)(Fts3Expr*,int,void*), /* Callback function to invoke for phrases */ + void *pCtx /* Second argument to pass to callback */ +){ + int rc; /* Return code */ + int eType = pExpr->eType; /* Type of expression node pExpr */ + + if( eType!=FTSQUERY_PHRASE ){ + assert( pExpr->pLeft && pExpr->pRight ); + rc = fts3ExprIterate2(pExpr->pLeft, piPhrase, x, pCtx); + if( rc==SQLITE_OK && eType!=FTSQUERY_NOT ){ + rc = fts3ExprIterate2(pExpr->pRight, piPhrase, x, pCtx); + } + }else{ + rc = x(pExpr, *piPhrase, pCtx); + (*piPhrase)++; + } + return rc; +} + +/* +** Iterate through all phrase nodes in an FTS3 query, except those that +** are part of a sub-tree that is the right-hand-side of a NOT operator. +** For each phrase node found, the supplied callback function is invoked. +** +** If the callback function returns anything other than SQLITE_OK, +** the iteration is abandoned and the error code returned immediately. +** Otherwise, SQLITE_OK is returned after a callback has been made for +** all eligible phrase nodes. +*/ +static int fts3ExprIterate( + Fts3Expr *pExpr, /* Expression to iterate phrases of */ + int (*x)(Fts3Expr*,int,void*), /* Callback function to invoke for phrases */ + void *pCtx /* Second argument to pass to callback */ +){ + int iPhrase = 0; /* Variable used as the phrase counter */ + return fts3ExprIterate2(pExpr, &iPhrase, x, pCtx); +} + + +/* +** This is an fts3ExprIterate() callback used while loading the doclists +** for each phrase into Fts3Expr.aDoclist[]/nDoclist. See also +** fts3ExprLoadDoclists(). +*/ +static int fts3ExprLoadDoclistsCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ + int rc = SQLITE_OK; + Fts3Phrase *pPhrase = pExpr->pPhrase; + LoadDoclistCtx *p = (LoadDoclistCtx *)ctx; + + UNUSED_PARAMETER(iPhrase); + + p->nPhrase++; + p->nToken += pPhrase->nToken; + + return rc; +} + +/* +** Load the doclists for each phrase in the query associated with FTS3 cursor +** pCsr. +** +** If pnPhrase is not NULL, then *pnPhrase is set to the number of matchable +** phrases in the expression (all phrases except those directly or +** indirectly descended from the right-hand-side of a NOT operator). If +** pnToken is not NULL, then it is set to the number of tokens in all +** matchable phrases of the expression. +*/ +static int fts3ExprLoadDoclists( + Fts3Cursor *pCsr, /* Fts3 cursor for current query */ + int *pnPhrase, /* OUT: Number of phrases in query */ + int *pnToken /* OUT: Number of tokens in query */ +){ + int rc; /* Return Code */ + LoadDoclistCtx sCtx = {0,0,0}; /* Context for fts3ExprIterate() */ + sCtx.pCsr = pCsr; + rc = fts3ExprIterate(pCsr->pExpr, fts3ExprLoadDoclistsCb, (void *)&sCtx); + if( pnPhrase ) *pnPhrase = sCtx.nPhrase; + if( pnToken ) *pnToken = sCtx.nToken; + return rc; +} + +static int fts3ExprPhraseCountCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ + (*(int *)ctx)++; + pExpr->iPhrase = iPhrase; + return SQLITE_OK; +} +static int fts3ExprPhraseCount(Fts3Expr *pExpr){ + int nPhrase = 0; + (void)fts3ExprIterate(pExpr, fts3ExprPhraseCountCb, (void *)&nPhrase); + return nPhrase; +} + +/* +** Advance the position list iterator specified by the first two +** arguments so that it points to the first element with a value greater +** than or equal to parameter iNext. +*/ +static void fts3SnippetAdvance(char **ppIter, int *piIter, int iNext){ + char *pIter = *ppIter; + if( pIter ){ + int iIter = *piIter; + + while( iIteriCurrent<0 ){ + /* The SnippetIter object has just been initialized. The first snippet + ** candidate always starts at offset 0 (even if this candidate has a + ** score of 0.0). + */ + pIter->iCurrent = 0; + + /* Advance the 'head' iterator of each phrase to the first offset that + ** is greater than or equal to (iNext+nSnippet). + */ + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, pIter->nSnippet); + } + }else{ + int iStart; + int iEnd = 0x7FFFFFFF; + + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + if( pPhrase->pHead && pPhrase->iHeadiHead; + } + } + if( iEnd==0x7FFFFFFF ){ + return 1; + } + + pIter->iCurrent = iStart = iEnd - pIter->nSnippet + 1; + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, iEnd+1); + fts3SnippetAdvance(&pPhrase->pTail, &pPhrase->iTail, iStart); + } + } + + return 0; +} + +/* +** Retrieve information about the current candidate snippet of snippet +** iterator pIter. +*/ +static void fts3SnippetDetails( + SnippetIter *pIter, /* Snippet iterator */ + u64 mCovered, /* Bitmask of phrases already covered */ + int *piToken, /* OUT: First token of proposed snippet */ + int *piScore, /* OUT: "Score" for this snippet */ + u64 *pmCover, /* OUT: Bitmask of phrases covered */ + u64 *pmHighlight /* OUT: Bitmask of terms to highlight */ +){ + int iStart = pIter->iCurrent; /* First token of snippet */ + int iScore = 0; /* Score of this snippet */ + int i; /* Loop counter */ + u64 mCover = 0; /* Mask of phrases covered by this snippet */ + u64 mHighlight = 0; /* Mask of tokens to highlight in snippet */ + + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + if( pPhrase->pTail ){ + char *pCsr = pPhrase->pTail; + int iCsr = pPhrase->iTail; + + while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){ + int j; + u64 mPhrase = (u64)1 << (i%64); + u64 mPos = (u64)1 << (iCsr - iStart); + assert( iCsr>=iStart && (iCsr - iStart)<=64 ); + assert( i>=0 ); + if( (mCover|mCovered)&mPhrase ){ + iScore++; + }else{ + iScore += 1000; + } + mCover |= mPhrase; + + for(j=0; jnToken; j++){ + mHighlight |= (mPos>>j); + } + + if( 0==(*pCsr & 0x0FE) ) break; + fts3GetDeltaPosition(&pCsr, &iCsr); + } + } + } + + /* Set the output variables before returning. */ + *piToken = iStart; + *piScore = iScore; + *pmCover = mCover; + *pmHighlight = mHighlight; +} + +/* +** This function is an fts3ExprIterate() callback used by fts3BestSnippet(). +** Each invocation populates an element of the SnippetIter.aPhrase[] array. +*/ +static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ + SnippetIter *p = (SnippetIter *)ctx; + SnippetPhrase *pPhrase = &p->aPhrase[iPhrase]; + char *pCsr; + int rc; + + pPhrase->nToken = pExpr->pPhrase->nToken; + rc = sqlite3Fts3EvalPhrasePoslist(p->pCsr, pExpr, p->iCol, &pCsr); + assert( rc==SQLITE_OK || pCsr==0 ); + if( pCsr ){ + int iFirst = 0; + pPhrase->pList = pCsr; + fts3GetDeltaPosition(&pCsr, &iFirst); + if( iFirst<0 ){ + rc = FTS_CORRUPT_VTAB; + }else{ + pPhrase->pHead = pCsr; + pPhrase->pTail = pCsr; + pPhrase->iHead = iFirst; + pPhrase->iTail = iFirst; + } + }else{ + assert( rc!=SQLITE_OK || ( + pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0 + )); + } + + return rc; +} + +/* +** Select the fragment of text consisting of nFragment contiguous tokens +** from column iCol that represent the "best" snippet. The best snippet +** is the snippet with the highest score, where scores are calculated +** by adding: +** +** (a) +1 point for each occurrence of a matchable phrase in the snippet. +** +** (b) +1000 points for the first occurrence of each matchable phrase in +** the snippet for which the corresponding mCovered bit is not set. +** +** The selected snippet parameters are stored in structure *pFragment before +** returning. The score of the selected snippet is stored in *piScore +** before returning. +*/ +static int fts3BestSnippet( + int nSnippet, /* Desired snippet length */ + Fts3Cursor *pCsr, /* Cursor to create snippet for */ + int iCol, /* Index of column to create snippet from */ + u64 mCovered, /* Mask of phrases already covered */ + u64 *pmSeen, /* IN/OUT: Mask of phrases seen */ + SnippetFragment *pFragment, /* OUT: Best snippet found */ + int *piScore /* OUT: Score of snippet pFragment */ +){ + int rc; /* Return Code */ + int nList; /* Number of phrases in expression */ + SnippetIter sIter; /* Iterates through snippet candidates */ + sqlite3_int64 nByte; /* Number of bytes of space to allocate */ + int iBestScore = -1; /* Best snippet score found so far */ + int i; /* Loop counter */ + + memset(&sIter, 0, sizeof(sIter)); + + /* Iterate through the phrases in the expression to count them. The same + ** callback makes sure the doclists are loaded for each phrase. + */ + rc = fts3ExprLoadDoclists(pCsr, &nList, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Now that it is known how many phrases there are, allocate and zero + ** the required space using malloc(). + */ + nByte = sizeof(SnippetPhrase) * nList; + sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc64(nByte); + if( !sIter.aPhrase ){ + return SQLITE_NOMEM; + } + memset(sIter.aPhrase, 0, nByte); + + /* Initialize the contents of the SnippetIter object. Then iterate through + ** the set of phrases in the expression to populate the aPhrase[] array. + */ + sIter.pCsr = pCsr; + sIter.iCol = iCol; + sIter.nSnippet = nSnippet; + sIter.nPhrase = nList; + sIter.iCurrent = -1; + rc = fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void*)&sIter); + if( rc==SQLITE_OK ){ + + /* Set the *pmSeen output variable. */ + for(i=0; iiCol = iCol; + while( !fts3SnippetNextCandidate(&sIter) ){ + int iPos; + int iScore; + u64 mCover; + u64 mHighlite; + fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover,&mHighlite); + assert( iScore>=0 ); + if( iScore>iBestScore ){ + pFragment->iPos = iPos; + pFragment->hlmask = mHighlite; + pFragment->covered = mCover; + iBestScore = iScore; + } + } + + *piScore = iBestScore; + } + sqlite3_free(sIter.aPhrase); + return rc; +} + + +/* +** Append a string to the string-buffer passed as the first argument. +** +** If nAppend is negative, then the length of the string zAppend is +** determined using strlen(). +*/ +static int fts3StringAppend( + StrBuffer *pStr, /* Buffer to append to */ + const char *zAppend, /* Pointer to data to append to buffer */ + int nAppend /* Size of zAppend in bytes (or -1) */ +){ + if( nAppend<0 ){ + nAppend = (int)strlen(zAppend); + } + + /* If there is insufficient space allocated at StrBuffer.z, use realloc() + ** to grow the buffer until so that it is big enough to accomadate the + ** appended data. + */ + if( pStr->n+nAppend+1>=pStr->nAlloc ){ + sqlite3_int64 nAlloc = pStr->nAlloc+(sqlite3_int64)nAppend+100; + char *zNew = sqlite3_realloc64(pStr->z, nAlloc); + if( !zNew ){ + return SQLITE_NOMEM; + } + pStr->z = zNew; + pStr->nAlloc = nAlloc; + } + assert( pStr->z!=0 && (pStr->nAlloc >= pStr->n+nAppend+1) ); + + /* Append the data to the string buffer. */ + memcpy(&pStr->z[pStr->n], zAppend, nAppend); + pStr->n += nAppend; + pStr->z[pStr->n] = '\0'; + + return SQLITE_OK; +} + +/* +** The fts3BestSnippet() function often selects snippets that end with a +** query term. That is, the final term of the snippet is always a term +** that requires highlighting. For example, if 'X' is a highlighted term +** and '.' is a non-highlighted term, BestSnippet() may select: +** +** ........X.....X +** +** This function "shifts" the beginning of the snippet forward in the +** document so that there are approximately the same number of +** non-highlighted terms to the right of the final highlighted term as there +** are to the left of the first highlighted term. For example, to this: +** +** ....X.....X.... +** +** This is done as part of extracting the snippet text, not when selecting +** the snippet. Snippet selection is done based on doclists only, so there +** is no way for fts3BestSnippet() to know whether or not the document +** actually contains terms that follow the final highlighted term. +*/ +static int fts3SnippetShift( + Fts3Table *pTab, /* FTS3 table snippet comes from */ + int iLangid, /* Language id to use in tokenizing */ + int nSnippet, /* Number of tokens desired for snippet */ + const char *zDoc, /* Document text to extract snippet from */ + int nDoc, /* Size of buffer zDoc in bytes */ + int *piPos, /* IN/OUT: First token of snippet */ + u64 *pHlmask /* IN/OUT: Mask of tokens to highlight */ +){ + u64 hlmask = *pHlmask; /* Local copy of initial highlight-mask */ + + if( hlmask ){ + int nLeft; /* Tokens to the left of first highlight */ + int nRight; /* Tokens to the right of last highlight */ + int nDesired; /* Ideal number of tokens to shift forward */ + + for(nLeft=0; !(hlmask & ((u64)1 << nLeft)); nLeft++); + for(nRight=0; !(hlmask & ((u64)1 << (nSnippet-1-nRight))); nRight++); + assert( (nSnippet-1-nRight)<=63 && (nSnippet-1-nRight)>=0 ); + nDesired = (nLeft-nRight)/2; + + /* Ideally, the start of the snippet should be pushed forward in the + ** document nDesired tokens. This block checks if there are actually + ** nDesired tokens to the right of the snippet. If so, *piPos and + ** *pHlMask are updated to shift the snippet nDesired tokens to the + ** right. Otherwise, the snippet is shifted by the number of tokens + ** available. + */ + if( nDesired>0 ){ + int nShift; /* Number of tokens to shift snippet by */ + int iCurrent = 0; /* Token counter */ + int rc; /* Return Code */ + sqlite3_tokenizer_module *pMod; + sqlite3_tokenizer_cursor *pC; + pMod = (sqlite3_tokenizer_module *)pTab->pTokenizer->pModule; + + /* Open a cursor on zDoc/nDoc. Check if there are (nSnippet+nDesired) + ** or more tokens in zDoc/nDoc. + */ + rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, iLangid, zDoc, nDoc, &pC); + if( rc!=SQLITE_OK ){ + return rc; + } + while( rc==SQLITE_OK && iCurrent<(nSnippet+nDesired) ){ + const char *ZDUMMY; int DUMMY1 = 0, DUMMY2 = 0, DUMMY3 = 0; + rc = pMod->xNext(pC, &ZDUMMY, &DUMMY1, &DUMMY2, &DUMMY3, &iCurrent); + } + pMod->xClose(pC); + if( rc!=SQLITE_OK && rc!=SQLITE_DONE ){ return rc; } + + nShift = (rc==SQLITE_DONE)+iCurrent-nSnippet; + assert( nShift<=nDesired ); + if( nShift>0 ){ + *piPos += nShift; + *pHlmask = hlmask >> nShift; + } + } + } + return SQLITE_OK; +} + +/* +** Extract the snippet text for fragment pFragment from cursor pCsr and +** append it to string buffer pOut. +*/ +static int fts3SnippetText( + Fts3Cursor *pCsr, /* FTS3 Cursor */ + SnippetFragment *pFragment, /* Snippet to extract */ + int iFragment, /* Fragment number */ + int isLast, /* True for final fragment in snippet */ + int nSnippet, /* Number of tokens in extracted snippet */ + const char *zOpen, /* String inserted before highlighted term */ + const char *zClose, /* String inserted after highlighted term */ + const char *zEllipsis, /* String inserted between snippets */ + StrBuffer *pOut /* Write output here */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc; /* Return code */ + const char *zDoc; /* Document text to extract snippet from */ + int nDoc; /* Size of zDoc in bytes */ + int iCurrent = 0; /* Current token number of document */ + int iEnd = 0; /* Byte offset of end of current token */ + int isShiftDone = 0; /* True after snippet is shifted */ + int iPos = pFragment->iPos; /* First token of snippet */ + u64 hlmask = pFragment->hlmask; /* Highlight-mask for snippet */ + int iCol = pFragment->iCol+1; /* Query column to extract text from */ + sqlite3_tokenizer_module *pMod; /* Tokenizer module methods object */ + sqlite3_tokenizer_cursor *pC; /* Tokenizer cursor open on zDoc/nDoc */ + + zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol); + if( zDoc==0 ){ + if( sqlite3_column_type(pCsr->pStmt, iCol)!=SQLITE_NULL ){ + return SQLITE_NOMEM; + } + return SQLITE_OK; + } + nDoc = sqlite3_column_bytes(pCsr->pStmt, iCol); + + /* Open a token cursor on the document. */ + pMod = (sqlite3_tokenizer_module *)pTab->pTokenizer->pModule; + rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, pCsr->iLangid, zDoc,nDoc,&pC); + if( rc!=SQLITE_OK ){ + return rc; + } + + while( rc==SQLITE_OK ){ + const char *ZDUMMY; /* Dummy argument used with tokenizer */ + int DUMMY1 = -1; /* Dummy argument used with tokenizer */ + int iBegin = 0; /* Offset in zDoc of start of token */ + int iFin = 0; /* Offset in zDoc of end of token */ + int isHighlight = 0; /* True for highlighted terms */ + + /* Variable DUMMY1 is initialized to a negative value above. Elsewhere + ** in the FTS code the variable that the third argument to xNext points to + ** is initialized to zero before the first (*but not necessarily + ** subsequent*) call to xNext(). This is done for a particular application + ** that needs to know whether or not the tokenizer is being used for + ** snippet generation or for some other purpose. + ** + ** Extreme care is required when writing code to depend on this + ** initialization. It is not a documented part of the tokenizer interface. + ** If a tokenizer is used directly by any code outside of FTS, this + ** convention might not be respected. */ + rc = pMod->xNext(pC, &ZDUMMY, &DUMMY1, &iBegin, &iFin, &iCurrent); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + /* Special case - the last token of the snippet is also the last token + ** of the column. Append any punctuation that occurred between the end + ** of the previous token and the end of the document to the output. + ** Then break out of the loop. */ + rc = fts3StringAppend(pOut, &zDoc[iEnd], -1); + } + break; + } + if( iCurrentiLangid, nSnippet, &zDoc[iBegin], n, &iPos, &hlmask + ); + isShiftDone = 1; + + /* Now that the shift has been done, check if the initial "..." are + ** required. They are required if (a) this is not the first fragment, + ** or (b) this fragment does not begin at position 0 of its column. + */ + if( rc==SQLITE_OK ){ + if( iPos>0 || iFragment>0 ){ + rc = fts3StringAppend(pOut, zEllipsis, -1); + }else if( iBegin ){ + rc = fts3StringAppend(pOut, zDoc, iBegin); + } + } + if( rc!=SQLITE_OK || iCurrent=(iPos+nSnippet) ){ + if( isLast ){ + rc = fts3StringAppend(pOut, zEllipsis, -1); + } + break; + } + + /* Set isHighlight to true if this term should be highlighted. */ + isHighlight = (hlmask & ((u64)1 << (iCurrent-iPos)))!=0; + + if( iCurrent>iPos ) rc = fts3StringAppend(pOut, &zDoc[iEnd], iBegin-iEnd); + if( rc==SQLITE_OK && isHighlight ) rc = fts3StringAppend(pOut, zOpen, -1); + if( rc==SQLITE_OK ) rc = fts3StringAppend(pOut, &zDoc[iBegin], iFin-iBegin); + if( rc==SQLITE_OK && isHighlight ) rc = fts3StringAppend(pOut, zClose, -1); + + iEnd = iFin; + } + + pMod->xClose(pC); + return rc; +} + + +/* +** This function is used to count the entries in a column-list (a +** delta-encoded list of term offsets within a single column of a single +** row). When this function is called, *ppCollist should point to the +** beginning of the first varint in the column-list (the varint that +** contains the position of the first matching term in the column data). +** Before returning, *ppCollist is set to point to the first byte after +** the last varint in the column-list (either the 0x00 signifying the end +** of the position-list, or the 0x01 that precedes the column number of +** the next column in the position-list). +** +** The number of elements in the column-list is returned. +*/ +static int fts3ColumnlistCount(char **ppCollist){ + char *pEnd = *ppCollist; + char c = 0; + int nEntry = 0; + + /* A column-list is terminated by either a 0x01 or 0x00. */ + while( 0xFE & (*pEnd | c) ){ + c = *pEnd++ & 0x80; + if( !c ) nEntry++; + } + + *ppCollist = pEnd; + return nEntry; +} + +/* +** This function gathers 'y' or 'b' data for a single phrase. +*/ +static int fts3ExprLHits( + Fts3Expr *pExpr, /* Phrase expression node */ + MatchInfo *p /* Matchinfo context */ +){ + Fts3Table *pTab = (Fts3Table *)p->pCursor->base.pVtab; + int iStart; + Fts3Phrase *pPhrase = pExpr->pPhrase; + char *pIter = pPhrase->doclist.pList; + int iCol = 0; + + assert( p->flag==FTS3_MATCHINFO_LHITS_BM || p->flag==FTS3_MATCHINFO_LHITS ); + if( p->flag==FTS3_MATCHINFO_LHITS ){ + iStart = pExpr->iPhrase * p->nCol; + }else{ + iStart = pExpr->iPhrase * ((p->nCol + 31) / 32); + } + + if( pIter ) while( 1 ){ + int nHit = fts3ColumnlistCount(&pIter); + if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){ + if( p->flag==FTS3_MATCHINFO_LHITS ){ + p->aMatchinfo[iStart + iCol] = (u32)nHit; + }else if( nHit ){ + p->aMatchinfo[iStart + (iCol+1)/32] |= (1 << (iCol&0x1F)); + } + } + assert( *pIter==0x00 || *pIter==0x01 ); + if( *pIter!=0x01 ) break; + pIter++; + pIter += fts3GetVarint32(pIter, &iCol); + if( iCol>=p->nCol ) return FTS_CORRUPT_VTAB; + } + return SQLITE_OK; +} + +/* +** Gather the results for matchinfo directives 'y' and 'b'. +*/ +static int fts3ExprLHitGather( + Fts3Expr *pExpr, + MatchInfo *p +){ + int rc = SQLITE_OK; + assert( (pExpr->pLeft==0)==(pExpr->pRight==0) ); + if( pExpr->bEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){ + if( pExpr->pLeft ){ + rc = fts3ExprLHitGather(pExpr->pLeft, p); + if( rc==SQLITE_OK ) rc = fts3ExprLHitGather(pExpr->pRight, p); + }else{ + rc = fts3ExprLHits(pExpr, p); + } + } + return rc; +} + +/* +** fts3ExprIterate() callback used to collect the "global" matchinfo stats +** for a single query. +** +** fts3ExprIterate() callback to load the 'global' elements of a +** FTS3_MATCHINFO_HITS matchinfo array. The global stats are those elements +** of the matchinfo array that are constant for all rows returned by the +** current query. +** +** Argument pCtx is actually a pointer to a struct of type MatchInfo. This +** function populates Matchinfo.aMatchinfo[] as follows: +** +** for(iCol=0; iColpCursor, pExpr, &p->aMatchinfo[3*iPhrase*p->nCol] + ); +} + +/* +** fts3ExprIterate() callback used to collect the "local" part of the +** FTS3_MATCHINFO_HITS array. The local stats are those elements of the +** array that are different for each row returned by the query. +*/ +static int fts3ExprLocalHitsCb( + Fts3Expr *pExpr, /* Phrase expression node */ + int iPhrase, /* Phrase number */ + void *pCtx /* Pointer to MatchInfo structure */ +){ + int rc = SQLITE_OK; + MatchInfo *p = (MatchInfo *)pCtx; + int iStart = iPhrase * p->nCol * 3; + int i; + + for(i=0; inCol && rc==SQLITE_OK; i++){ + char *pCsr; + rc = sqlite3Fts3EvalPhrasePoslist(p->pCursor, pExpr, i, &pCsr); + if( pCsr ){ + p->aMatchinfo[iStart+i*3] = fts3ColumnlistCount(&pCsr); + }else{ + p->aMatchinfo[iStart+i*3] = 0; + } + } + + return rc; +} + +static int fts3MatchinfoCheck( + Fts3Table *pTab, + char cArg, + char **pzErr +){ + if( (cArg==FTS3_MATCHINFO_NPHRASE) + || (cArg==FTS3_MATCHINFO_NCOL) + || (cArg==FTS3_MATCHINFO_NDOC && pTab->bFts4) + || (cArg==FTS3_MATCHINFO_AVGLENGTH && pTab->bFts4) + || (cArg==FTS3_MATCHINFO_LENGTH && pTab->bHasDocsize) + || (cArg==FTS3_MATCHINFO_LCS) + || (cArg==FTS3_MATCHINFO_HITS) + || (cArg==FTS3_MATCHINFO_LHITS) + || (cArg==FTS3_MATCHINFO_LHITS_BM) + ){ + return SQLITE_OK; + } + sqlite3Fts3ErrMsg(pzErr, "unrecognized matchinfo request: %c", cArg); + return SQLITE_ERROR; +} + +static size_t fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ + size_t nVal; /* Number of integers output by cArg */ + + switch( cArg ){ + case FTS3_MATCHINFO_NDOC: + case FTS3_MATCHINFO_NPHRASE: + case FTS3_MATCHINFO_NCOL: + nVal = 1; + break; + + case FTS3_MATCHINFO_AVGLENGTH: + case FTS3_MATCHINFO_LENGTH: + case FTS3_MATCHINFO_LCS: + nVal = pInfo->nCol; + break; + + case FTS3_MATCHINFO_LHITS: + nVal = pInfo->nCol * pInfo->nPhrase; + break; + + case FTS3_MATCHINFO_LHITS_BM: + nVal = pInfo->nPhrase * ((pInfo->nCol + 31) / 32); + break; + + default: + assert( cArg==FTS3_MATCHINFO_HITS ); + nVal = pInfo->nCol * pInfo->nPhrase * 3; + break; + } + + return nVal; +} + +static int fts3MatchinfoSelectDoctotal( + Fts3Table *pTab, + sqlite3_stmt **ppStmt, + sqlite3_int64 *pnDoc, + const char **paLen, + const char **ppEnd +){ + sqlite3_stmt *pStmt; + const char *a; + const char *pEnd; + sqlite3_int64 nDoc; + int n; + + + if( !*ppStmt ){ + int rc = sqlite3Fts3SelectDoctotal(pTab, ppStmt); + if( rc!=SQLITE_OK ) return rc; + } + pStmt = *ppStmt; + assert( sqlite3_data_count(pStmt)==1 ); + + n = sqlite3_column_bytes(pStmt, 0); + a = sqlite3_column_blob(pStmt, 0); + if( a==0 ){ + return FTS_CORRUPT_VTAB; + } + pEnd = a + n; + a += sqlite3Fts3GetVarintBounded(a, pEnd, &nDoc); + if( nDoc<=0 || a>pEnd ){ + return FTS_CORRUPT_VTAB; + } + *pnDoc = nDoc; + + if( paLen ) *paLen = a; + if( ppEnd ) *ppEnd = pEnd; + return SQLITE_OK; +} + +/* +** An instance of the following structure is used to store state while +** iterating through a multi-column position-list corresponding to the +** hits for a single phrase on a single row in order to calculate the +** values for a matchinfo() FTS3_MATCHINFO_LCS request. +*/ +typedef struct LcsIterator LcsIterator; +struct LcsIterator { + Fts3Expr *pExpr; /* Pointer to phrase expression */ + int iPosOffset; /* Tokens count up to end of this phrase */ + char *pRead; /* Cursor used to iterate through aDoclist */ + int iPos; /* Current position */ +}; + +/* +** If LcsIterator.iCol is set to the following value, the iterator has +** finished iterating through all offsets for all columns. +*/ +#define LCS_ITERATOR_FINISHED 0x7FFFFFFF; + +static int fts3MatchinfoLcsCb( + Fts3Expr *pExpr, /* Phrase expression node */ + int iPhrase, /* Phrase number (numbered from zero) */ + void *pCtx /* Pointer to MatchInfo structure */ +){ + LcsIterator *aIter = (LcsIterator *)pCtx; + aIter[iPhrase].pExpr = pExpr; + return SQLITE_OK; +} + +/* +** Advance the iterator passed as an argument to the next position. Return +** 1 if the iterator is at EOF or if it now points to the start of the +** position list for the next column. +*/ +static int fts3LcsIteratorAdvance(LcsIterator *pIter){ + char *pRead = pIter->pRead; + sqlite3_int64 iRead; + int rc = 0; + + pRead += sqlite3Fts3GetVarint(pRead, &iRead); + if( iRead==0 || iRead==1 ){ + pRead = 0; + rc = 1; + }else{ + pIter->iPos += (int)(iRead-2); + } + + pIter->pRead = pRead; + return rc; +} + +/* +** This function implements the FTS3_MATCHINFO_LCS matchinfo() flag. +** +** If the call is successful, the longest-common-substring lengths for each +** column are written into the first nCol elements of the pInfo->aMatchinfo[] +** array before returning. SQLITE_OK is returned in this case. +** +** Otherwise, if an error occurs, an SQLite error code is returned and the +** data written to the first nCol elements of pInfo->aMatchinfo[] is +** undefined. +*/ +static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ + LcsIterator *aIter; + int i; + int iCol; + int nToken = 0; + int rc = SQLITE_OK; + + /* Allocate and populate the array of LcsIterator objects. The array + ** contains one element for each matchable phrase in the query. + **/ + aIter = sqlite3_malloc64(sizeof(LcsIterator) * pCsr->nPhrase); + if( !aIter ) return SQLITE_NOMEM; + memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase); + (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter); + + for(i=0; inPhrase; i++){ + LcsIterator *pIter = &aIter[i]; + nToken -= pIter->pExpr->pPhrase->nToken; + pIter->iPosOffset = nToken; + } + + for(iCol=0; iColnCol; iCol++){ + int nLcs = 0; /* LCS value for this column */ + int nLive = 0; /* Number of iterators in aIter not at EOF */ + + for(i=0; inPhrase; i++){ + LcsIterator *pIt = &aIter[i]; + rc = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol, &pIt->pRead); + if( rc!=SQLITE_OK ) goto matchinfo_lcs_out; + if( pIt->pRead ){ + pIt->iPos = pIt->iPosOffset; + fts3LcsIteratorAdvance(pIt); + if( pIt->pRead==0 ){ + rc = FTS_CORRUPT_VTAB; + goto matchinfo_lcs_out; + } + nLive++; + } + } + + while( nLive>0 ){ + LcsIterator *pAdv = 0; /* The iterator to advance by one position */ + int nThisLcs = 0; /* LCS for the current iterator positions */ + + for(i=0; inPhrase; i++){ + LcsIterator *pIter = &aIter[i]; + if( pIter->pRead==0 ){ + /* This iterator is already at EOF for this column. */ + nThisLcs = 0; + }else{ + if( pAdv==0 || pIter->iPosiPos ){ + pAdv = pIter; + } + if( nThisLcs==0 || pIter->iPos==pIter[-1].iPos ){ + nThisLcs++; + }else{ + nThisLcs = 1; + } + if( nThisLcs>nLcs ) nLcs = nThisLcs; + } + } + if( fts3LcsIteratorAdvance(pAdv) ) nLive--; + } + + pInfo->aMatchinfo[iCol] = nLcs; + } + + matchinfo_lcs_out: + sqlite3_free(aIter); + return rc; +} + +/* +** Populate the buffer pInfo->aMatchinfo[] with an array of integers to +** be returned by the matchinfo() function. Argument zArg contains the +** format string passed as the second argument to matchinfo (or the +** default value "pcx" if no second argument was specified). The format +** string has already been validated and the pInfo->aMatchinfo[] array +** is guaranteed to be large enough for the output. +** +** If bGlobal is true, then populate all fields of the matchinfo() output. +** If it is false, then assume that those fields that do not change between +** rows (i.e. FTS3_MATCHINFO_NPHRASE, NCOL, NDOC, AVGLENGTH and part of HITS) +** have already been populated. +** +** Return SQLITE_OK if successful, or an SQLite error code if an error +** occurs. If a value other than SQLITE_OK is returned, the state the +** pInfo->aMatchinfo[] buffer is left in is undefined. +*/ +static int fts3MatchinfoValues( + Fts3Cursor *pCsr, /* FTS3 cursor object */ + int bGlobal, /* True to grab the global stats */ + MatchInfo *pInfo, /* Matchinfo context object */ + const char *zArg /* Matchinfo format string */ +){ + int rc = SQLITE_OK; + int i; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + sqlite3_stmt *pSelect = 0; + + for(i=0; rc==SQLITE_OK && zArg[i]; i++){ + pInfo->flag = zArg[i]; + switch( zArg[i] ){ + case FTS3_MATCHINFO_NPHRASE: + if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nPhrase; + break; + + case FTS3_MATCHINFO_NCOL: + if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nCol; + break; + + case FTS3_MATCHINFO_NDOC: + if( bGlobal ){ + sqlite3_int64 nDoc = 0; + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, 0, 0); + pInfo->aMatchinfo[0] = (u32)nDoc; + } + break; + + case FTS3_MATCHINFO_AVGLENGTH: + if( bGlobal ){ + sqlite3_int64 nDoc; /* Number of rows in table */ + const char *a; /* Aggregate column length array */ + const char *pEnd; /* First byte past end of length array */ + + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, &a, &pEnd); + if( rc==SQLITE_OK ){ + int iCol; + for(iCol=0; iColnCol; iCol++){ + u32 iVal; + sqlite3_int64 nToken; + a += sqlite3Fts3GetVarint(a, &nToken); + if( a>pEnd ){ + rc = SQLITE_CORRUPT_VTAB; + break; + } + iVal = (u32)(((u32)(nToken&0xffffffff)+nDoc/2)/nDoc); + pInfo->aMatchinfo[iCol] = iVal; + } + } + } + break; + + case FTS3_MATCHINFO_LENGTH: { + sqlite3_stmt *pSelectDocsize = 0; + rc = sqlite3Fts3SelectDocsize(pTab, pCsr->iPrevId, &pSelectDocsize); + if( rc==SQLITE_OK ){ + int iCol; + const char *a = sqlite3_column_blob(pSelectDocsize, 0); + const char *pEnd = a + sqlite3_column_bytes(pSelectDocsize, 0); + for(iCol=0; iColnCol; iCol++){ + sqlite3_int64 nToken; + a += sqlite3Fts3GetVarintBounded(a, pEnd, &nToken); + if( a>pEnd ){ + rc = SQLITE_CORRUPT_VTAB; + break; + } + pInfo->aMatchinfo[iCol] = (u32)nToken; + } + } + sqlite3_reset(pSelectDocsize); + break; + } + + case FTS3_MATCHINFO_LCS: + rc = fts3ExprLoadDoclists(pCsr, 0, 0); + if( rc==SQLITE_OK ){ + rc = fts3MatchinfoLcs(pCsr, pInfo); + } + break; + + case FTS3_MATCHINFO_LHITS_BM: + case FTS3_MATCHINFO_LHITS: { + size_t nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); + memset(pInfo->aMatchinfo, 0, nZero); + rc = fts3ExprLHitGather(pCsr->pExpr, pInfo); + break; + } + + default: { + Fts3Expr *pExpr; + assert( zArg[i]==FTS3_MATCHINFO_HITS ); + pExpr = pCsr->pExpr; + rc = fts3ExprLoadDoclists(pCsr, 0, 0); + if( rc!=SQLITE_OK ) break; + if( bGlobal ){ + if( pCsr->pDeferred ){ + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &pInfo->nDoc,0,0); + if( rc!=SQLITE_OK ) break; + } + rc = fts3ExprIterate(pExpr, fts3ExprGlobalHitsCb,(void*)pInfo); + sqlite3Fts3EvalTestDeferred(pCsr, &rc); + if( rc!=SQLITE_OK ) break; + } + (void)fts3ExprIterate(pExpr, fts3ExprLocalHitsCb,(void*)pInfo); + break; + } + } + + pInfo->aMatchinfo += fts3MatchinfoSize(pInfo, zArg[i]); + } + + sqlite3_reset(pSelect); + return rc; +} + + +/* +** Populate pCsr->aMatchinfo[] with data for the current row. The +** 'matchinfo' data is an array of 32-bit unsigned integers (C type u32). +*/ +static void fts3GetMatchinfo( + sqlite3_context *pCtx, /* Return results here */ + Fts3Cursor *pCsr, /* FTS3 Cursor object */ + const char *zArg /* Second argument to matchinfo() function */ +){ + MatchInfo sInfo; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int bGlobal = 0; /* Collect 'global' stats as well as local */ + + u32 *aOut = 0; + void (*xDestroyOut)(void*) = 0; + + memset(&sInfo, 0, sizeof(MatchInfo)); + sInfo.pCursor = pCsr; + sInfo.nCol = pTab->nColumn; + + /* If there is cached matchinfo() data, but the format string for the + ** cache does not match the format string for this request, discard + ** the cached data. */ + if( pCsr->pMIBuffer && strcmp(pCsr->pMIBuffer->zMatchinfo, zArg) ){ + sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); + pCsr->pMIBuffer = 0; + } + + /* If Fts3Cursor.pMIBuffer is NULL, then this is the first time the + ** matchinfo function has been called for this query. In this case + ** allocate the array used to accumulate the matchinfo data and + ** initialize those elements that are constant for every row. + */ + if( pCsr->pMIBuffer==0 ){ + size_t nMatchinfo = 0; /* Number of u32 elements in match-info */ + int i; /* Used to iterate through zArg */ + + /* Determine the number of phrases in the query */ + pCsr->nPhrase = fts3ExprPhraseCount(pCsr->pExpr); + sInfo.nPhrase = pCsr->nPhrase; + + /* Determine the number of integers in the buffer returned by this call. */ + for(i=0; zArg[i]; i++){ + char *zErr = 0; + if( fts3MatchinfoCheck(pTab, zArg[i], &zErr) ){ + sqlite3_result_error(pCtx, zErr, -1); + sqlite3_free(zErr); + return; + } + nMatchinfo += fts3MatchinfoSize(&sInfo, zArg[i]); + } + + /* Allocate space for Fts3Cursor.aMatchinfo[] and Fts3Cursor.zMatchinfo. */ + pCsr->pMIBuffer = fts3MIBufferNew(nMatchinfo, zArg); + if( !pCsr->pMIBuffer ) rc = SQLITE_NOMEM; + + pCsr->isMatchinfoNeeded = 1; + bGlobal = 1; + } + + if( rc==SQLITE_OK ){ + xDestroyOut = fts3MIBufferAlloc(pCsr->pMIBuffer, &aOut); + if( xDestroyOut==0 ){ + rc = SQLITE_NOMEM; + } + } + + if( rc==SQLITE_OK ){ + sInfo.aMatchinfo = aOut; + sInfo.nPhrase = pCsr->nPhrase; + rc = fts3MatchinfoValues(pCsr, bGlobal, &sInfo, zArg); + if( bGlobal ){ + fts3MIBufferSetGlobal(pCsr->pMIBuffer); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + if( xDestroyOut ) xDestroyOut(aOut); + }else{ + int n = pCsr->pMIBuffer->nElem * sizeof(u32); + sqlite3_result_blob(pCtx, aOut, n, xDestroyOut); + } +} + +/* +** Implementation of snippet() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3Snippet( + sqlite3_context *pCtx, /* SQLite function call context */ + Fts3Cursor *pCsr, /* Cursor object */ + const char *zStart, /* Snippet start text - "" */ + const char *zEnd, /* Snippet end text - "" */ + const char *zEllipsis, /* Snippet ellipsis text - "..." */ + int iCol, /* Extract snippet from this column */ + int nToken /* Approximate number of tokens in snippet */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int i; + StrBuffer res = {0, 0, 0}; + + /* The returned text includes up to four fragments of text extracted from + ** the data in the current row. The first iteration of the for(...) loop + ** below attempts to locate a single fragment of text nToken tokens in + ** size that contains at least one instance of all phrases in the query + ** expression that appear in the current row. If such a fragment of text + ** cannot be found, the second iteration of the loop attempts to locate + ** a pair of fragments, and so on. + */ + int nSnippet = 0; /* Number of fragments in this snippet */ + SnippetFragment aSnippet[4]; /* Maximum of 4 fragments per snippet */ + int nFToken = -1; /* Number of tokens in each fragment */ + + if( !pCsr->pExpr ){ + sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); + return; + } + + /* Limit the snippet length to 64 tokens. */ + if( nToken<-64 ) nToken = -64; + if( nToken>+64 ) nToken = +64; + + for(nSnippet=1; 1; nSnippet++){ + + int iSnip; /* Loop counter 0..nSnippet-1 */ + u64 mCovered = 0; /* Bitmask of phrases covered by snippet */ + u64 mSeen = 0; /* Bitmask of phrases seen by BestSnippet() */ + + if( nToken>=0 ){ + nFToken = (nToken+nSnippet-1) / nSnippet; + }else{ + nFToken = -1 * nToken; + } + + for(iSnip=0; iSnipnColumn; iRead++){ + SnippetFragment sF = {0, 0, 0, 0}; + int iS = 0; + if( iCol>=0 && iRead!=iCol ) continue; + + /* Find the best snippet of nFToken tokens in column iRead. */ + rc = fts3BestSnippet(nFToken, pCsr, iRead, mCovered, &mSeen, &sF, &iS); + if( rc!=SQLITE_OK ){ + goto snippet_out; + } + if( iS>iBestScore ){ + *pFragment = sF; + iBestScore = iS; + } + } + + mCovered |= pFragment->covered; + } + + /* If all query phrases seen by fts3BestSnippet() are present in at least + ** one of the nSnippet snippet fragments, break out of the loop. + */ + assert( (mCovered&mSeen)==mCovered ); + if( mSeen==mCovered || nSnippet==SizeofArray(aSnippet) ) break; + } + + assert( nFToken>0 ); + + for(i=0; ipCsr, pExpr, p->iCol, &pList); + nTerm = pExpr->pPhrase->nToken; + if( pList ){ + fts3GetDeltaPosition(&pList, &iPos); + assert_fts3_nc( iPos>=0 ); + } + + for(iTerm=0; iTermaTerm[p->iTerm++]; + pT->iOff = nTerm-iTerm-1; + pT->pList = pList; + pT->iPos = iPos; + } + + return rc; +} + +/* +** Implementation of offsets() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3Offsets( + sqlite3_context *pCtx, /* SQLite function call context */ + Fts3Cursor *pCsr /* Cursor object */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + sqlite3_tokenizer_module const *pMod = pTab->pTokenizer->pModule; + int rc; /* Return Code */ + int nToken; /* Number of tokens in query */ + int iCol; /* Column currently being processed */ + StrBuffer res = {0, 0, 0}; /* Result string */ + TermOffsetCtx sCtx; /* Context for fts3ExprTermOffsetInit() */ + + if( !pCsr->pExpr ){ + sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); + return; + } + + memset(&sCtx, 0, sizeof(sCtx)); + assert( pCsr->isRequireSeek==0 ); + + /* Count the number of terms in the query */ + rc = fts3ExprLoadDoclists(pCsr, 0, &nToken); + if( rc!=SQLITE_OK ) goto offsets_out; + + /* Allocate the array of TermOffset iterators. */ + sCtx.aTerm = (TermOffset *)sqlite3_malloc64(sizeof(TermOffset)*nToken); + if( 0==sCtx.aTerm ){ + rc = SQLITE_NOMEM; + goto offsets_out; + } + sCtx.iDocid = pCsr->iPrevId; + sCtx.pCsr = pCsr; + + /* Loop through the table columns, appending offset information to + ** string-buffer res for each column. + */ + for(iCol=0; iColnColumn; iCol++){ + sqlite3_tokenizer_cursor *pC; /* Tokenizer cursor */ + const char *ZDUMMY; /* Dummy argument used with xNext() */ + int NDUMMY = 0; /* Dummy argument used with xNext() */ + int iStart = 0; + int iEnd = 0; + int iCurrent = 0; + const char *zDoc; + int nDoc; + + /* Initialize the contents of sCtx.aTerm[] for column iCol. There is + ** no way that this operation can fail, so the return code from + ** fts3ExprIterate() can be discarded. + */ + sCtx.iCol = iCol; + sCtx.iTerm = 0; + (void)fts3ExprIterate(pCsr->pExpr, fts3ExprTermOffsetInit, (void*)&sCtx); + + /* Retreive the text stored in column iCol. If an SQL NULL is stored + ** in column iCol, jump immediately to the next iteration of the loop. + ** If an OOM occurs while retrieving the data (this can happen if SQLite + ** needs to transform the data from utf-16 to utf-8), return SQLITE_NOMEM + ** to the caller. + */ + zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol+1); + nDoc = sqlite3_column_bytes(pCsr->pStmt, iCol+1); + if( zDoc==0 ){ + if( sqlite3_column_type(pCsr->pStmt, iCol+1)==SQLITE_NULL ){ + continue; + } + rc = SQLITE_NOMEM; + goto offsets_out; + } + + /* Initialize a tokenizer iterator to iterate through column iCol. */ + rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, pCsr->iLangid, + zDoc, nDoc, &pC + ); + if( rc!=SQLITE_OK ) goto offsets_out; + + rc = pMod->xNext(pC, &ZDUMMY, &NDUMMY, &iStart, &iEnd, &iCurrent); + while( rc==SQLITE_OK ){ + int i; /* Used to loop through terms */ + int iMinPos = 0x7FFFFFFF; /* Position of next token */ + TermOffset *pTerm = 0; /* TermOffset associated with next token */ + + for(i=0; ipList && (pT->iPos-pT->iOff)iPos-pT->iOff; + pTerm = pT; + } + } + + if( !pTerm ){ + /* All offsets for this column have been gathered. */ + rc = SQLITE_DONE; + }else{ + assert_fts3_nc( iCurrent<=iMinPos ); + if( 0==(0xFE&*pTerm->pList) ){ + pTerm->pList = 0; + }else{ + fts3GetDeltaPosition(&pTerm->pList, &pTerm->iPos); + } + while( rc==SQLITE_OK && iCurrentxNext(pC, &ZDUMMY, &NDUMMY, &iStart, &iEnd, &iCurrent); + } + if( rc==SQLITE_OK ){ + char aBuffer[64]; + sqlite3_snprintf(sizeof(aBuffer), aBuffer, + "%d %d %d %d ", iCol, pTerm-sCtx.aTerm, iStart, iEnd-iStart + ); + rc = fts3StringAppend(&res, aBuffer, -1); + }else if( rc==SQLITE_DONE && pTab->zContentTbl==0 ){ + rc = FTS_CORRUPT_VTAB; + } + } + } + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + } + + pMod->xClose(pC); + if( rc!=SQLITE_OK ) goto offsets_out; + } + + offsets_out: + sqlite3_free(sCtx.aTerm); + assert( rc!=SQLITE_DONE ); + sqlite3Fts3SegmentsClose(pTab); + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + sqlite3_free(res.z); + }else{ + sqlite3_result_text(pCtx, res.z, res.n-1, sqlite3_free); + } + return; +} + +/* +** Implementation of matchinfo() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3Matchinfo( + sqlite3_context *pContext, /* Function call context */ + Fts3Cursor *pCsr, /* FTS3 table cursor */ + const char *zArg /* Second arg to matchinfo() function */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + const char *zFormat; + + if( zArg ){ + zFormat = zArg; + }else{ + zFormat = FTS3_MATCHINFO_DEFAULT; + } + + if( !pCsr->pExpr ){ + sqlite3_result_blob(pContext, "", 0, SQLITE_STATIC); + return; + }else{ + /* Retrieve matchinfo() data. */ + fts3GetMatchinfo(pContext, pCsr, zFormat); + sqlite3Fts3SegmentsClose(pTab); + } +} + +#endif + +/************** End of fts3_snippet.c ****************************************/ +/************** Begin file fts3_unicode.c ************************************/ +/* +** 2012 May 24 +** +** 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. +** +****************************************************************************** +** +** Implementation of the "unicode" full-text-search tokenizer. +*/ + +#ifndef SQLITE_DISABLE_FTS3_UNICODE + +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_tokenizer.h" */ + +/* +** The following two macros - READ_UTF8 and WRITE_UTF8 - have been copied +** from the sqlite3 source file utf.c. If this file is compiled as part +** of the amalgamation, they are not required. +*/ +#ifndef SQLITE_AMALGAMATION + +static const unsigned char sqlite3Utf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + +#define READ_UTF8(zIn, zTerm, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = sqlite3Utf8Trans1[c-0xc0]; \ + while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + if( c<0x80 \ + || (c&0xFFFFF800)==0xD800 \ + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \ + } + +#define WRITE_UTF8(zOut, c) { \ + if( c<0x00080 ){ \ + *zOut++ = (u8)(c&0xFF); \ + } \ + else if( c<0x00800 ){ \ + *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ + else if( c<0x10000 ){ \ + *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + }else{ \ + *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); \ + *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ +} + +#endif /* ifndef SQLITE_AMALGAMATION */ + +typedef struct unicode_tokenizer unicode_tokenizer; +typedef struct unicode_cursor unicode_cursor; + +struct unicode_tokenizer { + sqlite3_tokenizer base; + int eRemoveDiacritic; + int nException; + int *aiException; +}; + +struct unicode_cursor { + sqlite3_tokenizer_cursor base; + const unsigned char *aInput; /* Input text being tokenized */ + int nInput; /* Size of aInput[] in bytes */ + int iOff; /* Current offset within aInput[] */ + int iToken; /* Index of next token to be returned */ + char *zToken; /* storage for current token */ + int nAlloc; /* space allocated at zToken */ +}; + + +/* +** Destroy a tokenizer allocated by unicodeCreate(). +*/ +static int unicodeDestroy(sqlite3_tokenizer *pTokenizer){ + if( pTokenizer ){ + unicode_tokenizer *p = (unicode_tokenizer *)pTokenizer; + sqlite3_free(p->aiException); + sqlite3_free(p); + } + return SQLITE_OK; +} + +/* +** As part of a tokenchars= or separators= option, the CREATE VIRTUAL TABLE +** statement has specified that the tokenizer for this table shall consider +** all characters in string zIn/nIn to be separators (if bAlnum==0) or +** token characters (if bAlnum==1). +** +** For each codepoint in the zIn/nIn string, this function checks if the +** sqlite3FtsUnicodeIsalnum() function already returns the desired result. +** If so, no action is taken. Otherwise, the codepoint is added to the +** unicode_tokenizer.aiException[] array. For the purposes of tokenization, +** the return value of sqlite3FtsUnicodeIsalnum() is inverted for all +** codepoints in the aiException[] array. +** +** If a standalone diacritic mark (one that sqlite3FtsUnicodeIsdiacritic() +** identifies as a diacritic) occurs in the zIn/nIn string it is ignored. +** It is not possible to change the behavior of the tokenizer with respect +** to these codepoints. +*/ +static int unicodeAddExceptions( + unicode_tokenizer *p, /* Tokenizer to add exceptions to */ + int bAlnum, /* Replace Isalnum() return value with this */ + const char *zIn, /* Array of characters to make exceptions */ + int nIn /* Length of z in bytes */ +){ + const unsigned char *z = (const unsigned char *)zIn; + const unsigned char *zTerm = &z[nIn]; + unsigned int iCode; + int nEntry = 0; + + assert( bAlnum==0 || bAlnum==1 ); + + while( zaiException,(p->nException+nEntry)*sizeof(int)); + if( aNew==0 ) return SQLITE_NOMEM; + nNew = p->nException; + + z = (const unsigned char *)zIn; + while( zi; j--) aNew[j] = aNew[j-1]; + aNew[i] = (int)iCode; + nNew++; + } + } + p->aiException = aNew; + p->nException = nNew; + } + + return SQLITE_OK; +} + +/* +** Return true if the p->aiException[] array contains the value iCode. +*/ +static int unicodeIsException(unicode_tokenizer *p, int iCode){ + if( p->nException>0 ){ + int *a = p->aiException; + int iLo = 0; + int iHi = p->nException-1; + + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( iCode==a[iTest] ){ + return 1; + }else if( iCode>a[iTest] ){ + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + } + + return 0; +} + +/* +** Return true if, for the purposes of tokenization, codepoint iCode is +** considered a token character (not a separator). +*/ +static int unicodeIsAlnum(unicode_tokenizer *p, int iCode){ + assert( (sqlite3FtsUnicodeIsalnum(iCode) & 0xFFFFFFFE)==0 ); + return sqlite3FtsUnicodeIsalnum(iCode) ^ unicodeIsException(p, iCode); +} + +/* +** Create a new tokenizer instance. +*/ +static int unicodeCreate( + int nArg, /* Size of array argv[] */ + const char * const *azArg, /* Tokenizer creation arguments */ + sqlite3_tokenizer **pp /* OUT: New tokenizer handle */ +){ + unicode_tokenizer *pNew; /* New tokenizer object */ + int i; + int rc = SQLITE_OK; + + pNew = (unicode_tokenizer *) sqlite3_malloc(sizeof(unicode_tokenizer)); + if( pNew==NULL ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(unicode_tokenizer)); + pNew->eRemoveDiacritic = 1; + + for(i=0; rc==SQLITE_OK && ieRemoveDiacritic = 1; + } + else if( n==19 && memcmp("remove_diacritics=0", z, 19)==0 ){ + pNew->eRemoveDiacritic = 0; + } + else if( n==19 && memcmp("remove_diacritics=2", z, 19)==0 ){ + pNew->eRemoveDiacritic = 2; + } + else if( n>=11 && memcmp("tokenchars=", z, 11)==0 ){ + rc = unicodeAddExceptions(pNew, 1, &z[11], n-11); + } + else if( n>=11 && memcmp("separators=", z, 11)==0 ){ + rc = unicodeAddExceptions(pNew, 0, &z[11], n-11); + } + else{ + /* Unrecognized argument */ + rc = SQLITE_ERROR; + } + } + + if( rc!=SQLITE_OK ){ + unicodeDestroy((sqlite3_tokenizer *)pNew); + pNew = 0; + } + *pp = (sqlite3_tokenizer *)pNew; + return rc; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int unicodeOpen( + sqlite3_tokenizer *p, /* The tokenizer */ + const char *aInput, /* Input string */ + int nInput, /* Size of string aInput in bytes */ + sqlite3_tokenizer_cursor **pp /* OUT: New cursor object */ +){ + unicode_cursor *pCsr; + + pCsr = (unicode_cursor *)sqlite3_malloc(sizeof(unicode_cursor)); + if( pCsr==0 ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(unicode_cursor)); + + pCsr->aInput = (const unsigned char *)aInput; + if( aInput==0 ){ + pCsr->nInput = 0; + }else if( nInput<0 ){ + pCsr->nInput = (int)strlen(aInput); + }else{ + pCsr->nInput = nInput; + } + + *pp = &pCsr->base; + UNUSED_PARAMETER(p); + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** simpleOpen() above. +*/ +static int unicodeClose(sqlite3_tokenizer_cursor *pCursor){ + unicode_cursor *pCsr = (unicode_cursor *) pCursor; + sqlite3_free(pCsr->zToken); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to simpleOpen(). +*/ +static int unicodeNext( + sqlite3_tokenizer_cursor *pC, /* Cursor returned by simpleOpen */ + const char **paToken, /* OUT: Token text */ + int *pnToken, /* OUT: Number of bytes at *paToken */ + int *piStart, /* OUT: Starting offset of token */ + int *piEnd, /* OUT: Ending offset of token */ + int *piPos /* OUT: Position integer of token */ +){ + unicode_cursor *pCsr = (unicode_cursor *)pC; + unicode_tokenizer *p = ((unicode_tokenizer *)pCsr->base.pTokenizer); + unsigned int iCode = 0; + char *zOut; + const unsigned char *z = &pCsr->aInput[pCsr->iOff]; + const unsigned char *zStart = z; + const unsigned char *zEnd; + const unsigned char *zTerm = &pCsr->aInput[pCsr->nInput]; + + /* Scan past any delimiter characters before the start of the next token. + ** Return SQLITE_DONE early if this takes us all the way to the end of + ** the input. */ + while( z=zTerm ) return SQLITE_DONE; + + zOut = pCsr->zToken; + do { + int iOut; + + /* Grow the output buffer if required. */ + if( (zOut-pCsr->zToken)>=(pCsr->nAlloc-4) ){ + char *zNew = sqlite3_realloc64(pCsr->zToken, pCsr->nAlloc+64); + if( !zNew ) return SQLITE_NOMEM; + zOut = &zNew[zOut - pCsr->zToken]; + pCsr->zToken = zNew; + pCsr->nAlloc += 64; + } + + /* Write the folded case of the last character read to the output */ + zEnd = z; + iOut = sqlite3FtsUnicodeFold((int)iCode, p->eRemoveDiacritic); + if( iOut ){ + WRITE_UTF8(zOut, iOut); + } + + /* If the cursor is not at EOF, read the next character */ + if( z>=zTerm ) break; + READ_UTF8(z, zTerm, iCode); + }while( unicodeIsAlnum(p, (int)iCode) + || sqlite3FtsUnicodeIsdiacritic((int)iCode) + ); + + /* Set the output variables and return. */ + pCsr->iOff = (int)(z - pCsr->aInput); + *paToken = pCsr->zToken; + *pnToken = (int)(zOut - pCsr->zToken); + *piStart = (int)(zStart - pCsr->aInput); + *piEnd = (int)(zEnd - pCsr->aInput); + *piPos = pCsr->iToken++; + return SQLITE_OK; +} + +/* +** Set *ppModule to a pointer to the sqlite3_tokenizer_module +** structure for the unicode tokenizer. +*/ +SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const **ppModule){ + static const sqlite3_tokenizer_module module = { + 0, + unicodeCreate, + unicodeDestroy, + unicodeOpen, + unicodeClose, + unicodeNext, + 0, + }; + *ppModule = &module; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ +#endif /* ifndef SQLITE_DISABLE_FTS3_UNICODE */ + +/************** End of fts3_unicode.c ****************************************/ +/************** Begin file fts3_unicode2.c ***********************************/ +/* +** 2012-05-25 +** +** 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. +** +****************************************************************************** +*/ + +/* +** DO NOT EDIT THIS MACHINE GENERATED FILE. +*/ + +#ifndef SQLITE_DISABLE_FTS3_UNICODE +#if defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4) + +/* #include */ + +/* +** Return true if the argument corresponds to a unicode codepoint +** classified as either a letter or a number. Otherwise false. +** +** The results are undefined if the value passed to this function +** is less than zero. +*/ +SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ + /* Each unsigned integer in the following array corresponds to a contiguous + ** range of unicode codepoints that are not either letters or numbers (i.e. + ** codepoints for which this function should return 0). + ** + ** The most significant 22 bits in each 32-bit value contain the first + ** codepoint in the range. The least significant 10 bits are used to store + ** the size of the range (always at least 1). In other words, the value + ** ((C<<22) + N) represents a range of N codepoints starting with codepoint + ** C. It is not possible to represent a range larger than 1023 codepoints + ** using this format. + */ + static const unsigned int aEntry[] = { + 0x00000030, 0x0000E807, 0x00016C06, 0x0001EC2F, 0x0002AC07, + 0x0002D001, 0x0002D803, 0x0002EC01, 0x0002FC01, 0x00035C01, + 0x0003DC01, 0x000B0804, 0x000B480E, 0x000B9407, 0x000BB401, + 0x000BBC81, 0x000DD401, 0x000DF801, 0x000E1002, 0x000E1C01, + 0x000FD801, 0x00120808, 0x00156806, 0x00162402, 0x00163C01, + 0x00164437, 0x0017CC02, 0x00180005, 0x00181816, 0x00187802, + 0x00192C15, 0x0019A804, 0x0019C001, 0x001B5001, 0x001B580F, + 0x001B9C07, 0x001BF402, 0x001C000E, 0x001C3C01, 0x001C4401, + 0x001CC01B, 0x001E980B, 0x001FAC09, 0x001FD804, 0x00205804, + 0x00206C09, 0x00209403, 0x0020A405, 0x0020C00F, 0x00216403, + 0x00217801, 0x0023901B, 0x00240004, 0x0024E803, 0x0024F812, + 0x00254407, 0x00258804, 0x0025C001, 0x00260403, 0x0026F001, + 0x0026F807, 0x00271C02, 0x00272C03, 0x00275C01, 0x00278802, + 0x0027C802, 0x0027E802, 0x00280403, 0x0028F001, 0x0028F805, + 0x00291C02, 0x00292C03, 0x00294401, 0x0029C002, 0x0029D401, + 0x002A0403, 0x002AF001, 0x002AF808, 0x002B1C03, 0x002B2C03, + 0x002B8802, 0x002BC002, 0x002C0403, 0x002CF001, 0x002CF807, + 0x002D1C02, 0x002D2C03, 0x002D5802, 0x002D8802, 0x002DC001, + 0x002E0801, 0x002EF805, 0x002F1803, 0x002F2804, 0x002F5C01, + 0x002FCC08, 0x00300403, 0x0030F807, 0x00311803, 0x00312804, + 0x00315402, 0x00318802, 0x0031FC01, 0x00320802, 0x0032F001, + 0x0032F807, 0x00331803, 0x00332804, 0x00335402, 0x00338802, + 0x00340802, 0x0034F807, 0x00351803, 0x00352804, 0x00355C01, + 0x00358802, 0x0035E401, 0x00360802, 0x00372801, 0x00373C06, + 0x00375801, 0x00376008, 0x0037C803, 0x0038C401, 0x0038D007, + 0x0038FC01, 0x00391C09, 0x00396802, 0x003AC401, 0x003AD006, + 0x003AEC02, 0x003B2006, 0x003C041F, 0x003CD00C, 0x003DC417, + 0x003E340B, 0x003E6424, 0x003EF80F, 0x003F380D, 0x0040AC14, + 0x00412806, 0x00415804, 0x00417803, 0x00418803, 0x00419C07, + 0x0041C404, 0x0042080C, 0x00423C01, 0x00426806, 0x0043EC01, + 0x004D740C, 0x004E400A, 0x00500001, 0x0059B402, 0x005A0001, + 0x005A6C02, 0x005BAC03, 0x005C4803, 0x005CC805, 0x005D4802, + 0x005DC802, 0x005ED023, 0x005F6004, 0x005F7401, 0x0060000F, + 0x0062A401, 0x0064800C, 0x0064C00C, 0x00650001, 0x00651002, + 0x0066C011, 0x00672002, 0x00677822, 0x00685C05, 0x00687802, + 0x0069540A, 0x0069801D, 0x0069FC01, 0x006A8007, 0x006AA006, + 0x006C0005, 0x006CD011, 0x006D6823, 0x006E0003, 0x006E840D, + 0x006F980E, 0x006FF004, 0x00709014, 0x0070EC05, 0x0071F802, + 0x00730008, 0x00734019, 0x0073B401, 0x0073C803, 0x00770027, + 0x0077F004, 0x007EF401, 0x007EFC03, 0x007F3403, 0x007F7403, + 0x007FB403, 0x007FF402, 0x00800065, 0x0081A806, 0x0081E805, + 0x00822805, 0x0082801A, 0x00834021, 0x00840002, 0x00840C04, + 0x00842002, 0x00845001, 0x00845803, 0x00847806, 0x00849401, + 0x00849C01, 0x0084A401, 0x0084B801, 0x0084E802, 0x00850005, + 0x00852804, 0x00853C01, 0x00864264, 0x00900027, 0x0091000B, + 0x0092704E, 0x00940200, 0x009C0475, 0x009E53B9, 0x00AD400A, + 0x00B39406, 0x00B3BC03, 0x00B3E404, 0x00B3F802, 0x00B5C001, + 0x00B5FC01, 0x00B7804F, 0x00B8C00C, 0x00BA001A, 0x00BA6C59, + 0x00BC00D6, 0x00BFC00C, 0x00C00005, 0x00C02019, 0x00C0A807, + 0x00C0D802, 0x00C0F403, 0x00C26404, 0x00C28001, 0x00C3EC01, + 0x00C64002, 0x00C6580A, 0x00C70024, 0x00C8001F, 0x00C8A81E, + 0x00C94001, 0x00C98020, 0x00CA2827, 0x00CB003F, 0x00CC0100, + 0x01370040, 0x02924037, 0x0293F802, 0x02983403, 0x0299BC10, + 0x029A7C01, 0x029BC008, 0x029C0017, 0x029C8002, 0x029E2402, + 0x02A00801, 0x02A01801, 0x02A02C01, 0x02A08C09, 0x02A0D804, + 0x02A1D004, 0x02A20002, 0x02A2D011, 0x02A33802, 0x02A38012, + 0x02A3E003, 0x02A4980A, 0x02A51C0D, 0x02A57C01, 0x02A60004, + 0x02A6CC1B, 0x02A77802, 0x02A8A40E, 0x02A90C01, 0x02A93002, + 0x02A97004, 0x02A9DC03, 0x02A9EC01, 0x02AAC001, 0x02AAC803, + 0x02AADC02, 0x02AAF802, 0x02AB0401, 0x02AB7802, 0x02ABAC07, + 0x02ABD402, 0x02AF8C0B, 0x03600001, 0x036DFC02, 0x036FFC02, + 0x037FFC01, 0x03EC7801, 0x03ECA401, 0x03EEC810, 0x03F4F802, + 0x03F7F002, 0x03F8001A, 0x03F88007, 0x03F8C023, 0x03F95013, + 0x03F9A004, 0x03FBFC01, 0x03FC040F, 0x03FC6807, 0x03FCEC06, + 0x03FD6C0B, 0x03FF8007, 0x03FFA007, 0x03FFE405, 0x04040003, + 0x0404DC09, 0x0405E411, 0x0406400C, 0x0407402E, 0x040E7C01, + 0x040F4001, 0x04215C01, 0x04247C01, 0x0424FC01, 0x04280403, + 0x04281402, 0x04283004, 0x0428E003, 0x0428FC01, 0x04294009, + 0x0429FC01, 0x042CE407, 0x04400003, 0x0440E016, 0x04420003, + 0x0442C012, 0x04440003, 0x04449C0E, 0x04450004, 0x04460003, + 0x0446CC0E, 0x04471404, 0x045AAC0D, 0x0491C004, 0x05BD442E, + 0x05BE3C04, 0x074000F6, 0x07440027, 0x0744A4B5, 0x07480046, + 0x074C0057, 0x075B0401, 0x075B6C01, 0x075BEC01, 0x075C5401, + 0x075CD401, 0x075D3C01, 0x075DBC01, 0x075E2401, 0x075EA401, + 0x075F0C01, 0x07BBC002, 0x07C0002C, 0x07C0C064, 0x07C2800F, + 0x07C2C40E, 0x07C3040F, 0x07C3440F, 0x07C4401F, 0x07C4C03C, + 0x07C5C02B, 0x07C7981D, 0x07C8402B, 0x07C90009, 0x07C94002, + 0x07CC0021, 0x07CCC006, 0x07CCDC46, 0x07CE0014, 0x07CE8025, + 0x07CF1805, 0x07CF8011, 0x07D0003F, 0x07D10001, 0x07D108B6, + 0x07D3E404, 0x07D4003E, 0x07D50004, 0x07D54018, 0x07D7EC46, + 0x07D9140B, 0x07DA0046, 0x07DC0074, 0x38000401, 0x38008060, + 0x380400F0, + }; + static const unsigned int aAscii[4] = { + 0xFFFFFFFF, 0xFC00FFFF, 0xF8000001, 0xF8000001, + }; + + if( (unsigned int)c<128 ){ + return ( (aAscii[c >> 5] & ((unsigned int)1 << (c & 0x001F)))==0 ); + }else if( (unsigned int)c<(1<<22) ){ + unsigned int key = (((unsigned int)c)<<10) | 0x000003FF; + int iRes = 0; + int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; + int iLo = 0; + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( key >= aEntry[iTest] ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + assert( aEntry[0]=aEntry[iRes] ); + return (((unsigned int)c) >= ((aEntry[iRes]>>10) + (aEntry[iRes]&0x3FF))); + } + return 1; +} + + +/* +** If the argument is a codepoint corresponding to a lowercase letter +** in the ASCII range with a diacritic added, return the codepoint +** of the ASCII letter only. For example, if passed 235 - "LATIN +** SMALL LETTER E WITH DIAERESIS" - return 65 ("LATIN SMALL LETTER +** E"). The resuls of passing a codepoint that corresponds to an +** uppercase letter are undefined. +*/ +static int remove_diacritic(int c, int bComplex){ + unsigned short aDia[] = { + 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, + 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, + 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, + 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, + }; +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', + }; + + unsigned int key = (((unsigned int)c)<<3) | 0x00000007; + int iRes = 0; + int iHi = sizeof(aDia)/sizeof(aDia[0]) - 1; + int iLo = 0; + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( key >= aDia[iTest] ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + assert( key>=aDia[iRes] ); + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); +} + + +/* +** Return true if the argument interpreted as a unicode codepoint +** is a diacritical modifier character. +*/ +SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int c){ + unsigned int mask0 = 0x08029FDF; + unsigned int mask1 = 0x000361F8; + if( c<768 || c>817 ) return 0; + return (c < 768+32) ? + (mask0 & ((unsigned int)1 << (c-768))) : + (mask1 & ((unsigned int)1 << (c-768-32))); +} + + +/* +** Interpret the argument as a unicode codepoint. If the codepoint +** is an upper case character that has a lower case equivalent, +** return the codepoint corresponding to the lower case version. +** Otherwise, return a copy of the argument. +** +** The results are undefined if the value passed to this function +** is less than zero. +*/ +SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ + /* Each entry in the following array defines a rule for folding a range + ** of codepoints to lower case. The rule applies to a range of nRange + ** codepoints starting at codepoint iCode. + ** + ** If the least significant bit in flags is clear, then the rule applies + ** to all nRange codepoints (i.e. all nRange codepoints are upper case and + ** need to be folded). Or, if it is set, then the rule only applies to + ** every second codepoint in the range, starting with codepoint C. + ** + ** The 7 most significant bits in flags are an index into the aiOff[] + ** array. If a specific codepoint C does require folding, then its lower + ** case equivalent is ((C + aiOff[flags>>1]) & 0xFFFF). + ** + ** The contents of this array are generated by parsing the CaseFolding.txt + ** file distributed as part of the "Unicode Character Database". See + ** http://www.unicode.org for details. + */ + static const struct TableEntry { + unsigned short iCode; + unsigned char flags; + unsigned char nRange; + } aEntry[] = { + {65, 14, 26}, {181, 64, 1}, {192, 14, 23}, + {216, 14, 7}, {256, 1, 48}, {306, 1, 6}, + {313, 1, 16}, {330, 1, 46}, {376, 116, 1}, + {377, 1, 6}, {383, 104, 1}, {385, 50, 1}, + {386, 1, 4}, {390, 44, 1}, {391, 0, 1}, + {393, 42, 2}, {395, 0, 1}, {398, 32, 1}, + {399, 38, 1}, {400, 40, 1}, {401, 0, 1}, + {403, 42, 1}, {404, 46, 1}, {406, 52, 1}, + {407, 48, 1}, {408, 0, 1}, {412, 52, 1}, + {413, 54, 1}, {415, 56, 1}, {416, 1, 6}, + {422, 60, 1}, {423, 0, 1}, {425, 60, 1}, + {428, 0, 1}, {430, 60, 1}, {431, 0, 1}, + {433, 58, 2}, {435, 1, 4}, {439, 62, 1}, + {440, 0, 1}, {444, 0, 1}, {452, 2, 1}, + {453, 0, 1}, {455, 2, 1}, {456, 0, 1}, + {458, 2, 1}, {459, 1, 18}, {478, 1, 18}, + {497, 2, 1}, {498, 1, 4}, {502, 122, 1}, + {503, 134, 1}, {504, 1, 40}, {544, 110, 1}, + {546, 1, 18}, {570, 70, 1}, {571, 0, 1}, + {573, 108, 1}, {574, 68, 1}, {577, 0, 1}, + {579, 106, 1}, {580, 28, 1}, {581, 30, 1}, + {582, 1, 10}, {837, 36, 1}, {880, 1, 4}, + {886, 0, 1}, {902, 18, 1}, {904, 16, 3}, + {908, 26, 1}, {910, 24, 2}, {913, 14, 17}, + {931, 14, 9}, {962, 0, 1}, {975, 4, 1}, + {976, 140, 1}, {977, 142, 1}, {981, 146, 1}, + {982, 144, 1}, {984, 1, 24}, {1008, 136, 1}, + {1009, 138, 1}, {1012, 130, 1}, {1013, 128, 1}, + {1015, 0, 1}, {1017, 152, 1}, {1018, 0, 1}, + {1021, 110, 3}, {1024, 34, 16}, {1040, 14, 32}, + {1120, 1, 34}, {1162, 1, 54}, {1216, 6, 1}, + {1217, 1, 14}, {1232, 1, 88}, {1329, 22, 38}, + {4256, 66, 38}, {4295, 66, 1}, {4301, 66, 1}, + {7680, 1, 150}, {7835, 132, 1}, {7838, 96, 1}, + {7840, 1, 96}, {7944, 150, 8}, {7960, 150, 6}, + {7976, 150, 8}, {7992, 150, 8}, {8008, 150, 6}, + {8025, 151, 8}, {8040, 150, 8}, {8072, 150, 8}, + {8088, 150, 8}, {8104, 150, 8}, {8120, 150, 2}, + {8122, 126, 2}, {8124, 148, 1}, {8126, 100, 1}, + {8136, 124, 4}, {8140, 148, 1}, {8152, 150, 2}, + {8154, 120, 2}, {8168, 150, 2}, {8170, 118, 2}, + {8172, 152, 1}, {8184, 112, 2}, {8186, 114, 2}, + {8188, 148, 1}, {8486, 98, 1}, {8490, 92, 1}, + {8491, 94, 1}, {8498, 12, 1}, {8544, 8, 16}, + {8579, 0, 1}, {9398, 10, 26}, {11264, 22, 47}, + {11360, 0, 1}, {11362, 88, 1}, {11363, 102, 1}, + {11364, 90, 1}, {11367, 1, 6}, {11373, 84, 1}, + {11374, 86, 1}, {11375, 80, 1}, {11376, 82, 1}, + {11378, 0, 1}, {11381, 0, 1}, {11390, 78, 2}, + {11392, 1, 100}, {11499, 1, 4}, {11506, 0, 1}, + {42560, 1, 46}, {42624, 1, 24}, {42786, 1, 14}, + {42802, 1, 62}, {42873, 1, 4}, {42877, 76, 1}, + {42878, 1, 10}, {42891, 0, 1}, {42893, 74, 1}, + {42896, 1, 4}, {42912, 1, 10}, {42922, 72, 1}, + {65313, 14, 26}, + }; + static const unsigned short aiOff[] = { + 1, 2, 8, 15, 16, 26, 28, 32, + 37, 38, 40, 48, 63, 64, 69, 71, + 79, 80, 116, 202, 203, 205, 206, 207, + 209, 210, 211, 213, 214, 217, 218, 219, + 775, 7264, 10792, 10795, 23228, 23256, 30204, 54721, + 54753, 54754, 54756, 54787, 54793, 54809, 57153, 57274, + 57921, 58019, 58363, 61722, 65268, 65341, 65373, 65406, + 65408, 65410, 65415, 65424, 65436, 65439, 65450, 65462, + 65472, 65476, 65478, 65480, 65482, 65488, 65506, 65511, + 65514, 65521, 65527, 65528, 65529, + }; + + int ret = c; + + assert( sizeof(unsigned short)==2 && sizeof(unsigned char)==1 ); + + if( c<128 ){ + if( c>='A' && c<='Z' ) ret = c + ('a' - 'A'); + }else if( c<65536 ){ + const struct TableEntry *p; + int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; + int iLo = 0; + int iRes = -1; + + assert( c>aEntry[0].iCode ); + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + int cmp = (c - aEntry[iTest].iCode); + if( cmp>=0 ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + + assert( iRes>=0 && c>=aEntry[iRes].iCode ); + p = &aEntry[iRes]; + if( c<(p->iCode + p->nRange) && 0==(0x01 & p->flags & (p->iCode ^ c)) ){ + ret = (c + (aiOff[p->flags>>1])) & 0x0000FFFF; + assert( ret>0 ); + } + + if( eRemoveDiacritic ){ + ret = remove_diacritic(ret, eRemoveDiacritic==2); + } + } + + else if( c>=66560 && c<66600 ){ + ret = c + 40; + } + + return ret; +} +#endif /* defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4) */ +#endif /* !defined(SQLITE_DISABLE_FTS3_UNICODE) */ + +/************** End of fts3_unicode2.c ***************************************/ +/************** Begin file json1.c *******************************************/ +/* +** 2015-08-12 +** +** 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 SQLite extension implements JSON functions. The interface is +** modeled after MySQL JSON functions: +** +** https://dev.mysql.com/doc/refman/5.7/en/json.html +** +** For the time being, all JSON is stored as pure text. (We might add +** a JSONB type in the future which stores a binary encoding of JSON in +** a BLOB, but there is no support for JSONB in the current implementation. +** This implementation parses JSON text at 250 MB/s, so it is hard to see +** how JSONB might improve on that.) +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) +#if !defined(SQLITEINT_H) +/* #include "sqlite3ext.h" */ +#endif +SQLITE_EXTENSION_INIT1 +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* Mark a function parameter as unused, to suppress nuisance compiler +** warnings. */ +#ifndef UNUSED_PARAM +# define UNUSED_PARAM(X) (void)(X) +#endif + +#ifndef LARGEST_INT64 +# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32)) +# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64) +#endif + +/* +** Versions of isspace(), isalnum() and isdigit() to which it is safe +** to pass signed char values. +*/ +#ifdef sqlite3Isdigit + /* Use the SQLite core versions if this routine is part of the + ** SQLite amalgamation */ +# define safe_isdigit(x) sqlite3Isdigit(x) +# define safe_isalnum(x) sqlite3Isalnum(x) +# define safe_isxdigit(x) sqlite3Isxdigit(x) +#else + /* Use the standard library for separate compilation */ +#include /* amalgamator: keep */ +# define safe_isdigit(x) isdigit((unsigned char)(x)) +# define safe_isalnum(x) isalnum((unsigned char)(x)) +# define safe_isxdigit(x) isxdigit((unsigned char)(x)) +#endif + +/* +** Growing our own isspace() routine this way is twice as fast as +** the library isspace() function, resulting in a 7% overall performance +** 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, +}; +#define safe_isspace(x) (jsonIsSpace[(unsigned char)x]) + +#ifndef SQLITE_AMALGAMATION + /* Unsigned integer types. These are already defined in the sqliteInt.h, + ** but the definitions need to be repeated for separate compilation. */ + typedef sqlite3_uint64 u64; + typedef unsigned int u32; + typedef unsigned short int u16; + typedef unsigned char u8; +#endif + +/* Objects */ +typedef struct JsonString JsonString; +typedef struct JsonNode JsonNode; +typedef struct JsonParse JsonParse; + +/* An instance of this object represents a JSON string +** under construction. Really, this is a generic string accumulator +** that can be and is used to create strings other than JSON. +*/ +struct JsonString { + sqlite3_context *pCtx; /* Function context - put error messages here */ + char *zBuf; /* Append JSON content here */ + u64 nAlloc; /* Bytes of storage available in zBuf[] */ + u64 nUsed; /* Bytes of zBuf[] currently used */ + u8 bStatic; /* True if zBuf is static space */ + u8 bErr; /* True if an error has been encountered */ + char zSpace[100]; /* Initial static space */ +}; + +/* JSON type values +*/ +#define JSON_NULL 0 +#define JSON_TRUE 1 +#define JSON_FALSE 2 +#define JSON_INT 3 +#define JSON_REAL 4 +#define JSON_STRING 5 +#define JSON_ARRAY 6 +#define JSON_OBJECT 7 + +/* The "subtype" set for JSON values */ +#define JSON_SUBTYPE 74 /* Ascii for "J" */ + +/* +** Names of the various JSON types: +*/ +static const char * const jsonType[] = { + "null", "true", "false", "integer", "real", "text", "array", "object" +}; + +/* Bit values for the JsonNode.jnFlag field +*/ +#define JNODE_RAW 0x01 /* Content is raw, not JSON encoded */ +#define JNODE_ESCAPE 0x02 /* Content is text with \ escapes */ +#define JNODE_REMOVE 0x04 /* Do not output */ +#define JNODE_REPLACE 0x08 /* Replace with JsonNode.u.iReplace */ +#define JNODE_PATCH 0x10 /* Patch with JsonNode.u.pPatch */ +#define JNODE_APPEND 0x20 /* More ARRAY/OBJECT entries at u.iAppend */ +#define JNODE_LABEL 0x40 /* Is a label of an object */ + + +/* A single node of parsed JSON +*/ +struct JsonNode { + u8 eType; /* One of the JSON_ type values */ + u8 jnFlags; /* JNODE flags */ + u32 n; /* Bytes of content, or number of sub-nodes */ + union { + const char *zJContent; /* Content for INT, REAL, and STRING */ + u32 iAppend; /* More terms for ARRAY and OBJECT */ + u32 iKey; /* Key for ARRAY objects in json_tree() */ + u32 iReplace; /* Replacement content for JNODE_REPLACE */ + JsonNode *pPatch; /* Node chain of patch for JNODE_PATCH */ + } u; +}; + +/* A completely parsed JSON string +*/ +struct JsonParse { + u32 nNode; /* Number of slots of aNode[] used */ + u32 nAlloc; /* Number of slots of aNode[] allocated */ + JsonNode *aNode; /* Array of nodes containing the parse */ + const char *zJson; /* Original JSON string */ + u32 *aUp; /* Index of parent of each node */ + u8 oom; /* Set to true if out of memory */ + u8 nErr; /* Number of errors seen */ + u16 iDepth; /* Nesting depth */ + int nJson; /* Length of the zJson string in bytes */ + u32 iHold; /* Replace cache line with the lowest iHold value */ +}; + +/* +** Maximum nesting depth of JSON for this implementation. +** +** This limit is needed to avoid a stack overflow in the recursive +** descent parser. A depth of 2000 is far deeper than any sane JSON +** should go. +*/ +#define JSON_MAX_DEPTH 2000 + +/************************************************************************** +** Utility routines for dealing with JsonString objects +**************************************************************************/ + +/* Set the JsonString object to an empty string +*/ +static void jsonZero(JsonString *p){ + p->zBuf = p->zSpace; + p->nAlloc = sizeof(p->zSpace); + p->nUsed = 0; + p->bStatic = 1; +} + +/* Initialize the JsonString object +*/ +static void jsonInit(JsonString *p, sqlite3_context *pCtx){ + p->pCtx = pCtx; + p->bErr = 0; + jsonZero(p); +} + + +/* Free all allocated memory and reset the JsonString object back to its +** initial state. +*/ +static void jsonReset(JsonString *p){ + if( !p->bStatic ) sqlite3_free(p->zBuf); + jsonZero(p); +} + + +/* Report an out-of-memory (OOM) condition +*/ +static void jsonOom(JsonString *p){ + p->bErr = 1; + sqlite3_result_error_nomem(p->pCtx); + jsonReset(p); +} + +/* Enlarge pJson->zBuf so that it can hold at least N more bytes. +** Return zero on success. Return non-zero on an OOM error +*/ +static int jsonGrow(JsonString *p, u32 N){ + u64 nTotal = NnAlloc ? p->nAlloc*2 : p->nAlloc+N+10; + char *zNew; + if( p->bStatic ){ + if( p->bErr ) return 1; + zNew = sqlite3_malloc64(nTotal); + if( zNew==0 ){ + jsonOom(p); + return SQLITE_NOMEM; + } + memcpy(zNew, p->zBuf, (size_t)p->nUsed); + p->zBuf = zNew; + p->bStatic = 0; + }else{ + zNew = sqlite3_realloc64(p->zBuf, nTotal); + if( zNew==0 ){ + jsonOom(p); + return SQLITE_NOMEM; + } + p->zBuf = zNew; + } + p->nAlloc = nTotal; + return SQLITE_OK; +} + +/* Append N bytes from zIn onto the end of the JsonString string. +*/ +static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){ + if( N==0 ) return; + if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return; + memcpy(p->zBuf+p->nUsed, zIn, N); + p->nUsed += N; +} + +/* Append formatted text (not to exceed N bytes) to the JsonString. +*/ +static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){ + va_list ap; + if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return; + va_start(ap, zFormat); + sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap); + va_end(ap); + p->nUsed += (int)strlen(p->zBuf+p->nUsed); +} + +/* Append a single character +*/ +static void jsonAppendChar(JsonString *p, char c){ + if( p->nUsed>=p->nAlloc && jsonGrow(p,1)!=0 ) return; + p->zBuf[p->nUsed++] = c; +} + +/* Append a comma separator to the output buffer, if the previous +** character is not '[' or '{'. +*/ +static void jsonAppendSeparator(JsonString *p){ + char c; + if( p->nUsed==0 ) return; + c = p->zBuf[p->nUsed-1]; + if( c!='[' && c!='{' ) jsonAppendChar(p, ','); +} + +/* Append the N-byte string in zIn to the end of the JsonString string +** under construction. Enclose the string in "..." and escape +** any double-quotes or backslash characters contained within the +** string. +*/ +static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ + u32 i; + if( (N+p->nUsed+2 >= p->nAlloc) && jsonGrow(p,N+2)!=0 ) return; + p->zBuf[p->nUsed++] = '"'; + for(i=0; inUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return; + p->zBuf[p->nUsed++] = '\\'; + }else if( c<=0x1f ){ + 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 + }; + assert( sizeof(aSpecial)==32 ); + assert( aSpecial['\b']=='b' ); + assert( aSpecial['\f']=='f' ); + assert( aSpecial['\n']=='n' ); + assert( aSpecial['\r']=='r' ); + assert( aSpecial['\t']=='t' ); + if( aSpecial[c] ){ + c = aSpecial[c]; + goto json_simple_escape; + } + if( (p->nUsed+N+7+i > p->nAlloc) && jsonGrow(p,N+7-i)!=0 ) return; + p->zBuf[p->nUsed++] = '\\'; + p->zBuf[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++] = c; + } + p->zBuf[p->nUsed++] = '"'; + assert( p->nUsednAlloc ); +} + +/* +** Append a function parameter value to the JSON string under +** construction. +*/ +static void jsonAppendValue( + JsonString *p, /* Append to this JSON string */ + sqlite3_value *pValue /* Value to append */ +){ + switch( sqlite3_value_type(pValue) ){ + case SQLITE_NULL: { + jsonAppendRaw(p, "null", 4); + break; + } + case SQLITE_INTEGER: + case SQLITE_FLOAT: { + const char *z = (const char*)sqlite3_value_text(pValue); + u32 n = (u32)sqlite3_value_bytes(pValue); + jsonAppendRaw(p, z, n); + break; + } + case SQLITE_TEXT: { + const char *z = (const char*)sqlite3_value_text(pValue); + u32 n = (u32)sqlite3_value_bytes(pValue); + if( sqlite3_value_subtype(pValue)==JSON_SUBTYPE ){ + jsonAppendRaw(p, z, n); + }else{ + jsonAppendString(p, z, n); + } + break; + } + default: { + if( p->bErr==0 ){ + sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1); + p->bErr = 2; + jsonReset(p); + } + break; + } + } +} + + +/* Make the JSON in p the result of the SQL function. +*/ +static void jsonResult(JsonString *p){ + if( p->bErr==0 ){ + sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed, + p->bStatic ? SQLITE_TRANSIENT : sqlite3_free, + SQLITE_UTF8); + jsonZero(p); + } + assert( p->bStatic ); +} + +/************************************************************************** +** Utility routines for dealing with JsonNode and JsonParse objects +**************************************************************************/ + +/* +** Return the number of consecutive JsonNode slots need to represent +** the parsed JSON at pNode. The minimum answer is 1. For ARRAY and +** OBJECT types, the number might be larger. +** +** Appended elements are not counted. The value returned is the number +** by which the JsonNode counter should increment in order to go to the +** next peer value. +*/ +static u32 jsonNodeSize(JsonNode *pNode){ + return pNode->eType>=JSON_ARRAY ? pNode->n+1 : 1; +} + +/* +** Reclaim all memory allocated by a JsonParse object. But do not +** delete the JsonParse object itself. +*/ +static void jsonParseReset(JsonParse *pParse){ + sqlite3_free(pParse->aNode); + pParse->aNode = 0; + pParse->nNode = 0; + pParse->nAlloc = 0; + sqlite3_free(pParse->aUp); + pParse->aUp = 0; +} + +/* +** Free a JsonParse object that was obtained from sqlite3_malloc(). +*/ +static void jsonParseFree(JsonParse *pParse){ + jsonParseReset(pParse); + sqlite3_free(pParse); +} + +/* +** Convert the JsonNode pNode into a pure JSON string and +** append to pOut. Subsubstructure is also included. Return +** the number of JsonNode objects that are encoded. +*/ +static void jsonRenderNode( + JsonNode *pNode, /* The node to render */ + JsonString *pOut, /* Write JSON here */ + sqlite3_value **aReplace /* Replacement values */ +){ + if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){ + if( pNode->jnFlags & JNODE_REPLACE ){ + jsonAppendValue(pOut, aReplace[pNode->u.iReplace]); + return; + } + pNode = pNode->u.pPatch; + } + switch( pNode->eType ){ + default: { + assert( pNode->eType==JSON_NULL ); + jsonAppendRaw(pOut, "null", 4); + break; + } + case JSON_TRUE: { + jsonAppendRaw(pOut, "true", 4); + break; + } + case JSON_FALSE: { + jsonAppendRaw(pOut, "false", 5); + break; + } + case JSON_STRING: { + if( pNode->jnFlags & JNODE_RAW ){ + jsonAppendString(pOut, pNode->u.zJContent, pNode->n); + break; + } + /* Fall through into the next case */ + } + case JSON_REAL: + case JSON_INT: { + jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n); + break; + } + case JSON_ARRAY: { + u32 j = 1; + jsonAppendChar(pOut, '['); + for(;;){ + while( j<=pNode->n ){ + if( (pNode[j].jnFlags & JNODE_REMOVE)==0 ){ + jsonAppendSeparator(pOut); + jsonRenderNode(&pNode[j], pOut, aReplace); + } + j += jsonNodeSize(&pNode[j]); + } + if( (pNode->jnFlags & JNODE_APPEND)==0 ) break; + pNode = &pNode[pNode->u.iAppend]; + j = 1; + } + jsonAppendChar(pOut, ']'); + break; + } + case JSON_OBJECT: { + u32 j = 1; + jsonAppendChar(pOut, '{'); + for(;;){ + while( j<=pNode->n ){ + if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){ + jsonAppendSeparator(pOut); + jsonRenderNode(&pNode[j], pOut, aReplace); + jsonAppendChar(pOut, ':'); + jsonRenderNode(&pNode[j+1], pOut, aReplace); + } + j += 1 + jsonNodeSize(&pNode[j+1]); + } + if( (pNode->jnFlags & JNODE_APPEND)==0 ) break; + pNode = &pNode[pNode->u.iAppend]; + j = 1; + } + jsonAppendChar(pOut, '}'); + break; + } + } +} + +/* +** Return a JsonNode and all its descendents as a JSON string. +*/ +static void jsonReturnJson( + JsonNode *pNode, /* Node to return */ + sqlite3_context *pCtx, /* Return value for this function */ + sqlite3_value **aReplace /* Array of replacement values */ +){ + JsonString s; + jsonInit(&s, pCtx); + jsonRenderNode(pNode, &s, aReplace); + jsonResult(&s); + sqlite3_result_subtype(pCtx, JSON_SUBTYPE); +} + +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +static u8 jsonHexToInt(int h){ + assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') ); +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); +#else + h += 9*(1&(h>>6)); +#endif + return (u8)(h & 0xf); +} + +/* +** Convert a 4-byte hex string into an integer +*/ +static u32 jsonHexToInt4(const char *z){ + u32 v; + assert( safe_isxdigit(z[0]) ); + assert( safe_isxdigit(z[1]) ); + assert( safe_isxdigit(z[2]) ); + assert( safe_isxdigit(z[3]) ); + v = (jsonHexToInt(z[0])<<12) + + (jsonHexToInt(z[1])<<8) + + (jsonHexToInt(z[2])<<4) + + jsonHexToInt(z[3]); + return v; +} + +/* +** Make the JsonNode the return value of the function. +*/ +static void jsonReturn( + JsonNode *pNode, /* Node to return */ + sqlite3_context *pCtx, /* Return value for this function */ + sqlite3_value **aReplace /* Array of replacement values */ +){ + switch( pNode->eType ){ + default: { + assert( pNode->eType==JSON_NULL ); + sqlite3_result_null(pCtx); + break; + } + case JSON_TRUE: { + sqlite3_result_int(pCtx, 1); + break; + } + case JSON_FALSE: { + sqlite3_result_int(pCtx, 0); + break; + } + case JSON_INT: { + sqlite3_int64 i = 0; + const char *z = pNode->u.zJContent; + if( z[0]=='-' ){ z++; } + while( z[0]>='0' && z[0]<='9' ){ + unsigned v = *(z++) - '0'; + if( i>=LARGEST_INT64/10 ){ + if( i>LARGEST_INT64/10 ) goto int_as_real; + if( z[0]>='0' && z[0]<='9' ) goto int_as_real; + if( v==9 ) goto int_as_real; + if( v==8 ){ + if( pNode->u.zJContent[0]=='-' ){ + sqlite3_result_int64(pCtx, SMALLEST_INT64); + goto int_done; + }else{ + goto int_as_real; + } + } + } + i = i*10 + v; + } + if( pNode->u.zJContent[0]=='-' ){ i = -i; } + sqlite3_result_int64(pCtx, i); + int_done: + break; + int_as_real: /* fall through to real */; + } + case JSON_REAL: { + double r; +#ifdef SQLITE_AMALGAMATION + const char *z = pNode->u.zJContent; + sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8); +#else + r = strtod(pNode->u.zJContent, 0); +#endif + sqlite3_result_double(pCtx, r); + break; + } + case JSON_STRING: { +#if 0 /* Never happens because JNODE_RAW is only set by json_set(), + ** json_insert() and json_replace() and those routines do not + ** call jsonReturn() */ + if( pNode->jnFlags & JNODE_RAW ){ + sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n, + SQLITE_TRANSIENT); + }else +#endif + assert( (pNode->jnFlags & JNODE_RAW)==0 ); + if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){ + /* JSON formatted without any backslash-escapes */ + sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2, + SQLITE_TRANSIENT); + }else{ + /* Translate JSON formatted string into raw text */ + u32 i; + u32 n = pNode->n; + const char *z = pNode->u.zJContent; + char *zOut; + u32 j; + zOut = sqlite3_malloc( n+1 ); + if( zOut==0 ){ + sqlite3_result_error_nomem(pCtx); + break; + } + for(i=1, j=0; i>6)); + zOut[j++] = 0x80 | (v&0x3f); + }else{ + u32 vlo; + if( (v&0xfc00)==0xd800 + && i>18); + zOut[j++] = 0x80 | ((v>>12)&0x3f); + zOut[j++] = 0x80 | ((v>>6)&0x3f); + zOut[j++] = 0x80 | (v&0x3f); + }else{ + zOut[j++] = 0xe0 | (v>>12); + zOut[j++] = 0x80 | ((v>>6)&0x3f); + zOut[j++] = 0x80 | (v&0x3f); + } + } + }else{ + if( c=='b' ){ + c = '\b'; + }else if( c=='f' ){ + c = '\f'; + }else if( c=='n' ){ + c = '\n'; + }else if( c=='r' ){ + c = '\r'; + }else if( c=='t' ){ + c = '\t'; + } + zOut[j++] = c; + } + } + } + zOut[j] = 0; + sqlite3_result_text(pCtx, zOut, j, sqlite3_free); + } + break; + } + case JSON_ARRAY: + case JSON_OBJECT: { + jsonReturnJson(pNode, pCtx, aReplace); + break; + } + } +} + +/* Forward reference */ +static int jsonParseAddNode(JsonParse*,u32,u32,const char*); + +/* +** A macro to hint to the compiler that a function should not be +** inlined. +*/ +#if defined(__GNUC__) +# define JSON_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) && _MSC_VER>=1310 +# define JSON_NOINLINE __declspec(noinline) +#else +# define JSON_NOINLINE +#endif + + +static JSON_NOINLINE int jsonParseAddNodeExpand( + JsonParse *pParse, /* Append the node to this object */ + u32 eType, /* Node type */ + u32 n, /* Content size or sub-node count */ + const char *zContent /* Content */ +){ + u32 nNew; + JsonNode *pNew; + assert( pParse->nNode>=pParse->nAlloc ); + if( pParse->oom ) return -1; + nNew = pParse->nAlloc*2 + 10; + pNew = sqlite3_realloc64(pParse->aNode, sizeof(JsonNode)*nNew); + if( pNew==0 ){ + pParse->oom = 1; + return -1; + } + pParse->nAlloc = nNew; + pParse->aNode = pNew; + assert( pParse->nNodenAlloc ); + return jsonParseAddNode(pParse, eType, n, zContent); +} + +/* +** Create a new JsonNode instance based on the arguments and append that +** instance to the JsonParse. Return the index in pParse->aNode[] of the +** new node, or -1 if a memory allocation fails. +*/ +static int jsonParseAddNode( + JsonParse *pParse, /* Append the node to this object */ + u32 eType, /* Node type */ + u32 n, /* Content size or sub-node count */ + const char *zContent /* Content */ +){ + JsonNode *p; + if( pParse->nNode>=pParse->nAlloc ){ + return jsonParseAddNodeExpand(pParse, eType, n, zContent); + } + p = &pParse->aNode[pParse->nNode]; + p->eType = (u8)eType; + p->jnFlags = 0; + p->n = n; + p->u.zJContent = zContent; + return pParse->nNode++; +} + +/* +** Return true if z[] begins with 4 (or more) hexadecimal digits +*/ +static int jsonIs4Hex(const char *z){ + int i; + for(i=0; i<4; i++) if( !safe_isxdigit(z[i]) ) return 0; + return 1; +} + +/* +** Parse a single JSON value which begins at pParse->zJson[i]. Return the +** index of the first character past the end of the value parsed. +** +** Return negative for a syntax error. Special cases: return -2 if the +** first non-whitespace character is '}' and return -3 if the first +** non-whitespace character is ']'. +*/ +static int jsonParseValue(JsonParse *pParse, u32 i){ + char c; + u32 j; + int iThis; + int x; + JsonNode *pNode; + const char *z = pParse->zJson; + while( safe_isspace(z[i]) ){ i++; } + if( (c = z[i])=='{' ){ + /* Parse object */ + iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); + if( iThis<0 ) return -1; + for(j=i+1;;j++){ + while( safe_isspace(z[j]) ){ j++; } + if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; + x = jsonParseValue(pParse, j); + if( x<0 ){ + pParse->iDepth--; + if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1; + return -1; + } + if( pParse->oom ) return -1; + pNode = &pParse->aNode[pParse->nNode-1]; + if( pNode->eType!=JSON_STRING ) return -1; + pNode->jnFlags |= JNODE_LABEL; + j = x; + while( safe_isspace(z[j]) ){ j++; } + if( z[j]!=':' ) return -1; + j++; + x = jsonParseValue(pParse, j); + pParse->iDepth--; + if( x<0 ) return -1; + j = x; + while( safe_isspace(z[j]) ){ j++; } + c = z[j]; + if( c==',' ) continue; + if( c!='}' ) return -1; + break; + } + pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1; + return j+1; + }else if( c=='[' ){ + /* Parse array */ + iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); + if( iThis<0 ) return -1; + for(j=i+1;;j++){ + while( safe_isspace(z[j]) ){ j++; } + if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; + x = jsonParseValue(pParse, j); + pParse->iDepth--; + if( x<0 ){ + if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1; + return -1; + } + j = x; + while( safe_isspace(z[j]) ){ j++; } + c = z[j]; + if( c==',' ) continue; + if( c!=']' ) return -1; + break; + } + pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1; + return j+1; + }else if( c=='"' ){ + /* Parse string */ + u8 jnFlags = 0; + j = i+1; + for(;;){ + c = z[j]; + if( (c & ~0x1f)==0 ){ + /* Control characters are not allowed in strings */ + return -1; + } + if( c=='\\' ){ + c = z[++j]; + if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f' + || c=='n' || c=='r' || c=='t' + || (c=='u' && jsonIs4Hex(z+j+1)) ){ + jnFlags = JNODE_ESCAPE; + }else{ + return -1; + } + }else if( c=='"' ){ + break; + } + j++; + } + jsonParseAddNode(pParse, JSON_STRING, j+1-i, &z[i]); + if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags; + return j+1; + }else if( c=='n' + && strncmp(z+i,"null",4)==0 + && !safe_isalnum(z[i+4]) ){ + jsonParseAddNode(pParse, JSON_NULL, 0, 0); + return i+4; + }else if( c=='t' + && strncmp(z+i,"true",4)==0 + && !safe_isalnum(z[i+4]) ){ + jsonParseAddNode(pParse, JSON_TRUE, 0, 0); + return i+4; + }else if( c=='f' + && strncmp(z+i,"false",5)==0 + && !safe_isalnum(z[i+5]) ){ + jsonParseAddNode(pParse, JSON_FALSE, 0, 0); + return i+5; + }else if( c=='-' || (c>='0' && c<='9') ){ + /* Parse number */ + u8 seenDP = 0; + u8 seenE = 0; + assert( '-' < '0' ); + if( c<='0' ){ + j = c=='-' ? i+1 : i; + if( z[j]=='0' && z[j+1]>='0' && z[j+1]<='9' ) return -1; + } + j = i+1; + for(;; j++){ + c = z[j]; + if( c>='0' && c<='9' ) continue; + if( c=='.' ){ + if( z[j-1]=='-' ) return -1; + if( seenDP ) return -1; + seenDP = 1; + continue; + } + if( c=='e' || c=='E' ){ + if( z[j-1]<'0' ) return -1; + if( seenE ) return -1; + seenDP = seenE = 1; + c = z[j+1]; + if( c=='+' || c=='-' ){ + j++; + c = z[j+1]; + } + if( c<'0' || c>'9' ) return -1; + continue; + } + break; + } + if( z[j-1]<'0' ) return -1; + jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT, + j - i, &z[i]); + return j; + }else if( c=='}' ){ + return -2; /* End of {...} */ + }else if( c==']' ){ + return -3; /* End of [...] */ + }else if( c==0 ){ + return 0; /* End of file */ + }else{ + return -1; /* Syntax error */ + } +} + +/* +** Parse a complete JSON string. Return 0 on success or non-zero if there +** are any errors. If an error occurs, free all memory associated with +** pParse. +** +** pParse is uninitialized when this routine is called. +*/ +static int jsonParse( + JsonParse *pParse, /* Initialize and fill this JsonParse object */ + sqlite3_context *pCtx, /* Report errors here */ + const char *zJson /* Input JSON text to be parsed */ +){ + int i; + memset(pParse, 0, sizeof(*pParse)); + if( zJson==0 ) return 1; + pParse->zJson = zJson; + i = jsonParseValue(pParse, 0); + if( pParse->oom ) i = -1; + if( i>0 ){ + assert( pParse->iDepth==0 ); + while( safe_isspace(zJson[i]) ) i++; + if( zJson[i] ) i = -1; + } + if( i<=0 ){ + if( pCtx!=0 ){ + if( pParse->oom ){ + sqlite3_result_error_nomem(pCtx); + }else{ + sqlite3_result_error(pCtx, "malformed JSON", -1); + } + } + jsonParseReset(pParse); + return 1; + } + return 0; +} + +/* Mark node i of pParse as being a child of iParent. Call recursively +** to fill in all the descendants of node i. +*/ +static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){ + JsonNode *pNode = &pParse->aNode[i]; + u32 j; + pParse->aUp[i] = iParent; + switch( pNode->eType ){ + case JSON_ARRAY: { + for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){ + jsonParseFillInParentage(pParse, i+j, i); + } + break; + } + case JSON_OBJECT: { + for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j+1)+1){ + pParse->aUp[i+j] = i; + jsonParseFillInParentage(pParse, i+j+1, i); + } + break; + } + default: { + break; + } + } +} + +/* +** Compute the parentage of all nodes in a completed parse. +*/ +static int jsonParseFindParents(JsonParse *pParse){ + u32 *aUp; + assert( pParse->aUp==0 ); + aUp = pParse->aUp = sqlite3_malloc64( sizeof(u32)*pParse->nNode ); + if( aUp==0 ){ + pParse->oom = 1; + return SQLITE_NOMEM; + } + jsonParseFillInParentage(pParse, 0, 0); + return SQLITE_OK; +} + +/* +** Magic number used for the JSON parse cache in sqlite3_get_auxdata() +*/ +#define JSON_CACHE_ID (-429938) /* First cache entry */ +#define JSON_CACHE_SZ 4 /* Max number of cache entries */ + +/* +** Obtain a complete parse of the JSON found in the first argument +** of the argv array. Use the sqlite3_get_auxdata() cache for this +** parse if it is available. If the cache is not available or if it +** is no longer valid, parse the JSON again and return the new parse, +** and also register the new parse so that it will be available for +** future sqlite3_get_auxdata() calls. +*/ +static JsonParse *jsonParseCached( + sqlite3_context *pCtx, + sqlite3_value **argv, + sqlite3_context *pErrCtx +){ + const char *zJson = (const char*)sqlite3_value_text(argv[0]); + int nJson = sqlite3_value_bytes(argv[0]); + JsonParse *p; + JsonParse *pMatch = 0; + int iKey; + int iMinKey = 0; + u32 iMinHold = 0xffffffff; + u32 iMaxHold = 0; + if( zJson==0 ) return 0; + for(iKey=0; iKeynJson==nJson + && memcmp(p->zJson,zJson,nJson)==0 + ){ + p->nErr = 0; + pMatch = p; + }else if( p->iHoldiHold; + iMinKey = iKey; + } + if( p->iHold>iMaxHold ){ + iMaxHold = p->iHold; + } + } + if( pMatch ){ + pMatch->nErr = 0; + pMatch->iHold = iMaxHold+1; + return pMatch; + } + p = sqlite3_malloc64( sizeof(*p) + nJson + 1 ); + if( p==0 ){ + sqlite3_result_error_nomem(pCtx); + return 0; + } + memset(p, 0, sizeof(*p)); + p->zJson = (char*)&p[1]; + memcpy((char*)p->zJson, zJson, nJson+1); + if( jsonParse(p, pErrCtx, p->zJson) ){ + sqlite3_free(p); + return 0; + } + p->nJson = nJson; + p->iHold = iMaxHold+1; + sqlite3_set_auxdata(pCtx, JSON_CACHE_ID+iMinKey, p, + (void(*)(void*))jsonParseFree); + return (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID+iMinKey); +} + +/* +** Compare the OBJECT label at pNode against zKey,nKey. Return true on +** a match. +*/ +static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){ + if( pNode->jnFlags & JNODE_RAW ){ + if( pNode->n!=nKey ) return 0; + return strncmp(pNode->u.zJContent, zKey, nKey)==0; + }else{ + if( pNode->n!=nKey+2 ) return 0; + return strncmp(pNode->u.zJContent+1, zKey, nKey)==0; + } +} + +/* forward declaration */ +static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**); + +/* +** Search along zPath to find the node specified. Return a pointer +** to that node, or NULL if zPath is malformed or if there is no such +** node. +** +** If pApnd!=0, then try to append new nodes to complete zPath if it is +** possible to do so and if no existing node corresponds to zPath. If +** new nodes are appended *pApnd is set to 1. +*/ +static JsonNode *jsonLookupStep( + JsonParse *pParse, /* The JSON to search */ + u32 iRoot, /* Begin the search at this node */ + const char *zPath, /* The path to search */ + int *pApnd, /* Append nodes to complete path if not NULL */ + const char **pzErr /* Make *pzErr point to any syntax error in zPath */ +){ + u32 i, j, nKey; + const char *zKey; + JsonNode *pRoot = &pParse->aNode[iRoot]; + if( zPath[0]==0 ) return pRoot; + if( pRoot->jnFlags & JNODE_REPLACE ) return 0; + if( zPath[0]=='.' ){ + if( pRoot->eType!=JSON_OBJECT ) return 0; + zPath++; + if( zPath[0]=='"' ){ + zKey = zPath + 1; + for(i=1; zPath[i] && zPath[i]!='"'; i++){} + nKey = i-1; + if( zPath[i] ){ + i++; + }else{ + *pzErr = zPath; + return 0; + } + }else{ + zKey = zPath; + for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){} + nKey = i; + } + if( nKey==0 ){ + *pzErr = zPath; + return 0; + } + j = 1; + for(;;){ + while( j<=pRoot->n ){ + if( jsonLabelCompare(pRoot+j, zKey, nKey) ){ + return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr); + } + j++; + j += jsonNodeSize(&pRoot[j]); + } + if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break; + iRoot += pRoot->u.iAppend; + pRoot = &pParse->aNode[iRoot]; + j = 1; + } + if( pApnd ){ + u32 iStart, iLabel; + JsonNode *pNode; + iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); + iLabel = jsonParseAddNode(pParse, JSON_STRING, nKey, zKey); + zPath += i; + pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); + if( pParse->oom ) return 0; + if( pNode ){ + pRoot = &pParse->aNode[iRoot]; + pRoot->u.iAppend = iStart - iRoot; + pRoot->jnFlags |= JNODE_APPEND; + pParse->aNode[iLabel].jnFlags |= JNODE_RAW; + } + return pNode; + } + }else if( zPath[0]=='[' ){ + i = 0; + j = 1; + while( safe_isdigit(zPath[j]) ){ + i = i*10 + zPath[j] - '0'; + j++; + } + if( j<2 || zPath[j]!=']' ){ + if( zPath[1]=='#' ){ + JsonNode *pBase = pRoot; + int iBase = iRoot; + if( pRoot->eType!=JSON_ARRAY ) return 0; + for(;;){ + while( j<=pBase->n ){ + if( (pBase[j].jnFlags & JNODE_REMOVE)==0 ) i++; + j += jsonNodeSize(&pBase[j]); + } + if( (pBase->jnFlags & JNODE_APPEND)==0 ) break; + iBase += pBase->u.iAppend; + pBase = &pParse->aNode[iBase]; + j = 1; + } + j = 2; + if( zPath[2]=='-' && safe_isdigit(zPath[3]) ){ + unsigned int x = 0; + j = 3; + do{ + x = x*10 + zPath[j] - '0'; + j++; + }while( safe_isdigit(zPath[j]) ); + if( x>i ) return 0; + i -= x; + } + if( zPath[j]!=']' ){ + *pzErr = zPath; + return 0; + } + }else{ + *pzErr = zPath; + return 0; + } + } + if( pRoot->eType!=JSON_ARRAY ) return 0; + zPath += j + 1; + j = 1; + for(;;){ + while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){ + if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 ) i--; + j += jsonNodeSize(&pRoot[j]); + } + if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break; + iRoot += pRoot->u.iAppend; + pRoot = &pParse->aNode[iRoot]; + j = 1; + } + if( j<=pRoot->n ){ + return jsonLookupStep(pParse, iRoot+j, zPath, pApnd, pzErr); + } + if( i==0 && pApnd ){ + u32 iStart; + JsonNode *pNode; + iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0); + pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); + if( pParse->oom ) return 0; + if( pNode ){ + pRoot = &pParse->aNode[iRoot]; + pRoot->u.iAppend = iStart - iRoot; + pRoot->jnFlags |= JNODE_APPEND; + } + return pNode; + } + }else{ + *pzErr = zPath; + } + return 0; +} + +/* +** Append content to pParse that will complete zPath. Return a pointer +** to the inserted node, or return NULL if the append fails. +*/ +static JsonNode *jsonLookupAppend( + JsonParse *pParse, /* Append content to the JSON parse */ + const char *zPath, /* Description of content to append */ + int *pApnd, /* Set this flag to 1 */ + const char **pzErr /* Make this point to any syntax error */ +){ + *pApnd = 1; + if( zPath[0]==0 ){ + jsonParseAddNode(pParse, JSON_NULL, 0, 0); + return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1]; + } + if( zPath[0]=='.' ){ + jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); + }else if( strncmp(zPath,"[0]",3)==0 ){ + jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); + }else{ + return 0; + } + if( pParse->oom ) return 0; + return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr); +} + +/* +** Return the text of a syntax error message on a JSON path. Space is +** obtained from sqlite3_malloc(). +*/ +static char *jsonPathSyntaxError(const char *zErr){ + return sqlite3_mprintf("JSON path error near '%q'", zErr); +} + +/* +** Do a node lookup using zPath. Return a pointer to the node on success. +** Return NULL if not found or if there is an error. +** +** On an error, write an error message into pCtx and increment the +** pParse->nErr counter. +** +** If pApnd!=NULL then try to append missing nodes and set *pApnd = 1 if +** nodes are appended. +*/ +static JsonNode *jsonLookup( + JsonParse *pParse, /* The JSON to search */ + const char *zPath, /* The path to search */ + int *pApnd, /* Append nodes to complete path if not NULL */ + sqlite3_context *pCtx /* Report errors here, if not NULL */ +){ + const char *zErr = 0; + JsonNode *pNode = 0; + char *zMsg; + + if( zPath==0 ) return 0; + if( zPath[0]!='$' ){ + zErr = zPath; + goto lookup_err; + } + zPath++; + pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr); + if( zErr==0 ) return pNode; + +lookup_err: + pParse->nErr++; + assert( zErr!=0 && pCtx!=0 ); + zMsg = jsonPathSyntaxError(zErr); + if( zMsg ){ + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); + }else{ + sqlite3_result_error_nomem(pCtx); + } + return 0; +} + + +/* +** Report the wrong number of arguments for json_insert(), json_replace() +** or json_set(). +*/ +static void jsonWrongNumArgs( + sqlite3_context *pCtx, + const char *zFuncName +){ + char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments", + zFuncName); + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); +} + +/* +** Mark all NULL entries in the Object passed in as JNODE_REMOVE. +*/ +static void jsonRemoveAllNulls(JsonNode *pNode){ + int i, n; + assert( pNode->eType==JSON_OBJECT ); + n = pNode->n; + for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){ + switch( pNode[i].eType ){ + case JSON_NULL: + pNode[i].jnFlags |= JNODE_REMOVE; + break; + case JSON_OBJECT: + jsonRemoveAllNulls(&pNode[i]); + break; + } + } +} + + +/**************************************************************************** +** SQL functions used for testing and debugging +****************************************************************************/ + +#ifdef SQLITE_DEBUG +/* +** The json_parse(JSON) function returns a string which describes +** a parse of the JSON provided. Or it returns NULL if JSON is not +** well-formed. +*/ +static void jsonParseFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString s; /* Output string - not real JSON */ + JsonParse x; /* The parse */ + u32 i; + + assert( argc==1 ); + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + jsonParseFindParents(&x); + jsonInit(&s, ctx); + for(i=0; inNode ); + if( argc==2 ){ + const char *zPath = (const char*)sqlite3_value_text(argv[1]); + pNode = jsonLookup(p, zPath, 0, ctx); + }else{ + pNode = p->aNode; + } + if( pNode==0 ){ + return; + } + if( pNode->eType==JSON_ARRAY ){ + assert( (pNode->jnFlags & JNODE_APPEND)==0 ); + for(i=1; i<=pNode->n; n++){ + i += jsonNodeSize(&pNode[i]); + } + } + sqlite3_result_int64(ctx, n); +} + +/* +** json_extract(JSON, PATH, ...) +** +** Return the element described by PATH. Return NULL if there is no +** PATH element. If there are multiple PATHs, then return a JSON array +** with the result from each path. Throw an error if the JSON or any PATH +** is malformed. +*/ +static void jsonExtractFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse *p; /* The parse */ + JsonNode *pNode; + const char *zPath; + JsonString jx; + int i; + + if( argc<2 ) return; + p = jsonParseCached(ctx, argv, ctx); + if( p==0 ) return; + jsonInit(&jx, ctx); + jsonAppendChar(&jx, '['); + for(i=1; inErr ) break; + if( argc>2 ){ + jsonAppendSeparator(&jx); + if( pNode ){ + jsonRenderNode(pNode, &jx, 0); + }else{ + jsonAppendRaw(&jx, "null", 4); + } + }else if( pNode ){ + jsonReturn(pNode, ctx, 0); + } + } + if( argc>2 && i==argc ){ + jsonAppendChar(&jx, ']'); + jsonResult(&jx); + sqlite3_result_subtype(ctx, JSON_SUBTYPE); + } + jsonReset(&jx); +} + +/* This is the RFC 7396 MergePatch algorithm. +*/ +static JsonNode *jsonMergePatch( + JsonParse *pParse, /* The JSON parser that contains the TARGET */ + u32 iTarget, /* Node of the TARGET in pParse */ + JsonNode *pPatch /* The PATCH */ +){ + u32 i, j; + u32 iRoot; + JsonNode *pTarget; + if( pPatch->eType!=JSON_OBJECT ){ + return pPatch; + } + assert( iTarget>=0 && iTargetnNode ); + pTarget = &pParse->aNode[iTarget]; + assert( (pPatch->jnFlags & JNODE_APPEND)==0 ); + if( pTarget->eType!=JSON_OBJECT ){ + jsonRemoveAllNulls(pPatch); + return pPatch; + } + iRoot = iTarget; + for(i=1; in; i += jsonNodeSize(&pPatch[i+1])+1){ + u32 nKey; + const char *zKey; + assert( pPatch[i].eType==JSON_STRING ); + assert( pPatch[i].jnFlags & JNODE_LABEL ); + nKey = pPatch[i].n; + zKey = pPatch[i].u.zJContent; + assert( (pPatch[i].jnFlags & JNODE_RAW)==0 ); + for(j=1; jn; j += jsonNodeSize(&pTarget[j+1])+1 ){ + assert( pTarget[j].eType==JSON_STRING ); + assert( pTarget[j].jnFlags & JNODE_LABEL ); + assert( (pPatch[i].jnFlags & JNODE_RAW)==0 ); + if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){ + if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break; + if( pPatch[i+1].eType==JSON_NULL ){ + pTarget[j+1].jnFlags |= JNODE_REMOVE; + }else{ + JsonNode *pNew = jsonMergePatch(pParse, iTarget+j+1, &pPatch[i+1]); + if( pNew==0 ) return 0; + pTarget = &pParse->aNode[iTarget]; + if( pNew!=&pTarget[j+1] ){ + pTarget[j+1].u.pPatch = pNew; + pTarget[j+1].jnFlags |= JNODE_PATCH; + } + } + break; + } + } + if( j>=pTarget->n && pPatch[i+1].eType!=JSON_NULL ){ + int iStart, iPatch; + iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); + jsonParseAddNode(pParse, JSON_STRING, nKey, zKey); + iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0); + if( pParse->oom ) return 0; + jsonRemoveAllNulls(pPatch); + pTarget = &pParse->aNode[iTarget]; + pParse->aNode[iRoot].jnFlags |= JNODE_APPEND; + pParse->aNode[iRoot].u.iAppend = iStart - iRoot; + iRoot = iStart; + pParse->aNode[iPatch].jnFlags |= JNODE_PATCH; + pParse->aNode[iPatch].u.pPatch = &pPatch[i+1]; + } + } + return pTarget; +} + +/* +** Implementation of the json_mergepatch(JSON1,JSON2) function. Return a JSON +** object that is the result of running the RFC 7396 MergePatch() algorithm +** on the two arguments. +*/ +static void jsonPatchFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The JSON that is being patched */ + JsonParse y; /* The patch */ + JsonNode *pResult; /* The result of the merge */ + + UNUSED_PARAM(argc); + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){ + jsonParseReset(&x); + return; + } + pResult = jsonMergePatch(&x, 0, y.aNode); + assert( pResult!=0 || x.oom ); + if( pResult ){ + jsonReturnJson(pResult, ctx, 0); + }else{ + sqlite3_result_error_nomem(ctx); + } + jsonParseReset(&x); + jsonParseReset(&y); +} + + +/* +** Implementation of the json_object(NAME,VALUE,...) function. Return a JSON +** object that contains all name/value given in arguments. Or if any name +** is not a string or if any value is a BLOB, throw an error. +*/ +static void jsonObjectFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + int i; + JsonString jx; + const char *z; + u32 n; + + if( argc&1 ){ + sqlite3_result_error(ctx, "json_object() requires an even number " + "of arguments", -1); + return; + } + jsonInit(&jx, ctx); + jsonAppendChar(&jx, '{'); + for(i=0; ijnFlags |= JNODE_REMOVE; + } + if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){ + jsonReturnJson(x.aNode, ctx, 0); + } +remove_done: + jsonParseReset(&x); +} + +/* +** json_replace(JSON, PATH, VALUE, ...) +** +** Replace the value at PATH with VALUE. If PATH does not already exist, +** this routine is a no-op. If JSON or PATH is malformed, throw an error. +*/ +static void jsonReplaceFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The parse */ + JsonNode *pNode; + const char *zPath; + u32 i; + + if( argc<1 ) return; + if( (argc&1)==0 ) { + jsonWrongNumArgs(ctx, "replace"); + return; + } + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + assert( x.nNode ); + for(i=1; i<(u32)argc; i+=2){ + zPath = (const char*)sqlite3_value_text(argv[i]); + pNode = jsonLookup(&x, zPath, 0, ctx); + if( x.nErr ) goto replace_err; + if( pNode ){ + pNode->jnFlags |= (u8)JNODE_REPLACE; + pNode->u.iReplace = i + 1; + } + } + if( x.aNode[0].jnFlags & JNODE_REPLACE ){ + sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); + }else{ + jsonReturnJson(x.aNode, ctx, argv); + } +replace_err: + jsonParseReset(&x); +} + +/* +** json_set(JSON, PATH, VALUE, ...) +** +** Set the value at PATH to VALUE. Create the PATH if it does not already +** exist. Overwrite existing values that do exist. +** If JSON or PATH is malformed, throw an error. +** +** json_insert(JSON, PATH, VALUE, ...) +** +** Create PATH and initialize it to VALUE. If PATH already exists, this +** routine is a no-op. If JSON or PATH is malformed, throw an error. +*/ +static void jsonSetFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The parse */ + JsonNode *pNode; + const char *zPath; + u32 i; + int bApnd; + int bIsSet = *(int*)sqlite3_user_data(ctx); + + if( argc<1 ) return; + if( (argc&1)==0 ) { + jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert"); + return; + } + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + assert( x.nNode ); + for(i=1; i<(u32)argc; i+=2){ + zPath = (const char*)sqlite3_value_text(argv[i]); + bApnd = 0; + pNode = jsonLookup(&x, zPath, &bApnd, ctx); + if( x.oom ){ + sqlite3_result_error_nomem(ctx); + goto jsonSetDone; + }else if( x.nErr ){ + goto jsonSetDone; + }else if( pNode && (bApnd || bIsSet) ){ + pNode->jnFlags |= (u8)JNODE_REPLACE; + pNode->u.iReplace = i + 1; + } + } + if( x.aNode[0].jnFlags & JNODE_REPLACE ){ + sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); + }else{ + jsonReturnJson(x.aNode, ctx, argv); + } +jsonSetDone: + jsonParseReset(&x); +} + +/* +** json_type(JSON) +** json_type(JSON, PATH) +** +** Return the top-level "type" of a JSON string. Throw an error if +** either the JSON or PATH inputs are not well-formed. +*/ +static void jsonTypeFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse *p; /* The parse */ + const char *zPath; + JsonNode *pNode; + + p = jsonParseCached(ctx, argv, ctx); + if( p==0 ) return; + if( argc==2 ){ + zPath = (const char*)sqlite3_value_text(argv[1]); + pNode = jsonLookup(p, zPath, 0, ctx); + }else{ + pNode = p->aNode; + } + if( pNode ){ + sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC); + } +} + +/* +** json_valid(JSON) +** +** Return 1 if JSON is a well-formed JSON string according to RFC-7159. +** Return 0 otherwise. +*/ +static void jsonValidFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse *p; /* The parse */ + UNUSED_PARAM(argc); + p = jsonParseCached(ctx, argv, 0); + sqlite3_result_int(ctx, p!=0); +} + + +/**************************************************************************** +** Aggregate SQL function implementations +****************************************************************************/ +/* +** json_group_array(VALUE) +** +** Return a JSON array composed of all values in the aggregate. +*/ +static void jsonArrayStep( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString *pStr; + UNUSED_PARAM(argc); + pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); + if( pStr ){ + if( pStr->zBuf==0 ){ + jsonInit(pStr, ctx); + jsonAppendChar(pStr, '['); + }else if( pStr->nUsed>1 ){ + jsonAppendChar(pStr, ','); + pStr->pCtx = ctx; + } + jsonAppendValue(pStr, argv[0]); + } +} +static void jsonArrayCompute(sqlite3_context *ctx, int isFinal){ + JsonString *pStr; + pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); + if( pStr ){ + pStr->pCtx = ctx; + jsonAppendChar(pStr, ']'); + if( pStr->bErr ){ + if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx); + assert( pStr->bStatic ); + }else if( isFinal ){ + sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, + pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); + pStr->bStatic = 1; + }else{ + sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT); + pStr->nUsed--; + } + }else{ + sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC); + } + sqlite3_result_subtype(ctx, JSON_SUBTYPE); +} +static void jsonArrayValue(sqlite3_context *ctx){ + jsonArrayCompute(ctx, 0); +} +static void jsonArrayFinal(sqlite3_context *ctx){ + jsonArrayCompute(ctx, 1); +} + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** This method works for both json_group_array() and json_group_object(). +** It works by removing the first element of the group by searching forward +** to the first comma (",") that is not within a string and deleting all +** text through that comma. +*/ +static void jsonGroupInverse( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + unsigned int i; + int inStr = 0; + int nNest = 0; + char *z; + char c; + JsonString *pStr; + UNUSED_PARAM(argc); + UNUSED_PARAM(argv); + pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); +#ifdef NEVER + /* pStr is always non-NULL since jsonArrayStep() or jsonObjectStep() will + ** always have been called to initalize it */ + if( NEVER(!pStr) ) return; +#endif + z = pStr->zBuf; + for(i=1; (c = z[i])!=',' || inStr || nNest; i++){ + if( i>=pStr->nUsed ){ + pStr->nUsed = 1; + return; + } + if( c=='"' ){ + inStr = !inStr; + }else if( c=='\\' ){ + i++; + }else if( !inStr ){ + if( c=='{' || c=='[' ) nNest++; + if( c=='}' || c==']' ) nNest--; + } + } + pStr->nUsed -= i; + memmove(&z[1], &z[i+1], (size_t)pStr->nUsed-1); +} +#else +# define jsonGroupInverse 0 +#endif + + +/* +** json_group_obj(NAME,VALUE) +** +** Return a JSON object composed of all names and values in the aggregate. +*/ +static void jsonObjectStep( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString *pStr; + const char *z; + u32 n; + UNUSED_PARAM(argc); + pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); + if( pStr ){ + if( pStr->zBuf==0 ){ + jsonInit(pStr, ctx); + jsonAppendChar(pStr, '{'); + }else if( pStr->nUsed>1 ){ + jsonAppendChar(pStr, ','); + pStr->pCtx = ctx; + } + z = (const char*)sqlite3_value_text(argv[0]); + n = (u32)sqlite3_value_bytes(argv[0]); + jsonAppendString(pStr, z, n); + jsonAppendChar(pStr, ':'); + jsonAppendValue(pStr, argv[1]); + } +} +static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){ + JsonString *pStr; + pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); + if( pStr ){ + jsonAppendChar(pStr, '}'); + if( pStr->bErr ){ + if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx); + assert( pStr->bStatic ); + }else if( isFinal ){ + sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, + pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); + pStr->bStatic = 1; + }else{ + sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT); + pStr->nUsed--; + } + }else{ + sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC); + } + sqlite3_result_subtype(ctx, JSON_SUBTYPE); +} +static void jsonObjectValue(sqlite3_context *ctx){ + jsonObjectCompute(ctx, 0); +} +static void jsonObjectFinal(sqlite3_context *ctx){ + jsonObjectCompute(ctx, 1); +} + + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/**************************************************************************** +** The json_each virtual table +****************************************************************************/ +typedef struct JsonEachCursor JsonEachCursor; +struct JsonEachCursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + u32 iRowid; /* The rowid */ + u32 iBegin; /* The first node of the scan */ + u32 i; /* Index in sParse.aNode[] of current row */ + u32 iEnd; /* EOF when i equals or exceeds this value */ + u8 eType; /* Type of top-level element */ + u8 bRecursive; /* True for json_tree(). False for json_each() */ + char *zJson; /* Input JSON */ + char *zRoot; /* Path by which to filter zJson */ + JsonParse sParse; /* Parse of the input JSON */ +}; + +/* Constructor for the json_each virtual table */ +static int jsonEachConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + sqlite3_vtab *pNew; + int rc; + +/* Column numbers */ +#define JEACH_KEY 0 +#define JEACH_VALUE 1 +#define JEACH_TYPE 2 +#define JEACH_ATOM 3 +#define JEACH_ID 4 +#define JEACH_PARENT 5 +#define JEACH_FULLKEY 6 +#define JEACH_PATH 7 +/* The xBestIndex method assumes that the JSON and ROOT columns are +** the last two columns in the table. Should this ever changes, be +** sure to update the xBestIndex method. */ +#define JEACH_JSON 8 +#define JEACH_ROOT 9 + + UNUSED_PARAM(pzErr); + UNUSED_PARAM(argv); + UNUSED_PARAM(argc); + UNUSED_PARAM(pAux); + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path," + "json HIDDEN,root HIDDEN)"); + if( rc==SQLITE_OK ){ + pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); + } + return rc; +} + +/* destructor for json_each virtual table */ +static int jsonEachDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* constructor for a JsonEachCursor object for json_each(). */ +static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + JsonEachCursor *pCur; + + UNUSED_PARAM(p); + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* constructor for a JsonEachCursor object for json_tree(). */ +static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + int rc = jsonEachOpenEach(p, ppCursor); + if( rc==SQLITE_OK ){ + JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor; + pCur->bRecursive = 1; + } + return rc; +} + +/* Reset a JsonEachCursor back to its original state. Free any memory +** held. */ +static void jsonEachCursorReset(JsonEachCursor *p){ + sqlite3_free(p->zJson); + sqlite3_free(p->zRoot); + jsonParseReset(&p->sParse); + p->iRowid = 0; + p->i = 0; + p->iEnd = 0; + p->eType = 0; + p->zJson = 0; + p->zRoot = 0; +} + +/* Destructor for a jsonEachCursor object */ +static int jsonEachClose(sqlite3_vtab_cursor *cur){ + JsonEachCursor *p = (JsonEachCursor*)cur; + jsonEachCursorReset(p); + sqlite3_free(cur); + return SQLITE_OK; +} + +/* Return TRUE if the jsonEachCursor object has been advanced off the end +** of the JSON object */ +static int jsonEachEof(sqlite3_vtab_cursor *cur){ + JsonEachCursor *p = (JsonEachCursor*)cur; + return p->i >= p->iEnd; +} + +/* Advance the cursor to the next element for json_tree() */ +static int jsonEachNext(sqlite3_vtab_cursor *cur){ + JsonEachCursor *p = (JsonEachCursor*)cur; + if( p->bRecursive ){ + if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++; + p->i++; + p->iRowid++; + if( p->iiEnd ){ + u32 iUp = p->sParse.aUp[p->i]; + JsonNode *pUp = &p->sParse.aNode[iUp]; + p->eType = pUp->eType; + if( pUp->eType==JSON_ARRAY ){ + if( iUp==p->i-1 ){ + pUp->u.iKey = 0; + }else{ + pUp->u.iKey++; + } + } + } + }else{ + switch( p->eType ){ + case JSON_ARRAY: { + p->i += jsonNodeSize(&p->sParse.aNode[p->i]); + p->iRowid++; + break; + } + case JSON_OBJECT: { + p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]); + p->iRowid++; + break; + } + default: { + p->i = p->iEnd; + break; + } + } + } + return SQLITE_OK; +} + +/* Append the name of the path for element i to pStr +*/ +static void jsonEachComputePath( + JsonEachCursor *p, /* The cursor */ + JsonString *pStr, /* Write the path here */ + u32 i /* Path to this element */ +){ + JsonNode *pNode, *pUp; + u32 iUp; + if( i==0 ){ + jsonAppendChar(pStr, '$'); + return; + } + iUp = p->sParse.aUp[i]; + jsonEachComputePath(p, pStr, iUp); + pNode = &p->sParse.aNode[i]; + pUp = &p->sParse.aNode[iUp]; + if( pUp->eType==JSON_ARRAY ){ + jsonPrintf(30, pStr, "[%d]", pUp->u.iKey); + }else{ + assert( pUp->eType==JSON_OBJECT ); + if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--; + assert( pNode->eType==JSON_STRING ); + assert( pNode->jnFlags & JNODE_LABEL ); + jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1); + } +} + +/* Return the value of a column */ +static int jsonEachColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + JsonEachCursor *p = (JsonEachCursor*)cur; + JsonNode *pThis = &p->sParse.aNode[p->i]; + switch( i ){ + case JEACH_KEY: { + if( p->i==0 ) break; + if( p->eType==JSON_OBJECT ){ + jsonReturn(pThis, ctx, 0); + }else if( p->eType==JSON_ARRAY ){ + u32 iKey; + if( p->bRecursive ){ + if( p->iRowid==0 ) break; + iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey; + }else{ + iKey = p->iRowid; + } + sqlite3_result_int64(ctx, (sqlite3_int64)iKey); + } + break; + } + case JEACH_VALUE: { + if( pThis->jnFlags & JNODE_LABEL ) pThis++; + jsonReturn(pThis, ctx, 0); + break; + } + case JEACH_TYPE: { + if( pThis->jnFlags & JNODE_LABEL ) pThis++; + sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC); + break; + } + case JEACH_ATOM: { + if( pThis->jnFlags & JNODE_LABEL ) pThis++; + if( pThis->eType>=JSON_ARRAY ) break; + jsonReturn(pThis, ctx, 0); + break; + } + case JEACH_ID: { + sqlite3_result_int64(ctx, + (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0)); + break; + } + case JEACH_PARENT: { + if( p->i>p->iBegin && p->bRecursive ){ + sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]); + } + break; + } + case JEACH_FULLKEY: { + JsonString x; + jsonInit(&x, ctx); + if( p->bRecursive ){ + jsonEachComputePath(p, &x, p->i); + }else{ + if( p->zRoot ){ + jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot)); + }else{ + jsonAppendChar(&x, '$'); + } + if( p->eType==JSON_ARRAY ){ + jsonPrintf(30, &x, "[%d]", p->iRowid); + }else if( p->eType==JSON_OBJECT ){ + jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1); + } + } + jsonResult(&x); + break; + } + case JEACH_PATH: { + if( p->bRecursive ){ + JsonString x; + jsonInit(&x, ctx); + jsonEachComputePath(p, &x, p->sParse.aUp[p->i]); + jsonResult(&x); + break; + } + /* For json_each() path and root are the same so fall through + ** into the root case */ + } + default: { + const char *zRoot = p->zRoot; + if( zRoot==0 ) zRoot = "$"; + sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC); + break; + } + case JEACH_JSON: { + assert( i==JEACH_JSON ); + sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC); + break; + } + } + return SQLITE_OK; +} + +/* Return the current rowid value */ +static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + JsonEachCursor *p = (JsonEachCursor*)cur; + *pRowid = p->iRowid; + return SQLITE_OK; +} + +/* The query strategy is to look for an equality constraint on the json +** column. Without such a constraint, the table cannot operate. idxNum is +** 1 if the constraint is found, 3 if the constraint and zRoot are found, +** and 0 otherwise. +*/ +static int jsonEachBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; /* Loop counter or computed array index */ + int aIdx[2]; /* Index of constraints for JSON and ROOT */ + int unusableMask = 0; /* Mask of unusable JSON and ROOT constraints */ + int idxMask = 0; /* Mask of usable == constraints JSON and ROOT */ + const struct sqlite3_index_constraint *pConstraint; + + /* This implementation assumes that JSON and ROOT are the last two + ** columns in the table */ + assert( JEACH_ROOT == JEACH_JSON+1 ); + UNUSED_PARAM(tab); + aIdx[0] = aIdx[1] = -1; + pConstraint = pIdxInfo->aConstraint; + for(i=0; inConstraint; i++, pConstraint++){ + int iCol; + int iMask; + if( pConstraint->iColumn < JEACH_JSON ) continue; + iCol = pConstraint->iColumn - JEACH_JSON; + assert( iCol==0 || iCol==1 ); + iMask = 1 << iCol; + if( pConstraint->usable==0 ){ + unusableMask |= iMask; + }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + aIdx[iCol] = i; + idxMask |= iMask; + } + } + if( (unusableMask & ~idxMask)!=0 ){ + /* If there are any unusable constraints on JSON or ROOT, then reject + ** this entire plan */ + return SQLITE_CONSTRAINT; + } + if( aIdx[0]<0 ){ + /* No JSON input. Leave estimatedCost at the huge value that it was + ** initialized to to discourage the query planner from selecting this + ** plan. */ + pIdxInfo->idxNum = 0; + }else{ + pIdxInfo->estimatedCost = 1.0; + i = aIdx[0]; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + if( aIdx[1]<0 ){ + pIdxInfo->idxNum = 1; /* Only JSON supplied. Plan 1 */ + }else{ + i = aIdx[1]; + pIdxInfo->aConstraintUsage[i].argvIndex = 2; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->idxNum = 3; /* Both JSON and ROOT are supplied. Plan 3 */ + } + } + return SQLITE_OK; +} + +/* Start a search on a new JSON string */ +static int jsonEachFilter( + sqlite3_vtab_cursor *cur, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + JsonEachCursor *p = (JsonEachCursor*)cur; + const char *z; + const char *zRoot = 0; + sqlite3_int64 n; + + UNUSED_PARAM(idxStr); + UNUSED_PARAM(argc); + jsonEachCursorReset(p); + if( idxNum==0 ) return SQLITE_OK; + z = (const char*)sqlite3_value_text(argv[0]); + if( z==0 ) return SQLITE_OK; + n = sqlite3_value_bytes(argv[0]); + p->zJson = sqlite3_malloc64( n+1 ); + if( p->zJson==0 ) return SQLITE_NOMEM; + memcpy(p->zJson, z, (size_t)n+1); + if( jsonParse(&p->sParse, 0, p->zJson) ){ + int rc = SQLITE_NOMEM; + if( p->sParse.oom==0 ){ + sqlite3_free(cur->pVtab->zErrMsg); + cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON"); + if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR; + } + jsonEachCursorReset(p); + return rc; + }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){ + jsonEachCursorReset(p); + return SQLITE_NOMEM; + }else{ + JsonNode *pNode = 0; + if( idxNum==3 ){ + const char *zErr = 0; + zRoot = (const char*)sqlite3_value_text(argv[1]); + if( zRoot==0 ) return SQLITE_OK; + n = sqlite3_value_bytes(argv[1]); + p->zRoot = sqlite3_malloc64( n+1 ); + if( p->zRoot==0 ) return SQLITE_NOMEM; + memcpy(p->zRoot, zRoot, (size_t)n+1); + if( zRoot[0]!='$' ){ + zErr = zRoot; + }else{ + pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr); + } + if( zErr ){ + sqlite3_free(cur->pVtab->zErrMsg); + cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr); + jsonEachCursorReset(p); + return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM; + }else if( pNode==0 ){ + return SQLITE_OK; + } + }else{ + pNode = p->sParse.aNode; + } + p->iBegin = p->i = (int)(pNode - p->sParse.aNode); + p->eType = pNode->eType; + if( p->eType>=JSON_ARRAY ){ + pNode->u.iKey = 0; + p->iEnd = p->i + pNode->n + 1; + if( p->bRecursive ){ + p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType; + if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){ + p->i--; + } + }else{ + p->i++; + } + }else{ + p->iEnd = p->i+1; + } + } + return SQLITE_OK; +} + +/* The methods of the json_each virtual table */ +static sqlite3_module jsonEachModule = { + 0, /* iVersion */ + 0, /* xCreate */ + jsonEachConnect, /* xConnect */ + jsonEachBestIndex, /* xBestIndex */ + jsonEachDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + jsonEachOpenEach, /* xOpen - open a cursor */ + jsonEachClose, /* xClose - close a cursor */ + jsonEachFilter, /* xFilter - configure scan constraints */ + jsonEachNext, /* xNext - advance a cursor */ + jsonEachEof, /* xEof - check for end of scan */ + jsonEachColumn, /* xColumn - read data */ + jsonEachRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ +}; + +/* The methods of the json_tree virtual table. */ +static sqlite3_module jsonTreeModule = { + 0, /* iVersion */ + 0, /* xCreate */ + jsonEachConnect, /* xConnect */ + jsonEachBestIndex, /* xBestIndex */ + jsonEachDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + jsonEachOpenTree, /* xOpen - open a cursor */ + jsonEachClose, /* xClose - close a cursor */ + jsonEachFilter, /* xFilter - configure scan constraints */ + jsonEachNext, /* xNext - advance a cursor */ + jsonEachEof, /* xEof - check for end of scan */ + jsonEachColumn, /* xColumn - read data */ + jsonEachRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ +}; +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/**************************************************************************** +** The following routines are the only publically visible identifiers in this +** file. Call the following routines in order to register the various SQL +** functions and the virtual table implemented by this file. +****************************************************************************/ + +SQLITE_PRIVATE int sqlite3Json1Init(sqlite3 *db){ + int rc = SQLITE_OK; + unsigned int i; + static const struct { + const char *zName; + int nArg; + int flag; + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } aFunc[] = { + { "json", 1, 0, jsonRemoveFunc }, + { "json_array", -1, 0, jsonArrayFunc }, + { "json_array_length", 1, 0, jsonArrayLengthFunc }, + { "json_array_length", 2, 0, jsonArrayLengthFunc }, + { "json_extract", -1, 0, jsonExtractFunc }, + { "json_insert", -1, 0, jsonSetFunc }, + { "json_object", -1, 0, jsonObjectFunc }, + { "json_patch", 2, 0, jsonPatchFunc }, + { "json_quote", 1, 0, jsonQuoteFunc }, + { "json_remove", -1, 0, jsonRemoveFunc }, + { "json_replace", -1, 0, jsonReplaceFunc }, + { "json_set", -1, 1, jsonSetFunc }, + { "json_type", 1, 0, jsonTypeFunc }, + { "json_type", 2, 0, jsonTypeFunc }, + { "json_valid", 1, 0, jsonValidFunc }, + +#if SQLITE_DEBUG + /* DEBUG and TESTING functions */ + { "json_parse", 1, 0, jsonParseFunc }, + { "json_test1", 1, 0, jsonTest1Func }, +#endif + }; + static const struct { + const char *zName; + int nArg; + void (*xStep)(sqlite3_context*,int,sqlite3_value**); + void (*xFinal)(sqlite3_context*); + void (*xValue)(sqlite3_context*); + } aAgg[] = { + { "json_group_array", 1, + jsonArrayStep, jsonArrayFinal, jsonArrayValue }, + { "json_group_object", 2, + jsonObjectStep, jsonObjectFinal, jsonObjectValue }, + }; +#ifndef SQLITE_OMIT_VIRTUALTABLE + static const struct { + const char *zName; + sqlite3_module *pModule; + } aMod[] = { + { "json_each", &jsonEachModule }, + { "json_tree", &jsonTreeModule }, + }; +#endif + static const int enc = + SQLITE_UTF8 | + SQLITE_DETERMINISTIC | + SQLITE_INNOCUOUS; + for(i=0; i */ +/* #include */ +/* #include */ + +/* The following macro is used to suppress compiler warnings. +*/ +#ifndef UNUSED_PARAMETER +# define UNUSED_PARAMETER(x) (void)(x) +#endif + +typedef struct Rtree Rtree; +typedef struct RtreeCursor RtreeCursor; +typedef struct RtreeNode RtreeNode; +typedef struct RtreeCell RtreeCell; +typedef struct RtreeConstraint RtreeConstraint; +typedef struct RtreeMatchArg RtreeMatchArg; +typedef struct RtreeGeomCallback RtreeGeomCallback; +typedef union RtreeCoord RtreeCoord; +typedef struct RtreeSearchPoint RtreeSearchPoint; + +/* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */ +#define RTREE_MAX_DIMENSIONS 5 + +/* Maximum number of auxiliary columns */ +#define RTREE_MAX_AUX_COLUMN 100 + +/* Size of hash table Rtree.aHash. This hash table is not expected to +** ever contain very many entries, so a fixed number of buckets is +** used. +*/ +#define HASHSIZE 97 + +/* The xBestIndex method of this virtual table requires an estimate of +** the number of rows in the virtual table to calculate the costs of +** various strategies. If possible, this estimate is loaded from the +** sqlite_stat1 table (with RTREE_MIN_ROWEST as a hard-coded minimum). +** Otherwise, if no sqlite_stat1 entry is available, use +** RTREE_DEFAULT_ROWEST. +*/ +#define RTREE_DEFAULT_ROWEST 1048576 +#define RTREE_MIN_ROWEST 100 + +/* +** An rtree virtual-table object. +*/ +struct Rtree { + sqlite3_vtab base; /* Base class. Must be first */ + sqlite3 *db; /* Host database connection */ + int iNodeSize; /* Size in bytes of each node in the node table */ + u8 nDim; /* Number of dimensions */ + u8 nDim2; /* Twice the number of dimensions */ + u8 eCoordType; /* RTREE_COORD_REAL32 or RTREE_COORD_INT32 */ + u8 nBytesPerCell; /* Bytes consumed per cell */ + u8 inWrTrans; /* True if inside write transaction */ + u8 nAux; /* # of auxiliary columns in %_rowid */ + u8 nAuxNotNull; /* Number of initial not-null aux columns */ +#ifdef SQLITE_DEBUG + u8 bCorrupt; /* Shadow table corruption detected */ +#endif + int iDepth; /* Current depth of the r-tree structure */ + char *zDb; /* Name of database containing r-tree table */ + char *zName; /* Name of r-tree table */ + u32 nBusy; /* Current number of users of this structure */ + i64 nRowEst; /* Estimated number of rows in this table */ + u32 nCursor; /* Number of open cursors */ + u32 nNodeRef; /* Number RtreeNodes with positive nRef */ + char *zReadAuxSql; /* SQL for statement to read aux data */ + + /* List of nodes removed during a CondenseTree operation. List is + ** linked together via the pointer normally used for hash chains - + ** RtreeNode.pNext. RtreeNode.iNode stores the depth of the sub-tree + ** headed by the node (leaf nodes have RtreeNode.iNode==0). + */ + RtreeNode *pDeleted; + int iReinsertHeight; /* Height of sub-trees Reinsert() has run on */ + + /* Blob I/O on xxx_node */ + sqlite3_blob *pNodeBlob; + + /* Statements to read/write/delete a record from xxx_node */ + sqlite3_stmt *pWriteNode; + sqlite3_stmt *pDeleteNode; + + /* Statements to read/write/delete a record from xxx_rowid */ + sqlite3_stmt *pReadRowid; + sqlite3_stmt *pWriteRowid; + sqlite3_stmt *pDeleteRowid; + + /* Statements to read/write/delete a record from xxx_parent */ + sqlite3_stmt *pReadParent; + sqlite3_stmt *pWriteParent; + sqlite3_stmt *pDeleteParent; + + /* Statement for writing to the "aux:" fields, if there are any */ + sqlite3_stmt *pWriteAux; + + RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */ +}; + +/* Possible values for Rtree.eCoordType: */ +#define RTREE_COORD_REAL32 0 +#define RTREE_COORD_INT32 1 + +/* +** If SQLITE_RTREE_INT_ONLY is defined, then this virtual table will +** only deal with integer coordinates. No floating point operations +** will be done. +*/ +#ifdef SQLITE_RTREE_INT_ONLY + typedef sqlite3_int64 RtreeDValue; /* High accuracy coordinate */ + typedef int RtreeValue; /* Low accuracy coordinate */ +# define RTREE_ZERO 0 +#else + typedef double RtreeDValue; /* High accuracy coordinate */ + typedef float RtreeValue; /* Low accuracy coordinate */ +# define RTREE_ZERO 0.0 +#endif + +/* +** Set the Rtree.bCorrupt flag +*/ +#ifdef SQLITE_DEBUG +# define RTREE_IS_CORRUPT(X) ((X)->bCorrupt = 1) +#else +# define RTREE_IS_CORRUPT(X) +#endif + +/* +** When doing a search of an r-tree, instances of the following structure +** record intermediate results from the tree walk. +** +** The id is always a node-id. For iLevel>=1 the id is the node-id of +** the node that the RtreeSearchPoint represents. When iLevel==0, however, +** the id is of the parent node and the cell that RtreeSearchPoint +** represents is the iCell-th entry in the parent node. +*/ +struct RtreeSearchPoint { + RtreeDValue rScore; /* The score for this node. Smallest goes first. */ + sqlite3_int64 id; /* Node ID */ + u8 iLevel; /* 0=entries. 1=leaf node. 2+ for higher */ + u8 eWithin; /* PARTLY_WITHIN or FULLY_WITHIN */ + u8 iCell; /* Cell index within the node */ +}; + +/* +** The minimum number of cells allowed for a node is a third of the +** maximum. In Gutman's notation: +** +** m = M/3 +** +** If an R*-tree "Reinsert" operation is required, the same number of +** cells are removed from the overfull node and reinserted into the tree. +*/ +#define RTREE_MINCELLS(p) ((((p)->iNodeSize-4)/(p)->nBytesPerCell)/3) +#define RTREE_REINSERT(p) RTREE_MINCELLS(p) +#define RTREE_MAXCELLS 51 + +/* +** The smallest possible node-size is (512-64)==448 bytes. And the largest +** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates). +** Therefore all non-root nodes must contain at least 3 entries. Since +** 3^40 is greater than 2^64, an r-tree structure always has a depth of +** 40 or less. +*/ +#define RTREE_MAX_DEPTH 40 + + +/* +** Number of entries in the cursor RtreeNode cache. The first entry is +** used to cache the RtreeNode for RtreeCursor.sPoint. The remaining +** entries cache the RtreeNode for the first elements of the priority queue. +*/ +#define RTREE_CACHE_SZ 5 + +/* +** An rtree cursor object. +*/ +struct RtreeCursor { + sqlite3_vtab_cursor base; /* Base class. Must be first */ + u8 atEOF; /* True if at end of search */ + u8 bPoint; /* True if sPoint is valid */ + u8 bAuxValid; /* True if pReadAux is valid */ + int iStrategy; /* Copy of idxNum search parameter */ + int nConstraint; /* Number of entries in aConstraint */ + RtreeConstraint *aConstraint; /* Search constraints. */ + int nPointAlloc; /* Number of slots allocated for aPoint[] */ + int nPoint; /* Number of slots used in aPoint[] */ + int mxLevel; /* iLevel value for root of the tree */ + RtreeSearchPoint *aPoint; /* Priority queue for search points */ + sqlite3_stmt *pReadAux; /* Statement to read aux-data */ + RtreeSearchPoint sPoint; /* Cached next search point */ + RtreeNode *aNode[RTREE_CACHE_SZ]; /* Rtree node cache */ + u32 anQueue[RTREE_MAX_DEPTH+1]; /* Number of queued entries by iLevel */ +}; + +/* Return the Rtree of a RtreeCursor */ +#define RTREE_OF_CURSOR(X) ((Rtree*)((X)->base.pVtab)) + +/* +** A coordinate can be either a floating point number or a integer. All +** coordinates within a single R-Tree are always of the same time. +*/ +union RtreeCoord { + RtreeValue f; /* Floating point value */ + int i; /* Integer value */ + u32 u; /* Unsigned for byte-order conversions */ +}; + +/* +** The argument is an RtreeCoord. Return the value stored within the RtreeCoord +** formatted as a RtreeDValue (double or int64). This macro assumes that local +** variable pRtree points to the Rtree structure associated with the +** RtreeCoord. +*/ +#ifdef SQLITE_RTREE_INT_ONLY +# define DCOORD(coord) ((RtreeDValue)coord.i) +#else +# define DCOORD(coord) ( \ + (pRtree->eCoordType==RTREE_COORD_REAL32) ? \ + ((double)coord.f) : \ + ((double)coord.i) \ + ) +#endif + +/* +** A search constraint. +*/ +struct RtreeConstraint { + int iCoord; /* Index of constrained coordinate */ + int op; /* Constraining operation */ + union { + RtreeDValue rValue; /* Constraint value. */ + int (*xGeom)(sqlite3_rtree_geometry*,int,RtreeDValue*,int*); + int (*xQueryFunc)(sqlite3_rtree_query_info*); + } u; + sqlite3_rtree_query_info *pInfo; /* xGeom and xQueryFunc argument */ +}; + +/* Possible values for RtreeConstraint.op */ +#define RTREE_EQ 0x41 /* A */ +#define RTREE_LE 0x42 /* B */ +#define RTREE_LT 0x43 /* C */ +#define RTREE_GE 0x44 /* D */ +#define RTREE_GT 0x45 /* E */ +#define RTREE_MATCH 0x46 /* F: Old-style sqlite3_rtree_geometry_callback() */ +#define RTREE_QUERY 0x47 /* G: New-style sqlite3_rtree_query_callback() */ + +/* Special operators available only on cursors. Needs to be consecutive +** with the normal values above, but must be less than RTREE_MATCH. These +** are used in the cursor for contraints such as x=NULL (RTREE_FALSE) or +** x<'xyz' (RTREE_TRUE) */ +#define RTREE_TRUE 0x3f /* ? */ +#define RTREE_FALSE 0x40 /* @ */ + +/* +** An rtree structure node. +*/ +struct RtreeNode { + RtreeNode *pParent; /* Parent node */ + i64 iNode; /* The node number */ + int nRef; /* Number of references to this node */ + int isDirty; /* True if the node needs to be written to disk */ + u8 *zData; /* Content of the node, as should be on disk */ + RtreeNode *pNext; /* Next node in this hash collision chain */ +}; + +/* Return the number of cells in a node */ +#define NCELL(pNode) readInt16(&(pNode)->zData[2]) + +/* +** A single cell from a node, deserialized +*/ +struct RtreeCell { + i64 iRowid; /* Node or entry ID */ + RtreeCoord aCoord[RTREE_MAX_DIMENSIONS*2]; /* Bounding box coordinates */ +}; + + +/* +** This object becomes the sqlite3_user_data() for the SQL functions +** that are created by sqlite3_rtree_geometry_callback() and +** sqlite3_rtree_query_callback() and which appear on the right of MATCH +** operators in order to constrain a search. +** +** xGeom and xQueryFunc are the callback functions. Exactly one of +** xGeom and xQueryFunc fields is non-NULL, depending on whether the +** SQL function was created using sqlite3_rtree_geometry_callback() or +** sqlite3_rtree_query_callback(). +** +** This object is deleted automatically by the destructor mechanism in +** sqlite3_create_function_v2(). +*/ +struct RtreeGeomCallback { + int (*xGeom)(sqlite3_rtree_geometry*, int, RtreeDValue*, int*); + int (*xQueryFunc)(sqlite3_rtree_query_info*); + void (*xDestructor)(void*); + void *pContext; +}; + +/* +** An instance of this structure (in the form of a BLOB) is returned by +** the SQL functions that sqlite3_rtree_geometry_callback() and +** sqlite3_rtree_query_callback() create, and is read as the right-hand +** operand to the MATCH operator of an R-Tree. +*/ +struct RtreeMatchArg { + u32 iSize; /* Size of this object */ + RtreeGeomCallback cb; /* Info about the callback functions */ + int nParam; /* Number of parameters to the SQL function */ + sqlite3_value **apSqlParam; /* Original SQL parameter values */ + RtreeDValue aParam[1]; /* Values for parameters to the SQL function */ +}; + +#ifndef MAX +# define MAX(x,y) ((x) < (y) ? (y) : (x)) +#endif +#ifndef MIN +# define MIN(x,y) ((x) > (y) ? (y) : (x)) +#endif + +/* What version of GCC is being used. 0 means GCC is not being used . +** Note that the GCC_VERSION macro will also be set correctly when using +** clang, since clang works hard to be gcc compatible. So the gcc +** optimizations will also work when compiling with clang. +*/ +#ifndef GCC_VERSION +#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif +#endif + +/* The testcase() macro should already be defined in the amalgamation. If +** it is not, make it a no-op. +*/ +#ifndef SQLITE_AMALGAMATION +# define testcase(X) +#endif + +/* +** Macros to determine whether the machine is big or little endian, +** and whether or not that determination is run-time or compile-time. +** +** For best performance, an attempt is made to guess at the byte-order +** using C-preprocessor macros. If that is unsuccessful, or if +** -DSQLITE_RUNTIME_BYTEORDER=1 is set, then byte-order is determined +** at run-time. +*/ +#ifndef SQLITE_BYTEORDER +#if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__arm__) +# define SQLITE_BYTEORDER 1234 +#elif defined(sparc) || defined(__ppc__) +# define SQLITE_BYTEORDER 4321 +#else +# define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */ +#endif +#endif + + +/* What version of MSVC is being used. 0 means MSVC is not being used */ +#ifndef MSVC_VERSION +#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) +# define MSVC_VERSION _MSC_VER +#else +# define MSVC_VERSION 0 +#endif +#endif + +/* +** Functions to deserialize a 16 bit integer, 32 bit real number and +** 64 bit integer. The deserialized value is returned. +*/ +static int readInt16(u8 *p){ + return (p[0]<<8) + p[1]; +} +static void readCoord(u8 *p, RtreeCoord *pCoord){ + assert( ((((char*)p) - (char*)0)&3)==0 ); /* p is always 4-byte aligned */ +#if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + pCoord->u = _byteswap_ulong(*(u32*)p); +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + pCoord->u = __builtin_bswap32(*(u32*)p); +#elif SQLITE_BYTEORDER==4321 + pCoord->u = *(u32*)p; +#else + pCoord->u = ( + (((u32)p[0]) << 24) + + (((u32)p[1]) << 16) + + (((u32)p[2]) << 8) + + (((u32)p[3]) << 0) + ); +#endif +} +static i64 readInt64(u8 *p){ +#if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + u64 x; + memcpy(&x, p, 8); + return (i64)_byteswap_uint64(x); +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + u64 x; + memcpy(&x, p, 8); + return (i64)__builtin_bswap64(x); +#elif SQLITE_BYTEORDER==4321 + i64 x; + memcpy(&x, p, 8); + return x; +#else + return (i64)( + (((u64)p[0]) << 56) + + (((u64)p[1]) << 48) + + (((u64)p[2]) << 40) + + (((u64)p[3]) << 32) + + (((u64)p[4]) << 24) + + (((u64)p[5]) << 16) + + (((u64)p[6]) << 8) + + (((u64)p[7]) << 0) + ); +#endif +} + +/* +** Functions to serialize a 16 bit integer, 32 bit real number and +** 64 bit integer. The value returned is the number of bytes written +** to the argument buffer (always 2, 4 and 8 respectively). +*/ +static void writeInt16(u8 *p, int i){ + p[0] = (i>> 8)&0xFF; + p[1] = (i>> 0)&0xFF; +} +static int writeCoord(u8 *p, RtreeCoord *pCoord){ + u32 i; + assert( ((((char*)p) - (char*)0)&3)==0 ); /* p is always 4-byte aligned */ + assert( sizeof(RtreeCoord)==4 ); + assert( sizeof(u32)==4 ); +#if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + i = __builtin_bswap32(pCoord->u); + memcpy(p, &i, 4); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + i = _byteswap_ulong(pCoord->u); + memcpy(p, &i, 4); +#elif SQLITE_BYTEORDER==4321 + i = pCoord->u; + memcpy(p, &i, 4); +#else + i = pCoord->u; + p[0] = (i>>24)&0xFF; + p[1] = (i>>16)&0xFF; + p[2] = (i>> 8)&0xFF; + p[3] = (i>> 0)&0xFF; +#endif + return 4; +} +static int writeInt64(u8 *p, i64 i){ +#if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + i = (i64)__builtin_bswap64((u64)i); + memcpy(p, &i, 8); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + i = (i64)_byteswap_uint64((u64)i); + memcpy(p, &i, 8); +#elif SQLITE_BYTEORDER==4321 + memcpy(p, &i, 8); +#else + p[0] = (i>>56)&0xFF; + p[1] = (i>>48)&0xFF; + p[2] = (i>>40)&0xFF; + p[3] = (i>>32)&0xFF; + p[4] = (i>>24)&0xFF; + p[5] = (i>>16)&0xFF; + p[6] = (i>> 8)&0xFF; + p[7] = (i>> 0)&0xFF; +#endif + return 8; +} + +/* +** Increment the reference count of node p. +*/ +static void nodeReference(RtreeNode *p){ + if( p ){ + assert( p->nRef>0 ); + p->nRef++; + } +} + +/* +** Clear the content of node p (set all bytes to 0x00). +*/ +static void nodeZero(Rtree *pRtree, RtreeNode *p){ + memset(&p->zData[2], 0, pRtree->iNodeSize-2); + p->isDirty = 1; +} + +/* +** Given a node number iNode, return the corresponding key to use +** in the Rtree.aHash table. +*/ +static unsigned int nodeHash(i64 iNode){ + return ((unsigned)iNode) % HASHSIZE; +} + +/* +** Search the node hash table for node iNode. If found, return a pointer +** to it. Otherwise, return 0. +*/ +static RtreeNode *nodeHashLookup(Rtree *pRtree, i64 iNode){ + RtreeNode *p; + for(p=pRtree->aHash[nodeHash(iNode)]; p && p->iNode!=iNode; p=p->pNext); + return p; +} + +/* +** Add node pNode to the node hash table. +*/ +static void nodeHashInsert(Rtree *pRtree, RtreeNode *pNode){ + int iHash; + assert( pNode->pNext==0 ); + iHash = nodeHash(pNode->iNode); + pNode->pNext = pRtree->aHash[iHash]; + pRtree->aHash[iHash] = pNode; +} + +/* +** Remove node pNode from the node hash table. +*/ +static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ + RtreeNode **pp; + if( pNode->iNode!=0 ){ + pp = &pRtree->aHash[nodeHash(pNode->iNode)]; + for( ; (*pp)!=pNode; pp = &(*pp)->pNext){ assert(*pp); } + *pp = pNode->pNext; + pNode->pNext = 0; + } +} + +/* +** Allocate and return new r-tree node. Initially, (RtreeNode.iNode==0), +** indicating that node has not yet been assigned a node number. It is +** assigned a node number when nodeWrite() is called to write the +** node contents out to the database. +*/ +static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ + RtreeNode *pNode; + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode) + pRtree->iNodeSize); + if( pNode ){ + memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize); + pNode->zData = (u8 *)&pNode[1]; + pNode->nRef = 1; + pRtree->nNodeRef++; + pNode->pParent = pParent; + pNode->isDirty = 1; + nodeReference(pParent); + } + return pNode; +} + +/* +** Clear the Rtree.pNodeBlob object +*/ +static void nodeBlobReset(Rtree *pRtree){ + if( pRtree->pNodeBlob && pRtree->inWrTrans==0 && pRtree->nCursor==0 ){ + sqlite3_blob *pBlob = pRtree->pNodeBlob; + pRtree->pNodeBlob = 0; + sqlite3_blob_close(pBlob); + } +} + +/* +** Check to see if pNode is the same as pParent or any of the parents +** of pParent. +*/ +static int nodeInParentChain(const RtreeNode *pNode, const RtreeNode *pParent){ + do{ + if( pNode==pParent ) return 1; + pParent = pParent->pParent; + }while( pParent ); + return 0; +} + +/* +** Obtain a reference to an r-tree node. +*/ +static int nodeAcquire( + Rtree *pRtree, /* R-tree structure */ + i64 iNode, /* Node number to load */ + RtreeNode *pParent, /* Either the parent node or NULL */ + RtreeNode **ppNode /* OUT: Acquired node */ +){ + int rc = SQLITE_OK; + RtreeNode *pNode = 0; + + /* Check if the requested node is already in the hash table. If so, + ** increase its reference count and return it. + */ + if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ + if( pParent && !pNode->pParent ){ + if( nodeInParentChain(pNode, pParent) ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + pParent->nRef++; + pNode->pParent = pParent; + }else if( pParent && pNode->pParent && pParent!=pNode->pParent ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + pNode->nRef++; + *ppNode = pNode; + return SQLITE_OK; + } + + if( pRtree->pNodeBlob ){ + sqlite3_blob *pBlob = pRtree->pNodeBlob; + pRtree->pNodeBlob = 0; + rc = sqlite3_blob_reopen(pBlob, iNode); + pRtree->pNodeBlob = pBlob; + if( rc ){ + nodeBlobReset(pRtree); + if( rc==SQLITE_NOMEM ) return SQLITE_NOMEM; + } + } + if( pRtree->pNodeBlob==0 ){ + char *zTab = sqlite3_mprintf("%s_node", pRtree->zName); + if( zTab==0 ) return SQLITE_NOMEM; + rc = sqlite3_blob_open(pRtree->db, pRtree->zDb, zTab, "data", iNode, 0, + &pRtree->pNodeBlob); + sqlite3_free(zTab); + } + if( rc ){ + nodeBlobReset(pRtree); + *ppNode = 0; + /* If unable to open an sqlite3_blob on the desired row, that can only + ** be because the shadow tables hold erroneous data. */ + if( rc==SQLITE_ERROR ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } + }else if( pRtree->iNodeSize==sqlite3_blob_bytes(pRtree->pNodeBlob) ){ + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode)+pRtree->iNodeSize); + if( !pNode ){ + rc = SQLITE_NOMEM; + }else{ + pNode->pParent = pParent; + pNode->zData = (u8 *)&pNode[1]; + pNode->nRef = 1; + pRtree->nNodeRef++; + pNode->iNode = iNode; + pNode->isDirty = 0; + pNode->pNext = 0; + rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData, + pRtree->iNodeSize, 0); + } + } + + /* If the root node was just loaded, set pRtree->iDepth to the height + ** of the r-tree structure. A height of zero means all data is stored on + ** the root node. A height of one means the children of the root node + ** are the leaves, and so on. If the depth as specified on the root node + ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt. + */ + if( pNode && iNode==1 ){ + pRtree->iDepth = readInt16(pNode->zData); + if( pRtree->iDepth>RTREE_MAX_DEPTH ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } + } + + /* If no error has occurred so far, check if the "number of entries" + ** field on the node is too large. If so, set the return code to + ** SQLITE_CORRUPT_VTAB. + */ + if( pNode && rc==SQLITE_OK ){ + if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } + } + + if( rc==SQLITE_OK ){ + if( pNode!=0 ){ + nodeReference(pParent); + nodeHashInsert(pRtree, pNode); + }else{ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } + *ppNode = pNode; + }else{ + if( pNode ){ + pRtree->nNodeRef--; + sqlite3_free(pNode); + } + *ppNode = 0; + } + + return rc; +} + +/* +** Overwrite cell iCell of node pNode with the contents of pCell. +*/ +static void nodeOverwriteCell( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node into which the cell is to be written */ + RtreeCell *pCell, /* The cell to write */ + int iCell /* Index into pNode into which pCell is written */ +){ + int ii; + u8 *p = &pNode->zData[4 + pRtree->nBytesPerCell*iCell]; + p += writeInt64(p, pCell->iRowid); + for(ii=0; iinDim2; ii++){ + p += writeCoord(p, &pCell->aCoord[ii]); + } + pNode->isDirty = 1; +} + +/* +** Remove the cell with index iCell from node pNode. +*/ +static void nodeDeleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell){ + u8 *pDst = &pNode->zData[4 + pRtree->nBytesPerCell*iCell]; + u8 *pSrc = &pDst[pRtree->nBytesPerCell]; + int nByte = (NCELL(pNode) - iCell - 1) * pRtree->nBytesPerCell; + memmove(pDst, pSrc, nByte); + writeInt16(&pNode->zData[2], NCELL(pNode)-1); + pNode->isDirty = 1; +} + +/* +** Insert the contents of cell pCell into node pNode. If the insert +** is successful, return SQLITE_OK. +** +** If there is not enough free space in pNode, return SQLITE_FULL. +*/ +static int nodeInsertCell( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* Write new cell into this node */ + RtreeCell *pCell /* The cell to be inserted */ +){ + int nCell; /* Current number of cells in pNode */ + int nMaxCell; /* Maximum number of cells for pNode */ + + nMaxCell = (pRtree->iNodeSize-4)/pRtree->nBytesPerCell; + nCell = NCELL(pNode); + + assert( nCell<=nMaxCell ); + if( nCellzData[2], nCell+1); + pNode->isDirty = 1; + } + + return (nCell==nMaxCell); +} + +/* +** If the node is dirty, write it out to the database. +*/ +static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){ + int rc = SQLITE_OK; + if( pNode->isDirty ){ + sqlite3_stmt *p = pRtree->pWriteNode; + if( pNode->iNode ){ + sqlite3_bind_int64(p, 1, pNode->iNode); + }else{ + sqlite3_bind_null(p, 1); + } + sqlite3_bind_blob(p, 2, pNode->zData, pRtree->iNodeSize, SQLITE_STATIC); + sqlite3_step(p); + pNode->isDirty = 0; + rc = sqlite3_reset(p); + sqlite3_bind_null(p, 2); + if( pNode->iNode==0 && rc==SQLITE_OK ){ + pNode->iNode = sqlite3_last_insert_rowid(pRtree->db); + nodeHashInsert(pRtree, pNode); + } + } + return rc; +} + +/* +** Release a reference to a node. If the node is dirty and the reference +** count drops to zero, the node data is written to the database. +*/ +static int nodeRelease(Rtree *pRtree, RtreeNode *pNode){ + int rc = SQLITE_OK; + if( pNode ){ + assert( pNode->nRef>0 ); + assert( pRtree->nNodeRef>0 ); + pNode->nRef--; + if( pNode->nRef==0 ){ + pRtree->nNodeRef--; + if( pNode->iNode==1 ){ + pRtree->iDepth = -1; + } + if( pNode->pParent ){ + rc = nodeRelease(pRtree, pNode->pParent); + } + if( rc==SQLITE_OK ){ + rc = nodeWrite(pRtree, pNode); + } + nodeHashDelete(pRtree, pNode); + sqlite3_free(pNode); + } + } + return rc; +} + +/* +** Return the 64-bit integer value associated with cell iCell of +** node pNode. If pNode is a leaf node, this is a rowid. If it is +** an internal node, then the 64-bit integer is a child page number. +*/ +static i64 nodeGetRowid( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node from which to extract the ID */ + int iCell /* The cell index from which to extract the ID */ +){ + assert( iCellzData[4 + pRtree->nBytesPerCell*iCell]); +} + +/* +** Return coordinate iCoord from cell iCell in node pNode. +*/ +static void nodeGetCoord( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node from which to extract a coordinate */ + int iCell, /* The index of the cell within the node */ + int iCoord, /* Which coordinate to extract */ + RtreeCoord *pCoord /* OUT: Space to write result to */ +){ + readCoord(&pNode->zData[12 + pRtree->nBytesPerCell*iCell + 4*iCoord], pCoord); +} + +/* +** Deserialize cell iCell of node pNode. Populate the structure pointed +** to by pCell with the results. +*/ +static void nodeGetCell( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node containing the cell to be read */ + int iCell, /* Index of the cell within the node */ + RtreeCell *pCell /* OUT: Write the cell contents here */ +){ + u8 *pData; + RtreeCoord *pCoord; + int ii = 0; + pCell->iRowid = nodeGetRowid(pRtree, pNode, iCell); + pData = pNode->zData + (12 + pRtree->nBytesPerCell*iCell); + pCoord = pCell->aCoord; + do{ + readCoord(pData, &pCoord[ii]); + readCoord(pData+4, &pCoord[ii+1]); + pData += 8; + ii += 2; + }while( iinDim2 ); +} + + +/* Forward declaration for the function that does the work of +** the virtual table module xCreate() and xConnect() methods. +*/ +static int rtreeInit( + sqlite3 *, void *, int, const char *const*, sqlite3_vtab **, char **, int +); + +/* +** Rtree virtual table module xCreate method. +*/ +static int rtreeCreate( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 1); +} + +/* +** Rtree virtual table module xConnect method. +*/ +static int rtreeConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 0); +} + +/* +** Increment the r-tree reference count. +*/ +static void rtreeReference(Rtree *pRtree){ + pRtree->nBusy++; +} + +/* +** Decrement the r-tree reference count. When the reference count reaches +** zero the structure is deleted. +*/ +static void rtreeRelease(Rtree *pRtree){ + pRtree->nBusy--; + if( pRtree->nBusy==0 ){ + pRtree->inWrTrans = 0; + assert( pRtree->nCursor==0 ); + nodeBlobReset(pRtree); + assert( pRtree->nNodeRef==0 || pRtree->bCorrupt ); + sqlite3_finalize(pRtree->pWriteNode); + sqlite3_finalize(pRtree->pDeleteNode); + sqlite3_finalize(pRtree->pReadRowid); + sqlite3_finalize(pRtree->pWriteRowid); + sqlite3_finalize(pRtree->pDeleteRowid); + sqlite3_finalize(pRtree->pReadParent); + sqlite3_finalize(pRtree->pWriteParent); + sqlite3_finalize(pRtree->pDeleteParent); + sqlite3_finalize(pRtree->pWriteAux); + sqlite3_free(pRtree->zReadAuxSql); + sqlite3_free(pRtree); + } +} + +/* +** Rtree virtual table module xDisconnect method. +*/ +static int rtreeDisconnect(sqlite3_vtab *pVtab){ + rtreeRelease((Rtree *)pVtab); + return SQLITE_OK; +} + +/* +** Rtree virtual table module xDestroy method. +*/ +static int rtreeDestroy(sqlite3_vtab *pVtab){ + Rtree *pRtree = (Rtree *)pVtab; + int rc; + char *zCreate = sqlite3_mprintf( + "DROP TABLE '%q'.'%q_node';" + "DROP TABLE '%q'.'%q_rowid';" + "DROP TABLE '%q'.'%q_parent';", + pRtree->zDb, pRtree->zName, + pRtree->zDb, pRtree->zName, + pRtree->zDb, pRtree->zName + ); + if( !zCreate ){ + rc = SQLITE_NOMEM; + }else{ + nodeBlobReset(pRtree); + rc = sqlite3_exec(pRtree->db, zCreate, 0, 0, 0); + sqlite3_free(zCreate); + } + if( rc==SQLITE_OK ){ + rtreeRelease(pRtree); + } + + return rc; +} + +/* +** Rtree virtual table module xOpen method. +*/ +static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + int rc = SQLITE_NOMEM; + Rtree *pRtree = (Rtree *)pVTab; + RtreeCursor *pCsr; + + pCsr = (RtreeCursor *)sqlite3_malloc64(sizeof(RtreeCursor)); + if( pCsr ){ + memset(pCsr, 0, sizeof(RtreeCursor)); + pCsr->base.pVtab = pVTab; + rc = SQLITE_OK; + pRtree->nCursor++; + } + *ppCursor = (sqlite3_vtab_cursor *)pCsr; + + return rc; +} + + +/* +** Reset a cursor back to its initial state. +*/ +static void resetCursor(RtreeCursor *pCsr){ + Rtree *pRtree = (Rtree *)(pCsr->base.pVtab); + int ii; + sqlite3_stmt *pStmt; + if( pCsr->aConstraint ){ + int i; /* Used to iterate through constraint array */ + for(i=0; inConstraint; i++){ + sqlite3_rtree_query_info *pInfo = pCsr->aConstraint[i].pInfo; + if( pInfo ){ + if( pInfo->xDelUser ) pInfo->xDelUser(pInfo->pUser); + sqlite3_free(pInfo); + } + } + sqlite3_free(pCsr->aConstraint); + pCsr->aConstraint = 0; + } + for(ii=0; iiaNode[ii]); + sqlite3_free(pCsr->aPoint); + pStmt = pCsr->pReadAux; + memset(pCsr, 0, sizeof(RtreeCursor)); + pCsr->base.pVtab = (sqlite3_vtab*)pRtree; + pCsr->pReadAux = pStmt; + +} + +/* +** Rtree virtual table module xClose method. +*/ +static int rtreeClose(sqlite3_vtab_cursor *cur){ + Rtree *pRtree = (Rtree *)(cur->pVtab); + RtreeCursor *pCsr = (RtreeCursor *)cur; + assert( pRtree->nCursor>0 ); + resetCursor(pCsr); + sqlite3_finalize(pCsr->pReadAux); + sqlite3_free(pCsr); + pRtree->nCursor--; + nodeBlobReset(pRtree); + return SQLITE_OK; +} + +/* +** Rtree virtual table module xEof method. +** +** Return non-zero if the cursor does not currently point to a valid +** record (i.e if the scan has finished), or zero otherwise. +*/ +static int rtreeEof(sqlite3_vtab_cursor *cur){ + RtreeCursor *pCsr = (RtreeCursor *)cur; + return pCsr->atEOF; +} + +/* +** Convert raw bits from the on-disk RTree record into a coordinate value. +** The on-disk format is big-endian and needs to be converted for little- +** endian platforms. The on-disk record stores integer coordinates if +** eInt is true and it stores 32-bit floating point records if eInt is +** false. a[] is the four bytes of the on-disk record to be decoded. +** Store the results in "r". +** +** There are five versions of this macro. The last one is generic. The +** other four are various architectures-specific optimizations. +*/ +#if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + c.u = _byteswap_ulong(*(u32*)a); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + c.u = __builtin_bswap32(*(u32*)a); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#elif SQLITE_BYTEORDER==1234 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + memcpy(&c.u,a,4); \ + c.u = ((c.u>>24)&0xff)|((c.u>>8)&0xff00)| \ + ((c.u&0xff)<<24)|((c.u&0xff00)<<8); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#elif SQLITE_BYTEORDER==4321 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + memcpy(&c.u,a,4); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#else +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + c.u = ((u32)a[0]<<24) + ((u32)a[1]<<16) \ + +((u32)a[2]<<8) + a[3]; \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#endif + +/* +** Check the RTree node or entry given by pCellData and p against the MATCH +** constraint pConstraint. +*/ +static int rtreeCallbackConstraint( + RtreeConstraint *pConstraint, /* The constraint to test */ + int eInt, /* True if RTree holding integer coordinates */ + u8 *pCellData, /* Raw cell content */ + RtreeSearchPoint *pSearch, /* Container of this cell */ + sqlite3_rtree_dbl *prScore, /* OUT: score for the cell */ + int *peWithin /* OUT: visibility of the cell */ +){ + sqlite3_rtree_query_info *pInfo = pConstraint->pInfo; /* Callback info */ + int nCoord = pInfo->nCoord; /* No. of coordinates */ + int rc; /* Callback return code */ + RtreeCoord c; /* Translator union */ + sqlite3_rtree_dbl aCoord[RTREE_MAX_DIMENSIONS*2]; /* Decoded coordinates */ + + assert( pConstraint->op==RTREE_MATCH || pConstraint->op==RTREE_QUERY ); + assert( nCoord==2 || nCoord==4 || nCoord==6 || nCoord==8 || nCoord==10 ); + + if( pConstraint->op==RTREE_QUERY && pSearch->iLevel==1 ){ + pInfo->iRowid = readInt64(pCellData); + } + pCellData += 8; +#ifndef SQLITE_RTREE_INT_ONLY + if( eInt==0 ){ + switch( nCoord ){ + case 10: readCoord(pCellData+36, &c); aCoord[9] = c.f; + readCoord(pCellData+32, &c); aCoord[8] = c.f; + case 8: readCoord(pCellData+28, &c); aCoord[7] = c.f; + readCoord(pCellData+24, &c); aCoord[6] = c.f; + case 6: readCoord(pCellData+20, &c); aCoord[5] = c.f; + readCoord(pCellData+16, &c); aCoord[4] = c.f; + case 4: readCoord(pCellData+12, &c); aCoord[3] = c.f; + readCoord(pCellData+8, &c); aCoord[2] = c.f; + default: readCoord(pCellData+4, &c); aCoord[1] = c.f; + readCoord(pCellData, &c); aCoord[0] = c.f; + } + }else +#endif + { + switch( nCoord ){ + case 10: readCoord(pCellData+36, &c); aCoord[9] = c.i; + readCoord(pCellData+32, &c); aCoord[8] = c.i; + case 8: readCoord(pCellData+28, &c); aCoord[7] = c.i; + readCoord(pCellData+24, &c); aCoord[6] = c.i; + case 6: readCoord(pCellData+20, &c); aCoord[5] = c.i; + readCoord(pCellData+16, &c); aCoord[4] = c.i; + case 4: readCoord(pCellData+12, &c); aCoord[3] = c.i; + readCoord(pCellData+8, &c); aCoord[2] = c.i; + default: readCoord(pCellData+4, &c); aCoord[1] = c.i; + readCoord(pCellData, &c); aCoord[0] = c.i; + } + } + if( pConstraint->op==RTREE_MATCH ){ + int eWithin = 0; + rc = pConstraint->u.xGeom((sqlite3_rtree_geometry*)pInfo, + nCoord, aCoord, &eWithin); + if( eWithin==0 ) *peWithin = NOT_WITHIN; + *prScore = RTREE_ZERO; + }else{ + pInfo->aCoord = aCoord; + pInfo->iLevel = pSearch->iLevel - 1; + pInfo->rScore = pInfo->rParentScore = pSearch->rScore; + pInfo->eWithin = pInfo->eParentWithin = pSearch->eWithin; + rc = pConstraint->u.xQueryFunc(pInfo); + if( pInfo->eWithin<*peWithin ) *peWithin = pInfo->eWithin; + if( pInfo->rScore<*prScore || *prScorerScore; + } + } + return rc; +} + +/* +** Check the internal RTree node given by pCellData against constraint p. +** If this constraint cannot be satisfied by any child within the node, +** set *peWithin to NOT_WITHIN. +*/ +static void rtreeNonleafConstraint( + RtreeConstraint *p, /* The constraint to test */ + int eInt, /* True if RTree holds integer coordinates */ + u8 *pCellData, /* Raw cell content as appears on disk */ + int *peWithin /* Adjust downward, as appropriate */ +){ + sqlite3_rtree_dbl val; /* Coordinate value convert to a double */ + + /* p->iCoord might point to either a lower or upper bound coordinate + ** in a coordinate pair. But make pCellData point to the lower bound. + */ + pCellData += 8 + 4*(p->iCoord&0xfe); + + assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE + || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_TRUE + || p->op==RTREE_FALSE ); + assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ + switch( p->op ){ + case RTREE_TRUE: return; /* Always satisfied */ + case RTREE_FALSE: break; /* Never satisfied */ + case RTREE_LE: + case RTREE_LT: + case RTREE_EQ: + RTREE_DECODE_COORD(eInt, pCellData, val); + /* val now holds the lower bound of the coordinate pair */ + if( p->u.rValue>=val ) return; + if( p->op!=RTREE_EQ ) break; /* RTREE_LE and RTREE_LT end here */ + /* Fall through for the RTREE_EQ case */ + + default: /* RTREE_GT or RTREE_GE, or fallthrough of RTREE_EQ */ + pCellData += 4; + RTREE_DECODE_COORD(eInt, pCellData, val); + /* val now holds the upper bound of the coordinate pair */ + if( p->u.rValue<=val ) return; + } + *peWithin = NOT_WITHIN; +} + +/* +** Check the leaf RTree cell given by pCellData against constraint p. +** If this constraint is not satisfied, set *peWithin to NOT_WITHIN. +** If the constraint is satisfied, leave *peWithin unchanged. +** +** The constraint is of the form: xN op $val +** +** The op is given by p->op. The xN is p->iCoord-th coordinate in +** pCellData. $val is given by p->u.rValue. +*/ +static void rtreeLeafConstraint( + RtreeConstraint *p, /* The constraint to test */ + int eInt, /* True if RTree holds integer coordinates */ + u8 *pCellData, /* Raw cell content as appears on disk */ + int *peWithin /* Adjust downward, as appropriate */ +){ + RtreeDValue xN; /* Coordinate value converted to a double */ + + assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE + || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_TRUE + || p->op==RTREE_FALSE ); + pCellData += 8 + p->iCoord*4; + assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ + RTREE_DECODE_COORD(eInt, pCellData, xN); + switch( p->op ){ + case RTREE_TRUE: return; /* Always satisfied */ + case RTREE_FALSE: break; /* Never satisfied */ + case RTREE_LE: if( xN <= p->u.rValue ) return; break; + case RTREE_LT: if( xN < p->u.rValue ) return; break; + case RTREE_GE: if( xN >= p->u.rValue ) return; break; + case RTREE_GT: if( xN > p->u.rValue ) return; break; + default: if( xN == p->u.rValue ) return; break; + } + *peWithin = NOT_WITHIN; +} + +/* +** One of the cells in node pNode is guaranteed to have a 64-bit +** integer value equal to iRowid. Return the index of this cell. +*/ +static int nodeRowidIndex( + Rtree *pRtree, + RtreeNode *pNode, + i64 iRowid, + int *piIndex +){ + int ii; + int nCell = NCELL(pNode); + assert( nCell<200 ); + for(ii=0; iipParent; + if( pParent ){ + return nodeRowidIndex(pRtree, pParent, pNode->iNode, piIndex); + } + *piIndex = -1; + return SQLITE_OK; +} + +/* +** Compare two search points. Return negative, zero, or positive if the first +** is less than, equal to, or greater than the second. +** +** The rScore is the primary key. Smaller rScore values come first. +** If the rScore is a tie, then use iLevel as the tie breaker with smaller +** iLevel values coming first. In this way, if rScore is the same for all +** SearchPoints, then iLevel becomes the deciding factor and the result +** is a depth-first search, which is the desired default behavior. +*/ +static int rtreeSearchPointCompare( + const RtreeSearchPoint *pA, + const RtreeSearchPoint *pB +){ + if( pA->rScorerScore ) return -1; + if( pA->rScore>pB->rScore ) return +1; + if( pA->iLeveliLevel ) return -1; + if( pA->iLevel>pB->iLevel ) return +1; + return 0; +} + +/* +** Interchange two search points in a cursor. +*/ +static void rtreeSearchPointSwap(RtreeCursor *p, int i, int j){ + RtreeSearchPoint t = p->aPoint[i]; + assert( iaPoint[i] = p->aPoint[j]; + p->aPoint[j] = t; + i++; j++; + if( i=RTREE_CACHE_SZ ){ + nodeRelease(RTREE_OF_CURSOR(p), p->aNode[i]); + p->aNode[i] = 0; + }else{ + RtreeNode *pTemp = p->aNode[i]; + p->aNode[i] = p->aNode[j]; + p->aNode[j] = pTemp; + } + } +} + +/* +** Return the search point with the lowest current score. +*/ +static RtreeSearchPoint *rtreeSearchPointFirst(RtreeCursor *pCur){ + return pCur->bPoint ? &pCur->sPoint : pCur->nPoint ? pCur->aPoint : 0; +} + +/* +** Get the RtreeNode for the search point with the lowest score. +*/ +static RtreeNode *rtreeNodeOfFirstSearchPoint(RtreeCursor *pCur, int *pRC){ + sqlite3_int64 id; + int ii = 1 - pCur->bPoint; + assert( ii==0 || ii==1 ); + assert( pCur->bPoint || pCur->nPoint ); + if( pCur->aNode[ii]==0 ){ + assert( pRC!=0 ); + id = ii ? pCur->aPoint[0].id : pCur->sPoint.id; + *pRC = nodeAcquire(RTREE_OF_CURSOR(pCur), id, 0, &pCur->aNode[ii]); + } + return pCur->aNode[ii]; +} + +/* +** Push a new element onto the priority queue +*/ +static RtreeSearchPoint *rtreeEnqueue( + RtreeCursor *pCur, /* The cursor */ + RtreeDValue rScore, /* Score for the new search point */ + u8 iLevel /* Level for the new search point */ +){ + int i, j; + RtreeSearchPoint *pNew; + if( pCur->nPoint>=pCur->nPointAlloc ){ + int nNew = pCur->nPointAlloc*2 + 8; + pNew = sqlite3_realloc64(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); + if( pNew==0 ) return 0; + pCur->aPoint = pNew; + pCur->nPointAlloc = nNew; + } + i = pCur->nPoint++; + pNew = pCur->aPoint + i; + pNew->rScore = rScore; + pNew->iLevel = iLevel; + assert( iLevel<=RTREE_MAX_DEPTH ); + while( i>0 ){ + RtreeSearchPoint *pParent; + j = (i-1)/2; + pParent = pCur->aPoint + j; + if( rtreeSearchPointCompare(pNew, pParent)>=0 ) break; + rtreeSearchPointSwap(pCur, j, i); + i = j; + pNew = pParent; + } + return pNew; +} + +/* +** Allocate a new RtreeSearchPoint and return a pointer to it. Return +** NULL if malloc fails. +*/ +static RtreeSearchPoint *rtreeSearchPointNew( + RtreeCursor *pCur, /* The cursor */ + RtreeDValue rScore, /* Score for the new search point */ + u8 iLevel /* Level for the new search point */ +){ + RtreeSearchPoint *pNew, *pFirst; + pFirst = rtreeSearchPointFirst(pCur); + pCur->anQueue[iLevel]++; + if( pFirst==0 + || pFirst->rScore>rScore + || (pFirst->rScore==rScore && pFirst->iLevel>iLevel) + ){ + if( pCur->bPoint ){ + int ii; + pNew = rtreeEnqueue(pCur, rScore, iLevel); + if( pNew==0 ) return 0; + ii = (int)(pNew - pCur->aPoint) + 1; + if( iiaNode[ii]==0 ); + pCur->aNode[ii] = pCur->aNode[0]; + }else{ + nodeRelease(RTREE_OF_CURSOR(pCur), pCur->aNode[0]); + } + pCur->aNode[0] = 0; + *pNew = pCur->sPoint; + } + pCur->sPoint.rScore = rScore; + pCur->sPoint.iLevel = iLevel; + pCur->bPoint = 1; + return &pCur->sPoint; + }else{ + return rtreeEnqueue(pCur, rScore, iLevel); + } +} + +#if 0 +/* Tracing routines for the RtreeSearchPoint queue */ +static void tracePoint(RtreeSearchPoint *p, int idx, RtreeCursor *pCur){ + if( idx<0 ){ printf(" s"); }else{ printf("%2d", idx); } + printf(" %d.%05lld.%02d %g %d", + p->iLevel, p->id, p->iCell, p->rScore, p->eWithin + ); + idx++; + if( idxaNode[idx]); + }else{ + printf("\n"); + } +} +static void traceQueue(RtreeCursor *pCur, const char *zPrefix){ + int ii; + printf("=== %9s ", zPrefix); + if( pCur->bPoint ){ + tracePoint(&pCur->sPoint, -1, pCur); + } + for(ii=0; iinPoint; ii++){ + if( ii>0 || pCur->bPoint ) printf(" "); + tracePoint(&pCur->aPoint[ii], ii, pCur); + } +} +# define RTREE_QUEUE_TRACE(A,B) traceQueue(A,B) +#else +# define RTREE_QUEUE_TRACE(A,B) /* no-op */ +#endif + +/* Remove the search point with the lowest current score. +*/ +static void rtreeSearchPointPop(RtreeCursor *p){ + int i, j, k, n; + i = 1 - p->bPoint; + assert( i==0 || i==1 ); + if( p->aNode[i] ){ + nodeRelease(RTREE_OF_CURSOR(p), p->aNode[i]); + p->aNode[i] = 0; + } + if( p->bPoint ){ + p->anQueue[p->sPoint.iLevel]--; + p->bPoint = 0; + }else if( p->nPoint ){ + p->anQueue[p->aPoint[0].iLevel]--; + n = --p->nPoint; + p->aPoint[0] = p->aPoint[n]; + if( naNode[1] = p->aNode[n+1]; + p->aNode[n+1] = 0; + } + i = 0; + while( (j = i*2+1)aPoint[k], &p->aPoint[j])<0 ){ + if( rtreeSearchPointCompare(&p->aPoint[k], &p->aPoint[i])<0 ){ + rtreeSearchPointSwap(p, i, k); + i = k; + }else{ + break; + } + }else{ + if( rtreeSearchPointCompare(&p->aPoint[j], &p->aPoint[i])<0 ){ + rtreeSearchPointSwap(p, i, j); + i = j; + }else{ + break; + } + } + } + } +} + + +/* +** Continue the search on cursor pCur until the front of the queue +** contains an entry suitable for returning as a result-set row, +** or until the RtreeSearchPoint queue is empty, indicating that the +** query has completed. +*/ +static int rtreeStepToLeaf(RtreeCursor *pCur){ + RtreeSearchPoint *p; + Rtree *pRtree = RTREE_OF_CURSOR(pCur); + RtreeNode *pNode; + int eWithin; + int rc = SQLITE_OK; + int nCell; + int nConstraint = pCur->nConstraint; + int ii; + int eInt; + RtreeSearchPoint x; + + eInt = pRtree->eCoordType==RTREE_COORD_INT32; + while( (p = rtreeSearchPointFirst(pCur))!=0 && p->iLevel>0 ){ + u8 *pCellData; + pNode = rtreeNodeOfFirstSearchPoint(pCur, &rc); + if( rc ) return rc; + nCell = NCELL(pNode); + assert( nCell<200 ); + pCellData = pNode->zData + (4+pRtree->nBytesPerCell*p->iCell); + while( p->iCellaConstraint + ii; + if( pConstraint->op>=RTREE_MATCH ){ + rc = rtreeCallbackConstraint(pConstraint, eInt, pCellData, p, + &rScore, &eWithin); + if( rc ) return rc; + }else if( p->iLevel==1 ){ + rtreeLeafConstraint(pConstraint, eInt, pCellData, &eWithin); + }else{ + rtreeNonleafConstraint(pConstraint, eInt, pCellData, &eWithin); + } + if( eWithin==NOT_WITHIN ){ + p->iCell++; + pCellData += pRtree->nBytesPerCell; + break; + } + } + if( eWithin==NOT_WITHIN ) continue; + p->iCell++; + x.iLevel = p->iLevel - 1; + if( x.iLevel ){ + x.id = readInt64(pCellData); + for(ii=0; iinPoint; ii++){ + if( pCur->aPoint[ii].id==x.id ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + } + x.iCell = 0; + }else{ + x.id = p->id; + x.iCell = p->iCell - 1; + } + if( p->iCell>=nCell ){ + RTREE_QUEUE_TRACE(pCur, "POP-S:"); + rtreeSearchPointPop(pCur); + } + if( rScoreeWithin = (u8)eWithin; + p->id = x.id; + p->iCell = x.iCell; + RTREE_QUEUE_TRACE(pCur, "PUSH-S:"); + break; + } + if( p->iCell>=nCell ){ + RTREE_QUEUE_TRACE(pCur, "POP-Se:"); + rtreeSearchPointPop(pCur); + } + } + pCur->atEOF = p==0; + return SQLITE_OK; +} + +/* +** Rtree virtual table module xNext method. +*/ +static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){ + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + int rc = SQLITE_OK; + + /* Move to the next entry that matches the configured constraints. */ + RTREE_QUEUE_TRACE(pCsr, "POP-Nx:"); + if( pCsr->bAuxValid ){ + pCsr->bAuxValid = 0; + sqlite3_reset(pCsr->pReadAux); + } + rtreeSearchPointPop(pCsr); + rc = rtreeStepToLeaf(pCsr); + return rc; +} + +/* +** Rtree virtual table module xRowid method. +*/ +static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){ + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr); + int rc = SQLITE_OK; + RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); + if( rc==SQLITE_OK && p ){ + *pRowid = nodeGetRowid(RTREE_OF_CURSOR(pCsr), pNode, p->iCell); + } + return rc; +} + +/* +** Rtree virtual table module xColumn method. +*/ +static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ + Rtree *pRtree = (Rtree *)cur->pVtab; + RtreeCursor *pCsr = (RtreeCursor *)cur; + RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr); + RtreeCoord c; + int rc = SQLITE_OK; + RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); + + if( rc ) return rc; + if( p==0 ) return SQLITE_OK; + if( i==0 ){ + sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell)); + }else if( i<=pRtree->nDim2 ){ + nodeGetCoord(pRtree, pNode, p->iCell, i-1, &c); +#ifndef SQLITE_RTREE_INT_ONLY + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + sqlite3_result_double(ctx, c.f); + }else +#endif + { + assert( pRtree->eCoordType==RTREE_COORD_INT32 ); + sqlite3_result_int(ctx, c.i); + } + }else{ + if( !pCsr->bAuxValid ){ + if( pCsr->pReadAux==0 ){ + rc = sqlite3_prepare_v3(pRtree->db, pRtree->zReadAuxSql, -1, 0, + &pCsr->pReadAux, 0); + if( rc ) return rc; + } + sqlite3_bind_int64(pCsr->pReadAux, 1, + nodeGetRowid(pRtree, pNode, p->iCell)); + rc = sqlite3_step(pCsr->pReadAux); + if( rc==SQLITE_ROW ){ + pCsr->bAuxValid = 1; + }else{ + sqlite3_reset(pCsr->pReadAux); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + return rc; + } + } + sqlite3_result_value(ctx, + sqlite3_column_value(pCsr->pReadAux, i - pRtree->nDim2 + 1)); + } + return SQLITE_OK; +} + +/* +** Use nodeAcquire() to obtain the leaf node containing the record with +** rowid iRowid. If successful, set *ppLeaf to point to the node and +** return SQLITE_OK. If there is no such record in the table, set +** *ppLeaf to 0 and return SQLITE_OK. If an error occurs, set *ppLeaf +** to zero and return an SQLite error code. +*/ +static int findLeafNode( + Rtree *pRtree, /* RTree to search */ + i64 iRowid, /* The rowid searching for */ + RtreeNode **ppLeaf, /* Write the node here */ + sqlite3_int64 *piNode /* Write the node-id here */ +){ + int rc; + *ppLeaf = 0; + sqlite3_bind_int64(pRtree->pReadRowid, 1, iRowid); + if( sqlite3_step(pRtree->pReadRowid)==SQLITE_ROW ){ + i64 iNode = sqlite3_column_int64(pRtree->pReadRowid, 0); + if( piNode ) *piNode = iNode; + rc = nodeAcquire(pRtree, iNode, 0, ppLeaf); + sqlite3_reset(pRtree->pReadRowid); + }else{ + rc = sqlite3_reset(pRtree->pReadRowid); + } + return rc; +} + +/* +** This function is called to configure the RtreeConstraint object passed +** as the second argument for a MATCH constraint. The value passed as the +** first argument to this function is the right-hand operand to the MATCH +** operator. +*/ +static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){ + RtreeMatchArg *pBlob, *pSrc; /* BLOB returned by geometry function */ + sqlite3_rtree_query_info *pInfo; /* Callback information */ + + pSrc = sqlite3_value_pointer(pValue, "RtreeMatchArg"); + if( pSrc==0 ) return SQLITE_ERROR; + pInfo = (sqlite3_rtree_query_info*) + sqlite3_malloc64( sizeof(*pInfo)+pSrc->iSize ); + if( !pInfo ) return SQLITE_NOMEM; + memset(pInfo, 0, sizeof(*pInfo)); + pBlob = (RtreeMatchArg*)&pInfo[1]; + memcpy(pBlob, pSrc, pSrc->iSize); + pInfo->pContext = pBlob->cb.pContext; + pInfo->nParam = pBlob->nParam; + pInfo->aParam = pBlob->aParam; + pInfo->apSqlParam = pBlob->apSqlParam; + + if( pBlob->cb.xGeom ){ + pCons->u.xGeom = pBlob->cb.xGeom; + }else{ + pCons->op = RTREE_QUERY; + pCons->u.xQueryFunc = pBlob->cb.xQueryFunc; + } + pCons->pInfo = pInfo; + return SQLITE_OK; +} + +/* +** Rtree virtual table module xFilter method. +*/ +static int rtreeFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + Rtree *pRtree = (Rtree *)pVtabCursor->pVtab; + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + RtreeNode *pRoot = 0; + int ii; + int rc = SQLITE_OK; + int iCell = 0; + + rtreeReference(pRtree); + + /* Reset the cursor to the same state as rtreeOpen() leaves it in. */ + resetCursor(pCsr); + + pCsr->iStrategy = idxNum; + if( idxNum==1 ){ + /* Special case - lookup by rowid. */ + RtreeNode *pLeaf; /* Leaf on which the required cell resides */ + RtreeSearchPoint *p; /* Search point for the leaf */ + i64 iRowid = sqlite3_value_int64(argv[0]); + i64 iNode = 0; + int eType = sqlite3_value_numeric_type(argv[0]); + if( eType==SQLITE_INTEGER + || (eType==SQLITE_FLOAT && sqlite3_value_double(argv[0])==iRowid) + ){ + rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode); + }else{ + rc = SQLITE_OK; + pLeaf = 0; + } + if( rc==SQLITE_OK && pLeaf!=0 ){ + p = rtreeSearchPointNew(pCsr, RTREE_ZERO, 0); + assert( p!=0 ); /* Always returns pCsr->sPoint */ + pCsr->aNode[0] = pLeaf; + p->id = iNode; + p->eWithin = PARTLY_WITHIN; + rc = nodeRowidIndex(pRtree, pLeaf, iRowid, &iCell); + p->iCell = (u8)iCell; + RTREE_QUEUE_TRACE(pCsr, "PUSH-F1:"); + }else{ + pCsr->atEOF = 1; + } + }else{ + /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array + ** with the configured constraints. + */ + rc = nodeAcquire(pRtree, 1, 0, &pRoot); + if( rc==SQLITE_OK && argc>0 ){ + pCsr->aConstraint = sqlite3_malloc64(sizeof(RtreeConstraint)*argc); + pCsr->nConstraint = argc; + if( !pCsr->aConstraint ){ + rc = SQLITE_NOMEM; + }else{ + memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*argc); + memset(pCsr->anQueue, 0, sizeof(u32)*(pRtree->iDepth + 1)); + assert( (idxStr==0 && argc==0) + || (idxStr && (int)strlen(idxStr)==argc*2) ); + for(ii=0; iiaConstraint[ii]; + int eType = sqlite3_value_numeric_type(argv[ii]); + p->op = idxStr[ii*2]; + p->iCoord = idxStr[ii*2+1]-'0'; + if( p->op>=RTREE_MATCH ){ + /* A MATCH operator. The right-hand-side must be a blob that + ** can be cast into an RtreeMatchArg object. One created using + ** an sqlite3_rtree_geometry_callback() SQL user function. + */ + rc = deserializeGeometry(argv[ii], p); + if( rc!=SQLITE_OK ){ + break; + } + p->pInfo->nCoord = pRtree->nDim2; + p->pInfo->anQueue = pCsr->anQueue; + p->pInfo->mxLevel = pRtree->iDepth + 1; + }else if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ +#ifdef SQLITE_RTREE_INT_ONLY + p->u.rValue = sqlite3_value_int64(argv[ii]); +#else + p->u.rValue = sqlite3_value_double(argv[ii]); +#endif + }else{ + p->u.rValue = RTREE_ZERO; + if( eType==SQLITE_NULL ){ + p->op = RTREE_FALSE; + }else if( p->op==RTREE_LT || p->op==RTREE_LE ){ + p->op = RTREE_TRUE; + }else{ + p->op = RTREE_FALSE; + } + } + } + } + } + if( rc==SQLITE_OK ){ + RtreeSearchPoint *pNew; + pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, (u8)(pRtree->iDepth+1)); + if( pNew==0 ) return SQLITE_NOMEM; + pNew->id = 1; + pNew->iCell = 0; + pNew->eWithin = PARTLY_WITHIN; + assert( pCsr->bPoint==1 ); + pCsr->aNode[0] = pRoot; + pRoot = 0; + RTREE_QUEUE_TRACE(pCsr, "PUSH-Fm:"); + rc = rtreeStepToLeaf(pCsr); + } + } + + nodeRelease(pRtree, pRoot); + rtreeRelease(pRtree); + return rc; +} + +/* +** Rtree virtual table module xBestIndex method. There are three +** table scan strategies to choose from (in order from most to +** least desirable): +** +** idxNum idxStr Strategy +** ------------------------------------------------ +** 1 Unused Direct lookup by rowid. +** 2 See below R-tree query or full-table scan. +** ------------------------------------------------ +** +** If strategy 1 is used, then idxStr is not meaningful. If strategy +** 2 is used, idxStr is formatted to contain 2 bytes for each +** constraint used. The first two bytes of idxStr correspond to +** the constraint in sqlite3_index_info.aConstraintUsage[] with +** (argvIndex==1) etc. +** +** The first of each pair of bytes in idxStr identifies the constraint +** operator as follows: +** +** Operator Byte Value +** ---------------------- +** = 0x41 ('A') +** <= 0x42 ('B') +** < 0x43 ('C') +** >= 0x44 ('D') +** > 0x45 ('E') +** MATCH 0x46 ('F') +** ---------------------- +** +** The second of each pair of bytes identifies the coordinate column +** to which the constraint applies. The leftmost coordinate column +** is 'a', the second from the left 'b' etc. +*/ +static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + Rtree *pRtree = (Rtree*)tab; + int rc = SQLITE_OK; + int ii; + int bMatch = 0; /* True if there exists a MATCH constraint */ + i64 nRow; /* Estimated rows returned by this scan */ + + int iIdx = 0; + char zIdxStr[RTREE_MAX_DIMENSIONS*8+1]; + memset(zIdxStr, 0, sizeof(zIdxStr)); + + /* Check if there exists a MATCH constraint - even an unusable one. If there + ** is, do not consider the lookup-by-rowid plan as using such a plan would + ** require the VDBE to evaluate the MATCH constraint, which is not currently + ** possible. */ + for(ii=0; iinConstraint; ii++){ + if( pIdxInfo->aConstraint[ii].op==SQLITE_INDEX_CONSTRAINT_MATCH ){ + bMatch = 1; + } + } + + assert( pIdxInfo->idxStr==0 ); + for(ii=0; iinConstraint && iIdx<(int)(sizeof(zIdxStr)-1); ii++){ + struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii]; + + if( bMatch==0 && p->usable + && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ + ){ + /* We have an equality constraint on the rowid. Use strategy 1. */ + int jj; + for(jj=0; jjaConstraintUsage[jj].argvIndex = 0; + pIdxInfo->aConstraintUsage[jj].omit = 0; + } + pIdxInfo->idxNum = 1; + pIdxInfo->aConstraintUsage[ii].argvIndex = 1; + pIdxInfo->aConstraintUsage[jj].omit = 1; + + /* This strategy involves a two rowid lookups on an B-Tree structures + ** and then a linear search of an R-Tree node. This should be + ** considered almost as quick as a direct rowid lookup (for which + ** sqlite uses an internal cost of 0.0). It is expected to return + ** a single row. + */ + pIdxInfo->estimatedCost = 30.0; + pIdxInfo->estimatedRows = 1; + pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE; + return SQLITE_OK; + } + + if( p->usable + && ((p->iColumn>0 && p->iColumn<=pRtree->nDim2) + || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) + ){ + u8 op; + switch( p->op ){ + case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; + case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; + case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; + case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; + case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; + case SQLITE_INDEX_CONSTRAINT_MATCH: op = RTREE_MATCH; break; + default: op = 0; break; + } + if( op ){ + zIdxStr[iIdx++] = op; + zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); + pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); + pIdxInfo->aConstraintUsage[ii].omit = 1; + } + } + } + + pIdxInfo->idxNum = 2; + pIdxInfo->needToFreeIdxStr = 1; + if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){ + return SQLITE_NOMEM; + } + + nRow = pRtree->nRowEst >> (iIdx/2); + pIdxInfo->estimatedCost = (double)6.0 * (double)nRow; + pIdxInfo->estimatedRows = nRow; + + return rc; +} + +/* +** Return the N-dimensional volumn of the cell stored in *p. +*/ +static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ + RtreeDValue area = (RtreeDValue)1; + assert( pRtree->nDim>=1 && pRtree->nDim<=5 ); +#ifndef SQLITE_RTREE_INT_ONLY + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + switch( pRtree->nDim ){ + case 5: area = p->aCoord[9].f - p->aCoord[8].f; + case 4: area *= p->aCoord[7].f - p->aCoord[6].f; + case 3: area *= p->aCoord[5].f - p->aCoord[4].f; + case 2: area *= p->aCoord[3].f - p->aCoord[2].f; + default: area *= p->aCoord[1].f - p->aCoord[0].f; + } + }else +#endif + { + switch( pRtree->nDim ){ + case 5: area = (i64)p->aCoord[9].i - (i64)p->aCoord[8].i; + case 4: area *= (i64)p->aCoord[7].i - (i64)p->aCoord[6].i; + case 3: area *= (i64)p->aCoord[5].i - (i64)p->aCoord[4].i; + case 2: area *= (i64)p->aCoord[3].i - (i64)p->aCoord[2].i; + default: area *= (i64)p->aCoord[1].i - (i64)p->aCoord[0].i; + } + } + return area; +} + +/* +** Return the margin length of cell p. The margin length is the sum +** of the objects size in each dimension. +*/ +static RtreeDValue cellMargin(Rtree *pRtree, RtreeCell *p){ + RtreeDValue margin = 0; + int ii = pRtree->nDim2 - 2; + do{ + margin += (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii])); + ii -= 2; + }while( ii>=0 ); + return margin; +} + +/* +** Store the union of cells p1 and p2 in p1. +*/ +static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ + int ii = 0; + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + do{ + p1->aCoord[ii].f = MIN(p1->aCoord[ii].f, p2->aCoord[ii].f); + p1->aCoord[ii+1].f = MAX(p1->aCoord[ii+1].f, p2->aCoord[ii+1].f); + ii += 2; + }while( iinDim2 ); + }else{ + do{ + p1->aCoord[ii].i = MIN(p1->aCoord[ii].i, p2->aCoord[ii].i); + p1->aCoord[ii+1].i = MAX(p1->aCoord[ii+1].i, p2->aCoord[ii+1].i); + ii += 2; + }while( iinDim2 ); + } +} + +/* +** Return true if the area covered by p2 is a subset of the area covered +** by p1. False otherwise. +*/ +static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ + int ii; + int isInt = (pRtree->eCoordType==RTREE_COORD_INT32); + for(ii=0; iinDim2; ii+=2){ + RtreeCoord *a1 = &p1->aCoord[ii]; + RtreeCoord *a2 = &p2->aCoord[ii]; + if( (!isInt && (a2[0].fa1[1].f)) + || ( isInt && (a2[0].ia1[1].i)) + ){ + return 0; + } + } + return 1; +} + +/* +** Return the amount cell p would grow by if it were unioned with pCell. +*/ +static RtreeDValue cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *pCell){ + RtreeDValue area; + RtreeCell cell; + memcpy(&cell, p, sizeof(RtreeCell)); + area = cellArea(pRtree, &cell); + cellUnion(pRtree, &cell, pCell); + return (cellArea(pRtree, &cell)-area); +} + +static RtreeDValue cellOverlap( + Rtree *pRtree, + RtreeCell *p, + RtreeCell *aCell, + int nCell +){ + int ii; + RtreeDValue overlap = RTREE_ZERO; + for(ii=0; iinDim2; jj+=2){ + RtreeDValue x1, x2; + x1 = MAX(DCOORD(p->aCoord[jj]), DCOORD(aCell[ii].aCoord[jj])); + x2 = MIN(DCOORD(p->aCoord[jj+1]), DCOORD(aCell[ii].aCoord[jj+1])); + if( x2iDepth-iHeight); ii++){ + int iCell; + sqlite3_int64 iBest = 0; + + RtreeDValue fMinGrowth = RTREE_ZERO; + RtreeDValue fMinArea = RTREE_ZERO; + + int nCell = NCELL(pNode); + RtreeCell cell; + RtreeNode *pChild; + + RtreeCell *aCell = 0; + + /* Select the child node which will be enlarged the least if pCell + ** is inserted into it. Resolve ties by choosing the entry with + ** the smallest area. + */ + for(iCell=0; iCellpParent ){ + RtreeNode *pParent = p->pParent; + RtreeCell cell; + int iCell; + + if( (++cnt)>1000 || nodeParentIndex(pRtree, p, &iCell) ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + + nodeGetCell(pRtree, pParent, iCell, &cell); + if( !cellContains(pRtree, &cell, pCell) ){ + cellUnion(pRtree, &cell, pCell); + nodeOverwriteCell(pRtree, pParent, &cell, iCell); + } + + p = pParent; + } + return SQLITE_OK; +} + +/* +** Write mapping (iRowid->iNode) to the _rowid table. +*/ +static int rowidWrite(Rtree *pRtree, sqlite3_int64 iRowid, sqlite3_int64 iNode){ + sqlite3_bind_int64(pRtree->pWriteRowid, 1, iRowid); + sqlite3_bind_int64(pRtree->pWriteRowid, 2, iNode); + sqlite3_step(pRtree->pWriteRowid); + return sqlite3_reset(pRtree->pWriteRowid); +} + +/* +** Write mapping (iNode->iPar) to the _parent table. +*/ +static int parentWrite(Rtree *pRtree, sqlite3_int64 iNode, sqlite3_int64 iPar){ + sqlite3_bind_int64(pRtree->pWriteParent, 1, iNode); + sqlite3_bind_int64(pRtree->pWriteParent, 2, iPar); + sqlite3_step(pRtree->pWriteParent); + return sqlite3_reset(pRtree->pWriteParent); +} + +static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int); + + +/* +** Arguments aIdx, aDistance and aSpare all point to arrays of size +** nIdx. The aIdx array contains the set of integers from 0 to +** (nIdx-1) in no particular order. This function sorts the values +** in aIdx according to the indexed values in aDistance. For +** example, assuming the inputs: +** +** aIdx = { 0, 1, 2, 3 } +** aDistance = { 5.0, 2.0, 7.0, 6.0 } +** +** this function sets the aIdx array to contain: +** +** aIdx = { 0, 1, 2, 3 } +** +** The aSpare array is used as temporary working space by the +** sorting algorithm. +*/ +static void SortByDistance( + int *aIdx, + int nIdx, + RtreeDValue *aDistance, + int *aSpare +){ + if( nIdx>1 ){ + int iLeft = 0; + int iRight = 0; + + int nLeft = nIdx/2; + int nRight = nIdx-nLeft; + int *aLeft = aIdx; + int *aRight = &aIdx[nLeft]; + + SortByDistance(aLeft, nLeft, aDistance, aSpare); + SortByDistance(aRight, nRight, aDistance, aSpare); + + memcpy(aSpare, aLeft, sizeof(int)*nLeft); + aLeft = aSpare; + + while( iLeft1 ){ + + int iLeft = 0; + int iRight = 0; + + int nLeft = nIdx/2; + int nRight = nIdx-nLeft; + int *aLeft = aIdx; + int *aRight = &aIdx[nLeft]; + + SortByDimension(pRtree, aLeft, nLeft, iDim, aCell, aSpare); + SortByDimension(pRtree, aRight, nRight, iDim, aCell, aSpare); + + memcpy(aSpare, aLeft, sizeof(int)*nLeft); + aLeft = aSpare; + while( iLeftnDim+1)*(sizeof(int*)+nCell*sizeof(int)); + + aaSorted = (int **)sqlite3_malloc64(nByte); + if( !aaSorted ){ + return SQLITE_NOMEM; + } + + aSpare = &((int *)&aaSorted[pRtree->nDim])[pRtree->nDim*nCell]; + memset(aaSorted, 0, nByte); + for(ii=0; iinDim; ii++){ + int jj; + aaSorted[ii] = &((int *)&aaSorted[pRtree->nDim])[ii*nCell]; + for(jj=0; jjnDim; ii++){ + RtreeDValue margin = RTREE_ZERO; + RtreeDValue fBestOverlap = RTREE_ZERO; + RtreeDValue fBestArea = RTREE_ZERO; + int iBestLeft = 0; + int nLeft; + + for( + nLeft=RTREE_MINCELLS(pRtree); + nLeft<=(nCell-RTREE_MINCELLS(pRtree)); + nLeft++ + ){ + RtreeCell left; + RtreeCell right; + int kk; + RtreeDValue overlap; + RtreeDValue area; + + memcpy(&left, &aCell[aaSorted[ii][0]], sizeof(RtreeCell)); + memcpy(&right, &aCell[aaSorted[ii][nCell-1]], sizeof(RtreeCell)); + for(kk=1; kk<(nCell-1); kk++){ + if( kk0 ){ + RtreeNode *pChild = nodeHashLookup(pRtree, iRowid); + if( pChild ){ + nodeRelease(pRtree, pChild->pParent); + nodeReference(pNode); + pChild->pParent = pNode; + } + } + return xSetMapping(pRtree, iRowid, pNode->iNode); +} + +static int SplitNode( + Rtree *pRtree, + RtreeNode *pNode, + RtreeCell *pCell, + int iHeight +){ + int i; + int newCellIsRight = 0; + + int rc = SQLITE_OK; + int nCell = NCELL(pNode); + RtreeCell *aCell; + int *aiUsed; + + RtreeNode *pLeft = 0; + RtreeNode *pRight = 0; + + RtreeCell leftbbox; + RtreeCell rightbbox; + + /* Allocate an array and populate it with a copy of pCell and + ** all cells from node pLeft. Then zero the original node. + */ + aCell = sqlite3_malloc64((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); + if( !aCell ){ + rc = SQLITE_NOMEM; + goto splitnode_out; + } + aiUsed = (int *)&aCell[nCell+1]; + memset(aiUsed, 0, sizeof(int)*(nCell+1)); + for(i=0; iiNode==1 ){ + pRight = nodeNew(pRtree, pNode); + pLeft = nodeNew(pRtree, pNode); + pRtree->iDepth++; + pNode->isDirty = 1; + writeInt16(pNode->zData, pRtree->iDepth); + }else{ + pLeft = pNode; + pRight = nodeNew(pRtree, pLeft->pParent); + pLeft->nRef++; + } + + if( !pLeft || !pRight ){ + rc = SQLITE_NOMEM; + goto splitnode_out; + } + + memset(pLeft->zData, 0, pRtree->iNodeSize); + memset(pRight->zData, 0, pRtree->iNodeSize); + + rc = splitNodeStartree(pRtree, aCell, nCell, pLeft, pRight, + &leftbbox, &rightbbox); + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + + /* Ensure both child nodes have node numbers assigned to them by calling + ** nodeWrite(). Node pRight always needs a node number, as it was created + ** by nodeNew() above. But node pLeft sometimes already has a node number. + ** In this case avoid the all to nodeWrite(). + */ + if( SQLITE_OK!=(rc = nodeWrite(pRtree, pRight)) + || (0==pLeft->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pLeft))) + ){ + goto splitnode_out; + } + + rightbbox.iRowid = pRight->iNode; + leftbbox.iRowid = pLeft->iNode; + + if( pNode->iNode==1 ){ + rc = rtreeInsertCell(pRtree, pLeft->pParent, &leftbbox, iHeight+1); + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + }else{ + RtreeNode *pParent = pLeft->pParent; + int iCell; + rc = nodeParentIndex(pRtree, pLeft, &iCell); + if( rc==SQLITE_OK ){ + nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell); + rc = AdjustTree(pRtree, pParent, &leftbbox); + } + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + } + if( (rc = rtreeInsertCell(pRtree, pRight->pParent, &rightbbox, iHeight+1)) ){ + goto splitnode_out; + } + + for(i=0; iiRowid ){ + newCellIsRight = 1; + } + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + } + if( pNode->iNode==1 ){ + for(i=0; iiRowid, pLeft, iHeight); + } + + if( rc==SQLITE_OK ){ + rc = nodeRelease(pRtree, pRight); + pRight = 0; + } + if( rc==SQLITE_OK ){ + rc = nodeRelease(pRtree, pLeft); + pLeft = 0; + } + +splitnode_out: + nodeRelease(pRtree, pRight); + nodeRelease(pRtree, pLeft); + sqlite3_free(aCell); + return rc; +} + +/* +** If node pLeaf is not the root of the r-tree and its pParent pointer is +** still NULL, load all ancestor nodes of pLeaf into memory and populate +** the pLeaf->pParent chain all the way up to the root node. +** +** This operation is required when a row is deleted (or updated - an update +** is implemented as a delete followed by an insert). SQLite provides the +** rowid of the row to delete, which can be used to find the leaf on which +** the entry resides (argument pLeaf). Once the leaf is located, this +** function is called to determine its ancestry. +*/ +static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ + int rc = SQLITE_OK; + RtreeNode *pChild = pLeaf; + while( rc==SQLITE_OK && pChild->iNode!=1 && pChild->pParent==0 ){ + int rc2 = SQLITE_OK; /* sqlite3_reset() return code */ + sqlite3_bind_int64(pRtree->pReadParent, 1, pChild->iNode); + rc = sqlite3_step(pRtree->pReadParent); + if( rc==SQLITE_ROW ){ + RtreeNode *pTest; /* Used to test for reference loops */ + i64 iNode; /* Node number of parent node */ + + /* Before setting pChild->pParent, test that we are not creating a + ** loop of references (as we would if, say, pChild==pParent). We don't + ** want to do this as it leads to a memory leak when trying to delete + ** the referenced counted node structures. + */ + iNode = sqlite3_column_int64(pRtree->pReadParent, 0); + for(pTest=pLeaf; pTest && pTest->iNode!=iNode; pTest=pTest->pParent); + if( !pTest ){ + rc2 = nodeAcquire(pRtree, iNode, 0, &pChild->pParent); + } + } + rc = sqlite3_reset(pRtree->pReadParent); + if( rc==SQLITE_OK ) rc = rc2; + if( rc==SQLITE_OK && !pChild->pParent ){ + RTREE_IS_CORRUPT(pRtree); + rc = SQLITE_CORRUPT_VTAB; + } + pChild = pChild->pParent; + } + return rc; +} + +static int deleteCell(Rtree *, RtreeNode *, int, int); + +static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ + int rc; + int rc2; + RtreeNode *pParent = 0; + int iCell; + + assert( pNode->nRef==1 ); + + /* Remove the entry in the parent cell. */ + rc = nodeParentIndex(pRtree, pNode, &iCell); + if( rc==SQLITE_OK ){ + pParent = pNode->pParent; + pNode->pParent = 0; + rc = deleteCell(pRtree, pParent, iCell, iHeight+1); + } + rc2 = nodeRelease(pRtree, pParent); + if( rc==SQLITE_OK ){ + rc = rc2; + } + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Remove the xxx_node entry. */ + sqlite3_bind_int64(pRtree->pDeleteNode, 1, pNode->iNode); + sqlite3_step(pRtree->pDeleteNode); + if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteNode)) ){ + return rc; + } + + /* Remove the xxx_parent entry. */ + sqlite3_bind_int64(pRtree->pDeleteParent, 1, pNode->iNode); + sqlite3_step(pRtree->pDeleteParent); + if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteParent)) ){ + return rc; + } + + /* Remove the node from the in-memory hash table and link it into + ** the Rtree.pDeleted list. Its contents will be re-inserted later on. + */ + nodeHashDelete(pRtree, pNode); + pNode->iNode = iHeight; + pNode->pNext = pRtree->pDeleted; + pNode->nRef++; + pRtree->pDeleted = pNode; + + return SQLITE_OK; +} + +static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){ + RtreeNode *pParent = pNode->pParent; + int rc = SQLITE_OK; + if( pParent ){ + int ii; + int nCell = NCELL(pNode); + RtreeCell box; /* Bounding box for pNode */ + nodeGetCell(pRtree, pNode, 0, &box); + for(ii=1; iiiNode; + rc = nodeParentIndex(pRtree, pNode, &ii); + if( rc==SQLITE_OK ){ + nodeOverwriteCell(pRtree, pParent, &box, ii); + rc = fixBoundingBox(pRtree, pParent); + } + } + return rc; +} + +/* +** Delete the cell at index iCell of node pNode. After removing the +** cell, adjust the r-tree data structure if required. +*/ +static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){ + RtreeNode *pParent; + int rc; + + if( SQLITE_OK!=(rc = fixLeafParent(pRtree, pNode)) ){ + return rc; + } + + /* Remove the cell from the node. This call just moves bytes around + ** the in-memory node image, so it cannot fail. + */ + nodeDeleteCell(pRtree, pNode, iCell); + + /* If the node is not the tree root and now has less than the minimum + ** number of cells, remove it from the tree. Otherwise, update the + ** cell in the parent node so that it tightly contains the updated + ** node. + */ + pParent = pNode->pParent; + assert( pParent || pNode->iNode==1 ); + if( pParent ){ + if( NCELL(pNode)nDim; iDim++){ + aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2]); + aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2+1]); + } + } + for(iDim=0; iDimnDim; iDim++){ + aCenterCoord[iDim] = (aCenterCoord[iDim]/(nCell*(RtreeDValue)2)); + } + + for(ii=0; iinDim; iDim++){ + RtreeDValue coord = (DCOORD(aCell[ii].aCoord[iDim*2+1]) - + DCOORD(aCell[ii].aCoord[iDim*2])); + aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]); + } + } + + SortByDistance(aOrder, nCell, aDistance, aSpare); + nodeZero(pRtree, pNode); + + for(ii=0; rc==SQLITE_OK && ii<(nCell-(RTREE_MINCELLS(pRtree)+1)); ii++){ + RtreeCell *p = &aCell[aOrder[ii]]; + nodeInsertCell(pRtree, pNode, p); + if( p->iRowid==pCell->iRowid ){ + if( iHeight==0 ){ + rc = rowidWrite(pRtree, p->iRowid, pNode->iNode); + }else{ + rc = parentWrite(pRtree, p->iRowid, pNode->iNode); + } + } + } + if( rc==SQLITE_OK ){ + rc = fixBoundingBox(pRtree, pNode); + } + for(; rc==SQLITE_OK && iiiNode currently contains + ** the height of the sub-tree headed by the cell. + */ + RtreeNode *pInsert; + RtreeCell *p = &aCell[aOrder[ii]]; + rc = ChooseLeaf(pRtree, p, iHeight, &pInsert); + if( rc==SQLITE_OK ){ + int rc2; + rc = rtreeInsertCell(pRtree, pInsert, p, iHeight); + rc2 = nodeRelease(pRtree, pInsert); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + + sqlite3_free(aCell); + return rc; +} + +/* +** Insert cell pCell into node pNode. Node pNode is the head of a +** subtree iHeight high (leaf nodes have iHeight==0). +*/ +static int rtreeInsertCell( + Rtree *pRtree, + RtreeNode *pNode, + RtreeCell *pCell, + int iHeight +){ + int rc = SQLITE_OK; + if( iHeight>0 ){ + RtreeNode *pChild = nodeHashLookup(pRtree, pCell->iRowid); + if( pChild ){ + nodeRelease(pRtree, pChild->pParent); + nodeReference(pNode); + pChild->pParent = pNode; + } + } + if( nodeInsertCell(pRtree, pNode, pCell) ){ + if( iHeight<=pRtree->iReinsertHeight || pNode->iNode==1){ + rc = SplitNode(pRtree, pNode, pCell, iHeight); + }else{ + pRtree->iReinsertHeight = iHeight; + rc = Reinsert(pRtree, pNode, pCell, iHeight); + } + }else{ + rc = AdjustTree(pRtree, pNode, pCell); + if( rc==SQLITE_OK ){ + if( iHeight==0 ){ + rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode); + }else{ + rc = parentWrite(pRtree, pCell->iRowid, pNode->iNode); + } + } + } + return rc; +} + +static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){ + int ii; + int rc = SQLITE_OK; + int nCell = NCELL(pNode); + + for(ii=0; rc==SQLITE_OK && iiiNode currently contains + ** the height of the sub-tree headed by the cell. + */ + rc = ChooseLeaf(pRtree, &cell, (int)pNode->iNode, &pInsert); + if( rc==SQLITE_OK ){ + int rc2; + rc = rtreeInsertCell(pRtree, pInsert, &cell, (int)pNode->iNode); + rc2 = nodeRelease(pRtree, pInsert); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + return rc; +} + +/* +** Select a currently unused rowid for a new r-tree record. +*/ +static int rtreeNewRowid(Rtree *pRtree, i64 *piRowid){ + int rc; + sqlite3_bind_null(pRtree->pWriteRowid, 1); + sqlite3_bind_null(pRtree->pWriteRowid, 2); + sqlite3_step(pRtree->pWriteRowid); + rc = sqlite3_reset(pRtree->pWriteRowid); + *piRowid = sqlite3_last_insert_rowid(pRtree->db); + return rc; +} + +/* +** Remove the entry with rowid=iDelete from the r-tree structure. +*/ +static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ + int rc; /* Return code */ + RtreeNode *pLeaf = 0; /* Leaf node containing record iDelete */ + int iCell; /* Index of iDelete cell in pLeaf */ + RtreeNode *pRoot = 0; /* Root node of rtree structure */ + + + /* Obtain a reference to the root node to initialize Rtree.iDepth */ + rc = nodeAcquire(pRtree, 1, 0, &pRoot); + + /* Obtain a reference to the leaf node that contains the entry + ** about to be deleted. + */ + if( rc==SQLITE_OK ){ + rc = findLeafNode(pRtree, iDelete, &pLeaf, 0); + } + +#ifdef CORRUPT_DB + assert( pLeaf!=0 || rc!=SQLITE_OK || CORRUPT_DB ); +#endif + + /* Delete the cell in question from the leaf node. */ + if( rc==SQLITE_OK && pLeaf ){ + int rc2; + rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell); + if( rc==SQLITE_OK ){ + rc = deleteCell(pRtree, pLeaf, iCell, 0); + } + rc2 = nodeRelease(pRtree, pLeaf); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + + /* Delete the corresponding entry in the _rowid table. */ + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pRtree->pDeleteRowid, 1, iDelete); + sqlite3_step(pRtree->pDeleteRowid); + rc = sqlite3_reset(pRtree->pDeleteRowid); + } + + /* Check if the root node now has exactly one child. If so, remove + ** it, schedule the contents of the child for reinsertion and + ** reduce the tree height by one. + ** + ** This is equivalent to copying the contents of the child into + ** the root node (the operation that Gutman's paper says to perform + ** in this scenario). + */ + if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){ + int rc2; + RtreeNode *pChild = 0; + i64 iChild = nodeGetRowid(pRtree, pRoot, 0); + rc = nodeAcquire(pRtree, iChild, pRoot, &pChild); + if( rc==SQLITE_OK ){ + rc = removeNode(pRtree, pChild, pRtree->iDepth-1); + } + rc2 = nodeRelease(pRtree, pChild); + if( rc==SQLITE_OK ) rc = rc2; + if( rc==SQLITE_OK ){ + pRtree->iDepth--; + writeInt16(pRoot->zData, pRtree->iDepth); + pRoot->isDirty = 1; + } + } + + /* Re-insert the contents of any underfull nodes removed from the tree. */ + for(pLeaf=pRtree->pDeleted; pLeaf; pLeaf=pRtree->pDeleted){ + if( rc==SQLITE_OK ){ + rc = reinsertNodeContent(pRtree, pLeaf); + } + pRtree->pDeleted = pLeaf->pNext; + pRtree->nNodeRef--; + sqlite3_free(pLeaf); + } + + /* Release the reference to the root node. */ + if( rc==SQLITE_OK ){ + rc = nodeRelease(pRtree, pRoot); + }else{ + nodeRelease(pRtree, pRoot); + } + + return rc; +} + +/* +** Rounding constants for float->double conversion. +*/ +#define RNDTOWARDS (1.0 - 1.0/8388608.0) /* Round towards zero */ +#define RNDAWAY (1.0 + 1.0/8388608.0) /* Round away from zero */ + +#if !defined(SQLITE_RTREE_INT_ONLY) +/* +** Convert an sqlite3_value into an RtreeValue (presumably a float) +** while taking care to round toward negative or positive, respectively. +*/ +static RtreeValue rtreeValueDown(sqlite3_value *v){ + double d = sqlite3_value_double(v); + float f = (float)d; + if( f>d ){ + f = (float)(d*(d<0 ? RNDAWAY : RNDTOWARDS)); + } + return f; +} +static RtreeValue rtreeValueUp(sqlite3_value *v){ + double d = sqlite3_value_double(v); + float f = (float)d; + if( fbase.zErrMsg) to an appropriate value and returns +** SQLITE_CONSTRAINT. +** +** Parameter iCol is the index of the leftmost column involved in the +** constraint failure. If it is 0, then the constraint that failed is +** the unique constraint on the id column. Otherwise, it is the rtree +** (c1<=c2) constraint on columns iCol and iCol+1 that has failed. +** +** If an OOM occurs, SQLITE_NOMEM is returned instead of SQLITE_CONSTRAINT. +*/ +static int rtreeConstraintError(Rtree *pRtree, int iCol){ + sqlite3_stmt *pStmt = 0; + char *zSql; + int rc; + + assert( iCol==0 || iCol%2 ); + zSql = sqlite3_mprintf("SELECT * FROM %Q.%Q", pRtree->zDb, pRtree->zName); + if( zSql ){ + rc = sqlite3_prepare_v2(pRtree->db, zSql, -1, &pStmt, 0); + }else{ + rc = SQLITE_NOMEM; + } + sqlite3_free(zSql); + + if( rc==SQLITE_OK ){ + if( iCol==0 ){ + const char *zCol = sqlite3_column_name(pStmt, 0); + pRtree->base.zErrMsg = sqlite3_mprintf( + "UNIQUE constraint failed: %s.%s", pRtree->zName, zCol + ); + }else{ + const char *zCol1 = sqlite3_column_name(pStmt, iCol); + const char *zCol2 = sqlite3_column_name(pStmt, iCol+1); + pRtree->base.zErrMsg = sqlite3_mprintf( + "rtree constraint failed: %s.(%s<=%s)", pRtree->zName, zCol1, zCol2 + ); + } + } + + sqlite3_finalize(pStmt); + return (rc==SQLITE_OK ? SQLITE_CONSTRAINT : rc); +} + + + +/* +** The xUpdate method for rtree module virtual tables. +*/ +static int rtreeUpdate( + sqlite3_vtab *pVtab, + int nData, + sqlite3_value **aData, + sqlite_int64 *pRowid +){ + Rtree *pRtree = (Rtree *)pVtab; + int rc = SQLITE_OK; + RtreeCell cell; /* New cell to insert if nData>1 */ + int bHaveRowid = 0; /* Set to 1 after new rowid is determined */ + + if( pRtree->nNodeRef ){ + /* Unable to write to the btree while another cursor is reading from it, + ** since the write might do a rebalance which would disrupt the read + ** cursor. */ + return SQLITE_LOCKED_VTAB; + } + rtreeReference(pRtree); + assert(nData>=1); + + cell.iRowid = 0; /* Used only to suppress a compiler warning */ + + /* Constraint handling. A write operation on an r-tree table may return + ** SQLITE_CONSTRAINT for two reasons: + ** + ** 1. A duplicate rowid value, or + ** 2. The supplied data violates the "x2>=x1" constraint. + ** + ** In the first case, if the conflict-handling mode is REPLACE, then + ** the conflicting row can be removed before proceeding. In the second + ** case, SQLITE_CONSTRAINT must be returned regardless of the + ** conflict-handling mode specified by the user. + */ + if( nData>1 ){ + int ii; + int nn = nData - 4; + + if( nn > pRtree->nDim2 ) nn = pRtree->nDim2; + /* Populate the cell.aCoord[] array. The first coordinate is aData[3]. + ** + ** NB: nData can only be less than nDim*2+3 if the rtree is mis-declared + ** with "column" that are interpreted as table constraints. + ** Example: CREATE VIRTUAL TABLE bad USING rtree(x,y,CHECK(y>5)); + ** This problem was discovered after years of use, so we silently ignore + ** these kinds of misdeclared tables to avoid breaking any legacy. + */ + +#ifndef SQLITE_RTREE_INT_ONLY + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + for(ii=0; iicell.aCoord[ii+1].f ){ + rc = rtreeConstraintError(pRtree, ii+1); + goto constraint; + } + } + }else +#endif + { + for(ii=0; iicell.aCoord[ii+1].i ){ + rc = rtreeConstraintError(pRtree, ii+1); + goto constraint; + } + } + } + + /* If a rowid value was supplied, check if it is already present in + ** the table. If so, the constraint has failed. */ + if( sqlite3_value_type(aData[2])!=SQLITE_NULL ){ + cell.iRowid = sqlite3_value_int64(aData[2]); + if( sqlite3_value_type(aData[0])==SQLITE_NULL + || sqlite3_value_int64(aData[0])!=cell.iRowid + ){ + int steprc; + sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid); + steprc = sqlite3_step(pRtree->pReadRowid); + rc = sqlite3_reset(pRtree->pReadRowid); + if( SQLITE_ROW==steprc ){ + if( sqlite3_vtab_on_conflict(pRtree->db)==SQLITE_REPLACE ){ + rc = rtreeDeleteRowid(pRtree, cell.iRowid); + }else{ + rc = rtreeConstraintError(pRtree, 0); + goto constraint; + } + } + } + bHaveRowid = 1; + } + } + + /* If aData[0] is not an SQL NULL value, it is the rowid of a + ** record to delete from the r-tree table. The following block does + ** just that. + */ + if( sqlite3_value_type(aData[0])!=SQLITE_NULL ){ + rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(aData[0])); + } + + /* If the aData[] array contains more than one element, elements + ** (aData[2]..aData[argc-1]) contain a new record to insert into + ** the r-tree structure. + */ + if( rc==SQLITE_OK && nData>1 ){ + /* Insert the new record into the r-tree */ + RtreeNode *pLeaf = 0; + + /* Figure out the rowid of the new row. */ + if( bHaveRowid==0 ){ + rc = rtreeNewRowid(pRtree, &cell.iRowid); + } + *pRowid = cell.iRowid; + + if( rc==SQLITE_OK ){ + rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf); + } + if( rc==SQLITE_OK ){ + int rc2; + pRtree->iReinsertHeight = -1; + rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0); + rc2 = nodeRelease(pRtree, pLeaf); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + if( rc==SQLITE_OK && pRtree->nAux ){ + sqlite3_stmt *pUp = pRtree->pWriteAux; + int jj; + sqlite3_bind_int64(pUp, 1, *pRowid); + for(jj=0; jjnAux; jj++){ + sqlite3_bind_value(pUp, jj+2, aData[pRtree->nDim2+3+jj]); + } + sqlite3_step(pUp); + rc = sqlite3_reset(pUp); + } + } + +constraint: + rtreeRelease(pRtree); + return rc; +} + +/* +** Called when a transaction starts. +*/ +static int rtreeBeginTransaction(sqlite3_vtab *pVtab){ + Rtree *pRtree = (Rtree *)pVtab; + assert( pRtree->inWrTrans==0 ); + pRtree->inWrTrans++; + return SQLITE_OK; +} + +/* +** Called when a transaction completes (either by COMMIT or ROLLBACK). +** The sqlite3_blob object should be released at this point. +*/ +static int rtreeEndTransaction(sqlite3_vtab *pVtab){ + Rtree *pRtree = (Rtree *)pVtab; + pRtree->inWrTrans = 0; + nodeBlobReset(pRtree); + return SQLITE_OK; +} + +/* +** The xRename method for rtree module virtual tables. +*/ +static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){ + Rtree *pRtree = (Rtree *)pVtab; + int rc = SQLITE_NOMEM; + char *zSql = sqlite3_mprintf( + "ALTER TABLE %Q.'%q_node' RENAME TO \"%w_node\";" + "ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";" + "ALTER TABLE %Q.'%q_rowid' RENAME TO \"%w_rowid\";" + , pRtree->zDb, pRtree->zName, zNewName + , pRtree->zDb, pRtree->zName, zNewName + , pRtree->zDb, pRtree->zName, zNewName + ); + if( zSql ){ + nodeBlobReset(pRtree); + rc = sqlite3_exec(pRtree->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + } + return rc; +} + +/* +** The xSavepoint method. +** +** This module does not need to do anything to support savepoints. However, +** it uses this hook to close any open blob handle. This is done because a +** DROP TABLE command - which fortunately always opens a savepoint - cannot +** succeed if there are any open blob handles. i.e. if the blob handle were +** not closed here, the following would fail: +** +** BEGIN; +** INSERT INTO rtree... +** DROP TABLE ; -- Would fail with SQLITE_LOCKED +** COMMIT; +*/ +static int rtreeSavepoint(sqlite3_vtab *pVtab, int iSavepoint){ + Rtree *pRtree = (Rtree *)pVtab; + u8 iwt = pRtree->inWrTrans; + UNUSED_PARAMETER(iSavepoint); + pRtree->inWrTrans = 0; + nodeBlobReset(pRtree); + pRtree->inWrTrans = iwt; + return SQLITE_OK; +} + +/* +** This function populates the pRtree->nRowEst variable with an estimate +** of the number of rows in the virtual table. If possible, this is based +** on sqlite_stat1 data. Otherwise, use RTREE_DEFAULT_ROWEST. +*/ +static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){ + const char *zFmt = "SELECT stat FROM %Q.sqlite_stat1 WHERE tbl = '%q_rowid'"; + char *zSql; + sqlite3_stmt *p; + int rc; + i64 nRow = 0; + + rc = sqlite3_table_column_metadata( + db, pRtree->zDb, "sqlite_stat1",0,0,0,0,0,0 + ); + if( rc!=SQLITE_OK ){ + pRtree->nRowEst = RTREE_DEFAULT_ROWEST; + return rc==SQLITE_ERROR ? SQLITE_OK : rc; + } + zSql = sqlite3_mprintf(zFmt, pRtree->zDb, pRtree->zName); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(db, zSql, -1, &p, 0); + if( rc==SQLITE_OK ){ + if( sqlite3_step(p)==SQLITE_ROW ) nRow = sqlite3_column_int64(p, 0); + rc = sqlite3_finalize(p); + }else if( rc!=SQLITE_NOMEM ){ + rc = SQLITE_OK; + } + + if( rc==SQLITE_OK ){ + if( nRow==0 ){ + pRtree->nRowEst = RTREE_DEFAULT_ROWEST; + }else{ + pRtree->nRowEst = MAX(nRow, RTREE_MIN_ROWEST); + } + } + sqlite3_free(zSql); + } + + return rc; +} + + +/* +** Return true if zName is the extension on one of the shadow tables used +** by this module. +*/ +static int rtreeShadowName(const char *zName){ + static const char *azName[] = { + "node", "parent", "rowid" + }; + unsigned int i; + for(i=0; idb = db; + + if( isCreate ){ + char *zCreate; + sqlite3_str *p = sqlite3_str_new(db); + int ii; + sqlite3_str_appendf(p, + "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY,nodeno", + zDb, zPrefix); + for(ii=0; iinAux; ii++){ + sqlite3_str_appendf(p,",a%d",ii); + } + sqlite3_str_appendf(p, + ");CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY,data);", + zDb, zPrefix); + sqlite3_str_appendf(p, + "CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY,parentnode);", + zDb, zPrefix); + sqlite3_str_appendf(p, + "INSERT INTO \"%w\".\"%w_node\"VALUES(1,zeroblob(%d))", + zDb, zPrefix, pRtree->iNodeSize); + zCreate = sqlite3_str_finish(p); + if( !zCreate ){ + return SQLITE_NOMEM; + } + rc = sqlite3_exec(db, zCreate, 0, 0, 0); + sqlite3_free(zCreate); + if( rc!=SQLITE_OK ){ + return rc; + } + } + + appStmt[0] = &pRtree->pWriteNode; + appStmt[1] = &pRtree->pDeleteNode; + appStmt[2] = &pRtree->pReadRowid; + appStmt[3] = &pRtree->pWriteRowid; + appStmt[4] = &pRtree->pDeleteRowid; + appStmt[5] = &pRtree->pReadParent; + appStmt[6] = &pRtree->pWriteParent; + appStmt[7] = &pRtree->pDeleteParent; + + rc = rtreeQueryStat1(db, pRtree); + for(i=0; inAux==0 ){ + zFormat = azSql[i]; + }else { + /* An UPSERT is very slightly slower than REPLACE, but it is needed + ** if there are auxiliary columns */ + zFormat = "INSERT INTO\"%w\".\"%w_rowid\"(rowid,nodeno)VALUES(?1,?2)" + "ON CONFLICT(rowid)DO UPDATE SET nodeno=excluded.nodeno"; + } + zSql = sqlite3_mprintf(zFormat, zDb, zPrefix); + if( zSql ){ + rc = sqlite3_prepare_v3(db, zSql, -1, f, appStmt[i], 0); + }else{ + rc = SQLITE_NOMEM; + } + sqlite3_free(zSql); + } + if( pRtree->nAux ){ + pRtree->zReadAuxSql = sqlite3_mprintf( + "SELECT * FROM \"%w\".\"%w_rowid\" WHERE rowid=?1", + zDb, zPrefix); + if( pRtree->zReadAuxSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3_str *p = sqlite3_str_new(db); + int ii; + char *zSql; + sqlite3_str_appendf(p, "UPDATE \"%w\".\"%w_rowid\"SET ", zDb, zPrefix); + for(ii=0; iinAux; ii++){ + if( ii ) sqlite3_str_append(p, ",", 1); + if( iinAuxNotNull ){ + sqlite3_str_appendf(p,"a%d=coalesce(?%d,a%d)",ii,ii+2,ii); + }else{ + sqlite3_str_appendf(p,"a%d=?%d",ii,ii+2); + } + } + sqlite3_str_appendf(p, " WHERE rowid=?1"); + zSql = sqlite3_str_finish(p); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v3(db, zSql, -1, f, &pRtree->pWriteAux, 0); + sqlite3_free(zSql); + } + } + } + + return rc; +} + +/* +** The second argument to this function contains the text of an SQL statement +** that returns a single integer value. The statement is compiled and executed +** using database connection db. If successful, the integer value returned +** is written to *piVal and SQLITE_OK returned. Otherwise, an SQLite error +** code is returned and the value of *piVal after returning is not defined. +*/ +static int getIntFromStmt(sqlite3 *db, const char *zSql, int *piVal){ + int rc = SQLITE_NOMEM; + if( zSql ){ + sqlite3_stmt *pStmt = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *piVal = sqlite3_column_int(pStmt, 0); + } + rc = sqlite3_finalize(pStmt); + } + } + return rc; +} + +/* +** This function is called from within the xConnect() or xCreate() method to +** determine the node-size used by the rtree table being created or connected +** to. If successful, pRtree->iNodeSize is populated and SQLITE_OK returned. +** Otherwise, an SQLite error code is returned. +** +** If this function is being called as part of an xConnect(), then the rtree +** table already exists. In this case the node-size is determined by inspecting +** the root node of the tree. +** +** Otherwise, for an xCreate(), use 64 bytes less than the database page-size. +** This ensures that each node is stored on a single database page. If the +** database page-size is so large that more than RTREE_MAXCELLS entries +** would fit in a single node, use a smaller node-size. +*/ +static int getNodeSize( + sqlite3 *db, /* Database handle */ + Rtree *pRtree, /* Rtree handle */ + int isCreate, /* True for xCreate, false for xConnect */ + char **pzErr /* OUT: Error message, if any */ +){ + int rc; + char *zSql; + if( isCreate ){ + int iPageSize = 0; + zSql = sqlite3_mprintf("PRAGMA %Q.page_size", pRtree->zDb); + rc = getIntFromStmt(db, zSql, &iPageSize); + if( rc==SQLITE_OK ){ + pRtree->iNodeSize = iPageSize-64; + if( (4+pRtree->nBytesPerCell*RTREE_MAXCELLS)iNodeSize ){ + pRtree->iNodeSize = 4+pRtree->nBytesPerCell*RTREE_MAXCELLS; + } + }else{ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + }else{ + zSql = sqlite3_mprintf( + "SELECT length(data) FROM '%q'.'%q_node' WHERE nodeno = 1", + pRtree->zDb, pRtree->zName + ); + rc = getIntFromStmt(db, zSql, &pRtree->iNodeSize); + if( rc!=SQLITE_OK ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + }else if( pRtree->iNodeSize<(512-64) ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + *pzErr = sqlite3_mprintf("undersize RTree blobs in \"%q_node\"", + pRtree->zName); + } + } + + sqlite3_free(zSql); + return rc; +} + +/* +** Return the length of a token +*/ +static int rtreeTokenLength(const char *z){ + int dummy = 0; + return sqlite3GetToken((const unsigned char*)z,&dummy); +} + +/* +** This function is the implementation of both the xConnect and xCreate +** methods of the r-tree virtual table. +** +** argv[0] -> module name +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> column names... +*/ +static int rtreeInit( + sqlite3 *db, /* Database connection */ + void *pAux, /* One of the RTREE_COORD_* constants */ + int argc, const char *const*argv, /* Parameters to CREATE TABLE statement */ + sqlite3_vtab **ppVtab, /* OUT: New virtual table */ + char **pzErr, /* OUT: Error message, if any */ + int isCreate /* True for xCreate, false for xConnect */ +){ + int rc = SQLITE_OK; + Rtree *pRtree; + int nDb; /* Length of string argv[1] */ + int nName; /* Length of string argv[2] */ + int eCoordType = (pAux ? RTREE_COORD_INT32 : RTREE_COORD_REAL32); + sqlite3_str *pSql; + char *zSql; + int ii = 4; + int iErr; + + const char *aErrMsg[] = { + 0, /* 0 */ + "Wrong number of columns for an rtree table", /* 1 */ + "Too few columns for an rtree table", /* 2 */ + "Too many columns for an rtree table", /* 3 */ + "Auxiliary rtree columns must be last" /* 4 */ + }; + + assert( RTREE_MAX_AUX_COLUMN<256 ); /* Aux columns counted by a u8 */ + if( argc<6 || argc>RTREE_MAX_AUX_COLUMN+3 ){ + *pzErr = sqlite3_mprintf("%s", aErrMsg[2 + (argc>=6)]); + return SQLITE_ERROR; + } + + sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + + /* Allocate the sqlite3_vtab structure */ + nDb = (int)strlen(argv[1]); + nName = (int)strlen(argv[2]); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); + if( !pRtree ){ + return SQLITE_NOMEM; + } + memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2); + pRtree->nBusy = 1; + pRtree->base.pModule = &rtreeModule; + pRtree->zDb = (char *)&pRtree[1]; + pRtree->zName = &pRtree->zDb[nDb+1]; + pRtree->eCoordType = (u8)eCoordType; + memcpy(pRtree->zDb, argv[1], nDb); + memcpy(pRtree->zName, argv[2], nName); + + + /* Create/Connect to the underlying relational database schema. If + ** that is successful, call sqlite3_declare_vtab() to configure + ** the r-tree table schema. + */ + pSql = sqlite3_str_new(db); + sqlite3_str_appendf(pSql, "CREATE TABLE x(%.*s INT", + rtreeTokenLength(argv[3]), argv[3]); + for(ii=4; iinAux++; + sqlite3_str_appendf(pSql, ",%.*s", rtreeTokenLength(zArg+1), zArg+1); + }else if( pRtree->nAux>0 ){ + break; + }else{ + static const char *azFormat[] = {",%.*s REAL", ",%.*s INT"}; + pRtree->nDim2++; + sqlite3_str_appendf(pSql, azFormat[eCoordType], + rtreeTokenLength(zArg), zArg); + } + } + sqlite3_str_appendf(pSql, ");"); + zSql = sqlite3_str_finish(pSql); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else if( iinDim = pRtree->nDim2/2; + if( pRtree->nDim<1 ){ + iErr = 2; + }else if( pRtree->nDim2>RTREE_MAX_DIMENSIONS*2 ){ + iErr = 3; + }else if( pRtree->nDim2 % 2 ){ + iErr = 1; + }else{ + iErr = 0; + } + if( iErr ){ + *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]); + goto rtreeInit_fail; + } + pRtree->nBytesPerCell = 8 + pRtree->nDim2*4; + + /* Figure out the node size to use. */ + rc = getNodeSize(db, pRtree, isCreate, pzErr); + if( rc ) goto rtreeInit_fail; + rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate); + if( rc ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + goto rtreeInit_fail; + } + + *ppVtab = (sqlite3_vtab *)pRtree; + return SQLITE_OK; + +rtreeInit_fail: + if( rc==SQLITE_OK ) rc = SQLITE_ERROR; + assert( *ppVtab==0 ); + assert( pRtree->nBusy==1 ); + rtreeRelease(pRtree); + return rc; +} + + +/* +** Implementation of a scalar function that decodes r-tree nodes to +** human readable strings. This can be used for debugging and analysis. +** +** The scalar function takes two arguments: (1) the number of dimensions +** to the rtree (between 1 and 5, inclusive) and (2) a blob of data containing +** an r-tree node. For a two-dimensional r-tree structure called "rt", to +** deserialize all nodes, a statement like: +** +** SELECT rtreenode(2, data) FROM rt_node; +** +** The human readable string takes the form of a Tcl list with one +** entry for each cell in the r-tree node. Each entry is itself a +** list, containing the 8-byte rowid/pageno followed by the +** *2 coordinates. +*/ +static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ + RtreeNode node; + Rtree tree; + int ii; + int nData; + int errCode; + sqlite3_str *pOut; + + UNUSED_PARAMETER(nArg); + memset(&node, 0, sizeof(RtreeNode)); + memset(&tree, 0, sizeof(Rtree)); + tree.nDim = (u8)sqlite3_value_int(apArg[0]); + if( tree.nDim<1 || tree.nDim>5 ) return; + tree.nDim2 = tree.nDim*2; + tree.nBytesPerCell = 8 + 8 * tree.nDim; + node.zData = (u8 *)sqlite3_value_blob(apArg[1]); + nData = sqlite3_value_bytes(apArg[1]); + if( nData<4 ) return; + if( nData0 ) sqlite3_str_append(pOut, " ", 1); + sqlite3_str_appendf(pOut, "{%lld", cell.iRowid); + for(jj=0; jjrc==SQLITE_OK ) pCheck->rc = rc; +} + +/* +** The second and subsequent arguments to this function are a format string +** and printf style arguments. This function formats the string and attempts +** to compile it as an SQL statement. +** +** If successful, a pointer to the new SQL statement is returned. Otherwise, +** NULL is returned and an error code left in RtreeCheck.rc. +*/ +static sqlite3_stmt *rtreeCheckPrepare( + RtreeCheck *pCheck, /* RtreeCheck object */ + const char *zFmt, ... /* Format string and trailing args */ +){ + va_list ap; + char *z; + sqlite3_stmt *pRet = 0; + + va_start(ap, zFmt); + z = sqlite3_vmprintf(zFmt, ap); + + if( pCheck->rc==SQLITE_OK ){ + if( z==0 ){ + pCheck->rc = SQLITE_NOMEM; + }else{ + pCheck->rc = sqlite3_prepare_v2(pCheck->db, z, -1, &pRet, 0); + } + } + + sqlite3_free(z); + va_end(ap); + return pRet; +} + +/* +** The second and subsequent arguments to this function are a printf() +** style format string and arguments. This function formats the string and +** appends it to the report being accumuated in pCheck. +*/ +static void rtreeCheckAppendMsg(RtreeCheck *pCheck, const char *zFmt, ...){ + va_list ap; + va_start(ap, zFmt); + if( pCheck->rc==SQLITE_OK && pCheck->nErrrc = SQLITE_NOMEM; + }else{ + pCheck->zReport = sqlite3_mprintf("%z%s%z", + pCheck->zReport, (pCheck->zReport ? "\n" : ""), z + ); + if( pCheck->zReport==0 ){ + pCheck->rc = SQLITE_NOMEM; + } + } + pCheck->nErr++; + } + va_end(ap); +} + +/* +** This function is a no-op if there is already an error code stored +** in the RtreeCheck object indicated by the first argument. NULL is +** returned in this case. +** +** Otherwise, the contents of rtree table node iNode are loaded from +** the database and copied into a buffer obtained from sqlite3_malloc(). +** If no error occurs, a pointer to the buffer is returned and (*pnNode) +** is set to the size of the buffer in bytes. +** +** Or, if an error does occur, NULL is returned and an error code left +** in the RtreeCheck object. The final value of *pnNode is undefined in +** this case. +*/ +static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ + u8 *pRet = 0; /* Return value */ + + if( pCheck->rc==SQLITE_OK && pCheck->pGetNode==0 ){ + pCheck->pGetNode = rtreeCheckPrepare(pCheck, + "SELECT data FROM %Q.'%q_node' WHERE nodeno=?", + pCheck->zDb, pCheck->zTab + ); + } + + if( pCheck->rc==SQLITE_OK ){ + sqlite3_bind_int64(pCheck->pGetNode, 1, iNode); + if( sqlite3_step(pCheck->pGetNode)==SQLITE_ROW ){ + int nNode = sqlite3_column_bytes(pCheck->pGetNode, 0); + const u8 *pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0); + pRet = sqlite3_malloc64(nNode); + if( pRet==0 ){ + pCheck->rc = SQLITE_NOMEM; + }else{ + memcpy(pRet, pNode, nNode); + *pnNode = nNode; + } + } + rtreeCheckReset(pCheck, pCheck->pGetNode); + if( pCheck->rc==SQLITE_OK && pRet==0 ){ + rtreeCheckAppendMsg(pCheck, "Node %lld missing from database", iNode); + } + } + + return pRet; +} + +/* +** This function is used to check that the %_parent (if bLeaf==0) or %_rowid +** (if bLeaf==1) table contains a specified entry. The schemas of the +** two tables are: +** +** CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) +** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER, ...) +** +** In both cases, this function checks that there exists an entry with +** IPK value iKey and the second column set to iVal. +** +*/ +static void rtreeCheckMapping( + RtreeCheck *pCheck, /* RtreeCheck object */ + int bLeaf, /* True for a leaf cell, false for interior */ + i64 iKey, /* Key for mapping */ + i64 iVal /* Expected value for mapping */ +){ + int rc; + sqlite3_stmt *pStmt; + const char *azSql[2] = { + "SELECT parentnode FROM %Q.'%q_parent' WHERE nodeno=?1", + "SELECT nodeno FROM %Q.'%q_rowid' WHERE rowid=?1" + }; + + assert( bLeaf==0 || bLeaf==1 ); + if( pCheck->aCheckMapping[bLeaf]==0 ){ + pCheck->aCheckMapping[bLeaf] = rtreeCheckPrepare(pCheck, + azSql[bLeaf], pCheck->zDb, pCheck->zTab + ); + } + if( pCheck->rc!=SQLITE_OK ) return; + + pStmt = pCheck->aCheckMapping[bLeaf]; + sqlite3_bind_int64(pStmt, 1, iKey); + rc = sqlite3_step(pStmt); + if( rc==SQLITE_DONE ){ + rtreeCheckAppendMsg(pCheck, "Mapping (%lld -> %lld) missing from %s table", + iKey, iVal, (bLeaf ? "%_rowid" : "%_parent") + ); + }else if( rc==SQLITE_ROW ){ + i64 ii = sqlite3_column_int64(pStmt, 0); + if( ii!=iVal ){ + rtreeCheckAppendMsg(pCheck, + "Found (%lld -> %lld) in %s table, expected (%lld -> %lld)", + iKey, ii, (bLeaf ? "%_rowid" : "%_parent"), iKey, iVal + ); + } + } + rtreeCheckReset(pCheck, pStmt); +} + +/* +** Argument pCell points to an array of coordinates stored on an rtree page. +** This function checks that the coordinates are internally consistent (no +** x1>x2 conditions) and adds an error message to the RtreeCheck object +** if they are not. +** +** Additionally, if pParent is not NULL, then it is assumed to point to +** the array of coordinates on the parent page that bound the page +** containing pCell. In this case it is also verified that the two +** sets of coordinates are mutually consistent and an error message added +** to the RtreeCheck object if they are not. +*/ +static void rtreeCheckCellCoord( + RtreeCheck *pCheck, + i64 iNode, /* Node id to use in error messages */ + int iCell, /* Cell number to use in error messages */ + u8 *pCell, /* Pointer to cell coordinates */ + u8 *pParent /* Pointer to parent coordinates */ +){ + RtreeCoord c1, c2; + RtreeCoord p1, p2; + int i; + + for(i=0; inDim; i++){ + readCoord(&pCell[4*2*i], &c1); + readCoord(&pCell[4*(2*i + 1)], &c2); + + /* printf("%e, %e\n", c1.u.f, c2.u.f); */ + if( pCheck->bInt ? c1.i>c2.i : c1.f>c2.f ){ + rtreeCheckAppendMsg(pCheck, + "Dimension %d of cell %d on node %lld is corrupt", i, iCell, iNode + ); + } + + if( pParent ){ + readCoord(&pParent[4*2*i], &p1); + readCoord(&pParent[4*(2*i + 1)], &p2); + + if( (pCheck->bInt ? c1.ibInt ? c2.i>p2.i : c2.f>p2.f) + ){ + rtreeCheckAppendMsg(pCheck, + "Dimension %d of cell %d on node %lld is corrupt relative to parent" + , i, iCell, iNode + ); + } + } + } +} + +/* +** Run rtreecheck() checks on node iNode, which is at depth iDepth within +** the r-tree structure. Argument aParent points to the array of coordinates +** that bound node iNode on the parent node. +** +** If any problems are discovered, an error message is appended to the +** report accumulated in the RtreeCheck object. +*/ +static void rtreeCheckNode( + RtreeCheck *pCheck, + int iDepth, /* Depth of iNode (0==leaf) */ + u8 *aParent, /* Buffer containing parent coords */ + i64 iNode /* Node to check */ +){ + u8 *aNode = 0; + int nNode = 0; + + assert( iNode==1 || aParent!=0 ); + assert( pCheck->nDim>0 ); + + aNode = rtreeCheckGetNode(pCheck, iNode, &nNode); + if( aNode ){ + if( nNode<4 ){ + rtreeCheckAppendMsg(pCheck, + "Node %lld is too small (%d bytes)", iNode, nNode + ); + }else{ + int nCell; /* Number of cells on page */ + int i; /* Used to iterate through cells */ + if( aParent==0 ){ + iDepth = readInt16(aNode); + if( iDepth>RTREE_MAX_DEPTH ){ + rtreeCheckAppendMsg(pCheck, "Rtree depth out of range (%d)", iDepth); + sqlite3_free(aNode); + return; + } + } + nCell = readInt16(&aNode[2]); + if( (4 + nCell*(8 + pCheck->nDim*2*4))>nNode ){ + rtreeCheckAppendMsg(pCheck, + "Node %lld is too small for cell count of %d (%d bytes)", + iNode, nCell, nNode + ); + }else{ + for(i=0; inDim*2*4)]; + i64 iVal = readInt64(pCell); + rtreeCheckCellCoord(pCheck, iNode, i, &pCell[8], aParent); + + if( iDepth>0 ){ + rtreeCheckMapping(pCheck, 0, iVal, iNode); + rtreeCheckNode(pCheck, iDepth-1, &pCell[8], iVal); + pCheck->nNonLeaf++; + }else{ + rtreeCheckMapping(pCheck, 1, iVal, iNode); + pCheck->nLeaf++; + } + } + } + } + sqlite3_free(aNode); + } +} + +/* +** The second argument to this function must be either "_rowid" or +** "_parent". This function checks that the number of entries in the +** %_rowid or %_parent table is exactly nExpect. If not, it adds +** an error message to the report in the RtreeCheck object indicated +** by the first argument. +*/ +static void rtreeCheckCount(RtreeCheck *pCheck, const char *zTbl, i64 nExpect){ + if( pCheck->rc==SQLITE_OK ){ + sqlite3_stmt *pCount; + pCount = rtreeCheckPrepare(pCheck, "SELECT count(*) FROM %Q.'%q%s'", + pCheck->zDb, pCheck->zTab, zTbl + ); + if( pCount ){ + if( sqlite3_step(pCount)==SQLITE_ROW ){ + i64 nActual = sqlite3_column_int64(pCount, 0); + if( nActual!=nExpect ){ + rtreeCheckAppendMsg(pCheck, "Wrong number of entries in %%%s table" + " - expected %lld, actual %lld" , zTbl, nExpect, nActual + ); + } + } + pCheck->rc = sqlite3_finalize(pCount); + } + } +} + +/* +** This function does the bulk of the work for the rtree integrity-check. +** It is called by rtreecheck(), which is the SQL function implementation. +*/ +static int rtreeCheckTable( + sqlite3 *db, /* Database handle to access db through */ + const char *zDb, /* Name of db ("main", "temp" etc.) */ + const char *zTab, /* Name of rtree table to check */ + char **pzReport /* OUT: sqlite3_malloc'd report text */ +){ + RtreeCheck check; /* Common context for various routines */ + sqlite3_stmt *pStmt = 0; /* Used to find column count of rtree table */ + int bEnd = 0; /* True if transaction should be closed */ + int nAux = 0; /* Number of extra columns. */ + + /* Initialize the context object */ + memset(&check, 0, sizeof(check)); + check.db = db; + check.zDb = zDb; + check.zTab = zTab; + + /* If there is not already an open transaction, open one now. This is + ** to ensure that the queries run as part of this integrity-check operate + ** on a consistent snapshot. */ + if( sqlite3_get_autocommit(db) ){ + check.rc = sqlite3_exec(db, "BEGIN", 0, 0, 0); + bEnd = 1; + } + + /* Find the number of auxiliary columns */ + if( check.rc==SQLITE_OK ){ + pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.'%q_rowid'", zDb, zTab); + if( pStmt ){ + nAux = sqlite3_column_count(pStmt) - 2; + sqlite3_finalize(pStmt); + } + check.rc = SQLITE_OK; + } + + /* Find number of dimensions in the rtree table. */ + pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.%Q", zDb, zTab); + if( pStmt ){ + int rc; + check.nDim = (sqlite3_column_count(pStmt) - 1 - nAux) / 2; + if( check.nDim<1 ){ + rtreeCheckAppendMsg(&check, "Schema corrupt or not an rtree"); + }else if( SQLITE_ROW==sqlite3_step(pStmt) ){ + check.bInt = (sqlite3_column_type(pStmt, 1)==SQLITE_INTEGER); + } + rc = sqlite3_finalize(pStmt); + if( rc!=SQLITE_CORRUPT ) check.rc = rc; + } + + /* Do the actual integrity-check */ + if( check.nDim>=1 ){ + if( check.rc==SQLITE_OK ){ + rtreeCheckNode(&check, 0, 0, 1); + } + rtreeCheckCount(&check, "_rowid", check.nLeaf); + rtreeCheckCount(&check, "_parent", check.nNonLeaf); + } + + /* Finalize SQL statements used by the integrity-check */ + sqlite3_finalize(check.pGetNode); + sqlite3_finalize(check.aCheckMapping[0]); + sqlite3_finalize(check.aCheckMapping[1]); + + /* If one was opened, close the transaction */ + if( bEnd ){ + int rc = sqlite3_exec(db, "END", 0, 0, 0); + if( check.rc==SQLITE_OK ) check.rc = rc; + } + *pzReport = check.zReport; + return check.rc; +} + +/* +** Usage: +** +** rtreecheck(); +** rtreecheck(, ); +** +** Invoking this SQL function runs an integrity-check on the named rtree +** table. The integrity-check verifies the following: +** +** 1. For each cell in the r-tree structure (%_node table), that: +** +** a) for each dimension, (coord1 <= coord2). +** +** b) unless the cell is on the root node, that the cell is bounded +** by the parent cell on the parent node. +** +** c) for leaf nodes, that there is an entry in the %_rowid +** table corresponding to the cell's rowid value that +** points to the correct node. +** +** d) for cells on non-leaf nodes, that there is an entry in the +** %_parent table mapping from the cell's child node to the +** node that it resides on. +** +** 2. That there are the same number of entries in the %_rowid table +** as there are leaf cells in the r-tree structure, and that there +** is a leaf cell that corresponds to each entry in the %_rowid table. +** +** 3. That there are the same number of entries in the %_parent table +** as there are non-leaf cells in the r-tree structure, and that +** there is a non-leaf cell that corresponds to each entry in the +** %_parent table. +*/ +static void rtreecheck( + sqlite3_context *ctx, + int nArg, + sqlite3_value **apArg +){ + if( nArg!=1 && nArg!=2 ){ + sqlite3_result_error(ctx, + "wrong number of arguments to function rtreecheck()", -1 + ); + }else{ + int rc; + char *zReport = 0; + const char *zDb = (const char*)sqlite3_value_text(apArg[0]); + const char *zTab; + if( nArg==1 ){ + zTab = zDb; + zDb = "main"; + }else{ + zTab = (const char*)sqlite3_value_text(apArg[1]); + } + rc = rtreeCheckTable(sqlite3_context_db_handle(ctx), zDb, zTab, &zReport); + if( rc==SQLITE_OK ){ + sqlite3_result_text(ctx, zReport ? zReport : "ok", -1, SQLITE_TRANSIENT); + }else{ + sqlite3_result_error_code(ctx, rc); + } + sqlite3_free(zReport); + } +} + +/* Conditionally include the geopoly code */ +#ifdef SQLITE_ENABLE_GEOPOLY +/************** Include geopoly.c in the middle of rtree.c *******************/ +/************** Begin file geopoly.c *****************************************/ +/* +** 2018-05-25 +** +** 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 implements an alternative R-Tree virtual table that +** uses polygons to express the boundaries of 2-dimensional objects. +** +** This file is #include-ed onto the end of "rtree.c" so that it has +** access to all of the R-Tree internals. +*/ +/* #include */ + +/* Enable -DGEOPOLY_ENABLE_DEBUG for debugging facilities */ +#ifdef GEOPOLY_ENABLE_DEBUG + static int geo_debug = 0; +# define GEODEBUG(X) if(geo_debug)printf X +#else +# define GEODEBUG(X) +#endif + +#ifndef JSON_NULL /* The following stuff repeats things found in json1 */ +/* +** Versions of isspace(), isalnum() and isdigit() to which it is safe +** to pass signed char values. +*/ +#ifdef sqlite3Isdigit + /* Use the SQLite core versions if this routine is part of the + ** SQLite amalgamation */ +# define safe_isdigit(x) sqlite3Isdigit(x) +# define safe_isalnum(x) sqlite3Isalnum(x) +# define safe_isxdigit(x) sqlite3Isxdigit(x) +#else + /* Use the standard library for separate compilation */ +#include /* amalgamator: keep */ +# define safe_isdigit(x) isdigit((unsigned char)(x)) +# define safe_isalnum(x) isalnum((unsigned char)(x)) +# define safe_isxdigit(x) isxdigit((unsigned char)(x)) +#endif + +/* +** Growing our own isspace() routine this way is twice as fast as +** the library isspace() function. +*/ +static const char geopolyIsSpace[] = { + 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 safe_isspace(x) (geopolyIsSpace[(unsigned char)x]) +#endif /* JSON NULL - back to original code */ + +/* Compiler and version */ +#ifndef GCC_VERSION +#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif +#endif +#ifndef MSVC_VERSION +#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) +# define MSVC_VERSION _MSC_VER +#else +# define MSVC_VERSION 0 +#endif +#endif + +/* Datatype for coordinates +*/ +typedef float GeoCoord; + +/* +** Internal representation of a polygon. +** +** The polygon consists of a sequence of vertexes. There is a line +** segment between each pair of vertexes, and one final segment from +** the last vertex back to the first. (This differs from the GeoJSON +** standard in which the final vertex is a repeat of the first.) +** +** The polygon follows the right-hand rule. The area to the right of +** each segment is "outside" and the area to the left is "inside". +** +** The on-disk representation consists of a 4-byte header followed by +** the values. The 4-byte header is: +** +** encoding (1 byte) 0=big-endian, 1=little-endian +** nvertex (3 bytes) Number of vertexes as a big-endian integer +** +** Enough space is allocated for 4 coordinates, to work around over-zealous +** warnings coming from some compiler (notably, clang). In reality, the size +** of each GeoPoly memory allocate is adjusted as necessary so that the +** GeoPoly.a[] array at the end is the appropriate size. +*/ +typedef struct GeoPoly GeoPoly; +struct GeoPoly { + int nVertex; /* Number of vertexes */ + unsigned char hdr[4]; /* Header for on-disk representation */ + GeoCoord a[8]; /* 2*nVertex values. X (longitude) first, then Y */ +}; + +/* The size of a memory allocation needed for a GeoPoly object sufficient +** to hold N coordinate pairs. +*/ +#define GEOPOLY_SZ(N) (sizeof(GeoPoly) + sizeof(GeoCoord)*2*((N)-4)) + +/* Macros to access coordinates of a GeoPoly. +** We have to use these macros, rather than just say p->a[i] in order +** to silence (incorrect) UBSAN warnings if the array index is too large. +*/ +#define GeoX(P,I) (((GeoCoord*)(P)->a)[(I)*2]) +#define GeoY(P,I) (((GeoCoord*)(P)->a)[(I)*2+1]) + + +/* +** State of a parse of a GeoJSON input. +*/ +typedef struct GeoParse GeoParse; +struct GeoParse { + const unsigned char *z; /* Unparsed input */ + int nVertex; /* Number of vertexes in a[] */ + int nAlloc; /* Space allocated to a[] */ + int nErr; /* Number of errors encountered */ + GeoCoord *a; /* Array of vertexes. From sqlite3_malloc64() */ +}; + +/* Do a 4-byte byte swap */ +static void geopolySwab32(unsigned char *a){ + unsigned char t = a[0]; + a[0] = a[3]; + a[3] = t; + t = a[1]; + a[1] = a[2]; + a[2] = t; +} + +/* Skip whitespace. Return the next non-whitespace character. */ +static char geopolySkipSpace(GeoParse *p){ + while( safe_isspace(p->z[0]) ) p->z++; + return p->z[0]; +} + +/* Parse out a number. Write the value into *pVal if pVal!=0. +** return non-zero on success and zero if the next token is not a number. +*/ +static int geopolyParseNumber(GeoParse *p, GeoCoord *pVal){ + char c = geopolySkipSpace(p); + const unsigned char *z = p->z; + int j = 0; + int seenDP = 0; + int seenE = 0; + if( c=='-' ){ + j = 1; + c = z[j]; + } + if( c=='0' && z[j+1]>='0' && z[j+1]<='9' ) return 0; + for(;; j++){ + c = z[j]; + if( safe_isdigit(c) ) continue; + if( c=='.' ){ + if( z[j-1]=='-' ) return 0; + if( seenDP ) return 0; + seenDP = 1; + continue; + } + if( c=='e' || c=='E' ){ + if( z[j-1]<'0' ) return 0; + if( seenE ) return -1; + seenDP = seenE = 1; + c = z[j+1]; + if( c=='+' || c=='-' ){ + j++; + c = z[j+1]; + } + if( c<'0' || c>'9' ) return 0; + continue; + } + break; + } + if( z[j-1]<'0' ) return 0; + if( pVal ){ +#ifdef SQLITE_AMALGAMATION + /* The sqlite3AtoF() routine is much much faster than atof(), if it + ** is available */ + double r; + (void)sqlite3AtoF((const char*)p->z, &r, j, SQLITE_UTF8); + *pVal = r; +#else + *pVal = (GeoCoord)atof((const char*)p->z); +#endif + } + p->z += j; + return 1; +} + +/* +** If the input is a well-formed JSON array of coordinates with at least +** four coordinates and where each coordinate is itself a two-value array, +** then convert the JSON into a GeoPoly object and return a pointer to +** that object. +** +** If any error occurs, return NULL. +*/ +static GeoPoly *geopolyParseJson(const unsigned char *z, int *pRc){ + GeoParse s; + int rc = SQLITE_OK; + memset(&s, 0, sizeof(s)); + s.z = z; + if( geopolySkipSpace(&s)=='[' ){ + s.z++; + while( geopolySkipSpace(&s)=='[' ){ + int ii = 0; + char c; + s.z++; + if( s.nVertex>=s.nAlloc ){ + GeoCoord *aNew; + s.nAlloc = s.nAlloc*2 + 16; + aNew = sqlite3_realloc64(s.a, s.nAlloc*sizeof(GeoCoord)*2 ); + if( aNew==0 ){ + rc = SQLITE_NOMEM; + s.nErr++; + break; + } + s.a = aNew; + } + while( geopolyParseNumber(&s, ii<=1 ? &s.a[s.nVertex*2+ii] : 0) ){ + ii++; + if( ii==2 ) s.nVertex++; + c = geopolySkipSpace(&s); + s.z++; + if( c==',' ) continue; + if( c==']' && ii>=2 ) break; + s.nErr++; + rc = SQLITE_ERROR; + goto parse_json_err; + } + if( geopolySkipSpace(&s)==',' ){ + s.z++; + continue; + } + break; + } + if( geopolySkipSpace(&s)==']' + && s.nVertex>=4 + && s.a[0]==s.a[s.nVertex*2-2] + && s.a[1]==s.a[s.nVertex*2-1] + && (s.z++, geopolySkipSpace(&s)==0) + ){ + GeoPoly *pOut; + int x = 1; + s.nVertex--; /* Remove the redundant vertex at the end */ + pOut = sqlite3_malloc64( GEOPOLY_SZ((sqlite3_int64)s.nVertex) ); + x = 1; + if( pOut==0 ) goto parse_json_err; + pOut->nVertex = s.nVertex; + memcpy(pOut->a, s.a, s.nVertex*2*sizeof(GeoCoord)); + pOut->hdr[0] = *(unsigned char*)&x; + pOut->hdr[1] = (s.nVertex>>16)&0xff; + pOut->hdr[2] = (s.nVertex>>8)&0xff; + pOut->hdr[3] = s.nVertex&0xff; + sqlite3_free(s.a); + if( pRc ) *pRc = SQLITE_OK; + return pOut; + }else{ + s.nErr++; + rc = SQLITE_ERROR; + } + } +parse_json_err: + if( pRc ) *pRc = rc; + sqlite3_free(s.a); + return 0; +} + +/* +** Given a function parameter, try to interpret it as a polygon, either +** in the binary format or JSON text. Compute a GeoPoly object and +** return a pointer to that object. Or if the input is not a well-formed +** polygon, put an error message in sqlite3_context and return NULL. +*/ +static GeoPoly *geopolyFuncParam( + sqlite3_context *pCtx, /* Context for error messages */ + sqlite3_value *pVal, /* The value to decode */ + int *pRc /* Write error here */ +){ + GeoPoly *p = 0; + int nByte; + if( sqlite3_value_type(pVal)==SQLITE_BLOB + && (nByte = sqlite3_value_bytes(pVal))>=(4+6*sizeof(GeoCoord)) + ){ + const unsigned char *a = sqlite3_value_blob(pVal); + int nVertex; + nVertex = (a[1]<<16) + (a[2]<<8) + a[3]; + if( (a[0]==0 || a[0]==1) + && (nVertex*2*sizeof(GeoCoord) + 4)==(unsigned int)nByte + ){ + p = sqlite3_malloc64( sizeof(*p) + (nVertex-1)*2*sizeof(GeoCoord) ); + if( p==0 ){ + if( pRc ) *pRc = SQLITE_NOMEM; + if( pCtx ) sqlite3_result_error_nomem(pCtx); + }else{ + int x = 1; + p->nVertex = nVertex; + memcpy(p->hdr, a, nByte); + if( a[0] != *(unsigned char*)&x ){ + int ii; + for(ii=0; iihdr[0] ^= 1; + } + } + } + if( pRc ) *pRc = SQLITE_OK; + return p; + }else if( sqlite3_value_type(pVal)==SQLITE_TEXT ){ + const unsigned char *zJson = sqlite3_value_text(pVal); + if( zJson==0 ){ + if( pRc ) *pRc = SQLITE_NOMEM; + return 0; + } + return geopolyParseJson(zJson, pRc); + }else{ + if( pRc ) *pRc = SQLITE_ERROR; + return 0; + } +} + +/* +** Implementation of the geopoly_blob(X) function. +** +** If the input is a well-formed Geopoly BLOB or JSON string +** then return the BLOB representation of the polygon. Otherwise +** return NULL. +*/ +static void geopolyBlobFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + sqlite3_result_blob(context, p->hdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + +/* +** SQL function: geopoly_json(X) +** +** Interpret X as a polygon and render it as a JSON array +** of coordinates. Or, if X is not a valid polygon, return NULL. +*/ +static void geopolyJsonFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + sqlite3 *db = sqlite3_context_db_handle(context); + sqlite3_str *x = sqlite3_str_new(db); + int i; + sqlite3_str_append(x, "[", 1); + for(i=0; inVertex; i++){ + sqlite3_str_appendf(x, "[%!g,%!g],", GeoX(p,i), GeoY(p,i)); + } + sqlite3_str_appendf(x, "[%!g,%!g]]", GeoX(p,0), GeoY(p,0)); + sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free); + sqlite3_free(p); + } +} + +/* +** SQL function: geopoly_svg(X, ....) +** +** Interpret X as a polygon and render it as a SVG . +** Additional arguments are added as attributes to the . +*/ +static void geopolySvgFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p; + if( argc<1 ) return; + p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + sqlite3 *db = sqlite3_context_db_handle(context); + sqlite3_str *x = sqlite3_str_new(db); + int i; + char cSep = '\''; + sqlite3_str_appendf(x, ""); + sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free); + sqlite3_free(p); + } +} + +/* +** SQL Function: geopoly_xform(poly, A, B, C, D, E, F) +** +** Transform and/or translate a polygon as follows: +** +** x1 = A*x0 + B*y0 + E +** y1 = C*x0 + D*y0 + F +** +** For a translation: +** +** geopoly_xform(poly, 1, 0, 0, 1, x-offset, y-offset) +** +** Rotate by R around the point (0,0): +** +** geopoly_xform(poly, cos(R), sin(R), -sin(R), cos(R), 0, 0) +*/ +static void geopolyXformFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + double A = sqlite3_value_double(argv[1]); + double B = sqlite3_value_double(argv[2]); + double C = sqlite3_value_double(argv[3]); + double D = sqlite3_value_double(argv[4]); + double E = sqlite3_value_double(argv[5]); + double F = sqlite3_value_double(argv[6]); + GeoCoord x1, y1, x0, y0; + int ii; + if( p ){ + for(ii=0; iinVertex; ii++){ + x0 = GeoX(p,ii); + y0 = GeoY(p,ii); + x1 = (GeoCoord)(A*x0 + B*y0 + E); + y1 = (GeoCoord)(C*x0 + D*y0 + F); + GeoX(p,ii) = x1; + GeoY(p,ii) = y1; + } + sqlite3_result_blob(context, p->hdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + +/* +** Compute the area enclosed by the polygon. +** +** This routine can also be used to detect polygons that rotate in +** the wrong direction. Polygons are suppose to be counter-clockwise (CCW). +** This routine returns a negative value for clockwise (CW) polygons. +*/ +static double geopolyArea(GeoPoly *p){ + double rArea = 0.0; + int ii; + for(ii=0; iinVertex-1; ii++){ + rArea += (GeoX(p,ii) - GeoX(p,ii+1)) /* (x0 - x1) */ + * (GeoY(p,ii) + GeoY(p,ii+1)) /* (y0 + y1) */ + * 0.5; + } + rArea += (GeoX(p,ii) - GeoX(p,0)) /* (xN - x0) */ + * (GeoY(p,ii) + GeoY(p,0)) /* (yN + y0) */ + * 0.5; + return rArea; +} + +/* +** Implementation of the geopoly_area(X) function. +** +** If the input is a well-formed Geopoly BLOB then return the area +** enclosed by the polygon. If the polygon circulates clockwise instead +** of counterclockwise (as it should) then return the negative of the +** enclosed area. Otherwise return NULL. +*/ +static void geopolyAreaFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + sqlite3_result_double(context, geopolyArea(p)); + sqlite3_free(p); + } +} + +/* +** Implementation of the geopoly_ccw(X) function. +** +** If the rotation of polygon X is clockwise (incorrect) instead of +** counter-clockwise (the correct winding order according to RFC7946) +** then reverse the order of the vertexes in polygon X. +** +** In other words, this routine returns a CCW polygon regardless of the +** winding order of its input. +** +** Use this routine to sanitize historical inputs that that sometimes +** contain polygons that wind in the wrong direction. +*/ +static void geopolyCcwFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + if( geopolyArea(p)<0.0 ){ + int ii, jj; + for(ii=1, jj=p->nVertex-1; iihdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + +#define GEOPOLY_PI 3.1415926535897932385 + +/* Fast approximation for sine(X) for X between -0.5*pi and 2*pi +*/ +static double geopolySine(double r){ + assert( r>=-0.5*GEOPOLY_PI && r<=2.0*GEOPOLY_PI ); + if( r>=1.5*GEOPOLY_PI ){ + r -= 2.0*GEOPOLY_PI; + } + if( r>=0.5*GEOPOLY_PI ){ + return -geopolySine(r-GEOPOLY_PI); + }else{ + double r2 = r*r; + double r3 = r2*r; + double r5 = r3*r2; + return 0.9996949*r - 0.1656700*r3 + 0.0075134*r5; + } +} + +/* +** Function: geopoly_regular(X,Y,R,N) +** +** Construct a simple, convex, regular polygon centered at X, Y +** with circumradius R and with N sides. +*/ +static void geopolyRegularFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + double x = sqlite3_value_double(argv[0]); + double y = sqlite3_value_double(argv[1]); + double r = sqlite3_value_double(argv[2]); + int n = sqlite3_value_int(argv[3]); + int i; + GeoPoly *p; + + if( n<3 || r<=0.0 ) return; + if( n>1000 ) n = 1000; + p = sqlite3_malloc64( sizeof(*p) + (n-1)*2*sizeof(GeoCoord) ); + if( p==0 ){ + sqlite3_result_error_nomem(context); + return; + } + i = 1; + p->hdr[0] = *(unsigned char*)&i; + p->hdr[1] = 0; + p->hdr[2] = (n>>8)&0xff; + p->hdr[3] = n&0xff; + for(i=0; ihdr, 4+8*n, SQLITE_TRANSIENT); + sqlite3_free(p); +} + +/* +** If pPoly is a polygon, compute its bounding box. Then: +** +** (1) if aCoord!=0 store the bounding box in aCoord, returning NULL +** (2) otherwise, compute a GeoPoly for the bounding box and return the +** new GeoPoly +** +** If pPoly is NULL but aCoord is not NULL, then compute a new GeoPoly from +** the bounding box in aCoord and return a pointer to that GeoPoly. +*/ +static GeoPoly *geopolyBBox( + sqlite3_context *context, /* For recording the error */ + sqlite3_value *pPoly, /* The polygon */ + RtreeCoord *aCoord, /* Results here */ + int *pRc /* Error code here */ +){ + GeoPoly *pOut = 0; + GeoPoly *p; + float mnX, mxX, mnY, mxY; + if( pPoly==0 && aCoord!=0 ){ + p = 0; + mnX = aCoord[0].f; + mxX = aCoord[1].f; + mnY = aCoord[2].f; + mxY = aCoord[3].f; + goto geopolyBboxFill; + }else{ + p = geopolyFuncParam(context, pPoly, pRc); + } + if( p ){ + int ii; + mnX = mxX = GeoX(p,0); + mnY = mxY = GeoY(p,0); + for(ii=1; iinVertex; ii++){ + double r = GeoX(p,ii); + if( rmxX ) mxX = (float)r; + r = GeoY(p,ii); + if( rmxY ) mxY = (float)r; + } + if( pRc ) *pRc = SQLITE_OK; + if( aCoord==0 ){ + geopolyBboxFill: + pOut = sqlite3_realloc64(p, GEOPOLY_SZ(4)); + if( pOut==0 ){ + sqlite3_free(p); + if( context ) sqlite3_result_error_nomem(context); + if( pRc ) *pRc = SQLITE_NOMEM; + return 0; + } + pOut->nVertex = 4; + ii = 1; + pOut->hdr[0] = *(unsigned char*)ⅈ + pOut->hdr[1] = 0; + pOut->hdr[2] = 0; + pOut->hdr[3] = 4; + GeoX(pOut,0) = mnX; + GeoY(pOut,0) = mnY; + GeoX(pOut,1) = mxX; + GeoY(pOut,1) = mnY; + GeoX(pOut,2) = mxX; + GeoY(pOut,2) = mxY; + GeoX(pOut,3) = mnX; + GeoY(pOut,3) = mxY; + }else{ + sqlite3_free(p); + aCoord[0].f = mnX; + aCoord[1].f = mxX; + aCoord[2].f = mnY; + aCoord[3].f = mxY; + } + } + return pOut; +} + +/* +** Implementation of the geopoly_bbox(X) SQL function. +*/ +static void geopolyBBoxFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyBBox(context, argv[0], 0, 0); + if( p ){ + sqlite3_result_blob(context, p->hdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + +/* +** State vector for the geopoly_group_bbox() aggregate function. +*/ +typedef struct GeoBBox GeoBBox; +struct GeoBBox { + int isInit; + RtreeCoord a[4]; +}; + + +/* +** Implementation of the geopoly_group_bbox(X) aggregate SQL function. +*/ +static void geopolyBBoxStep( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + RtreeCoord a[4]; + int rc = SQLITE_OK; + (void)geopolyBBox(context, argv[0], a, &rc); + if( rc==SQLITE_OK ){ + GeoBBox *pBBox; + pBBox = (GeoBBox*)sqlite3_aggregate_context(context, sizeof(*pBBox)); + if( pBBox==0 ) return; + if( pBBox->isInit==0 ){ + pBBox->isInit = 1; + memcpy(pBBox->a, a, sizeof(RtreeCoord)*4); + }else{ + if( a[0].f < pBBox->a[0].f ) pBBox->a[0] = a[0]; + if( a[1].f > pBBox->a[1].f ) pBBox->a[1] = a[1]; + if( a[2].f < pBBox->a[2].f ) pBBox->a[2] = a[2]; + if( a[3].f > pBBox->a[3].f ) pBBox->a[3] = a[3]; + } + } +} +static void geopolyBBoxFinal( + sqlite3_context *context +){ + GeoPoly *p; + GeoBBox *pBBox; + pBBox = (GeoBBox*)sqlite3_aggregate_context(context, 0); + if( pBBox==0 ) return; + p = geopolyBBox(context, 0, pBBox->a, 0); + if( p ){ + sqlite3_result_blob(context, p->hdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + + +/* +** Determine if point (x0,y0) is beneath line segment (x1,y1)->(x2,y2). +** Returns: +** +** +2 x0,y0 is on the line segement +** +** +1 x0,y0 is beneath line segment +** +** 0 x0,y0 is not on or beneath the line segment or the line segment +** is vertical and x0,y0 is not on the line segment +** +** The left-most coordinate min(x1,x2) is not considered to be part of +** the line segment for the purposes of this analysis. +*/ +static int pointBeneathLine( + double x0, double y0, + double x1, double y1, + double x2, double y2 +){ + double y; + if( x0==x1 && y0==y1 ) return 2; + if( x1x2 ) return 0; + }else if( x1>x2 ){ + if( x0<=x2 || x0>x1 ) return 0; + }else{ + /* Vertical line segment */ + if( x0!=x1 ) return 0; + if( y0y1 && y0>y2 ) return 0; + return 2; + } + y = y1 + (y2-y1)*(x0-x1)/(x2-x1); + if( y0==y ) return 2; + if( y0nVertex-1; ii++){ + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,ii+1),GeoY(p1,ii+1)); + if( v==2 ) break; + cnt += v; + } + if( v!=2 ){ + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,0), GeoY(p1,0)); + } + if( v==2 ){ + sqlite3_result_int(context, 1); + }else if( ((v+cnt)&1)==0 ){ + sqlite3_result_int(context, 0); + }else{ + sqlite3_result_int(context, 2); + } + sqlite3_free(p1); +} + +/* Forward declaration */ +static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2); + +/* +** SQL function: geopoly_within(P1,P2) +** +** Return +2 if P1 and P2 are the same polygon +** Return +1 if P2 is contained within P1 +** Return 0 if any part of P2 is on the outside of P1 +** +*/ +static void geopolyWithinFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p1 = geopolyFuncParam(context, argv[0], 0); + GeoPoly *p2 = geopolyFuncParam(context, argv[1], 0); + if( p1 && p2 ){ + int x = geopolyOverlap(p1, p2); + if( x<0 ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_result_int(context, x==2 ? 1 : x==4 ? 2 : 0); + } + } + sqlite3_free(p1); + sqlite3_free(p2); +} + +/* Objects used by the overlap algorihm. */ +typedef struct GeoEvent GeoEvent; +typedef struct GeoSegment GeoSegment; +typedef struct GeoOverlap GeoOverlap; +struct GeoEvent { + double x; /* X coordinate at which event occurs */ + int eType; /* 0 for ADD, 1 for REMOVE */ + GeoSegment *pSeg; /* The segment to be added or removed */ + GeoEvent *pNext; /* Next event in the sorted list */ +}; +struct GeoSegment { + double C, B; /* y = C*x + B */ + double y; /* Current y value */ + float y0; /* Initial y value */ + unsigned char side; /* 1 for p1, 2 for p2 */ + unsigned int idx; /* Which segment within the side */ + GeoSegment *pNext; /* Next segment in a list sorted by y */ +}; +struct GeoOverlap { + GeoEvent *aEvent; /* Array of all events */ + GeoSegment *aSegment; /* Array of all segments */ + int nEvent; /* Number of events */ + int nSegment; /* Number of segments */ +}; + +/* +** Add a single segment and its associated events. +*/ +static void geopolyAddOneSegment( + GeoOverlap *p, + GeoCoord x0, + GeoCoord y0, + GeoCoord x1, + GeoCoord y1, + unsigned char side, + unsigned int idx +){ + GeoSegment *pSeg; + GeoEvent *pEvent; + if( x0==x1 ) return; /* Ignore vertical segments */ + if( x0>x1 ){ + GeoCoord t = x0; + x0 = x1; + x1 = t; + t = y0; + y0 = y1; + y1 = t; + } + pSeg = p->aSegment + p->nSegment; + p->nSegment++; + pSeg->C = (y1-y0)/(x1-x0); + pSeg->B = y1 - x1*pSeg->C; + pSeg->y0 = y0; + pSeg->side = side; + pSeg->idx = idx; + pEvent = p->aEvent + p->nEvent; + p->nEvent++; + pEvent->x = x0; + pEvent->eType = 0; + pEvent->pSeg = pSeg; + pEvent = p->aEvent + p->nEvent; + p->nEvent++; + pEvent->x = x1; + pEvent->eType = 1; + pEvent->pSeg = pSeg; +} + + + +/* +** Insert all segments and events for polygon pPoly. +*/ +static void geopolyAddSegments( + GeoOverlap *p, /* Add segments to this Overlap object */ + GeoPoly *pPoly, /* Take all segments from this polygon */ + unsigned char side /* The side of pPoly */ +){ + unsigned int i; + GeoCoord *x; + for(i=0; i<(unsigned)pPoly->nVertex-1; i++){ + x = &GeoX(pPoly,i); + geopolyAddOneSegment(p, x[0], x[1], x[2], x[3], side, i); + } + x = &GeoX(pPoly,i); + geopolyAddOneSegment(p, x[0], x[1], pPoly->a[0], pPoly->a[1], side, i); +} + +/* +** Merge two lists of sorted events by X coordinate +*/ +static GeoEvent *geopolyEventMerge(GeoEvent *pLeft, GeoEvent *pRight){ + GeoEvent head, *pLast; + head.pNext = 0; + pLast = &head; + while( pRight && pLeft ){ + if( pRight->x <= pLeft->x ){ + pLast->pNext = pRight; + pLast = pRight; + pRight = pRight->pNext; + }else{ + pLast->pNext = pLeft; + pLast = pLeft; + pLeft = pLeft->pNext; + } + } + pLast->pNext = pRight ? pRight : pLeft; + return head.pNext; +} + +/* +** Sort an array of nEvent event objects into a list. +*/ +static GeoEvent *geopolySortEventsByX(GeoEvent *aEvent, int nEvent){ + int mx = 0; + int i, j; + GeoEvent *p; + GeoEvent *a[50]; + for(i=0; ipNext = 0; + for(j=0; j=mx ) mx = j+1; + } + p = 0; + for(i=0; iy - pLeft->y; + if( r==0.0 ) r = pRight->C - pLeft->C; + if( r<0.0 ){ + pLast->pNext = pRight; + pLast = pRight; + pRight = pRight->pNext; + }else{ + pLast->pNext = pLeft; + pLast = pLeft; + pLeft = pLeft->pNext; + } + } + pLast->pNext = pRight ? pRight : pLeft; + return head.pNext; +} + +/* +** Sort a list of GeoSegments in order of increasing Y and in the event of +** a tie, increasing C (slope). +*/ +static GeoSegment *geopolySortSegmentsByYAndC(GeoSegment *pList){ + int mx = 0; + int i; + GeoSegment *p; + GeoSegment *a[50]; + while( pList ){ + p = pList; + pList = pList->pNext; + p->pNext = 0; + for(i=0; i=mx ) mx = i+1; + } + p = 0; + for(i=0; inVertex + p2->nVertex + 2; + GeoOverlap *p; + sqlite3_int64 nByte; + GeoEvent *pThisEvent; + double rX; + int rc = 0; + int needSort = 0; + GeoSegment *pActive = 0; + GeoSegment *pSeg; + unsigned char aOverlap[4]; + + nByte = sizeof(GeoEvent)*nVertex*2 + + sizeof(GeoSegment)*nVertex + + sizeof(GeoOverlap); + p = sqlite3_malloc64( nByte ); + if( p==0 ) return -1; + p->aEvent = (GeoEvent*)&p[1]; + p->aSegment = (GeoSegment*)&p->aEvent[nVertex*2]; + p->nEvent = p->nSegment = 0; + geopolyAddSegments(p, p1, 1); + geopolyAddSegments(p, p2, 2); + pThisEvent = geopolySortEventsByX(p->aEvent, p->nEvent); + rX = pThisEvent->x==0.0 ? -1.0 : 0.0; + memset(aOverlap, 0, sizeof(aOverlap)); + while( pThisEvent ){ + if( pThisEvent->x!=rX ){ + GeoSegment *pPrev = 0; + int iMask = 0; + GEODEBUG(("Distinct X: %g\n", pThisEvent->x)); + rX = pThisEvent->x; + if( needSort ){ + GEODEBUG(("SORT\n")); + pActive = geopolySortSegmentsByYAndC(pActive); + needSort = 0; + } + for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){ + if( pPrev ){ + if( pPrev->y!=pSeg->y ){ + GEODEBUG(("MASK: %d\n", iMask)); + aOverlap[iMask] = 1; + } + } + iMask ^= pSeg->side; + pPrev = pSeg; + } + pPrev = 0; + for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){ + double y = pSeg->C*rX + pSeg->B; + GEODEBUG(("Segment %d.%d %g->%g\n", pSeg->side, pSeg->idx, pSeg->y, y)); + pSeg->y = y; + if( pPrev ){ + if( pPrev->y>pSeg->y && pPrev->side!=pSeg->side ){ + rc = 1; + GEODEBUG(("Crossing: %d.%d and %d.%d\n", + pPrev->side, pPrev->idx, + pSeg->side, pSeg->idx)); + goto geopolyOverlapDone; + }else if( pPrev->y!=pSeg->y ){ + GEODEBUG(("MASK: %d\n", iMask)); + aOverlap[iMask] = 1; + } + } + iMask ^= pSeg->side; + pPrev = pSeg; + } + } + GEODEBUG(("%s %d.%d C=%g B=%g\n", + pThisEvent->eType ? "RM " : "ADD", + pThisEvent->pSeg->side, pThisEvent->pSeg->idx, + pThisEvent->pSeg->C, + pThisEvent->pSeg->B)); + if( pThisEvent->eType==0 ){ + /* Add a segment */ + pSeg = pThisEvent->pSeg; + pSeg->y = pSeg->y0; + pSeg->pNext = pActive; + pActive = pSeg; + needSort = 1; + }else{ + /* Remove a segment */ + if( pActive==pThisEvent->pSeg ){ + pActive = pActive->pNext; + }else{ + for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){ + if( pSeg->pNext==pThisEvent->pSeg ){ + pSeg->pNext = pSeg->pNext->pNext; + break; + } + } + } + } + pThisEvent = pThisEvent->pNext; + } + if( aOverlap[3]==0 ){ + rc = 0; + }else if( aOverlap[1]!=0 && aOverlap[2]==0 ){ + rc = 3; + }else if( aOverlap[1]==0 && aOverlap[2]!=0 ){ + rc = 2; + }else if( aOverlap[1]==0 && aOverlap[2]==0 ){ + rc = 4; + }else{ + rc = 1; + } + +geopolyOverlapDone: + sqlite3_free(p); + return rc; +} + +/* +** SQL function: geopoly_overlap(P1,P2) +** +** Determine whether or not P1 and P2 overlap. Return value: +** +** 0 The two polygons are disjoint +** 1 They overlap +** 2 P1 is completely contained within P2 +** 3 P2 is completely contained within P1 +** 4 P1 and P2 are the same polygon +** NULL Either P1 or P2 or both are not valid polygons +*/ +static void geopolyOverlapFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p1 = geopolyFuncParam(context, argv[0], 0); + GeoPoly *p2 = geopolyFuncParam(context, argv[1], 0); + if( p1 && p2 ){ + int x = geopolyOverlap(p1, p2); + if( x<0 ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_result_int(context, x); + } + } + sqlite3_free(p1); + sqlite3_free(p2); +} + +/* +** Enable or disable debugging output +*/ +static void geopolyDebugFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ +#ifdef GEOPOLY_ENABLE_DEBUG + geo_debug = sqlite3_value_int(argv[0]); +#endif +} + +/* +** This function is the implementation of both the xConnect and xCreate +** methods of the geopoly virtual table. +** +** argv[0] -> module name +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> column names... +*/ +static int geopolyInit( + sqlite3 *db, /* Database connection */ + void *pAux, /* One of the RTREE_COORD_* constants */ + int argc, const char *const*argv, /* Parameters to CREATE TABLE statement */ + sqlite3_vtab **ppVtab, /* OUT: New virtual table */ + char **pzErr, /* OUT: Error message, if any */ + int isCreate /* True for xCreate, false for xConnect */ +){ + int rc = SQLITE_OK; + Rtree *pRtree; + sqlite3_int64 nDb; /* Length of string argv[1] */ + sqlite3_int64 nName; /* Length of string argv[2] */ + sqlite3_str *pSql; + char *zSql; + int ii; + + sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + + /* Allocate the sqlite3_vtab structure */ + nDb = strlen(argv[1]); + nName = strlen(argv[2]); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); + if( !pRtree ){ + return SQLITE_NOMEM; + } + memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2); + pRtree->nBusy = 1; + pRtree->base.pModule = &rtreeModule; + pRtree->zDb = (char *)&pRtree[1]; + pRtree->zName = &pRtree->zDb[nDb+1]; + pRtree->eCoordType = RTREE_COORD_REAL32; + pRtree->nDim = 2; + pRtree->nDim2 = 4; + memcpy(pRtree->zDb, argv[1], nDb); + memcpy(pRtree->zName, argv[2], nName); + + + /* Create/Connect to the underlying relational database schema. If + ** that is successful, call sqlite3_declare_vtab() to configure + ** the r-tree table schema. + */ + pSql = sqlite3_str_new(db); + sqlite3_str_appendf(pSql, "CREATE TABLE x(_shape"); + pRtree->nAux = 1; /* Add one for _shape */ + pRtree->nAuxNotNull = 1; /* The _shape column is always not-null */ + for(ii=3; iinAux++; + sqlite3_str_appendf(pSql, ",%s", argv[ii]); + } + sqlite3_str_appendf(pSql, ");"); + zSql = sqlite3_str_finish(pSql); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + sqlite3_free(zSql); + if( rc ) goto geopolyInit_fail; + pRtree->nBytesPerCell = 8 + pRtree->nDim2*4; + + /* Figure out the node size to use. */ + rc = getNodeSize(db, pRtree, isCreate, pzErr); + if( rc ) goto geopolyInit_fail; + rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate); + if( rc ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + goto geopolyInit_fail; + } + + *ppVtab = (sqlite3_vtab *)pRtree; + return SQLITE_OK; + +geopolyInit_fail: + if( rc==SQLITE_OK ) rc = SQLITE_ERROR; + assert( *ppVtab==0 ); + assert( pRtree->nBusy==1 ); + rtreeRelease(pRtree); + return rc; +} + + +/* +** GEOPOLY virtual table module xCreate method. +*/ +static int geopolyCreate( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + return geopolyInit(db, pAux, argc, argv, ppVtab, pzErr, 1); +} + +/* +** GEOPOLY virtual table module xConnect method. +*/ +static int geopolyConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + return geopolyInit(db, pAux, argc, argv, ppVtab, pzErr, 0); +} + + +/* +** GEOPOLY virtual table module xFilter method. +** +** Query plans: +** +** 1 rowid lookup +** 2 search for objects overlapping the same bounding box +** that contains polygon argv[0] +** 3 search for objects overlapping the same bounding box +** that contains polygon argv[0] +** 4 full table scan +*/ +static int geopolyFilter( + sqlite3_vtab_cursor *pVtabCursor, /* The cursor to initialize */ + int idxNum, /* Query plan */ + const char *idxStr, /* Not Used */ + int argc, sqlite3_value **argv /* Parameters to the query plan */ +){ + Rtree *pRtree = (Rtree *)pVtabCursor->pVtab; + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + RtreeNode *pRoot = 0; + int rc = SQLITE_OK; + int iCell = 0; + + rtreeReference(pRtree); + + /* Reset the cursor to the same state as rtreeOpen() leaves it in. */ + resetCursor(pCsr); + + pCsr->iStrategy = idxNum; + if( idxNum==1 ){ + /* Special case - lookup by rowid. */ + RtreeNode *pLeaf; /* Leaf on which the required cell resides */ + RtreeSearchPoint *p; /* Search point for the leaf */ + i64 iRowid = sqlite3_value_int64(argv[0]); + i64 iNode = 0; + rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode); + if( rc==SQLITE_OK && pLeaf!=0 ){ + p = rtreeSearchPointNew(pCsr, RTREE_ZERO, 0); + assert( p!=0 ); /* Always returns pCsr->sPoint */ + pCsr->aNode[0] = pLeaf; + p->id = iNode; + p->eWithin = PARTLY_WITHIN; + rc = nodeRowidIndex(pRtree, pLeaf, iRowid, &iCell); + p->iCell = (u8)iCell; + RTREE_QUEUE_TRACE(pCsr, "PUSH-F1:"); + }else{ + pCsr->atEOF = 1; + } + }else{ + /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array + ** with the configured constraints. + */ + rc = nodeAcquire(pRtree, 1, 0, &pRoot); + if( rc==SQLITE_OK && idxNum<=3 ){ + RtreeCoord bbox[4]; + RtreeConstraint *p; + assert( argc==1 ); + geopolyBBox(0, argv[0], bbox, &rc); + if( rc ){ + goto geopoly_filter_end; + } + pCsr->aConstraint = p = sqlite3_malloc(sizeof(RtreeConstraint)*4); + pCsr->nConstraint = 4; + if( p==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*4); + memset(pCsr->anQueue, 0, sizeof(u32)*(pRtree->iDepth + 1)); + if( idxNum==2 ){ + /* Overlap query */ + p->op = 'B'; + p->iCoord = 0; + p->u.rValue = bbox[1].f; + p++; + p->op = 'D'; + p->iCoord = 1; + p->u.rValue = bbox[0].f; + p++; + p->op = 'B'; + p->iCoord = 2; + p->u.rValue = bbox[3].f; + p++; + p->op = 'D'; + p->iCoord = 3; + p->u.rValue = bbox[2].f; + }else{ + /* Within query */ + p->op = 'D'; + p->iCoord = 0; + p->u.rValue = bbox[0].f; + p++; + p->op = 'B'; + p->iCoord = 1; + p->u.rValue = bbox[1].f; + p++; + p->op = 'D'; + p->iCoord = 2; + p->u.rValue = bbox[2].f; + p++; + p->op = 'B'; + p->iCoord = 3; + p->u.rValue = bbox[3].f; + } + } + } + if( rc==SQLITE_OK ){ + RtreeSearchPoint *pNew; + pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, (u8)(pRtree->iDepth+1)); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + goto geopoly_filter_end; + } + pNew->id = 1; + pNew->iCell = 0; + pNew->eWithin = PARTLY_WITHIN; + assert( pCsr->bPoint==1 ); + pCsr->aNode[0] = pRoot; + pRoot = 0; + RTREE_QUEUE_TRACE(pCsr, "PUSH-Fm:"); + rc = rtreeStepToLeaf(pCsr); + } + } + +geopoly_filter_end: + nodeRelease(pRtree, pRoot); + rtreeRelease(pRtree); + return rc; +} + +/* +** Rtree virtual table module xBestIndex method. There are three +** table scan strategies to choose from (in order from most to +** least desirable): +** +** idxNum idxStr Strategy +** ------------------------------------------------ +** 1 "rowid" Direct lookup by rowid. +** 2 "rtree" R-tree overlap query using geopoly_overlap() +** 3 "rtree" R-tree within query using geopoly_within() +** 4 "fullscan" full-table scan. +** ------------------------------------------------ +*/ +static int geopolyBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + int ii; + int iRowidTerm = -1; + int iFuncTerm = -1; + int idxNum = 0; + + for(ii=0; iinConstraint; ii++){ + struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii]; + if( !p->usable ) continue; + if( p->iColumn<0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + iRowidTerm = ii; + break; + } + if( p->iColumn==0 && p->op>=SQLITE_INDEX_CONSTRAINT_FUNCTION ){ + /* p->op==SQLITE_INDEX_CONSTRAINT_FUNCTION for geopoly_overlap() + ** p->op==(SQLITE_INDEX_CONTRAINT_FUNCTION+1) for geopoly_within(). + ** See geopolyFindFunction() */ + iFuncTerm = ii; + idxNum = p->op - SQLITE_INDEX_CONSTRAINT_FUNCTION + 2; + } + } + + if( iRowidTerm>=0 ){ + pIdxInfo->idxNum = 1; + pIdxInfo->idxStr = "rowid"; + pIdxInfo->aConstraintUsage[iRowidTerm].argvIndex = 1; + pIdxInfo->aConstraintUsage[iRowidTerm].omit = 1; + pIdxInfo->estimatedCost = 30.0; + pIdxInfo->estimatedRows = 1; + pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE; + return SQLITE_OK; + } + if( iFuncTerm>=0 ){ + pIdxInfo->idxNum = idxNum; + pIdxInfo->idxStr = "rtree"; + pIdxInfo->aConstraintUsage[iFuncTerm].argvIndex = 1; + pIdxInfo->aConstraintUsage[iFuncTerm].omit = 0; + pIdxInfo->estimatedCost = 300.0; + pIdxInfo->estimatedRows = 10; + return SQLITE_OK; + } + pIdxInfo->idxNum = 4; + pIdxInfo->idxStr = "fullscan"; + pIdxInfo->estimatedCost = 3000000.0; + pIdxInfo->estimatedRows = 100000; + return SQLITE_OK; +} + + +/* +** GEOPOLY virtual table module xColumn method. +*/ +static int geopolyColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ + Rtree *pRtree = (Rtree *)cur->pVtab; + RtreeCursor *pCsr = (RtreeCursor *)cur; + RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr); + int rc = SQLITE_OK; + RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); + + if( rc ) return rc; + if( p==0 ) return SQLITE_OK; + if( i==0 && sqlite3_vtab_nochange(ctx) ) return SQLITE_OK; + if( i<=pRtree->nAux ){ + if( !pCsr->bAuxValid ){ + if( pCsr->pReadAux==0 ){ + rc = sqlite3_prepare_v3(pRtree->db, pRtree->zReadAuxSql, -1, 0, + &pCsr->pReadAux, 0); + if( rc ) return rc; + } + sqlite3_bind_int64(pCsr->pReadAux, 1, + nodeGetRowid(pRtree, pNode, p->iCell)); + rc = sqlite3_step(pCsr->pReadAux); + if( rc==SQLITE_ROW ){ + pCsr->bAuxValid = 1; + }else{ + sqlite3_reset(pCsr->pReadAux); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + return rc; + } + } + sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pReadAux, i+2)); + } + return SQLITE_OK; +} + + +/* +** The xUpdate method for GEOPOLY module virtual tables. +** +** For DELETE: +** +** argv[0] = the rowid to be deleted +** +** For INSERT: +** +** argv[0] = SQL NULL +** argv[1] = rowid to insert, or an SQL NULL to select automatically +** argv[2] = _shape column +** argv[3] = first application-defined column.... +** +** For UPDATE: +** +** argv[0] = rowid to modify. Never NULL +** argv[1] = rowid after the change. Never NULL +** argv[2] = new value for _shape +** argv[3] = new value for first application-defined column.... +*/ +static int geopolyUpdate( + sqlite3_vtab *pVtab, + int nData, + sqlite3_value **aData, + sqlite_int64 *pRowid +){ + Rtree *pRtree = (Rtree *)pVtab; + int rc = SQLITE_OK; + RtreeCell cell; /* New cell to insert if nData>1 */ + i64 oldRowid; /* The old rowid */ + int oldRowidValid; /* True if oldRowid is valid */ + i64 newRowid; /* The new rowid */ + int newRowidValid; /* True if newRowid is valid */ + int coordChange = 0; /* Change in coordinates */ + + if( pRtree->nNodeRef ){ + /* Unable to write to the btree while another cursor is reading from it, + ** since the write might do a rebalance which would disrupt the read + ** cursor. */ + return SQLITE_LOCKED_VTAB; + } + rtreeReference(pRtree); + assert(nData>=1); + + oldRowidValid = sqlite3_value_type(aData[0])!=SQLITE_NULL;; + oldRowid = oldRowidValid ? sqlite3_value_int64(aData[0]) : 0; + newRowidValid = nData>1 && sqlite3_value_type(aData[1])!=SQLITE_NULL; + newRowid = newRowidValid ? sqlite3_value_int64(aData[1]) : 0; + cell.iRowid = newRowid; + + if( nData>1 /* not a DELETE */ + && (!oldRowidValid /* INSERT */ + || !sqlite3_value_nochange(aData[2]) /* UPDATE _shape */ + || oldRowid!=newRowid) /* Rowid change */ + ){ + geopolyBBox(0, aData[2], cell.aCoord, &rc); + if( rc ){ + if( rc==SQLITE_ERROR ){ + pVtab->zErrMsg = + sqlite3_mprintf("_shape does not contain a valid polygon"); + } + goto geopoly_update_end; + } + coordChange = 1; + + /* If a rowid value was supplied, check if it is already present in + ** the table. If so, the constraint has failed. */ + if( newRowidValid && (!oldRowidValid || oldRowid!=newRowid) ){ + int steprc; + sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid); + steprc = sqlite3_step(pRtree->pReadRowid); + rc = sqlite3_reset(pRtree->pReadRowid); + if( SQLITE_ROW==steprc ){ + if( sqlite3_vtab_on_conflict(pRtree->db)==SQLITE_REPLACE ){ + rc = rtreeDeleteRowid(pRtree, cell.iRowid); + }else{ + rc = rtreeConstraintError(pRtree, 0); + } + } + } + } + + /* If aData[0] is not an SQL NULL value, it is the rowid of a + ** record to delete from the r-tree table. The following block does + ** just that. + */ + if( rc==SQLITE_OK && (nData==1 || (coordChange && oldRowidValid)) ){ + rc = rtreeDeleteRowid(pRtree, oldRowid); + } + + /* If the aData[] array contains more than one element, elements + ** (aData[2]..aData[argc-1]) contain a new record to insert into + ** the r-tree structure. + */ + if( rc==SQLITE_OK && nData>1 && coordChange ){ + /* Insert the new record into the r-tree */ + RtreeNode *pLeaf = 0; + if( !newRowidValid ){ + rc = rtreeNewRowid(pRtree, &cell.iRowid); + } + *pRowid = cell.iRowid; + if( rc==SQLITE_OK ){ + rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf); + } + if( rc==SQLITE_OK ){ + int rc2; + pRtree->iReinsertHeight = -1; + rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0); + rc2 = nodeRelease(pRtree, pLeaf); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + + /* Change the data */ + if( rc==SQLITE_OK && nData>1 ){ + sqlite3_stmt *pUp = pRtree->pWriteAux; + int jj; + int nChange = 0; + sqlite3_bind_int64(pUp, 1, cell.iRowid); + assert( pRtree->nAux>=1 ); + if( sqlite3_value_nochange(aData[2]) ){ + sqlite3_bind_null(pUp, 2); + }else{ + GeoPoly *p = 0; + if( sqlite3_value_type(aData[2])==SQLITE_TEXT + && (p = geopolyFuncParam(0, aData[2], &rc))!=0 + && rc==SQLITE_OK + ){ + sqlite3_bind_blob(pUp, 2, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); + }else{ + sqlite3_bind_value(pUp, 2, aData[2]); + } + sqlite3_free(p); + nChange = 1; + } + for(jj=1; jjnAux; jj++){ + nChange++; + sqlite3_bind_value(pUp, jj+2, aData[jj+2]); + } + if( nChange ){ + sqlite3_step(pUp); + rc = sqlite3_reset(pUp); + } + } + +geopoly_update_end: + rtreeRelease(pRtree); + return rc; +} + +/* +** Report that geopoly_overlap() is an overloaded function suitable +** for use in xBestIndex. +*/ +static int geopolyFindFunction( + sqlite3_vtab *pVtab, + int nArg, + const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg +){ + if( sqlite3_stricmp(zName, "geopoly_overlap")==0 ){ + *pxFunc = geopolyOverlapFunc; + *ppArg = 0; + return SQLITE_INDEX_CONSTRAINT_FUNCTION; + } + if( sqlite3_stricmp(zName, "geopoly_within")==0 ){ + *pxFunc = geopolyWithinFunc; + *ppArg = 0; + return SQLITE_INDEX_CONSTRAINT_FUNCTION+1; + } + return 0; +} + + +static sqlite3_module geopolyModule = { + 3, /* iVersion */ + geopolyCreate, /* xCreate - create a table */ + geopolyConnect, /* xConnect - connect to an existing table */ + geopolyBestIndex, /* xBestIndex - Determine search strategy */ + rtreeDisconnect, /* xDisconnect - Disconnect from a table */ + rtreeDestroy, /* xDestroy - Drop a table */ + rtreeOpen, /* xOpen - open a cursor */ + rtreeClose, /* xClose - close a cursor */ + geopolyFilter, /* xFilter - configure scan constraints */ + rtreeNext, /* xNext - advance a cursor */ + rtreeEof, /* xEof */ + geopolyColumn, /* xColumn - read data */ + rtreeRowid, /* xRowid - read data */ + geopolyUpdate, /* xUpdate - write data */ + rtreeBeginTransaction, /* xBegin - begin transaction */ + rtreeEndTransaction, /* xSync - sync transaction */ + rtreeEndTransaction, /* xCommit - commit transaction */ + rtreeEndTransaction, /* xRollback - rollback transaction */ + geopolyFindFunction, /* xFindFunction - function overloading */ + rtreeRename, /* xRename - rename the table */ + rtreeSavepoint, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + rtreeShadowName /* xShadowName */ +}; + +static int sqlite3_geopoly_init(sqlite3 *db){ + int rc = SQLITE_OK; + static const struct { + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + signed char nArg; + unsigned char bPure; + const char *zName; + } aFunc[] = { + { geopolyAreaFunc, 1, 1, "geopoly_area" }, + { geopolyBlobFunc, 1, 1, "geopoly_blob" }, + { geopolyJsonFunc, 1, 1, "geopoly_json" }, + { geopolySvgFunc, -1, 1, "geopoly_svg" }, + { geopolyWithinFunc, 2, 1, "geopoly_within" }, + { geopolyContainsPointFunc, 3, 1, "geopoly_contains_point" }, + { geopolyOverlapFunc, 2, 1, "geopoly_overlap" }, + { geopolyDebugFunc, 1, 0, "geopoly_debug" }, + { geopolyBBoxFunc, 1, 1, "geopoly_bbox" }, + { geopolyXformFunc, 7, 1, "geopoly_xform" }, + { geopolyRegularFunc, 4, 1, "geopoly_regular" }, + { geopolyCcwFunc, 1, 1, "geopoly_ccw" }, + }; + static const struct { + void (*xStep)(sqlite3_context*,int,sqlite3_value**); + void (*xFinal)(sqlite3_context*); + const char *zName; + } aAgg[] = { + { geopolyBBoxStep, geopolyBBoxFinal, "geopoly_group_bbox" }, + }; + int i; + for(i=0; ixDestructor ) pInfo->xDestructor(pInfo->pContext); + sqlite3_free(p); +} + +/* +** This routine frees the BLOB that is returned by geomCallback(). +*/ +static void rtreeMatchArgFree(void *pArg){ + int i; + RtreeMatchArg *p = (RtreeMatchArg*)pArg; + for(i=0; inParam; i++){ + sqlite3_value_free(p->apSqlParam[i]); + } + sqlite3_free(p); +} + +/* +** Each call to sqlite3_rtree_geometry_callback() or +** sqlite3_rtree_query_callback() creates an ordinary SQLite +** scalar function that is implemented by this routine. +** +** All this function does is construct an RtreeMatchArg object that +** contains the geometry-checking callback routines and a list of +** parameters to this function, then return that RtreeMatchArg object +** as a BLOB. +** +** The R-Tree MATCH operator will read the returned BLOB, deserialize +** the RtreeMatchArg object, and use the RtreeMatchArg object to figure +** out which elements of the R-Tree should be returned by the query. +*/ +static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ + RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx); + RtreeMatchArg *pBlob; + sqlite3_int64 nBlob; + int memErr = 0; + + nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue) + + nArg*sizeof(sqlite3_value*); + pBlob = (RtreeMatchArg *)sqlite3_malloc64(nBlob); + if( !pBlob ){ + sqlite3_result_error_nomem(ctx); + }else{ + int i; + pBlob->iSize = nBlob; + pBlob->cb = pGeomCtx[0]; + pBlob->apSqlParam = (sqlite3_value**)&pBlob->aParam[nArg]; + pBlob->nParam = nArg; + for(i=0; iapSqlParam[i] = sqlite3_value_dup(aArg[i]); + if( pBlob->apSqlParam[i]==0 ) memErr = 1; +#ifdef SQLITE_RTREE_INT_ONLY + pBlob->aParam[i] = sqlite3_value_int64(aArg[i]); +#else + pBlob->aParam[i] = sqlite3_value_double(aArg[i]); +#endif + } + if( memErr ){ + sqlite3_result_error_nomem(ctx); + rtreeMatchArgFree(pBlob); + }else{ + sqlite3_result_pointer(ctx, pBlob, "RtreeMatchArg", rtreeMatchArgFree); + } + } +} + +/* +** Register a new geometry function for use with the r-tree MATCH operator. +*/ +SQLITE_API int sqlite3_rtree_geometry_callback( + sqlite3 *db, /* Register SQL function on this connection */ + const char *zGeom, /* Name of the new SQL function */ + int (*xGeom)(sqlite3_rtree_geometry*,int,RtreeDValue*,int*), /* Callback */ + void *pContext /* Extra data associated with the callback */ +){ + RtreeGeomCallback *pGeomCtx; /* Context object for new user-function */ + + /* Allocate and populate the context object. */ + pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback)); + if( !pGeomCtx ) return SQLITE_NOMEM; + pGeomCtx->xGeom = xGeom; + pGeomCtx->xQueryFunc = 0; + pGeomCtx->xDestructor = 0; + pGeomCtx->pContext = pContext; + return sqlite3_create_function_v2(db, zGeom, -1, SQLITE_ANY, + (void *)pGeomCtx, geomCallback, 0, 0, rtreeFreeCallback + ); +} + +/* +** Register a new 2nd-generation geometry function for use with the +** r-tree MATCH operator. +*/ +SQLITE_API int sqlite3_rtree_query_callback( + sqlite3 *db, /* Register SQL function on this connection */ + const char *zQueryFunc, /* Name of new SQL function */ + int (*xQueryFunc)(sqlite3_rtree_query_info*), /* Callback */ + void *pContext, /* Extra data passed into the callback */ + void (*xDestructor)(void*) /* Destructor for the extra data */ +){ + RtreeGeomCallback *pGeomCtx; /* Context object for new user-function */ + + /* Allocate and populate the context object. */ + pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback)); + if( !pGeomCtx ) return SQLITE_NOMEM; + pGeomCtx->xGeom = 0; + pGeomCtx->xQueryFunc = xQueryFunc; + pGeomCtx->xDestructor = xDestructor; + pGeomCtx->pContext = pContext; + return sqlite3_create_function_v2(db, zQueryFunc, -1, SQLITE_ANY, + (void *)pGeomCtx, geomCallback, 0, 0, rtreeFreeCallback + ); +} + +#if !SQLITE_CORE +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_rtree_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3RtreeInit(db); +} +#endif + +#endif + +/************** End of rtree.c ***********************************************/ +/************** Begin file icu.c *********************************************/ +/* +** 2007 May 6 +** +** 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. +** +************************************************************************* +** $Id: icu.c,v 1.7 2007/12/13 21:54:11 drh Exp $ +** +** This file implements an integration between the ICU library +** ("International Components for Unicode", an open-source library +** for handling unicode data) and SQLite. The integration uses +** ICU to provide the following to SQLite: +** +** * An implementation of the SQL regexp() function (and hence REGEXP +** operator) using the ICU uregex_XX() APIs. +** +** * Implementations of the SQL scalar upper() and lower() functions +** for case mapping. +** +** * Integration of ICU and SQLite collation sequences. +** +** * An implementation of the LIKE operator that uses ICU to +** provide case-independent matching. +*/ + +#if !defined(SQLITE_CORE) \ + || defined(SQLITE_ENABLE_ICU) \ + || defined(SQLITE_ENABLE_ICU_COLLATIONS) + +/* Include ICU headers */ +#include +#include +#include +#include + +/* #include */ + +#ifndef SQLITE_CORE +/* #include "sqlite3ext.h" */ + SQLITE_EXTENSION_INIT1 +#else +/* #include "sqlite3.h" */ +#endif + +/* +** This function is called when an ICU function called from within +** the implementation of an SQL scalar function returns an error. +** +** The scalar function context passed as the first argument is +** loaded with an error message based on the following two args. +*/ +static void icuFunctionError( + sqlite3_context *pCtx, /* SQLite scalar function context */ + const char *zName, /* Name of ICU function that failed */ + UErrorCode e /* Error code returned by ICU function */ +){ + char zBuf[128]; + sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e)); + zBuf[127] = '\0'; + sqlite3_result_error(pCtx, zBuf, -1); +} + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) + +/* +** Maximum length (in bytes) of the pattern in a LIKE or GLOB +** operator. +*/ +#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH +# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#endif + +/* +** Version of sqlite3_free() that is always a function, never a macro. +*/ +static void xFree(void *p){ + sqlite3_free(p); +} + +/* +** This lookup table is used to help decode the first byte of +** a multi-byte UTF8 character. It is copied here from SQLite source +** code file utf8.c. +*/ +static const unsigned char icuUtf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + +#define SQLITE_ICU_READ_UTF8(zIn, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = icuUtf8Trans1[c-0xc0]; \ + while( (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + } + +#define SQLITE_ICU_SKIP_UTF8(zIn) \ + assert( *zIn ); \ + if( *(zIn++)>=0xc0 ){ \ + while( (*zIn & 0xc0)==0x80 ){zIn++;} \ + } + + +/* +** Compare two UTF-8 strings for equality where the first string is +** a "LIKE" expression. Return true (1) if they are the same and +** false (0) if they are different. +*/ +static int icuLikeCompare( + const uint8_t *zPattern, /* LIKE pattern */ + const uint8_t *zString, /* The UTF-8 string to compare against */ + const UChar32 uEsc /* The escape character */ +){ + static const uint32_t MATCH_ONE = (uint32_t)'_'; + static const uint32_t MATCH_ALL = (uint32_t)'%'; + + int prevEscape = 0; /* True if the previous character was uEsc */ + + while( 1 ){ + + /* Read (and consume) the next character from the input pattern. */ + uint32_t uPattern; + SQLITE_ICU_READ_UTF8(zPattern, uPattern); + if( uPattern==0 ) break; + + /* There are now 4 possibilities: + ** + ** 1. uPattern is an unescaped match-all character "%", + ** 2. uPattern is an unescaped match-one character "_", + ** 3. uPattern is an unescaped escape character, or + ** 4. uPattern is to be handled as an ordinary character + */ + if( uPattern==MATCH_ALL && !prevEscape && uPattern!=(uint32_t)uEsc ){ + /* Case 1. */ + uint8_t c; + + /* Skip any MATCH_ALL or MATCH_ONE characters that follow a + ** MATCH_ALL. For each MATCH_ONE, skip one character in the + ** test string. + */ + while( (c=*zPattern) == MATCH_ALL || c == MATCH_ONE ){ + if( c==MATCH_ONE ){ + if( *zString==0 ) return 0; + SQLITE_ICU_SKIP_UTF8(zString); + } + zPattern++; + } + + if( *zPattern==0 ) return 1; + + while( *zString ){ + if( icuLikeCompare(zPattern, zString, uEsc) ){ + return 1; + } + SQLITE_ICU_SKIP_UTF8(zString); + } + return 0; + + }else if( uPattern==MATCH_ONE && !prevEscape && uPattern!=(uint32_t)uEsc ){ + /* Case 2. */ + if( *zString==0 ) return 0; + SQLITE_ICU_SKIP_UTF8(zString); + + }else if( uPattern==(uint32_t)uEsc && !prevEscape ){ + /* Case 3. */ + prevEscape = 1; + + }else{ + /* Case 4. */ + uint32_t uString; + SQLITE_ICU_READ_UTF8(zString, uString); + uString = (uint32_t)u_foldCase((UChar32)uString, U_FOLD_CASE_DEFAULT); + uPattern = (uint32_t)u_foldCase((UChar32)uPattern, U_FOLD_CASE_DEFAULT); + if( uString!=uPattern ){ + return 0; + } + prevEscape = 0; + } + } + + return *zString==0; +} + +/* +** Implementation of the like() SQL function. This function implements +** the build-in LIKE operator. The first argument to the function is the +** pattern and the second argument is the string. So, the SQL statements: +** +** A LIKE B +** +** is implemented as like(B, A). If there is an escape character E, +** +** A LIKE B ESCAPE E +** +** is mapped to like(B, A, E). +*/ +static void icuLikeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zA = sqlite3_value_text(argv[0]); + const unsigned char *zB = sqlite3_value_text(argv[1]); + UChar32 uEsc = 0; + + /* Limit the length of the LIKE or GLOB pattern to avoid problems + ** of deep recursion and N*N behavior in patternCompare(). + */ + if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){ + sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); + return; + } + + + if( argc==3 ){ + /* The escape character string must consist of a single UTF-8 character. + ** Otherwise, return an error. + */ + int nE= sqlite3_value_bytes(argv[2]); + const unsigned char *zE = sqlite3_value_text(argv[2]); + int i = 0; + if( zE==0 ) return; + U8_NEXT(zE, i, nE, uEsc); + if( i!=nE){ + sqlite3_result_error(context, + "ESCAPE expression must be a single character", -1); + return; + } + } + + if( zA && zB ){ + sqlite3_result_int(context, icuLikeCompare(zA, zB, uEsc)); + } +} + +/* +** Function to delete compiled regexp objects. Registered as +** a destructor function with sqlite3_set_auxdata(). +*/ +static void icuRegexpDelete(void *p){ + URegularExpression *pExpr = (URegularExpression *)p; + uregex_close(pExpr); +} + +/* +** Implementation of SQLite REGEXP operator. This scalar function takes +** two arguments. The first is a regular expression pattern to compile +** the second is a string to match against that pattern. If either +** argument is an SQL NULL, then NULL Is returned. Otherwise, the result +** is 1 if the string matches the pattern, or 0 otherwise. +** +** SQLite maps the regexp() function to the regexp() operator such +** that the following two are equivalent: +** +** zString REGEXP zPattern +** regexp(zPattern, zString) +** +** Uses the following ICU regexp APIs: +** +** uregex_open() +** uregex_matches() +** uregex_close() +*/ +static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ + UErrorCode status = U_ZERO_ERROR; + URegularExpression *pExpr; + UBool res; + const UChar *zString = sqlite3_value_text16(apArg[1]); + + (void)nArg; /* Unused parameter */ + + /* If the left hand side of the regexp operator is NULL, + ** then the result is also NULL. + */ + if( !zString ){ + return; + } + + pExpr = sqlite3_get_auxdata(p, 0); + if( !pExpr ){ + const UChar *zPattern = sqlite3_value_text16(apArg[0]); + if( !zPattern ){ + return; + } + pExpr = uregex_open(zPattern, -1, 0, 0, &status); + + if( U_SUCCESS(status) ){ + sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete); + }else{ + assert(!pExpr); + icuFunctionError(p, "uregex_open", status); + return; + } + } + + /* Configure the text that the regular expression operates on. */ + uregex_setText(pExpr, zString, -1, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "uregex_setText", status); + return; + } + + /* Attempt the match */ + res = uregex_matches(pExpr, 0, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "uregex_matches", status); + return; + } + + /* Set the text that the regular expression operates on to a NULL + ** pointer. This is not really necessary, but it is tidier than + ** leaving the regular expression object configured with an invalid + ** pointer after this function returns. + */ + uregex_setText(pExpr, 0, 0, &status); + + /* Return 1 or 0. */ + sqlite3_result_int(p, res ? 1 : 0); +} + +/* +** Implementations of scalar functions for case mapping - upper() and +** lower(). Function upper() converts its input to upper-case (ABC). +** Function lower() converts to lower-case (abc). +** +** ICU provides two types of case mapping, "general" case mapping and +** "language specific". Refer to ICU documentation for the differences +** between the two. +** +** To utilise "general" case mapping, the upper() or lower() scalar +** functions are invoked with one argument: +** +** upper('ABC') -> 'abc' +** lower('abc') -> 'ABC' +** +** To access ICU "language specific" case mapping, upper() or lower() +** should be invoked with two arguments. The second argument is the name +** of the locale to use. Passing an empty string ("") or SQL NULL value +** as the second argument is the same as invoking the 1 argument version +** of upper() or lower(). +** +** lower('I', 'en_us') -> 'i' +** lower('I', 'tr_tr') -> '\u131' (small dotless i) +** +** http://www.icu-project.org/userguide/posix.html#case_mappings +*/ +static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ + const UChar *zInput; /* Pointer to input string */ + UChar *zOutput = 0; /* Pointer to output buffer */ + int nInput; /* Size of utf-16 input string in bytes */ + int nOut; /* Size of output buffer in bytes */ + int cnt; + int bToUpper; /* True for toupper(), false for tolower() */ + UErrorCode status; + const char *zLocale = 0; + + assert(nArg==1 || nArg==2); + bToUpper = (sqlite3_user_data(p)!=0); + if( nArg==2 ){ + zLocale = (const char *)sqlite3_value_text(apArg[1]); + } + + zInput = sqlite3_value_text16(apArg[0]); + if( !zInput ){ + return; + } + nOut = nInput = sqlite3_value_bytes16(apArg[0]); + if( nOut==0 ){ + sqlite3_result_text16(p, "", 0, SQLITE_STATIC); + return; + } + + for(cnt=0; cnt<2; cnt++){ + UChar *zNew = sqlite3_realloc(zOutput, nOut); + if( zNew==0 ){ + sqlite3_free(zOutput); + sqlite3_result_error_nomem(p); + return; + } + zOutput = zNew; + status = U_ZERO_ERROR; + if( bToUpper ){ + nOut = 2*u_strToUpper(zOutput,nOut/2,zInput,nInput/2,zLocale,&status); + }else{ + nOut = 2*u_strToLower(zOutput,nOut/2,zInput,nInput/2,zLocale,&status); + } + + if( U_SUCCESS(status) ){ + sqlite3_result_text16(p, zOutput, nOut, xFree); + }else if( status==U_BUFFER_OVERFLOW_ERROR ){ + assert( cnt==0 ); + continue; + }else{ + icuFunctionError(p, bToUpper ? "u_strToUpper" : "u_strToLower", status); + } + return; + } + assert( 0 ); /* Unreachable */ +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */ + +/* +** Collation sequence destructor function. The pCtx argument points to +** a UCollator structure previously allocated using ucol_open(). +*/ +static void icuCollationDel(void *pCtx){ + UCollator *p = (UCollator *)pCtx; + ucol_close(p); +} + +/* +** Collation sequence comparison function. The pCtx argument points to +** a UCollator structure previously allocated using ucol_open(). +*/ +static int icuCollationColl( + void *pCtx, + int nLeft, + const void *zLeft, + int nRight, + const void *zRight +){ + UCollationResult res; + UCollator *p = (UCollator *)pCtx; + res = ucol_strcoll(p, (UChar *)zLeft, nLeft/2, (UChar *)zRight, nRight/2); + switch( res ){ + case UCOL_LESS: return -1; + case UCOL_GREATER: return +1; + case UCOL_EQUAL: return 0; + } + assert(!"Unexpected return value from ucol_strcoll()"); + return 0; +} + +/* +** Implementation of the scalar function icu_load_collation(). +** +** This scalar function is used to add ICU collation based collation +** types to an SQLite database connection. It is intended to be called +** as follows: +** +** SELECT icu_load_collation(, ); +** +** Where is a string containing an ICU locale identifier (i.e. +** "en_AU", "tr_TR" etc.) and is the name of the +** collation sequence to create. +*/ +static void icuLoadCollation( + sqlite3_context *p, + int nArg, + sqlite3_value **apArg +){ + sqlite3 *db = (sqlite3 *)sqlite3_user_data(p); + UErrorCode status = U_ZERO_ERROR; + const char *zLocale; /* Locale identifier - (eg. "jp_JP") */ + const char *zName; /* SQL Collation sequence name (eg. "japanese") */ + UCollator *pUCollator; /* ICU library collation object */ + int rc; /* Return code from sqlite3_create_collation_x() */ + + assert(nArg==2); + (void)nArg; /* Unused parameter */ + zLocale = (const char *)sqlite3_value_text(apArg[0]); + zName = (const char *)sqlite3_value_text(apArg[1]); + + if( !zLocale || !zName ){ + return; + } + + pUCollator = ucol_open(zLocale, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "ucol_open", status); + return; + } + assert(p); + + rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator, + icuCollationColl, icuCollationDel + ); + if( rc!=SQLITE_OK ){ + ucol_close(pUCollator); + sqlite3_result_error(p, "Error registering collation function", -1); + } +} + +/* +** Register the ICU extension functions with database db. +*/ +SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){ +# define SQLITEICU_EXTRAFLAGS (SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS) + static const struct IcuScalar { + const char *zName; /* Function name */ + unsigned char nArg; /* Number of arguments */ + unsigned int enc; /* Optimal text encoding */ + unsigned char iContext; /* sqlite3_user_data() context */ + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } scalars[] = { + {"icu_load_collation",2,SQLITE_UTF8|SQLITE_DIRECTONLY,1, icuLoadCollation}, +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) + {"regexp", 2, SQLITE_ANY|SQLITEICU_EXTRAFLAGS, 0, icuRegexpFunc}, + {"lower", 1, SQLITE_UTF16|SQLITEICU_EXTRAFLAGS, 0, icuCaseFunc16}, + {"lower", 2, SQLITE_UTF16|SQLITEICU_EXTRAFLAGS, 0, icuCaseFunc16}, + {"upper", 1, SQLITE_UTF16|SQLITEICU_EXTRAFLAGS, 1, icuCaseFunc16}, + {"upper", 2, SQLITE_UTF16|SQLITEICU_EXTRAFLAGS, 1, icuCaseFunc16}, + {"lower", 1, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 0, icuCaseFunc16}, + {"lower", 2, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 0, icuCaseFunc16}, + {"upper", 1, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 1, icuCaseFunc16}, + {"upper", 2, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 1, icuCaseFunc16}, + {"like", 2, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 0, icuLikeFunc}, + {"like", 3, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 0, icuLikeFunc}, +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */ + }; + int rc = SQLITE_OK; + int i; + + for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ + const struct IcuScalar *p = &scalars[i]; + rc = sqlite3_create_function( + db, p->zName, p->nArg, p->enc, + p->iContext ? (void*)db : (void*)0, + p->xFunc, 0, 0 + ); + } + + return rc; +} + +#if !SQLITE_CORE +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_icu_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3IcuInit(db); +} +#endif + +#endif + +/************** End of icu.c *************************************************/ +/************** Begin file fts3_icu.c ****************************************/ +/* +** 2007 June 22 +** +** 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 implements a tokenizer for fts3 based on the ICU library. +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) +#ifdef SQLITE_ENABLE_ICU + +/* #include */ +/* #include */ +/* #include "fts3_tokenizer.h" */ + +#include +/* #include */ +/* #include */ +#include + +typedef struct IcuTokenizer IcuTokenizer; +typedef struct IcuCursor IcuCursor; + +struct IcuTokenizer { + sqlite3_tokenizer base; + char *zLocale; +}; + +struct IcuCursor { + sqlite3_tokenizer_cursor base; + + UBreakIterator *pIter; /* ICU break-iterator object */ + int nChar; /* Number of UChar elements in pInput */ + UChar *aChar; /* Copy of input using utf-16 encoding */ + int *aOffset; /* Offsets of each character in utf-8 input */ + + int nBuffer; + char *zBuffer; + + int iToken; +}; + +/* +** Create a new tokenizer instance. +*/ +static int icuCreate( + int argc, /* Number of entries in argv[] */ + const char * const *argv, /* Tokenizer creation arguments */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ +){ + IcuTokenizer *p; + int n = 0; + + if( argc>0 ){ + n = strlen(argv[0])+1; + } + p = (IcuTokenizer *)sqlite3_malloc64(sizeof(IcuTokenizer)+n); + if( !p ){ + return SQLITE_NOMEM; + } + memset(p, 0, sizeof(IcuTokenizer)); + + if( n ){ + p->zLocale = (char *)&p[1]; + memcpy(p->zLocale, argv[0], n); + } + + *ppTokenizer = (sqlite3_tokenizer *)p; + + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int icuDestroy(sqlite3_tokenizer *pTokenizer){ + IcuTokenizer *p = (IcuTokenizer *)pTokenizer; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int icuOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, /* Input string */ + int nInput, /* Length of zInput in bytes */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + IcuTokenizer *p = (IcuTokenizer *)pTokenizer; + IcuCursor *pCsr; + + const int32_t opt = U_FOLD_CASE_DEFAULT; + UErrorCode status = U_ZERO_ERROR; + int nChar; + + UChar32 c; + int iInput = 0; + int iOut = 0; + + *ppCursor = 0; + + if( zInput==0 ){ + nInput = 0; + zInput = ""; + }else if( nInput<0 ){ + nInput = strlen(zInput); + } + nChar = nInput+1; + pCsr = (IcuCursor *)sqlite3_malloc64( + sizeof(IcuCursor) + /* IcuCursor */ + ((nChar+3)&~3) * sizeof(UChar) + /* IcuCursor.aChar[] */ + (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ + ); + if( !pCsr ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(IcuCursor)); + pCsr->aChar = (UChar *)&pCsr[1]; + pCsr->aOffset = (int *)&pCsr->aChar[(nChar+3)&~3]; + + pCsr->aOffset[iOut] = iInput; + U8_NEXT(zInput, iInput, nInput, c); + while( c>0 ){ + int isError = 0; + c = u_foldCase(c, opt); + U16_APPEND(pCsr->aChar, iOut, nChar, c, isError); + if( isError ){ + sqlite3_free(pCsr); + return SQLITE_ERROR; + } + pCsr->aOffset[iOut] = iInput; + + if( iInputpIter = ubrk_open(UBRK_WORD, p->zLocale, pCsr->aChar, iOut, &status); + if( !U_SUCCESS(status) ){ + sqlite3_free(pCsr); + return SQLITE_ERROR; + } + pCsr->nChar = iOut; + + ubrk_first(pCsr->pIter); + *ppCursor = (sqlite3_tokenizer_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to icuOpen(). +*/ +static int icuClose(sqlite3_tokenizer_cursor *pCursor){ + IcuCursor *pCsr = (IcuCursor *)pCursor; + ubrk_close(pCsr->pIter); + sqlite3_free(pCsr->zBuffer); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. +*/ +static int icuNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ + const char **ppToken, /* OUT: *ppToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + IcuCursor *pCsr = (IcuCursor *)pCursor; + + int iStart = 0; + int iEnd = 0; + int nByte = 0; + + while( iStart==iEnd ){ + UChar32 c; + + iStart = ubrk_current(pCsr->pIter); + iEnd = ubrk_next(pCsr->pIter); + if( iEnd==UBRK_DONE ){ + return SQLITE_DONE; + } + + while( iStartaChar, iWhite, pCsr->nChar, c); + if( u_isspace(c) ){ + iStart = iWhite; + }else{ + break; + } + } + assert(iStart<=iEnd); + } + + do { + UErrorCode status = U_ZERO_ERROR; + if( nByte ){ + char *zNew = sqlite3_realloc(pCsr->zBuffer, nByte); + if( !zNew ){ + return SQLITE_NOMEM; + } + pCsr->zBuffer = zNew; + pCsr->nBuffer = nByte; + } + + u_strToUTF8( + pCsr->zBuffer, pCsr->nBuffer, &nByte, /* Output vars */ + &pCsr->aChar[iStart], iEnd-iStart, /* Input vars */ + &status /* Output success/failure */ + ); + } while( nByte>pCsr->nBuffer ); + + *ppToken = pCsr->zBuffer; + *pnBytes = nByte; + *piStartOffset = pCsr->aOffset[iStart]; + *piEndOffset = pCsr->aOffset[iEnd]; + *piPosition = pCsr->iToken++; + + return SQLITE_OK; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module icuTokenizerModule = { + 0, /* iVersion */ + icuCreate, /* xCreate */ + icuDestroy, /* xCreate */ + icuOpen, /* xOpen */ + icuClose, /* xClose */ + icuNext, /* xNext */ + 0, /* xLanguageid */ +}; + +/* +** Set *ppModule to point at the implementation of the ICU tokenizer. +*/ +SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &icuTokenizerModule; +} + +#endif /* defined(SQLITE_ENABLE_ICU) */ +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_icu.c ********************************************/ +/************** Begin file sqlite3rbu.c **************************************/ +/* +** 2014 August 30 +** +** 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. +** +************************************************************************* +** +** +** OVERVIEW +** +** The RBU extension requires that the RBU update be packaged as an +** SQLite database. The tables it expects to find are described in +** sqlite3rbu.h. Essentially, for each table xyz in the target database +** that the user wishes to write to, a corresponding data_xyz table is +** created in the RBU database and populated with one row for each row to +** update, insert or delete from the target table. +** +** The update proceeds in three stages: +** +** 1) The database is updated. The modified database pages are written +** to a *-oal file. A *-oal file is just like a *-wal file, except +** that it is named "-oal" instead of "-wal". +** Because regular SQLite clients do not look for file named +** "-oal", they go on using the original database in +** rollback mode while the *-oal file is being generated. +** +** During this stage RBU does not update the database by writing +** directly to the target tables. Instead it creates "imposter" +** tables using the SQLITE_TESTCTRL_IMPOSTER interface that it uses +** to update each b-tree individually. All updates required by each +** b-tree are completed before moving on to the next, and all +** updates are done in sorted key order. +** +** 2) The "-oal" file is moved to the equivalent "-wal" +** location using a call to rename(2). Before doing this the RBU +** module takes an EXCLUSIVE lock on the database file, ensuring +** that there are no other active readers. +** +** Once the EXCLUSIVE lock is released, any other database readers +** detect the new *-wal file and read the database in wal mode. At +** this point they see the new version of the database - including +** the updates made as part of the RBU update. +** +** 3) The new *-wal file is checkpointed. This proceeds in the same way +** as a regular database checkpoint, except that a single frame is +** checkpointed each time sqlite3rbu_step() is called. If the RBU +** handle is closed before the entire *-wal file is checkpointed, +** the checkpoint progress is saved in the RBU database and the +** checkpoint can be resumed by another RBU client at some point in +** the future. +** +** POTENTIAL PROBLEMS +** +** The rename() call might not be portable. And RBU is not currently +** syncing the directory after renaming the file. +** +** When state is saved, any commit to the *-oal file and the commit to +** the RBU update database are not atomic. So if the power fails at the +** wrong moment they might get out of sync. As the main database will be +** committed before the RBU update database this will likely either just +** pass unnoticed, or result in SQLITE_CONSTRAINT errors (due to UNIQUE +** constraint violations). +** +** If some client does modify the target database mid RBU update, or some +** other error occurs, the RBU extension will keep throwing errors. It's +** not really clear how to get out of this state. The system could just +** by delete the RBU update database and *-oal file and have the device +** download the update again and start over. +** +** At present, for an UPDATE, both the new.* and old.* records are +** collected in the rbu_xyz table. And for both UPDATEs and DELETEs all +** fields are collected. This means we're probably writing a lot more +** data to disk when saving the state of an ongoing update to the RBU +** update database than is strictly necessary. +** +*/ + +/* #include */ +/* #include */ +/* #include */ + +/* #include "sqlite3.h" */ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RBU) +/************** Include sqlite3rbu.h in the middle of sqlite3rbu.c ***********/ +/************** Begin file sqlite3rbu.h **************************************/ +/* +** 2014 August 30 +** +** 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 the public interface for the RBU extension. +*/ + +/* +** SUMMARY +** +** Writing a transaction containing a large number of operations on +** b-tree indexes that are collectively larger than the available cache +** memory can be very inefficient. +** +** The problem is that in order to update a b-tree, the leaf page (at least) +** containing the entry being inserted or deleted must be modified. If the +** working set of leaves is larger than the available cache memory, then a +** single leaf that is modified more than once as part of the transaction +** may be loaded from or written to the persistent media multiple times. +** Additionally, because the index updates are likely to be applied in +** random order, access to pages within the database is also likely to be in +** random order, which is itself quite inefficient. +** +** One way to improve the situation is to sort the operations on each index +** by index key before applying them to the b-tree. This leads to an IO +** pattern that resembles a single linear scan through the index b-tree, +** and all but guarantees each modified leaf page is loaded and stored +** exactly once. SQLite uses this trick to improve the performance of +** CREATE INDEX commands. This extension allows it to be used to improve +** the performance of large transactions on existing databases. +** +** Additionally, this extension allows the work involved in writing the +** large transaction to be broken down into sub-transactions performed +** sequentially by separate processes. This is useful if the system cannot +** guarantee that a single update process will run for long enough to apply +** the entire update, for example because the update is being applied on a +** mobile device that is frequently rebooted. Even after the writer process +** has committed one or more sub-transactions, other database clients continue +** to read from the original database snapshot. In other words, partially +** applied transactions are not visible to other clients. +** +** "RBU" stands for "Resumable Bulk Update". As in a large database update +** transmitted via a wireless network to a mobile device. A transaction +** applied using this extension is hence refered to as an "RBU update". +** +** +** LIMITATIONS +** +** An "RBU update" transaction is subject to the following limitations: +** +** * The transaction must consist of INSERT, UPDATE and DELETE operations +** only. +** +** * INSERT statements may not use any default values. +** +** * UPDATE and DELETE statements must identify their target rows by +** non-NULL PRIMARY KEY values. Rows with NULL values stored in PRIMARY +** KEY fields may not be updated or deleted. If the table being written +** has no PRIMARY KEY, affected rows must be identified by rowid. +** +** * UPDATE statements may not modify PRIMARY KEY columns. +** +** * No triggers will be fired. +** +** * No foreign key violations are detected or reported. +** +** * CHECK constraints are not enforced. +** +** * No constraint handling mode except for "OR ROLLBACK" is supported. +** +** +** PREPARATION +** +** An "RBU update" is stored as a separate SQLite database. A database +** containing an RBU update is an "RBU database". For each table in the +** target database to be updated, the RBU database should contain a table +** named "data_" containing the same set of columns as the +** target table, and one more - "rbu_control". The data_% table should +** have no PRIMARY KEY or UNIQUE constraints, but each column should have +** the same type as the corresponding column in the target database. +** The "rbu_control" column should have no type at all. For example, if +** the target database contains: +** +** CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c UNIQUE); +** +** Then the RBU database should contain: +** +** CREATE TABLE data_t1(a INTEGER, b TEXT, c, rbu_control); +** +** The order of the columns in the data_% table does not matter. +** +** Instead of a regular table, the RBU database may also contain virtual +** tables or view named using the data_ naming scheme. +** +** Instead of the plain data_ naming scheme, RBU database tables +** may also be named data_, where is any sequence +** of zero or more numeric characters (0-9). This can be significant because +** tables within the RBU database are always processed in order sorted by +** name. By judicious selection of the portion of the names +** of the RBU tables the user can therefore control the order in which they +** are processed. This can be useful, for example, to ensure that "external +** content" FTS4 tables are updated before their underlying content tables. +** +** If the target database table is a virtual table or a table that has no +** PRIMARY KEY declaration, the data_% table must also contain a column +** named "rbu_rowid". This column is mapped to the tables implicit primary +** key column - "rowid". Virtual tables for which the "rowid" column does +** not function like a primary key value cannot be updated using RBU. For +** example, if the target db contains either of the following: +** +** CREATE VIRTUAL TABLE x1 USING fts3(a, b); +** CREATE TABLE x1(a, b) +** +** then the RBU database should contain: +** +** CREATE TABLE data_x1(a, b, rbu_rowid, rbu_control); +** +** All non-hidden columns (i.e. all columns matched by "SELECT *") of the +** target table must be present in the input table. For virtual tables, +** hidden columns are optional - they are updated by RBU if present in +** the input table, or not otherwise. For example, to write to an fts4 +** table with a hidden languageid column such as: +** +** CREATE VIRTUAL TABLE ft1 USING fts4(a, b, languageid='langid'); +** +** Either of the following input table schemas may be used: +** +** CREATE TABLE data_ft1(a, b, langid, rbu_rowid, rbu_control); +** CREATE TABLE data_ft1(a, b, rbu_rowid, rbu_control); +** +** For each row to INSERT into the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain integer value 0. The +** other columns should be set to the values that make up the new record +** to insert. +** +** If the target database table has an INTEGER PRIMARY KEY, it is not +** possible to insert a NULL value into the IPK column. Attempting to +** do so results in an SQLITE_MISMATCH error. +** +** For each row to DELETE from the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain integer value 1. The +** real primary key values of the row to delete should be stored in the +** corresponding columns of the data_% table. The values stored in the +** other columns are not used. +** +** For each row to UPDATE from the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain a value of type text. +** The real primary key values identifying the row to update should be +** stored in the corresponding columns of the data_% table row, as should +** the new values of all columns being update. The text value in the +** "rbu_control" column must contain the same number of characters as +** there are columns in the target database table, and must consist entirely +** of 'x' and '.' characters (or in some special cases 'd' - see below). For +** each column that is being updated, the corresponding character is set to +** 'x'. For those that remain as they are, the corresponding character of the +** rbu_control value should be set to '.'. For example, given the tables +** above, the update statement: +** +** UPDATE t1 SET c = 'usa' WHERE a = 4; +** +** is represented by the data_t1 row created by: +** +** INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..x'); +** +** Instead of an 'x' character, characters of the rbu_control value specified +** for UPDATEs may also be set to 'd'. In this case, instead of updating the +** target table with the value stored in the corresponding data_% column, the +** user-defined SQL function "rbu_delta()" is invoked and the result stored in +** the target table column. rbu_delta() is invoked with two arguments - the +** original value currently stored in the target table column and the +** value specified in the data_xxx table. +** +** For example, this row: +** +** INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..d'); +** +** is similar to an UPDATE statement such as: +** +** UPDATE t1 SET c = rbu_delta(c, 'usa') WHERE a = 4; +** +** Finally, if an 'f' character appears in place of a 'd' or 's' in an +** ota_control string, the contents of the data_xxx table column is assumed +** to be a "fossil delta" - a patch to be applied to a blob value in the +** format used by the fossil source-code management system. In this case +** the existing value within the target database table must be of type BLOB. +** It is replaced by the result of applying the specified fossil delta to +** itself. +** +** If the target database table is a virtual table or a table with no PRIMARY +** KEY, the rbu_control value should not include a character corresponding +** to the rbu_rowid value. For example, this: +** +** INSERT INTO data_ft1(a, b, rbu_rowid, rbu_control) +** VALUES(NULL, 'usa', 12, '.x'); +** +** causes a result similar to: +** +** UPDATE ft1 SET b = 'usa' WHERE rowid = 12; +** +** The data_xxx tables themselves should have no PRIMARY KEY declarations. +** However, RBU is more efficient if reading the rows in from each data_xxx +** table in "rowid" order is roughly the same as reading them sorted by +** the PRIMARY KEY of the corresponding target database table. In other +** words, rows should be sorted using the destination table PRIMARY KEY +** fields before they are inserted into the data_xxx tables. +** +** USAGE +** +** The API declared below allows an application to apply an RBU update +** stored on disk to an existing target database. Essentially, the +** application: +** +** 1) Opens an RBU handle using the sqlite3rbu_open() function. +** +** 2) Registers any required virtual table modules with the database +** handle returned by sqlite3rbu_db(). Also, if required, register +** the rbu_delta() implementation. +** +** 3) Calls the sqlite3rbu_step() function one or more times on +** the new handle. Each call to sqlite3rbu_step() performs a single +** b-tree operation, so thousands of calls may be required to apply +** a complete update. +** +** 4) Calls sqlite3rbu_close() to close the RBU update handle. If +** sqlite3rbu_step() has been called enough times to completely +** apply the update to the target database, then the RBU database +** is marked as fully applied. Otherwise, the state of the RBU +** update application is saved in the RBU database for later +** resumption. +** +** See comments below for more detail on APIs. +** +** If an update is only partially applied to the target database by the +** time sqlite3rbu_close() is called, various state information is saved +** within the RBU database. This allows subsequent processes to automatically +** resume the RBU update from where it left off. +** +** To remove all RBU extension state information, returning an RBU database +** to its original contents, it is sufficient to drop all tables that begin +** with the prefix "rbu_" +** +** DATABASE LOCKING +** +** An RBU update may not be applied to a database in WAL mode. Attempting +** to do so is an error (SQLITE_ERROR). +** +** While an RBU handle is open, a SHARED lock may be held on the target +** database file. This means it is possible for other clients to read the +** database, but not to write it. +** +** If an RBU update is started and then suspended before it is completed, +** then an external client writes to the database, then attempting to resume +** the suspended RBU update is also an error (SQLITE_BUSY). +*/ + +#ifndef _SQLITE3RBU_H +#define _SQLITE3RBU_H + +/* #include "sqlite3.h" ** Required for error code definitions ** */ + +#if 0 +extern "C" { +#endif + +typedef struct sqlite3rbu sqlite3rbu; + +/* +** Open an RBU handle. +** +** Argument zTarget is the path to the target database. Argument zRbu is +** the path to the RBU database. Each call to this function must be matched +** by a call to sqlite3rbu_close(). When opening the databases, RBU passes +** the SQLITE_CONFIG_URI flag to sqlite3_open_v2(). So if either zTarget +** or zRbu begin with "file:", it will be interpreted as an SQLite +** database URI, not a regular file name. +** +** If the zState argument is passed a NULL value, the RBU extension stores +** the current state of the update (how many rows have been updated, which +** indexes are yet to be updated etc.) within the RBU database itself. This +** can be convenient, as it means that the RBU application does not need to +** organize removing a separate state file after the update is concluded. +** Or, if zState is non-NULL, it must be a path to a database file in which +** the RBU extension can store the state of the update. +** +** When resuming an RBU update, the zState argument must be passed the same +** value as when the RBU update was started. +** +** Once the RBU update is finished, the RBU extension does not +** automatically remove any zState database file, even if it created it. +** +** By default, RBU uses the default VFS to access the files on disk. To +** use a VFS other than the default, an SQLite "file:" URI containing a +** "vfs=..." option may be passed as the zTarget option. +** +** IMPORTANT NOTE FOR ZIPVFS USERS: The RBU extension works with all of +** SQLite's built-in VFSs, including the multiplexor VFS. However it does +** not work out of the box with zipvfs. Refer to the comment describing +** the zipvfs_create_vfs() API below for details on using RBU with zipvfs. +*/ +SQLITE_API sqlite3rbu *sqlite3rbu_open( + const char *zTarget, + const char *zRbu, + const char *zState +); + +/* +** Open an RBU handle to perform an RBU vacuum on database file zTarget. +** An RBU vacuum is similar to SQLite's built-in VACUUM command, except +** that it can be suspended and resumed like an RBU update. +** +** The second argument to this function identifies a database in which +** to store the state of the RBU vacuum operation if it is suspended. The +** first time sqlite3rbu_vacuum() is called, to start an RBU vacuum +** operation, the state database should either not exist or be empty +** (contain no tables). If an RBU vacuum is suspended by calling +** sqlite3rbu_close() on the RBU handle before sqlite3rbu_step() has +** returned SQLITE_DONE, the vacuum state is stored in the state database. +** The vacuum can be resumed by calling this function to open a new RBU +** handle specifying the same target and state databases. +** +** If the second argument passed to this function is NULL, then the +** name of the state database is "-vacuum", where +** is the name of the target database file. In this case, on UNIX, if the +** state database is not already present in the file-system, it is created +** with the same permissions as the target db is made. +** +** With an RBU vacuum, it is an SQLITE_MISUSE error if the name of the +** state database ends with "-vactmp". This name is reserved for internal +** use. +** +** This function does not delete the state database after an RBU vacuum +** is completed, even if it created it. However, if the call to +** sqlite3rbu_close() returns any value other than SQLITE_OK, the contents +** of the state tables within the state database are zeroed. This way, +** the next call to sqlite3rbu_vacuum() opens a handle that starts a +** new RBU vacuum operation. +** +** As with sqlite3rbu_open(), Zipvfs users should rever to the comment +** describing the sqlite3rbu_create_vfs() API function below for +** a description of the complications associated with using RBU with +** zipvfs databases. +*/ +SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( + const char *zTarget, + const char *zState +); + +/* +** Configure a limit for the amount of temp space that may be used by +** the RBU handle passed as the first argument. The new limit is specified +** in bytes by the second parameter. If it is positive, the limit is updated. +** If the second parameter to this function is passed zero, then the limit +** is removed entirely. If the second parameter is negative, the limit is +** not modified (this is useful for querying the current limit). +** +** In all cases the returned value is the current limit in bytes (zero +** indicates unlimited). +** +** If the temp space limit is exceeded during operation, an SQLITE_FULL +** error is returned. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_temp_size_limit(sqlite3rbu*, sqlite3_int64); + +/* +** Return the current amount of temp file space, in bytes, currently used by +** the RBU handle passed as the only argument. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu*); + +/* +** Internally, each RBU connection uses a separate SQLite database +** connection to access the target and rbu update databases. This +** API allows the application direct access to these database handles. +** +** The first argument passed to this function must be a valid, open, RBU +** handle. The second argument should be passed zero to access the target +** database handle, or non-zero to access the rbu update database handle. +** Accessing the underlying database handles may be useful in the +** following scenarios: +** +** * If any target tables are virtual tables, it may be necessary to +** call sqlite3_create_module() on the target database handle to +** register the required virtual table implementations. +** +** * If the data_xxx tables in the RBU source database are virtual +** tables, the application may need to call sqlite3_create_module() on +** the rbu update db handle to any required virtual table +** implementations. +** +** * If the application uses the "rbu_delta()" feature described above, +** it must use sqlite3_create_function() or similar to register the +** rbu_delta() implementation with the target database handle. +** +** If an error has occurred, either while opening or stepping the RBU object, +** this function may return NULL. The error code and message may be collected +** when sqlite3rbu_close() is called. +** +** Database handles returned by this function remain valid until the next +** call to any sqlite3rbu_xxx() function other than sqlite3rbu_db(). +*/ +SQLITE_API sqlite3 *sqlite3rbu_db(sqlite3rbu*, int bRbu); + +/* +** Do some work towards applying the RBU update to the target db. +** +** Return SQLITE_DONE if the update has been completely applied, or +** SQLITE_OK if no error occurs but there remains work to do to apply +** the RBU update. If an error does occur, some other error code is +** returned. +** +** Once a call to sqlite3rbu_step() has returned a value other than +** SQLITE_OK, all subsequent calls on the same RBU handle are no-ops +** that immediately return the same value. +*/ +SQLITE_API int sqlite3rbu_step(sqlite3rbu *pRbu); + +/* +** Force RBU to save its state to disk. +** +** If a power failure or application crash occurs during an update, following +** system recovery RBU may resume the update from the point at which the state +** was last saved. In other words, from the most recent successful call to +** sqlite3rbu_close() or this function. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *pRbu); + +/* +** Close an RBU handle. +** +** If the RBU update has been completely applied, mark the RBU database +** as fully applied. Otherwise, assuming no error has occurred, save the +** current state of the RBU update appliation to the RBU database. +** +** If an error has already occurred as part of an sqlite3rbu_step() +** or sqlite3rbu_open() call, or if one occurs within this function, an +** SQLite error code is returned. Additionally, if pzErrmsg is not NULL, +** *pzErrmsg may be set to point to a buffer containing a utf-8 formatted +** English language error message. It is the responsibility of the caller to +** eventually free any such buffer using sqlite3_free(). +** +** Otherwise, if no error occurs, this function returns SQLITE_OK if the +** update has been partially applied, or SQLITE_DONE if it has been +** completely applied. +*/ +SQLITE_API int sqlite3rbu_close(sqlite3rbu *pRbu, char **pzErrmsg); + +/* +** Return the total number of key-value operations (inserts, deletes or +** updates) that have been performed on the target database since the +** current RBU update was started. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_progress(sqlite3rbu *pRbu); + +/* +** Obtain permyriadage (permyriadage is to 10000 as percentage is to 100) +** progress indications for the two stages of an RBU update. This API may +** be useful for driving GUI progress indicators and similar. +** +** An RBU update is divided into two stages: +** +** * Stage 1, in which changes are accumulated in an oal/wal file, and +** * Stage 2, in which the contents of the wal file are copied into the +** main database. +** +** The update is visible to non-RBU clients during stage 2. During stage 1 +** non-RBU reader clients may see the original database. +** +** If this API is called during stage 2 of the update, output variable +** (*pnOne) is set to 10000 to indicate that stage 1 has finished and (*pnTwo) +** to a value between 0 and 10000 to indicate the permyriadage progress of +** stage 2. A value of 5000 indicates that stage 2 is half finished, +** 9000 indicates that it is 90% finished, and so on. +** +** If this API is called during stage 1 of the update, output variable +** (*pnTwo) is set to 0 to indicate that stage 2 has not yet started. The +** value to which (*pnOne) is set depends on whether or not the RBU +** database contains an "rbu_count" table. The rbu_count table, if it +** exists, must contain the same columns as the following: +** +** CREATE TABLE rbu_count(tbl TEXT PRIMARY KEY, cnt INTEGER) WITHOUT ROWID; +** +** There must be one row in the table for each source (data_xxx) table within +** the RBU database. The 'tbl' column should contain the name of the source +** table. The 'cnt' column should contain the number of rows within the +** source table. +** +** If the rbu_count table is present and populated correctly and this +** API is called during stage 1, the *pnOne output variable is set to the +** permyriadage progress of the same stage. If the rbu_count table does +** not exist, then (*pnOne) is set to -1 during stage 1. If the rbu_count +** table exists but is not correctly populated, the value of the *pnOne +** output variable during stage 1 is undefined. +*/ +SQLITE_API void sqlite3rbu_bp_progress(sqlite3rbu *pRbu, int *pnOne, int*pnTwo); + +/* +** Obtain an indication as to the current stage of an RBU update or vacuum. +** This function always returns one of the SQLITE_RBU_STATE_XXX constants +** defined in this file. Return values should be interpreted as follows: +** +** SQLITE_RBU_STATE_OAL: +** RBU is currently building a *-oal file. The next call to sqlite3rbu_step() +** may either add further data to the *-oal file, or compute data that will +** be added by a subsequent call. +** +** SQLITE_RBU_STATE_MOVE: +** RBU has finished building the *-oal file. The next call to sqlite3rbu_step() +** will move the *-oal file to the equivalent *-wal path. If the current +** operation is an RBU update, then the updated version of the database +** file will become visible to ordinary SQLite clients following the next +** call to sqlite3rbu_step(). +** +** SQLITE_RBU_STATE_CHECKPOINT: +** RBU is currently performing an incremental checkpoint. The next call to +** sqlite3rbu_step() will copy a page of data from the *-wal file into +** the target database file. +** +** SQLITE_RBU_STATE_DONE: +** The RBU operation has finished. Any subsequent calls to sqlite3rbu_step() +** will immediately return SQLITE_DONE. +** +** SQLITE_RBU_STATE_ERROR: +** An error has occurred. Any subsequent calls to sqlite3rbu_step() will +** immediately return the SQLite error code associated with the error. +*/ +#define SQLITE_RBU_STATE_OAL 1 +#define SQLITE_RBU_STATE_MOVE 2 +#define SQLITE_RBU_STATE_CHECKPOINT 3 +#define SQLITE_RBU_STATE_DONE 4 +#define SQLITE_RBU_STATE_ERROR 5 + +SQLITE_API int sqlite3rbu_state(sqlite3rbu *pRbu); + +/* +** Create an RBU VFS named zName that accesses the underlying file-system +** via existing VFS zParent. Or, if the zParent parameter is passed NULL, +** then the new RBU VFS uses the default system VFS to access the file-system. +** The new object is registered as a non-default VFS with SQLite before +** returning. +** +** Part of the RBU implementation uses a custom VFS object. Usually, this +** object is created and deleted automatically by RBU. +** +** The exception is for applications that also use zipvfs. In this case, +** the custom VFS must be explicitly created by the user before the RBU +** handle is opened. The RBU VFS should be installed so that the zipvfs +** VFS uses the RBU VFS, which in turn uses any other VFS layers in use +** (for example multiplexor) to access the file-system. For example, +** to assemble an RBU enabled VFS stack that uses both zipvfs and +** multiplexor (error checking omitted): +** +** // Create a VFS named "multiplex" (not the default). +** sqlite3_multiplex_initialize(0, 0); +** +** // Create an rbu VFS named "rbu" that uses multiplexor. If the +** // second argument were replaced with NULL, the "rbu" VFS would +** // access the file-system via the system default VFS, bypassing the +** // multiplexor. +** sqlite3rbu_create_vfs("rbu", "multiplex"); +** +** // Create a zipvfs VFS named "zipvfs" that uses rbu. +** zipvfs_create_vfs_v3("zipvfs", "rbu", 0, xCompressorAlgorithmDetector); +** +** // Make zipvfs the default VFS. +** sqlite3_vfs_register(sqlite3_vfs_find("zipvfs"), 1); +** +** Because the default VFS created above includes a RBU functionality, it +** may be used by RBU clients. Attempting to use RBU with a zipvfs VFS stack +** that does not include the RBU layer results in an error. +** +** The overhead of adding the "rbu" VFS to the system is negligible for +** non-RBU users. There is no harm in an application accessing the +** file-system via "rbu" all the time, even if it only uses RBU functionality +** occasionally. +*/ +SQLITE_API int sqlite3rbu_create_vfs(const char *zName, const char *zParent); + +/* +** Deregister and destroy an RBU vfs created by an earlier call to +** sqlite3rbu_create_vfs(). +** +** VFS objects are not reference counted. If a VFS object is destroyed +** before all database handles that use it have been closed, the results +** are undefined. +*/ +SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _SQLITE3RBU_H */ + +/************** End of sqlite3rbu.h ******************************************/ +/************** Continuing where we left off in sqlite3rbu.c *****************/ + +#if defined(_WIN32_WCE) +/* #include "windows.h" */ +#endif + +/* Maximum number of prepared UPDATE statements held by this module */ +#define SQLITE_RBU_UPDATE_CACHESIZE 16 + +/* Delta checksums disabled by default. Compile with -DRBU_ENABLE_DELTA_CKSUM +** to enable checksum verification. +*/ +#ifndef RBU_ENABLE_DELTA_CKSUM +# define RBU_ENABLE_DELTA_CKSUM 0 +#endif + +/* +** Swap two objects of type TYPE. +*/ +#if !defined(SQLITE_AMALGAMATION) +# define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;} +#endif + +/* +** The rbu_state table is used to save the state of a partially applied +** update so that it can be resumed later. The table consists of integer +** keys mapped to values as follows: +** +** RBU_STATE_STAGE: +** May be set to integer values 1, 2, 4 or 5. As follows: +** 1: the *-rbu file is currently under construction. +** 2: the *-rbu file has been constructed, but not yet moved +** to the *-wal path. +** 4: the checkpoint is underway. +** 5: the rbu update has been checkpointed. +** +** RBU_STATE_TBL: +** Only valid if STAGE==1. The target database name of the table +** currently being written. +** +** RBU_STATE_IDX: +** Only valid if STAGE==1. The target database name of the index +** currently being written, or NULL if the main table is currently being +** updated. +** +** RBU_STATE_ROW: +** Only valid if STAGE==1. Number of rows already processed for the current +** table/index. +** +** RBU_STATE_PROGRESS: +** Trbul number of sqlite3rbu_step() calls made so far as part of this +** rbu update. +** +** RBU_STATE_CKPT: +** Valid if STAGE==4. The 64-bit checksum associated with the wal-index +** header created by recovering the *-wal file. This is used to detect +** cases when another client appends frames to the *-wal file in the +** middle of an incremental checkpoint (an incremental checkpoint cannot +** be continued if this happens). +** +** RBU_STATE_COOKIE: +** Valid if STAGE==1. The current change-counter cookie value in the +** target db file. +** +** RBU_STATE_OALSZ: +** Valid if STAGE==1. The size in bytes of the *-oal file. +** +** RBU_STATE_DATATBL: +** Only valid if STAGE==1. The RBU database name of the table +** currently being read. +*/ +#define RBU_STATE_STAGE 1 +#define RBU_STATE_TBL 2 +#define RBU_STATE_IDX 3 +#define RBU_STATE_ROW 4 +#define RBU_STATE_PROGRESS 5 +#define RBU_STATE_CKPT 6 +#define RBU_STATE_COOKIE 7 +#define RBU_STATE_OALSZ 8 +#define RBU_STATE_PHASEONESTEP 9 +#define RBU_STATE_DATATBL 10 + +#define RBU_STAGE_OAL 1 +#define RBU_STAGE_MOVE 2 +#define RBU_STAGE_CAPTURE 3 +#define RBU_STAGE_CKPT 4 +#define RBU_STAGE_DONE 5 + + +#define RBU_CREATE_STATE \ + "CREATE TABLE IF NOT EXISTS %s.rbu_state(k INTEGER PRIMARY KEY, v)" + +typedef struct RbuFrame RbuFrame; +typedef struct RbuObjIter RbuObjIter; +typedef struct RbuState RbuState; +typedef struct RbuSpan RbuSpan; +typedef struct rbu_vfs rbu_vfs; +typedef struct rbu_file rbu_file; +typedef struct RbuUpdateStmt RbuUpdateStmt; + +#if !defined(SQLITE_AMALGAMATION) +typedef unsigned int u32; +typedef unsigned short u16; +typedef unsigned char u8; +typedef sqlite3_int64 i64; +#endif + +/* +** These values must match the values defined in wal.c for the equivalent +** locks. These are not magic numbers as they are part of the SQLite file +** format. +*/ +#define WAL_LOCK_WRITE 0 +#define WAL_LOCK_CKPT 1 +#define WAL_LOCK_READ0 3 + +#define SQLITE_FCNTL_RBUCNT 5149216 + +/* +** A structure to store values read from the rbu_state table in memory. +*/ +struct RbuState { + int eStage; + char *zTbl; + char *zDataTbl; + char *zIdx; + i64 iWalCksum; + int nRow; + i64 nProgress; + u32 iCookie; + i64 iOalSz; + i64 nPhaseOneStep; +}; + +struct RbuUpdateStmt { + char *zMask; /* Copy of update mask used with pUpdate */ + sqlite3_stmt *pUpdate; /* Last update statement (or NULL) */ + RbuUpdateStmt *pNext; +}; + +struct RbuSpan { + const char *zSpan; + int nSpan; +}; + +/* +** An iterator of this type is used to iterate through all objects in +** the target database that require updating. For each such table, the +** iterator visits, in order: +** +** * the table itself, +** * each index of the table (zero or more points to visit), and +** * a special "cleanup table" state. +** +** abIndexed: +** If the table has no indexes on it, abIndexed is set to NULL. Otherwise, +** it points to an array of flags nTblCol elements in size. The flag is +** set for each column that is either a part of the PK or a part of an +** index. Or clear otherwise. +** +** If there are one or more partial indexes on the table, all fields of +** this array set set to 1. This is because in that case, the module has +** no way to tell which fields will be required to add and remove entries +** from the partial indexes. +** +*/ +struct RbuObjIter { + sqlite3_stmt *pTblIter; /* Iterate through tables */ + sqlite3_stmt *pIdxIter; /* Index iterator */ + int nTblCol; /* Size of azTblCol[] array */ + char **azTblCol; /* Array of unquoted target column names */ + char **azTblType; /* Array of target column types */ + int *aiSrcOrder; /* src table col -> target table col */ + u8 *abTblPk; /* Array of flags, set on target PK columns */ + u8 *abNotNull; /* Array of flags, set on NOT NULL columns */ + u8 *abIndexed; /* Array of flags, set on indexed & PK cols */ + int eType; /* Table type - an RBU_PK_XXX value */ + + /* Output variables. zTbl==0 implies EOF. */ + int bCleanup; /* True in "cleanup" state */ + const char *zTbl; /* Name of target db table */ + const char *zDataTbl; /* Name of rbu db table (or null) */ + const char *zIdx; /* Name of target db index (or null) */ + int iTnum; /* Root page of current object */ + int iPkTnum; /* If eType==EXTERNAL, root of PK index */ + int bUnique; /* Current index is unique */ + int nIndex; /* Number of aux. indexes on table zTbl */ + + /* Statements created by rbuObjIterPrepareAll() */ + int nCol; /* Number of columns in current object */ + sqlite3_stmt *pSelect; /* Source data */ + sqlite3_stmt *pInsert; /* Statement for INSERT operations */ + sqlite3_stmt *pDelete; /* Statement for DELETE ops */ + sqlite3_stmt *pTmpInsert; /* Insert into rbu_tmp_$zDataTbl */ + int nIdxCol; + RbuSpan *aIdxCol; + char *zIdxSql; + + /* Last UPDATE used (for PK b-tree updates only), or NULL. */ + RbuUpdateStmt *pRbuUpdate; +}; + +/* +** Values for RbuObjIter.eType +** +** 0: Table does not exist (error) +** 1: Table has an implicit rowid. +** 2: Table has an explicit IPK column. +** 3: Table has an external PK index. +** 4: Table is WITHOUT ROWID. +** 5: Table is a virtual table. +*/ +#define RBU_PK_NOTABLE 0 +#define RBU_PK_NONE 1 +#define RBU_PK_IPK 2 +#define RBU_PK_EXTERNAL 3 +#define RBU_PK_WITHOUT_ROWID 4 +#define RBU_PK_VTAB 5 + + +/* +** Within the RBU_STAGE_OAL stage, each call to sqlite3rbu_step() performs +** one of the following operations. +*/ +#define RBU_INSERT 1 /* Insert on a main table b-tree */ +#define RBU_DELETE 2 /* Delete a row from a main table b-tree */ +#define RBU_REPLACE 3 /* Delete and then insert a row */ +#define RBU_IDX_DELETE 4 /* Delete a row from an aux. index b-tree */ +#define RBU_IDX_INSERT 5 /* Insert on an aux. index b-tree */ + +#define RBU_UPDATE 6 /* Update a row in a main table b-tree */ + +/* +** A single step of an incremental checkpoint - frame iWalFrame of the wal +** file should be copied to page iDbPage of the database file. +*/ +struct RbuFrame { + u32 iDbPage; + u32 iWalFrame; +}; + +/* +** RBU handle. +** +** nPhaseOneStep: +** If the RBU database contains an rbu_count table, this value is set to +** a running estimate of the number of b-tree operations required to +** finish populating the *-oal file. This allows the sqlite3_bp_progress() +** API to calculate the permyriadage progress of populating the *-oal file +** using the formula: +** +** permyriadage = (10000 * nProgress) / nPhaseOneStep +** +** nPhaseOneStep is initialized to the sum of: +** +** nRow * (nIndex + 1) +** +** for all source tables in the RBU database, where nRow is the number +** of rows in the source table and nIndex the number of indexes on the +** corresponding target database table. +** +** This estimate is accurate if the RBU update consists entirely of +** INSERT operations. However, it is inaccurate if: +** +** * the RBU update contains any UPDATE operations. If the PK specified +** for an UPDATE operation does not exist in the target table, then +** no b-tree operations are required on index b-trees. Or if the +** specified PK does exist, then (nIndex*2) such operations are +** required (one delete and one insert on each index b-tree). +** +** * the RBU update contains any DELETE operations for which the specified +** PK does not exist. In this case no operations are required on index +** b-trees. +** +** * the RBU update contains REPLACE operations. These are similar to +** UPDATE operations. +** +** nPhaseOneStep is updated to account for the conditions above during the +** first pass of each source table. The updated nPhaseOneStep value is +** stored in the rbu_state table if the RBU update is suspended. +*/ +struct sqlite3rbu { + int eStage; /* Value of RBU_STATE_STAGE field */ + sqlite3 *dbMain; /* target database handle */ + sqlite3 *dbRbu; /* rbu database handle */ + char *zTarget; /* Path to target db */ + char *zRbu; /* Path to rbu db */ + char *zState; /* Path to state db (or NULL if zRbu) */ + char zStateDb[5]; /* Db name for state ("stat" or "main") */ + int rc; /* Value returned by last rbu_step() call */ + char *zErrmsg; /* Error message if rc!=SQLITE_OK */ + int nStep; /* Rows processed for current object */ + int nProgress; /* Rows processed for all objects */ + RbuObjIter objiter; /* Iterator for skipping through tbl/idx */ + const char *zVfsName; /* Name of automatically created rbu vfs */ + rbu_file *pTargetFd; /* File handle open on target db */ + int nPagePerSector; /* Pages per sector for pTargetFd */ + i64 iOalSz; + i64 nPhaseOneStep; + + /* The following state variables are used as part of the incremental + ** checkpoint stage (eStage==RBU_STAGE_CKPT). See comments surrounding + ** function rbuSetupCheckpoint() for details. */ + u32 iMaxFrame; /* Largest iWalFrame value in aFrame[] */ + u32 mLock; + int nFrame; /* Entries in aFrame[] array */ + int nFrameAlloc; /* Allocated size of aFrame[] array */ + RbuFrame *aFrame; + int pgsz; + u8 *aBuf; + i64 iWalCksum; + i64 szTemp; /* Current size of all temp files in use */ + i64 szTempLimit; /* Total size limit for temp files */ + + /* Used in RBU vacuum mode only */ + int nRbu; /* Number of RBU VFS in the stack */ + rbu_file *pRbuFd; /* Fd for main db of dbRbu */ +}; + +/* +** An rbu VFS is implemented using an instance of this structure. +** +** Variable pRbu is only non-NULL for automatically created RBU VFS objects. +** It is NULL for RBU VFS objects created explicitly using +** sqlite3rbu_create_vfs(). It is used to track the total amount of temp +** space used by the RBU handle. +*/ +struct rbu_vfs { + sqlite3_vfs base; /* rbu VFS shim methods */ + sqlite3_vfs *pRealVfs; /* Underlying VFS */ + sqlite3_mutex *mutex; /* Mutex to protect pMain */ + sqlite3rbu *pRbu; /* Owner RBU object */ + rbu_file *pMain; /* List of main db files */ + rbu_file *pMainRbu; /* List of main db files with pRbu!=0 */ +}; + +/* +** Each file opened by an rbu VFS is represented by an instance of +** the following structure. +** +** If this is a temporary file (pRbu!=0 && flags&DELETE_ON_CLOSE), variable +** "sz" is set to the current size of the database file. +*/ +struct rbu_file { + sqlite3_file base; /* sqlite3_file methods */ + sqlite3_file *pReal; /* Underlying file handle */ + rbu_vfs *pRbuVfs; /* Pointer to the rbu_vfs object */ + sqlite3rbu *pRbu; /* Pointer to rbu object (rbu target only) */ + i64 sz; /* Size of file in bytes (temp only) */ + + int openFlags; /* Flags this file was opened with */ + u32 iCookie; /* Cookie value for main db files */ + u8 iWriteVer; /* "write-version" value for main db files */ + u8 bNolock; /* True to fail EXCLUSIVE locks */ + + int nShm; /* Number of entries in apShm[] array */ + char **apShm; /* Array of mmap'd *-shm regions */ + char *zDel; /* Delete this when closing file */ + + const char *zWal; /* Wal filename for this main db file */ + rbu_file *pWalFd; /* Wal file descriptor for this main db */ + rbu_file *pMainNext; /* Next MAIN_DB file */ + rbu_file *pMainRbuNext; /* Next MAIN_DB file with pRbu!=0 */ +}; + +/* +** True for an RBU vacuum handle, or false otherwise. +*/ +#define rbuIsVacuum(p) ((p)->zTarget==0) + + +/************************************************************************* +** The following three functions, found below: +** +** rbuDeltaGetInt() +** rbuDeltaChecksum() +** rbuDeltaApply() +** +** are lifted from the fossil source code (http://fossil-scm.org). They +** are used to implement the scalar SQL function rbu_fossil_delta(). +*/ + +/* +** Read bytes from *pz and convert them into a positive integer. When +** finished, leave *pz pointing to the first character past the end of +** the integer. The *pLen parameter holds the length of the string +** in *pz and is decremented once for each character in the integer. +*/ +static unsigned int rbuDeltaGetInt(const char **pz, int *pLen){ + static const signed char zValue[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -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, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, 36, + -1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, 63, -1, + }; + unsigned int v = 0; + int c; + unsigned char *z = (unsigned char*)*pz; + unsigned char *zStart = z; + while( (c = zValue[0x7f&*(z++)])>=0 ){ + v = (v<<6) + c; + } + z--; + *pLen -= z - zStart; + *pz = (char*)z; + return v; +} + +#if RBU_ENABLE_DELTA_CKSUM +/* +** Compute a 32-bit checksum on the N-byte buffer. Return the result. +*/ +static unsigned int rbuDeltaChecksum(const char *zIn, size_t N){ + const unsigned char *z = (const unsigned char *)zIn; + unsigned sum0 = 0; + unsigned sum1 = 0; + unsigned sum2 = 0; + unsigned sum3 = 0; + while(N >= 16){ + sum0 += ((unsigned)z[0] + z[4] + z[8] + z[12]); + sum1 += ((unsigned)z[1] + z[5] + z[9] + z[13]); + sum2 += ((unsigned)z[2] + z[6] + z[10]+ z[14]); + sum3 += ((unsigned)z[3] + z[7] + z[11]+ z[15]); + z += 16; + N -= 16; + } + while(N >= 4){ + sum0 += z[0]; + sum1 += z[1]; + sum2 += z[2]; + sum3 += z[3]; + z += 4; + N -= 4; + } + sum3 += (sum2 << 8) + (sum1 << 16) + (sum0 << 24); + switch(N){ + case 3: sum3 += (z[2] << 8); + case 2: sum3 += (z[1] << 16); + case 1: sum3 += (z[0] << 24); + default: ; + } + return sum3; +} +#endif + +/* +** Apply a delta. +** +** The output buffer should be big enough to hold the whole output +** file and a NUL terminator at the end. The delta_output_size() +** routine will determine this size for you. +** +** The delta string should be null-terminated. But the delta string +** may contain embedded NUL characters (if the input and output are +** binary files) so we also have to pass in the length of the delta in +** the lenDelta parameter. +** +** This function returns the size of the output file in bytes (excluding +** the final NUL terminator character). Except, if the delta string is +** malformed or intended for use with a source file other than zSrc, +** then this routine returns -1. +** +** Refer to the delta_create() documentation above for a description +** of the delta file format. +*/ +static int rbuDeltaApply( + const char *zSrc, /* The source or pattern file */ + int lenSrc, /* Length of the source file */ + const char *zDelta, /* Delta to apply to the pattern */ + int lenDelta, /* Length of the delta */ + char *zOut /* Write the output into this preallocated buffer */ +){ + unsigned int limit; + unsigned int total = 0; +#if RBU_ENABLE_DELTA_CKSUM + char *zOrigOut = zOut; +#endif + + limit = rbuDeltaGetInt(&zDelta, &lenDelta); + if( *zDelta!='\n' ){ + /* ERROR: size integer not terminated by "\n" */ + return -1; + } + zDelta++; lenDelta--; + while( *zDelta && lenDelta>0 ){ + unsigned int cnt, ofst; + cnt = rbuDeltaGetInt(&zDelta, &lenDelta); + switch( zDelta[0] ){ + case '@': { + zDelta++; lenDelta--; + ofst = rbuDeltaGetInt(&zDelta, &lenDelta); + if( lenDelta>0 && zDelta[0]!=',' ){ + /* ERROR: copy command not terminated by ',' */ + return -1; + } + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: copy exceeds output file size */ + return -1; + } + if( (int)(ofst+cnt) > lenSrc ){ + /* ERROR: copy extends past end of input */ + return -1; + } + memcpy(zOut, &zSrc[ofst], cnt); + zOut += cnt; + break; + } + case ':': { + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: insert command gives an output larger than predicted */ + return -1; + } + if( (int)cnt>lenDelta ){ + /* ERROR: insert count exceeds size of delta */ + return -1; + } + memcpy(zOut, zDelta, cnt); + zOut += cnt; + zDelta += cnt; + lenDelta -= cnt; + break; + } + case ';': { + zDelta++; lenDelta--; + zOut[0] = 0; +#if RBU_ENABLE_DELTA_CKSUM + if( cnt!=rbuDeltaChecksum(zOrigOut, total) ){ + /* ERROR: bad checksum */ + return -1; + } +#endif + if( total!=limit ){ + /* ERROR: generated size does not match predicted size */ + return -1; + } + return total; + } + default: { + /* ERROR: unknown delta operator */ + return -1; + } + } + } + /* ERROR: unterminated delta */ + return -1; +} + +static int rbuDeltaOutputSize(const char *zDelta, int lenDelta){ + int size; + size = rbuDeltaGetInt(&zDelta, &lenDelta); + if( *zDelta!='\n' ){ + /* ERROR: size integer not terminated by "\n" */ + return -1; + } + return size; +} + +/* +** End of code taken from fossil. +*************************************************************************/ + +/* +** Implementation of SQL scalar function rbu_fossil_delta(). +** +** This function applies a fossil delta patch to a blob. Exactly two +** arguments must be passed to this function. The first is the blob to +** patch and the second the patch to apply. If no error occurs, this +** function returns the patched blob. +*/ +static void rbuFossilDeltaFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *aDelta; + int nDelta; + const char *aOrig; + int nOrig; + + int nOut; + int nOut2; + char *aOut; + + assert( argc==2 ); + + nOrig = sqlite3_value_bytes(argv[0]); + aOrig = (const char*)sqlite3_value_blob(argv[0]); + nDelta = sqlite3_value_bytes(argv[1]); + aDelta = (const char*)sqlite3_value_blob(argv[1]); + + /* Figure out the size of the output */ + nOut = rbuDeltaOutputSize(aDelta, nDelta); + if( nOut<0 ){ + sqlite3_result_error(context, "corrupt fossil delta", -1); + return; + } + + aOut = sqlite3_malloc(nOut+1); + if( aOut==0 ){ + sqlite3_result_error_nomem(context); + }else{ + nOut2 = rbuDeltaApply(aOrig, nOrig, aDelta, nDelta, aOut); + if( nOut2!=nOut ){ + sqlite3_free(aOut); + sqlite3_result_error(context, "corrupt fossil delta", -1); + }else{ + sqlite3_result_blob(context, aOut, nOut, sqlite3_free); + } + } +} + + +/* +** Prepare the SQL statement in buffer zSql against database handle db. +** If successful, set *ppStmt to point to the new statement and return +** SQLITE_OK. +** +** Otherwise, if an error does occur, set *ppStmt to NULL and return +** an SQLite error code. Additionally, set output variable *pzErrmsg to +** point to a buffer containing an error message. It is the responsibility +** of the caller to (eventually) free this buffer using sqlite3_free(). +*/ +static int prepareAndCollectError( + sqlite3 *db, + sqlite3_stmt **ppStmt, + char **pzErrmsg, + const char *zSql +){ + int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); + if( rc!=SQLITE_OK ){ + *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + *ppStmt = 0; + } + return rc; +} + +/* +** Reset the SQL statement passed as the first argument. Return a copy +** of the value returned by sqlite3_reset(). +** +** If an error has occurred, then set *pzErrmsg to point to a buffer +** containing an error message. It is the responsibility of the caller +** to eventually free this buffer using sqlite3_free(). +*/ +static int resetAndCollectError(sqlite3_stmt *pStmt, char **pzErrmsg){ + int rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ){ + *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(sqlite3_db_handle(pStmt))); + } + return rc; +} + +/* +** Unless it is NULL, argument zSql points to a buffer allocated using +** sqlite3_malloc containing an SQL statement. This function prepares the SQL +** statement against database db and frees the buffer. If statement +** compilation is successful, *ppStmt is set to point to the new statement +** handle and SQLITE_OK is returned. +** +** Otherwise, if an error occurs, *ppStmt is set to NULL and an error code +** returned. In this case, *pzErrmsg may also be set to point to an error +** message. It is the responsibility of the caller to free this error message +** buffer using sqlite3_free(). +** +** If argument zSql is NULL, this function assumes that an OOM has occurred. +** In this case SQLITE_NOMEM is returned and *ppStmt set to NULL. +*/ +static int prepareFreeAndCollectError( + sqlite3 *db, + sqlite3_stmt **ppStmt, + char **pzErrmsg, + char *zSql +){ + int rc; + assert( *pzErrmsg==0 ); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + *ppStmt = 0; + }else{ + rc = prepareAndCollectError(db, ppStmt, pzErrmsg, zSql); + sqlite3_free(zSql); + } + return rc; +} + +/* +** Free the RbuObjIter.azTblCol[] and RbuObjIter.abTblPk[] arrays allocated +** by an earlier call to rbuObjIterCacheTableInfo(). +*/ +static void rbuObjIterFreeCols(RbuObjIter *pIter){ + int i; + for(i=0; inTblCol; i++){ + sqlite3_free(pIter->azTblCol[i]); + sqlite3_free(pIter->azTblType[i]); + } + sqlite3_free(pIter->azTblCol); + pIter->azTblCol = 0; + pIter->azTblType = 0; + pIter->aiSrcOrder = 0; + pIter->abTblPk = 0; + pIter->abNotNull = 0; + pIter->nTblCol = 0; + pIter->eType = 0; /* Invalid value */ +} + +/* +** Finalize all statements and free all allocations that are specific to +** the current object (table/index pair). +*/ +static void rbuObjIterClearStatements(RbuObjIter *pIter){ + RbuUpdateStmt *pUp; + + sqlite3_finalize(pIter->pSelect); + sqlite3_finalize(pIter->pInsert); + sqlite3_finalize(pIter->pDelete); + sqlite3_finalize(pIter->pTmpInsert); + pUp = pIter->pRbuUpdate; + while( pUp ){ + RbuUpdateStmt *pTmp = pUp->pNext; + sqlite3_finalize(pUp->pUpdate); + sqlite3_free(pUp); + pUp = pTmp; + } + sqlite3_free(pIter->aIdxCol); + sqlite3_free(pIter->zIdxSql); + + pIter->pSelect = 0; + pIter->pInsert = 0; + pIter->pDelete = 0; + pIter->pRbuUpdate = 0; + pIter->pTmpInsert = 0; + pIter->nCol = 0; + pIter->nIdxCol = 0; + pIter->aIdxCol = 0; + pIter->zIdxSql = 0; +} + +/* +** Clean up any resources allocated as part of the iterator object passed +** as the only argument. +*/ +static void rbuObjIterFinalize(RbuObjIter *pIter){ + rbuObjIterClearStatements(pIter); + sqlite3_finalize(pIter->pTblIter); + sqlite3_finalize(pIter->pIdxIter); + rbuObjIterFreeCols(pIter); + memset(pIter, 0, sizeof(RbuObjIter)); +} + +/* +** Advance the iterator to the next position. +** +** If no error occurs, SQLITE_OK is returned and the iterator is left +** pointing to the next entry. Otherwise, an error code and message is +** left in the RBU handle passed as the first argument. A copy of the +** error code is returned. +*/ +static int rbuObjIterNext(sqlite3rbu *p, RbuObjIter *pIter){ + int rc = p->rc; + if( rc==SQLITE_OK ){ + + /* Free any SQLite statements used while processing the previous object */ + rbuObjIterClearStatements(pIter); + if( pIter->zIdx==0 ){ + rc = sqlite3_exec(p->dbMain, + "DROP TRIGGER IF EXISTS temp.rbu_insert_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_update1_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_update2_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_delete_tr;" + , 0, 0, &p->zErrmsg + ); + } + + if( rc==SQLITE_OK ){ + if( pIter->bCleanup ){ + rbuObjIterFreeCols(pIter); + pIter->bCleanup = 0; + rc = sqlite3_step(pIter->pTblIter); + if( rc!=SQLITE_ROW ){ + rc = resetAndCollectError(pIter->pTblIter, &p->zErrmsg); + pIter->zTbl = 0; + }else{ + pIter->zTbl = (const char*)sqlite3_column_text(pIter->pTblIter, 0); + pIter->zDataTbl = (const char*)sqlite3_column_text(pIter->pTblIter,1); + rc = (pIter->zDataTbl && pIter->zTbl) ? SQLITE_OK : SQLITE_NOMEM; + } + }else{ + if( pIter->zIdx==0 ){ + sqlite3_stmt *pIdx = pIter->pIdxIter; + rc = sqlite3_bind_text(pIdx, 1, pIter->zTbl, -1, SQLITE_STATIC); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_step(pIter->pIdxIter); + if( rc!=SQLITE_ROW ){ + rc = resetAndCollectError(pIter->pIdxIter, &p->zErrmsg); + pIter->bCleanup = 1; + pIter->zIdx = 0; + }else{ + pIter->zIdx = (const char*)sqlite3_column_text(pIter->pIdxIter, 0); + pIter->iTnum = sqlite3_column_int(pIter->pIdxIter, 1); + pIter->bUnique = sqlite3_column_int(pIter->pIdxIter, 2); + rc = pIter->zIdx ? SQLITE_OK : SQLITE_NOMEM; + } + } + } + } + } + + if( rc!=SQLITE_OK ){ + rbuObjIterFinalize(pIter); + p->rc = rc; + } + return rc; +} + + +/* +** The implementation of the rbu_target_name() SQL function. This function +** accepts one or two arguments. The first argument is the name of a table - +** the name of a table in the RBU database. The second, if it is present, is 1 +** for a view or 0 for a table. +** +** For a non-vacuum RBU handle, if the table name matches the pattern: +** +** data[0-9]_ +** +** where is any sequence of 1 or more characters, is returned. +** Otherwise, if the only argument does not match the above pattern, an SQL +** NULL is returned. +** +** "data_t1" -> "t1" +** "data0123_t2" -> "t2" +** "dataAB_t3" -> NULL +** +** For an rbu vacuum handle, a copy of the first argument is returned if +** the second argument is either missing or 0 (not a view). +*/ +static void rbuTargetNameFunc( + sqlite3_context *pCtx, + int argc, + sqlite3_value **argv +){ + sqlite3rbu *p = sqlite3_user_data(pCtx); + const char *zIn; + assert( argc==1 || argc==2 ); + + zIn = (const char*)sqlite3_value_text(argv[0]); + if( zIn ){ + if( rbuIsVacuum(p) ){ + assert( argc==2 || argc==1 ); + if( argc==1 || 0==sqlite3_value_int(argv[1]) ){ + sqlite3_result_text(pCtx, zIn, -1, SQLITE_STATIC); + } + }else{ + if( strlen(zIn)>4 && memcmp("data", zIn, 4)==0 ){ + int i; + for(i=4; zIn[i]>='0' && zIn[i]<='9'; i++); + if( zIn[i]=='_' && zIn[i+1] ){ + sqlite3_result_text(pCtx, &zIn[i+1], -1, SQLITE_STATIC); + } + } + } + } +} + +/* +** Initialize the iterator structure passed as the second argument. +** +** If no error occurs, SQLITE_OK is returned and the iterator is left +** pointing to the first entry. Otherwise, an error code and message is +** left in the RBU handle passed as the first argument. A copy of the +** error code is returned. +*/ +static int rbuObjIterFirst(sqlite3rbu *p, RbuObjIter *pIter){ + int rc; + memset(pIter, 0, sizeof(RbuObjIter)); + + rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pTblIter, &p->zErrmsg, + sqlite3_mprintf( + "SELECT rbu_target_name(name, type='view') AS target, name " + "FROM sqlite_master " + "WHERE type IN ('table', 'view') AND target IS NOT NULL " + " %s " + "ORDER BY name" + , rbuIsVacuum(p) ? "AND rootpage!=0 AND rootpage IS NOT NULL" : "")); + + if( rc==SQLITE_OK ){ + rc = prepareAndCollectError(p->dbMain, &pIter->pIdxIter, &p->zErrmsg, + "SELECT name, rootpage, sql IS NULL OR substr(8, 6)=='UNIQUE' " + " FROM main.sqlite_master " + " WHERE type='index' AND tbl_name = ?" + ); + } + + pIter->bCleanup = 1; + p->rc = rc; + return rbuObjIterNext(p, pIter); +} + +/* +** This is a wrapper around "sqlite3_mprintf(zFmt, ...)". If an OOM occurs, +** an error code is stored in the RBU handle passed as the first argument. +** +** If an error has already occurred (p->rc is already set to something other +** than SQLITE_OK), then this function returns NULL without modifying the +** stored error code. In this case it still calls sqlite3_free() on any +** printf() parameters associated with %z conversions. +*/ +static char *rbuMPrintf(sqlite3rbu *p, const char *zFmt, ...){ + char *zSql = 0; + va_list ap; + va_start(ap, zFmt); + zSql = sqlite3_vmprintf(zFmt, ap); + if( p->rc==SQLITE_OK ){ + if( zSql==0 ) p->rc = SQLITE_NOMEM; + }else{ + sqlite3_free(zSql); + zSql = 0; + } + va_end(ap); + return zSql; +} + +/* +** Argument zFmt is a sqlite3_mprintf() style format string. The trailing +** arguments are the usual subsitution values. This function performs +** the printf() style substitutions and executes the result as an SQL +** statement on the RBU handles database. +** +** If an error occurs, an error code and error message is stored in the +** RBU handle. If an error has already occurred when this function is +** called, it is a no-op. +*/ +static int rbuMPrintfExec(sqlite3rbu *p, sqlite3 *db, const char *zFmt, ...){ + va_list ap; + char *zSql; + va_start(ap, zFmt); + zSql = sqlite3_vmprintf(zFmt, ap); + if( p->rc==SQLITE_OK ){ + if( zSql==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + p->rc = sqlite3_exec(db, zSql, 0, 0, &p->zErrmsg); + } + } + sqlite3_free(zSql); + va_end(ap); + return p->rc; +} + +/* +** Attempt to allocate and return a pointer to a zeroed block of nByte +** bytes. +** +** If an error (i.e. an OOM condition) occurs, return NULL and leave an +** error code in the rbu handle passed as the first argument. Or, if an +** error has already occurred when this function is called, return NULL +** immediately without attempting the allocation or modifying the stored +** error code. +*/ +static void *rbuMalloc(sqlite3rbu *p, sqlite3_int64 nByte){ + void *pRet = 0; + if( p->rc==SQLITE_OK ){ + assert( nByte>0 ); + pRet = sqlite3_malloc64(nByte); + if( pRet==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + memset(pRet, 0, nByte); + } + } + return pRet; +} + + +/* +** Allocate and zero the pIter->azTblCol[] and abTblPk[] arrays so that +** there is room for at least nCol elements. If an OOM occurs, store an +** error code in the RBU handle passed as the first argument. +*/ +static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){ + sqlite3_int64 nByte = (2*sizeof(char*) + sizeof(int) + 3*sizeof(u8)) * nCol; + char **azNew; + + azNew = (char**)rbuMalloc(p, nByte); + if( azNew ){ + pIter->azTblCol = azNew; + pIter->azTblType = &azNew[nCol]; + pIter->aiSrcOrder = (int*)&pIter->azTblType[nCol]; + pIter->abTblPk = (u8*)&pIter->aiSrcOrder[nCol]; + pIter->abNotNull = (u8*)&pIter->abTblPk[nCol]; + pIter->abIndexed = (u8*)&pIter->abNotNull[nCol]; + } +} + +/* +** The first argument must be a nul-terminated string. This function +** returns a copy of the string in memory obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free this memory +** using sqlite3_free(). +** +** If an OOM condition is encountered when attempting to allocate memory, +** output variable (*pRc) is set to SQLITE_NOMEM before returning. Otherwise, +** if the allocation succeeds, (*pRc) is left unchanged. +*/ +static char *rbuStrndup(const char *zStr, int *pRc){ + char *zRet = 0; + + if( *pRc==SQLITE_OK ){ + if( zStr ){ + size_t nCopy = strlen(zStr) + 1; + zRet = (char*)sqlite3_malloc64(nCopy); + if( zRet ){ + memcpy(zRet, zStr, nCopy); + }else{ + *pRc = SQLITE_NOMEM; + } + } + } + + return zRet; +} + +/* +** Finalize the statement passed as the second argument. +** +** If the sqlite3_finalize() call indicates that an error occurs, and the +** rbu handle error code is not already set, set the error code and error +** message accordingly. +*/ +static void rbuFinalize(sqlite3rbu *p, sqlite3_stmt *pStmt){ + sqlite3 *db = sqlite3_db_handle(pStmt); + int rc = sqlite3_finalize(pStmt); + if( p->rc==SQLITE_OK && rc!=SQLITE_OK ){ + p->rc = rc; + p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } +} + +/* Determine the type of a table. +** +** peType is of type (int*), a pointer to an output parameter of type +** (int). This call sets the output parameter as follows, depending +** on the type of the table specified by parameters dbName and zTbl. +** +** RBU_PK_NOTABLE: No such table. +** RBU_PK_NONE: Table has an implicit rowid. +** RBU_PK_IPK: Table has an explicit IPK column. +** RBU_PK_EXTERNAL: Table has an external PK index. +** RBU_PK_WITHOUT_ROWID: Table is WITHOUT ROWID. +** RBU_PK_VTAB: Table is a virtual table. +** +** Argument *piPk is also of type (int*), and also points to an output +** parameter. Unless the table has an external primary key index +** (i.e. unless *peType is set to 3), then *piPk is set to zero. Or, +** if the table does have an external primary key index, then *piPk +** is set to the root page number of the primary key index before +** returning. +** +** ALGORITHM: +** +** if( no entry exists in sqlite_master ){ +** return RBU_PK_NOTABLE +** }else if( sql for the entry starts with "CREATE VIRTUAL" ){ +** return RBU_PK_VTAB +** }else if( "PRAGMA index_list()" for the table contains a "pk" index ){ +** if( the index that is the pk exists in sqlite_master ){ +** *piPK = rootpage of that index. +** return RBU_PK_EXTERNAL +** }else{ +** return RBU_PK_WITHOUT_ROWID +** } +** }else if( "PRAGMA table_info()" lists one or more "pk" columns ){ +** return RBU_PK_IPK +** }else{ +** return RBU_PK_NONE +** } +*/ +static void rbuTableType( + sqlite3rbu *p, + const char *zTab, + int *peType, + int *piTnum, + int *piPk +){ + /* + ** 0) SELECT count(*) FROM sqlite_master where name=%Q AND IsVirtual(%Q) + ** 1) PRAGMA index_list = ? + ** 2) SELECT count(*) FROM sqlite_master where name=%Q + ** 3) PRAGMA table_info = ? + */ + sqlite3_stmt *aStmt[4] = {0, 0, 0, 0}; + + *peType = RBU_PK_NOTABLE; + *piPk = 0; + + assert( p->rc==SQLITE_OK ); + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[0], &p->zErrmsg, + sqlite3_mprintf( + "SELECT (sql LIKE 'create virtual%%'), rootpage" + " FROM sqlite_master" + " WHERE name=%Q", zTab + )); + if( p->rc!=SQLITE_OK || sqlite3_step(aStmt[0])!=SQLITE_ROW ){ + /* Either an error, or no such table. */ + goto rbuTableType_end; + } + if( sqlite3_column_int(aStmt[0], 0) ){ + *peType = RBU_PK_VTAB; /* virtual table */ + goto rbuTableType_end; + } + *piTnum = sqlite3_column_int(aStmt[0], 1); + + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[1], &p->zErrmsg, + sqlite3_mprintf("PRAGMA index_list=%Q",zTab) + ); + if( p->rc ) goto rbuTableType_end; + while( sqlite3_step(aStmt[1])==SQLITE_ROW ){ + const u8 *zOrig = sqlite3_column_text(aStmt[1], 3); + const u8 *zIdx = sqlite3_column_text(aStmt[1], 1); + if( zOrig && zIdx && zOrig[0]=='p' ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[2], &p->zErrmsg, + sqlite3_mprintf( + "SELECT rootpage FROM sqlite_master WHERE name = %Q", zIdx + )); + if( p->rc==SQLITE_OK ){ + if( sqlite3_step(aStmt[2])==SQLITE_ROW ){ + *piPk = sqlite3_column_int(aStmt[2], 0); + *peType = RBU_PK_EXTERNAL; + }else{ + *peType = RBU_PK_WITHOUT_ROWID; + } + } + goto rbuTableType_end; + } + } + + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[3], &p->zErrmsg, + sqlite3_mprintf("PRAGMA table_info=%Q",zTab) + ); + if( p->rc==SQLITE_OK ){ + while( sqlite3_step(aStmt[3])==SQLITE_ROW ){ + if( sqlite3_column_int(aStmt[3],5)>0 ){ + *peType = RBU_PK_IPK; /* explicit IPK column */ + goto rbuTableType_end; + } + } + *peType = RBU_PK_NONE; + } + +rbuTableType_end: { + unsigned int i; + for(i=0; iabIndexed[] array. +*/ +static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ + sqlite3_stmt *pList = 0; + int bIndex = 0; + + if( p->rc==SQLITE_OK ){ + memcpy(pIter->abIndexed, pIter->abTblPk, sizeof(u8)*pIter->nTblCol); + p->rc = prepareFreeAndCollectError(p->dbMain, &pList, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl) + ); + } + + pIter->nIndex = 0; + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pList) ){ + const char *zIdx = (const char*)sqlite3_column_text(pList, 1); + int bPartial = sqlite3_column_int(pList, 4); + sqlite3_stmt *pXInfo = 0; + if( zIdx==0 ) break; + if( bPartial ){ + memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol); + } + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + if( iCid>=0 ) pIter->abIndexed[iCid] = 1; + if( iCid==-2 ){ + memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol); + } + } + rbuFinalize(p, pXInfo); + bIndex = 1; + pIter->nIndex++; + } + + if( pIter->eType==RBU_PK_WITHOUT_ROWID ){ + /* "PRAGMA index_list" includes the main PK b-tree */ + pIter->nIndex--; + } + + rbuFinalize(p, pList); + if( bIndex==0 ) pIter->abIndexed = 0; +} + + +/* +** If they are not already populated, populate the pIter->azTblCol[], +** pIter->abTblPk[], pIter->nTblCol and pIter->bRowid variables according to +** the table (not index) that the iterator currently points to. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. If +** an error does occur, an error code and error message are also left in +** the RBU handle. +*/ +static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ + if( pIter->azTblCol==0 ){ + sqlite3_stmt *pStmt = 0; + int nCol = 0; + int i; /* for() loop iterator variable */ + int bRbuRowid = 0; /* If input table has column "rbu_rowid" */ + int iOrder = 0; + int iTnum = 0; + + /* Figure out the type of table this step will deal with. */ + assert( pIter->eType==0 ); + rbuTableType(p, pIter->zTbl, &pIter->eType, &iTnum, &pIter->iPkTnum); + if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_NOTABLE ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("no such table: %s", pIter->zTbl); + } + if( p->rc ) return p->rc; + if( pIter->zIdx==0 ) pIter->iTnum = iTnum; + + assert( pIter->eType==RBU_PK_NONE || pIter->eType==RBU_PK_IPK + || pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_WITHOUT_ROWID + || pIter->eType==RBU_PK_VTAB + ); + + /* Populate the azTblCol[] and nTblCol variables based on the columns + ** of the input table. Ignore any input table columns that begin with + ** "rbu_". */ + p->rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + sqlite3_mprintf("SELECT * FROM '%q'", pIter->zDataTbl) + ); + if( p->rc==SQLITE_OK ){ + nCol = sqlite3_column_count(pStmt); + rbuAllocateIterArrays(p, pIter, nCol); + } + for(i=0; p->rc==SQLITE_OK && irc); + pIter->aiSrcOrder[pIter->nTblCol] = pIter->nTblCol; + pIter->azTblCol[pIter->nTblCol++] = zCopy; + } + else if( 0==sqlite3_stricmp("rbu_rowid", zName) ){ + bRbuRowid = 1; + } + } + sqlite3_finalize(pStmt); + pStmt = 0; + + if( p->rc==SQLITE_OK + && rbuIsVacuum(p)==0 + && bRbuRowid!=(pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE) + ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf( + "table %q %s rbu_rowid column", pIter->zDataTbl, + (bRbuRowid ? "may not have" : "requires") + ); + } + + /* Check that all non-HIDDEN columns in the destination table are also + ** present in the input table. Populate the abTblPk[], azTblType[] and + ** aiTblOrder[] arrays at the same time. */ + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, + sqlite3_mprintf("PRAGMA table_info(%Q)", pIter->zTbl) + ); + } + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zName = (const char*)sqlite3_column_text(pStmt, 1); + if( zName==0 ) break; /* An OOM - finalize() below returns S_NOMEM */ + for(i=iOrder; inTblCol; i++){ + if( 0==strcmp(zName, pIter->azTblCol[i]) ) break; + } + if( i==pIter->nTblCol ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("column missing from %q: %s", + pIter->zDataTbl, zName + ); + }else{ + int iPk = sqlite3_column_int(pStmt, 5); + int bNotNull = sqlite3_column_int(pStmt, 3); + const char *zType = (const char*)sqlite3_column_text(pStmt, 2); + + if( i!=iOrder ){ + SWAP(int, pIter->aiSrcOrder[i], pIter->aiSrcOrder[iOrder]); + SWAP(char*, pIter->azTblCol[i], pIter->azTblCol[iOrder]); + } + + pIter->azTblType[iOrder] = rbuStrndup(zType, &p->rc); + assert( iPk>=0 ); + pIter->abTblPk[iOrder] = (u8)iPk; + pIter->abNotNull[iOrder] = (u8)bNotNull || (iPk!=0); + iOrder++; + } + } + + rbuFinalize(p, pStmt); + rbuObjIterCacheIndexedCols(p, pIter); + assert( pIter->eType!=RBU_PK_VTAB || pIter->abIndexed==0 ); + assert( pIter->eType!=RBU_PK_VTAB || pIter->nIndex==0 ); + } + + return p->rc; +} + +/* +** This function constructs and returns a pointer to a nul-terminated +** string containing some SQL clause or list based on one or more of the +** column names currently stored in the pIter->azTblCol[] array. +*/ +static char *rbuObjIterGetCollist( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter /* Object iterator for column names */ +){ + char *zList = 0; + const char *zSep = ""; + int i; + for(i=0; inTblCol; i++){ + const char *z = pIter->azTblCol[i]; + zList = rbuMPrintf(p, "%z%s\"%w\"", zList, zSep, z); + zSep = ", "; + } + return zList; +} + +/* +** Return a comma separated list of the quoted PRIMARY KEY column names, +** in order, for the current table. Before each column name, add the text +** zPre. After each column name, add the zPost text. Use zSeparator as +** the separator text (usually ", "). +*/ +static char *rbuObjIterGetPkList( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter, /* Object iterator for column names */ + const char *zPre, /* Before each quoted column name */ + const char *zSeparator, /* Separator to use between columns */ + const char *zPost /* After each quoted column name */ +){ + int iPk = 1; + char *zRet = 0; + const char *zSep = ""; + while( 1 ){ + int i; + for(i=0; inTblCol; i++){ + if( (int)pIter->abTblPk[i]==iPk ){ + const char *zCol = pIter->azTblCol[i]; + zRet = rbuMPrintf(p, "%z%s%s\"%w\"%s", zRet, zSep, zPre, zCol, zPost); + zSep = zSeparator; + break; + } + } + if( i==pIter->nTblCol ) break; + iPk++; + } + return zRet; +} + +/* +** This function is called as part of restarting an RBU vacuum within +** stage 1 of the process (while the *-oal file is being built) while +** updating a table (not an index). The table may be a rowid table or +** a WITHOUT ROWID table. It queries the target database to find the +** largest key that has already been written to the target table and +** constructs a WHERE clause that can be used to extract the remaining +** rows from the source table. For a rowid table, the WHERE clause +** is of the form: +** +** "WHERE _rowid_ > ?" +** +** and for WITHOUT ROWID tables: +** +** "WHERE (key1, key2) > (?, ?)" +** +** Instead of "?" placeholders, the actual WHERE clauses created by +** this function contain literal SQL values. +*/ +static char *rbuVacuumTableStart( + sqlite3rbu *p, /* RBU handle */ + RbuObjIter *pIter, /* RBU iterator object */ + int bRowid, /* True for a rowid table */ + const char *zWrite /* Target table name prefix */ +){ + sqlite3_stmt *pMax = 0; + char *zRet = 0; + if( bRowid ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, + sqlite3_mprintf( + "SELECT max(_rowid_) FROM \"%s%w\"", zWrite, pIter->zTbl + ) + ); + if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ + sqlite3_int64 iMax = sqlite3_column_int64(pMax, 0); + zRet = rbuMPrintf(p, " WHERE _rowid_ > %lld ", iMax); + } + rbuFinalize(p, pMax); + }else{ + char *zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", " DESC"); + char *zSelect = rbuObjIterGetPkList(p, pIter, "quote(", "||','||", ")"); + char *zList = rbuObjIterGetPkList(p, pIter, "", ", ", ""); + + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, + sqlite3_mprintf( + "SELECT %s FROM \"%s%w\" ORDER BY %s LIMIT 1", + zSelect, zWrite, pIter->zTbl, zOrder + ) + ); + if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ + const char *zVal = (const char*)sqlite3_column_text(pMax, 0); + zRet = rbuMPrintf(p, " WHERE (%s) > (%s) ", zList, zVal); + } + rbuFinalize(p, pMax); + } + + sqlite3_free(zOrder); + sqlite3_free(zSelect); + sqlite3_free(zList); + } + return zRet; +} + +/* +** This function is called as part of restating an RBU vacuum when the +** current operation is writing content to an index. If possible, it +** queries the target index b-tree for the largest key already written to +** it, then composes and returns an expression that can be used in a WHERE +** clause to select the remaining required rows from the source table. +** It is only possible to return such an expression if: +** +** * The index contains no DESC columns, and +** * The last key written to the index before the operation was +** suspended does not contain any NULL values. +** +** The expression is of the form: +** +** (index-field1, index-field2, ...) > (?, ?, ...) +** +** except that the "?" placeholders are replaced with literal values. +** +** If the expression cannot be created, NULL is returned. In this case, +** the caller has to use an OFFSET clause to extract only the required +** rows from the sourct table, just as it does for an RBU update operation. +*/ +char *rbuVacuumIndexStart( + sqlite3rbu *p, /* RBU handle */ + RbuObjIter *pIter /* RBU iterator object */ +){ + char *zOrder = 0; + char *zLhs = 0; + char *zSelect = 0; + char *zVector = 0; + char *zRet = 0; + int bFailed = 0; + const char *zSep = ""; + int iCol = 0; + sqlite3_stmt *pXInfo = 0; + + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", pIter->zIdx) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + const char *zCol; + if( sqlite3_column_int(pXInfo, 3) ){ + bFailed = 1; + break; + } + + if( iCid<0 ){ + if( pIter->eType==RBU_PK_IPK ){ + int i; + for(i=0; pIter->abTblPk[i]==0; i++); + assert( inTblCol ); + zCol = pIter->azTblCol[i]; + }else{ + zCol = "_rowid_"; + } + }else{ + zCol = pIter->azTblCol[iCid]; + } + + zLhs = rbuMPrintf(p, "%z%s \"%w\" COLLATE %Q", + zLhs, zSep, zCol, zCollate + ); + zOrder = rbuMPrintf(p, "%z%s \"rbu_imp_%d%w\" COLLATE %Q DESC", + zOrder, zSep, iCol, zCol, zCollate + ); + zSelect = rbuMPrintf(p, "%z%s quote(\"rbu_imp_%d%w\")", + zSelect, zSep, iCol, zCol + ); + zSep = ", "; + iCol++; + } + rbuFinalize(p, pXInfo); + if( bFailed ) goto index_start_out; + + if( p->rc==SQLITE_OK ){ + sqlite3_stmt *pSel = 0; + + p->rc = prepareFreeAndCollectError(p->dbMain, &pSel, &p->zErrmsg, + sqlite3_mprintf("SELECT %s FROM \"rbu_imp_%w\" ORDER BY %s LIMIT 1", + zSelect, pIter->zTbl, zOrder + ) + ); + if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSel) ){ + zSep = ""; + for(iCol=0; iColnCol; iCol++){ + const char *zQuoted = (const char*)sqlite3_column_text(pSel, iCol); + if( zQuoted[0]=='N' ){ + bFailed = 1; + break; + } + zVector = rbuMPrintf(p, "%z%s%s", zVector, zSep, zQuoted); + zSep = ", "; + } + + if( !bFailed ){ + zRet = rbuMPrintf(p, "(%s) > (%s)", zLhs, zVector); + } + } + rbuFinalize(p, pSel); + } + + index_start_out: + sqlite3_free(zOrder); + sqlite3_free(zSelect); + sqlite3_free(zVector); + sqlite3_free(zLhs); + return zRet; +} + +/* +** This function is used to create a SELECT list (the list of SQL +** expressions that follows a SELECT keyword) for a SELECT statement +** used to read from an data_xxx or rbu_tmp_xxx table while updating the +** index object currently indicated by the iterator object passed as the +** second argument. A "PRAGMA index_xinfo = " statement is used +** to obtain the required information. +** +** If the index is of the following form: +** +** CREATE INDEX i1 ON t1(c, b COLLATE nocase); +** +** and "t1" is a table with an explicit INTEGER PRIMARY KEY column +** "ipk", the returned string is: +** +** "`c` COLLATE 'BINARY', `b` COLLATE 'NOCASE', `ipk` COLLATE 'BINARY'" +** +** As well as the returned string, three other malloc'd strings are +** returned via output parameters. As follows: +** +** pzImposterCols: ... +** pzImposterPk: ... +** pzWhere: ... +*/ +static char *rbuObjIterGetIndexCols( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter, /* Object iterator for column names */ + char **pzImposterCols, /* OUT: Columns for imposter table */ + char **pzImposterPk, /* OUT: Imposter PK clause */ + char **pzWhere, /* OUT: WHERE clause */ + int *pnBind /* OUT: Trbul number of columns */ +){ + int rc = p->rc; /* Error code */ + int rc2; /* sqlite3_finalize() return code */ + char *zRet = 0; /* String to return */ + char *zImpCols = 0; /* String to return via *pzImposterCols */ + char *zImpPK = 0; /* String to return via *pzImposterPK */ + char *zWhere = 0; /* String to return via *pzWhere */ + int nBind = 0; /* Value to return via *pnBind */ + const char *zCom = ""; /* Set to ", " later on */ + const char *zAnd = ""; /* Set to " AND " later on */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA index_xinfo = ? */ + + if( rc==SQLITE_OK ){ + assert( p->zErrmsg==0 ); + rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", pIter->zIdx) + ); + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + int bDesc = sqlite3_column_int(pXInfo, 3); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + const char *zCol = 0; + const char *zType; + + if( iCid==-2 ){ + int iSeq = sqlite3_column_int(pXInfo, 0); + zRet = sqlite3_mprintf("%z%s(%.*s) COLLATE %Q", zRet, zCom, + pIter->aIdxCol[iSeq].nSpan, pIter->aIdxCol[iSeq].zSpan, zCollate + ); + zType = ""; + }else { + if( iCid<0 ){ + /* An integer primary key. If the table has an explicit IPK, use + ** its name. Otherwise, use "rbu_rowid". */ + if( pIter->eType==RBU_PK_IPK ){ + int i; + for(i=0; pIter->abTblPk[i]==0; i++); + assert( inTblCol ); + zCol = pIter->azTblCol[i]; + }else if( rbuIsVacuum(p) ){ + zCol = "_rowid_"; + }else{ + zCol = "rbu_rowid"; + } + zType = "INTEGER"; + }else{ + zCol = pIter->azTblCol[iCid]; + zType = pIter->azTblType[iCid]; + } + zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom,zCol,zCollate); + } + + if( pIter->bUnique==0 || sqlite3_column_int(pXInfo, 5) ){ + const char *zOrder = (bDesc ? " DESC" : ""); + zImpPK = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\"%s", + zImpPK, zCom, nBind, zCol, zOrder + ); + } + zImpCols = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\" %s COLLATE %Q", + zImpCols, zCom, nBind, zCol, zType, zCollate + ); + zWhere = sqlite3_mprintf( + "%z%s\"rbu_imp_%d%w\" IS ?", zWhere, zAnd, nBind, zCol + ); + if( zRet==0 || zImpPK==0 || zImpCols==0 || zWhere==0 ) rc = SQLITE_NOMEM; + zCom = ", "; + zAnd = " AND "; + nBind++; + } + + rc2 = sqlite3_finalize(pXInfo); + if( rc==SQLITE_OK ) rc = rc2; + + if( rc!=SQLITE_OK ){ + sqlite3_free(zRet); + sqlite3_free(zImpCols); + sqlite3_free(zImpPK); + sqlite3_free(zWhere); + zRet = 0; + zImpCols = 0; + zImpPK = 0; + zWhere = 0; + p->rc = rc; + } + + *pzImposterCols = zImpCols; + *pzImposterPk = zImpPK; + *pzWhere = zWhere; + *pnBind = nBind; + return zRet; +} + +/* +** Assuming the current table columns are "a", "b" and "c", and the zObj +** paramter is passed "old", return a string of the form: +** +** "old.a, old.b, old.b" +** +** With the column names escaped. +** +** For tables with implicit rowids - RBU_PK_EXTERNAL and RBU_PK_NONE, append +** the text ", old._rowid_" to the returned value. +*/ +static char *rbuObjIterGetOldlist( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zObj +){ + char *zList = 0; + if( p->rc==SQLITE_OK && pIter->abIndexed ){ + const char *zS = ""; + int i; + for(i=0; inTblCol; i++){ + if( pIter->abIndexed[i] ){ + const char *zCol = pIter->azTblCol[i]; + zList = sqlite3_mprintf("%z%s%s.\"%w\"", zList, zS, zObj, zCol); + }else{ + zList = sqlite3_mprintf("%z%sNULL", zList, zS); + } + zS = ", "; + if( zList==0 ){ + p->rc = SQLITE_NOMEM; + break; + } + } + + /* For a table with implicit rowids, append "old._rowid_" to the list. */ + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zList = rbuMPrintf(p, "%z, %s._rowid_", zList, zObj); + } + } + return zList; +} + +/* +** Return an expression that can be used in a WHERE clause to match the +** primary key of the current table. For example, if the table is: +** +** CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)); +** +** Return the string: +** +** "b = ?1 AND c = ?2" +*/ +static char *rbuObjIterGetWhere( + sqlite3rbu *p, + RbuObjIter *pIter +){ + char *zList = 0; + if( pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE ){ + zList = rbuMPrintf(p, "_rowid_ = ?%d", pIter->nTblCol+1); + }else if( pIter->eType==RBU_PK_EXTERNAL ){ + const char *zSep = ""; + int i; + for(i=0; inTblCol; i++){ + if( pIter->abTblPk[i] ){ + zList = rbuMPrintf(p, "%z%sc%d=?%d", zList, zSep, i, i+1); + zSep = " AND "; + } + } + zList = rbuMPrintf(p, + "_rowid_ = (SELECT id FROM rbu_imposter2 WHERE %z)", zList + ); + + }else{ + const char *zSep = ""; + int i; + for(i=0; inTblCol; i++){ + if( pIter->abTblPk[i] ){ + const char *zCol = pIter->azTblCol[i]; + zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", zList, zSep, zCol, i+1); + zSep = " AND "; + } + } + } + return zList; +} + +/* +** The SELECT statement iterating through the keys for the current object +** (p->objiter.pSelect) currently points to a valid row. However, there +** is something wrong with the rbu_control value in the rbu_control value +** stored in the (p->nCol+1)'th column. Set the error code and error message +** of the RBU handle to something reflecting this. +*/ +static void rbuBadControlError(sqlite3rbu *p){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("invalid rbu_control value"); +} + + +/* +** Return a nul-terminated string containing the comma separated list of +** assignments that should be included following the "SET" keyword of +** an UPDATE statement used to update the table object that the iterator +** passed as the second argument currently points to if the rbu_control +** column of the data_xxx table entry is set to zMask. +** +** The memory for the returned string is obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free it using +** sqlite3_free(). +** +** If an OOM error is encountered when allocating space for the new +** string, an error code is left in the rbu handle passed as the first +** argument and NULL is returned. Or, if an error has already occurred +** when this function is called, NULL is returned immediately, without +** attempting the allocation or modifying the stored error code. +*/ +static char *rbuObjIterGetSetlist( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zMask +){ + char *zList = 0; + if( p->rc==SQLITE_OK ){ + int i; + + if( (int)strlen(zMask)!=pIter->nTblCol ){ + rbuBadControlError(p); + }else{ + const char *zSep = ""; + for(i=0; inTblCol; i++){ + char c = zMask[pIter->aiSrcOrder[i]]; + if( c=='x' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", + zList, zSep, pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + else if( c=='d' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_delta(\"%w\", ?%d)", + zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + else if( c=='f' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_fossil_delta(\"%w\", ?%d)", + zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + } + } + } + return zList; +} + +/* +** Return a nul-terminated string consisting of nByte comma separated +** "?" expressions. For example, if nByte is 3, return a pointer to +** a buffer containing the string "?,?,?". +** +** The memory for the returned string is obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free it using +** sqlite3_free(). +** +** If an OOM error is encountered when allocating space for the new +** string, an error code is left in the rbu handle passed as the first +** argument and NULL is returned. Or, if an error has already occurred +** when this function is called, NULL is returned immediately, without +** attempting the allocation or modifying the stored error code. +*/ +static char *rbuObjIterGetBindlist(sqlite3rbu *p, int nBind){ + char *zRet = 0; + sqlite3_int64 nByte = 2*(sqlite3_int64)nBind + 1; + + zRet = (char*)rbuMalloc(p, nByte); + if( zRet ){ + int i; + for(i=0; izIdx==0 ); + if( p->rc==SQLITE_OK ){ + const char *zSep = "PRIMARY KEY("; + sqlite3_stmt *pXList = 0; /* PRAGMA index_list = (pIter->zTbl) */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA index_xinfo = */ + + p->rc = prepareFreeAndCollectError(p->dbMain, &pXList, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXList) ){ + const char *zOrig = (const char*)sqlite3_column_text(pXList,3); + if( zOrig && strcmp(zOrig, "pk")==0 ){ + const char *zIdx = (const char*)sqlite3_column_text(pXList,1); + if( zIdx ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + } + break; + } + } + rbuFinalize(p, pXList); + + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + if( sqlite3_column_int(pXInfo, 5) ){ + /* int iCid = sqlite3_column_int(pXInfo, 0); */ + const char *zCol = (const char*)sqlite3_column_text(pXInfo, 2); + const char *zDesc = sqlite3_column_int(pXInfo, 3) ? " DESC" : ""; + z = rbuMPrintf(p, "%z%s\"%w\"%s", z, zSep, zCol, zDesc); + zSep = ", "; + } + } + z = rbuMPrintf(p, "%z)", z); + rbuFinalize(p, pXInfo); + } + return z; +} + +/* +** This function creates the second imposter table used when writing to +** a table b-tree where the table has an external primary key. If the +** iterator passed as the second argument does not currently point to +** a table (not index) with an external primary key, this function is a +** no-op. +** +** Assuming the iterator does point to a table with an external PK, this +** function creates a WITHOUT ROWID imposter table named "rbu_imposter2" +** used to access that PK index. For example, if the target table is +** declared as follows: +** +** CREATE TABLE t1(a, b TEXT, c REAL, PRIMARY KEY(b, c)); +** +** then the imposter table schema is: +** +** CREATE TABLE rbu_imposter2(c1 TEXT, c2 REAL, id INTEGER) WITHOUT ROWID; +** +*/ +static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ + if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_EXTERNAL ){ + int tnum = pIter->iPkTnum; /* Root page of PK index */ + sqlite3_stmt *pQuery = 0; /* SELECT name ... WHERE rootpage = $tnum */ + const char *zIdx = 0; /* Name of PK index */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA main.index_xinfo = $zIdx */ + const char *zComma = ""; + char *zCols = 0; /* Used to build up list of table cols */ + char *zPk = 0; /* Used to build up table PK declaration */ + + /* Figure out the name of the primary key index for the current table. + ** This is needed for the argument to "PRAGMA index_xinfo". Set + ** zIdx to point to a nul-terminated string containing this name. */ + p->rc = prepareAndCollectError(p->dbMain, &pQuery, &p->zErrmsg, + "SELECT name FROM sqlite_master WHERE rootpage = ?" + ); + if( p->rc==SQLITE_OK ){ + sqlite3_bind_int(pQuery, 1, tnum); + if( SQLITE_ROW==sqlite3_step(pQuery) ){ + zIdx = (const char*)sqlite3_column_text(pQuery, 0); + } + } + if( zIdx ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + } + rbuFinalize(p, pQuery); + + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int bKey = sqlite3_column_int(pXInfo, 5); + if( bKey ){ + int iCid = sqlite3_column_int(pXInfo, 1); + int bDesc = sqlite3_column_int(pXInfo, 3); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %Q", zCols, zComma, + iCid, pIter->azTblType[iCid], zCollate + ); + zPk = rbuMPrintf(p, "%z%sc%d%s", zPk, zComma, iCid, bDesc?" DESC":""); + zComma = ", "; + } + } + zCols = rbuMPrintf(p, "%z, id INTEGER", zCols); + rbuFinalize(p, pXInfo); + + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); + rbuMPrintfExec(p, p->dbMain, + "CREATE TABLE rbu_imposter2(%z, PRIMARY KEY(%z)) WITHOUT ROWID", + zCols, zPk + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + } +} + +/* +** If an error has already occurred when this function is called, it +** immediately returns zero (without doing any work). Or, if an error +** occurs during the execution of this function, it sets the error code +** in the sqlite3rbu object indicated by the first argument and returns +** zero. +** +** The iterator passed as the second argument is guaranteed to point to +** a table (not an index) when this function is called. This function +** attempts to create any imposter table required to write to the main +** table b-tree of the table before returning. Non-zero is returned if +** an imposter table are created, or zero otherwise. +** +** An imposter table is required in all cases except RBU_PK_VTAB. Only +** virtual tables are written to directly. The imposter table has the +** same schema as the actual target table (less any UNIQUE constraints). +** More precisely, the "same schema" means the same columns, types, +** collation sequences. For tables that do not have an external PRIMARY +** KEY, it also means the same PRIMARY KEY declaration. +*/ +static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){ + if( p->rc==SQLITE_OK && pIter->eType!=RBU_PK_VTAB ){ + int tnum = pIter->iTnum; + const char *zComma = ""; + char *zSql = 0; + int iCol; + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); + + for(iCol=0; p->rc==SQLITE_OK && iColnTblCol; iCol++){ + const char *zPk = ""; + const char *zCol = pIter->azTblCol[iCol]; + const char *zColl = 0; + + p->rc = sqlite3_table_column_metadata( + p->dbMain, "main", pIter->zTbl, zCol, 0, &zColl, 0, 0, 0 + ); + + if( pIter->eType==RBU_PK_IPK && pIter->abTblPk[iCol] ){ + /* If the target table column is an "INTEGER PRIMARY KEY", add + ** "PRIMARY KEY" to the imposter table column declaration. */ + zPk = "PRIMARY KEY "; + } + zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %Q%s", + zSql, zComma, zCol, pIter->azTblType[iCol], zPk, zColl, + (pIter->abNotNull[iCol] ? " NOT NULL" : "") + ); + zComma = ", "; + } + + if( pIter->eType==RBU_PK_WITHOUT_ROWID ){ + char *zPk = rbuWithoutRowidPK(p, pIter); + if( zPk ){ + zSql = rbuMPrintf(p, "%z, %z", zSql, zPk); + } + } + + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); + rbuMPrintfExec(p, p->dbMain, "CREATE TABLE \"rbu_imp_%w\"(%z)%s", + pIter->zTbl, zSql, + (pIter->eType==RBU_PK_WITHOUT_ROWID ? " WITHOUT ROWID" : "") + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + } +} + +/* +** Prepare a statement used to insert rows into the "rbu_tmp_xxx" table. +** Specifically a statement of the form: +** +** INSERT INTO rbu_tmp_xxx VALUES(?, ?, ? ...); +** +** The number of bound variables is equal to the number of columns in +** the target table, plus one (for the rbu_control column), plus one more +** (for the rbu_rowid column) if the target table is an implicit IPK or +** virtual table. +*/ +static void rbuObjIterPrepareTmpInsert( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zCollist, + const char *zRbuRowid +){ + int bRbuRowid = (pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE); + char *zBind = rbuObjIterGetBindlist(p, pIter->nTblCol + 1 + bRbuRowid); + if( zBind ){ + assert( pIter->pTmpInsert==0 ); + p->rc = prepareFreeAndCollectError( + p->dbRbu, &pIter->pTmpInsert, &p->zErrmsg, sqlite3_mprintf( + "INSERT INTO %s.'rbu_tmp_%q'(rbu_control,%s%s) VALUES(%z)", + p->zStateDb, pIter->zDataTbl, zCollist, zRbuRowid, zBind + )); + } +} + +static void rbuTmpInsertFunc( + sqlite3_context *pCtx, + int nVal, + sqlite3_value **apVal +){ + sqlite3rbu *p = sqlite3_user_data(pCtx); + int rc = SQLITE_OK; + int i; + + assert( sqlite3_value_int(apVal[0])!=0 + || p->objiter.eType==RBU_PK_EXTERNAL + || p->objiter.eType==RBU_PK_NONE + ); + if( sqlite3_value_int(apVal[0])!=0 ){ + p->nPhaseOneStep += p->objiter.nIndex; + } + + for(i=0; rc==SQLITE_OK && iobjiter.pTmpInsert, i+1, apVal[i]); + } + if( rc==SQLITE_OK ){ + sqlite3_step(p->objiter.pTmpInsert); + rc = sqlite3_reset(p->objiter.pTmpInsert); + } + + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + } +} + +static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ + sqlite3_stmt *pStmt = 0; + int rc = p->rc; + char *zRet = 0; + + assert( pIter->zIdxSql==0 && pIter->nIdxCol==0 && pIter->aIdxCol==0 ); + + if( rc==SQLITE_OK ){ + rc = prepareAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, + "SELECT trim(sql) FROM sqlite_master WHERE type='index' AND name=?" + ); + } + if( rc==SQLITE_OK ){ + int rc2; + rc = sqlite3_bind_text(pStmt, 1, pIter->zIdx, -1, SQLITE_STATIC); + if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + char *zSql = (char*)sqlite3_column_text(pStmt, 0); + if( zSql ){ + pIter->zIdxSql = zSql = rbuStrndup(zSql, &rc); + } + if( zSql ){ + int nParen = 0; /* Number of open parenthesis */ + int i; + int iIdxCol = 0; + int nIdxAlloc = 0; + for(i=0; zSql[i]; i++){ + char c = zSql[i]; + + /* If necessary, grow the pIter->aIdxCol[] array */ + if( iIdxCol==nIdxAlloc ){ + RbuSpan *aIdxCol = (RbuSpan*)sqlite3_realloc( + pIter->aIdxCol, (nIdxAlloc+16)*sizeof(RbuSpan) + ); + if( aIdxCol==0 ){ + rc = SQLITE_NOMEM; + break; + } + pIter->aIdxCol = aIdxCol; + nIdxAlloc += 16; + } + + if( c=='(' ){ + if( nParen==0 ){ + assert( iIdxCol==0 ); + pIter->aIdxCol[0].zSpan = &zSql[i+1]; + } + nParen++; + } + else if( c==')' ){ + nParen--; + if( nParen==0 ){ + int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; + pIter->aIdxCol[iIdxCol++].nSpan = nSpan; + i++; + break; + } + }else if( c==',' && nParen==1 ){ + int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; + pIter->aIdxCol[iIdxCol++].nSpan = nSpan; + pIter->aIdxCol[iIdxCol].zSpan = &zSql[i+1]; + }else if( c=='"' || c=='\'' || c=='`' ){ + for(i++; 1; i++){ + if( zSql[i]==c ){ + if( zSql[i+1]!=c ) break; + i++; + } + } + }else if( c=='[' ){ + for(i++; 1; i++){ + if( zSql[i]==']' ) break; + } + }else if( c=='-' && zSql[i+1]=='-' ){ + for(i=i+2; zSql[i] && zSql[i]!='\n'; i++); + if( zSql[i]=='\0' ) break; + }else if( c=='/' && zSql[i+1]=='*' ){ + for(i=i+2; zSql[i] && (zSql[i]!='*' || zSql[i+1]!='/'); i++); + if( zSql[i]=='\0' ) break; + i++; + } + } + if( zSql[i] ){ + zRet = rbuStrndup(&zSql[i], &rc); + } + pIter->nIdxCol = iIdxCol; + } + } + + rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + } + + p->rc = rc; + return zRet; +} + +/* +** Ensure that the SQLite statement handles required to update the +** target database object currently indicated by the iterator passed +** as the second argument are available. +*/ +static int rbuObjIterPrepareAll( + sqlite3rbu *p, + RbuObjIter *pIter, + int nOffset /* Add "LIMIT -1 OFFSET $nOffset" to SELECT */ +){ + assert( pIter->bCleanup==0 ); + if( pIter->pSelect==0 && rbuObjIterCacheTableInfo(p, pIter)==SQLITE_OK ){ + const int tnum = pIter->iTnum; + char *zCollist = 0; /* List of indexed columns */ + char **pz = &p->zErrmsg; + const char *zIdx = pIter->zIdx; + char *zLimit = 0; + + if( nOffset ){ + zLimit = sqlite3_mprintf(" LIMIT -1 OFFSET %d", nOffset); + if( !zLimit ) p->rc = SQLITE_NOMEM; + } + + if( zIdx ){ + const char *zTbl = pIter->zTbl; + char *zImposterCols = 0; /* Columns for imposter table */ + char *zImposterPK = 0; /* Primary key declaration for imposter */ + char *zWhere = 0; /* WHERE clause on PK columns */ + char *zBind = 0; + char *zPart = 0; + int nBind = 0; + + assert( pIter->eType!=RBU_PK_VTAB ); + zPart = rbuObjIterGetIndexWhere(p, pIter); + zCollist = rbuObjIterGetIndexCols( + p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind + ); + zBind = rbuObjIterGetBindlist(p, nBind); + + /* Create the imposter table used to write to this index. */ + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1,tnum); + rbuMPrintfExec(p, p->dbMain, + "CREATE TABLE \"rbu_imp_%w\"( %s, PRIMARY KEY( %s ) ) WITHOUT ROWID", + zTbl, zImposterCols, zImposterPK + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + + /* Create the statement to insert index entries */ + pIter->nCol = nBind; + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError( + p->dbMain, &pIter->pInsert, &p->zErrmsg, + sqlite3_mprintf("INSERT INTO \"rbu_imp_%w\" VALUES(%s)", zTbl, zBind) + ); + } + + /* And to delete index entries */ + if( rbuIsVacuum(p)==0 && p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError( + p->dbMain, &pIter->pDelete, &p->zErrmsg, + sqlite3_mprintf("DELETE FROM \"rbu_imp_%w\" WHERE %s", zTbl, zWhere) + ); + } + + /* Create the SELECT statement to read keys in sorted order */ + if( p->rc==SQLITE_OK ){ + char *zSql; + if( rbuIsVacuum(p) ){ + char *zStart = 0; + if( nOffset ){ + zStart = rbuVacuumIndexStart(p, pIter); + if( zStart ){ + sqlite3_free(zLimit); + zLimit = 0; + } + } + + zSql = sqlite3_mprintf( + "SELECT %s, 0 AS rbu_control FROM '%q' %s %s %s ORDER BY %s%s", + zCollist, + pIter->zDataTbl, + zPart, + (zStart ? (zPart ? "AND" : "WHERE") : ""), zStart, + zCollist, zLimit + ); + sqlite3_free(zStart); + }else + + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zSql = sqlite3_mprintf( + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' %s ORDER BY %s%s", + zCollist, p->zStateDb, pIter->zDataTbl, + zPart, zCollist, zLimit + ); + }else{ + zSql = sqlite3_mprintf( + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' %s " + "UNION ALL " + "SELECT %s, rbu_control FROM '%q' " + "%s %s typeof(rbu_control)='integer' AND rbu_control!=1 " + "ORDER BY %s%s", + zCollist, p->zStateDb, pIter->zDataTbl, zPart, + zCollist, pIter->zDataTbl, + zPart, + (zPart ? "AND" : "WHERE"), + zCollist, zLimit + ); + } + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbRbu,&pIter->pSelect,pz,zSql); + }else{ + sqlite3_free(zSql); + } + } + + sqlite3_free(zImposterCols); + sqlite3_free(zImposterPK); + sqlite3_free(zWhere); + sqlite3_free(zBind); + sqlite3_free(zPart); + }else{ + int bRbuRowid = (pIter->eType==RBU_PK_VTAB) + ||(pIter->eType==RBU_PK_NONE) + ||(pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p)); + const char *zTbl = pIter->zTbl; /* Table this step applies to */ + const char *zWrite; /* Imposter table name */ + + char *zBindings = rbuObjIterGetBindlist(p, pIter->nTblCol + bRbuRowid); + char *zWhere = rbuObjIterGetWhere(p, pIter); + char *zOldlist = rbuObjIterGetOldlist(p, pIter, "old"); + char *zNewlist = rbuObjIterGetOldlist(p, pIter, "new"); + + zCollist = rbuObjIterGetCollist(p, pIter); + pIter->nCol = pIter->nTblCol; + + /* Create the imposter table or tables (if required). */ + rbuCreateImposterTable(p, pIter); + rbuCreateImposterTable2(p, pIter); + zWrite = (pIter->eType==RBU_PK_VTAB ? "" : "rbu_imp_"); + + /* Create the INSERT statement to write to the target PK b-tree */ + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pInsert, pz, + sqlite3_mprintf( + "INSERT INTO \"%s%w\"(%s%s) VALUES(%s)", + zWrite, zTbl, zCollist, (bRbuRowid ? ", _rowid_" : ""), zBindings + ) + ); + } + + /* Create the DELETE statement to write to the target PK b-tree. + ** Because it only performs INSERT operations, this is not required for + ** an rbu vacuum handle. */ + if( rbuIsVacuum(p)==0 && p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pDelete, pz, + sqlite3_mprintf( + "DELETE FROM \"%s%w\" WHERE %s", zWrite, zTbl, zWhere + ) + ); + } + + if( rbuIsVacuum(p)==0 && pIter->abIndexed ){ + const char *zRbuRowid = ""; + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zRbuRowid = ", rbu_rowid"; + } + + /* Create the rbu_tmp_xxx table and the triggers to populate it. */ + rbuMPrintfExec(p, p->dbRbu, + "CREATE TABLE IF NOT EXISTS %s.'rbu_tmp_%q' AS " + "SELECT *%s FROM '%q' WHERE 0;" + , p->zStateDb, pIter->zDataTbl + , (pIter->eType==RBU_PK_EXTERNAL ? ", 0 AS rbu_rowid" : "") + , pIter->zDataTbl + ); + + rbuMPrintfExec(p, p->dbMain, + "CREATE TEMP TRIGGER rbu_delete_tr BEFORE DELETE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(3, %s);" + "END;" + + "CREATE TEMP TRIGGER rbu_update1_tr BEFORE UPDATE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(3, %s);" + "END;" + + "CREATE TEMP TRIGGER rbu_update2_tr AFTER UPDATE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(4, %s);" + "END;", + zWrite, zTbl, zOldlist, + zWrite, zTbl, zOldlist, + zWrite, zTbl, zNewlist + ); + + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + rbuMPrintfExec(p, p->dbMain, + "CREATE TEMP TRIGGER rbu_insert_tr AFTER INSERT ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(0, %s);" + "END;", + zWrite, zTbl, zNewlist + ); + } + + rbuObjIterPrepareTmpInsert(p, pIter, zCollist, zRbuRowid); + } + + /* Create the SELECT statement to read keys from data_xxx */ + if( p->rc==SQLITE_OK ){ + const char *zRbuRowid = ""; + char *zStart = 0; + char *zOrder = 0; + if( bRbuRowid ){ + zRbuRowid = rbuIsVacuum(p) ? ",_rowid_ " : ",rbu_rowid"; + } + + if( rbuIsVacuum(p) ){ + if( nOffset ){ + zStart = rbuVacuumTableStart(p, pIter, bRbuRowid, zWrite); + if( zStart ){ + sqlite3_free(zLimit); + zLimit = 0; + } + } + if( bRbuRowid ){ + zOrder = rbuMPrintf(p, "_rowid_"); + }else{ + zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", ""); + } + } + + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, + sqlite3_mprintf( + "SELECT %s,%s rbu_control%s FROM '%q'%s %s %s %s", + zCollist, + (rbuIsVacuum(p) ? "0 AS " : ""), + zRbuRowid, + pIter->zDataTbl, (zStart ? zStart : ""), + (zOrder ? "ORDER BY" : ""), zOrder, + zLimit + ) + ); + } + sqlite3_free(zStart); + sqlite3_free(zOrder); + } + + sqlite3_free(zWhere); + sqlite3_free(zOldlist); + sqlite3_free(zNewlist); + sqlite3_free(zBindings); + } + sqlite3_free(zCollist); + sqlite3_free(zLimit); + } + + return p->rc; +} + +/* +** Set output variable *ppStmt to point to an UPDATE statement that may +** be used to update the imposter table for the main table b-tree of the +** table object that pIter currently points to, assuming that the +** rbu_control column of the data_xyz table contains zMask. +** +** If the zMask string does not specify any columns to update, then this +** is not an error. Output variable *ppStmt is set to NULL in this case. +*/ +static int rbuGetUpdateStmt( + sqlite3rbu *p, /* RBU handle */ + RbuObjIter *pIter, /* Object iterator */ + const char *zMask, /* rbu_control value ('x.x.') */ + sqlite3_stmt **ppStmt /* OUT: UPDATE statement handle */ +){ + RbuUpdateStmt **pp; + RbuUpdateStmt *pUp = 0; + int nUp = 0; + + /* In case an error occurs */ + *ppStmt = 0; + + /* Search for an existing statement. If one is found, shift it to the front + ** of the LRU queue and return immediately. Otherwise, leave nUp pointing + ** to the number of statements currently in the cache and pUp to the + ** last object in the list. */ + for(pp=&pIter->pRbuUpdate; *pp; pp=&((*pp)->pNext)){ + pUp = *pp; + if( strcmp(pUp->zMask, zMask)==0 ){ + *pp = pUp->pNext; + pUp->pNext = pIter->pRbuUpdate; + pIter->pRbuUpdate = pUp; + *ppStmt = pUp->pUpdate; + return SQLITE_OK; + } + nUp++; + } + assert( pUp==0 || pUp->pNext==0 ); + + if( nUp>=SQLITE_RBU_UPDATE_CACHESIZE ){ + for(pp=&pIter->pRbuUpdate; *pp!=pUp; pp=&((*pp)->pNext)); + *pp = 0; + sqlite3_finalize(pUp->pUpdate); + pUp->pUpdate = 0; + }else{ + pUp = (RbuUpdateStmt*)rbuMalloc(p, sizeof(RbuUpdateStmt)+pIter->nTblCol+1); + } + + if( pUp ){ + char *zWhere = rbuObjIterGetWhere(p, pIter); + char *zSet = rbuObjIterGetSetlist(p, pIter, zMask); + char *zUpdate = 0; + + pUp->zMask = (char*)&pUp[1]; + memcpy(pUp->zMask, zMask, pIter->nTblCol); + pUp->pNext = pIter->pRbuUpdate; + pIter->pRbuUpdate = pUp; + + if( zSet ){ + const char *zPrefix = ""; + + if( pIter->eType!=RBU_PK_VTAB ) zPrefix = "rbu_imp_"; + zUpdate = sqlite3_mprintf("UPDATE \"%s%w\" SET %s WHERE %s", + zPrefix, pIter->zTbl, zSet, zWhere + ); + p->rc = prepareFreeAndCollectError( + p->dbMain, &pUp->pUpdate, &p->zErrmsg, zUpdate + ); + *ppStmt = pUp->pUpdate; + } + sqlite3_free(zWhere); + sqlite3_free(zSet); + } + + return p->rc; +} + +static sqlite3 *rbuOpenDbhandle( + sqlite3rbu *p, + const char *zName, + int bUseVfs +){ + sqlite3 *db = 0; + if( p->rc==SQLITE_OK ){ + const int flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_URI; + p->rc = sqlite3_open_v2(zName, &db, flags, bUseVfs ? p->zVfsName : 0); + if( p->rc ){ + p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + sqlite3_close(db); + db = 0; + } + } + return db; +} + +/* +** Free an RbuState object allocated by rbuLoadState(). +*/ +static void rbuFreeState(RbuState *p){ + if( p ){ + sqlite3_free(p->zTbl); + sqlite3_free(p->zDataTbl); + sqlite3_free(p->zIdx); + sqlite3_free(p); + } +} + +/* +** Allocate an RbuState object and load the contents of the rbu_state +** table into it. Return a pointer to the new object. It is the +** responsibility of the caller to eventually free the object using +** sqlite3_free(). +** +** If an error occurs, leave an error code and message in the rbu handle +** and return NULL. +*/ +static RbuState *rbuLoadState(sqlite3rbu *p){ + RbuState *pRet = 0; + sqlite3_stmt *pStmt = 0; + int rc; + int rc2; + + pRet = (RbuState*)rbuMalloc(p, sizeof(RbuState)); + if( pRet==0 ) return 0; + + rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + sqlite3_mprintf("SELECT k, v FROM %s.rbu_state", p->zStateDb) + ); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + switch( sqlite3_column_int(pStmt, 0) ){ + case RBU_STATE_STAGE: + pRet->eStage = sqlite3_column_int(pStmt, 1); + if( pRet->eStage!=RBU_STAGE_OAL + && pRet->eStage!=RBU_STAGE_MOVE + && pRet->eStage!=RBU_STAGE_CKPT + ){ + p->rc = SQLITE_CORRUPT; + } + break; + + case RBU_STATE_TBL: + pRet->zTbl = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + case RBU_STATE_IDX: + pRet->zIdx = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + case RBU_STATE_ROW: + pRet->nRow = sqlite3_column_int(pStmt, 1); + break; + + case RBU_STATE_PROGRESS: + pRet->nProgress = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_CKPT: + pRet->iWalCksum = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_COOKIE: + pRet->iCookie = (u32)sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_OALSZ: + pRet->iOalSz = (u32)sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_PHASEONESTEP: + pRet->nPhaseOneStep = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_DATATBL: + pRet->zDataTbl = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + default: + rc = SQLITE_CORRUPT; + break; + } + } + rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + + p->rc = rc; + return pRet; +} + + +/* +** Open the database handle and attach the RBU database as "rbu". If an +** error occurs, leave an error code and message in the RBU handle. +*/ +static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ + assert( p->rc || (p->dbMain==0 && p->dbRbu==0) ); + assert( p->rc || rbuIsVacuum(p) || p->zTarget!=0 ); + + /* Open the RBU database */ + p->dbRbu = rbuOpenDbhandle(p, p->zRbu, 1); + + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); + if( p->zState==0 ){ + const char *zFile = sqlite3_db_filename(p->dbRbu, "main"); + p->zState = rbuMPrintf(p, "file://%s-vacuum?modeof=%s", zFile, zFile); + } + } + + /* If using separate RBU and state databases, attach the state database to + ** the RBU db handle now. */ + if( p->zState ){ + rbuMPrintfExec(p, p->dbRbu, "ATTACH %Q AS stat", p->zState); + memcpy(p->zStateDb, "stat", 4); + }else{ + memcpy(p->zStateDb, "main", 4); + } + +#if 0 + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + p->rc = sqlite3_exec(p->dbRbu, "BEGIN", 0, 0, 0); + } +#endif + + /* If it has not already been created, create the rbu_state table */ + rbuMPrintfExec(p, p->dbRbu, RBU_CREATE_STATE, p->zStateDb); + +#if 0 + if( rbuIsVacuum(p) ){ + if( p->rc==SQLITE_OK ){ + int rc2; + int bOk = 0; + sqlite3_stmt *pCnt = 0; + p->rc = prepareAndCollectError(p->dbRbu, &pCnt, &p->zErrmsg, + "SELECT count(*) FROM stat.sqlite_master" + ); + if( p->rc==SQLITE_OK + && sqlite3_step(pCnt)==SQLITE_ROW + && 1==sqlite3_column_int(pCnt, 0) + ){ + bOk = 1; + } + rc2 = sqlite3_finalize(pCnt); + if( p->rc==SQLITE_OK ) p->rc = rc2; + + if( p->rc==SQLITE_OK && bOk==0 ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("invalid state database"); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); + } + } + } +#endif + + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + int bOpen = 0; + int rc; + p->nRbu = 0; + p->pRbuFd = 0; + rc = sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); + if( rc!=SQLITE_NOTFOUND ) p->rc = rc; + if( p->eStage>=RBU_STAGE_MOVE ){ + bOpen = 1; + }else{ + RbuState *pState = rbuLoadState(p); + if( pState ){ + bOpen = (pState->eStage>=RBU_STAGE_MOVE); + rbuFreeState(pState); + } + } + if( bOpen ) p->dbMain = rbuOpenDbhandle(p, p->zRbu, p->nRbu<=1); + } + + p->eStage = 0; + if( p->rc==SQLITE_OK && p->dbMain==0 ){ + if( !rbuIsVacuum(p) ){ + p->dbMain = rbuOpenDbhandle(p, p->zTarget, 1); + }else if( p->pRbuFd->pWalFd ){ + if( pbRetry ){ + p->pRbuFd->bNolock = 0; + sqlite3_close(p->dbRbu); + sqlite3_close(p->dbMain); + p->dbMain = 0; + p->dbRbu = 0; + *pbRetry = 1; + return; + } + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("cannot vacuum wal mode database"); + }else{ + char *zTarget; + char *zExtra = 0; + if( strlen(p->zRbu)>=5 && 0==memcmp("file:", p->zRbu, 5) ){ + zExtra = &p->zRbu[5]; + while( *zExtra ){ + if( *zExtra++=='?' ) break; + } + if( *zExtra=='\0' ) zExtra = 0; + } + + zTarget = sqlite3_mprintf("file:%s-vactmp?rbu_memory=1%s%s", + sqlite3_db_filename(p->dbRbu, "main"), + (zExtra==0 ? "" : "&"), (zExtra==0 ? "" : zExtra) + ); + + if( zTarget==0 ){ + p->rc = SQLITE_NOMEM; + return; + } + p->dbMain = rbuOpenDbhandle(p, zTarget, p->nRbu<=1); + sqlite3_free(zTarget); + } + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbMain, + "rbu_tmp_insert", -1, SQLITE_UTF8, (void*)p, rbuTmpInsertFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbMain, + "rbu_fossil_delta", 2, SQLITE_UTF8, 0, rbuFossilDeltaFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbRbu, + "rbu_target_name", -1, SQLITE_UTF8, (void*)p, rbuTargetNameFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); + } + rbuMPrintfExec(p, p->dbMain, "SELECT * FROM sqlite_master"); + + /* Mark the database file just opened as an RBU target database. If + ** this call returns SQLITE_NOTFOUND, then the RBU vfs is not in use. + ** This is an error. */ + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); + } + + if( p->rc==SQLITE_NOTFOUND ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("rbu vfs not found"); + } +} + +/* +** This routine is a copy of the sqlite3FileSuffix3() routine from the core. +** It is a no-op unless SQLITE_ENABLE_8_3_NAMES is defined. +** +** If SQLITE_ENABLE_8_3_NAMES is set at compile-time and if the database +** filename in zBaseFilename is a URI with the "8_3_names=1" parameter and +** if filename in z[] has a suffix (a.k.a. "extension") that is longer than +** three characters, then shorten the suffix on z[] to be the last three +** characters of the original suffix. +** +** If SQLITE_ENABLE_8_3_NAMES is set to 2 at compile-time, then always +** do the suffix shortening regardless of URI parameter. +** +** Examples: +** +** test.db-journal => test.nal +** test.db-wal => test.wal +** test.db-shm => test.shm +** test.db-mj7f3319fa => test.9fa +*/ +static void rbuFileSuffix3(const char *zBase, char *z){ +#ifdef SQLITE_ENABLE_8_3_NAMES +#if SQLITE_ENABLE_8_3_NAMES<2 + if( sqlite3_uri_boolean(zBase, "8_3_names", 0) ) +#endif + { + int i, sz; + sz = (int)strlen(z)&0xffffff; + for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} + if( z[i]=='.' && sz>i+4 ) memmove(&z[i+1], &z[sz-3], 4); + } +#endif +} + +/* +** Return the current wal-index header checksum for the target database +** as a 64-bit integer. +** +** The checksum is store in the first page of xShmMap memory as an 8-byte +** blob starting at byte offset 40. +*/ +static i64 rbuShmChecksum(sqlite3rbu *p){ + i64 iRet = 0; + if( p->rc==SQLITE_OK ){ + sqlite3_file *pDb = p->pTargetFd->pReal; + u32 volatile *ptr; + p->rc = pDb->pMethods->xShmMap(pDb, 0, 32*1024, 0, (void volatile**)&ptr); + if( p->rc==SQLITE_OK ){ + iRet = ((i64)ptr[10] << 32) + ptr[11]; + } + } + return iRet; +} + +/* +** This function is called as part of initializing or reinitializing an +** incremental checkpoint. +** +** It populates the sqlite3rbu.aFrame[] array with the set of +** (wal frame -> db page) copy operations required to checkpoint the +** current wal file, and obtains the set of shm locks required to safely +** perform the copy operations directly on the file-system. +** +** If argument pState is not NULL, then the incremental checkpoint is +** being resumed. In this case, if the checksum of the wal-index-header +** following recovery is not the same as the checksum saved in the RbuState +** object, then the rbu handle is set to DONE state. This occurs if some +** other client appends a transaction to the wal file in the middle of +** an incremental checkpoint. +*/ +static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){ + + /* If pState is NULL, then the wal file may not have been opened and + ** recovered. Running a read-statement here to ensure that doing so + ** does not interfere with the "capture" process below. */ + if( pState==0 ){ + p->eStage = 0; + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbMain, "SELECT * FROM sqlite_master", 0, 0, 0); + } + } + + /* Assuming no error has occurred, run a "restart" checkpoint with the + ** sqlite3rbu.eStage variable set to CAPTURE. This turns on the following + ** special behaviour in the rbu VFS: + ** + ** * If the exclusive shm WRITER or READ0 lock cannot be obtained, + ** the checkpoint fails with SQLITE_BUSY (normally SQLite would + ** proceed with running a passive checkpoint instead of failing). + ** + ** * Attempts to read from the *-wal file or write to the database file + ** do not perform any IO. Instead, the frame/page combinations that + ** would be read/written are recorded in the sqlite3rbu.aFrame[] + ** array. + ** + ** * Calls to xShmLock(UNLOCK) to release the exclusive shm WRITER, + ** READ0 and CHECKPOINT locks taken as part of the checkpoint are + ** no-ops. These locks will not be released until the connection + ** is closed. + ** + ** * Attempting to xSync() the database file causes an SQLITE_INTERNAL + ** error. + ** + ** As a result, unless an error (i.e. OOM or SQLITE_BUSY) occurs, the + ** checkpoint below fails with SQLITE_INTERNAL, and leaves the aFrame[] + ** array populated with a set of (frame -> page) mappings. Because the + ** WRITER, CHECKPOINT and READ0 locks are still held, it is safe to copy + ** data from the wal file into the database file according to the + ** contents of aFrame[]. + */ + if( p->rc==SQLITE_OK ){ + int rc2; + p->eStage = RBU_STAGE_CAPTURE; + rc2 = sqlite3_exec(p->dbMain, "PRAGMA main.wal_checkpoint=restart", 0, 0,0); + if( rc2!=SQLITE_INTERNAL ) p->rc = rc2; + } + + if( p->rc==SQLITE_OK && p->nFrame>0 ){ + p->eStage = RBU_STAGE_CKPT; + p->nStep = (pState ? pState->nRow : 0); + p->aBuf = rbuMalloc(p, p->pgsz); + p->iWalCksum = rbuShmChecksum(p); + } + + if( p->rc==SQLITE_OK ){ + if( p->nFrame==0 || (pState && pState->iWalCksum!=p->iWalCksum) ){ + p->rc = SQLITE_DONE; + p->eStage = RBU_STAGE_DONE; + }else{ + int nSectorSize; + sqlite3_file *pDb = p->pTargetFd->pReal; + sqlite3_file *pWal = p->pTargetFd->pWalFd->pReal; + assert( p->nPagePerSector==0 ); + nSectorSize = pDb->pMethods->xSectorSize(pDb); + if( nSectorSize>p->pgsz ){ + p->nPagePerSector = nSectorSize / p->pgsz; + }else{ + p->nPagePerSector = 1; + } + + /* Call xSync() on the wal file. This causes SQLite to sync the + ** directory in which the target database and the wal file reside, in + ** case it has not been synced since the rename() call in + ** rbuMoveOalFile(). */ + p->rc = pWal->pMethods->xSync(pWal, SQLITE_SYNC_NORMAL); + } + } +} + +/* +** Called when iAmt bytes are read from offset iOff of the wal file while +** the rbu object is in capture mode. Record the frame number of the frame +** being read in the aFrame[] array. +*/ +static int rbuCaptureWalRead(sqlite3rbu *pRbu, i64 iOff, int iAmt){ + const u32 mReq = (1<mLock!=mReq ){ + pRbu->rc = SQLITE_BUSY; + return SQLITE_INTERNAL; + } + + pRbu->pgsz = iAmt; + if( pRbu->nFrame==pRbu->nFrameAlloc ){ + int nNew = (pRbu->nFrameAlloc ? pRbu->nFrameAlloc : 64) * 2; + RbuFrame *aNew; + aNew = (RbuFrame*)sqlite3_realloc64(pRbu->aFrame, nNew * sizeof(RbuFrame)); + if( aNew==0 ) return SQLITE_NOMEM; + pRbu->aFrame = aNew; + pRbu->nFrameAlloc = nNew; + } + + iFrame = (u32)((iOff-32) / (i64)(iAmt+24)) + 1; + if( pRbu->iMaxFrame
  • U}9>n%LRHkAd=rGViw0E~jznez3&BumA%EN(%#7 zL!i#GX~}q4|IsK0GtcG2IX}9y>7P$y7ktnG=Q^?x(sYF)at`u6?o2vnRT;Uq9#^xM z<|8WQPM%%sDgQy$iLPzcbxwo*_+{NLG5?EK_2jg5ya$DQz0bd{2WgG`l6G$T1(~Z< z>zM&Pv26E9Mq;EGd}ckbE`|5JQN#t5mQNrTF`XKeum*)Qt6tl8Dmf@iz$Y27`X=TjMs(#8(FZcN z#2RFoh`6I^Gs@TVaa6#0h5SDee~^gB;cGuRo)>hQSN2_JwY@sEG{IrX*rRlIzX)Y zB@zGk7mPhC-PE{HxlfiU+GDTXVZlvP2t`xQDT%p17u>B zl#M1tD&t)^d<(7sut}|37A%RQPWPn!OC!iqLWfC#m3q-EO(9H@QY~|S1Ybb*Lg^=I zL8ak-nEK?qV3Np#YjJv?@$@)mF`Su|YJ~8L*+P*Qqa06|qZGVTok?a!hS9t(A*4qq>CkYb-V!r0wk^F^ zoPuizMl(i3qM}Bk;XJ$uYh}`vE|mSkiv<5)8A4_?zCjHr{3k==>XZ%7Mh9lk1tl*l< zMF!aqyMNzICbI$AUN_lQ21zMcI+R4`3M+MYAvPLG$s7HC@g&@)G^wWLHS~0XWnSs1 zuTJ>7Z+N+CUTtJ`SP(IsZb)*Yf>o&H*2ihDGcvZ|I(iC0qa|;5cQ@+zh-33UKn9&D z{}6I4D|iCA+^n7q)fw>Pa>y;PcU^H8rNRG{w}F7!mIg_KbN`A=&=R#;ggRu-RoTQH zmWaYtYM7as!J7BCQ;wGvXSX=5Day#z`a3u|g7S}hZK6TLMge7albH&Ff6dTq6ppIc zP#ir105@t-K*_{0=pEYp0txG9cc%L#pEu7auZARfGowts)vzk&Hwo) z+9R(TvF{*U?`OvGg^ahVr^AZF4SBlwCLL1 zkB{;66n(LM+VUxUnyM8qcv|Wn6O$Y6X{#USjay;|{g<1kDWY(}yW#0Qb7}zhuKzTB zTJ^kpx``o>;nVc#;-~j#gMmzsop0~cG7Z)9K{#^k`C#72_0xz|-Uy#2T>C{l-y5{= zhaS`EY4d3%)AiG6qnF-IUWP^QJ~Ij+AC45?;c542jDUN(4MjjoJ;zU%==tt!0^WBj zL1mv-pGIi7rvZVK5Xyz|@U;GP-h8XK9E_&le%%P)ji34y)VR}W83pd&d>egH^9QA{IPilRdbGwrk5pln_C4IuBsIg?)6E%0l;?V zMJMgcpMQCOa`sbuK825WxB28l5fETxyvnD>d6C`u&selH@1gZkK1%t?QK_rt=DmCh zdpz)2sW*w6m=gq{ZUr1Z?>-@Ipz+k>mU|mF#K5gUO1D9tG0URQb4RplZ z%V);YT^B%m!LKmd3y!sBDbfo)B0nLr7B`IVw+$0Jn0(OThtwBUWYyER=EBuU3ekAH%3PI64cN%8{UIRii`E- z=H}Ptgn6I5e7WL)X3Q>iV_4VAiteD34GTn`o8YX95246slWvO0P!QQVN~pYc-Uk}y zn3`U91~5-q*BEmycIyf*#r!xFc>8@m139_Qb4s#+2~Iy|gN>jKrk9&py#{0;Fh^mA z%@>m*9rUT>JAFxRz9M`cfy5E>22!sGxr@t`xx+Lx1R5;mU-D-~c^h%+tiJ*ww#Xe) z*x-HO_Ioqr{Fbf&jimi88+8XW({_~v*x02TH>-@YtK{(g!Le^KQk0^+H!G;R8Ssza zK(18nET$KEJ?rMfVUA_XFvq#LTr*;ahyIm_j0y?Ujvm~wDe}Xt*Bhj~BI44!Naiic zC7J*KWd46MnMa2lg+Pg8D*>mg5sJ9bA)f~}48yR03jVuwyIxQdlN!loozRpDyJpZR zfw?p%;g#qO0HtZ#3kLTfA4asm<9Y!(m{Og>DP00k!K6Vlo=wJZ;=V~cU?{;OxP}D` z8y4yA$&hXILCE8=|W6xVot7;A(|bq*@Ml|@0(9gKr7;r3y6Tv`0MY#HLRKRZq2&VgODVN*4h5a z*-`U&w{?m6V$y+|TO9U{TL2l9V@HUTba(~OZpcCCq4kOL_1TS4MC)F+GlaaAo3D*| z>es$Frh6;3=v?({NiMGkl=}Ui)bDpI|4;q?7ph+?eM2XA0EC*Q7#+JB%G~M-9=7oK zMr^n8am+EvIu&Z{sq`gnyWoJpRz1AY7a>|po&vU%J-;P41`-@7Jnk1uxN zyFdSQj)0@KIn}k!>ai!XSKoi@x4wjrN+d21elZQ}aNzaPlK6%2g?SVuQ4@@5%& zL-`2x4s`*apeQQG^8yTVvm7&y*SWkj@@6PqUVhBY_6<3#mq~4P(wi1tOpD#=tO7zt zyzyg_d*1iK9^&l{gIdm)SPyXWL5yft|3m_sb8h<}cLtlj}9@Sk(KuA`%e}&r3vW z(tP~bIdqda$jw4DJ(rNH#dFv+6K5VMK{7KDIy`^&5Xa;0mm44c$8=MT({Jz}v(bkI z9QfzxpLX(-Wa|g|ci5j^&CI`FZTa8J4}1^*es#E6-2e$xeBT|8Z;`-eqv{=3M!2z0 zSF4e4Vag_}P^=M#k4q2!gb|lfwJnQ2t+3}=T_hN`)aqytr>TTziLE3y3&&m=wF#+f zplk7|2H!_#1p(o@+XJ3F8xy3j8^R_M;AOQiS+-Y27XX}ksWG3g-Q@tBJVu?teSxP8 z!oH+frUn`W*$C6ddPY{wz773qP=HOwxA}gEO((eqqzEG~1l{7iPN!!FKR3@?NwS1^ zT0Iviy3P7F@mzF-c%SSd3U<``JV(?cEI9ZnTZOv>aE{?AXmy!G$RO=cF{#%uaQ;c% zbkMtm5yo6!V&2Vm)wk)OGd5GaZLJ9y@)1UWA;t zF=Yo$*%{|7T|v?(mVYX;;cP%v7|ja(;1U(t`dOjWM!W2$oau#eIHv6+?dE0)K@{Y5 z*0okpAi2=%y7ttjcgENpc@Enwzr+_`-eg8RmThZv&_mh-Ua#r?1KLlF4q2Z5RXQ?T z%cADMX{@rgWOt;!TNQ1dwu2MA0)Kd}t*uIl01?#W)OPPfMhrBuZQ*rj8$ zRZr~JWQ@=%p0BS1fCE4}CE-r?FM>l$Pw^SjtXqQgcut2LGcuq^y3x=pFEG za?JOD&K=C=$Y7|QH-EW2 zI%=L?wh#Vi>-DDU*Aa!m4?F0wCigOTahV>Po_U5&?0q|%C6{m0P#;3vF0W-n_|?k< zPM9=lZjNf%M!G??yXge$Z%`p0I12zNZ@!Az)w)b&{U7l;+r_92|Fg5`Jen_Fy}Ud= z!J{uurtcu5@831s*kGw4UW_ud=>CFH*1}Pmtvr;7@T0SH<)f+`{`&*7HO?D8G$=Xs zKR`z(se>(t?0-PmFbv`O1}0>R4`m-*l+*R<$&%jarPtIQ$ouixLxmD0Wtb!R$^6Qa zIPVc(B&Qgocz^J=26<`X@Cch+jZJ2~8oQMO-3DSz!zX2nlI zNN{FKr6|MObjmU2t-Ifv?|-*x9|Y#pOULGHqsr$29dlNMf?yO7V@^n#2G-o`XA?8m z>RH+(zTeo2xz0&a-nP!U9Czy%7_PEEXvq96%B}ZF@_MH{5Ak)TUjm#;FmOQkpPVeJ z>(JkX@!^*wyH!QDOA)t1lY-+GP7xsoLm>Z=*Y%9Rm>3G;?71+Sz@p$ z?ft7mV=m;AbYqZRtpX7M7qn zYcXotkb%Y18+~r8Y6|JLgq4)I&_pje{RbrxC_~0@ z)aX92(Ll|C^-%YCCK(z^3CKrreN}t;ZONZ<)VVXqi6KIXV|u`VszpIB0L-PR%j~{- zDOWz${l_=QS14QZ?&^7!7MHv4nrH2*JXJ<$4w~O_SZkN=yHeZ%z?TjzLEgl|k!cM$YhPD7_7w9*JFm0(t zm_lBv`OE9JIf)+>d)cI&j#VesrvS|#GPwpH?(8JbUOdCwZTt5>|M{#Q)s%L?O$X20Xz57OZnF+6zH(v9m4ECOq^vc)zdJAuF# z1ATkZZtY$E+&nwL=>MOazOfwrzIMmFpnD_pXT?nUvxCEMQ-odbaO$nhQ1$dcagNCR z*pF+a`GIK&4>GwfzB}xUs1{|e> zSjb@*j*8kfqZ|%sUbbLM+)i%tTX63*yz>)PmKjauIpu6}2V`$aDU%2tg7y@Q^H%B6 zQ77oYr&1R=zRf)}DvwKeF0p8KGtAT=9g!saSlIl!;L$)VY9 z!64o>kM|B+iTMQnDjDDVlYH15k89Mdp$2?-+HUP$oE@D1df7ZTs`|}^(V~sy;_&47 zE&l_lcZa9D?~NvhJPh^L!_%Kn4))}&=3PH$>Fr4$UL3wLBnYg#JU8^%ZCdu+1}Faq zjJ9dtS}{5|{Jr-lXM2s{A2V1QYo*sV^h%)rcHR)kGqL;--hciO-Y-1{>>Q3^xw*A{ zi@sXTY&jQ$JZ{dddyZ-#zFb^j`&ACA1@#X&Yuw(dJN)M46mIFdEgl ziU%)7LvN(~U~DvTZQ_Q8nK(xoM7ZXC8)rKyl0gTvsxnSp!kx&|=?BMVGdb8p+G^5` zdS`W9(ZFo8I0yCht$N8ngKhT@n_!Bye{!_^&($8jdAGm+Y8N~*6~yd|V-)=_g`y$$ zYJY$KyE4T<-NJ>yem=SFOnR=gUqQv$xb&A!muMaW;{j0tXmO1jvj?_shWw8%7YwC; z!3Y?ot!`TSINBCNlkfCig%m^95`Q46@vGwB?(`nsx&GI+A z-7eEX?>c=uhtem$)$E*IQSd9sfd)_Wl82^5;1wjgBrx+5(J|=U zr)1ler)!_CSw@7n7kmzrNNDnCLwK;8`9XM z4qn{r2I2qG0)&}+V~(r5LJ2GZiUdNQ37urEmEGZI=rz)(?sPK1GF*Y;z|T0V)hsU5 zb!!AJO3$JO#zNUGEOn*Fqb}004wk!L!@}AQX}o-Fw2Cniy|y+ktF;4kH(><6jEYrJ z$S<2Btm`oRp$eGcqeeA%A7;s{Rp;^|h)$Dyxb1t>pLlPYUIAhlNLPJtVL zkY9BM-XOSlas!XNQ<9)2A-pr@Jz_tdc5hB*({P>pyM;N$KzC8+-{B*A1NUd8GcM7p zRvYRpX_?8jj|`zR+=915N=>tQ1*cF?&C*abI_QzPfFRe_7xyi*QZE|l& z8n~Qy13so*p z-6jEFB2?k7eZBejZ`av(ONSiakCRrJ#WZ ztd@LMxG)89D2>(qGN&?nR(DcLIMlCH-6M7G{Im^(YAkXp*@AD9s>@Q}kUf}uSio)p zF}{6(V0uBU+;;U(8jRXU=s}z;<yCgMp4QoGolZrm8H}^un zVTVN}Q+wDy4C7xgHd|^NtMpi434p%?rmj3N4t~)O^y_`|?ARRDf8fjIY={>42%X9! z3zOs!J%ul7(gYtB$k`vW435&F#p=*k-HcmGZcm<0Sv>_m;L(zY>kVWKu!FnRQPnW{ z9vsmtOI-HoT~V%M&y1EKE&;~_CkVjtjp&TYsZO>J7Uk(Pb|5_G5$n-TffI&7P8_v_ z(2E6#8zyMDcL~{#Sx#>DjlW=CE7Z-qmQizb5ndU@wR$%UZY0+MAj?BL}#7F${{K8bVW;a zimYe15>B^Le4fJ*ydH&0V{@n5Z-tv$Uwcorr zJik0`zNN00_HL0(H(O+B@U2dlCz!o#6|#y7zAUa3O62h7Mn*2CnAu%99sX3flaUO> zegArAb50D7o~trD+}HIb;&}pE>vO2pqhUUYj?J{FUc%b6SFu!>afD{UTwYR9VCk2; zZpzpfvM@VC2#g0haKNI&89@b8y0)vO<)(iCwB8w-bX8*Ku8K*o7c8&YqDfz34j^dB zbB{aAc}WI+p7LC{Gq_y=R7J&5APC}%tm)+WW9U>Ung~xteEuq)f{-k=*@^(vqEk-_ zAM4Nac^AZ(YeDDgDjin{+;+u!4Ajutl)YKD9f93mG#a?lsSGP|Eo3&-P<)4kF>3>F z1lsI{2h?q2pV_|kr)9+@1z(!wZv6#*t%3>%g}mSWs$CQE?Y~?cG9lKO6>eBO>|AHv zE%pK*!5@-5gkHlb9CF;i0JU&7CP;PdA{BoXs2}UwpxWQ)6F28T5}7eh(nwhKF(%sQ*JxY|G`n~$cXscgWW9@i_N>Q zUtYcZ{?+DHw9!j$bk+O1_g%ODwG|=B5RT0viU1xXc4E`!bwWW|LUHIuvfn&xx5^JS zyk0FaRO(U_VJDH1TeZ4Hq12t+AQ9Tx@tISvru1?yrI$XXm-8q=;7+Wg+tHWWP>O1D z?$*_71Cc_egQwF8yz!~-bh#xg0*)y1Mu)4T+#J^dwfCCS0$K6WMAzu4BRu2Q(C7RH zV-B~yX4DGH{ICo0bYc`@(29wjr9@4)qzY{zZTO6j@c=-|55&GdGv-TgHl`lN8XQQ` z4(HyCjzRnd<+dS6f$wwGN_0)IMv>j9cq#a-GGu{0VO|i1%0buRb~Op=tW*9D+(IBS z6JjP2t{KK?f#)gh^rz{BtZm3GpY*WGD121`UW$IUzuy4?8&tYN;7FT*)Nv9%F&ljt z(M9(fVR@8V2u*DAa!wQXssnSTnDj`A_B&m;jm4v+EsUCU=m91`-Zl6d>PmpB1u9^> z+ORncQ*>LpA-sjQFemIo55HGCdC7kWS)n><6{4p6N&NZbuz7x9b|nRxiWMagAC)u# z3*5sW4ni}2ZSNY9(Y6GA;@nt-)q6RfPGYg0+8c(Te7cr~T!`+r5*IdW1F9BfwgG~J z?N(kiCm2N49A^atX4%Nctx_cK=w8HuEHey3L{AkSR;V-#*AQ8s=B@woHs* zlFM-ArNaLBkZB};IHHmar zPsd_f51tN3(r|#rtmgwlk{c9a%Yn9wg1B|#5)Z#F@i3Mbzm%BUj)$@t;p_Wl`C3Wq z@qB$B=j;0~%h+!|kFhq({WEhCd=iT?SOexu9KFmzWFnk&z`W@0{pBA3-+k*zOYWi z5WzqZ1)QZOjR-da&d#OvIL;Eus8WkD6E;;}w}t%s{!#lX#b?gl3ssZ(`hN*p59O62 zS+XojYyR)cb3jRpdqw50rJ5|ufiJcLDv~h{gy!$&BE3f)1$t10?HmH{Is^IBblP^b zqDiAP=p|@9bkG$fOAOdOIc}e0$_n5;uK5c@KGy76csvM)L^a=dJbE5uO&T$oSc2B$ z+2cq)j5p@Z=dGiVJCS1o=3>G7-e3e_;l$c;B52a^dat`3G+caE*m~SyVIQxyjwr?3 z(?zb+UK7=#G<}O{J$U*&l9Ko3*kE@^%zE>8O)z&$8|%l;Ju(Cga! z#hiP;Ea&31K8thjAI7=&OS3L=2#A?^hbPTFxbSWrBUTI#dXlDx+0~>oxv$y*RFnC; z$r7|4%s@x7y!wt#_AdP8_ib4ryiKS4$tgvq9`v|#wo{QN4c95vn@Gd*oCe;ntwna? z0vC@`6PROPd;p%bA;Qb8ZaoygNyF!_ovS5iJ#?;0Br7Z+Bikb5{=c5a=df$X$FjY+ zEZ*KSiX`m(`^CI{zbtPfv_6-&mA2I*nfm}!)E7uJb*Ixwc4f{7Mfu!aZc=e1T!Pjk zm==&Muhx=L{<3V5euhl>?=PQn%T1PL&*z_*%Os=h30<>glk`!%Xvz7sninlT>n`L) znbv3XqIFlj#NM{fF&VxEk+1tFmxryNTZe6bg$297%a;qK${QO51yt>!s>%HQcnMmM zpjvTPQA#vUjo+~HEN8L{ufCXHZB9)A|ldJKOw$ts0YWgp`Q+PHhU z$aVhN+n(<4`^D^hzbrdrv_6xa)e5T8YNk&-j(!t05^a_E3a?qYyu9wZ-)C2Gevx(f zvh4R=%65-?0ytRE^Z@MBX0JCfHfqz=O|ivMDqX^`J&f}4kmK65 zlrJLr2r1VjjnM2j&rZ)yc1vfSz@r-M%!@tJb_nE$IT-bGPuw+ET$4t52$~&>Xgz`* zj-+7*EE&(;jJ_b;diChPk1p%bhgCUH>kreNi}i|~SMgp29;%mRyE@d~k)Ae-m`}2z zN!h=-1g%F;iBGb`hDH9&S7qaR$xZ(}9gbleXjZFd+hpzq$r7|4!5vGo+Q;KB)>maS z`ZM-$d41KDk8ZLocfQp1ktSKqo#2%5>H+rhdDi`a#V_UzUYaZ%`~q5!8N85OXbil1 zsP|Y^UU*+d2$wNggzaXf3Uo~t==w#p9>E_+vUK3`)X7PkhX#tjsoC}=qD$sPFwAG_ z`^8LszbsQLXnhV-%ct0CroPuqjabPLa}QV*-7qT5b=5WrTZG%GZHVDu{w~7j$dccR z;q+7|Bi3_NOSn|N%78Z4WI=G;60{yVVUA?vex2ArW1r8BW$izB-5zBFRrv)}lleY| zC1^c{8%%PE=)8#82L!-VS`t%#e9)xSA||KMu%ajS+!?C!zsI|Emc|y4*DY=mVSCUm zZn$Ux(U)^2=j+XQZzGG#t7(IIa*F&5p;| zPRn1D9_F1M-$PcN8g!GnGPMM)hcZl)ge`=;1#@mWzW(wy)1#PKb;!_7mSyIbIA5t2S{@T2)EyCSl?q^&$tt-83LxQFEBt-DH_(=}OOzb--R zvFvKyMHtq)Tb^Z+eGky$4x6W^EsuZSSMhJzsOc{g6YT+&#}98_lX(ZhC1^c#J$ob< z*@+c1P&O7LrtQ&eFwG#t`8MFkeS5e*nu* z@SZ29p(25CAj%bLd&XcB8t zV#;D#4`vFGEL}j9MjLTsxtomhTwRWM1B*0qp(wf+k%kqK&F+F|aoqPepJQ8Hj0P1J zksY6FvcOnag4RQg1xHfx(S7(u?5l4cXkWS4hgMO9Wr2lN&9X{b50!OI@=^S$QrG2} z%832+2>VDlF|4p@6jz6F`>4#-g|r^d)nQ;CmBPIOpUXE9(?@KS^V}LPq3IK85;uJ! z4dR3mnuO*oiv%VpD#h{aS3%oa_N*hneTX>qGr>wm#6PL*>pdjw6oFmAU(MPppcU6 zmYX#6*esuxp!HBbMMzc}KXW#NZx=@&Rt|wx_&j#dcCZ9HLRw#d9k?CD8B$tPp%N(D zflJuNdP}RYjn(!z-!_iY`aIjXdVBOvTAD4V{x>DzDZBRO#qAzAn8G*rgfM}_41;&0 z?V_PPOHqw+ZGHrAlw=k26uS`eAETb%{CY`WU+x|@+ima2s2R8*vz^>AkE?`O_M31a zz`&f3HEAdw#eFbwTA$^EVUpFZ7%E(7>lV&&!+cx5?VYn1!pmPS2F!Rl|EgyRT8~fL zf4L-JM(l3PVobcG%Z9zy-sNfYta;QrZ=JO@*A`g3B#jTd$~f(GKXk6so}c>WU1bDK z;ydUPv>tPn5s;j7qcL|AEk`mgjK})+>!`WpH<@F4EkWyZ;<3K{8ZH-Mslop%qq4qR zkfN?eevC-prFd99@~}x<6qca%h>?dR=Z9~`!)(8MK>Cl0;5?a4$Fu1klx%5Z6n8nh ztK6g!7mFomJ(M|Rl934C;0pD-vX#9|v}Wm5lVv&a`AK1Ak}*z%P$;j;2TBfV zPYb-wuTli6NvH_Q0rK21vQLCdcA;(inKnmN$zyGkRkbNwdCO3%n#X0)aGd2)fr+ya zhsrliB0}I>$^?CRd~)9UAvqaQ1<_)5wQh4i2-x%h%y#f@r9F)Jm>4sZkY1BjLBU)F zO7uh3tN`@%KcKc`hby@wp8u@C+MQDR7H)rx02f)8tKr;z`*nT8k!t5j56kc*Q>X|4 zWyn9Iwz`mcILAVu$WpEqZo1mX${Jh^K;)--5G*g%4HnOFxESVetokc0Zp(G1x>fn+ zYfhJprR#032oGBkXe&UmYYjw^#S0BBVBeOVy1LTzoLR64ugm7ndHuR*w=OR(4))j+ zIm>$S_)q25v~A`a)XUI%;L3L-4e!rRcQ4!L&GU;k{@OY|Kl>G&h-NVQw(+~=FbW>c zsCN3FGebJ-3_>d=)+XjoS%%i58Rbaouz;nR7Xc;+HkRX)%l5CwyEM#!qiO1ng z{5F-omSt!?kYfQ!k6BUId82e{{mwr|d_rK|)~F|$e3dA|9)P&3D|OeF%%ok@s#fRP zkGd!_)EO?9tX#!Xf~!!p601s`rPJADWX*)1l6(wR5@ra}+@HaYGaL5^*_%md1mUsV z3!4|&Nk88|xj5c~f<6dXPJq<5LM;q2Bm)S`y#yhUHEc3tz58Qb2}>y-=hKTK?b$h1 z1(msbW}K!G)jGly$rA9gClCsFS$7hOQ1CR(K~6qSZ}-jqO_e11<{HZ0rMDh23#MEL zAn2LduCGT}if5W++bdKHcG69DLauIunR#(+G>$sy*MtXke6(L9R_^RwBsCaXA9IH>n-~}F$XlpPe_ z3ya>-Gw5_8NHr)iD+-9J4@98u!u7~ZSg)kTHWGdgibxhY_W@RR34R?YK`}O4aviH> z!T#w%$48Wm(TQ)D(}^)%7gsq8)yiiG@6w_xQ&uH-YF0PnlR8p}`TcAH=u?T3S1+YdFjkp@V!l@?mhhE=03oU*QN40eKAFuG2pAvPdNFxp`@h3bb;>o&Q9)2fsml$xzlu+<2= zs>uSv>Q}*L&RxQD#^8p)ki_=c3V3--!iLh0YOn-F$6z%?>N!C>Y+xP=3N*o2QiTee zpxi}1Jvjckd3dlVH;3krixxC|Pyz}`<0VpRo}*(`UgM`%)o#eK==)=BHM#~Wta@UL z7d<4<4pv-E*tp~6EG>9#U7II(&w>iFHJKQ@bSFTNA>PvKY%8OvPe`bp`69wG$ggYu zB3OlGLK5mFR++b9q1bu@WpC%J@oGcaLh^(4o!06&rn(pyzDW)R#@_sNdd}L**^tq0 z@oKE<)>nhsf*yq&YAo&}zEdk#IVnfkM#`b8i`AVgbt8Uqu~p{KF0@OrZuTm*F6Gzl z3JdOws$nS(NQW6JnNB+SK$X7qUc~#hEeCEMeUVStdeFtg^2z-rs7P}{Vnu3>ekrR_r8a@>M;GUB^kN~AbO;m@ds;XAGA7R=GW>EQB~p(K z8e%%INHMhs|JA{+(U@&x(HM)NUZ!NMtEI`bj+llwj>{BI_ciVm3V!_ibckP8>@Bbw zf_>!)TBM+XOC|oyXHgmR4*PNpZE}G$^n*0m9aG%ovq2AQG(%aezkP(lU}#5q9ky#ezTorOM2OjC zU0(R3{MI|otMZePxnp%)Y9#X*d|y4M)GjDxSS~49^*-v=T$Yvh25HT zpX@mM_Rl|;V_x-B75y$fFn=JP_eUh*JgWU&f%9SBqw?8TDOK&xrc$NO=tJ{?CoFnL z1U)ZD5MN;o($2@!DUA4+PTP3fOJ%(TWv3GTCKKRWW(%zf5hKKuj zh48yLOGihB>pRKO!EtSb#A=n#B!1x+QqD9bLD^;t(3<=UBUpqHukGFfx;>rNcwQRGW?=5?k?^84k95cP z?h%@6Aj=J6aVXL}T%Yl_wjtQJ%LJr6co>FgEuN%VQ^s(tHs(K)-P6nF?rHJ^{BqJd z+C9bhAsf`Qzz`#~3<+j?R@p6ay1n0h*F3A&e{}o5p6w{d-q&m}i(|8#4E{ZH-XEKe zO#8KB+Dj)BbL996N>)@%dPQSB>r{$5UTarSK#Q5ta3e12$u#B}xtqv?h)y8Ys>SwWJf-?Tt|? zwWNk-L=|stBv0kwc>mzoymaxj@Xz_#MGM?B@0$nbmj@@8yC+AdkeqpPY(%7VmEu?V z73ce8mV$4EoP>1{x7!r0|H*7Lf@KKT8(e?70sp-G3IF-!wBbrq0~W7P?03vmCN(10 zr|H~4|0mK2zN$5+jr5iLO}EPZ8!>?0m$en zS$(EQZ)Q^%4OE{tRN<-=moNro4YJXPq;qW!!Nt_pEQUqffg=!<6E5J{UOsv@rCR`F zDBj{l12YCY_2Tc}zc_-?H|4gO`U8<)4#ikpuD#TZaEKq0pW-Gjrc#!hX(i;9K!(3~ z`O}MEPNk|c^aq^?Q0LoL4>t@2(^kgW>8ECNa#0m!%t{zu6afzWo2wgrP#m8_vFO@X zo%iWT)@8W9B8ixxoig_o)en;`5PNvD&Uz&FrM+e0a^5>TFYEe<^EKo)Xxq930pAJWMv9V~YHP|wg@tlBE@ z5M-km`5tPeQAiIPl8o4FW|2B zG?*4NQ#QpdvXr%(BtF(=Qb4pg*(><#M(@_NpxJ=G5!-DiVM7d?Sd-R6_%yxqzI@0y ztPZb9A5M7+4tmMXPGWj|d3xA9-#f|yHzXbbJNSN zmyRcCmz>oY>a%#&&ReR=f|`F}+9XG!IbOqw2~q3G|DtcS(X?G7ht3hY9&6+VfJe{{ z^6%&pe&YY;>pJCOKsLRWVT{o_v>3As2{SBZow+UE=qF=)GFbL@jUYL{n$a!p;@d2G zV`G^+EwyCF>K+L3+A8FU<{etpSXxdeSw4w~)BiOx#2oOXh~^rfN()0Bt~$zqC(h~8tuUvB@>Z~qe7S1yCHw2^x_()ab(v_`$yuih>5mJg9-df>yvONDLkv7^pi zHk=LlF^0Zl8Gbv+uR4QW3<260i58(Ac~5#F@FC4|SHMN=dV<>q(^P|a?bA`@{gHaj zTyR#BL|7*4oV@b2swKXpqu1+6!|#X+xSKO~bF_u(Ll{8Dd3mHT`h(7OvGdgoHivAA zlVQGSB*V^~{NX8+vJR|e zn|8Si4?3>E zF&&i8;qFd_Q$7L70P|=fcEQlBl0QWS8gBy|;A-NEe5lHEOWDHx! zCc!C;I@hV(N}dN7c$hc{mue}7KFS1A&@!+Z?j$izv!72Smxuy}|8tg2tiP7R7T}W3 z*vV6FRM)pZa^Xy2Rw@AQl5&NMWKE)9@zjKO(Q+@8BwoT%>}ht{@?Sd%Nu_q=Hq<9r z*+Koy9uobL+p|6UTz>?+yY~odL;CEg`4GEk)@ujkNX5uK^}37tH{g?wu>jKPl#>z_ zPyE?p0=p;2`v-4Xmo$G2Sv;!)TVruP_lBcS!_Zx~q0v=yX``@4E{5C&g@7x@> zY~1(=BB6lY{OBJL9R)2=%j36b>%`)xc26(OK)U-M$7oM*{CJBR+G24M*=w$PD&CF zC9EV-O4?BR{vrvp8I1f|BV$I=Br45y+6fr&8-}K&k7Ntcf_LI5!v3__xxlH}wEuHV zCt8Myl|nX0!0=%wQj5gtvHfQ0!si!D)q?T)Vx>i@N}Q@h$*)x%Q&x>+RxpeNwaq8V zN$ZHRA&umX)wcPUDYT=jZZSupk&}K_q|H&0m4#2V8&W|=Py-+a-8T&5XJcWXfxO1l zh!Bb@!^M+b_Z6Hs@AFirjAxEySE^2Vb}3nZ$e1nVC3Gi{tQ@W{~5YP zs5?8!5JtKVzHgMTP8YIcr~$^iMc2Y#z7WcK7lv5Yy9?HVr-VOa3B**NFAo2WboRWC z|M37hUO2!nr?lru>A%ecV3iE}{}TFGeF=|ft$aQl1J_Z;5+Mg zQeI1Bed9%*_fmIwj?_1LPG|&?c?m85xij^b>k2#sprUx#1i>TAO^|=ia5DXnd4abD z^MZYr=lvO9Zh~k8pF#+(PBNZd4GfQNC!O&avKI3RGQ2btm-`z=W-?R!;LMqM_;Q+G z&gPuBmP`&pUGRYHAmOIV4;rc0AVz5O;`{_IW%wP^b?3l@Ogu#{^nX@P^urkJt-5Lk z6W0R%(zD3ossqQ8{IzGU|NVIEt0i?fHbt<6@w5m`&c#_I9`)}b2i5}0 zVbT-Dw*!`944S3fn z&JEp~p4Ucl)H(uMcnPb#Q<@ZWgC%P>AK%MSna>#{Y)_x^Z@+E+?(SNpy*)5-N;0P+ z;{*0G6jN>Si2!MHe!z*wuM7?-da(SOK(6t1u@DYIKU3ZSKYr}rrCPSWeVlID`u58! z7mA(uJmuohl31YFEwE{itwf$@U%sAy9P#7`iNIqXG-hRBj;FGsN}AY)B;DZ}`&AE) z!?sBbfXf#Y^9~Xf&{v9ey#Ire$+7;9;wtAFNnYuAl7BR3l%Bg|Cpbc!XZv9?gvtk3 zX|e?u^!cPmz{)Tuj5b*A!OK|FSfBWX#D9I=FAG5PYwju@j0-7*%4 z#^?oyto^`s@FiD)FaPxOxK+Sop1*!s?nJgdlm?G!hQGH6ZEJ&1j*4rJfq*n{$&yXs zt7K^S2oC3dHZ259@@m%aGaR|3qGNJ7L{!{nkWMa%w*2s|QEtA~fU=GF!qgB2Z#KMw`I&?qJrF`vuA|CJ6V@%!noQ(`NQbRPA9p679v~IGM38dBvvR zQVw)w-f)uO?GU)m$e-rp_COG=*>#TEZ!e))`}x-Ir0L}CdEqhaeGO7No9CBDt#-Tl zwspCGc5-w{^_h}C=R4DbClB5ppPWGfzjo{Fd{MaU5|?dm{^z&bT=2c+)Pi<%`M9VL z3Km28VpHpXmAI?rCjvuOnh0gJzu!80;AH%tH;sbYlRRB^LKji=l9nZY9VX{>qAW_n zqoO3+4ljR>PdmNO|p6S)!@!%2Pgx_{#wRLG>kTL)47J$&3@DgNr;CFBDKdy{yATALiG{g68xv8-b^8-A3xdc~-)8KV}`lXd$ao zJ&HG{(SYA<^fCVcXPZ93qq6auce^tTQihLC+S)H_4Em|D@S((tHB%{CM2CCVLCE1M zSIj&CG!s)A2+_MRsKhJ_gmE9|MUh=W0VRYDnhiUnbqFO!2vvn`2G_%wX0HX(4N~eM z*mKet+&4Y3N~t`ZLz;C~J9b83l0q1Ic-*M$43dSgb{*^QgA-%#T<*0FTjwnsb-&v@ zK0i5a9aC{TJTKnn0GClvT`L{3?R7+-9RW(O0P6Z4@$A5ke9;9GM!W8T}TIuYXMs|%P~}6^#`k006!|W z3}8V%n{-nE=Ca2pf=y9NZ$kZ2NTcR(_uDs{o4;?zNWO!0lDKt(gr;zh;5t=)P*XU} z^RZ#V3=2X*uy;bQ-27dRU6I44nlBE&gJE>$U4<`g zNe}Ev_B;AM>DMPa&;B`i7JM*z#K0&rS6Z1k^9-Z!uec(lSzd^Uvb9-p+f`}`TDiFdNotq8{6+}-y6zx1ygY*;g!#9M#&+dHd&r;a zC+Y3mT1Hldz;0)RG`3cG+p5CZ>lo!UF|VHujJ`N{aT4sXHnIu~1wVrdaYF~$b;da5 zPOPBP0B$bE5?Tq{Q>(yUUOicrz!RQIVl*a|F=V zvq@^VI;wD%k!yC67GtBdvCrTTyiP~>E!!LU#EfTT1em>X+4aqo+?y#R>6<+O{f0zI z#tMwLokv>%5*`C%0m>jvGElT)Z!~+o47vq?iw#@-mZ}Dp=JDmKz&cx?8mQ)wP1%#k zpEeMOkrz4aPP4%j-O{kC0G`p=F%eN&QEocmHIFUc85Sz2Tmw4BydWRbaDekT`_y3( zJG0OSGcelhxYZv!e3~;T-Np@I|Apx?vg)Rm-MOOHt|*ZWZQKcRit1u8 zkEU}6g+iO&-DFo8{A<<gPFO@# z;CC?gMmgO&LqdQz@$o`V2fG&hc@=F(qv^lu4XGk9Sg$V%bLfG60CHIeS$B%)=b%u( z>RE$4!bf`fT8;jFzEywmvcVn1heAL#bcf(fyUItf|Ir2&;{UQvmx>yEuiMQhWQ+9Z z9+D#zMrLT{h`7;Rm8u+6g`>QE=s+Lv)*gb^s%umLwiw^<(#NF0Y9WE6_RqVH0NmOl z^6!)Cua&(C-zK|f=P>s71ml~SA;ZoOeZT2^OzC9N8Ni{%kClT%t#GGRK?p@hvM!8z} zjafAEO&h`RRdC1CdkyMdy4l@r83FrJKUO8kDrP5ULC2H6punRU?s?T1=i~eY`ULWb zcAn8tFi~sur?ncman|ac`fuxq9G3U{#z4;d(x!1!|6R0Fvx{H~e3BP!bYqNhbJn?u z=;m%pCBo=Ai`Gv%Sgz2`u7Ep9FJ~|W`m74Ezjou0`e{r0L^%IRjh=h5lOQ1f$(#St z+C9I-ngsqg%{QhaC&$KsgDDhzJ}6>g$JXgGZp77nWFYmxamimZjoM9J$l=H4Z=0$_ zkWP3;!eVW7679g77z+arGqT@c_7R^-GAaOXPBPs|HlCUm<9+-rG@!aEy#|2i{peq4 zKf=k$ZL1!OH<=4O!3Lm{WIXO(O%m#ez!;E7u-dTi!j7%g=&*)w4jvKIdT}IpO75aYk7(sS$~a9FsYDz zi2Cz7dDC8i+>8g9KL%kmo$iOiaOlSD*_bCL^MNYc z!^SSbTu^lpGk=Hh?0c#UTxUOIQrlj`34{Nr^1exJjh@{}p8fNm&*};PnLN9ErrAP* z^1_^QUFGJUt|Q2UzCl4&g--BqDRY7o-$-1~paW05M=K|(60@_;jBO~BhO2PXLxO>DCV|`|D;|zsKo_Stp zvxvJ&vy+Z0a=XYS1`}Lf>n<*y?|2ri23Sq1%}&A&nnM`(ujJ8a^8ypCYjrWoaC9}X zV#IIXK2@uNKHUm~Vfv7a|01O4jOmVZ`9)EWJJHqdUT< z5X>0ZEtf~lQ=I5O?O$%nW3%q=!Oajwc5zc6^q9*R8ok2m4 zM0^z$&5a&Fm=@Z?5u+D$Ys^rI?)t0=mfGcQiDq{JdPSvu*^6o~Kj|(S6fY*~0Fb58 zu~##^(7G4Vgc2mM%@}r$W@BiLW@Kk{&lQ6w>5%Tx(3rDIEAi~sjS={R(@7DoB%0Ut z*YbU`zOJRYMCa-(g#uw|uZoau5W_JnlRHh(O;t&azh9163j(c3Zc8mqJRDl3fe+znlbr+O8}vG?IR60reS%&I za{`Kg0X{7E&FC287*6^K;*TDy58k7(20&s(@L-jeFpMbsP^go2ch=?W4l7LNi;Lrn zc5CnQw0YJ%YMr;vYGH@*@lva*z6tPa>0l*_R5qYx&miyNvJt{EMwIw~s{vHWKV&0F zY60`X_GAYkTC?;o7CB}5tgEETLTKZr$7{}ry^k`_Yz9z%D|`ZXD zLScl>+{F6(`zOUj#MSTg*6|8lF_7RlR8|@7xsm}Mm2k7HV87o!31S`XOh+(Uo$R!47|yV+5b|6R8`*Sjyi;gJ|nB;o|s7GGmb z%6s5Lw?L;@_Tb==^1Wom*1DX{$}y^yQ(UpB##c~y7*33@z{>r zs-pRalE)3*KgIv~XZ7kJ-4*3j=>W7~bKI8^aS>udOVQ3i6i@hc9*{Sfb7>BeJ{UJK$;u%j+@aKw5!?$5lut>&=}bvDHL_qR~~ zP&UojWq(+MR>i7h1$zd1iD3Xb6{hB>fVmaDS&H$=P)S{;12aliR3%!(J>)TmwPpR2 zG&4bsHW+2}M-SQ?tV)3nQ`zCUlb>5>ht1Q|mf_{c0oRO@YgG6|`w3lRam_=E4O*t) zFqbZuzJ#9G2JnaH|HK?WDX_jK44~PE*H;d%kzgOg^t=*TM>NjWP-fSaP zq;EpuPs-B2q&4~9UEtj?qav@k@HnCWZ!h+a16uGuN8%Mvzktjyl=?6Evmz->kX&{> z$!B8_E?1jI4s$4P5M3(uSg0&bmSP?NNA=r)yxf*;$uaf_LJGg+kKOm$`7l+;=#cVY zxIf`#fm94ZKdY2tN%Q7K{;`7U!jbnH!~> zKXA_T1CqfL2`X==DG9cJ+-(HGm)t{Ec@Zpz!;|B;6ie~OXt8M0<57+kHm^65S1*$* zOg`!xxx5uFpejQ;7!6cO=P>OoK}b9V#=MJWQW`=8SY(rhjgYs~DUAMnEJ#ov+5CL3X|x40`_@t=fxNNC;-e(`nr@7@`J% zRrOkpTfBb#>SY~cS-t^~O#X{P9 z$4sPhl|!U-2eKzQMGOkPIw9JC2x*p=jwHCuMe~w1EWaY=UR+ucTF+!fLirMk(AZI;!R|Kxzgeeu3c&|EqMTs(S8=g5PddT9 zLn|yIr%&MNheksF-zr>UC#tgtAb1@?}tRNQT60u}&Y)+2t(&--n2+86+$ zvKVkSteWrYAtH<;8;hi5E*y2nePu1I1$II`OsU43e(wo~t|Xz~7(hVBJ4w(zK=nCE z$N2=3Xesh?lys(mwMb!w{1n?-oGxsvMaOE={`vFAeLu6MkpIz~SHhQ1BaszA}*#ua$8L`W>!GTYB zj7dpAe`|BoJT@2@V-Auj3QC}cij>!8D}^k7?8*>=T8tt&`sH%>@TA?kY@P%D?YZ!! zaEwv;2M{1L?DSHO%>_c&*+(4ESQ&|OC5*rHwpYO%;{?`hC?y(^T;Y&VO&dvf zWb4S3u2r05WIa>}fxO8s}VEKLXP&MV%GH%}tcleo7VPIZRPbiAc-JRc57k}03 z6?u@1vmRBK#)om~@*0L!t5pmttz9}MaJ}S%9)LrzeXSSxytSP8%V^9uPO^p|J%mrI zU5Y1;M6VE+eI_Dn_!ngnADkQu*|rh6#1#bnxnFR_VOOx2<;Z=tRu`EtpPB#K z8pS{aV=MU+j;e&bJNan+_0=)n=DN7bQplXl1AHm2conkw2f=@w(BiN$n^4%wEro>g zb85cWIN*@?wJ5c^nFafZ;W$bfG;B_%lg#L{w5WR0EGTR8YZ9hY&!3wKt>8a4b-@l* zGrY|g?f}-Dm?qOfYJo^5_o!e%pUIt91eZGAYtKXC@X|ed;l>NhG7Hye-(7;osjY84 za4qA0{8jPTB@K@!|43Hz539)!QaX9n+sUzk-SIus|*Bs{~#m@F5xx4tmiU zPGjI$090jRfrtUp1ANr?pRhr0A4SAKY>mr;PXf+tk2+d*Td-EcEMiJEHpesNQC$g~ zvFT)hX5F^ee>g4hE5Qm8LNhZP#bsPHu0JRsJAsGDI88A#mkql?u8*=EN zsov>fP4TqA94UbXM9(oG1epN?dJi6movKk;L6V6=xmM=G?)bh|-$-2aJ@x!Y?)cC= z042V4J_NORZpNAXxRX>gOoTWwugwrKhx{L zrA2#*ceV?)^+PO0dLmYl!MnMTD%wB3VQB+>>-iHY(}uymeYg``C&cXV|{_+F0YnfzivYJjm1%((uYo{ zKb`x^iebb1NnTjEn&_f_in}7jUkXyM$wpaUOLTM;_s;IdM(r z^E}fJ9h(|P-HQnh&7mg@1;nSh*2z9G#X>qqGPbRhD3G0}0-EyFLDnX9$!$%&$oFiZ6kMR-#RxYO z$ZxV225ggg>7s^f77f(Ny5Kgj@`2aMVuG|hseiS`6R#p&CLAeELqFlh?$RU`#;Xk ze+XaxTiE%i`l=0mF+IqOt<21{q-ek2fJZ>f;)WVUysge?VawK(F=aA%vs?>m^~t91HB$rJLJ6JA3yH!nFE)H)o6GmDYt&@HFk+C%ix)m z`u5pU>uFG0k@ERtipRlx3Qo)q z8L%?R|9V#jBOg7;mw^L+8TDp3Lu;W^wof;?Zn2f?U+} zE-Ua=fO(!ziVY?wRIzhiELkH30kC)oMlBAKkDcypHpEz{NVgk8#WDt%1^5Ag%|};9 z^j=peAwr!1*`;U6FJv}nM7o{gu1q=pR3XJ*$! zKU6;-d?=V-SY4r$jU-Uh(Yea5ub~34kz)d~Lpq~0?Xjz<%)ONAK=dI^6OPLeQ!a7rglcBYodK2l5?WwP`!Rhqqw5^EC->PPdl(8vWimP#P}j>LcFhhQ z!rlPhe((`4V0&~GZ8~{tOqb56d*ez&7-j(Q@GW1N_qeW-u}!--LXD8lia~yB-g65{ z2a}$HJNc41VYp(~2%ONd*Rx zf;II%wVmq#eBV7H^nc8XY$~}UUGoQ_f8!L-rs#9Tr(#g5QvKXn=#TVKou6GCL!HOq z?pQvayLW)bE_;<8vx789eaAgXf(HVOF&c^7g@Es#UC#jAsgrbXW}^@5&>f|c@dZ)? z88O#!25|LYts)AO1P`oHI=E_KAsMlSRpm-8A@L%qWgF&rY{^iZ08@h(Qz1OB+KiMx z8FVIgp-ykC<0|D$1$f*A-Ybn?{ILt~cKRNf1RGk7etRCY1Q71}3;#27R1I3OGk@-; zqM8{4ZX^Cqj>w+=ixiZV`6j3kK z(h2MXHRorB^+{3I$poNcYm;t02ZyjnB^DGUeNoX& z-ldxcIg+qd7gz?&*eYl;6m;fL<<3xlqm5!L3-BFMd9*C#RSW z5kEe;Z2x+^yW)~?E()(0m)}mTLn-jJBHKUa&cL*453%@bj`vz`F5Xhfj=+b*bnC8q zQPALB^Jnw|q4d_nelG4J&O2x2vISCy&t9Mb1=*pzFzQqTt8iml5P&a!z7ir)*7LTC zh}{FY={G6n)oV8-0e2#mpu;>IHUQ6bVBTUajrgTxtOMb-BnrYj{f7M5`ReWq7={)m#Qs#=HjYAN7m*!W zrapSW{K*UJ5&3$DQ1w2kQ@sD3XVDOnH>ZyG99U?uz@R&fYzM@!!i3SND|{L;hYgxQ zU%fj`<4@E2@yX+F3qRKZL~MS%p-JEl`-53=Q$}fZ&E;xj76#eo46h3~PEN*`)kqEWSafUDl7UQoKl`oys@hduEeR(x=bm$i zH4}qW@7lF%*M9tVleyGY$3H!bIm#`yP`IYm2y6O_qs^HSVIv}sHEHsH|A~=E2MztM z6P&Lfg)Seg8HVe3hGJMnW^f1+5)Kr8g-#NcABPkRK|*9FmtolH^B=(bW}DxCn_m_` z`yBx-Og>*U0ottBP~)GkGskWos51wWXn0hF@IAXW<*mlez^6OB{3X_e4AFJj4>|z( zf36;SnVt#r7142Z^PFG-Z2Zwf0s~&3o^786+8yA&ZojcjjvUl}J~)rS9bX}B5CLKo zwdvw;cl%`beDCn}k(t${@@2JAVSDCd^Qr*F$g6t_4D_P1afLxeosI`kcEPM5kD)tj zGlxGq>M~ds%>#U~YTws3c>K3<#4$9L4c)7a%jW(8|hV-Orxsj{eofFb>kcK(73|9X3G|9tP@ptrlXeb(Fm319q$ zJoLb07TzinpU!U<59_G0DF=4c+}pbLzVe&v{kXIL?sU&QRpFyZV}5~TBTxmr%`1qc z?^B*_v(I2Y04*|QwJ%u^7eG0D)H={QYu&35@94eQhHPVA3!s*SX7ZbxY>=mzHk%WgBfgxMs6}$GL+JgmDzV*qo9M!fCF_W`l)xLTPw>h? zRR>PmzCI%JY;n4&adtTb(kP#3`HD#yc_}S zZ@)Qpdl~&2I7KtX%+JUSKMh0@LTa%jqX?uxJRcyMs%fQg8Nr5m%V7PI+7(nzyxGk= zP1#-bHqThE-j8!uObX0cv2e~VU!=kUMk3!8SU?0~vM_C^DN8ZlVUUTH3zmW5h{`b; zUqMSjS?LYC`2H>-5ShcXh*Hh4bBKm$%>M!+Qdar$3&y+QNw;iMyEQAeSXUL)Ap_&! ziL46yeE}33FhhHHfvK;et4RTeK6aDRxYp<|xDF5CP30M98;DkqlTE$dhO?yrouyyC z(mn?|3GyI&yM21TeR#UpA_QQ5*+c$kc1jZgVr*8lyfI`}wON`Qe(Zqj-A6wG3PJM1 z)WjTSn9q39F@nNJ-#_fDwi+xN$Lw2V@de`LnY|jgXiuU8)LT@?56C!&#zRquo}%Xg z82f?G3^6G;hpNyAg1Y>9-pL_Xiu&0xpZh`soI-_$Iw+ZMKwtH9O<0u+9_>gZTrlQ$ zhrio-_Xt2iYR)=hHKKnIwLhS@FQXyGLs`%`XxJH2cW?Liz)+)|Srq8XCyS=oy*Zoz zWh9G8D%OF<3P5;NoEzH3J=lkg)I8z)5C{o^7Ye-D1z%H=hCOGbDEMiwcVsV7PL+?% zGsps)dtW^3Bmw~Meg1VP2}Isyi$aP9G_uUF9|7ILG7)nK!RZR16ODkvNp$JsieNuM z%>mj3N+x-cO>Q$ph&toNKo>DI)}i%rHwoIiN-9&RvaU z!MJ6Q3-cv*elbNOqM3jZmXL)*CvbIMmFbWNrMX<#yi)dXfwu(Jfi^HrW`#CT%0q`HF;1E$UKP{IlT!Ht!E6Rb2p%%hE1{u* zfM?^au;eW}zW8;3Xv`CF1RbVm_ca6kshqYX-|AIqz8|M#7LN58UMYBy#O<$^<9qRk zz87ccya_Z}O)so)>pVb_U9W4`PppeBho~$RQIO?$2`s^Qm+W?*2eauapDJWr;VA<2 z@(E*27@#P-qi{;w-c>o_Yz)Z1z|gJYCvP*C2|cx>G%N*_7?yn@bL-5QmfvyOk2edr~7OYbM}&nz1*?{QnNk4GOxVt?e8uO*x2MZ*y5yxc$$%uqK()bKukJ; z-V!UchJ}|uO}tt43`A4dpNxmEQO)o;;nYOuC%Z?7=HdB>1Qa((??QA^SzUh(-|I0u zw+_v6D!2-PtAT%TX*Iv?4o7_2YvF8spFAUz!{eXw#tO)eMXEk{^cAYphqZh?hlWSNNz)_uWI_)~m-(a1T z%V{+^`!6ae)O{6a!iFcPP8)6w%dV18lce>S;?OL!@h0PQNi~9qE%HkzZXX}bQ}=JE z1t(v-9luDGmUwBteBH*}1@p%JJ1&{NN8>A2zmL=~{Xyyrb2CovYn!oQ6z&c9r6XzB zyq7aKFVNO$0{)T>{!&%)0{idJ{fh`7nRQ+@bvUu<+PrBlAKLgcAQQms8e?S#VLJrQ_KST!?*C58l4NYP1MgtCmVdYGzEKy(zz0QV%L?wMm z23ge~=c5S*)VR4I>qlX6WCV`U7}Y8qjtAm^H$SzHp`XhOxr0#|?a?)0b7t0{8v zflV$O;LT^&IeM476?6|zMQ$CdkPP4Mh=*rX)&A(vz3}wc92F4nZmzSgix|U~lPShiLfm-ONN?|%(stW0Wl7`Gb z=&CK*6=$e;mPe-0(R32p4(0>7*FF6r@64UIy`8_v5+Q2|l^ozyyz>4eFrVMPoco$a=abVtntmukwsdU(BQj&j;7$_cMF!XQnweEVik%c!hu9=d+XEnA* zRy=&b{Kwf%ImwzA09X}olM_G}-|()jEvLKD@v}x2uI}9E`Ta%(YmHIo1JR@cHLWK0 zSF3b2cT|?+X%<1&R8v=t&3thg>+v#rJ!r+-B*8ot!}3#_YR7_i8Gn=ss0#B6GAdzBFMqjoQa`188;Nqd0I>I33`eM>Ha`{b?k2tl$)eHO_t4v=ASO){jNW)*`5^1dQJ z-0Tk3ti$9c18>W`x?xYy(b(`K3~ew{?<6fU*ohS5GozY{}&vN)B-0`75HjA*4KbJ?_ zV`65ID;P746xkJ7OPt_|=gWxAW5B2Z-vO#d2YemqcWtHv?giw3OX*nFjI$uQWD_Om z+cB*{{dEpL?GLjQ8?4wWg$+W>kw*2q9?`4;M8O>NSNWut(RW%@hLZzEkdY0sRUuL{ z3=)gY<&J;7u;wxv<5twx3{8NA**CzPJ(n>8u&O*P+UbUN#+ZsgN6_IrGd)0nfT!E~2YzCX( zadB!gR(yACh;ctN_v?7O80?r+U4(TkkVG*VmqX;MNUd_-9LO8FNk`N^u*O`!fmxJB zs$yhxA&j|iBqyJ}-Z?x|%D{4j!WpzwSJgmI*avc$>NcPBuiNHRA)G$kDiRP6?V_*= z5kkG^iM$Gy0rq&g!*m*X()h}YV0?4^I2uuyn?|^OdIs)0heu6AM40AK^ZKtJ=+4`B zhkwE6nH#7)9vRkXi$}X_Lp8*3qay{+g-O<|LbVzxOZ~8cZvx^9Tlltk}pT`n^MKQi95Cte};eh zz>nUWv24HYArLSkiY_#P)1&wQ#UnSj@u3kRHUGn;ES3YxF}X4Cykc_MUizwX-BQBN zUx1wc3&u{-1lvEHpY+a7eo}k~*kH=s+dtWGs?(p>KKP6Xu5^Hlm1G!D!kz+cH%;&> zI@7L3cwnfL^;w#8nwBT=gXY8fpmVE!1{dPvzB6Y||-uf@w z?`16iOtOifd(E2I>2H`Am%2V04jLvXf5YWNjnx-Lsy8i4Nnhi-m}}&9(;9^;PHFc+ zi|1g&>k9_CW`TwIyn|%lU(R?oYn$po%2lW(c*RA`y-xK!FR{jJJ>*hU_aP_aLAPUY zH-4Ut*ArVXTSBoZ5=Zv)n|wmzTPTObtr@a7Quif~{LQeuNQXNJ`nh^@2WWhH$y8U( z72FE)FPsR2{O`@n#kRt@ov25nY@lY+=;F~vQSb~g&KNUH2z?p8KS)Oksi?CGQ3L30 zj&Uv2lPR|G<`wA0Y-?=jN|lc!_>4f{#J69sz?+-wdDcAOtr7aOa>yjN_~N^USZ|kaGL*CPEi4WiPk|2&#hM!W410bYu3Pyz(8J3u44d`STzbW zgoND&bqH%Z{7v5Nz21Jee`c=vowK78WXARVPLoeGHc-~nR>Dn__9xjGaM$})WK6qQ zaK|qfAD+|BL^Ly@>3qlB8HOq$#ryUv^ImxWws&}bblf{kesyQG-5$lmO5kNBwYQW27(=p z%LyTbWa2#pW8$0&g0FH<+`@u#L%bXW83Ag$+_mhgeQ|HiKc)uZr!zBn?Jzfr)9V|I zurgB{v^#o47KGHEM?Llyd4!7O(WZFj@s*rH4X9a!2c_s#X&z5A_)&r-p;}F{ zRclR5cz`+%ti_SN;+9dLf+18@cRx!%Wwx%R0Q+9WeONYSU**c5IMBcQV?fpcr_^iY zJcAN#*AgC>dP8bJ4GlpIa27Tslt~b^A-B^jfUTnV$c(~o9d@kNxQAtOL}@&P4#wGN zoK={CAOSPskdHTLrWv;OhEo*~9e>IP#G{E2DVqVfa{!ryH0h^5@C=Q^@@mCgKQ}3) zX2B$6R0o}G;o5+l1i~rloY1X^Fgm7PXk=8PXHe+|pBIq6qo3KBMyd)3 z0eqmkPin_8S;l`h?L!C0LXm^$37|KNGSSleR+b_Neg*;7bN};Vis{9lBz~RO&i=yy z0C{mVqMUv$dH`0x5OQdc(hmZr8JLld;|iyX8DnV`s$E3u>ju*C*xWD{Sr%(fzcc#* zjzvH+wQ);qwIeE5iLBcynPOO}D3jfTQ{`e!ljSWl`^Dp+cZz6M%oAk(^6elQ!^a1l zyp*4VY$Q9NC+=rV*@&yssw1leqrP^4ZW%h>+dQdICE0s=#3_2+o&l*x^7?w&9Emio z7=Y{yk3NUI3-v%Du;q;_KRYCZ!~kgf;?3YOSVm^C>5a*J04Hf^1Xm;n+bq_QrU`c| zL`QeP>hoaJ4RI8vC)4cSpiay<2{>2O^&lU<}aMtzb(+439k%wIq>$3c*_2#cx~VYfe`B$w!4R(V(`2J z<GY*jhJ(wuAUf=lwhjKwbue)T-eU~w@eWS;CB(UbHJW0D!j9@%$6zx2x6_OSJ{V2 zboGBL8_2`+@4DU_Sn16XIISoMhW=vKIKobeBH%>1l(0)3q6RW3pm`vlpT0dff3&iQG3 z1PQd#!Kb_`G3FaqodU*(iD;fMr+mR#L&{5LNooK~K(xO&(A&Gi{hhxg02u0jezJ?7 zZ-k$}Kf%wR)!!fV5=Y0m@FbBkknbWKI*nNF9>ujpI;pZNj3=zrQ%@l(c8P!AEm%@K{f8%0eF zpLFWUEZ!c(u_Ps9H~vbw&Kd(C;Gb0vBcvUt9it3W7T@E9LP4KyE9ZaGIj&HIjSB)0 zm-#bvnfE9^$X6BfbeHkaDAsI#wY4zv3)qsqLA{V4i-K19S+fVXq>S5Y#_}bdww?ii z9D0=9vF-f2)dbPH=}og9nkJLvmKta4((^u2P>T-@NNorvjs>QEo=0JzXWIG-9_t7b zfk^x_;|64^?Z|>6QFM|&s~`_3zLY%IEiI`fbQS}L*4JRIXw?G|X81me(_>AG4DUYe z)VSPr9)-(YtxaC;nkrp%ZV0^{cQJKn;2Wvi0f#nwUmj1#S6RScP<+)-0mH6AbxW6U z{XOqR2#ApmXXEBd`!W_V)#cN-#a`5jql# z5H?EXf*CnZZw-C02D!FIjzq}r{3EywF2`BcmajXT)~ILht9HI+ZnXRb^*}0x{K*q# zPDKCMixbK$f@VdXl4j*4zqx$&po(97O3=6o%)L0TG@H}B%e3P0#?;Qz2?XZIFz)aS8Ed8j$^SmSV(A_b5*noH# zuRyq_uMg0q)%FL?{FQi%8LCwVy0}TzTCW&1wYBJ+mXQybp6K1#^4hn@mC3IY|6T$Z zy%ZkEUi@|`!coB`WJ*z&5^KND7^-iQe#{C?d0?KrxOwujUQM<+@Qi{nprjysh@I7W z_2idfiqfj%h6X z*G27hCdIm*6xr1e)NZm)@=Bv~6`p=IYS93zydjY}Ipl?8fpNKKoj)$B?;F8uYpY0E zQr24UYLAxyE3reprl+dTf%ZF%voZeIQ~^`{0|Jnp0IEp=1W`K=%Wgs>p2iLREz|t0 zMBDl8@cX>hj^!t4*udwUC)kw%nlv^Iijfxw1}>^5kS zEa+rtpaU(IL3Z0AmltdqU0o!t1-9C?MkQeb0N+sftO49~5b=k7e6TI0Nk)1^vnl3V zHhXquCRL6pg*s@mt|^-YMv!qK&aQRzCTl;~)>$_X z$Zx*>qOK+t)37sjHDC${qtRNBm~rB^!Eln@4)4XwBpU>pKvvuw23EORD`N3Nmv!gN zMM@W|FoE?o7o%w(#b`lBJ_MW%$Vp#LD<+m~pcFPdwxk-ReF5Ugh(0CrrM1*>wiZEO#*!!8?2}~uPijo21@&x+iZJsB{F%q1 zcqMpR;p5lb2<97hxwm^#aAX6H>B;&x-LQT)S^BD4F?$EBIGi^(gCR=O%gg-knYT8z z#uSci`4P@ym1RB%6{IK139?@8IQr@sDMy0eS6hNPYPj4@I_X~r6&zQ?<_yDP7cL^E zvT%e`cgBI4!IMvMgWx5aI6I2`w&m_A6e>GbeRlS0*TVAl!HID?A~t`4A(S+JPT!jx zXXER1RAF5+LlELn@nzl{ua3^%p6~9Rkb~E$Gx}rMr&fY-)VjBGGipcf&-%X5iMTLp z^ik+Y3qx_TG;M_1LVRo&qW=?CXe0sfH`}yD%IQSPtZ|w-wb;l9=|ehK>`UKvE`#k* zyymZlmAmpSR{SJR-kU6XOVc)zdHlq ztnJe?F9;xLBXEVT~j;-f`oJxO2mzO{n?IBhU}zey|9J} zL?1x-#Hnf9JqgX;a7}9gD5UO#`n$0cAH0X_E;5CFye5YG4=s{IC>o7OmJ!xsPxEgw zZ$xB5*OiI$Dpf3$LFR;H4wF7J4_5|;anB>@2=M4>q z1XvR24S~0~O;4X)Vx2+BN$Q7r@zL(DnE48B6}|*ZKJa8r4+BCb^2GvOXb9YKOmQ9Ze=rh^&n15`nd1YTAs`!uT&4_Zz zq4MV5xnSwT^St%j9>ChR;PKV9j&>gbX9cj7fJ{)i?MMGOPCVi*rV?r6;zaB;#34;l zi3$wBd*6BQVIxwJ)-niKA^+@hoL=EjmEx2gF=Npe*EguwZ|kAs1MqU7Z10daLmu!# zaK87FeY2@<^$)Z_gC=j)zL_UNTwRi*mKfXpNAc#|{#SJW@pp66iy4M6>&3hoc_h~r z6MoNNe)4*LjV>!Cx-KHK0#rv#?WEwB=*fvQ_M%8GF^UBB#g4i$IbkUDQLm1hR=^9aV=X`~_zB!NGX^_iO05Tz!LHS`{Xcusw*A(|j=L`pOyT7aIr~;jFSTOwhq}JxZ#S zs80w%)TWI$GX6r38XAi#k(O28?&G6&a*2str z=DIWwj;V!MkhN+DRuYA#lrnBB=#Uru-B@8qtot-9&8bo{lC4&Y(v=D1{xTkpVZLTa5IAD)c@6&aG7N z?dO)Zi$;i#bD8cj!K1W1S zF{t}w?O~{5Tcp`mq#fGgi@-S@@>e7&7}ZqLPH9TH9(trI4w5_o>NTIy095|#u2JP9mO$D zK1XKmPLsC=3mqzTa1>ajIycr_;qoUIW%L1tY?iNg5Wfh+fcaEzO&9P1LFxk~56W&J z3tdKwk{>syt*_Re-F0mc z5dRr+L~KU-ZrFRz)0Wa`-y1Y$^=$d89~JkANeS02Qu5iWzkxK$N=HY_m^ z9lWt7<(Oh;riJ7Y1`3l_QB&G4q1%Zh8pc?-;vQQ;kY8wnn{YAI+(Lt2@+EJ<|U0B!HIqq%!XCBV<0330OuSCObYu}O(POI4QX6^2DKloCa1CRXo+(y@EM*B ztV*3!TbPF_>7`bP@vCF-4aa4Z!#a48bej5jPOpx&u9yv zvLfVZSOjpqm9~z=^|33U_j&am;~s4Y3V~CL?ZRc0@y6f6yc#$Kap*(?h4ZUv8?g+C zzCX+}NOPGNhM_ZrwrO@sk!P@BxE~qx55pk7&|#fceI__E$24W$kSL1~M`$`2KtOr1 z=FKIX$bE)xUH*K!5^rE9C^5G}je#?1V;7!{$u%dreO&Vv=K*a3rY5BUx`0i-C_iPq zL^D#?a>dGa$atF@QNdM}!xpQn+`4Mm2TWE?U1GGY z=@1e{ut!xybVhdmsRS>rA%%?88ajG+_8friMs;>QTm7bWU~CTcRrgU#LrVh91YBq< zIo^KLb4~`X#3ehKpbHIv5Q-Cm{QxR8XvV~|^bw9Nh^ebND3V`dqaQ$s=N6x@ufn#; znm)IDGllszuv9!mGZXb;4yN~T>%OzzkJ78`+`NNBw;Ru6dQIjf6BZ)hQc}NshWXL8 zmYxcVo~x$Bhp%63$ptFDOCiF>avC~ZlBZ=N;Vd5*TR}u@8yySax>V-LdS_W-l)&>T zFY=q|jWd4Yxk6MhZpX*uu6~KTe6q+%H32ar9j;)uZp&AK<+Y2oFS*&6%RT?)u}a$yIfSFc0>_)D?^a-@=jT!9kNBr@QR_u{GH zqt}CJ0#BagarH|x{Wf~)gpTc$DC|L*wdg)skGW97PyFO4zpUz)7esk}iZQ)J{+&H2 zGum8qf5e2GO30wgl3OyHK#4d_QByu05ARp;Ruyc*1>_jplxuU_WqBXoqu>^ia=Pf? zcqu;PfXY@{5^`-#nrB+e^^P1{x@uxd5peqX)I*`#{!=(gLBBr@X)4-iqM{}`s_QFE zE3?*g0ahUEowA2!yUtxZvY$ZFS+qF$awDCA9IZb2ZKd*ft6N);ykEmP! z$j)(tY&v7n;Q%-}d7;`q=fnloMG@zxnAGJE5j*UzaA52FYs|xhGEKs<^Z<vhToOt zvvK+GDHrO1JKeDEtVgKjZ?|DIyVg9{Jev0p8pqm~4Q2cAbgu)pOz#`=a)rG&TYtQF z_-1?VXt#f-(OMMqP(fx!vO?pEM&dG>#f*^LX1!QQ!ZNt91)TkixLr7PSVl2ceAY0m z$yU89CyT{uoL=XbP)!>6N};5#4sN$Ci0c~%vbs5g^v$uC4fJ5Wh45kUT{`>z4wLd_vEC8V;;}|raj)jl9759( z)Q?61#koE;)<+!b1AgXS{brH6u~rwl{GT;n{_eO00s28mezTAucUgEF{#;vkf-ry+ zc;I037pliB?>btKOOcPU$DIi{vx)Q0TktIYQ83&B-jn zq}`G!;MPkrhZGl2vaOQ=1Ahb&z%fWHi)cS^8Yp%Af#8thpG%r0EJ+pvQ+sF_sLFqU zpDb>;qUVet2jN{I$w+MfF_0nYu^UOj&~fUeuqho~|0n{D5|&rtL=lvwCeFL)TF+Wy zTxOR+fmk+B1m;kfv!G!^^?5BEJ4rw?LukF4q9r*~Wy1U^*j!bt7y5Y69B+?l2KeyA$A<<&$oZ zYy^>3FqN>ft2rAbsqk3+B}sifgIHkjBh|0KEXV{vON#Hs)xa`p+aD5ucUrJ!kMjm+ zWB~P==T1e->~^n626^=n6FekoAF>?jLI@zkz`1H`vYfr+>eHZ43D3BXF|*S#8Rw=L z+Y(P0)g@=T>=T)Is~d!PROw#?M@Jcx3Hw5uo|86YY7$+v8gEffXiY2#Fk$7O^Rt<$ zrUJM5okekaLbKvQU4R&L1A72z8UN7=?F0pJ0Q}k+tTweTH57SC?oK0kA@~WDe1T*Z z$EZZecmTT?_)wN~VdycujK|+_Ss40@wa^L`SM3`S8@hX3xOWXHW8F=&*gV5K<25Ag zec+`rXv!t0n$)iuH{F-GK01pP51)5B{95=vehtpAeiGMC+k3Jcn->$_;wu{U2V-l*dM*Da`FVHupIQiet*1MUucBC^Vkl zkp<6MF6u13roZ+$`$M(X>L#9*k1v`m)_T6;P6o;&;l$bl);c|SIT^RM_-~)F!+nnT zaJW+vRAl(r-!3Sv+S%Lw>NbxP)VTk%F>?fBG-7)L(ghVMph*Dkw0z4H3` ze}LdO{!0kn)35)RQ9I7tQy?h79#1ydLb@dhVqxj?3*W1Q=GUrICdL(gN|y-lwX%Y! zhs?$+c+R=*9ci8i>}BiRXE7%M=yCB$dvtk8?RtxtL_;9i+qORg-kx#Ip(hcC9w&2m#O8o)>`15xYxb2owu>$Cbl`$DW^ApFoX8F5$M$xK7Y6XIC+}* z2(@Rk=WGQU^~ibY!+HChrUvU>PtZH?((}&r(OF<^zQ{&7kG0lP`|607$f_hS$u9K- zS%jT{vp9Hb^hk%%Iw25-BdUXd_a{E{{UR>;u^O zB@!SuGFJ)7uIq*~j0Z_NzM5j>3~Sj)rk~ifPnLBs7pTaS-|+!qt_em0pgUZStQYW$ zN_YM{#L246T<)AVihHJ{-!=`5?a>0HN^YdIVk{0b|7ujCmdR_0qU$iZsB1D)V=#x{ z6B{ONti;#`Nz_-QaW!&@EOTiHK*3pHq84ZiG7=2ady0HD=R55~vM$y}9v_|V{n#ZS zqCj7Z&iCm(pkKq>&3N(Z!=R+=ateX4z}86R8)3G>h-a}|Rz3XlS!~PVngAziI+rX(Xkx(khAyI~lj^J?NJ$7#bv%(J6iQx{4W9G}=?-5FvhHxM9rN#O?o&&) z^X_o5o9aQg6Y^vtmXTIa3ODtqPslKSQ0(iy9}jxZF`D%~r$d~Kr-;dm3CsZ*7ZUvn z{ISh{I?PBg#D)ZSnX|cRO*90BJ4L<9WasI>I(R^(EfknsxQ2*_H~9oq*(*jMngC^D zvc3EUQ`jQ)VP*3Mfzu7Z(5u#cwn6*X3a%Tc)TP@dc0bJ6$S=GS=H3Kv;S89e5MRwD zijtmMoX^E$BrdB8)Q|lnJ>XQj&VgjGnf=qy-k1J7^|NRwO1}^H8O>n{RsPLx{;BMS7P;X7)YuJ`ZeThQc0=VGn9jf1O;h>*dF;mJi~ixV+8&Jn z?E(IhU+H*1Rsx3Fff4fn?0hZ03L|NW3dKitaahXI&KeX^ZER?oC3U}SXzL3N?dk6+ zIJRbeY1uEN47^!Dux+VqhlBi6j?9)rHk+hwX}7d4NV-=}2-1=uBeD6OpYQzi24HB; zJ1)KPC-Vd`&nCEYFtr7uRot383jKq85K*zR0FEP~-eAwu(Wo3xD6OzGQ&GIzyR+9T z-;(ag@u zcazKS1kt@s7bGb+9L_t?BUSu`tGRG$gm8Fk^}6&*;o;3e4^Mryef;>(foFwp za5n|qlQ?Yl;G$oJZGy+__84vL+oQaKHrgHONVL^}&O)ks3^(O?H4q_?bR6;~zx!Or z&a%_0Q3&p(qZ8a;OD9&T<)cA|^pf0SE^SREGpM6Q@9{694yYR=5ZZf3AYj6ckO-55 zM%uBJK6_JERSjV}_L8+J8mO`oI_A2fYivJ9SR@OgsytrmsVVmyG zAudAcC+jZ?H6A1aY3TzI!JBNteJFc~E%am^iv97gYk#a6OI(-AE@8i2)40l#=m)Ye zmg7{Q$B`3QG%R&=F_$%)SdmkVU_h%aP68=kIsejvN(5*6Q=a-L+A-syng5v?7M|Wn zzFykl<&oWEeO3GdVrccVSt4A5rSzh2PU6*d{+M-tPU!U-l0UkB$?4gY-we^i>Uw`xMpT7Hk34?-+Xna0_jH-VV z57Xj!97}-3r~j;XaD0v)amOdU*Ly#9Y_)^*uFF&lblgSy*mQT7`Nry(Cx0}2bASh; z;=G`s@6O8=vKxbHn;a=HlKkFgwfvh|{}!i764WqTD=#j`X(dUL&~}nlY*S&gG;xwj zPzx0oP9R1QAFQkz4HA~NW6qvVWp0z9X(A*hg0r*)h%6!b`!pT8=p-5m$v5mZ?Nc&= zDv|-m4AYR!tu^b5tBD;r>;!md81hzKqime2QZ0rt{(^gbMiHw&T3lrD`ZTxYakb zFN?gAwDB}ON!Gvd5tmIN!Khd1rOsh`=kAixT;9}(Gx~U4&HAZo$o(H__8)KLXRaFF z3H-5GjQwz0=?)h{Rq`06x}6rIC_^hpCyJI7Jw-gdur#`-E%_XHeM#pnmSNXZ;~_Kq z1)15>SJhItVTZh|q)l%bEg^ZDFk+19FJ_^T$0v5N*6_7?l})nZQ+r8R@4@lz-pNwO z`HKbR7AY|6+uqEt-<|eOj!%wYZ@f}VPd}yOr<0qJv+688omRDv{6AOS@AmZ$u5^&? z$6UQPd4a+eck`Lnd0JHY72U@+!Mi6A)7e{77#@#!dDlK9oy7gV)wH;qwVLay=DM!g zTxCO5*$Aq{%0E-(pLykb@d{t73Sa9A-X>8!mC0T}RlS~IKY8-O zp5O3wq5W;J5++*-QPZDVUyYHug~(~n3DaYQ&83WpWc^g{q;gmm+zK#Y5wg3$L#H>H zg*l{D2W8!-|dt(%tOpsupK++%Lby>1Y03 zPCuW$p~{uhc0=yO$2@}-2TKsn)3vP2cwo+YSo10e(B0lX#l$8v+$ZbFf8Qu z;W&p=&{i$dk5wl8Ioa7cK1Wxe^RpvR44l7Dp4UIzrah~>)VWpZ^1^jqtj$`W_}>0L zi@0-i_`~t`+1sXdY;-7>id~8B$mWCs!%rZWY}D!cp(h6(Arpr1g7+)F5k7(!7U`Xe zK|X*7iW4s-PS$#6sn!r!mJ;tK$y>vjKLPK(&B(ROrnV*R8|qO=Z^D{k@j9`MK?-oE zm?Kq-g$pEJ4j-<6%lPnS+?`e3#8dSL-}b;5J#HDOQya*I4kT9g7H~0Qn@4WH_0%qY zZZ(N4#yDZlGfvK&uYYgGszqlE{(2OIwm`Voqh^UZs@Y`HH~=LN^|XKd-fT$n%lmwg z!CSbQZwmb)C3YtA7xl7U0bhN#|f)6Ea9y0g6=&DRJ6*xm#CT0A>Eo<{ds~ z{=NI)TdVQLnsJK$<;NrpKJ!nC3*CVtwM$RD&Rah4@{P^W0U!$UJRGokQH*5-7;`Ay3r>!KRk>O4iA7}~Mm-zV#|o%V)q z+M9>#0KY*0_qC~VghnJVRO&m@wO>WC%GA1Jmgq^rr6^{vH z0B74!TUKpvH9KfIrANYT>ZO7J7yJsdq>Ao+jwuvDBCybtL=^LX>Lf1{ZNvO8rO$7C z`mD1@GamCuT7gN>xq3psHk;>6Gk=@4C>FCBx3|xHvyFtK*SDPEt7WJDs1UGg4bL*?B9(+LjXkKW+34L{T@~$Vo0??vl&8WmQnR=!uu63Ex1EobON5C;E z!7B>Alw3MNRkw?oRW2PP1}EB&m|sv_9?+4%;!+|DHupiq0Z&zs1-zhKV@gC(6z z#$vw3xJq1L`p$;N+t8Wtr3JP6#l&I1&@G3=w|#bYviItpS<>C@v+bnXHa&q)92GRP zsj^A?vHciNf&d}NhjNM-Ci_tvhlrvKN*AVBeleY7RqyV7yS;zB1JAsUQYp<=z;H9Y zJHTu>g=ndCJg?4UH8^;jqW|z@e7{#_<8k|OACxYS?aIMQIkEAP1}m~Y45%UJ2sxmx zKU<3j{ug!#&aQO3I=J=c9)X0|=@}8U6+b@KBNcF0d54aUp}7v)oU4J#GMBjgXks+M0!Z z9p(oIY1^#W)S?5}T6pRNK|jLbe8xAp-OVb<;zBg2zrgG`2VOp+!7ch88FsvzSEI7Z zCyX^LU*kBpi-9|G)LrD*wj_lU2m@S74x;b0yevM(n=LQM75>p-t~r|NYNor|QonXy zljb%xa&EuGK;Jrzz=I3v!rZ@y=u{F^C(W+kf_GE2#42c`lo3ybfD{oZMu9p60n0YQ z4y4gDAUN|+m_D05g5md1KE zZz)hrkUaV5xOb@1i*MRmyBVg7grA05yS@G1S?}m@XaDF_*JKyH88r#oNma2R*Ns&K zST3kU+-FuLL~>)a3WS=bRky7G@A;3??2&n|K;|bIK3sBEM8J)3*xS(d!S?A{@8tYH zj^3RdZgW-!vyst~dxwjZdyijt8X|6?h?8?&xGiO!|LV?sCcH8dJZ(=iq)WB1PPRtJ zI=9L5SifoEdP1*%%5*&$Pc#34+fF-4@6NpH%no8uI^868`SCWA9b|4Trg?z(hwp7$ z7acfrjQ&OGj5u`KwTG24pKh#$KDJ`b zpLcVq8ivbXQpQm*9Wtk$PRbjQYVhHNk@8?)JOorE;?DO8#dUZ*x2k~{JhH6FEEirx z9eaKr)z8`PtHg7^duV+=r@x^Q%@)46nfFwec4QmtJDt^ZG%^cEfE}Pe0XIi=?3NIb zd1BgJqO%sjH#D&*vvf1K6RI0_UkOv0&+2Bi<8i~L#!lb8lBSybt25!o37mjNws&|2 z6P?L{H+@KiTw(t6dzRtE-BXt3Fgmn?>TT{5c|(y*dT#!B*V}ALxa6$WD0hKLbhfvs zd^;?!e07s${YwoEd`ic8dI6~mElvwi5vT^=o0sm{k{_ng(*9k9ilcyRLM$AMMRS!E z6j+?H-Z0{`kA78|r(SkT!1I*7(8uSIe|3uwfL{*Eso5=xW)YuB(v>17Mdn+wyZpP8JvI(l zaB^U)Z{hvjrScH;&DbUvnE()hy9Tu&L^B=d=eCV@C%oa3b~6`7#ugRI%<$k#AyK;^ zKiAZj@=fQ-`UjT}^r;I46B%C!38|C9yX0BIyl-KjJKLuykzGw??(-GLK4HzEp1MIv zQ_}-|=jXW!&34N8Z8O-}K0L$C+&cxo*twJN%X?GM0uYZpc$b?Ud(%7Yo$T$PK%e|- z|FkI0N&z;zvOa3j7m&4~1a`O-0uPJqR%JMKAo;7J`v5yz@kdltfi4(Pwgx!{i!5dK z8J6P6mRL}#SZh435X6w;7R?*B9C$`I{f^^xdMe>il^R<&!G}~H*!^_A1e@Q{@pPOO zIf)?@6o#JIa#7WXSy_^V&kuX=?I!S8`4Qy?iYgw9AI1Y6^8%{T!s=nMd41!yZSTL| z{^>NJ0Pd|~4V$+hG{w0SW184IJ=;5cV`)aIg#^z0^zHUZPsmbz!jx(Ej_)lW#Z0~S zlP3L9pkjTyx4YXrRr3OhR4KKV&M5@SEV#z(MVwb%RGZ&*)oeq`SL z@R-s%XMJoJ8TR4P$-%bGk%EcUIpP}vaxp>-^ht#gWl}k|3JQzd$l=;+vD+g$q?;Xa zqcu|E?$N>d_Rdc4^i;S3ST*zhN7L*dHopD-`&Cip)HgCZ4?&i%cc9<;q2;9s0ooy< zZx|Xq>mBa)cF&KuPqq)tGM}7s#`kP+Y;S*}m-^?chN20{m&MpQO?PHAPHKJ!w+;Re%Wk61Q%&NVK248D)_J)5a-8>#Q##P@IFTZs5P5D@a4qS9FS{Ct1! zuy=mm*^F30F2(j?U#9e;+WKmEr(nI4Yptr$8ygZ|(!Sn`ZYBgiNk(BvE?jrGGWnU6 zT-q!822cqsH`kjjO;e~t@@MR_ z&zbkVpMGvrtyWYCE?V*y5tCN9Uz8=JycSYg8dc@(lD*K6kKUVy`1Whl&JVp4V!lZ$ zS!8I(r$_H)U=cQactpk{wGO{<01x^9%m(0(r?PEKNZgQ)xSo32`7^&6mKW)82k}`} zt6vUoAo-ATl`vPp4mh}HO2tWpHU z?nNe6ZO|Wq%P)ERwh%D@q0P}an@`X&2f*dPEjUMuPVy-qPphN?TpvOcGu>r(h*dQ% zugn7)nn6Icl6(cl%#Phx*X0;|Ez(O=U!nR~a-1r+e=~S&MxgOn#cGD~9wF+{YDX^0 zGGf50FNXuhTWSfUJq!Xvf^kTg)B&xB&wBncSA+k4ZW<`!FEnC0Y(s_y!v= z#nby_eQhndF-_%UOQgVLBQL53)2kFA`QD9Ml&|98N75wj9UX$ssCRIDRxt!W;1*B7 zxX2zV<0)X}UxFLhRsM-F_@+985Y|7XCK1UTr_?X=N{zXt@|3LyU3Fjd0pBG2 zY3h&w<9sJ=$sikgfH!zV#y~&b9lkr&`ahH}JJD}=#B`&Fa9S~g7Ab|XF?Vgzhwj4S zR*eKhx0YK;>5n>G*t+MT9X49`ng`SrI;O_<5G!8X+kQ|c&C1^g_})L%`yNJ`F|`R8!m8si{5aLrmj;!jbx{s2u9CE9YO|tWBG0LRQ~rNb%HRHw&oYC@l5{!MXQ?s*_vowWS@A#R*l&B+=VAr6Mh&|<; zuR6MQV0;-t0Ap|vg*r2C&0`g&@XuqL}dP`{L4NMNkACvYhejPg*4D4 zV*w3r)g_pL%Ko#T1mR%+B~OBX2jD&^09VJ~a%fjt1ST=`?mA8WKFuH?dji@M!!E$V zc7;PI8R`Lk*iX;*sUu%HDWS0-%@5J=R;*7oZ&3Z&M~}_%^ESV_roi6W<@U>44}!+Z zKMlf6!z*g>*H^1nd-mNR>tVO)QB)p+>D7ufi$U|D%H|>F(00_WLb?=U`GDPz&o7!+ zbKVxTW(m9+c%j$L$j_U;B;tO~6GR3wGmc!ALJ33- zU80tI@rDgK`8$Zg>UDQBYyUKdC^8tcC#ktZrC;`Wf3zeq{IpmS1+ip>A$v1#vHq?3 z?r_&z*H%Mw-K-p%>gMAruJVFN7qe1hU=TSv)N2S|j4K+Jpr1D1FOgO^yUg#jZ1w8s zXrElt_f1K#9UNnsb|^6kPCW@Hf;y1c&wpO~u(kEazy9@)7$;>vUFT2jYIxsnz_)+? zWAN!SX{qx&tbz|@jM{O9Wt8CUwf;FQP->)Bd2(q?w zHcN1(G#GY-kOUc{GI!857=Y5`BJF>~Kf7$w$#OI(ape0jyGn;f1m8*M@TW#Z9|An~ zI2#h4^@u>(P}oT?%u<=FK@EVgs;If8cSU};#AsFU#9(_D!8Zv!SdyjHeR7+UT_(Ro z5RVA}je+a*Z6;y)6N~r+$WXw=t4%_;0UHe3eVB$RJ^H0hxI+1*;mrf!JJecLN@hw( z3sg~9qmC~_BNUO3L|Rw^ZP}2CB*=Q>9Ts^pJK!H{b6#)*8O$8sn{x2=uG#IO#=Jd> zZIM~{ou>KXak1fDZ0W*yCzM)Ew*aCQ^npVr*j)_y;uGzbttBAovUZ)=;>7^XWhEC~ zMzj3@QzCJK3|Sm3E)6do-jr~%%vGD_U~-3i=gDYl=5`;fBt*Q@{LnnBP6qzXi;I!r z_(^bD+-!ODuebLhIKkzVf)9gLb+E>Y^}vTQ;>eKrc|5G zJ#*dlriVQ|8jW|=GTEp*KJj?92ug1(4SV~m$ zN+?c(FvzPu+!Peul0(LK)8LW|d9gIuQsH8D14)*8ilS7z`AkdkC+pVD>DOPQ!kjMZ zvdq~JpD+h#PLVQ4RfNyKByMI#+VW!R@spQZ;n|UVJ5FdiADE}Dihu?>h~MvaE_Qav z%W#X#gS7WNd7n{GZkD24!#6^N|1xS~0)0yp^y3C%6Bhx71Yf^&ZSvigQtr)*w8F4M z)d+-ZGcdadJ&{2Gw{o|Q-vThv3q)5O0XcIcFkCf4y5mqZA$12UJKSlAgZze@;*up$ zm^V}mU0D}I=AE6op#AW?1)bzquL&q|(%auY+xwx{O%yx)1s`1Xsd?!P{Kqyt%r^aL z&Tw&kc#?so;39y`M~;X$>sp&dLG|^(<52p|6I~SCzA-V=!QNq;?~-t}JD^;}ZM$%0qCJO_qiQ4(dEjnu zhr(8fVs>)YnIUW~E(8F^pxKljUX%r9BI#$N37Pk5(mB3=%?olbNsV+=4hL*}rB;mm z$F15^N z`F}m_YLKqEk1v1t(wwd?QebwMLZv$aACGjf*H zEvXC0XRqJw?|)I|k+}~RHR~r^$us)&7lu5EW-&HJC9e~fBTcVc0Q~Sv7GMFv`=Q%| z<-0Vb-?~jfl$2@lU%rD;DZ5o4TsU}sAl36WsaZ5k@8LO$7C1~1L;8QOqx9^5@KK6x z&i}B3^!0B(NIF#$ElP8mrskuiT~M_$;x~!G?v2^>_KaT4?jSF6q4Ll_JH%&c?O^Zh zeE(>Bm!OSK_l^$P)UyXBk;}Ai#8!}$AleNB#F7f2CkDwdzW~(AE*Lpc_A!#E5qHp# zRZ*lK5uWqW-Y7vb6ubHtCST0bFv27|kEC-47sw?z<$dUH_@ z35D`6C!+K#oCc}g9cM`ZI5Vy`~8iGI2pNYNyl4LFX7zwHVv02h2QksA$)~sfY z)5d@mo&26qC&kI|TuQX$Dn-|&F=~7PMjf~SDZP@Ox%kV`{TnV4{=M01Cs8H)_26#s$XoR{NK6>`uRe-yT5Ij=iSGx z(aKA+Vt;#4{j#Yt-kDF+pFci%@*(-(TglzefBWDb7$09kogz&-$w!fX5M0AFWd6qX zp@3OYcz2n0TRLOt7q1p(p&`kYoQ|d=(A{BXL%V#6pvnEnd>e5fI&rB07rYDjijEHc z*I&cWYdbxQBXO__rG#Ch`$DtF0`maMtsd@sHk;))HlD2__K-(1%N@!&2;Ua)b>aSm z?d09gR&)84sO9vh)3e^e+1^1fxg$csE9MkI$_^k z$J!65H}Y5-qGZW= z|09C1eEao+ePh%J_idZB{qt7q>Bf5dg1-EDhG~3tieBk{fBWQ(d2}A0_1^SO40Gk} z{a+A4bnHNe1%u{szSy90J0!0Iy##AlF|X$p)@w_NC*Obnedp==+S=O8*QAqbV>OrIzuMi_OF1R^NihFfMb5*i zi#kBBalp+ayzkK%BfL}8#Y|jEfp6x6XrQ?5vHBP;6zL^KuIg`8*uim z4SH24cB2J*owLnQOru!44T<@R+&l)WbeQav<#@okLSPCV>!*w|!SX0SEN^Aeymnxb z252+}*Yf|E4)e4~cGG)VS^~2A?%VUP*VfL>PC{fz0WA@p)UD~)(A90&SFk%C1{BQ} z3Q%{@S~e>C*HE%3!NI;r-k2v#aht=3MRHhv%CM=8ue-_De_H=Kd9}KOd9KG~qAUf) z%DklDOqio!8n`OQFq?jAUe<$jEZ|>9X5ps{d>HB>-Es4b#~eZ9tr#=~xLzfuH@gHR ztjJMRbhU@KW#m-KM>!PW1>_hLjAcVH!&&1ot>U*|uUvpnKZaF|GftZ=%168M^g1<1 zaHU9#k~8|?Su!>y_>9mySARRx03(ZO*Wpbee>P=v(;~$2fZE4X*8eo4aZ$*a zHQo5%&o+`3WHtE20JFLwz5RXM+uIaj!_XW5s^90-sLjK;N$;L*yvip(;8qA8elU)W zHTg-N%=)gO_V-_Z|LvbPzW=rn8dJ%mu;%pa4+K*9LOiXY5&P9y346t?4>N*bWYU=9 z$bb_ouc$|56|IWxcOPF)I#H{*MILd|UNFM#%C?o5W)yNY&>yjttvY4Nn(@k+AAj*K zC#!>72({idhZX=~K%T#u^_@Pdq94ZKWtX3$DV zztM_M9O(zz#<^E?ELQZlT`l4yZfGs{S~?kP8zK0+PKW zE@!CoI)%`)K9co7+x!=(vyTNIz? zVsXt?U-T*A)Y-L-sk9-KcY43EGBIg6F#ZrO^GU@qq0%Av&Wem}Ww~1;pkbga6qL%h z;A;W(?vlOO*{siY(FnyXy;22SXEISP@li-O6A^vo-@Dx&_Q_G&JTCdM} zY{W#ojd_5cjlJ(U)(Jl3$oREC8t%g1I(r&^@R@slTiz1r>t%gOAe}AK8s6v;z8}n)0NNH;O+Tk; z*Ojb(IjUY;9IC|El>jC*qPD#H$%r^zD6azYxW-!JC`N~1m*8ScsCZZk3!7qyMJ>eu z)tkY-yFqIL2hJrqM?j>(yCcq<&cz52ty?R$t3Y}ahapxk$cYDCLG7cU7V}Pjt_Luz zj}!+m3`a@^u`tBA9G?9X7{Urb&>#YhTit&%gnu)H?a&1HZU^RCFWAP_t9G*j>3|NF@Q`^f)KJo3L?2KZOAg@3LjApGIqY~kN* z;s0Z{puvcCQIoyWXL#(C?AxiS21?4GKP2gRoT_+Iv|fP~F&nff*tQ%)C?!C%C#M-` z+A;U_&leZZ((k^_zWaWy|6TU|x9J7@4GI{~Hna;qiEZhuv$gfzT0)S_W@G>Zc7skF z$xS-KoJxICt6h!LVmeGAr!uuE9wV^U_Z0vKYtIp~Yn|^MzCHp^kGP)_YI_bbl7^NH zTG1^k7jb2Cik4zQOJ?f6T^-zR+iARUvv|3dctAy7jpOtR5qw|D+9+0iKF+QH&3uew zK+P5a!!OABo7zziK=F+iifOE4FAA#hJB=V{RmHv6f_2_+@3-(Yyvna2y`G9mnNG4h zTz47C!Mn5GkLRan+h=<_=RdqYUH9e~HFGuV)=WK7t;IlY3-8(!yxa=DI^!UD$9XI5zId2!_}Y+ zM1_G7=gKe|yxzc|W4;(y+3*r;@|R>#slxgg5|%(9$MC*OwuNLu`f*GnVOV&91)&YL zdi@G(Q%T{AyZG(F^MW4mrB` zVAa)HAL+0vbw^h1?LrK*G3m+4blFk{g+ZpiL_N77_CJU*X^D!ND|_{NDXIBr^$xdR z?f1@id#AmVz3u(I|Lj?dH-oYcGDBfwv7|CcB72NoFjU5LlABKMTlE+LEp{JdH<(&7 zC}KWFS(*Rc#NY%L4$;#MK!wLELqiHfSarI^+c!Y$9k*)9;NA#`M$#XaDL6c#xh=KL zjFljkP5R`n#t{-nCwp&9!|hQgX=`K3a;I%Rb4gb_9U5Cfi3lYLMKBNTGKfWhJnGR0 zdq;*GAOj~$fWBEB{O)U2B*K9pX61PiR>YfN)2}!JT4D)TR!EXo-M#kQmUR^X;VH(RM`s0OOII(Gj2+3Cx>0w83gBd?- zZGp2GLY3P-F;#7Ip9g@zYUDo{GoE5h#aM~&0T2K4rkt7s-csOtOb~(b4sQZKW(k^E z?rhddL9SK55Ct_YlYKAWzL|uMarx0@HHkEZekeg(@$pfr-ayyVXU2UWTVu!$5-(Iog$7)efpivWKQS1=6>#HJK{QEq|dxx%_X|m8Kgg$ zxzb1!ng(eO%cD`Gy?4ds!Y%SzbefKnxjtg2DU1+b_JhN_No47HBjan%DNmc5l(h0L zKdIS{$jCUg(n1Y!>K++ZZC`Y7_aY5;74D*IkCvEbSqrTX+fsqjx;odcIUg*G-vOdf za2ux7L3I_h(3TOz16+j=^l-cY*XVd^fuO=JW2`kA>J^=Uw|wqchT#Lte&hgnaW`<7 zxa-}rc-<|>NvX->W7*s6$Vg{-SBD1?>bD{qQ)~!-BQ@zpTs>*8OSR;)2! z)4E3LVaJoY(1t3iwXKTdL^G;+8rK?62~5Nht*c@h@%FXmRr82i>6-S{af8U31R7X< z+8bI{TG-&U*VVnbtL>}Pk51AqMT zT%H|tsMQB_wi^r}dX)b0b`otvO&nynB}TSw>Ik>Re6Nb5{5qp~^0Rj3MLumhV)DJ- zb90f;8WDW2&khTvO+Co>stSmcvwA?K*5bwA75E}qNh(B5thj-kb0lH{DdISqPDA+? zsTFr9{3e(z%dycTr@pV93@5;L9q(fMfPAA*c1&tjMuO<~3vg%K>GjP)I(k?Iw;GGq zc$JRFxd0X{TIpSJBO`O7_za@Q?^SsgwHwRJ_skz`>QFqIX+e#waF$T3YNQKo#JMsI zVU@Rq=zdH!aGfQEf0we=*o-;g4o*JcB`WknH`a!iu#x-Fo(jB3bSldL&epbnbw;Eq zBHi<7GInf`;j1b=w6HSCmRi72U+(SJO z&8rIsk^zg*VU`sU^pdi5^uwsN_*!83C(zbQGr8&)(Zq)V|4>4~!(p`-TmuUCNB3M< z*60bp(Wuah)eJxrF(|Urw?`*um{(3>I%YO&2Q*_F&d5(bD=1WeeDF~dq>N|atzLp2 zR#M3bjz(;sdeoF#%~AL=EwbBFLdpoVTSkDql~r%gA;FX0srd&qt&m?2;+_Et1GHT) z8}LzITZ;(0Uc)eGOApe!`E{^-vb>dSY&NvOMYa<82oXBWq?}>tB*S&J$E3@vVGo`u zjd)nWKoEtF0Y6C3xRuCqVQ;9S1Rx1$ZqBCD&5nnUFnQ-3J<@bFoV}K0_TdBA)rar5 zp1s4~58yFBj}$o3Vr|vrn|VjsMPkLv;o{=AnC1p!vpixqH16tjG!z`x3NtN8U!VOR zUn*_^ti>K^{G6B!lv}~SnNd)kE!BU(974A6%c7it#kuG$wr3_$4u^onoZOTH^Ul1z zhNx+DhfZs2D+H!)@8Uwi_3I0D#w%L{q{b#)1lBiQH6F`p^tZDL5ams z*KXc^(>_L2VPuow6ruXq+PEn_?ZVa~4_TC_J;FrI(aTA5H^zm^*oaRi zm_`GBewnPH`3KJl*&VZf3IXX_$J&vzEMaJu>5yKWEajpH5JrFzECUh;VYs2h0Cw9G znAHzv=47!g7TAf|1_N(ftl8inEiX0hTGQl1kc(l41~hnO5vy6neBS+OH8EnT0wY^! zx*X<9U0I&tLu zhGBL|Vb}g@)ctBW9CVhPG|A$rh^1-_4%a?90+7$n_xBF=&O$g;mIe0nn;iBk2tKDV zs>>M5z3?tg`vTG1+7N$-*RE;B zVi3BMByTQC%P6H7x6?|V$rJUoji;xfwK~a$D6NHSgliXBqnIHy5H8~8P;ii3Y)xc_ zD=TxP4Aj#TNz*k(2*e9+~?O<%$`59&CC0(w9RJ zZT?_;@9=#0Ri~bA#JcuC9P`RcG_AC~54#DQOnE2R3~PsG=|J8&+VysMMA&LhK-!x9 z{!f0LqoUGovUUuQU|s}~WyJr?@?IRPy~*@akXFzwuo)LE+^_z^^$w0se&QK`pVI2+ zz#0P{hXw*G`_o0k+x%u&UZg`KNL=Put2cKC$f4n7Fjt~G(vPG8S+eXy?Qf;2nF7qt zO$zoi^#OPhk~1hC<7Fh_3UVD6$hGKom)#i_3|9+I1H8A{F>+i^C*bx4N=heF+B=F( zYSukToTkzV<&<9)6pKMVrq|8*YKk6cIpRQM=y{eE6=sFvR#rHm-8>ufOV*cGm=6j3 z2Y3bY>Z93ONMqEpa0&vgHs3`dii>}YY0#k-k2ZSwfWB_Gx8FPK)i294NNR=mGFcBt zfJ#w;^`~03Hz^P$qhgE!udspzb0u4ZzhMy)5L|=ga|^2>kM;L}RKid2qNJ@&aGPjD zjc5xCMf>TA{M2G}wfKz?3MM8UPVG*8J@mOG47>@_IguG0_5R(sh<&pl+r~Y|yOn)zruz#Uvw=LajY{QBudy2;A$U9BuC% zp1P1E5W=6VcNkwL`evA)V|(Uu7MLWnrE`L|Jdj13OM^;MQcX^o0WHnb1mVqwr&HWP z3DdiFjFF3QLuusxo9QUic-Hjs3hy3nCcJ%kR&`QwU^EGP(Ilvz;iNFQNgYAPY;J)TG|QZL*@a+nGT4W6a@o2!s`zG zFi_DSH>oWE&aH_{Wol^H0M%jxnW^LqH3-_`06e`sf3H>jvedwyu1G>&>60nunT%r7 z#@)-jiDK8YrbgAnSy8p{L2pGMbEO`XgKP{zaN~@1*bul@cQI*qqHlU1;I0YR&P)Xw zGAkQbs4WOh$8F472HjLh!%|&KJd66=>CH%m;x1;5#A_)SifQ3OCjeQ(b;0GJ z_QEykcqWy!s3=vc3vw|uTx5h+CwvyJ(W-x)-J}VNBp_~(^DaH-xTM}}`_dz!VqD(r zUYuehGRI^Y1VEpyVuAWgam~{?>c{6fYfIbE7T514p5hPSTF;M<0BHQAn>-#_<0b$V zdiizo z*4eq-yvOI1t*deVf@VTu%&mjeQ!(VC07D6P^GkGJ$ACdUdIL`Yy<6=l4$}LJO!m$_ zoez(8j*fqV`T=1GQRKT9@awC|ID?O0P3jnyq*6s^?q5LJA~a#Uxm&9 zhLdbMsrK~mLr0S}%u|lJGP`=dePZ6EPbKA|A~AgxZ7JF6`42Ob!3F5NE`DD7u=qFK5S@|T3wPQ8 z9(DHu8mO0pV}pcX`eu?a6<5}+5^wk7#aisFS%Y`H1*Hpz5}|>rMj}@4KB6a^DE!#E ztu^jk!rC3s4Z`qCwtU(|h&VD#2x#rs_+E*dBR=bW5{f}v*sF=!4YM8}R+&z*gI5#J z$%05z2$jc(i zXWItkJx<5j`KJxu?7t7YWOI+tF|3x*{FNf2cf{uOLj&_+=b8{B8{U%addkBri2}~J-Kmzo4U(L(SYSY$$ z!edq>j{};)&n&gL9!6J1={|wXK=8@d`X+w!Vhcw=f7tXu^s{?`gQM=;*A2QNt=eT3>jVE7k@>Bj<)J)5amY>^jX;r zyMm)l-5H^YM(wp7Sns$sR34u(azmt&`d#<;t{7*R+?&KHw!%uz6!_WGzZWDMxZ~q- zAF^X`x;%R?pti`|qr0ytJA{Mi1dv<~;GBiWsRNQ{NF`q?lURww3=o}bFc{bB(p>MU zYbzu>!NB1$*zpd$;b5d{G(>jy!lICHR4Tn?MZFLkL)ZqoLGl>NNjkKSLGpZtLH_(9 z8rZ5A5t5ODJ{7~`BgTbg*8ImsBwu2gA@Ml3Gb>g7PI8T}%?kt@vDm|!zo@$!2BoQ_ zS=o6->xdsWfTD4pVY(u?it%rIP(7fRC)w!nCK~byzI7-_S8e;}O98&l3Y0 z>aDrqSP^0O=&<*t>$|u#3>URFKgK%pZPC^<)(N53vF;aIoxokTl00m_8P0vmPgMNo z#T@gT5>g&y(o-HM*5t|2_O+RdJ4q{8+vl?{DgQ_gv-DFI9LX>}Kw|MUlyMJKSAa`@ z%@%>|&Ml zP~-~;Kmd)>rgKDZP1t-a2pd2lknp7qwp_L0gi;W`ej4V70>xqu_e_dLB+}avLViZG z@0T~D9M;0faV@l%N}hwe@4m%bUU=m8kLL#m;2L6Xjx9(u@jeqH8}0+u1_1k_i;7)y zc^banHJ8?eaqVx?@kcZwB!@?s-@_#{8cTg}sZC6)bb+Vfi#suQ+#nm1Y2sp<4?&+w zFb&AmU$DuYuP^XUwN9w&<4v*AWgO&vA#%JygGEsEKs4F zhXVk?&rDFEi+u7a>p!Sb2P(AoUGh4+7*kTCZ(IL{7W!vG3$H(6##AV)V{%iVB0PsysMr^TieBfeCWRsgX43~MyJ5YzFP z(~Xcz$t%O6s`4hIbZu>*p6o7#y&x`W=eB!tbWDrFfkt3b?I34@cEA^6I1~sQ8g*WH zYI3u!0Pp7(j*f{rSQP~tfSsJ<0eCJKW?x`j19L}_k~O(Dht8WtLI-pRN!upZH-?5Y zHYs6_4zvbd7~-cclG|)J)RBA|wa2X>l9{_DnH=H%#Qc*scgr^9#SqHto7-UQD!JCA z63lmyf651Dd$1Zbag*Z31hMhpwhV2UuEA@^(0+<$BRgJjJ5e6Z&}n*ME_X-)#TobT z)S6YhkyIquu&slezJmh|8p`haX64Lg8^Rfz4`^YbhjC^p>LQ!m@&Wh;>FOKPvEKu@ zxWH*NT$tCb3wu1hx~^qjgr_s5@pB}2H8xa=_7V_GXlKf4m4cnntPc|3m^WSR9n!My zloBH8{wz^W^a~qLHX&f*K!9lwoqMO5b3#t8r|x(S5k?CbB%M_mDEd0V-47&xfkr<% zGv=2Kv+u*9Bo3_;Q`J43( za@vG^Sd^WmfRW*{8cC=Se}MvM(vY5*w=ST9xg)z)ib*GbG%U{ST#Fiu@x4tu5jY?%d{>9dVar}LEmq867so#pTYoZi{}$gUItn=WN^ z)hyY}N_gDGNw+t&qOEa2IAxY^vNXTvRJ6Hc^<*`4S% zC{nXyh8;jc%q2_FaDyj1$M29kn5%JIexfv$E{$+(>CSrly#w6a>32dTU8DxXY`OuP z<3)(mh%|)FIFPZ-q49z2LJi@f#+o^_!)fc)u=}P4-RbxpUFhUf^SUwrCSEt#@v=7= zq6OE1At6ePh25Cz@tUr*Xa{?TK?mMEkQ!SG5zg@($Wfn%U9dkR(nK}ASV5|x)KuVo zwE`u<#W6CHgCE~+pT6~`YR2|-1G|4q^<45aq3#sE35gqe@0lmi7~ShQV=d$o11viW z3cUR6Psz=6ILRRy)EI}{28K5_n?hbfW60{qJB4$!-2>I;19q4Kx5exhWfw^4iZ=!F zPGm6UN;yiF*JD$L3Acaj5Ht9(v%KEdoNlx3Ly_)<;QiKob+HO#+qLbtk%A$?pX znX5lf!-x%t|`24JRut{T@D~Od>x&3 z&7=K--nj6Om9nMFm->w2^mYxkSLGP=LcsulO0j!-F{uNCxYFWuITc<`Dd+|{fLN1hy-e6oT2YalPnv!e_-?szk4~o-KYuXG(}PF5 zsX-N>I?10Ek67kzM4u7Bhh{BFW#y4v4vQC@P!4t7z zWEQHAm@x4Yx?dISc>m|A6>wgf1BsJ_TApwat%cJRdPWV`9bSaVQ;!ipF)SfzY~(e{ zz_o=5*5KLK-Dlr?-~H3G?`0`aOeIyVC;12u(_+AfP44VfOvaO;!RitNQXBWd(c4?c zjN%Q*y+Vtwmf!=$sGMZ|=@|HVwEpL0x~ULTcksaoxk=5lg3lH|Yb2SXyli3P6B7h7RogYdS-h3cc6NX%0Rq+;MH!(-MlfcGQNsy5gX0Ac3Ml& z2OO4@!|8Bn<(g5KI0Y_<4Vt20DOfEEgF_?R%PqTHzOTvcwRsey)x@4~USDYX!U%hi zpjds)mKONy(p3K-mYJme$ZVt7T=Wo};hya`bpa+YmA0u5<^cIqPx}9m zJWkr{FJ83s$8GP6m38xwgcyA?9Xewa%oGyDYbi8;@`T+J+zN@@a{a*%ZT7y}+REJ$ zuZxERG~d34*pjdGbrErlVh6U*3sFRz6yyW|B|LuIOh=<`?)i3S6YpfWBe4ciN7a-9 zpn&h#EV7^iXHrj#dqliSt^hLRc3fiQmXn>uGKIk92?g+Jk&CP;7Ni?)Qp1Q`;LjBg zk0Fmh_eTO6N*$ClSy~f~5M1h{XG}>&b5+vFIBW!80Or^L+DSFNfzgkMv7%&v;(*p5 za$;xq?zx#70olg7nNH|s!GeURrJ^-b?=2Eg;T~Sfm!KMJPLNLo`W|N6o|sE)D7#KS z<#aED0SPm5EW}aFcE`yFkArX2jYJ$dj+2M!P4X9t+bB*%C#h|}d#PXb9UxW3P=r@} z2^(^U(y}3Cn@+;-luMYt(tM`4Sv&B4+c69%<(~R^7Jpob_s!;czit`%`o)VR%JnuQ zekKm;po#SX(B&lq+TEsA@yCh0)a<*y%M@*h4}gN82+BB!bPtw=NoJ(#OL)zR&VVn# zzrn#t2LsX|f;!bzy)DONi9mh#JhcgX*+ls>TssgHZfO05)}p|o*t-b5AIO$?ZX^Ln z_`-XJcSK{kaR$TiZ?LD!Zox1QhFz$BAcN$fMoothv374~&blM<4L55=kZ)-EGY|Dq zNwKIoFV>(;{t-}o>>Bd6+-$fY06?wlms@IKOr2}%MA~rmF>TyJ1n>a197l(bGrP;H zKvpPzTJ`5;KCavzyKLcLki?m-*479K3xYaJ)TNfT_D%W`62OmHaZr}Y62y=$(fgye zN6+2)0#dLuW_^MPJlg&KZ@fYZYz#Qja+?1@uUgA9PA6&qBf6-Zq_=Gs8}C+44j>Fc z>U;cX4(rhFlj~+IPua zH-NlmI{=^BzZqdH`P&OE5hZ`~{Au-?{rtBNK+}C-cCofqIopePi0aLH4c=R8uDmTA zL45n%@;L*L5|a^~BL8rh>qxm)!~%55Am_;nQ98ozA_E3U`ZpsqR+AcRD5aSIZe2}q zh>8oIRPbN)0(s#3W6rx{EBQa|=3BTE_`t>ZO~_+L*0=4;4!(Ensq8Ec#gy&5))zUX z;Sn`*oci<8mJuk{JKDWG_TEx8JZE?BtkKWx2bp)lxdAp`b3UJ_A80i)pQ(K2hnmIB zs3zm`-r35Oss%lX&})KUFBosS(2?V2-JxqfVM4y)G17FFyM4`JU-K85dndWt*XS_R z*~*2>*8J`fTR0M(?p{6ox}hrt6y!G<@VaW0_4CVI{4wmD(TtL6myFuV0a5vv0ytIr zt0oU)KH?GytTXMsI|SD`@N5%6LUSB``1u3!Db~s`@QWG zT|tTy3#^rgHTBwWbA`vQFrp_)@U2!DjHd+}>)3x4e5=qo#(N;6FP?g-=f#KsLG-5a zdW-HK^0=XxJ{p%-h6GvBfUUcx*%oH&f?}W?L4Or*3E4j`?t!(g7afOFWT_~s5%@d+vhbyMNDc2w3a4$->7 z_BKYJoNs`zSTzE5m#)*{WJ&r4(nGBbsZMAW&@Ej0N}#&^d21?b5E0)42h~Fr*IGB^ zf13OVzryWuD5~tMyeO>K-YJLMm@^LM2>9GA>5tsRhHHW(nlEYOnW@D;G!6n?fG~gX zOe?I(*8F_!%1VbbN`DibA+Gvr?L7KaeDSK(&G zT)Vgsk)$Cwbcag=e<`R95Shs^2Y(-TKycLM#UuqS5)Ge>0;G8&Liq+B=pQQ~XTJ?Q zt5UlF`PG#-<{%s97cc>!bi=8pkf$%XOs7L!mvTHn2^gyP!5!aBAI~mn9|z{rAUzz8 z$a?BcBsv>yA{1HfXgVA-c)o?SKf{a_UGf&t1)V`%K=m}TJ2hPP!MN0wQ@66dkh1R;i2QkhI%9IaXGqrc zXyjXL_?Lz_?;mP-102W(BLH8{S{vJWrftUOV_*E>Fl%mRRouCkY&%aLCu?_qx}=}Z zS32GrcI2_y?nhc@#1h-+hi-xoEKfmQjvj4&lLTs%y2^xpHJkt+Xmy(OW~a4KR{pDZ zAE8Ixk58A<{AZ@nGZs2fzh?miJx-9_rI3x@6fwj|vI?<=kXN6gd#{a)MFY=>Qe?0N z#<1^_>SAM%E5Mx2j;XtIjW(DuGNz&|R)|$&oIqanAy}~J-?t=~=MtP`S6l4-P}hAS z+g`>fJiC@S0z;U4Q#<(GFxtA`Aw4^{vCJZwoT)y4N1iN75EC z-Rx=(@_2Lixq8s!d~?}QXCM0 z!46e4mbrdDisvXU0wA#6%f~|iWt~>+r;sGaS8oU7Rq6qAY{CHP&*O3SX_Xvn5ty=7LfD_#&UR1XJEAQ()G=!=y(U|lRl4H z<=RDdYglJTd;x{Fuop7{YR4^`9R*^j8q$NxPE7z)lul`RlTYb5M{}Qg{FUZ9z5xYb zWv=%=`Lm;!AnpM731k3j2zV=;&_n=s5`EwB(*`X z-W;BC5~_x9#I%y&By3AlR0oGifk(e3oM0O<1zd`;z{}|nLgtnwfS4AZ+JUiAd>?9r zZ~>X*Sw_dTeyWxn_X697Ly%HCqysp9^LF>-{IJ*CJwN^Fa0dY|Pz6|e(*{?xAwHg6E>EX7@y4h<^EJBk zWtR!UMwyj_D+x6GG*a7G^$X5?R$~M-Fa?br(RF20LQ)H-qkK4=IUK0Kp(Yg+Ms*`< z3UoV!Sv0R5(B8pKqv#RQ1Yl&UvEH3IdUFQ_jX^;OQ0$QlvPE5w#!{4 zxaE%WE8l@#2ZlJlr-uulIlTX`MmbQD{S%`Se{AUrP~`Tx6O&L)HzRPI)x~v55i&Za@v_l(3+ft00KVG=PC~ z!xFhzIh~9c@D;FU*-@`;@rqu(dxIWuYjVEoLk3la+v~OGrrFCRS$}R;1B1AejpsaG zn3O*Fx~+q|U6}G#^1b=t-~w>)_hyPSqve3obRhn~qvkJgP!O$U-j4OrcK*SiA$c4l zAW!n+=4Uw!s&T#=n5b2jzeDGPlXt~J?jMD7;v)_n#N7zToR%n1VItIwee>1_{$j(k zsj^ZJhh{`8{5Q0_Cdr|~W5cF^)8fU@=2^M64qwLhqf>8#zR~ttdbuC^X4)hKTk+6q zXqh%vnX~y5>B71yTsWL6wnkF~46wYIX10J?R8Uqi4;1j05nTng5Th@B^=$AQ@6zO} z4Rcn8S5@-W+QuE_vRuNxO?xXZp$PwaX)})CPl{kk{{FdMt!qT$`6;Y#kb8m~hw0RG zmuj~l`{iGYrC|Or4uqTYT(lhJ#h3S8G0KbD^3qtnHTI$E{s3CFrjr$Zj;94a_7YTZ zVz&Y%Y?MTR?a(RUaG)?x1zzvutZn$&(O(z_$b}?Op16D0DwO+_mqQJR5aJC1&j24I z^M-}UXb7w)m!A%V+E4h^3{OpplERlP0Z=Hd0`I)UjD&~kG%fPUecS93#)J?%RrY)2 zq%+JRwU!*az`gdFk@j0MC2VMg`pj(hRZ+eqCBLN|IzSSRgh-Hr{|!bx2@xd?JaxIn z)$1MOCy#7{*ksR1X!sl`bk+iyggD2#vz0vN#{y_@4~4v?r*@>^?%v7SPn20`6NR0E z!d=L+NX?+Y0Oce?${)HsNgr(i|L7>O1scQ_NUCGIAqnPACU0sFo($4v%lhA9UNBVX zQKRTlXNVdtOlp)33*)K>i_^3=G9j;PxRK!=RsHes+$)V=RAA19utx9_pohFUIkqL# z*W~2uaSaK!iY}?06?{vVyk$@cLFPq;pSf#zIOPQH$b%atmFLuq`Dw3r2qP8D)0F~k zA@A-h!0vD}Lk|_4L$CLjRoBRdYvjhfg$9!K9JaBmSEdr+6Ib_{t2@p>I}lVri#M2M zsmk7^TE**hz`<7xr(&co0Lx1@*wY*w%rU%>=@tU=Cak*WqR(iic$z3Y#gqfso=H|H zy^lr!2hViWolr~gw3O8kQ#f@Q97qSgKxUgMStH6q&?cyQ zAWt7h&qi1-Fi*N?KHEnyy%J>|r0lv03CFY;MEWbd%G zyR~(UCcQCl{)#yRzHGx4tqp;zZ*bMrt{n0Z@_ngQ+Qo;FYQ_?&dSQl~IMG;% z2w|hA-?@eHB_xzsOc^J$fH0#ZSR;CmR_)%der4qUfswZ%%a5{MvcM;OY;CP4e@>Q& zHkXp;`kM{-#?Tskyo98(RBuVfWTdi=^~$h~z}?+&4r=#3wc|ATDB3cRivwzf6h@A}~`G;mAh7%B?%tBAM=rGDQY#DZ7{iIfe1wr*OE;_ z$k2tQ#&Kxcv&eomucvBe<)u^i;>lQf$!i4%JdCrXhUh77kNDH&qvNx^gT4RUKHEDw zT-kfQa(42rr;sP2orx!w>Tf+!E0PUvI2^^Zm-#f7)1I7izKZfJ2zVsI2lyPUyb!w5Ge*kRHuMO^-Df5dC8X zHWz{n^S5qoZEfY7Z@>BOd(1bsF|BT-DiqFEV@YhR~TEkpUKtC8VM_ zuuwMhY5vqvyWKMK$3Ny9D)}76QS-Y>PAM{;eNZ%Hkb~wyX_4VLP@n9al^GCv1hj_w zWsW=<+0>q#e}e#mGIGELhadtRWj#st(NUM>ium?$p=7`qnYS!>gsd$vod0 z*PiEP!zw1LlKM_z2VDCt2$VB;yHg4a%i-XiLuO}y2tFOLxCVs|vYTVZI`E*dWxV5s=nM0ax3qUu zkT;Z1Uc@abbcCu`1S6f^9cP|H;XCkxf~K5U7)f8cp!?G-pQUc#tR#UJtOsv!R|;n~ z%TLMa1|vUU2*nMR7y#=L=JZ}ROP2r_XuJYG^c0mPVt~9Hoiu<6POM9Uy&&kLms{VV z!45(a(DhZ0LqPjvne{~VE$ye)is=hRkb0VyV@no>KOfo8N8aZmA8!G!zx@my{_M=c zx53eI?@%&eel<{|;`hR+%f#%y>F7`hpTFp&nJP1%0#C$P7|RKev%{_hOjfbK8Y&v< z&Pc5e>ND_$0zY?*ipEB55T7+}1y3$YX0+I?p=RWp^SkP#`=E*ZKw{6&EdtK-t<6@M zq8);G7bHS1bkjS`Zuxy>ew*i^!y$?_g|=`e*C&zrljP*+-Qn(c5~GHvywizj#B0w^ zdV?!PlNsJ3C}y+AkFRc|Bhy?r_C6b_6CCrba(aQ8J=riHud`WIg>8}+E6CaVAmsE9hiNgfOg;=#B9 zmslrvat+#A@f;vPDGN&_rweoGPMQWn(WyKd#zEy?ZW#wvy1>H@LF(G{9%NKOj)5Oh zBDKny(D;Sw~%PeJvKEIMlL1))TLP zSc5fw;1DWqC7$~dpe=JAvFMT0oYnHWEybX3zx8!)-3^8t;dP-f9PA^t4)+7t9`QJ^ zzTL|9AS*3pY;qT+?LwYC%x@gnl;YM_Ce4da<;N_detd0&xr%KNl*5SPbyRLt<#rOI zOdy))Jo(^!ck?Om=n51Ak7-Ov$}j5AXiq9 zA&1?A8KQl_rq+8}doZrHIRQ*ZqND6G1MDV&(v7B-#X5K9+6s`yKuDv2DD*EWNAT4R zS$4sD7rwsBC*mPerC`d%bz!$*Xj^a(P4y9ZNZ0Pbs8eiY9b2J;n+SJC96BNfW$$@r zQNHW{@s+u~DZ_9e*(nz{$L*|0st$sy14qz^wOu)+^w7XKFB_qQM_=P4((}2n1~wfR z>iYzrWEENqVt#ayyT9RUH}b8mXJ9|lA2c*&tsU)l{qC(x7Mgo1T)?pTD=vRg8LV!#E(1(T%hO{8P1qBDpCX>fI*;{o~|R0vyP#&tI$ zL>|{M{djG!C)Mq{t!NHp=f2H1_fKOIgM==f2)xoaR#C&McueH`wk z-e$YKXirqeME%!BGZ~Q?GNct5$LwmZwjN<*GD03(R1lULsmY-L!1sfciV}+ zM_%{NcHSEK=&LGeQ}o00D3`jq{dtN1SbDx>>X@;5?-e@9R-odWJ9sb#H5hPHJur^hspnV&=pfcd5FtR7~axUTYKkijg7l zeNLAw>fG_FFn7as$}l&2q*irPgU;q_nl2f5N{a4?9fn9s@Z1yFFNj^^KsI4j4Gj}T zC6psHG>bifBwawtKafu@IsP-kRZIbrMv|kW1H!9`indPBlhvR!h=_C*-PgvP1hvc4kPCLT6W;Ri9cM(RqKd!^bvg) zlrIHgbNl{D&MN>yZ451L*^5F#Z=GAm@f8R;Z5!PK7nh1HsJRPt{K{Jt2;stt;q#9F zc-Kw?S5BSq2%`Z+iBKD=iZtdy+A(g%diGQb95A4AKQK77AAz!e^yZwrf=-Y3_V;~# z#`&^P0J92T#8mL_8rA7oWoS zc%;Zoks#z6R@G8(X{NS^BbInjq5OdB7u_aALpeGQO;`ry^O)1R~_QveJddW8um{|y4xh8B3ZJrMc+Tvx@JmqJv}B#wpV z_85X|jNG>9F+S_*OeSvR9@B#J$)ZpGE#5=+VkGm+CDhIaUgjHL88GPjk`KNWtkg3g zS;Q81DGI}YvWu~)Q(*cWQW&^oYF0H&(E&L-TjS+Yi3tf`;O4=fkETQAWGSgy!OB7Q zJQVA2-XuzKP9F9(u^X^=xW9MUv-fehmhTP2MWgW?vE%m;IRbIRLN+!_8!T%`MO)(n z^E!e$-xIh%o{UH!=3hVl&9r5o%=Enu5M`IcnlXk->Nv|yXY+Y%zh#67WdTAJH)LzO zyfj7SlP*Ss_G>XBwaEj`x-QT4 z-BJNMeGblPmi86$C#L;L%|(Z13q0f%zWeJ>0jAQ%h5DanPg?=73(PJ?;aONv6ks^a4jpiNO>EXU zP#lOrHS@o>WK_8608&7$zrU)|!2>T0Hk6m7-Oo|@lyrCpwI!%`W_YL{?f+nAxV^jU zDH0alq|b|!9^PR->G8Gp8%Ylke2X~g%^QAfl{KbB&D2&eNIPI32w%h=Ji?6ZvQK5s4wV{L_**;aR4CtSZLRA$G3;W7%r30LG$!i zw)gj)9)~6^z~UpNz~L90h8K^MUTvN(fmR562qIhv;(e-ctUS zr3nW9r3(?bJ^HaR2`2R^vRil!g8TO(?6mykWcx0?Be{hL^bkjcTIIo<3!fW$s2oru zS&W1S4fD%DA2z zT0RG|J@HlIrR30aYav7wveOmXlq2nhDt*C9>Xc}{?7U`}bx@11)v<;l|;EqdZK z3-O1KalG-^@yKg&)0UelH8_!5S@39_ z+6#+cj5X)uh^Ed4sncIyWbs+=u6awaz5jmur&9{3UZ=;Fr~}uP6RPt`ac;cq!eUn= z`UC0!f2L*=6j*}QXhZ*`4@Z5r?6^}x1-aV!1iTM={O&B_Swy=emZ71B8r%@aaa$UBxF^IOft?3Ws%oBT}Czr z>E^aXpN7iC{F-qUhW)Y%ny?orryA`$D(2B#$KHh(bQxXdcj9xbU?l_#T-(z;`x%a- zjy<&9wZ&d3;gFR7fEiBG8f0f8REo#+l_x1}KjL%#%I-5T zw8o#<-qhdtpKRlwK7@z#5CDnR+I{7YRxGWMr-5y(Ysch1d4+#Q$MkC6n6_t+spW+| zuuVq#u|#%SjwRn3VYw5DK^R28FG&&6&;zuFk~H!?bizZKDME~vq{v%5LTs)!g6s*r z0LDy?tq1%mT8`swSymrZ2je?MD?Ku&Yr_9trO4j6)^mWKMK_QkaS5pHNUOk0?P z8$5h47(Plzg~UBl6^hR1bPs(@P6Xkkm&5Yb0_H*dCt|ol11Jq3$~H-hsOrJ9Xci_f zr+`EN{0400;z;Br06jcEJvuo%fAwzXFTJxQdA1Qft+1i>!@5`K_gnh2*VczFi&HlH zEZ;Y&HteRJrogmlg?AvvJ%(9^&uc(A8X`tzEynD&e6{8;ydgn?VGlwXQGI^SKLm#Y zK7#(5j)FdzJkl6XgJ#SXr!G)#c&&b@7$Um&L+`}QU@IK98y(1lWE=$o>@pofCf1SYk!)nYE}TS{<9; zTlL|%cKCA8^Nt+gKpCe+6&1=qDJPH;%IZIYcc}&Dyv~M}!-+KGc_smij5SErwR7af zluA~VW~0F_i+-Nc{X)*cM*Q7DcecnL$U6C=ay*H3(_*+FSutTUHZuoIFEmKF0Zr%R zcjsx|9e50SEH1WPbxK}%6#b^Pnj=jw0^nj&ROUSeVVHzypK#Z8>3Kj;5RZ0r(9+Y*Lmyja(Q|2`cQ<1A+6$~G3Z#)-^AMfp$BnR1^V4!7vUnLI@*U;K+q;5^zt8ZLA%qDe^+K(BV4nBlPrk&jv*bm?3gH0*;A*DUtxW za{m3+wE}tU176Ih*WpU9+0^t1|DtwDw00aUpK!BnX1rAVPI?=063q~%c!55J*Dq@t4AthZ( z@y(*&h$Xq2cb168s5y3mXcnIAn*hP#ye9#EB0O*wQ)lsu03T{HnD_4%{o{#b+%5SG z$sI!d{#lMC9!MVEGN68RlBZkWyW!2x_%Kdw z3m!(2XQD}_T}^tB?E`auEVLJURpT}Ye4D>&<|KJ{WhD90&fDJ3U(OL{p#za3(cDPF zBv|BIgcfz2+$ifKoV*T|b0IJoeMV4aM6C6ZQDQ5GjpPw7#(VZA7&snVw=NZLFW*6- zj&;wBll5<+Ou8hnpSBhEN!#kg7#|gnbKerX`)B07U4KZUUhdn&@>7Ov>EGFJ|M}T( zTk?dfC&103uzym5VlLV&rv>0RxnM1JFl{F$Xn{w5nimAzFBga3T+7`ka!8L3U+=xa zQ;POn4Ha=dCYRcC5+)#!G)n<1jFy-kf#=U5r~Hm%b4Oh;$@z^3gN=5o~>A?>q zcDZtoT`!owZdjHdEAuO|s=Tr!w(?tku!UcfAVG+rwBc9CU)J$gMpJVio8NwyG04e` z4fhR9>|dKw#F2EKU4lU~$a-8&9D{*Y;`FH*iPs=S2)QOH=d+@BE$zF7Z8Pyb!SeLq^^OJlkwhcr zE}?L?X)(!fGS2HH10gxO9WX!gWO=)La{8a$L=#7JfU|wdvUz4JIQ(+Ni7`3Z zrx`g!x)1YMYLpQlO<~hoXW*s}Mk;W0?@GrAl-YK~D>Dozc`Y7CC za{*a|d4G~6Mud{lZ90;ZP?$A?hI9+WJ|Pm_rL-~?v%!j~N2ra{0{NDf4wy?I>#3YA zPL9Vq`}Kg`?g-><%h(|Da#{c)FgZ8z_-&IYs5uVdkXRA#f~6<$eyOA8 z2ee@dr=N3%0hN*KrR1*yWeEwhl@dxZl^cxoiV&?=M$_>KoG5Cfup$iQ06!xLt%UQq zk-9_c9k{-s>`xdp8|6tIT#J^%<7p7lM82iOZ}gUdfej728Gcl!Qg5K4i1C0-pLo;s zucrl|Xu<#@Nf~)qgNXNs2z^6m$RpttRFq$t`?AT};O;SpP=g5~ zPeGl>B@(fz4dlfYSjswLlfUiV`cxTWp<2)uRLmia{5r*b>>{)~Br7N;YP&1K!oke% z%ua)IhtgAc^vofZLHE+}FgLaN62yh!`*B(cEDphVS9rK#fy_ABP7C;3;~XDjxSdwY zWaMv{2f=`BZQ)U%<7-y(0)bqTZ@%(i@h-}e(uB0odjf#~3{8C;mPQaqZO7B)aQ5+-4r+>bI)TM;C)q_UEKH*4P$x2At0--1TC0w6s1YrWJPb2p9n zpH0zU_DqMKw=Q^2W+O=bSg;8fW0%3#wr`KMLt??z6kO@mN@(b?oMg|FA2>}IH2BJJrF~?lgj~K|^g%Cj zo1s<^PJmg%WNG>xIwxa_hw;bCqI#oCA#m7@6&PZ2W!S4EU9>~N)aO7gTJkeAN_Y$; zQSg;$Lm%nA{52fS@2Kf?h^d_oJ#SaxWX&JEEZ(%;8j&9>3`_YKBMS!+t}D7cE6rf1O;cz|GE2EP&yW=cl_Cctc@DQ8kx?jtPaOh@v;%D09+{cAdj_zKHoXy_N|Q2OWBLAEpC`_P)SE!uTT19!ZopaaCnI% zE)kYLl>PBEG8#1$K#&rLm?^}X6@0F$dP|s%uh!DBIGruf+MFL4*Q@7=^kud67{-i% z_&gsl*_j4E+dE*}s#v(woP#4J%`|MBj1Gi6bemeD!b_Bm)5?oF>JndTXi^qfK;&@j z0656BNTgDo8sYAI@AUk5@9?m<3jsLhr)~aSc_~vs7|yUfCW4Y0etEF1pa%$EcS?9| zTXgo08Pc#Ut~di3(`f=~NV+&lX_HM7))r~25jDYa=P0PLq{QfNl*0g3)_<(*=C(Ne z+@&cdDGy$dWA~6S91QPPe<tbpsR9-LL!?!F-z=i;nwerd8~TuKrcKKKwml*X94MIqvNVsDLlENrxsU~B#?IL zan*Ssy01%V_yBIP^#pHh+%$Oz(M2q?;zg}E&S>Jcvb;bA3BKof-;gnqS2vHNL$G_S zre`SR%3>j#5l$!B9ZC?KEX7?l-T4I zkdgz3u765Cb?_bGVq0+BKG9sPoxEsn2aI})wR3ZKj4Z-y2L^(N_=$P0Co8tI*f?DN z4Rt*@Pd7V);BD&NTjr9ETd{Lz631109D1%6u?rElw^e2!PA?;Ez7-p4s8d&Io<6tEmaUUVp zZbK4{Oo_CD+L<;-D!K4QmG5Gi0XY>Kv?}N*%jP#=%>-VKw=V11@^Vc>gv}shRc`n! zZQ~qEDoSTF%dofuMEG1CXPw4Wfenz<=m&Ag)TzRP$U8Pg<8BJtJl8wn8 z2eH>w8O5T8xtSVUd%7&~2duO0Jn@0%R7(g=KC7iO^t%-`AxHxwW#x?|d1_p9$@OIE zY~-&~jW@?1DCUd&#xUu+qji;yKM7Z?T^RAkcAWdx5Ff^ zPSM%bE(X$r)enm$e~^Q+7HxIc_MzY|a8lQyQYtXZ%yN#o$>4g*s~caRV^yu>d1n8# znhVhnT*|=x`LM+Z!~SLV?#_syslGqm_0`1O!av;AWCZM4f|~zwy3_)_J-ALQI?jeE zW1%%I4WNgc<>SCYIAxBq-i%>{ZX&4tlFHr#pC08lXxHXMGZnrO$9NL2otkX?@bFIb7H;pZCTLy z1EmBsBI!dwhlG}pk>N04N~_2?kS5PIRxT*nRR$p?hPmJ5eN1Qyt}xgba4Sl1b4iad zj?LvE=G0af_7LG*(EANd2_Rrr9KxJe)EX6s4&o60P6&Mm%D7`z!fggiDu*8^#2h$% zc?g|-mY2!-l~cGHxd@Fax#Vwz=Pc*?Ao9>RnX{MBVfd7%Hl$~mn^)r!cd^8d+Rnbg z3R$>AvKztn7CSXaSZu!><(MoD0njlqH&yJx(9cA>4WLFxp2Qdo-iHs#Y=+dn9qrmIEcL*q6=j0!9ez1LLHUV-! zqldhN#l3|{F)D?V({gZ8ecNKFRQF?p$Ke0|FH$RZd^jX5c1Y^bUsS>R{l z=b^lRFygtICtE^epR(}Vm5xZ9(NhTN*4PCF`op_gaLrlG5;8K$8@&IO1jA#(&o1Y$HzWdKMJ#Eso! zE~jJEnj`Vef`Rs8YF^=-PP55$)V7a}OUYGB{}v9niq+37Zd%+bb-!-fAVFw|;^(Vh zAo9t94#2mC`ieis-!VFD_vroMckSvI$-BbclCXtIQ~fUr{@ng;WgXLRP?QBG_~zyJ zkmF)~EqR`_3s4F?N!EidNh(4t6GG}&U!l}sM=u}y*PHvE;U$Wd6@~IbxahKc%N^GX z1=kBIm+sPjAB@97MIeoDi5u7BcH0ORV`{tebM?yyFXB=ffq)w~%g?nGvO&5{8w7-% z<3m6`!N=%jo(%_;4TnX7mMr34RY|X|eB8Ae@KPi*55)(ll1C1N2tBp~b2ZWIw_h7t z!Pm3-3zi{Swts4Zwyyy%5i#!E(-3Tk(ayrBL9U>b=$(M3z3PTh^L^wuP(;0W7IeiY z6JwQLWkr5fh<9A$cwagQQ=FJWmSnYIVgx;i`m0sNeReP+wmy2x&923x;VLh~E-CI; zPj%iP>ougGu)>J{_T2}iVI4PXC_27~T$IC^fx*Sv#1!6GwDU9=EghgiDaY9Ae15cf z4%W@V!^%JVj#nS-A^p+J#YPBhC6+AxFC`zypu2u>UjlN>9D+Tj{O$s~F zC(tV(o(@pam&^C${L@7YK1Y-=Hgp}bjurknH@*HSUC{wiyIJW23Y=e$S^gvcQs4mm(L?4o2L$GrYo z?!i>4RYGEp^OV9-46{r0fq|U7eh&IeGhPyyY??*id)8Xy!TorI?`aBP0w1sOG{^?Y zPnar&_<{Teo}6!dV=@|#^TIwv6t)kmbj;uIXmSq;X3Z=_P(9q$HXSh|Ea8#k0z#Vs zSS$o=6F24^E$C5Y~(FY!VRt( zp~1Il)j)$mPcw-2ZEySd3z>xG4mjn37TfG6{{)^flbqai)H zcWg$qNk!xC9%AulqS-rKwAx93x#b^Y#B6<`k8(5@naCRfiJ@@|I@L!?X;gG@nH3ld)Ix@5?)l{!=H3k z7wYBb5KY#V;K`H#349yHP?ACAy}_PCp&aVJb1>VmykkY905lb-D+G^BsH=tr#jl%0 z396BITkVnM$)HMww5BL^!BfX#7}~odUS14uF_4fG|GstVPYyT{S*)_gD?o9l5L0w@ zYe3Bqs5G-c(;KnCNNW_SEB>`0Cc>7jiZ~ZuDW36o%Pnqg@o}rSwjOJLTVFG%OaXo^ zKjSbEh^9qASf8Qh0j}w7PCVX=26BAmZdY3MC~A6LrqzCC>z(9@dWRDzn|u0TPHRKc zkLqtAl$>v$oEA zbv|ylr{7^>%&SgaU8MRQ`6?rue0)^b7FlJ{DAW|Ksn2~i5s2IEWjk@_rPlE<#pcCKU2?y5tn^+T4 zDUectDq*n&#$EfFhldb!%1b8b)m$78X)O4Sp%K!nG%p$#Q;)BCJ$3XH?LjpelRs9A zqv&un=xfAg>IQ2b>JCWnCmMvfVNct_P$_`fxV*dbNhsAc>57AgUErVOvv40>`mLGP zVU~`E_phgrz(|=+f7c)F$?=9z9+Evj;IPSOqp86rM-FiS9%IM{ZJzUdcJ8%80tAPH zgir< zYb1G~3;ObgHBXo?UTl2xtxy>kG@lTaw4zT5C2+b#oalN!_u*iMKcYUY47J?xZp{D8 z#-%U(8>w>{1~#j^sB9e-nQMcm0r3LZ#2EPt>BY~4VI@DYGkYJp1ZC{LpIdXN&GE?? z)Rfxnk)Ke*+wN-=pTWuKCB*qBUs`QY2|Ni7|4Jp!Jh z`@BLz2OJXL_$8XuW2rGc2E*lNyi0;6RnJ@DSc2m4k!Riynu-*cS0Mx}1ykW~5dXyr zHGNFpYRj10fB_FsdX_*WjhcXY8%dZB7ENBJTj91eEYfg1U3GQV{nZj>oQqr{JFHy$ zbU?MV>>rVabQ%XPHMC)oNLcNqQ)C++|<0Qv*ZDWX_yLy$XqJvrEiOZ-3% z9EkD1@0szhRha#2GdH?g^|>L{DvSm4=;A5zx$0*9#ja@0zRd0QG#dRDXF}imDWe$9yqSU{o*?=&hj>knz@lekma*-`=Ce#VX zuuyzeu-q{t|Ks2!jl?)>y&Ym!0vVEaQS&7QT|zqaYHii@P-}spAgLf-`XuCK+VT?1 z>D&G&=tmu7bY6~Mh_m|pG{xZYd_TVdF<~3f^EBuVzwI-Eb;U;dW568EQ-*2b;ts{? zp3}hMh&Afx@BN;TVBU8HpnkOLoUEJZA2y88n!&T3tH%P1aXGxInAe$sYAoU?r?`|X zFs30S07yV|bh!Uh+Xc;%e_ls2u@R~I1cejkc%J%@t_>?cos@IW=nU=~+DtfnI(fMz z6OI-m`SoS8RyUwY3oFvVi=dWs4Kn=mmY6378&%g1E_MikxtFY`0B3!M9=2c_Vms>7 zrV4;dm_~ms>)6s1CfWV6?EKBcY*{bxTEtC2$;G7SIubUFDPe#C+EONF!4U zkpPU0F(?Tt^%hrEgJ>c^9px9Nnabq%SXKlnF(r?4Ued_Y>*et#`gFrzmuo{y>%w!r z^sAl-((w2c(!G8WkRfy35n5X6l0_@_CM9V@y-3N3WTlsvTXJgLlQkk}&<_bF@y98& z+xU8^U0KRbsIIP>;KI+>An7D6Ky(y}XrcD?WqmzgPpCWpKf^g#&houtgsGU4OKuE=W3Yz)-3WZBRr;U*9J=!n{6K z?=UV$P+A%TCfIIpSWe!VHyKjgyF+jwI|qZ)LGP@0(v~khCeA8SivO{%Gft{1)^eR& zl|Oh`6xVw!G#m7@C=0Ayf$6?}hLf4!Y1h+$kAa!5_Gpy2H zbMGSUko|$8? zMsRmF7~9S{n82T83vGa&3*ze@R{z*+Aitrk*;|`}ycL0d%#$iMr-F5UGm5B93#M&D zp&FLFhy+)~>RO)*Z#@~M4nlgcKoD}tkv^=u;x#(@i&iZxbWfaKPbULFm9%#SfjPSX zcfL7jgPb10Fde#N24zMsIBnUypoqQ3N0xN^`&>Ye9(Dmy##+PTZsGAe$oj*SA>HDG z-OZ}WxV&!%_xLir^B=U>JNQsmOWmqFM^aI>Y_(o#P}El2!Iep@F4{P|0nAs_hlW^= z0E}d}=J_IEa>}+l1E|e&3Zz6Ho>>^OnleaR1)%&kU%d{~l1}W<6iqPl zUh-IeGZ#UJ^(pkh%dKzLH{74>^$}>~X#vff^V!-O+x93}gY9Lsh~O?O9&)c@N)1x@;DITT`e$Lv* z!;R|W*TMn&1-$6Rh$atSI>ESkT6TXI#`t+G6P03OwCw_9EdbE;x6 z5zDWcW*ZU$q}V0UWA6jEb^6dUT=_neQcSEo^JQLoXcem(lc>9hTS?=N?} zwO7Y`&5b}sEY+@!ju=25cvWL9bjIKdL~^=VSVZTJfxw8#5ETiO$)|R&=o`*9UBBbH z7Lze{hxklw6l(J7M7eL4j}NGJ1?TQ`eqm}I&x0L>X@l)sz$ZRIR2NUrrfSX#k#HHR zwdvh1g?W8sqbhmUO}-|8!*66=L_?WP`qu!UGrTIt`Q-Wrychf9{K95zVYkBpXO^p1 z9gWL=HlXYx&VPnFMn(0w{Fs^jm`*6yr^?`GtJ+u=u~fCtDSC?THu5mSq&x*B{(;ja zCIz#3{f{A5l8C=8b}gNtOEQj%{6KF~r=F@!#m4(HTzO zeIsi7YDLncbOi;Go)2LBZq>a43dUWpJtt-pLjHD7_AnaSl;09b0aDD2~@KtA;i#qYrDs-WkDQK2Q(vzN#*sKwklA~+j@sjHG1eSCial7I=K+^$`w@Xp z*44~FUO{8U+_mjERg^oOs2An?Cb;kPkmk8GDCf3D{{>Pu1W%KgA&CYRbNu1e#P8iJ z>QNoDC>CoLF-VR4n>+HJ^?=@2%pE74D}iJsvcC$&;aE5KJ2hp8_WulsZ z>VvZJfU`T`rgmA&olYQK!o<^SknX1}46(HmM{kd4VxoAIjit44!BoPVy;I-u50q}G z<^tQ~HWip2ZHT{ewxY`3=V4@&Gl_boMBLD1(cpVH%lmMS{~^JXx|~ba0TF#eRMsOg zCNHy265{Zv!&HaVt@-O>=jOZk!jhvkH?+vt-sbX!UdP}C={yr3A}HcTUV8%Ihc277 z_2d!R=lyktht^0OxLQu7$B84nus+|lW{`~##jPZmw`+!jmI11J+M0KgWQ~$s2^^|_ zBA^{&!RB74a>0=i$4ClN1Ax}F%7-ecrm4Dt>S?Nu9y<4ePTi}s0CX`!EwV( z=CqW>1ve%{mX-DAdwI3rAc?y1p1#WsoLP?6*nFnLb1Z{rWX-E5^+8hqz-*@ltk#;3?jVMuP6$GU&rN~viT>MVG;1LdTQ=zFp$Sc)N zhJqx`#r<|{LMo_CaFO*U)Fi&3*h#^KPRF(;`v~rHVP$y;F>)6CC{)iVHz-sU-I# z(Im1pa6Pn*!K0}wJb<_!wkC1OtIo@!>p~D*?pfOqsv9_zm4#wE=x@AM9CNW*x%36j z{nqcD+tN!*t6ki99-$jzP~ot2#m!hqQ4*$aXeFFIW&6S zuqv;ga%vLA%1Nh8hBDtvP=taA965|aca$le*evM4V4Fq9}OLQ-+Rw&|E+>wx41~4 zky7s4r#0=aJ%8$fVJ0kyrTj+o$EH=5@)Rb*cb$e9aK6?FF=A%J^Upeyj`#fQPvxcx zAfBzF57Y-9HyJgom=|vcGOco_<(KPAK7|ie_}f=4dvHbFT_~5gx7fdZjpyz)%rbBs z-0i)3_olPJ_K16(Tf6e|vdSjb1)z(Pbv>f7ZXh$G(A;2skqX+1zd#?smQt!h6x^Q+umwbgymzaEzbWIHEW&fL0<2us*e^C^lSz~d`>n8w+( z%H9>j{9`t}|58apVJ#DS)qIms$c{vXxV0tzQVrHhVLc=bP=pDHCkRsxwVc}( zlMM8z5qrEJP;CmukKL?OSG(7ahJ*TthuQ7#cM|=Os35XCatwh1Zf(K9W(4W$Q@WVM z(&D%`)9zO_%S2Pqm3uMhxNdtQu$CXlO@eAHl1c_(7B?~g-v+`c9E(^$W||Jra9|p1 zG8{zA1{MJ1pF-Ob4jWn$bnLLbmq?$X6_2s_VbRh+Gohl!se~JYhwCjuLyf8*4yOZk z0z5AAehv}#GURztz%hroNKo&BXKx`n9Z3LNeX-R<1^ys8RN20LXh@q)1cP6%*m%g_ zpJv!|vPLrevDi(VqL1JMeb4qr`K8$%e?bN~-}z*=jP0!WW=(^DeU_0sbA^$JpM!I3 zXxP{_pS_0H{!8B_gohB8TJcN8Tg>Y&F`&^7TI5nIekon%3w0NSgT%q}3H^a&1Q0(f0Vt=H;M$hoGMt3WLtzL;KV=gH}p#`mQ+J19+-d%q;UnfI>GK)M4xn8?3yLB}=|LwTUacFmJ zW+z4-<$Skg;_%U9(+W~73s<0d5qq^9Appswbj%M<;n2iHCyaSjO-I@IaySKz#^An4 zZO&pVGB~#iM0#NpFKnyi*q)&bec6DgQt5vis@$%cu%usStnp;FV zN1-}40BU;-cu7j~rC8vqMVH~j zCjL;s@e83@HR4&#MYL*;zN#&{a&IdLIQ^liMf}wPoROLEmvFc1*mHB z7Z-p`6nZi~M~Xeu<7S>Hg{2^`PSxh)vOFqwh^2Jxy?6BP?0Isg&#iTTzy<~`Sk_cW z?+JZvVs%c{caz@bH&a3Fa?*#?^&|wTdrH0#&Od|QRcf9Vx+&!pKX(=`OB*z6mC_c> z$~&gaVQlNnS`f4^df>>uJ0j0(chJm7TO+4H43OStkbFc@n5cboMl&3RAG1jN1Mf^T zjgD7Ng#pn{#7nt%kH5%Ui5FDxxhX$*(j!bOX|?|_Xql(A_7GT@a%7In+bWwpsL7{% z4mZ};zB6zBeuk9stmOdP(&+@^eF4mEnC3SXy5OOYij`HWa%x_F=8FONZR{C=V+gK= zF=|tOQ+x@@G0Q_xF7{1qaisvK*kD8I11Pr+l~?l(~fT zrH1UT%%iCQ(Fusxd@-)F;U(7OFUhB?3hP(bDd#F48ljl{FDL0oAbbbu2nDa`RR&}H zoqk#>c8T7MPHIGR2dCw@CC5>-R!b-4t$Fh;X(&DV$R=lkCGD3+GV6=F$IwGg`JC|= z+znX#0?rtz#K>;IEg3pOtkjEqG6s()1c=8Sg$h_7LX|F<{odqvlK%;~HS*{x%P4a^ z?h1_nAHN_pwGjEo?4^+uhxd)+uwV<96O#J4B)Kh`ZO^Og%({0p$%8FXD5ofabc|S@n7{qjHO?}p%tl847TkkLIvkBbiHDSE zBxMHrA;(r8l9`w~1v@7_b5-#ldxxjJlQaGUZ%+F4^k92`-~G93emyz*Ns$M&f(L=W zbOT`zQ1p~42C{c;ydBtHq42KskR3K4r-Tx-peOLcHLiWNIIl@)!X52+&!ujbf4yWjFOC zae>_w^P)eT4lvR4(nUJyUoY{U&%5Xshepr`y+lw%$nP$+jleRunPwUe<&#hw`-V+k zVH>=2*rDssTnC(j-JG_n%Nx(TQufUQt`aADXau|nVR#k$?M-;N75T>FvOx-D>E+@k z8#_EmXn`ogY^!r7=H6~yoKNy8w_F3;%)oCKds>x6Wi6mLA=r*zvT@l35@5qKCYd1@ zU?OxvjU?hhpM9v|HG|9xhXc!vZnNXuoIs{0*;+#dLSevVc(qdEi}qxgMcyu0astke z?Oqy@&I}Nj6alO&aY^;@So=W6rQQ?r+Pu03gc)ECDTaQuPs^JOP{%4f>*__HRtzHK z$ha(Ad#jzq?}!$O4MQ9^5-#yk`*2uZ0rD6U!D0Q;Zb{VV7qw|oZ)CHm5s&K*ds}rQ zZMhc(?W`=e9vyHeq8s3x%GFQvtbpgrl1dJ5Jy>DW)P)VAz!^Xfb__raOvgI82hPnh zPLwVll=Pp?X19D#rMakq3 z%zBa~dSmSw;xXI@-hlGr1EAaq@jmwKmQ*^#T(PM?kV{u`a`gVRcXn>(eYCTEws&-h zDUp-)wT-Wxj$hLS$-wBvnnO@QR_`I!fqAH!SL<=_@qA4-IL?!C-TRK;X3UolkMoW8N0pK{T4tgY}LS*RF3?3(DoRvdGZgvZSZpa_Uq(R z2xg^U+h$|;c15DVpb3x&u`PUBNBUT%rP<^LaG4AvfXOCp#)M{C>>x}uY({fqux^_? z8eBu$R&@hPSJjwliYO{C)%ViyR#>HG&4qh2sbRPrlx z_rbQfedOk$^N-nRf>(h@iB*{hT;07qCkC0P+hrv1OdXB^nJKIffLgm9=rQ?6xTN$k zrJ%vzH`Pv~%Lfh>253*nb#{Z7anlB+_|MOAp78;*(QVrm7Z&7g)VBZDYCiCG1MF)k zncR;u(4xr^uthN0g!soRzFS|b=4EnA1f<6c0&795q|@us>W~U8Ssq-(jufNKNfaeq zdj&sCo2eiF4aXqM$ZiL8#AcizBa?2*5a16!z$|i8AM=jkYr|WvWgw@d-GFE$c;t9z zY(^8vpEmuuT;v7fWD6%&B$6c4^>0zV$~{L`^w8dN(!ZG%4c0X=uE4LgYS@$?(lNZ} zl1nJ#6o&aLkcgW470nvG0a$wS$r{Mk&^+=^dfPHX=ix-I+|#3zv)*o!tlh1xGsQ4; zu-pZ-mZ)IDr$@bw!`_c)Fi6wJhTjI$Cp87fz1^{T2r*zqlU{pT70{ii@JrNe)VLtN zOwm7;1oW8NnOj}L8&GR7$E0z`GX&J$RDd9v-#_7ZxXTdDL;BLn?2xYOR6UD={-=@0u6bThvXDL^6olU?R}kKownsi4-Xtpf zIl^?|X06MxPIFOJWk1I?;LIy1Ym$!HuIh<|s^YVOQk&94<(8uLO3<-SGV~~QE?xuo z2(qbiQ8+s~IxviOGDRle)oVDoSb2Ga`|>)?;U>A{_(6DjQoJ{9g=`GF1yInb#tV*! z4rBKRfoj`h>8HT6K+2K=5(%8F>u?nw9iQzT?ENRcP*?U|ue{#gKkc!bkGUw{gHQ%Z zZWWfmB_0ty8uY(Guz7}75NtG1Amjuy1+Tw~Y$ll`*@d+qP0@5Q8awHp#V4z-9hK!! zT#p*0cgdniSu&$HA~OMdAwX_S4IXO#_AoeOB#;S0dwT+e-fi@?uSP$x~wR9myD+%L5Qtz3%nQ>?>VzG-W&y!=F!^MU@5UqEsx@tq~tmu(n7 zS0TjM&WkPl99o{wBPhxUH&(+SfGl2t#t}divawC!S8&j5XD1{aR@D(P-9Wq<7gI#1bL*?QZ2TrQpbY!->yt@>R z#eLwLm^Aq}P<=4t(7h7+VEy;3CYnw==#6TErF3v+7!92w_zePqq_{nb+k6&Buk20e zWs7nJg>WPu)_m~E90mJ1o`+4p(yOr2E2{J=QV9>-w*CH7kS_|q;VE=Hoc~{{QStZR$gt|?^Gfto3P2l+G`q#ZNqHymRbpKB(LU;WPA2V{1+DL5TzG; zG*1CE6a-{v$ah-ihJ#8sA*Hq_2b8>ka9`9OeS#yDEO>^X_sE0N5a(V|2TaWyNg3`D z^F&HtP5U3S$2cF;(oKv3PyN45`Hr3d zW-PZo(@iQk9Nq}bfB#&crun$5>UWaodZ7X}z@CSDY}r08P?vq0oQ5xH8yST4_noF| z1sd8Zi%%fWp;8xXvNWgF=I%lf?`i)|!K=jK_1LS1-#}!Q3*({% zJ2QhiD?y9dc&F_7VH+o9X~VARZp4W--Y60qEH~48$S|rbJ{dqd%N0vLWV71B%Rcei zngF+((U$+X+AI9$6&@|L$Vh(I*dh?Y)z-|_Hl!l+e600wmTS_nQG8klP4k!Dn5d>8 zF2sArGSH*`ixw#iESI(Odb3Ge_}h-Y8$0?;2q~wYM4-*}ZI6(tnT`-VogUO-0JY!% zOhB{0TYr#^%zq(={Vx0l&JOM~0h$y8qxHRj5m1geaQiO@u>SxI?(%;#X~C2*R9-i` zA^4SU9Hdx*zo4}WeJ()m0nRnK7E$mWrD4PDnWEgcT{;;tLCZR)%z;BW9Ss-@2wLGW z;TszBn(`qgn`!OvQmDUR9$_!gim(k@k4af#f>o)^J~P(+i>y(iBEfkJOBsS|xE&Nc z5Y2d4lcA$yYKoV!Vgj}!*m%bz7n5lZce88+WZlGmcyL`YXCSFGN}kK3%_d$2jBqxm zayHtUk=6n@@o-odQ-5ZioxD?;7>Gy!m5F|34a|hW6MIULcW4p4%@8FXumyj;iE-rRBE1NmZ{7UmU#0QqnLmM_vFSSSa4CP}&{sJ00j@V6=3ERhWI5Yz_| zs$BvbAjd>tXhX|@>*M?rhsCNVB9XCPSgIwT9 zX8H*%7togePEO^PyGH7_%0i2yAJX9}&Fn=670R9s29)_%gm)Pbmq-o__qLQm&t^I! zm|2uV=!iDORSD5zIDs?N%qSyqDCRVC9hmZ2i7OUo1m=4iXGLqNEvS&7SuPYy<8Wc5 z;~CsVrE3$jD^^5aI-e;;SdtcNV8~Xm!Ek!n+p+i|lxvIag(%&gBuh)H|aCU^JUW#~4og zDKxMqUZTp;O8`)BMw5Hr*C;r4~Hogl06tx>X{tn))8 zC#5l!0@YJ_b3Z3aQYmu-T{LfEgH^?TVhw>L?b6Xq3+;c2f@-j6qC6($Giw>q#RrXw zlAQ*HRG$?V{95ZjXEKboy&xIsH}5gN`jN zmx{M`Zib%r$AM+q@pR+~gWJlCMO5i^hX(bnWp*#NAS5LaZ# z_*&3yZqt0i(CRiq*<5mjGvOqFn3>gEP-blF!L=R2WXgpLaThA=!ZI>iCOBR7NE~*f zr86%WYVfM@e1OQ#0->4cI^nUyak6I3sqC=EPTY)^or#Aw$lTN(gI`bZO^%4PBIcrv z*6?y#6xkkr#K7q>zm-*HrD8h~K5k@Lch%XnA9F^WAg266Tm@O9KmXC-D?^By<1<@jTl zqD=-ILTFt+J=c7SEvYO}AHHdDWgl(XiLl$weBOoPhfhH2$U9|r!vhnZX=fBn|2QNh zts0-P#6GK?$7v~S7h`gWz#ZHHoK5uxq%(6*X;mDqicGr3rmZ&jGyjVoJ3P7C+!CTm z`ezIOD=bqR0Q?2grJN-ISDL>9*)A|5B;J>H(r8-$>(4@>@o%G<5Qt*Slzx%6YfOTJ-XVTYQxsM z*YxEgTNF+#IDWcm_m%HnsJ>~EB0OOuU<+H~+p44sVB6|KM6DTJh8#OK8ktKM%(VAp zxaJomaXw~j_NL1bydN{G!~KNz1wOpsQ6Q%_bw*`T1Z;jty-j9UAj~^bg4nH%);1Mn6VNI$q`1Rz}ydo(Me*K%) zzXRd_$${`BHxyV0gY2)J_q08jv$F}xgi0qg**BL+Vej!GBP!tIz|6*dA;I)Wx}SXF*A9Zu3B z!$@w(?SkHX65WoifJ#DIu_Hw;gR4?d3@=D()Ex!U<(GxRbvZiNJ3HUqJN?Vv(d<~j z@bK<&!P|7WdM(`cCLaujnV^)+IM6eh0X6v`qIAq)eJy#NU5uw7w63@Q%?kb{tboDa zaQ7(MgLwm(mM&ot`5^+7n60E}$s3keS1?LwMG(bKvP)-+f&-0*>mnPLw>BvgcgEjB zh%_Pkm|87%rLOZN^wV;nMFsS3$P?E3ayrI?GRP*@RWdv#@3;5Q-`YqP@54DEw4g{z z`{R=KRj?||v~_M80GQ|a9xRoU0%DvNl|!~5{#GSz==b!e!=3Zj``d3$+dpvPV2OMk49P1zU$t1f9WLkpS4&Ogw%yPo!GZK!?McSpSri*SgX+nk=>jaN;-3k z+_rV2RgCx(R`?}4oZSoXe`(*xW;bg%sJQmV)0t7l45wD%t~0Zjcg3K5;KHA#pE4vU zT%4IDu=TL*Xrr$IgSu)@yU{I+R@t$X-Tr%b+^xEku2(%?DJ3zWz4&~4cjh2hhEpDx zTVS!-yv@=PL-|GenXv#sB(agjtC(v7t3@}kp^ABL+{LL7t6+u>pBZfb&^tcbJ3Ko- z+}%FgPB3C0?0@2JjvDZQiz7$su#Cj_EnSY75|83SBmx#9Vu{HKOz4;({UubE6#!=Z z@P7{v=FZh;B=kQ9+0nh%O9j zdD*;|XEsk93FfdoGXJ%WQ%lJ2&ynAA%hT@?XtRaxxf52I-;j`KA!lHRc$H^+^IL`q zW5r=}+wa(FGsY{Fl8eI9wn1#|s1^TJ|g4431Y1T`-sNso)?qXwy!PT$taIKCo3vYsGi@2jSfD_Zw3GM6L zWr^SNx}%xZV>f;{O1Om4=yQoz3~uHGPB>U}VVOvZoMeNJh}pow=Zzfi_J9K0%Xjc` zheHl&lRMpnBM{-coync0H1anq@J(<<<~7K5)CY(u@8lZZqXvo8h{wFFauMET>*umT zC%&k`BN?W!(}pN`d~ym*ngSSKKgy`Q+hCQga4OUJfbkGs^$8;cinGIHn|r`TN=>>`-@V>FO&c-0=>i zb0!c{%QAq3xMNRcl7Q>}?2FRLb*&^(BZ>aVyp`-xL#c4F`O!w6TI(u4T+PM|vp-h! zQXNl66AHMqC<`bDHjn0ra{eA~pPugh(Ca3z0dfGi{z>ojZ2RQQHDpf9t7&ylr)9Yl zV#U9fr>W%2LhIUvsX_OWO z@6y2qt7X7r0vzPmIkZh=!~!JOO{N;B+*VdcNfu6t%UdWoQxT-yu?ba)yv zcfX9Rh3pNW=Q{iiJ|BjAFz0aS!5>GH1see#U={-dGsE_LP6ua!OcS6AObI4FwL<1? zIy}EF%a6F(&}vuYhaxg!VL@c}W)EX=B}PO)(tTEW(bvHB`VG`Uw*fLllk0I&TAcy{ z^&u1nxHsEoT>GY)pSN{wz8GV>4lk**jFWPhRWR+}%WYt8hu)7n`|sc^k%(vgsY<+k zAvK@7fCuPAp%U1%dQ*++sl|G(2qTED2Ws+hr$G8+XOF`5piJD zhJTG#*!e`F{mp8u7{MvK^HMuUI>8R860{ZRg0zAI?!ih$m+7#|=(#m>Db$nJ+q-BE zg44t8m>Cifc#?843W@Ay^e@Qc>z? z=c|UA@Tgtj0bD_m+d76or^s|L#mk^G{|q|CNNlP;ch&E8(K5(UveRu&#z9{P+L8sR zy?3_%m-Dl|gPyq>W={r1mHpDE1}Jg?AI{zT-HQknA?A?Ud<*FxG3)TXRD=CTy)`SR zy&tjget`i7e(FY@9g6A$hD28RTfhLmguCk!Xlb^UhyW<-Kgr?IS?@GCI!w;q_5gu% z@6BOy^cw#H5c-qGp|_OHLhJ_@c+m{9sz1&z@Vfn!j`P$)>0Xz^0g*Iu*3?=Tp((Z{ zl5G%-^R6}m3{ODMKO`Q{WzP+-&bG`ZbX5cNA!TAfYoGV|(d*aZmQ6dPZ(3OWg zLhof9pN1MkvDESos>7=NKYwW!0-jSii%(P@?^w0AD?W$IoM8A23#48zN4(g zm$?h|#n{L2<=rVrl9bU(1Q%dXWO!xoIQGT9oWiiIuiDT?h>5Keb9l5Q=iMd3!j#2x z&`-IvL*YvV<3I8N2OKN`Z^x$|VE->M>Mp7)$7D9Eq5C2FHr)E@MajV;&>L9&P%Q>O z?Ua#o%W-}MZlc0MJ+nBiG%!Y%=Pp1mfYT#eqy3>61gB53;*ji-a{gqCw-~osIc9%o zOIE$nUUZyEo5n+SL~!CX64oUTcOq&$mzG!S`n)Flx=DxD>t&22sd9XU=|V6SE}S#; z9ktJCZwdUJTy#9`_0BwsAZw}60xamX0BbH$g2mW`pE@DbcHYh#u_6GR8#RvfRu=ql zxHqeeu-k#mG#%D<2MyQc-9USUkN$Er$!{b99>SeMrmr)au=s|fWIF7Nt zkO@H}_q~S1%d;#hf!?ql@#OP?{-16WHad)#Y|laJ<}#avvpX{o!wPP|8H}{F@N-cT zoRn=d55#>df7Dt88s~ncHCeN!#v(^lYpbN0C;>j}kh-FZD@PFR)hWcl;UganGmlq* zEF^t^)jBJ#Cf62>Bpni(0V1|yc?7FBZ)P`$uREybts1;qupKryH#eu*$s$8mV`W13 zV|neVLRaMVwKXSn#$Ikbm2Wx#Kt`uv#+vf&V?Ettq+p3DgFPJ}b{d51a2~z^-obzY zuXtwr+YX4+sUgS;n3?BC#O_P{NKR)D(=KJhXoC*CLE7QytMBZ#v^`Y#My|OQAtm3I z0??cjoH;(BaTw}y9F|us96-SHr_}7^WXXCgqc4hW-jMw*>SnMZGi}2&z`+?4B1|%p z^2SEkm>QPvoix;NsN1H6VGER^3BCG>l?-flliUnQLQ>Pq%dBsGsCd9`xP6^p%If~@ zM*hhV(gfAyum+sq;GW>%QP~OJ9MU*Gl@v^zB!q*avXR`=wBX%jFL=`V)bHkTW>MOu zO=(HWU=#t0MOHhcf>V8>$Ls+Yb{U5E(wN)6hSSo(+@jpkm6VEJA^%OjQUgg5yraOv8(qztsc2&#bgm9=;xO?UgHx^lmb%7MQ-n; zv1ILFiX)bZEOq1SL|h%8eNXfYnk-8ha+EBWAr%@cqhuX@tXywKpyR67!Q*G`0U;lh?qL8S2gm zKif5(Ci=?_2mhD7f9-DL$kK$-@B9@h^|A_(K!}uNx7spQiy|qDE{W8TlwH+s4_6XM zl4*fR3=$AUw>`i8#Jb@FjG?1W>ggj?E-x3I=kQvWW&P)Vl+4*cXC!N}v1W^Ff;Zu0UXChAZ&qe$U}-}Q8RlrjMe_bFM9b_}XUmKC zbJy58>=E~mUV$EklcVjOJ;KKYr84~^Av-A3*x#WdEdgz^4I1Cp8Y5M`r2)tF6^#rW z8Jf4s^1w9I*Xzz2st$wzwhwmS?%4-U1Bcuix*D^Ov$#d+_N-q>1>^T8 zN2e!;r~3ydkkWcS?tA!R@L=~%?jF3sOai|75DQI09A{qR0>Wb|j8^{zfhK?PhRu9f zY>O&0_m##_!SH6K(;fhtf;T%EdkNLDHD!h8p9TXuFs{psd3hy!e#Ot>`@MtWyLJ3| z#Q)rKOHuqD|MvT>xBPgATlo3z=Vft()l~Vep% zcmB4wD_z|?IyyZ1@~-{QqWG6~j{AmHY2O|0>QMeaX4H0HnQr~x?AW7l#9r?o>>t0` z^CR|XO+CL-)q%DZp4m02GNOm?6h8}0{1?*xpi;Iwfm)1w7^e?zwctnBdHC_q_OLj{ zz#IesexYX4J6tnq+pZauD5r$X`$a`T_WodD=emJVBxnalJAb}(}N{?chDhtn!->Y-mET~k7D;?CYvqqzA&%{GLB zAwMZtOM*L*UUt_Bl~Wn7Ht8hdSe%p7vn`ghLSg{8l80bxUxLa2zSd>wUTINLxK3!z zi-H&Zy7#MNfx5Y+6oH-?qg3@jvc06C<@Dp!9azJ#UW{o5F`BMr_O+RF3k&4gudCRa zgx@Gpg|6Rr=O&pW?v820&`%^R8OZV4sqXq_u&ZZ)M;W+(59jp-VpFhw<{8BP@J~7E zTl+RnA8AbqK3-5}e)jELpc90wb!3a<{4j(qWb(D@sT>>XCg=f(03p>7{6W?43fS^L zkZ;DeVfeOeH9i^Yw{SKqfR5(F|}qu+5_>=4DXe z^hZn35689zWjQk&%_u|#5SFD3&%O|61{;xkfYH!pvok_-!zO$h?b=H5BPm=TUVv^Ikb%3%^2MKaFsh zcSddSmL3AkcuX^bL=4xZOnKSW8#58$RPzTOxeZt}y3v9Wk}+?Q02>_wD9WgZJxIOA zOsu|*Q$UrgWD)VUq^(TYQ^Dxl%SK4a(>Hrv>{z#|C1iA~Nt@f_US;R5@E$IDf(TD{ zfhrc!xML6(-=xpm;db$%ZKYy_oC#P3xt=b3=l3I%8$D4F!k15c$yEF}tO0XzzIM=ttTIy*iD|feV!1ALS}H z^=j|?{R8iA>SsJpilgiFKIw~n;yh+QPo5?*4t>Cql7JrNP;mD|(lxQdvY);cBN`C+ zjW~PnS7x`Btbr9%EcIt}c59p#QnJEV=GLq?4d&xO0Cg26`{Y6U{m_H0jRPdv3Z;Fe zQZ<{k`%F~HJ;1W=RQ=bl{Ht`mWujM>42p89`zgSLC7QsTA~7%ao)PrhftW|Zp4qFB z{AZcZ5F*`|&@*{)!TC~6cEtG(6WN)_Cckx99`!Vt36FKAb%ZY|{jHSr@^ApW1x1*X zdJ$>H1VWq=QN<;bBqlTWrQ2{jyS2VhBZ_5pBgvHU^ry4$H36tD?Zv;jUf+`=pYBQ+ zgWK1+UFP|LvW|hQDq;OMcBQEs0xaw+MVy%r%cR&#$%}bUlh4reb@_~xV z3_yB{nll;@pLLVAERp12m+c}rNcw+j-PnWS|L)4cGVA}UrBU>tIj%|MMYP$g@PK~2 zg2antO?H(5THy#Qo5!j(29LsN4J_T@EEM_ega5G`%c#3{Sq2UoZv`^_aTWm>fF)xr z6}K0y-Ox=DYhP?Ac?}E;#>*f(>C3#A;=!^6GX}} z1e}JqmImes;KnH9;|jJ7qnJ1sh80Mr0ZK3p{};BDV3#DS4BLW13kJ1mNRQkvIN^Zv zX)pcZFWEb$g6$lE1ET+`rvVqC5S9khW@5`cU{$WAvJs;O$$#bu~vxQsYz~26$Ywq;m@ZH|K zK3Difmmz0PvHdzCjlq3!g|Wz5O<%Vj&jGO{m9g68oUerY>ZxSzs8be%Jqaz5X9I2P zjNE3`Vl?bap)mkYLiA8dVF0slGzI5fJg|2*Z0l64d#Z>_^_D4EC4B}ZU#gpEQ(jV_YwLdEc|1Tuyd%2 z4f&FU%8~qB_9NJnzE=V|Z;2p+OP~q_k0Od${{sCXx|$IK2DsOSvLsvqOO!edWxU(YLk0sRTaS5!qJavR*ELOoF_x1^{GK2{&-l zaWk!gu>pBchmmx~J4$6)p%0l~2Ux`1@XApbFL!Rlta>yp004j|l;4qj;x9bPjW{s& z08@nKnzvx))ueHYWlZV=8XBMu;a*ju-a+7~Q&Bvt2;S7Us&9vP5ORn^=Nb)C&ku_4 zml?xpwDRtRx_3qVMcA=9Uf~B=rU)#(o=oqc9G=!+h zz%K}kCX%k5tz*dyb_bm3CxLQ^ZgYOW*5Yy9Dxa6C>-YyjeN5W?vXh}+LdzAHc=2i6 zDqMIFI`Q{I4hllD%nR=LZ=d#Q#|g{!S%pP>K%5G*`Mkckz)j*baNe*G{IM1T=73e7 ztI=}d0b*sO%Sp;uX>yA3ZABdbW#}6G{iOFNLk;1QK{DukBs)!l+li9PSms+jfzqF- zhAQXSshSBL*OQiC)x0F>EL`2niXKTyfOR^#36EbpRDtGia9(q_YsMyO#8s6cGSC1r z*u!5DXewEje+z8cImK#&EHZN-&4Jqxpy@490)UCwQ)AEjO9A<-*J3u`ym5kPY|rvb z9Ca*io1RaRuTqaV^mt8UeNZmukpa+t>t*Ldb?9ljl(+K8rQ+T-Z|2rP0#&D17d>}Q zEM=lvT&bx>XsI0-`w%b=jXyK^|hf2W0PcXnT zT?-YeeeJilcm!*eKJB$fm6bx;Dx<@3b;JYfmo18F1RX(w{a(MbX5+a*%T+$fqd2$zVeP!xc!3a&px`-3nT?EI$n76Ylrt zILCd~Y4Hw#^tfS_QYd^}`wTM$yM-JK&`9EA__jDW#GxE;0Gq=c1_{oso z2m=1*H9oq94G5zJrW9eiD#cBG8kgZUgM&%>gzE=}W%sN{?sWWw$P4hZ>pAFDbKR@^ znix`i#!PvnGX2bS2mM6-&j{gHACCV4O;NPR47c?KU~#RRS=IIj#{EBnLM^a+uu+5; zE#zHPH^5-4_qOp-3c22+dOliSfqVy7fkd!Cs<2+rn(~5= zax<|d%0Qngzcl*@NC4n5$rsa=@pVQR!(b!DP#wM(E(G^jI^?s9oQ-$4v~ifQ;4MIs z4EzPENX`2~eWU5V6d$F~EJe_HNkchJLgIyO3FPnKkm2|NBC*qTWQdzY(_MzmT zII?(E73aY6i)o2mGXNA*_t}8)4)BuD))~@kRo8A2jv))usS>hAVfd&CdNT_{12^)d znKH#0bAwSVS}+8pPdHf*UA$)+M1B(5_eBQA2gx1j-QR#gU`iRA;O2Rza;5|i${&gfrR$Z{-rm7p%rtv zui81TTK6QC5BQEaodKvuV-)5*JSQdx^1Ws8+(u%G7;kUAKuU73jJrk>v0l&=q|8nKvOuIDY-4GT(j?~9 zry87hs`T@W%2a#f8^uE~mb^-@oOVws#kdW_R9PmRL7QpHu6$i|;_8?xMLv(#086OC z{hZS$E~zAQ8U-?EqQaU-NZ8+LYbLov6H=)0oye=2u3}!osf5RYG(geBt!9O^ zH(5R${O#cIrvp0Ti+w3?fQN)60*cjuCgntr3mbtd&FO%hW|>by(4&l;FmX!cz_`>K zsu5KMn?AwZ<32(5F}xE=`Dii&tl9Y;-cok~oX+UN99SDOY!Qhj2=Grhnl@O+x}mZN zDbdvfZwV{`oqtrT#TNpNMX-OEZ!r&va$c5P`V_1Ci>~HlemC~P&@w=8v_LzrO=_eL?V&q^{64n8}SA8DI`wkm7(+Ux?ZXLqd))RE}DZT zczs#B`-8r*W;;ikuCdU~aY?%huk$`fP8j!{uaynVsG0iUVf|)2KRiE&6@OmCfkwwN z?|=q$K?;6@!qgc2CR_88 z$r9E3j^wuazCkno%sQ9s_wdd9f>bo)csa-MmY2Y((8K|NXrn-QKPhkEBhP=^Cxbp> zSr3Ol`t!wF{wl1W45bliuwEqAGEj{HQi_7xG@#RPN{D|G8qq<2kv39Qe~XAsB-LfB!!=aQc8)?-C_NI&z0-{4a-dMPLG6ZyY z^~oxXJbc!*7xkk!MzkNCxID^A$iw$x6q>a>OE$Z;waE`#%xmzpMX_<@b&>OH!XphdM+UA5wlHg(MD)6bxsdSliJGYG+OYLY~~dAiZG( zNgSa?E*y(EWD4O3#}$qShCvFYtcbEKju02!RRyio?UnnjoN{OrXU?PzhM}h@K4rG4 zap~qd2u9C9`^FWW<6HAB$7#9>0iC#?Y1dc~mjcFcJ7_q*Cap1=V9+^C}P5UBLC&VQtYZccC!moHQ zSqOyqT?Mf*HfY^!7VV0Jrf^-{4+vl1?;RcQAD`T(*eLJ9q;{p}rJ{H2d_@j=P&>Zw zXE(|}>02MpIb*{BY6@KbT(ec9pk@82I>IT0tP3RsI#IEk;e;Hl*w6kPg^+PwnI% z%)Sn)r-($#aDNu+h3i)cp`df$^RRG2u(I4Fkwc+!svt120m(Yp73*lgv_PPXp(TteoZWbdG-LEE z(fqT(41rejX1M?bO5s~0s*4E+EjQF8A)E|4iy>M4VR%R&JzHq;xfjToZSI|nQHkCr zWlHqSW|0m6a~I*pS`hQdZ0q#OMRS2de&|tygSTV4ftpYi$}*DeeHItdk3!DhVFIY zO+THnlc(1o#v|fpM^r#bB?tT#bclgPCWoK>wu#AnR*N1wSUGXjN-}%1YR+mKn%I)< zkdqV)M3+q?at0Jl_tqBNi0PZXzE_CtVkW2by64P=$Y0=OHa++C3hW+`8S^JC^qUV( zm^4zQ`ItGY7S|Pbgs-0n4du09yi(?8RrQ^G{&jy!l{P}Tfm0S+G2~(wZFb6tA@&R! z*OIIbZvqfM zaKqE@6xH`8E%B1LTkuHf8xt_>;~4^NWFckB+A$V{6jqLqvhN^T|Jl3I)TN*dM+V9T zo43@;ljq4jtjO?0o&hA(N9yfUJe1jD5W5MaaZ}P+9dt=x*nVg*vdD{CMh71W-MzK-L{O4@I46{%pcUbf7Q=GZ3qdvbaQW#7F&zUoSC0X7@C5X& zSgSz$w%Ogc32=04L({msnO>TJHj_a%1EiS-V)+u#~5@~aQh>0@k!~HAwSFbNAL&?*I$)0UjWZJ`f=w{@N zMtA3shJJ$%ZJQ`>p(MPn^Rr_;MpS^^R(gO%14>6$DirrjO`%%ZARq)XsHzBk#?CRyo>X=$i5)##1P#@(R&y z$y*4#7U0$doJMC2sKL4?xcI?b*H*@n%pEp@6!aoIvc%tsbDPjKWGF*gcQ}DI!;5J- z^*DX%Az&e7Ndx5Xe4*K=oKO;_Q_6zB&eCXmH&=Hjr(@unsl2bETx3RJmD*Fo-Ya?> z{K09{jYw+c!oO1O3&x#@yn{ul%%6m@Eni75-Rkw3QU%wy&^mo01a`Py(09+9jt-UbAl^LKF<2X5z-Lp zK*kCcKmI~+y700)WX$$n?;M=GMcl*boBe|mfqMjsj6OUkIJ~I!eWUGhtNQ0Ot0-@- z!1LW73{tbg%XzP%+~qa=+8E?srk(QdL1@IK+b^-wD}41-6v?1DHIM>+nqd+2B)CvAVZ5FY z9MD*;Rrf3gsuu#A<9eWiSQq1k4FH5afjJ5uoPjbA*cOR*-4OF}Sx{ekR9wfD>W97{ z45mYC?w997lel*cC7lP*&5KHi^W7d8EzEPdy|CE2e}e(02>0w@J;1RR1uAOU&j7zx z{*AcVpxu`*pY*A1E?HuZR@A0#?K55yCUI$yd5p?`ExA_UDWY*(=y@=FG@_vLV09zd zUWl}?-~zz0-$e+qK$~>nXeAQykC-VE0VR zs5E@Idt8odXWGEb=D|I?2IXPhP&Ii~v<>hZXIr5*s?To9u@%MAs7D2N{MoWyOhI$> zWA5(AwfOiU*I2IS=oyj(G7lUFPEu`0MNFn0E3!aVsgS}=33d9k8N2*n#LZMy00lAl zD|aV=E8yVFjm&TG1;+Q#mT35a(+gWdqMlyXXNb38x8?q0+*50C)xYe=we~Qs0zm~T&0)|0 z#&rTEr3pSHiU!eOkljfQNl3sXIu|>^oiM}#m7@oldSK`EXD7a}r4(;WhMXYn0kAr0 zD+@B$dl=nH4M8~>%;ldhDEX2v?hzEXrN3>d$5ZkLSy42gwwfTgh~Iz^e+_o^1gSTWsY%B#+b=OB(I4r6F7*0s(Pd`Gqe< zH;_~YJcI+LRTzX!dc&dL169X9ve>x*gB99i(oBS^cww6X=pG3t)O!KF(*d4PX(f@i zjI@#irYx@3ecD)}r^BFJd`Pp)B`o_(J&k1-D-G~E2CA@tdbkx#ufN&B$5S8qw zocKGq#i?!E5ECgL5Vp zvO03(!zv2YVwtrxWND{NGofI_*4!U+7E93H&zs)_==tu}2tVeVk{5h;Rn88V zN#aBBf>-VuDQBtKM3xRDm_FC6TNCYX(6TuUcB>X0(vp3JjiRfb#iUz4ZqDJZ*IY`| z+%3g!5Z9so;pNj7z1eO(U)=Dq^q6%|E&&eq&ARGjf&POx{L6lDc$b^s6w^Jh zmaUl6$`tbANteWcK?^+-XKzd}u`(eUjkX;wYk^DY`e&r7S;Kej*S(^92zUWQR&7A4r9RwmkA`cRF?M0qH$@=@>L?yL(Tx;rC} zU5|PXKfhYGH*ehToK*9E52*AW_EG4)7Gf*F!D3}!#6!8O>2_q@bCTEJzCD-pB9Jef zk0X`ra4hV@d?!jU3x0m~OJ+(>u;wfi~2jSHW z6?EDZJ2Dl%~n?ZZ(TzG^`DyQrtKJRP4QJJGVu(i1_$ z&|r~r65&_)fP{z$zoI9_>_hk!!s3dj`3jvEljf|P7?dY4BNS{1d*?b1Pt~HqJX_9Z zOJ4XqctWn3obwSZUyFSx?598^Lh{cP=i`)rHh2Yk6tFzi+?aFHHSZ z=6`~_-9Y0@6kElH=#u_WK?YtUClDC7`wCXq%9e38#!Yv%Y|NCqHvQ|WPA9F}Jj^1P z_x*#Nqu!^!6MByxN%7X~6FVD>v2y(+e|$K*ih43=OnqM_Y=qb7H9B zxCM^bMyh?woBF_4#Y^mH{Y!ikSe-`vI6_I-N*WiGmc|NKc=vgUPN=19!Vu zYXQ3BdOwt;D!v9g-eN3DBs*Tt0dB>{ET^+EKIOw^Q)9q)NCvMF@jL0%10~Z7PLQWH`$Kc5vvtzTMv`c(a zf2@d))8B@hm>KaKcBN~I2^V&`CSM*!c*eS?prN22BRtE=r42~-1|vdt00ur1?1t9x zRi9~m)HVNViC}6S2=Bb*Nrz2hhaS-{&uvk(F;6K0sYg~>T*!mEdQ^&+95s$;E{3YyshS1HQI z<-!yIU=~{{<3i+`8Qm%9npX*^7aOsrKp)HSVvI3U?VVom!|~qhy_20cnIRS{+|Z^| zKmlL!^M@%~Mz~KgJFH}aS<=D71CFq`G(+oGC9=xyKR%RKmG=Znn|JTF-=j1OYn}A1(vM%?Ub~Tfaq==us*7?G94~GRdQbl6)6HVN*v#qq(7pHH9~>4> zHlO|bv*%C0dG_zNVYRcR#+0t1lG7%=ueS$$D1n3cA;Ec$hzf0^2RAHs@C`ayBH3oZO_yn+-GiZ z^5`96$y&YB52UpJdJGc@|M<)AZEZLS5U%{){iD5|lheZ=_l{n_J^Tr?9eBu(3~3z0 z(2E&3nD`aZLLhttB;&l=)i%wf?0bZq6GfVF!;oP zcZCXao9uU`@CN7Dsu!1Uz4kehYMi`3+W&FeS(3&;!5P`b_XqFG;Yad$fTMxp%jk`R z5$hwdj+sR}iCbG6h47&|^Me;pi_=1Dt0XEdE>`DklP8MTWC59n#`h4H#S zybp?R*nF|3A9lWv$|0g)Z7bIcFSejhxXvS?6hNwPlM~h=fO>S z32Zxe+5Y)^Ckoth>iyRDY~sxxua5@dV0Z7;hwlsCnIBr$ir+3o^4!aj zJ&Q8n2Hc1)CG?*=)s0;4bT1V;b%#9FE*M+B^-*0(#RS+SLdwo~21`98WHm-nL?39{ zJ=rk0AcNiGmfq|IVQ>nBR8S?TGtLMZlFLlqe763QfEQa^hUS}nXTSfReowfIRaXRv zj5}N?OxAa}lq!SWew`3nueub$xbA|!4Azl5b?0Lw@8vm>sJ>KeK>*jfP$)>cJtKB8 zfw`gx5a;D{37C`xB+vJ;zhHHX(mz^{!pTvb4CoN;=Kb(UVujh5Sr^zE2vHs$fL$0w zBXP~3z*%u0OSHHXI;!jz@mR(%Wj^q~5H-9k*ZYUBU*8`VGz!~TC@8(ywS(71ejF_R z3GD=BKhse#U`<&U7Lo}W-849+|M7^JHtuz|aZmIMQC(z!kb9Q2AvP(lW|JCOEC7)> z#8=PdstUW3EEA+#DW_3lD}mFvJ{6X&-ao{`Uz5pzi)x^6b*fB1*j$MHR>--*qbE@~ z@U5f6%T&eV-4LbM_R0wm#a>*pJdBfYVFWN1UTPUW2Jg{nmzFfkxY|Vb2~x`YxXY-q znlo4s#FLgiOb5{vJ`~bf2JjIb7%wkS8fYe2TadM4mH@8+`>p$wW<2x79hRwxIuUla z+(ITB-IYF%B;`FTDM1NIzQJVO_;#Z&%=)OKkAeI%9P;V%lNlN;Xf+7=;9-V-W zKG!|n*m0 zUPPa3w+NeM^}pm=(Q#2#KdR306%!>ldS8*;zPU3ux*zdnf?m@RANTu9`sW8O;4SOC z?&X%Dx4X4}fr62A^RAD+!|T9Kz89=#Q40TCw_ExunFR$ue{^&}@|ykMnt|KdX@8Bq zPqVzf@IFo8>by^3tGbtr%=qC6^*b~nxfCO8I!n?unuWWLUaoRU2M+JZ7V)rr*AOy-#`BH73wdIbQOQL zz|Wn|m+(ls^KCGedfOeg&i~nMuzG=W5$^mT=k@3>UEg|UWY>7NG`;QFE9Uo4&F+`a zE#1`PgY2-~tv=PGYUi??yUkF|o!wlITGo^vsJ^$e{r>dT_Q}qh)9sVPcl$g2wP>Yu z&-8cy#7z5Q+5gX(?Ejyg!j7rn0?BmEV<|2tdSO5?lC3Zo5QG)ANK*707eQ+8p(cm< z>$$odk(n^PEZ3m(4W(u0L>{X&?pP1^{&{8Z<=u2WR>V`cA&hD0G6VQ&1P2Z1fwp>?)|xG4fD2xcKs*G_ksq&1K$MPeCr%5pFkdN3U; zLkKY;P}RqAb+&|hk?k-n=gh55&>5%IP@3ZYY>qH*8p`|7_lxnF_zZjQ_kMwwoEP`M zYVQx|kDTw&It~Q_h*>M2*#S7Irym&tp=?`9vEk!%CDy#5LIr0?V=@(VuJ|Jr1>=_b zq%m(F%pB%9H^@;5jUn-nf=i}YACRC_EqWjsOqjf0;CqyKHeCCgTN6KTZajJR3t31U zLu#iqUOo6~fL9H8Ro)kD>$mjxSM7gI@5^^+Reh_%=BrlnR<^zxo6A4~`>Vnx-f|Ha zP>{YY!ra~9LUHc!g@IxfTnNboRHmYtyDQZl_SKkjCgB(FEDC$dA4+F^^2F9x6DM7K z{saDPN5UOe<`u_h5d4NG8BOLZ%K#KScL0)IQN;Gc)b(qGd-2!eK74e)_*P|phdVg9 zhdx?)S6u1P-4%Rvmz%W!qQ6-_y36fa8PVU4AKm3%t(WNUm5)~59v4z{x8q0drsDoz zF~jPwe$sk?`JL$*5zHHD9ZU{y+vAVoZqW6i-p`XoALVa|)Eexte3ZY#+VR{a`Y3;S zTz$t~&L8E+1n#uS`f!7OfVYqs3+}j^D-0h_{=TTM09in$zjx52FqIB?RpA0temXsgBdIC>P<55WKl0zepZ*u^6sV<)$Q!CN^* zP7%iJd}vy6Ig$G)-!=^83!^pXA3!=kK4Vp5v@%F9|6?tWACZ!uLbayEZNJ*FAV?Lbxk{ zYdRJDe=SQS3BwWbm9DS`Q2;!FmJq3{gi(fYH+lr-x>u4P06$UlwnkDMVTbhhBjz-Q z+j^2m`2HdvVSj%CrWgG6Vl7P(o#BT9V$tg%xonM~A~pQtMz2?IZM-Pz?__n@Owsz$ zBUy;9i3f6t$qlW4VerX0#gAYBUvA+uA3P{FwzgOWryS;!s$Cp3i-YB40%o}#4+5hY zzo|D6;jcf|=zktF^GDV;%&%X?N@Gx(jOR=ua6Bh)i{@OX2%%tpxMRuddNWyD8u-cR zhoYXkUXDHPS~yu%fDt%0g3Lh?r-d*9@GS)PAl^HKd$|{WI6DG5Fc}_i^1CrY{4f>4 zg^C=&c!)vBHKH#AQYa30LjfAPFfEe{I!Z*Qzj}Xiw$kbaCG?Yg{9kwvAJ!q>O4G_EAocGF6f57eb1-=y` zpLjju^L%Sgf<6OWJv8tlT$%vEQaOrwWa(_8;48&9LH-D$@RGsdVm4rt2N=QGa=~M? zJ$Thu3-|q!`_o%Kf7pkw*6z}URSPO!BWo1$WEOu~8+Th6!7Sssap!4vO9>|+oLfH# zFqLr4i)05Lw!}&<6aLK1vrZ2epH2~rkeUw_uZhD&Ih@(o$DtXvbog{KcE>P6@w-nC+Pkzx zc?*oUI2gaRMMD$>;Uinu-IFmj(>w0jJ2D=1jbvu9#RM%z$&)y2DZpa-$#73Sz>&Yp z*+O23ed~7xuQ&go0S}@%$L*8iAgLVB!A0)rPVn@J@JP?=qS!w?IojUY>-C&XjkkX_ zE6^`AC}bAt;eD2&U0|-Q#IKC0$Znl{gsP-xPtTriJb6}?Po6#>e?212Hz$wZ{uA5X z*1yAp`j!%Swm>>5h`s`f?r>kxCJog@Rp!>@#ne_RhMW zZgb7@hOa)^n6XqeoZpU$^qDv3DkPal)&Wy}U{Ps;Fv_0VBsDAcL^D#W&n0G}XmtjY zb9>7KM>Ett{%a4@YUi2;-WeT6>mLxz#rh`eL;mFrk+~T=t!3KL%K>CCwc1Q9I=o9=`>}4f@4@t$}39UuoZ(uV+Cz&ho6u4^kq* zh@+NnhMd`%V!VJ=aX^@i11qf~hVO5B!RaAT#Pq|llhW_EkG9|Ko$MWnV)eqNU>FBM z=X*wSoE*3>H&BR*`s z-T^C(-{~cNoO*XQtarzs4;^W-kMilhe!e6B&|}$=+|`{odpmzSh4{fS=1@q$r?Q&<#SjO! z-tm!!ztl@m91AN-z+2&MV8g3b76A9poE& z@bAOTji>(sbA@fPgV3D)a1G2((oOg;c2hlTuw;yHEqWXLUVNZ_9}JwT624qtuEdu# z&qm)r;|i+9iVjEv?!Ry7RiiG`rGZjY6@EH7+jUWX1iu)$4j(3HlI%j2Tz^`t#1zl) z7>NlU*X);*vSP;a1hh4MK?8JIwAw!n&tCBZ-0b{Q=vNG6QVZg|XCL{>*bc{BswRK0$tmYyzQ!GKl z^u04kGoosU5@C@fWs{&fWtIzMt#U*s_(Pq)ZY#%As zgM8gI;Fz~WglQUxTVV2j@T$;^FRc=OiQp?_g-_TwCe8FhiWG$}<<5`MWQhSVWJQ`T zC+lRaITd~0S0jN|<|XpzjX4n!xDC_pK`U4*ct(l0QFn|^y<#H4nB&{SIW;YbEh6O< zsdhRn%dz)_^Q;n@kbrzQvIK_3cKXWXq=%Ri;Oxh~UJSS7iA($pBt$vz4x!Q2Lwec6UM8Hze^>%No z7slcQ{nF#ve&B|bTt)7jcE5kO`3?V(v|+-8e6zcLee)aFh?`+;#QpwqOXQdNj4t*c zfEWG?AN9mN3TH(h*8QRwbmW_9duyad*Wv~RxVEG;Hv8CDt)X4glu92l$1F$~mYrfWJ zYU|ShCOrMi0+`;4<&0%F;_C$r!ql^#cd4alZ36AiNKX--hF9)HQ<$Y0)YRM{L%ld4 zt0RKCwkduEm0%vn(Lu`2E1)rRCsxm$7JX@mItDcY^7;R3394J|;FkgTk$V?twD1SRJMs1G>t+Iv$_FVMg)@N>H+9Zt-y? zFea0Y%xx=O7H~c$-VG9z%Azxr>M)jZ+1>c{<`WO{p_qq%suy|up4daWcKvQYbn!-3 zj>69dUEsRWae@1WF4^4ZYDF)3ve9+TlZ|K3;Tn5x2Hf?E-cREtc?$JVVp zKbgX$6+t?tZ%C3i-6S?c#}q!M;(5WV61f*wvI@+J{lmbba07J)RF+dIZ-FNS9+-MC z=`EnTqnpC7wB&4yEejarA5==_;=_LHbOnh!g+Kk|Y>STg#;+RS(0C2&Yuv~ER>~b^ z?g@C~{2?cL6>@iiaIa|^6A2$O|360LgHqLlMbb_SzP#Ll*{F&)6L`0Po5(Y>Bb)~vdl&FzZ!fOKGhZ?-Q7OfK0J8)kKa|(We;bU z48l7ech4{_+m~k5l2M;uU*1%;lkE)FfCD0VNc-DM-kXLA;x4;`?uwWPR^un`rr=1D zgsC6CZT(|>X!k-Ti%tkc5+tzw;HjnJnMS_0U2rO#sH0Z>wh;#}QPI-OBKc;qUOcBB zd|RM7T-0Nzad&B~ z;QD={a*i+^=yi!NJvQcz6qvxxN5>;=nd^CjhkD&wuc&P%C=#ML4pb#xH_TJ(T8`&+ z-Dzum@1o*#Ufi)+%x>4odgqfgcXqOu?+s1A32K}AA>dZivZW+Z#L17T!htgi{e;?F z&;8j?0_9Q!2P*MoUA}MP2JwvP)(yBk7>=W`Nz>d0HRdpsTCY|y@T3mibhoM)dgl*a zQeY^BvYe#i(RtZrOOdqlW4OxFTQhDOW^_$!kd??DCxzv&$l)&~O4qplDDoqKpQb^# z%E+EPQm?OUeZ>MIC?uU3o4{`Q?3!BbWa27p@pM@$yvM4hV0K61i;rzvP0S{~)W4XA z1Uk^IS9coZ1_=>e0728-UGBrgF`!dK(?jF)lZJ_)ZesBo2F1w${2(aDq0$n?56NPb zKWhO2k?{Fb`WS%IsQi3T&BI$MbUXlBtR|-y$~elS|R?Hy|2LB61s_ zU-OS*d12sjH4ZU|yT*)y6k)M%XU5IhvXhpBENF;gH8PFmOB-$0!1jDTu-c zGrzcYI-cA4kkrbn?V1U(Kz#uxFQe$FHplo|Garzw_ft|2Ir19}iydL%XTebjDlXUSz$gX+ zW`a5=4#Lkk^nuQFgX1lH8bWS^7ESxSxyx-F-tc=trkbcI6(52C3rqaLf4Hq@lfbZ0C? zR+W^MpsbnC3#ARFS~rn)WM`XqMQ>7-pD1>AQO*PqgY_7AqQNNS;wnhgJgTvVLybT% z^cUkThsS}w^2VKOaF#G5IF&i#YFL6YY50I{Z=7ax)$+y!XxN;NOKJ-I!0rUD&ujM? zJiDFXp^1JTIO*$)rPChV7or|e5vE38Wk3zVI;CY_E|@tQ@__h_ayOq5E$=z^WR*?p z2Z|ZE!Dt*7$5P)05H97yD?QD$VybWY3`7SaCJ@VliTPvV=d7os5BS*WIw3w{7riW? zacZG6b2e(IY-)L-f$N=CoyZ*?c^icpPz;<>JElIRH1dr0C80!KVom&Mvu1|aPR2|v z+?PpFBr0Zvd%s}AiL7BTo&u-Wg9r3QN09CXThWiUSQ79-Z=BEMcrK8MD#|5Ft)YQP z6!uQv?i7}zd@8@B)>KR+o!VgEWsNY=JkoC-ZOQXu=DR=T!^`>ZWUi!UOSc2h!-s4P zQrvVM_5CO~bj!ucb#7~SrNfa0c4}lbb~E**N@uB=>6$B?tW@s<K>B{ z_Ugmg0T^UH#uwPa_yX1(j{MCM;+#U2;a$uaiJCHTy)`QY&WP_l_Vk}s7v*$-kP7!$ zXP#|O+9sp7F(BMLD8`1RqcgNr4<4F_P33c#awCjhUaq}I;XsAXX!K+E@L(@alcF)g z!NyufE8p$}4@9DVN#3$rt?ebXS3 zU{rE@5Z``Wn;Lkqqw_IdbvV*!#r>eR4nLfHTl|=ra_?TS4e?m7Zpd}5aSA(BO^9p& zZSOYJWe4uE8({b)5JQY~l7lPjS3XocQ?zEO^n%pQ{ug>uvF`mRRE`t%Q1-utJ)kZq zr2)C9WJ>6b{v&sSgGWtbB=d?lTd9XKk*csqjhbN&oiIcWn^E=lFZ3ODg`gjG_>EuM z4G`fBO?MRjN003Ags$;wD#u;{p1VnS?&B3XAxGnSqp9owUi9WsP~g{%?s7U#5Gq)m zGHg}`l^U`m+XZvrw+_Tn0GXi~1A`Z2lPTJP0tF-MG(7jVGAfA89gh&8R^KTjR|y$f z18F+Q98dD{q>h-6lds08h7alA3m^g6MPOXrGSz;bp;~q&IdAO0&(8U`sGNZ06Q3j2 zC9){eb?bc*H*zTC>?%+{aCANoH5V^DWnc;1q@*`yQdh!?gUBz<%%kV-)Cc+B4KKc} z1%xQ49-lwo-Z!pGbds!w5$9!wiH>01y7v-^%OAAs=Hy95I!E@gA)o91B5vr|7-lP) zTGNw@7vM}gfLz6c-{tbj zHr|al`ianC2;y@3X*PR092Qd(OI7UHfa+c&pCuvoJEBP`d{ROzYMUd zw>-t*?MjMANJ}u}*NxUBO6Uv$n(Y35`h@aC;Sdb2b-k`V&<6+&D+<>#)i*}xd=Xdx zqO{$E`&||Z4X2l1(ce9NqDxwDd}#A?67;B@8Oq)PdxA?SIpct^U%o?*uCrC!sOP_q{3*MAoX8y3vNJyT$h#k;fRb#5Jv!9I z_W=TGm?00HMlThnNJB#(fe};+;ap)ZrAFjDF3#7V50eHDAXI{Rn;q$z;#L_T zlr+p$PMdp|X+cZ~y;`w|f%)_EFBah#b%o%6lF=q~N$yt(6^cuLahXdIhJFkf27$(@ zq#R?#lbKu0T$ZF@N6T}|@@X7;lFE)C-~*_hDOFQ?obbyzS8i%2#y~PAP@nQM_@tRk zOe#zkF&Jj~MlLo3^p-5&+g(g7ZWA{X5}QyXooTRdb+NDqKt|+t4->cGy-afIM~*yg z2`HR$29C5O{=ndFA;}FhgE5mU-^z}xs_Z+hrE!e3h~8}#pV*|k_gk1q`$Z5Dx#?cU z=a$%#CUG%jgw(#f0olw^gWM%ZL(YaBAvGak8zp~>i(q6%H&`kd1LJXYQzPk^{LwEj zWF3*OifnL**y3@k;;;_!0spUoFuYv5qtw zV;DVV<$S-WrIHiNo(($|Z#;0>0f>nDBu^Zp8dRhRB4yBk0$Q4w*gY0VJa=CnIa>Q;@5t-i~f7ML4D zL<&`JhnPH6;hF*{vrTAAqHJ-ln)Hx(#Eci5T-vzUF(ExhmvH=+_Wc@z5g6U+cJZiO zwnErS3tXug%i^+G1nKH@yG2w8Q7yukI=T(tE1L;-Aw%pbw?JgISp-0gy|S$<93n=V zjvI|y3S5+tx7j>a@eF%XU4?Uq^N7F=feUY|o3g^L(g$+X)B1k!K+pb{>Ebdg@eYYV z9q@#%G@#wO9YK{C1LolBC+a&7%ZaaJGGI~*g$z9)l*y%-OQ&kcI$_`8qesv$seIrT z&l1S;!I|!hAJE5rb0Jj|+?iD6JSioZXD!G*Thja=ukp;iKidBhiV1-NWzBtaPv*6R zVJ`Co)0fu}l>o)pXIfu3%YXNV;nf zeSu&pf=A4ep(=UPFHXG(ifQb+B{gq+u56TDVQYza72;@(iN1z@Brq>or)odk5Q8+JorcjYfs=E4{21epzJ6ROXbHEc<^=EDJ& z*+T;0pWf^pP^C*KVCLrLW{`u@VSlKSYA+D>{jPTo%LuQeHlZidD~CD)wMIMv5V#tX zTH!+wG&NYahN}$=!J(--+))6fbBV0Oys#*7V>iHr!C*ip)%n7MLHvjd6na7KZ}d>M zk@kut6Aikwsn23cW4NotP{q1&bTPyZ1{+2n0o65@yaDGrq%z{$xS^X?EgfpHXvH>ioH?%|HNZPxIhSFX7U+`2LZLUOU7B)P zCfxQhE`gI&tJ3A0)TjY#<_;CBt}kx{fhplrpXy~-E|qx+q=V?TTp}t!BO(>l|kq$Z#T%L1{|)? zq!ho-e)ahh0Sd(d=GIfNn6sdrt>cE&%?ycCV62!6)(@L|MksFh{0^uS~MCa<2VK%h(4@3dR>@q62ou z(n?_)@g*IT8WB(>SNC$7$zScbN>rQFwS-zKE$VB_uwjkjprX@;=ckGXY%2_m6-mY7 zn3f|OaS4100kK5zjSaPJtTO%>CITu0<*5T0+U+aQlwU)LnM46$Jh-;47z=9Dq266{ zP7yD0dnAB#Dlb2I?t!6l2_aTk>L-vjDnV_#SG>E9HfmeBtvXh-1v|NpBFG&D%LPO4 ztY%koL)-87O~H>7HlfmzNF{KK3*(7APdh5a7`~;@po_1sTbX?r)PX<9d8nJI%`>8p z!CMHgL`olbznWr!@UBDG3vS6VBE*gp6@k>OROsKYeNGF ztELr-GBSv^nT?YLV$QEqiK5IOQaIvo_IIY$Oh1@PJA|*gM<7-<_4wXMc_LtoW}zWi9)Uon5m> z=@Mf~aIVSUOx0)L4Qy46bEkw{(lQ3TgSNGFcC4-RUc5$+(RBS}@7;S{)xcacxh`*7 z<_zRUe2FI2)7O}Ng|e;uP)LU3csYkC=g>Y9kqyD~=!Kw+O0jeJ?%n=L(F6HX7DtC~ z-@e+0!iv|jiD8_$C=@+dSc4H%At+8kTJ%2EC7`lqAR!xuVID8$z!=i+`%3lhN1x#N zob1>-+04N|r{Y1C;o`~HUumKX)Gg4KNKi79T)OdJ!`vKBX{K}gpBDiMfi4{{DDaL> z8NSVbwV_|-YR3gv@$W)ILvh6S)f|Y#c3~8f7~{*WCtvqt?M65ft0}Nih50|*F)`<| zT>|q}LEJoNL^;eDa$N`rs*`14SSrKki3vsum8ULNiH{{}j7UZT!@8?#2kc{BV~K;O z@r1|-N3P~KtVu<1ba-TtxNJv57zTs4P{Ja94^SM8t;J@D7CE7-I3Pe59zgoA>mmI` z)4 zYC-AQPO}~pzlWrd8n-z6wONdNzqU@ecjyg^J+9Ds33OQ&uAyDWwNlM+>on6G$U{9p z?x4cT4B04=s#WaFk!6YBleigLpA@R!{XxVWO2RAvD3X^@q+F2V8zQ1x;8nTd=nL=E zF*(YyWScbM@e~5k&p%jPdf7(aR=RczE$@6Nu%B(deV_5OG)x`;>6Pz<7}0Z zGwtDLp-n|uT_*lQ8Ag|tu$YAWA<_~7khZ7tl!%?qXZ3p>qT_AJlWJc!-hvz~qe_bt z1V&S(M&o0Lk9&Rph$3-Hb}r2U8EsdnnZeNV!Z&AmPB4%_B<`90sZ;Pvs*h%_eMg=o zX@z~p38W+2qe?pDndQ-WE{)|@jMk{EsXsCto{urNy{#b$j;7W-nK)df0a+MSGmfC1 z`JU^M=3jwGef-)&uo_5{=6ZTDFPZtSv=!K;&skmzE;wcn#$m3+l~eAtJf~Xg`-lFN zZW-N%Bal5xy@NVDDn%Cy2Swd(TOWk&BLz5}3N=ko#(~a5 zeBOZ(5_SUD3g7H|gbxKldtFT?=HVnPDjOD?NHkWVi2f2MGzg*r21WR0_`2+2pH}^d zN~FUMosLh*iRiE12}n-HkfH|d`6Rz478F=>>`x` z<=a?E1waFwK+G2`*>p=RI&$web6=-0QjLa@S1(jV#iW?C-x@U&dWwygi|PdY^rn6H zSjj%c*AuP^RNg4W2idHndOliSfx~+Qww-0y+#Iq{Dh=W&&|yTH3<8}J0~6AS`w2rQ zsAQtA8-gWUTYG=sdHdmb|HnO+EVc(v*n<T@+(Vq$`6Cq^s`x_}YN#j2cuL zx9+GcVj@CSWRVvhK=8WjTnYFL?pUwHBvN-I<=m1W)PLaD2=*AA)_xVcOp+tN=0;K&FHAUGa1oI-LX zmPePOE$|V=hfQLki{%X=2A%uR6#+pJs;FoT!I0L#tX1C%?F021rzW6JnYSl6C@?K$ zxp6~@f{Y3U`clRXu(~d}Tvg8KkCr29m}G0ZVZ0ZQdJN3Hla$qrO?&4ZS0EddX0!ac z9L_Jl84y!^r*{5U0Z&p=2C%bw4jc1&{Qh{}`d$9p58@{Eo6Sik5DVGLI&1${pO35a zOyTvlC}D+C9;&QQd6231o+vWoGa;sdDnYjCqv{-S45_PH52p7Q5U)q1xlL|)+cY1S zGu`r=22M0HXbPgcc>|Q>1}0$}`Y@eW=LgN=z#T=sSpW#9^7Q{Y0I7oOHK8GQJQ}13 zMF(N=r9lXJb201^e45WTnr=@f$p~jeU7Dr@Ns15*>biR^xh+u${6Yy=3 zaNf*NT*2ldQ;dDwNJS>Rp;F1$NWBt$NNX(dIxHCUvVtK;wjNc3A0Q%>V*A#t(T0Mu zV}TrvfN)Rz$|YDYW`5p+>-7=iCtD!_i#?AMy-MOq=42h8NgChFa0bi(+XD`qvrhS9 z3SJI_l1>!ZLQ^$F*Xzcc2C4{3NsCo)(vrrpRbGZrJ_?BwCV*8NT-du5F#ZIR%y}X(!Cd?1uGatyEqo z9%t!e;UXDUZMe>rlg-wI6|~b#oz$BI@GSud>>QlDJ*DX1>H9a^$9pF~9eOJudfvg| z$?L-p2fGl?Obia~UAOzbp-b0t z>MM@Jl>nRRCB@xjF`=RzLnFk%Z{VnPoJiA=gfn2f^z%Yeisa03PixMw@=xj1bc9n` zXFv6;cYRrVV?ubU`q&l@0veGJ(lp_rWcqMwZks~%P$Fe3F^hAOVkRnJmYZeF;^=By zP0rc!O#qG6RKh4h*!w4ZNl8~S;IhT4Re)j5sA_ON*@(95_H=y2-OeTQCJwdG>z1I+ z@7YA7$j5Y>n=kjcms>dpUaYLWsxIp3t7=+bOyA)I^I=>+soe07-JG>O)Y^d5M;=E*fOQlT* z2oM(8a_8A>$sh`$C-w|CAT{7z&x0qSA!u4!^XPmI(0>vRam8c{<7`ktonZ}_Za4AV zTE+f?3Hm`9K_>u$U_C_^Mu4cOk`yYUM`ns8kt-WPEl)N!7Q~muLm|5q-(o;?zeuoF z^L1Q2-nT0w`ju;oIK%c(QCqo6sN&Qi3s0S1qR3(O~N=V2N zW`u{A>)fc6qm&Xnb9tVxmTmwsFO;95pk0Us5qKnoEre~-0YffIS%_ElcnsBev>*W@ z{gy39MefUJ-ghr^SzQq*88TNcF0qOqku(74!;QhH^qI#n7Osoj(~mU~wD|F~k{Adl zXiMX>@_c8@=fy+Z&M0Io$yc(Jeg2`P`r@L1jqGAyiy%X4yY7~)Nn_0B$0J~@SJd9e zpmbH((VsPWy;$FZJr#jb@#=uDqa1r0Ioxg->NMP{!K%gF=JuUa5q_9YCjcwuqgkm# z4e>>C^#*Ntp{1n7G((%|p{f3L1_w$D3L5Y5hchN~Q=hpnbt2z+Xg_XsKxVc+ZlALI z<6qq z6xNMtf>Ys6Ze22;SR>M5rzm~)WH)i5CHCw=vHl zvAQd;#4{H2b678w^?1M%on%fMm2X9yp(0q-q*8FLO2S}yla`pfjMoI)zhEk&Fkq1W z&9uA%rnL!*1yuKi3pvWPGLONRr@F2nv*b3#ISmZHjCpOkOA67+FY@5j?R_+iZmlg8 z=Ht>ln(gT+MMYqwMS%ilQl2ZYBSko46XdLidO%14oi@Q2sK6CrnRW&<(&Pxv)Jobc z)?Wt8Zdh!hOOpnz;Zb9B`je~K@vIzG7Lr64^#fA@)`BhrUs51Ye!PSX zle$wkGISj<3-`MBiJ6gF8MuCSws+p_y*u13dSx74p4_XY|R1z11ARKCeH z$uBl#{iMww(F0AEu;Oy9EBij@RFjdFxOo6MN$G=P^jsWVQRvwhJshif_$AX1YI?RTVa0D-y2p&(O= z2eC!|Y<{5hY$=t8Calp}m8su_jrEq#ANFx$r`4z3xAH8hJbvqQ)Y5pAItY*e|B-qB zhtFi9j-!Lfcj^d|Es_Rf=z)U;huuafX51oRS^~EKyw4Ie_wVS9L@;20N zj^VX^O>80dV`)jhW@(-?^jC6PND#BTW*$G~We;?eeiXp=@jg=JPMmb?vATz=@;0V* zf|mL%Yhs`Ag7>R%9jZKJF4D93*B_wQ|yYV<{Q;#w=V5c*sL&*6wn{>S(5=e=mi*q=nUh z>s(we%Dsngxj6_D{ijFH7MnvJW3>=Y_;87CT9Gf8-`nb$vH$tW#xHR`yEeR4#FxH^ zXCTa4(lddBa0|^U(5fevFhfgP8vUG_6G{aO3&eoIGOS6&SF*s612qZ*s~V4Kq~~Dp z&VkmEa;C$wxIQBQ4Tw=SljtTiOaxN%<)r#nUf%;aTFQX(r2cEl<6Y|WAy7M3E7??` z$56*;xxDf&5xmD4!2adV^278NG_P+h8EX&qqu8B8f>12R@hn^}Vu%5B|$}OmY{PlYO zVE_0HrJVTaHuwFyGV8-HEum&2ZcVfbeenlW$kf?9em*@ zQx|E_TEFt3{gzD4GO{$V$ef2q% zwLmVS7*nkEuSE3 zlv65cS3;)aq^)#0dT~z@q@+@h;6rhWqurQKHa4EGZ#-MyeD*CbPX-QM%+ zrrO4ZfPoDfmp)yAcviFPkHAp9=%5u^g>pf3`-N!oe4SwTsTI8X6m9_sTQ?CtHI9{=NDr{524k(l!Zng*qMr3V5vgVmJD(vb9WP2rE=X>ZQk z1@_xb%lc;jVb6WokEer756{0InKth)?h(M>yzhhfZSVPo$hPAYTb&y!nq%;Jma(^w$Zb+Re+qfD{m}dyuhN{xi z8g$BQ&?YTNUo^77liI#`&De7yp+8(z#u33*sURAn?JvhY* z7Y?j1nNl_BQ-FHP?P|W;q6mfBzaiF+tF5HCI{cW5mByu6L<|`zW6W!hnG5~Eyth4g zJ_zH5>_y(8i}_hHzoJcP-LW(u%Ti(ZQH55EWJ&7`^-(kU7=0+qO)a|Xxe8@CDYi3w(PpAyZ+6}l_a4mY%bC`}$(KeH%V7&pmHXetv0Q;)G z-w^{D-C89lNU*A6p%VMsi+4^#GeDA-y#mq>dI7DKCG4i28VL=4dEvMjQnvAisSeDZ{NOtyZ!yCGSivN!ptqdZ)NUzk%&RO z@%w5KC}iLce}CcA(Z0BA_f~f8!B+9VyZUykS3FA80_={Y^j!p62q=+Wyd5-Lb)HgA zS<6LY@Oo4ORxqqHf%Y*Lu?6dljypY6xNLB-$&$leNxWuL;`@Ty?ql*deyl1&92xYy zwByAjW5iggi@BCWG*$Dn8C>Pc14kbkI#im#`cGoWyd`Tp{p*A?tE? z7MtAn6P4lW@PNycB&)udT&D?CzA-XCi5-pI=M-_mCtGUi3SE^E=?HOA- z$pXOaK)ekPCMM9pGU-L}YPs-I1Wn%wr7in{DvwTlY{LtQR~bc@HS7~8 zAgCiyB~7);U1m0B@dd0(<7(6ZNGu?h5J$8sC_LQ{LRAOac0z>Q%`DPqle zFTJ?mor-xxEFZ!C&Q&<_uzOQ686E3T%&;M6YEr8j*dZD6Y8cQc-Hq6<-B~{O=+R6Q zID5a6vdaD_!-y6VEfQwS*MPG|zNxK|dCEXAfN1BpjkcjAV8S{ruMd(#(++6n6^p>G zUiX5WjljwoKIBtbPjCl-paX%X?l+6b;>VJcBRejjrVuOYKwp;?3WDy-><~g$%9x#_ z^J#QhPn31eEha<|5Ty`REg3Lwo-zDbY@CQZr{KkPGv@R}wpIxKjb*rlcD0}E*uh>A zJ!4pRoH7S`8=oPaps0s#02i0pa*gp&=yD=7RG57FshNC2&(L+_DR9~ScUE~e#QTpg zo2%;anL9lnmu~-xzVlzMKjy2m=&Sp(G_uo!`Yx!D0K{Y7y$1O%<5^hqUdxt1DY=!d zi(Sc#2rj`9g&;L0sy9m0Fy)d|tQW#!hth=50u?622^8E&Fps#3hQKL|D9pk8$~tE+S>bI}LbbJ3t%YDL+k9z$8ijS`pnd9$2y=-`U;8z7je zqX0JSyhboBhGt?uDUy_}x`)RNMXGL)nk=l|c1}2TQa`$TGYH39!8<%!R5iEhwp0mJ%?*mlP)8UPx-0K&3r~6k8&WzD^8jIBYOx zn3x!3C9+V1h{#|ys{Z6~_wd_j>-bmDlng4M0=0wbrI3HDRMypw(y`ey?}TDqM81M+ z$JnnQ>q)~jq;oiE*1d5KDK$~XJ1QNRM9{@Led?A6^&+2ILm)|BPN-N2;_=gY>n{G$ z{nsF1+@I(Q?X30nSeeVEJYy{xZ%=C4;HVwZz;QFQS%k_pELxcx_9u zf%sB0i#ge?=;CQ`zkyDow`tYg{QT%nzWcqe#sLSfvi;E3eD_1z4)x>xVjf@`QQ3f2 z0C6Yxp+ZJJ!47=tG}9WvfUh703f`;5mOUO42zd3bpMUX0jN5z(-vP%kN>E(9GVTau zV}TaURy))vw$D`<5N%_ZMtF|a7v@-K{A8wC^u2Hm^#hUgpUx!d!6ILO+5SeH1@7E= zLYypqnZ#}MdgQ$1r}T?QMc9bO5AI1vEKbNuy3<#Gdw&vz1!$+j)KCP#bwEVg`@I89 zsXaV+`;Xu4hwrwJPdu$qKlMEva-0AOfPNF2&zby!Pm=6gvFc;rz(qrvGtI)OJK_Wf z_qHj6n%Y?n6;uvd7nJQThnO{sPZfiKs|0rj*`qf_xP6_qi6k!E7`NgS?0Qs#W=>D) zxgF$}YF~GU*M@c51_5IVpccr7G?L@iEwc-!QqL0_6AzW_s)jD({2-Jeo#4dWP#0#a zf{?}~clG&wxwwQ^d4x3r5*Zhs!QtcG!Zl4k;+2mJH)`kB^;>jw`48VG>h^=M<)6bI zJ$mv>2kcXaFuZ>NQ@rR;qYpQ}aAa3@>K6&NuI~EgFUs2Sn;-x19%zM=Nqch9dU#3y zyJ>dpK_HN>oZH>oC@p1w>p1Y6Z}05v9Uq_W{eA!V zRDDz_LlE1FCe+xjrc^^eB^Q@cSYGJ&a;M{HvK&k1tGOyFU1rm#5y%yne#ezZ6d3OeW@&A+1vnOK%T!mrOP1&$i>OXfek^C<$Ba!QAQ4S z1bsxlGvG+R$`rIlP7VY@6Ic)&NEa2tQO~J_#W^;0(=3YxIWx4crP9r{&~{67*A$Vn zV^T9~l@3@96@{B1H$?M<3G=4T6fM?Lu+wqj{lut<3s-YgY9q1&#uqAk+;JP0O^5w4SpQI z3*3q?L8vyIQ>!XRJcy>9dt1^(K%;K1c$r*qD?d7PmhbYkyoxpInZ_ScxBK6v-4Ndq zM5VeCX6fguy247r?i*y};x_#S9?#d~$E@=;#nzU6*WzwBy)3$Jx(!1{eWZ4DjMk$L z|6wK~OPdQnS@f8h_>c%W9~6~5OG-~ideKi%uaxSbzik${xZuL?Tu($k(0yNTK2fihUiLETX`JR4ef@IFwW2I} z)NXW1q^ZG0Wb@f{pheh zV6+!>US`s&s0(!B3UUrlYi4|blNCaumDh6R;rUY_>;URf`UUBU|({a$^DCHmK3N@}w;lOh)KN__=SlO_g+qVw6 zSHk8HG6U4y32so%! z^8WCry`$sp*G~BSxOar-FF-GyI=8rCMUx4Ry2mBt1r~}wH~9S_HAV?sp`(gC40VS5A}1`QGks6;irhJSP8iS(>}R81ih35H23xX>7A_>8LJ zf-!Vm&c|&bjDeWLtWlu#%L zHM?vjYz1Z7jW6Y8a%La}2kMnEJW#7(1V>h1S|LChNZYo$I4_rzg@=EoTO~Zl{=56K z^lUXlNQaciPI($WAM7LW_Oi|Ah_Q(#l7Wds7D84pxnK-6t{}LIbOf|#-H-~M^T}nF z4im+=FAOSIWBOP@buyixauVaSYie7wkW2Qayelv2(a*mO>7FOD}KYBwZCZ#tz%3(0zK)1A-ZyXa2@`H+e%RM{e;XsW_*@|s!^{e! z?XLj8m{ekQPy6QXPb0LjzxChUt>`qEm1A^Wf$yG8bIeGv-J@HcyIUZfi^vez4K!Zh zQ9ypV0Rff5^0y+=9%)apCp758@PfR1Ny&q=t;u9t_#W)iSyg_F30!G>2Y6~#rL7qG z?{2F*n@nk~nO`@^JT-J6ILP$Y@{H&1tc5m|VizIFs#|$*@odm;>evPk(y0^lBW0kac(n`Am7ESLL`8uf_zu za^M7{A!AfJ^kfh!!ZJoYfF?J?mpi-G7it>v;*qxFH8Iys0D4_p#x9y)XqyEqO(iYN zNXfOAS^10JPS22!mzl~_+-IDvq}#%nqs^iqLAPFrh}q~W1Y2iPe#5#f@I37{J-^nIeT=ErM3pis z5jCH&A6U0xDP2Bv9{e%%jnr>h=xPoLBUF?G80U4&rjZrlE9lnN1;|f?y%agfNwu07hag zQNcVGN@ZBarY5wbQ^=5NW~@2(PBdg{>cPzC09tt~7&@RT2f7k`q_kYkA9>N98mclX_s zNpR-vHL25Lnt(7#6sqmBX1;LR>>M^Kz+G59FnbMYZW2Dk zY(?BOUY`U@kj(6X+cRC5Dl&`_X#kZyWUpGnD`hl{Cf37K%_|H{&JIlCbm3v4`Ro_M z$h4qYkC4H|SLre$e~pu!u}KNK8tx`Dg6L^z7Cs3GK44NjT8BDh#=OF`Uj*bt`+Md?Ivf6v1H`h_CMDPpThGtyAPlTo}31!IUK zbcgu|%pz#o)8*6|{Uas`^A|xUzTSK?h^$8VhIJP4P{N^njmi@0b!$OZ=P?>^yiUDD z$VR8S;6HYidSGk!%lSnd#qs#&pFOMFDu|stsRLo>7MbEmtf;5!C+&k)hYgP;=eR(BC0V$W*uCC-U^sMX4wx@z3^TW(~jmz z^&psT2!;Lt7-Oe;xPL%VSOM`AzizY_Z~||y@Xh~bm#SjoC}&pO2Z@&stu1SsOJM5k z#t*QJ-gPto$m!LVD3CEzVO2Ifn^Gkq^1#=RvzgFu*NlU3s zZbF6VQFQ`+CbVsZP3?uNx3-Mg+*wY`Z}qJ$*5XfrAm{i$<2qvOr`aMvbg$>uLa|=t z@9965&)(9l4Ne7>N{ms`ZKvD|6z;+zSvJ#(8v?)NSY8>Qp zIZa%Unp?@fS9Ul@A}Pr7zb4*SayJXRgi_H+f9PpE-5A>APo{P++4Rw<>(axJW)Ymj zu;vVrO{ryYys{SZIZO>XWIVq*lZnSFociDdX<3KKZE#R4?vc~r!Gi>B@~g`6NBM2K zwUs&XRaE4*dwPApcwF3hvxnOfOeNlySq`m17>nS+3!_$2PBY**%nsR?NIV&WRkdu* z@pl(&cY28VQ!XNr-om!y;oHHem?ceY(W;9!87#n%dn`Y2?z+dqeL`HdcEFt4(pzph zBX#*5c_NmN9tDuINFlUPCmb#`j^mn;89j0%9t$(%sZPja{~(>q!Ny>75a$APfU(pL zfAlE8yZI|_(OEh)WpMkLYtG!F{^&o**2vyJ+&gkh@6F-S34$)er#wy^Xi6?3%h4%} zSThfcj?AmDntVMu~Phn;#u7|B5) z2c?D6mN5DdMxt3VqP}bBD?ORKN&;<#T`m(aU0bPu?Is)`$22mo>FHQbRV_YYk{G(Q zQ26QGyvd@G`C>2aa#}JOi02UonlM}bb0O&9XkbwBq`5)gf5>qf6}TlM2!r-vGm;JD z6wdSI9Idg-(rE^Q27^i-?lJGHxtsbnJj3IK!^JTnp3`8pPHG~4#b7pvwx!2+9MeD? z2psb9!-K;Uw?B5??Cl0VC#0rYvrT=QHNP_kH}2r$Y61VY-X8_7DC=4q6ziIng8nr1 zvqZItBl+sjc$UV&5w+%7jXS86QFpUsZm_nepPG+`K|3gRzWeI*!@X~v`l8b_p2*9xFk*=FxB=#N5P%>I;rtIx;PxtisBuReUgR)k(YuFw9) zokSK^+u3WB-~R@I{PVbyfUj}LVhSffIIt*j&NFE-g%cLgvsm{5(gWRVUHhDUUV-t2TM3Fy;cZzNa*G@BU+YM;!1hSL3^VCXN8z@A6+v&O z+;k_sFRR_%m!JXC>bi<^d-v$Qt-t)&#$SAD=a&ybkifZojs>` z?f|+{*&7GNeTWc!!pfRVsLeRGuiB7C8-MgsemQGSrw!78gQ6QAujM3B0*c(_8mAl# zCIK7-yt7U{A^-C9tp?FWt)OQOidSKPSm9q%)!M@BFiwQ+sxS!=wZ_cJ=5(sxSy=9s zbrOgzjS&~B5P*@OF9o9W)An1^&jqDi@kxXbDA#dl9O0AhDkOO7dnzu^?ubNrP8Gx; zFz^t~6@V^8&B%etIu(47ltE}jg=`J{B1y>$G7Gx6o&pE~^lbMG-lXSiU*fI{&;&}biGLwA5PeP=_MnS3 zquMj-=>jov^}tFA43CH=3G}n6QP2+G?Vp^w<+Dc73fkc zGO8GvKVmq05PVY^*8dF1+yKhq!+cQ!dj`3$U)R$y_S6R-e?o!)9AYBArMFyJ6HDbL zy>3_sx7<|$6^>g?2rr31s{ywXGL%%UJI0kh35>!*J z+D8pOec~GY8a0ilU&Et)Q{HeiVBwYn;TS){m-fLO*URGuV-dk9rNpdm4Cq{RBL}zh zyYmBy+sIIq_@-WWRU?pm`o*%8GXO(dIjvh*Kj0z*D^RF^;dEtK~rS}hZjxPg<_U zi+OeymxfchPbW$)i}r&zaD%+f)Y@%OSb}W8efl3yG}o-M36Z!1a2PcmS1PJX8^wQo z6OgJBLT5SE0!&VgC50FEas^Jdw(;)1QviOSQU|$zy*{S$ihY8z0eL;BnKt)I?AT=s zANqhaB2=!Oz>x!F*_Xsn^%iuQ&g8!m4L(Ubqs}8)L)807O~Ml0c)=-OA;^+_sljI^ z%$E)DTo6(Pa=}CpPR=M8&@}7M&hM+mGq}?3ymaFb=hvqAI} zt+R{#aX#P59if?3qS#NjNQVFM9~8l6zB&HF9TxxbwP}cRCFP~SnxG|sgA_EsCj91j zKJuWfexd((l6j$9Z~8`+*n-PmLfopw9-J&22*P?TN?h_ZLC>kdNiIC9iEROSrT6><%y{>}FKD zY%Rc(YD>9b&u>vBrLunQpvhlqECsJI>YbmVc}j>`Es zCAjrK6xhO&&Scsnk^pVe4}q!CHm`uLw#pb}?6M>#T3@D&Ztw7w7c2CM1go)tds89L$yA ztjMh)6(s^+3yy@_uhfui+VeS5j1q^N6^BvHFKDpGx(c<&p##)2;<{TroXTO}FG>r9 z0-z0u4UKDjxtn>G% zS{KyA9)~0OGko*iAc)aV?`35Dp-=>!X$=Gg*hy}-`%~d5FTU_;+T3ZL2>WIuG<~@B;O0nt}+PT z(lqde0@;@g!0f9oXaxi%GV&Dv&!u?{g6bI!H$umMhlz{W7uR!&nNLlGBhK(eH( z*(*NKhp0YlbrU(7(eD7EMo34U)R>KW+;FWgXywXOUdN%3#&D*nju|@^c~L!_iR^zs z^MqecS#~o(GMLAnzhwq=IJuc*(}8B~yDk5^R(bai4o@8IfI&#E`Tr(sHn1k7=bLd_ zQ3+9^pUJ0qe6oE)ScG4I6qq)r#uNNWhUUx)PZD05WEpyS8J_g~E@@M>6TLbrz=m5fKWBHV5i6cgE)!v6O=?JmVr1vd-p=1nVd#(loGNpB z=V^|@@^*=^$mt%hs*74u#A5ZGw`Jfxm1EhI5@bu@KK22^i^tP))?PM?UjM$$fdmbK zi{B8B-A5|Q!&j$q36iv|VH>PceMM|}k|f`1-o3UZ1=rYzI@kP@b_PBS_b8|Jc-@`3 zl-%XW?T2V7T<~+uyhN%OA==BDF*uCioIf$(nt#Tg36D=9M@~b=!Ld!Yi7^4IMSKKy z`9$(T<*lSFeC}IMSW9Q6mjip#aXct}EqToAMtD8kY<{YnC7bJEc{fB#xP#^t;C7x) zmV$4>&kuOBf-t~rU{i*5aPPt4(K~n2!1CeFagXHjlN;`sF|Nl;C~gY!o1WDoly?$f zQdYgQm4j?zhw?JJd_w8@fY(4rp0=ADStNl-$fN?m%^!~UFbL!qfsbo{m|{)nAhf;V zfo8EF5&5#(Pf&*GTsXZo@w&i??Uxx7WCkmXLLGV9%p7=!313JR>0zp#xOY$|!5jVV z=Tv`p2LWQ_WU|cZPU{JAEm?4ik4a^^7W4{mHu~6yGi0L;{HY;jNpD6t@ih-TCdj~R zILrGr(rpzLo#6 ztmZeW_(A1q<~tX0Ft#QQIs4r{*gb27^6%lpv^XCk0XWo#a4k=4U-U3wQ!UNk(^)` z7t}ioGW~dy8aW>l`AX+H<&1WVBZk6%cLmj=xd@qfx6r9iZ!ael6&ELCMHWL3RBY6c%K5lKG{BGD5@>&2u zvj%G!F)KbZnIFZKJm*-`Af7>uXG1a}818%~ho8#0C>J@tvB*lpQ65)ExI@76Lg`i>~$;;nKfEy%T{uDV$%wvIPWlhK% zKBM39?8cXDsu%sF^*}&I6m^*{EN=AlHP4j-v|43wChz2y4Tufm8OXIOf|-fSl14Gl zkB*K+I{@RxNu;@8t~t8(j_Jp!DwM!%NmN@JFJpBbMN`lG8zu^Ce5!<_W!efTg;y3N z;2CN>&5ZDZHRwfD{B`JTL$cl6<5cAi8#>cT((thd-(wIO#~4FF(`H(&)0kQW8w~Um zMyd^5OmoO6RESPNJaNQ~4^RHAtW!k1%p`B0r6Ml-ud2`0Xvt1vOnC9;olnBaYD6G% z-8r>?{+_@9oyOeVih%st^LR~4O-84!ts7UjKZRvSbEcuV*JSNxOKI?+dKZ;QWn{(C z^n#yO6raP+U;}xet35HuCHa%Df(JjV70ieWEnLZ@T=Hq8VH>a8YK|ePv)Jv;7h=J|BcMPe*mFv%YvxcKoA%6av=|?U_A4HX`+DJ6z zAP82#ZDl0d?%vzIlfBfRnbg||%}LFpfwWNa0L_l&*CEjjLa@w;OjlhtVV2Gr$h7F+@p5+6SibHK=EXB-fYZ^O=nv%ovCe zD-m^S5wG02QDe$s21BuKhU`1Ut;RzXuq#VHw1Y%7!Fg+%O%9S1L5_Zv3>i%#!_0V2 zW~yxr44H)Lf->cV%iCt}dzlE0Kr)|^m~LhchyzJ5V`!nXVHp{aHIr6zXDlxyjCDg8 zg}Pckn7t`Z0e*c6KVs`UxCndx>h+gX z09F~T`X1dFJ7790cw304)XoY$nS$Z>yNs)l7}5o^tr*!x7-(Wlz^loBumULN2jH(o z@_xm)9Z0f2!60zYJPIPix!4z{9MaI?6&8_b;wCb7AKEHbdVzqbObThmyG~B2HCu|F z>u+#PSyVxkJKR?2BtQ(rB4~?fT+d&&`!(?h0?Qia8PWz|2Loxzp{<{o2bbm1WxuHH>?QRp%q!>SG)nouU_+BMU3o(wqi;! zv-F*~tS6C(s*tDb;lpmLpzwW#W6mu@=-zsBzK-SIM4yy)MshJ%_DPRHS)sZJzhI6* z?C|_z7JVJ)D}bR)IQ5y%{|6#dWc?z*8%k~TBdf*GZR6$Dl?4HJu=8#xGw%;X&5QR% zHOe!KW{vuS|FHY^{y#+?d0(1B)=|n6!UPNudzNyP(i~9%sN2!9Z5d>-@H~&<&gu1i zs1@~o<>qv^QI)YQ5$+F6lu3Isoz*XUKk_Qd2A4_gxv5&kka-IkE?WN0yjRzNRgg9+%<-t@&DU$XDxdH0YcKJyxhV~k))5ZKc)*N!VC|I|$i0J*dw(#}qI{UWX z?R>Y@-moivwhc$+sjJz6+bfKpZkA_bb{rB-{L%u|G{kKUW zQL2>#1ZE7=31SGreNh-;Ab0&AAAojNYc7@h(|fH}6||Q3K8Bm`@ZQ1`7QMc|{SL3c zPehLaQ{uaK+wZAxaDX5YwO+{#+TY$?m9u;@{_FblyK;sWRT547w_4-)P=Ht;_j1Ee zCYSO)9~A?J zsJNdw$@Uu1fgmB<-(E^c$?fm&E2#QP&kO;Fcj2Y%7;dah69So6EmJYNAwhswse1*? z3c-SWxv=3~w;l|}+jQ~<$xyn7-a?h{XW)CsYgMmnjX)ozHYY z*XfyxS2>7}O?8`X*$HC5gfc<0|ony?j-?>8rp%I>8S1XISi=vuzh?2E2Fdj0Hoo$`?$bYYJHHb zIDGw@RS?}1NalzDPD*oO8n;4Y2lz@AmNS;Pi2j5nmJ$Afz*@}Zw1wZ@4eDVMVC`3(&&`cqzyWOz=FYQ>&t1?RTuJ8P%t#@3+C%^66zs<8@dT}{SGTiLR; z?zW(;DpjTSSe(UmlQe|;r7v)NE`PjD)!PqPeO^wyF$3wqRv_ zs>fBEv;xnXV}abH!i2ExQt=0=lF3{HaXVy0K&FVBf9P<21xP_=TaKCA+WY&-(Kb&t zZ4j(8iYuV{JgR`4L%;!O&%mIuT|US6zsWCl1qlbyPi0V0N@aC9$E}!U2m5OJF|34% z#fafc3i3%a8uDSx93))|gl>ScO&mZiqxiYlG0~vY>!FZCOvO-TQdAIxk=wK(5QdN? z>GoMUVd0MiKZ%+hQ0ZgGD4WzEMy)vfa3YSaw5L@4>RyE%mh_ zC^9dJ4jSJbMix6X1xST6!{;}WYU_5F3=6Dt+|+;vWYLk16@vDHS2gGWjD&N`+KEA7 z3aps*Pcsx#VN!1>QlT+mA$LVtMX~_8NAEP|rGIV~h^(*OhRF}6=O9+$k(cvk+AP~G zd_R07D>88KpTei~aFhI?-#EQ)G;d^78ZCAFt{fd6|9!n(+<>aIgkrkzC}@Iq^Z97H znDky_Bd?)3kXE+!aBVg~$xvcoTqg`$ribq}y>7&f; zffMrcnrla=3&}mCW!^IK;y979wY53m6}I(cAY%eAvh@^o+8oN6)WY{i+uu8N@GiPL z>XY5+`%I6l`YU*Vpm6u%hEzCQ$W;7O>bHuHD);|b&cO?Y%;&A9%j@OT%+{@{t!Ety zW16u;W7^$3LWjJw?SjSZ>3$bgV&1(Vdrn}PmDCAc;Lzrj-S_yhe$fF6Ba)bYKk1c-+%iy zZhG7tG~~4@9&8o=8?Sl&cKdr+e;osFZgG7{@5rPo+QO|Dljh8+Hj41VcsuhSa>;j8 zT|iP!>N7C7NTWa>7oHH9V^A7{jALkA8`A6Hf(TQWBJz zp8)oAvO?(OvW3^t7yz@30JqK_N0mIRB?3(t{{FD5*1#G~nl@Bi&)L7www_!3$JfUN zM8D_7XY`P9X;Z>C27U^3UEY`q@So0GTCj&l<_xn$OsebaXuRJ$z_e9_5#_$zao^^@ z(Iku9mjs|bJlJ`Ac)Zt@u>fOr$79a&(}WI2oaF&t-n}4D*HOrq4pd>D^*Wdgf^6DJ zSY_d{82K&#-QM-kzNXZvM4AU=_7^Q30=l<) z%evg+_P4$Oq_gz;nwe{K_g5c||3TY$F~8y9z;bpm2L~-WHK)xwW*K1-Gn2nGVBxar z-m*B_JKj6`QBt0u4V%6MO~4n!Vt+x!zaKht<_6Q4fc@$)-}G1}tuEB8Kc=ymAs z^*{MTcOM*5b`t%pzbtIZ5E*u{2TjMdI$rXbzcy?pe=T)_A<@ZN z9Wj%eu29ITP^dmF9!{rlSIld!2URbEWOI{OVOO^ly5PGrwJt)RIh^BWzuhSwVW#yi z#AG5=-zU-^EIck?F^_koE#3sH7Tqwhwwd zP=gOSZo(2VxNTD`!7%{L=4l zZ3VpwB(u9@^OvoyxIcK!mxsq-jlJ1E*nPWqP(TNxtL#2}`aqK!EZERXy zn`;H`F1&oaw2ra5Yp|{OP*9kpDT&CUI?o9LM11@d$Z1+{X4DUK`7>f#@Lt!3468F%lOTAGgP=UlmzB+bS|mf* z)3C4~yS~za7rm0>6h8Y2eCg^i`g-$;br3;Z7|bS)i`G*vMAsj1BC_d-FLrLJsv_kbAmML^f3wy7dGpa<5(~4INwc4B$f#BiuH3Cb@4}gY+c^e(G#H4LO z`B}mk-)ky84vu-tnhEJNxD+*`ri+7S)o`HaRfdG;R~Whs-)uDnM;4FslOEXeRD5HyR~Y zQSk52F*O<|w;%2ZJ%N97$P>Vo`92U5WqL%6WS#lpguC0<+`yn_9jLqD+u>7#>w@4& zx&q&hzBU;$rE{bJsP79<2!!nq2Qr z)J!T!X~5OoDfQ%j zQrXE~0}l)!hbveKT-TrbN=9%*0XX85TgJ;NzYEA4EZBrV3#s&sCdT?=UTJBnVgv-u z97Ug%^A^^=XEcQdn{yGlnw)EdpB6#lf$q_;_l=0+LrbRU(et2mz&*Ut9gxaT&lsGe_KiOD^anC&F7Qq zyN#l+f0%~kqcDv@K7C09Rockr#)gtn#4R9}dh?rp*kU&TF2f0-l{~2wNnF+CzIPEr zv-epyqvT+JjIn#yL*_g#qm)|&k8xICxGgCjOQh1_cx#FaD7~%=?Mk!UqWJp5eng-V zDyAeg(41@#aDj#$$^gtkULy_!lS+8ijF%IRtDXaNkb~h^U9}kyO+1(`Ov9w@(Jflo zyVL#f(CS4e6>pIYm{5`_;X^|d}JEUf!_uOr$!}q7q zyNl739ZHWMCJoYaUv5Pr)HN!1*j79tl(MZ$NXEu?BCmqdFybU=>gA$YloJExB;y;c z&X{I!$iNEGuUW13?U4~kou`UWTq=&=w;x(a^eBA8Xj9O51T`S6e}U7;nQWPMsBlP( z>lOo)sKvXLG!Z*(|FKlqy{ce4)a@0aQrartQb}$_+XmiG{QHw~R7sWNYanoA(%w1Z z!`wL0wX*&{OmUdjcTIR^Yg5GEfWaR@KT1U7Ieoho+y@o)ScRQ(-~3nzqsr5m-XU>jjKVn`}owY$QNrkR6O*jI%Illi(WXwQp-(VtI71J=={#z zw!R4~10PvU@9@O#mdqPK_!~>%0-6}8F;~4!-(R+(2mL6xtfjUoE%kuaXho_cjulCa z#G^)>l!z3(Vz?u2`WYno&^ZsDVJ#f8ADfZPR*0NSA@;fG{RY;+)CrEQt^4lMyU za|d4Mx3_c{c*1dqqdQ@_n7P%i$2qjYR)O)(IqgavFu0isX;)569rIcx8V44v^pZ`9 zMC^J9lI=jQI(9_)x1{&MLk_xYZ-WwjVtC-IsoRb87huj{LunGN}O75i4tS5&PArzjZm<&;+9_%7!pR*QDCO7EUKDGvr7mc>>qEVdPt zeqsi}WoZ5!+{Tn^40Mm+67SDRRNe;9QFh(9LZ!%JpY zKcggYx7?j-yjV`5hA&KjMh>~1MiH9DP35_0<>m5}07|jZZJGN5wY#t0>>fdd+KsqI z?Li;C7Pr>brhz~340iv5>e+WG#RTU+X*ud!<7$?$OV^{4DG2{*6i&%D#=Z|2=CqN# z9>P2FO>+&Zs#K0tl&?exHgOYu2W=p|@XL(+nzF}~_d+V3*ZT+i$8U&?$I|0MAg&*3lsJ_#m-Cyzi%-m@ZX|DJ6yL>P za-68()kl>Cl%sm$WJKd>p(HXaHUGfM9HiPPyAmr^$JJKc9xbTJUA=O>%O;Y8_rwr{V@DEFG@#4sa z3}WEb>2+BzPMhf|+?LxK(%hX&fQXS5gP+LqLQ-e1MEEG3c&>XkngXP}PILnPSl|p? zdD1Uk)QfEJ$Da_!0J8!Az%~-nOLAxopbi$|n8`0o&-#g ztAi7ADVKLsJ8-* z@HyARv}H5BB&mJib{)OAJ~&?X6+Nbfw_BrkLyhVG1q4`<;$!?Q5?oFxlsjG0|MiI2vs;*zUcVoOa6Jt+&8L7k?1_VK=A*K#T%)T|XNxYPqD@+% z+FNH-JqW6GsQPm3bWvd0MjR7qtb_0yKWLf33C5nd&a-DN9JET?VYMpku%#72Rag}o za$2%?fyg{Zp!r^wpCDn3x^~93NK6HH>K@0oZF(2^Z&mH07$g@`)biUHxAi5$NdRZx zt&q}2P6Ic|X4#s@(12xCjmbcz10x-8uJYT=J&XY7JJ=sO2qQpbbJF9GBhU-2NPLbq z0#@0%DlWJ%2quy>?Ifr_8&_o_5<>RE+MpY*7KFSBfas$Y5st4 zeenK!AO_mqKRWqGs4?D4_6@W`me++8-lJb*pQ96$cj@14dGh-U^i^RQwlqxD{nq`A zFXlEu9j7ixJwaF*8O#kC3X-l$`Z5Yhrlbv=4~T-riA5GdC(5x_&`oYVPcb_e*AKKI zGypAkghCt~sSgm2j4QCQQe0$Qd>i&Uhd;(}4qXclNJL3wYiUuOpg5h?zpYh0XF@+* z>U=9vX`5y-f&Wl9ytZ|T44AGv0$EWdiMxZ<78FcFqS6o{%}r+w@&oeAg4zrIiCk9# zjW?xKQ_g`X&-5;an=F@oSP|J0Pu;c~?V6Wcw21D`pNhFX?+)2$OG2ky+Jw~F2uV_r z){E{8Eg#mgKcIFtX_W!DvNFw3<~lDkXz04U(bH2CV!<8F_1>t|yH{rZFtc(HF2oVf>W(ADi0US^D5rzUqF_3GblO{gCFIoOj zO0S$SXnhauDVtyH`;BrNnkNt=g!wK|@v= zk|}8z_ryc^(aou^aJlfQ=|NK}r6>bj#3JP9rSHiv&_PtyP&q}EUJ{AZ=K~^^V5{pw zuMws&SOtgCfyBy=_oG)uQsz_-GJ!8DlLlOv$okP%oM+OOR{?Q{s6(;|_#sAf1{IE& zZi|ZsvymaDHAQtX51h3A7m7&1g>?Wp&Uye~l;1Q9CWpLpshFU$OPFFAdPI>UMwgg@ zgPY9KAki`l`?v)uh3&@7gl-{sKr&V^R&l1G_}vtBM+rTKmr3B6EM369v^FB>a1`Y~ zVQe*Dh^m4(IRp%XWq1eP?SppBXC$lYp+yCY!ux{A6ZCL~FN{eDbovNI@O1lDj-x@68n3lo6W0{5>*{f1x0kkE!7#*(&iewz*ag zKb(A9@Qa2^Pm)dUP-^~Nx_*7FOYF&72x*)F=@-Dbun0MCM(O5OF|+V3dua%#3R~GK zqN3sYr_cP4)wJmzq}spSdM-#UiEFuA@hb!EGibE1r(&`R1d-r}|LIn7501I!oG$1W zkD}+A$jvM$rL?l{EYeW+U_C*dz=yfw;f5IVE*$tYRM;h-_S1g=`8hh0=bVmD#wUn2 z{c3ttog3N(u`YEEm040pU!JzL6+A3brMV$3>SVsa-fV68&g5^M3ukWfHS`%vxud?# z1*%b9@N@;R1D_LZZ&1 z5#lo-F++)8mGeo>X?k*hETaNJ=6Mz)aToa*0;z`6rY?fqd#|t4rx#{_b?(;Az54#* zMXo}{3YNwoF>J-o5MPJe9uG5{gZfQ7Bw`kH<4QwABGA?&_VJPMP2fKr+?MVVH{h z>F%p{hmh2q;Z`7ZSQ4P)Vt)O!uqM3p1sJ(kb=zj5T5{pOTXx<^t zh7S%;ULSrqP|$%dSgTFoT3a8{BZ+iP3r2xCV(IZD&QE9W!w}Dbvw={LQXII2(}LW_ z1?~**`KCNb_qN|Ecbc^KiG)n?bohMu6vH0OI|-4XY8(`X42Is*=OpaXej!*>qhkr@ z%?V*5xLhvA&9x6DQB(rR&qQcRiWt;400I#FFd)0cfI<*PpnM}|BVIt%!epfy7>;-E zk(nBK90Pv^R0B%Vi^xM%PZ9MgfJ%1E*K_GNsPFDo#)w6}u_1FTwMsATnX{k`CLR%O zm*O*ONqhRUufodYsu^Kw~?wjyh<4 zi-+Sg;_`a#zB{=>C3yM#p-+zT_;xR!#%CCbC=={dqTpq6{S3^iSdG#&S^}2Qc~wp8 zi>c(XqDm5<&L+>|vDc?vgF95ZbK^x=x2gKfdB*SL`_97C1&6_5q{`F|;W3e6bAw_^ zn1Wn!7dT!5SS)0If z^3z(dy&SlX`BJWy^lFgWBVvl!27LV&R+T%`p$T*oe8^!<2o`Db8=Js@aq{O9sLP$n42P(!$+K;YIw~?1qrkIRkn&=9a=SfRc z&x-c3t=yJj%iLGLViEZjr7=WJXwNiXWf1B%qg=R?n=mgJizIGbIc4G@bc1?XpBqoD zw56{SB(R=PF+|KTPX-!g{gl{ge8m-g1Ank3QwRqE=%iVPtu!Q2r*kOof!Wc@@9^26 zCzhIwh;|s|9~&pJG^Y|;oW-bCiu{h4)bSo)0473*{u(51($dCRP@GK8o64&`NcSVb z8V_uoL&lqWZ#qup;wn@-nkf*=5(F!9GzoYWzuDi_e&OXF?aJ5A4A2!(uBv^80tUw9 zMfca?x9}n513K{)e1SSaB)XKh-J*H<%QC9_CHL%4r65vxUv4Jh#_02wruc=a*}*oM zpP8Hs0lmrh1WIr~AObioB6I;HfAqs_Kvfjkqo__~a5iMlesoaAs8+hSw|j=3F7*{? z(heKhskdWaC;}O8Cms*VAiJ$ENuc(qI!`(gCv+pu!IF1Hq6(0pY#v@iNvnaAz#jpX z#2Gg-V2t{L-H%S=iizz38pSeAdBCyEouC8ez$sjf8S6AZheTPA-N(QZ%CI=#$?Pzn zG;J~)dJCaX98jd#2xtV%^^hg>FhnvDnihkLBf>P!EB616s~KipPwl&|Ux}|?APVE^ z6ELzvs(@>vnmco=9kHQphTwbDyXAfVgdkucf9=?lAzx2IcwD!L%^2r`Sce8x$yk(TEVGl0mVKd zpr0&~kR@K40qb@)mbzoiR8H+G=shkS8!SY609`<$zg4ps4G?iLOh|_~h7aFPiRf8) zp3%jP)a3eV@f@%&qr4cfn()Q_TMW~gTsg#h|Kr2n!O8yiTR*~u!tmiI-v@<&&k51k zR?BgNG(~$+P_^tZw-azuj$UF0jp^V$z(eM57PO)hSM~Uk%1P8zW}&nCcoLCwBpfXYt{ASk6`+ zmcvSzwaBv9gVP2s{vw<84#`6S=>vSRCwAuB$kZW^lO?w7Ti?;z$~bzW_}Fx;RcdNl z?+@%>NldZTb)CI-c=Qji*FuWT0%x$^4cv~qC^mM&b0pUEY^Ss8Gjpa;&%su9PkEqu zP&*KX_Zz=&sXrw3>MigZU^(Z7%j8iip-oj=Cjz+NSCo=0)jSp(RAn zkUDszZHVIoU}m=LuP;?g;MB^VV#%?pk>H4JGg2SXjN)I~pcuU*cVcNGEli~F8rv9K ztK|DbNoV4E)Od;F2>n(p& z26c$l`7+QENgEgFUT~=;CS5Sw1_cqGo&1vMtiTYC|3Y#1QM)v)09>Z=L;X}ufTK_4#5lkZuy-1 z{PXi)f=_>YgAM-7Sc;O>1-!QZ=-DqS{Smz}n%(sH4ktwHwSywtLf=1Zwp=`Ya^^O3 z@4?E4{^FgSAaMGo2hjv?$*AZ@G1Jq^Okc#GmE8O1gQ#`WMm7ZHPC^)vt65K)h{of2 za26H?>t%FW!^l@|#VIeDzb@=C5~4?tIk^*S_jdOBkEs9m!v32Ny0e+FKVJ3mP1`fx zbGG9FK^&y&rVK%&w0hBh9EcY+54eI1pU@e{vfDW9?zE&W!48CsF%X>)$(&bsa$nXQ zj5jFM_&5Vnh;shXHdQZZKaU{lhB6sEEc3vDO_v5@*EqA)_?PT3)k_LY#}!+yjgRr1 z={zi6ak6F2t_Y+HtW$Q!U~D0mxSXGXp+ZLr=@y`9jJ*j#o`BFE55@x2p&2B_z4CFegjI2sY9t)HN%c`R2BR$)_*l`NlkPeh zyvo}uKi=#51Kyr`UGuv*#nY+-Q$jnzb8ay~{65TdjJXfKnoL6OgACBNQ%;i9FM zjiL8?2CxL@zx%nTXe)_Cz2*Jn?Yixb{5=1YvwYV%{^A+_y)Xls7T(eGMXTBT)qb$M zeXU5>G}NyDY5++)tm9;Ouzrm5!5 zPlT?z2r8#Y{KYk+!QpHmCiJxc#58fXe2Jqa8%yzoVx@5GGgOH5Tq483qK}B^gMApJ zbd%YnSaKW}K}1rp5y z%AOOjsGv&$vCta=CqnGQpTu!^fIuc1A&_CBg+-WDV0u&%;kcMc%4W~d7b)8N%9m}W zzOjv+dr9_kLc`n&7cv zLKB~K^jxE8AZn)EKou%}m=aZa*p_)tc35D|(q@^X%KQ^eF|8UG2zHCJlx?I)7Na3a5Z0Lt{a`b<_i>{1;lT+>6B{j)7#Fl{0&KEO5mF%7 zGQ=#TukXg>V%}U2v=5R$q-&S7cIE$o>Sg=HZ&YmBMdzMoe0^k|p!gh?jCqoQY+6{|20@38q%esKu*-i<-Ef28^EebRq)-k`d$^T(_p(gW z4cxVRJ4k0>{ou&}%Q8*sC6x8sx|`XoNPfC#XI3UxTN8}>h63ImX#$J66SG(v$WWjC zoq`n|Im*QD5|s(M3y&KNp`gtfu(oDVz8cRp@=-v$Aoox>vD_h;6ku+fYfLir8Lh@z z#1S0{Mtq^=Un8VBxbmUU^`*9g;o$)}qc37&qJBbfFWvR(3`SDAIo&!Z1|1kd${}fT zo)AZ?)5Z3W)y<`@S^tI60AKl{1*E^=${!RLHJ5XTT5@G^$8KU7=p3mvxn`cFf zF!v1iw>uDe!KDdDnrZ9{st!SR=jogMgOfq=fF2%U9et-wulzG{LR0P|@_*qV$ct(c zA++O1hh2}l^|;E7)m`ftIZmz-bExW(ifx4fBRN^A$~+c+?xs=bn>r>2UyooLl?&|^ zkzMvcV_jaAXGEC{1uxe>m80eI3Po*yD0Q)MaZ6jE47n5PQt&$7GZaG_w_Kdzhh<#*i@AwNXFp8)-YZN*Nx*rq&z0iBCJ+8C$c zFK@(?EGd5vG0iDn;V)Y3 zhuX$tJ3%rt-aW!Gl?Q$$%PT=@JPg{;PoDjvezx>7@45OTdeY1AVxl5S9W&-zpP*^m z^9W9-0R7CRvQM^oKmEdanml(OXe2-kfO@u^X|ms_ncYYbHe}%CG?TemPLg7PO;DSL zl@320aMCxWMwo@`*HY*RJUKi9NG;8&`_~Dl%idQT&p-FUzZdvA3v<7B63P>4Tfu*^ z3EE439=!kX{r86-PS6({d19f6hh9%3x__{9q=%^4xZ^XbFDqzd>*EUE@8B?g!0wKq+*q++*uoV9K```cGg|R{k63Gh=3+DEH&9&HSf>$|Sp8Y9~jy%el z=H0`6Bx^h<^LzZ^6@!JM`oF%QFfX5cUEz*e!r6P0lEU;-)8oYz7e?1Z!6|&_^~KPC z<foXVU(U@(Ft6@4i zEIe_e3d_xSVqCs!!F3D&aAaX3U?I zp_|Pl=}DGfU=DV>H6l=>aOtAs&LkFwBR|I~5NCInYDKzSW#b+u!1VJ2trongioazt6gz-eAA<*2TAV|@)7EDL+ zFhfnF%S$LS@YcX+v9<~i|HIz1N3oi%x`we+p2%nPm!;y!=uYoW*5y>WRl$%s@+yuG z^)Uh{l&|zY_D*ZobPUvLn}ZsrSL-%A9z9FS%H2X~6%95hzq#$_3F%&L1WU3Uk53x? z@)b#FyWq_LBnM2V?AkwPUea+Q#oUYJc}pd6o*od%Ldy6F)Xf|@!XI6A3=9Jv*FPiQ z2&80k(R!9^lG_6u6G&axoG%1Ck9FE8G)Im&8(s{GvXucb6tvSDVLT14gDv&2KQxgy zR5&s5{4cZR{GtN%;9rVfTzGiRWJ&VXRK9CLR_l(hi$Zm`dS&#$LGL7ogGVL~sNfP9S$?UhuLE`xyw z*Gov@tduuIxmyc72j1-}2z~{7h?)O5942LWK;9CH03t?PTTj;vNr0r9`WG0u)dg=r z%QbpjkZmS(!v0xlYwqO^z~FKp!!!<{Fo_$W$r4gWi-Wx%_l|mfYGwg-%+8qy-i|1q zg+Kxg1+CpqxPYSX?$YG~oHbm|G6>93yAfkYzk?_Vo(mWlL#^Z&?t|j^{r=mxuitKe zf2xbP|3$Z4i(x>^)TwQvo><&w z)A*pQ>)C5~ZlLm_$7RE~B#qV?)neQ`*nahP@ATF7$+DGrz) zGyb0)+|mgC+R$~?P4&yCEr!L9gY^zgtnZwZ&(u!JDz zGJ1QH5-L64G-DsGmeg6#noXD9H@t(1YYOdjy=NHQ^6MuCp;%8r3gvuP&OaK3uqEwl z=mlK1gOTNXw0C^`iqW zBZ;qG>3}H60)FCh>L{7s`Uwglsdq=4-Z6R~ay;fj6}q$N3*sl;NSp~)DejTks4L7w zL`-ZX%=ACHw>;z3Xs7uUqfmaxUNVa4NN(>Vn#SQZ|BwvhO9A1?%Z0n%*~8R zbegY<)Ni1vfoVt<95a@sd}MuV9(tm~7}Pr}7nga+BGitX5nlw@LB0uhCm?Cbm~l#^ zd%5OnajmO zkfS56&Ir>&+{UIpHE7)RdCeF~PkA9Jh3*32ODTEf(Qsg4c2sE*JdLtV1q++&bRTH! zQms!W9h81(Mk+VimGphJz#cmNdHemo(_4R{DOY}TGy%9T1F^5kQ}Nt)df|HjbHwFu z&z3@abLEs*&M#U{{YFAoi=qbuRpB`4OW;szu~S}4@2ac!rE+o)`(~U;jk8N%CW{9A zMv}5>;k7Bx&pEvl9V1%l!&ari_2D_x*m;f_dCYdFe zooR(`%W@rCcr@3dvQ-oF;azA&M4u%03XQ(taAl?WLbWOV+Q7HsvxGrHiNrD99b09& zj%u}L*uQZB23+OjiqRVAas<#O@9V4XY#*Fp;d_pJL48Qbgw!at4^g*wIp%Rb*F1>N ztrYjx7~!NJ_OX0&hoqqCr5py6gA&a>DGD-Ro-kkd?F}y$Pt0Pz9HCW-kU4CHqSh3D zP%%58Rt`YoHs{?33Ttc-T4vt(;KwyVQjx?5B{ssnDBQwa5Z@F>b(5xOi!gVtDS-g} z(VJ!44YD`$zFu6;skTjHCt)Z%&6gtRJ^XxBffVaA8P~%;G^SM*k?!B93#9T%2?68@ zeZQFJ;*%RMeBT1~!mdP9WkO#t3*AoP+H|qPa?JyAc}WpRxPTAm9{4SWW>)ayzHiKZ zyn7b3WEvA3a!h9>vy(L!cOj={fBWtJfA0Bb{O~UGjCUb9))l{HR6C9C-tcA~4p>!= z4*{i~8w1;ID&>rT_Ha${Qw5IoLRxr*tJ+Q&3@NT{H77X`%=_!T)6h_j(Z1kn!elbi z-NJ3=w^w>6?a)ZAaQcpah~902&Ra!K9U*vhA!jRx5W%{8fn6$@3Z%KJJrA$8M?oWo zrUeED){*I(4(7**j1FpW`SeNA{swzs_k6POi+gwP_4bFiC#TR&L>#{$d}eiC0*5im z3`BCLV(i1b)^P&t+tEHK3@tHe%x=uEx+`B%s{f{48}YEZU$haYQP2~DR^l}qwgNZn z+1~neir4i8@|!~3sktt$0O6~ek!Gl;s|xa~s8BBX7JD88y|`{zWM5H81T?aszGM_y z?@RbQTITMJj)2Ylc`tO#P^lnyT=g{~aLn)*_a0yw*#gRFU7!|@gr>n^&j!Dq_~el^b%dDWr8x&qbt=&4f;TuktbV z37N0#zz4(a#=p^^aL>MQB1!vfvY13(hUVcwBLPs%qp|m5@B9$6TDKASv~QiHV29Iq z*a3wVx&HF%vwZZ37eIDqN&h=4uVHevm4{CZ6<9F2-c@&psxo>fbRNY5y1ayW(-=kQ z5`ZyO0fDl9q_uL;mPVaK+<%8d#63{w!F>=Pq zwJ)h~Pj<#&)97eCdj2xr4ZiQn{e}r+nk$wPg`h^FXVBRV-ybJc5*ZYmi&DAuiUg69 zI&nvQE2^-Nq!BCv=Gp{LFd5FAv#V`DH3u#N$Cqe0Pb`$gxetfwC#5|B6bRJ2AS7nM zJf;}Ta*PN}z9Go0h}U;43s&qp6-LP8ypitMgyF}!(6>WtRRfEWp*Ij!i>wRs>+mFk zzlBJ~s&+K5XYTZ92N_#WCAb~RHJ?sLr^5-Mh(ML`ESq&3FyZ>ZGyDW*Pv%F_zN z*Gu2rZeJ{Wd#acwjqH|T4Iogdf<|clw!cw!Typ<$jG&L2=*3D^+`v1lon>0MwE<^e z7Q!X(7eL1-K1@g8zc%Rq{G`w3&YJqH_dmO3&~SN#Bkv{AW^yyA!vAYoq1CSnad5MU z#`w-3%qXP~4IcYE^WdMh-*(;_-To|dJCBmM9n9Nm4$l+EN*;fO(!ElE=<@WHzuzmsYNORWZ=l<$1W zsWhnWXF;-*)Yetqf@4d|6)_X$*;0u)bK@v}XZ=pzkuG40nCsd}xEaWCu!ILN1lI@% zLc0_lJ&3Z9&P%7MF&b~^4uuy8Zf8Ms0B?b(*Q4d6oU;h67O2E24X7P2YRC=y4B1sc z^G@H+xTCvd=sJlH-H)(<{dfPhVXkAW6K=nevl*HxhK@n02Krez!q30;t9`xrTXkdq z^o_w^KSKUq{_F5}*|Xg}gKY`l7QNrxui$a)Cl{_M=1SHT#i4Y0fhQM2amYYlMr-)B zzi7Fr-TgPRtICCqK&)D`(B?<5qW~lo(8cqLlig|72vVBZ%_@##-L$wAYvBWd8`oGP zLCg<&X$PY{j9JV~F<_k$zE9;|9m1u2`k-g6^Z z$_YlDsDL!w%gsFNxHE2MH#%4Oc5k~pDmJ^Cdi*dWiKPKKCs%dDHIN*(nGQVf>V&&L zId;jL+fnx^Z1>rUc7yX6eYxzkEsCeN4=hcyKaBCE0vPMw{`YTAPG9}Q^>6#_{`Uv( z_6|;@ddU94$?3`A>HCwTSikBUc87bookGfmZgqW?Yv7MH0gx$L7Z41Kc_t|xANpvk zYoESYGbN>XlR=yKThwUOl-aYkm2;@t*t60vY$k3c+`P6WNbXqGmb4T*)Yk$QLr9$b zGfk|V_?S9fGrXZet#%&ebN9iMEl&);d7&O$L>_q6duZ?(fE3{m{|D^C_pk|xz_ay+ z7;od`si@tA>k zMa|o=N%z%2C00LPS@K0DmHMuOW8EuIL^7Bho`WBPI7WUXbPP?vBpkv&JzANY?~Czx zfAGBjB6=mb`8f@7HhT8_^y%rr_Pf1fE1z&fEYIDVcVfsKQ;-Y5 z>MyLOWP;o2JyLI%?pou~uw-SBIUA(YvL6?D$6V8oxmo~Tp;@(~%Lc3MLfAcu#Y&`4 zyc%G$psB{DQV|q5^bDVwmRgQpey*>US8SbHq9gb7s54eP2(CI&%9%`l)?s^$={@8j zOzy+FBCYKi<-QP5P^*3{nkxb^CX7fOVC#RTEDS2AI`t;%(pC%eG6`odugb1L`%e1# zZu{@)w-NWR57{fbS*wo@BS9Aa@2`2e>S196MHV2Cz43*)Eu%;T?evyUpY+p?1x>8^ z-?BS6$#sCA;N@YSYujcx3&he)&3wK2WNWME{`>Of^N`=X`<`!}{mtF;&DUQ){pOat zvg7sL7Ty}%=5~LtuDASHy>M@^dU3!NTXp^LNi=U*RB3ngAlLKX-9xa;@nlES6po&q zlW2atSWHQhrVY?O`rUTAoY$vkO~dH_M8w~pHo%p5-zUJ(%K*W)4}a3@?7w^W;RIHL zNjrj6kh?yrzPeg205E}13r9oG&fm9+oNTv4bI~lYT;M4b{62-~Jep4-Ha^PZc`QZJ z6R0;Q4+0q2*D>Jp!SxtwBrGbGcMn6p?`=t3oF<{(B>Fo>Jm7~fx1J-c0sr`Jb7Ld_g6Pyjecis1;E_oI&$7tD4}JYt zlV9|$vu-%?-sc!)lBIMoVhlT=CCanrlauU_V~+3!_<}*s9fIJ$8W&%+m~8iY|LxwJ?StL7dzx{Fy~&tNacOL7X(lbj<81D; zskb4Fb@{ySKX^ftp~~FiYJsLDT7@{Q(YO244{eqI8j{euZ)9j>$G1Ope?7&F7XOv* z-p}ue-`40?s8{W{9deSqn3d2U4oIlRk8-Q=9psp#4>Q6a22lRA?o*$jOAmoZ>>qrO z+*k*PNAI@Z+HxsQ%~^GW7wdsD8f?13v>o+Va>W?qXGtPI&T1WYkrMkDczEY0JO9#tIy<4s^ zg>5>oxh^Ni$z>S_l9qf*l?myIhp#3b@QWTR>Coy5ueBY?US9lO^wLki`|gQSHJOd! z27TTx^81s%JEl6&`77R*!Oc2ra;Ei`o8R>5uOO!3fzxk+IVr`sGya~4wcqZ)+dr{O zEl)=uF11d}AAJRubuOGhLx!hfC1S(VsmHcx-?-Vy@=e)ZBJn}Q?2BJOKqwLW zzrDLEXX%{2dk58*z?bp(u>vERP8*XQha*k|FaUV^1-iDPppVJxvSBjC08->!%oh*b zK}?HJEF_{z=Bb2eth-%S$&`&9PM89^Jh&5mrZ&fI`~7~{hllc)JRd(kCFQUeV7L+M z0n3M8{-J+&hTP&6Kd*28;>>DTas2m_=$dvJ4ZBy)+p**@CS`WX8QRK;6Hhs?RI z#AV~Nak%o4DRhEqAyRgS*8bK6!4I04e9c;rw6Sm~v3<%-I2rP8BS)$&6mTVA0 zX4eD~O66ERv?VTegI3>FwTMgJ1VBh>Wa@nZ^l}5?5QEze8Y<)4wusYcZK)=xugFz% z&_-=CEaO3ACkgnqUbNNZJgL94;o-|I@)kyokgEc#h&GwBzWi!PHb9OQD91Ytb9R-O z7F5b?7N)y*12J%A&^%JS;u8kyp@1s7SaSeMd{4%D{iHfy5F8PgXX!4ishp56;Vq1I z=m8=1)NiIwXkaTz`fJf{z>ihBV(jo?cD!-N5naVpIzlaD}1?%OfL~8e+J^ z&2r^VYxiEiM)(!XBqoy`QCvP8GW69X>UO|5vT~7Y2nR?Wj$_?bwY-*cqg3v+@s-Jt zfl!N+$t&SW!7`^T&LI(Reb#^!`BWKFiBs62uswT_93S32u3IdST`1A_>K@^nVu>vQ z(qlnwr>M~W_scQ_$V+SIRK&WGfym75raq&C_ix%{n`R*ww23+C*(LKuRD#U5F|G*G zTc!MKNr(KV@=Sv`i!m{|KoHd@WQSxqrF7MV`tP!A-!zLXFZlp3kXG<)3)06qJ4ynu zCLW7A;L4IuUCF~Nq%ux7lRaA|YfH{0pFTUEPS_Z~7Za!xt<&1=Jjp9`;e3^+fPM-6 z4dH{NS6iez^zIslLjchO)GdM_z=s1QUB{r%PjB`P@R{y1&XUvxU}(Ya>BtEASP%}} z#;9u?h5kV(s6_+Y+1WcjcJ}lB@yYR^ctEqJ#!og=h-cP>(BXI#v!`RGkqo2rs1+Zu z1Qm|Jp$U|%sQw_5_1mJ@o)WR9G;>v7TrS9sjNIAKtgw$lL#)_@Pl3(Fo@cEeJHr^P zRf%={n5i0tt&?i(nq%bnln2?CMhl)cJ zQl;V}MY0f>bdUKC$L?%c(7`V}!F=3E|DfsGt(isfZ%>~;e;P!+!)2TfhJ{Z&pp~~O zuk9W$PD3i?P78FWrHGFp?HW!>eCs5uo?GfFW7ffP23KLx5AQ|CZrqI)+hZ?mXo*mK z($SWyPJ!0JnQ)LOK$RnVn|<9GJXc1S2mXSqX$g23qsgsO<6r^JgXU5dlc;Y)Edo#@ ztk+>VfZh}Amt?jE4T1$!GFb+^ic~6ZnR>_$1*H;#?jfd!ZOUm)JPxv3BE5zo8Qe3s zK;Jai5SJTZhNJsBd{=y{Cb$3TB+FGmDaOl6LVMv1oI==Y>;2x*v6I7{mC|vwz~X{s z9ZP@ukqSH2MLm60P3w!Pkk!~wud+(QhT1*T^(c}OeXISBg=iil3VG)#vk^R2anU)~ zEZ4RAFr9>bBFmO~l*d+RclM^^u6Itr9FMzAMlNzoXAKuI##5-IZ9=lhw1sItx7&(C zXKh}yts%NKO53n0tr`sGwUfi^xW}0ThYzVmIbY;V!(rG|V36Q>bzM=?&bVTNP`R57 zcQPj@*6^OU6q;@B!XGC^qvO!#tg87ahMjJUYSANii;6 ziSF@h-7+1WaY4(Nnrqc)q&<8sAi_=HQ}KH#8CKK{I^3=`TU&FlV~m5=P^Q!<44}hP z!oEF}G6W?Zki-ZsCnKsxAnKPDSIFLf%;p#tLr$BDZ^530Dk^0`pGowVnIPk~7FOvg zg4*#;nOI(#>RRS(hFuxAMCtC*FV@QnZ|WDXAeEX=A@5y?n^6Wu?-&$Sjp(D$6>#I! z35bu??G^h7DsxbCQ>Y=h$1SIn@fa5?Ms)$^n5#>I!_c0F(o8d-LmDH|*W1?B*(#0;Fw&I)uNb)N|67$GWgck>0wVKg)%@h-rMNzFVi3#wFr?WeouHdmEhM*FA>oVAt0;i8MRDeO~y$U&AG;uwccwveTqZ zuoHd70lx2%YdjOw2s?!E2W~Sh`J(aST!$9~C4iCAfv0Go&5&gU9ue9si`Wunt~v2+r9%uZIKXjRW2C>2xegkKg<(q%DUPB9eXCQWt6bghrQKt<3XE*Zx@u+4wxOrMY`Z7@=i(@t-Otb`lM3DT;>(aBo zQ;>0Xq6fN4GR!B!lR}?b?U{HQb%R#!8|@& zC%#$C<2Ka8y#A(K`@t?bTwqL71H`~eFzc5%m&jngXVeYW#HS(@q6DiP^1s?SC9bKX zJ;Mdg+=8a2bmMSZ1_CC9!%Z9-0XXicI^Qu~3y)({H^*Ihzwh8>?WDlx_szFMgyvD* zcyW`GSs9j3Fm={*u3qoiJo7H~$dw&%K*Gd}^=O@J>w(8e(|VY3JrAC-UL-plu*|o% zLPTsKW$!GPepxS0o9XGqJIiub^a^gFWPIt-2Z!{`v{N4r{&sNq(}8x0nn6H0kdam6 z7pzZ-e|JA|{Y!Af3v%>AM$X&DE3t7V5Fhom`nx&;(y$}M$z$D)7D$D!_1%^kw5Z%d z7;8~?o>?tHDc%)hof#y#!>+x6Z7so>#f10#9I>ml&WTrglgH}p;QTm^Go!)hb)xMB zX?8@|jEW*R1jZBO1uVd=NMzd4d`eybDp9`Dmotdi%_QaaNPoUrA2MNGcsSR#a%6f(!Yz$FWe$|~(}WlE6;lwrnc z>Av#6y{fQSIlDZ`Zv-}$bsq)H_{3<0%Mot*mdV(UXICD zvwNH=+d?CVtK{Yh+;UFTP(rUNJM-VGw`1Y=qZZV*^nnS53G?Jz38T@z&nyqcMaHCB4?s#T6MX-H@q#o>+ZwQGFNPoE@Ivvs}t@nR| zu2m=pw(ac70aYE9rEHwppKPk=zVv#Dv%kO*6?kpz8n~{(5v8% zg)>Mn9m91H9lS<3#vE7Bbzu*>uy+tg6w1|R% zO15FHuDUI&4nJRjb>K!p^CLe}WHT78FBdv6&ZulOK5$5VVQ8K^6eZFo@lL)h%AvJ+ z?(ydtZ#*WX-pL)WI&B`qo*#`b^x6Bw`0$ybICW}ib{)iluVlnJGv8w`^(~y8(Q>=Z zqn`CTdXfL$`eD;Bqchod1!UlZv>+Az9#gynRO3ZyNS4`p(VGsqwnum#YY z)qID`thypxfaubl{$+uHxaACewpO}BNkbxv17Hsq)bX{`EGB`46+hOX4w2?3Y3DH`)7zGkl^#*ePG4Zb@VTXQLR0b4W?GSAeTM3%bQ{$iRy4wUyKfyrL3T7}kPM{*CKpfIeiK z3GS!MIcd83?A93-Kk5(dJ@)o}6VwA`CK@aNTM&MHfF0&{qJ5S5_&0s|?QH;aJ{?K6gm^$hHLKdW3Ccf)sv*Y+YO zmla0#yr&YeIr(P2jL^o*OcUxSQnyd4Ntt%Q@l;L5-tiq#vsXcw52Av<(tZb1aU|y& zObz2uWaFS1Q1`KF6dG4_1`pQv5)fi^4TXm+x%xR4w^Y>v!Gw5i)PJB>f}qwX4201B znKxI)=)tsTj4;x2$AC0JF~n`rKm;6pIsr5QVV>p%sYLD)Odod}&{c$}jXr}s4a#PH zIm=mdO3Nu^tFXq&pF~l#Nz-6>#I?2gHKTXV0F^Zj6q^!YJm(}R*1C}j>! zj>_Zp*b_orW$X;fFrbTLV~TA}F$_+2LUf9vvvgix)M#FT!z$xY28Ri3230#r*NjxD zAioOI zo;6+u`$58&Fbdn0!F5R)WKXKQ(EI+Ug^(7ruW(o#LVHl}lTjZE(NK369xxV4W8{pt z%fL|lshsSezbCYZU&gDrlVdGs=9=IrVq#Q!UPlR(=HjFgl|a@s^}R;aF-WQt@42%Pqzv@6l|UXmzlF?50C*SBjc1Yr}k(S29_GQ)w8r%ehjNtGrB zx50wWVbfScQ;nLm0#ww%6$Gvl(8mWJUJ2+Dn6OWnn`k}n$UQ}-rP>+-H`)6PBwd3f z4&%*WV+D}JxMYLY=N-oo&w;gOSG+6W zHr!tZoycgS3*;`~^1m%6(-Iqke~H+(lw{}1wSsjX%8(_e-GaDp;hQx5WQ4i6!s@-308}3C}@e6 z$T}|(05H22t0|DUjl)E6KTkN72Kp(XTUfU;J02GXO_=k{)cWo!1TEP)Y-zwri5M{O zHzRB+r*U!U3{(})jU}RaI8m1qR9rAgmRMss?Z(%*O?m|#p&HIht{M56N|fL#plh&u zosd8aZ>4hM&}Xhc%x+;bmgpe1W%=CqAYCa|?aQDqY9PhX8z&8hpwZ@|$sAh1qnS3| zRJmF6k+m#pS5V*d8j_ZePX{kK*FS?YAabD{N%&#{i6|fwBX$9=1zqv`plKxp2bp!} z7P(utN;VM{HwPr7lM*y$bP|5QcXE1gxN~@LvUhL-h0irUNQ)|7)iyMawJgWc0>{yC zvyOv_dMmLj;`)@Dq6syD)FQ+8WPza)vQB0m)H|GgoA{o4A#h30m$dIp#Mk5FM~I?6 zb8A!vEe986=O+8I;f1fAnLBclU|u(^XUHh~#ZU15T#pX?CG)CUpMXU$sY=RrOn0eJ zQ&1yk+(?P86~=#LGVdgs!VrI4>xx%3TUH$&w3x}*IIpoCO*q6Q3*GjJSLvnig;HSN zZOnCJaO0eK&k2>da@^XYM?x82dcmw5b2iVI5)(?Sa1Y;|)mR(}2y$kP9zo#bh1^pm zsGsdm1>eGArGg)b!@azXj3kba1E~yte_@m#FX(~!uLv> z1P>GMh0RF6H3H|*T~S{6MMIEx6nuhOt8xA?KgWrD>6((TFaoOB(1dV#5mF$v__-Ph z=D@2LlAZ!#okpH55Icx0P^O3vcLxkJZWXGx7Sm;pF_xm^M+&ojEtIJAF+Ucvl}MgI z4{@zEAt6f}lWBw+;9A5oH6S_k*z4JI@(|>}Y^1+q);Vndf!F7_OqOWZF#q7npc{72 z@Vke+`UZRh1GKc96bn#X2B;`2aRwc+;nP$m{{8QN=L_8RU2u8q_M0)j_67X4eD2oS z4sF?7xdelb=@7rLfv|^y$suJA15xfVuiT(z2|e-S%}qOdG;ve%}U<=i}6g zD|V4+2C6b6!p1A1&c1eM{JA(Ly`speE>dpud^yK>PdRRe>Vnh(a6|GP?;@m>{r=z( zU3BjAd-C}Y_;I*>yw|FPt@tz3)17ReoW9vV`9%sXrTm1UcPtRC^xha|#2ovv(ILTS zuWE$H{L9;)1r^hWm=#N>6Iz{o>O&~BjVpuzUk3C+YKT}zh?|xt|MTglUize89N>w= zt`(Bw0zZ~;xApak?06ZCF|0CNlpSN7+itO}xqZWl7|})Oxg$gWXP!JXbc^O7n0#UA zf&C6Qn)^6e?q)pX7A7|CNNsrSG_WZ2-|@2E{f`tH>658)l+zr!N~SQfqY}?bm{-)@ zr|X}PDzzok2lyt!;0xGu^C|@LUJE6UGwx{Rp=05?nWGw}+(7{%0#_W~t{_;ks6rK) z7N6@VK;(VN&nS=sl#py~wangvJa^zrSq+JTA+e2>XpUowGyFp1kwtCXg^xt0{<|%| zTn^{;MOq5xWbgO{fSEm73tCy~6&g6lhKSXhR&+W9C^kz|uNnoOSw$vllzD799-lO7 zU(wTBjXOloyW7)lqcD-)DB&#ZT|gmVv`b&Ryzmto;l~G||8wu?FcX5t&I$;{lBBFU z3bpx8S^sYT_*jKKZ(TUHNUMeJe?elzEj#-U6P$5lgQ}f7EH3paCQM=voTS-r*SfI9 zeRFU}g!-hO02ViRUM{R)T=ibdL7gBB;{02EZt2{W3i##5+T+x<5B4tl?^d~li>!I` z?p-~}+)BxRvP4u-pJ%^v}q0X3-`YRZ1GQ97C+%01uS`5zzlk9_*y8so9b3#!;g z#ioUmfnle>@9Qk`7Myk9x@jdgFTMrNANG}gz@eKdhC_2iNfzjQ!k`y~EPHsqqtfIw zNspP!<@o}rF4d*A=nA0cLPEwAE#Qj;F6yiLH;fd)t00r$Scn3P`*ied-Y+1pPQbVK z*{-`^Fv%G@;Gu@PfMRF$1UCjYPHUAy4&?hL$~<<|-lsReFGJX>!wi6LSk)UX(JLe? z#e^fmQB+i1U5w1y)C>n)ZZoxKIXM?wsySyWsqhPm`fjYY)h6p7|5xqnFHG~6Wd<)< zb^;l!vHTO%|DBF;KYP95C(#(3kxY`{_I&9`n46KMS}5Mcje1HCFcU&VQFyNBE&Rjw zb%J)$!?IU@^Q@1%Y~9%|4->5*)f2!I01v|^Ri7o8|)2nOS9)MIkBAg*C8Q`A+lQHvh4#C;{6%RVel@Yz zEm%N%=15rNGjBZL7|KQ*C4?riiZ4EARfr5p%^15az#gb#S1qn9!8CB7X^oS_ zQ%35Ica zYK8?dbGt!SVdjvGc7!hQfY&{YtH7nHIJg%R_>gxu{xI~m>-XJm`Ys3kM%r#fa+67K z@s>AVu8|fislGT?03Y{*syINps#{6XKsMlP=ik>adXch;{2_VM+iG#mYObWorUMisRejdok%^poZy zCDM@;C*HnXxCfpim9xVl5mcwT2}}BfP|&z@0XwlM~=BJc=b zsZFLLnFj{O1rH{4G57SRur^Pw*F2ChP3=G$$MsLTb2 zvWHl$F(r>EV#Ft%B>7t?bkaj+0AQ`ta(oiZ?Of-)q3Yw}5)JnVv=YOk$h!x(pZ=OF zICNJ6PGce^MTG9k+C#THWwD%y?tKo0@6~Q0ul(v19VEP=nzByz{8J81KLbjTxu&Ft zp42o`ZBTr;3dSiQJTn*GL<*hK%yMr(glPPLqp4K%PO@(47f?XMdmHwa! z3MxIoE}4AZR(a>n$-KyPTYmmN*@Ge6J9OBIT07e<;R$t^jEiTeyry8`HeU4 zRA(V7$V(2d`C2-3Oadv9NvW6gbcotXTJYqCkE$SF7R9VQWWW6|y=p#%0cSs1w-E#J z;F^_HguG?l%w=W;vbSo$V`&=bOw9dr#9q8zWyg}6&V!Kiszb1yk;Pdl30cG%buGdm z<3)a(cMK=EC=YiJzb$s8wj}sUmBoR0rUIfuGohL=cvOw7$37Amhv(fis-nTUv>hhL#4WN4nPK5=p-xAs479ec#Gv3( z4Pvgyi?#%0Q_idCZQbVkb$|Mfj9UB7QVvP$I@|;sl?Ih^NkGG<(Y5m+R9md>myDhj z|2U1w371#BM5cwJa`Jz)5Y;;n4578-8Vv0nDXWnyTtM~@`-#!jWxA<&KNb#@lxrS6 zymhFeVG=15wNo$~y->vXp@32o?@c5w#d-`1jsi%wkH>~k2>>x??h@_6O_!@$N~@E8 zw=dg?>sgD!)1;@aP+;$fa!3dYzOy`I-X#ta*iMSmdzR1p_9N}%_S>Jf|8cw$36pRz zbeb7n`^_lg_FPJ;t)LpUWX8i~TXm2sGcv^x{zPoCv4n{tJ+FXx&h}>r?ZQ3{4?n zH`KzCkfzO0h(h0PT@MkV++p&E*$fKlVQ>Q_HnFCp?7tD72Zab~fGGnBjd~903U;1U zY|51z$Q+sGNY)%?|CZrNTAP|dI#GBoHLEEjA$`FPISc}N_H3vIeRtF>gSDY=+Nf`e zi0!2yC%OEjb`jnay!zeg&cm9KA*eSg9E>BD-JJQd6&-stAo5wQgzpgjmm8N*U8Mb> z!{f&Zz??|@?bPTtW|=Hbp=xgw#Zh-mI{VzrZ-Ut4kC6i|t7Efcy90czfq$|L{OE z2=M#;UAdEz2y*rmndG=GAPCpUN&&iP2FS)7K-S-^Zo2)0xBCZs-v7Kk9>b$g8sWkb zK4g#UPNQ;ZK#X)qL4S`vw#zH{11bLqiunXD`{r3u)2yabEm-59w0sk7ZH|3qoDRBG zn2Zn+y@mrL2v4^{2I)(_;S2&5CK#fvxP~o(#4wDrny_(a`d&sA_WlB&o@16csl7Nz zI3;m;W{Psj>v!YD`@ezTStI@^`#LQ0HWU|eKPIn&`gcbF0WMu16D zjom^%Y>}e*|A)Q5?`q@7_J-mA`4nxRH695|7-7fp*p_Euj1x|5-~yavPA)H2gBs{q zQtPNCV=|NLv){E}Ygcu(z{yXW5)sFL@QaLps;d+mn5>ea4d9c_x5*=IvV6fk`qku*HgrJ^G}*#fq5H- zg%tOf5fU9h$PeA`m?-s^&1YY_Fj^T|#M_gj@0c)!2NB(L|2}xW3C(bT@Lx^H>e6{n z@REna>{<4(F?*|6gF%$C%G%Xo4YaUCc1wm}K)tsm?6qFw>BrqL+`+mfWiS}P*S;We z=f2P909Mb4$0*|A?t{bz%$VnAgU19ifrf&Io<2 zh{~1MQj^qxAfkZI-TjhHH3g{cg@zENZ7W$^PVajPoH!j&95-S>}sYG>20(-(c zWl2S@QnqJnL0;qBc9;nSK@dz%Bw=9a;T->AP#r25Wy`hkrN=QLf#;ak-ypi{jqw#$ zdEpheiK&tPbnEk|FRf*Nvizjv6SV}qN_jnfz>RU|hf^2`2TZMLD0;B+_EHyT-S_1s z7)Qo#jmJLd5|M+wl>`y$Of@EtQ;t#~b$Q8K(;yMjDODJ1luoAvbfATsLg`_HeB5M? zBU3b~n+r}9ClXl;RM8QfXU>#6XCW+zD|?@RD&Cay#f_7FOp$_(tRZBTTE>rhrK-xe zbxNj{wJ?%_tNwvFq`ZNQoTPzrc^bg&ZJGk8FGair{doR~JOm?nXMiQAN1>Sq)uMlq zMZ%ang4mhB({`&=b9-K1bgI7Qm=H2cQeI5k&38J7&)dy2%>U zsi5(=w-dMipBTm`< z;ExGW!^tMyY&dN9XQ!iATr(gIZvrRz;lv3lK7MtTSTn>9VoyTTPoS*M!qnUf&0tdS z+Ens8C;T_8>%TV*w#`#_FL6CY35Tnc9Q&q7eBM4h+}(fEB0XD?`F6=UeDZejSz#H( zBExqLJ^W_x=;R+(Vxo#WA(AIVjyTDaJUf&U<4z-@J__^HdP6n>kQHfe)UeKE*-tqX zEX4c*C>6tNNApsn)DDL3=<~O_1F9JQDW{8`){rcT5&XNwllM~O`>S@(z zwunP5R={16S|zJ=TzBuCF%3 ztmWkyw}U75E{<6CHnI6Mix0C=&I9maM{rAF&kM)SRb&?D3u2jkKAD(1Q;+j2et1hsid;lgK7+F?Gr&Y?O%_B|vq^n&)- zpLEfL=3zM+Q}pp=v+5dTz^c}}YEq6y;40^?kam1N&C)}PnpGkEUaEbEpbw4`@^O%m zSd*y)Kpo5TE6k~pyc^B*fwT0v98viOo_mb&h_UFnJq$fSPTyiic&8S9Ab58Y5ZFxN zPWD}-k$157$JjDfz*fc=ry`0mQ*H|Mhe;-3G%_&PDA|aX%gww!t#ptKX$F`Oj6P!l z!%iPe;0XUrxY?B+MhLEiv89klT!;J7uu$>i3PWxj7DYtQ?2?Z@X1#BR(G)I+Nm|B8PQ{?%8dc$-Hy_O?)^TDk=XFXSB>^mP5z06&wLlK_@ z?BYT8e>x$}xKF#;L#UJC+W14C^xp-t?kn>!UxIQj{X4ThjHCN-pb?AMNymNourZDm zJ^F7R4*I}O)&f~Kcuc#DltBFQRghfkdIFI>VN~=Z?7p%OxF?(})+x)OJNISzlHMGb zU4gG2KIAzt3xpMQeL7ylpE8rqFAJkdTn_zs5JIq_$+Td%#WC}jt^TVhtRT)7S6l0) zl!ghb1l_%8>b3V*1o7!APqm2kaXn$fYzMX<8&$p{VKIDtROHBzB-7AJxRt1e*4NA= zH47Qcoknl<8y3Oi*IjUcD(E?amBsvm2$i@mv6kp&lrWq{V3*ULG%9XCo@L}WL) zfY=_>bQD_Eq7jFqJGQdgQIj16r$0RDx6v2yhrj?ptpXL@liLa<{mv)i_mH-}@^Zbm z;&Od3%>GaFc3tU*X?MUFVVf)SMrDA>4TBNXQfpERkdW1%g7uiZsH*3cln;iwY)k4y ztJ6xbIqCjbXTquGQd))0X)5I5(Ah7sCi097S>P~~yewQo8>&Yz0LxK5p2vbCu>GR| z9|Ab;wJ!{TVfdjEvV|TGEXWP#lQM)Mch3020FZ-(jHucN)(5Ei^P)y!#dm=#i>7)s zXM`mg!ZRM%ZZ?7KQQhfYnAk~$lA{bwUxyF;$iYKvqO?iAdo^s>G}87KZ)U&M)RIQy@^@|{_WYl=Q6d1n+0?5!*{iIx ze7x0-wVk%Wa9dO_9Bo>wPGCUT=T+JfE0cjt!KY4+KI{hO^~(|ic}OkNlmswE3fkcq zc#9kMh_mVwmLV$HK@r8*)qGTIz_PrLET7eKYVxF zG1;q?Q8$1dbSK-X(W9a%T9cMT2|+W8@whh5Dl&9xeyR5Xk}KVt7t1Ns#LFc!3D+Lf zCN$L=2&5jQoMX`F^73j;;>7TAa+!fUC-ioS9f%N$+}eYvRD8)HQ>3S9Elo==*_yGU zIu;cYEpJ{FSZOFHh|!V?z9?!tfsVo*hFCB`1+MCIF(2PhRMW)*Y;hbI4vSfbONll_ zFGgtvGIl`{VT$o~iSQO1#ux#M;CBM1aqeaT1Me5C6fUsFIa700?uRO#L znve|;DF|}^z061R<&2{N-E~%=?+MMFc-K;nEZCmsROrqxOrk&b@>5tiT#}TL(oQ;9bqTIpyc{XZWd`LYz)R*R#SyFt_grdUz77{j6||BC zqfmsV6_#x2wyt#XIk5^+%aG2?sqh}8C@$~U9B6>FYuFO^_h( zZz7Yd9{8f(9PFPEgHdOcTUm`W(+I6(WNuK9`rYpKehLg+4FX*@{x|(5eh@F>XFxDc zI9F^$Rf1z0rILFj2_TK+9l97AcrR31luMo?S&#s17=kzC64n%48+|r}_M~zgvalz8 zF!X0<RoV9dzY!mJI-)|*U#McVqPiJ2PUInA0C5*U|fn579K86#P1(yWjg z@W+32!>vjgQWD8S~l}q&j@r5C5=!?kJ)S!q;D`x2=D{3v%1sRAA z4pzC7SXKsw2ieZ`M)%JGMZt<=jQk?IgE_9Qdp3t^p=k@n^n6^^8iq-2?}K=uhpT%( zQ@+UNzNj{Q;`pxp2Or(c$sfBrC#L`~lWiJ`vWu@8WCLJ0I0;Zp-rX7LzU`B$4@Htv zd=)vND9VgxRen>g{9Z0||2CYQ==_af2eSbKK^c2zN>ob}GLqzK0R-aiOqdt}SQEoi z9FLV=hyh`dyU}|ugh|zLpEERS11DUDvd2siRtz{fLKr)evC%d?4q1sXCWxNN4@bHM zffEo1?n5#j2fp!CrS2z0{!kTNpTp-mp>`Ry<0k$jLf*Fr#)Sc0(Z)#ZHe&foUlhh< z&aqA>>zjr|AaErI3)FyTxo3&d6IReDF00kN`)NniU!lFX=bdh2fnj(5j;cUNO35uI zMqI07)h62TsLBY~AlcxRaPl3W^O-rKb@rg_3%quK<&yi>N zYbn5IHd@q+;I>+5qBm3iwD_V`!U>i;l>7wiQ8a0h9>ZQP#>@JOkw}^&pbNM5wRR_f zHHBcY9+|i~ z1OdWpr3t(u6>P}|sZu)*Wn)?$Yknh?boMHdMU0?`Xx5q0J;KT=7Gi*`Z5F0zAibtX zrs?{z#J$RwaTgy2%pn%RExr9l2v;kLJ2CNY&mlkoVL2R;QmbYLA`l%E2Ao&pfVD`q z!JYk+cW9$*Vdhhy6F;MraHs>4sJDgSTv@H#QtEE{`3kx((bHZ?*cv z%J59xNvkR{MNl$nDh&x}f>3Ttf;QsVU`+ut@E;VCFX{a~(GPD_;i1Dl`ig_6fHeT~u?o~R;l=tIPhRp? z{VK)Tq|x3gfMj_P za402D(wz}}B7!V%YA?eZ7)!kdxch+OwJ7w(zmo0uP(Gt47Y%}k6!V#z7a0Mj6~Ev1 z(+RR!af*g7bpy|c*b<8=xFkr?f6fm$Nr$2nf`y8tByW}KNgM0xhe#y1;2>pjWW=o| z1n|mqwKL#>^Sx*S-D-*{@NST6ci*Ioo#Rp5H>YM z<`)w}q^Q{L82f}W!ZEr4Xi~5$K}VgDlb#UKn1=F6TUo9j{>_SLxI3!}j%SW#g@G1&oy4K)B*_iCMHJ8E2rvZ1|!9_T{a%)IM zE#NkbZVy}wZ?|$gSah>K0QRb$Z z)X8;4l{))FCh(zs;B9#c?_5JlWhd1F)jkiw0!Uo9&bB*W1Ut8R!kqGYrZ3ORa3l z{W=9Z1*Z{;bRv`b4W0*r?PW^sp*6H?SJ_>edd4M8(7X3R;??+>BA<_M5*c6tsAVIA zI8{K|(*mk0Q7tDA25zZlb)ERIjg_R{f?4BWO3cJtQB|gr*kRV61H96+9#wwe%Qh9s z$8vgEiy2b2qXu&CIVUf2I&f73zx7!C-&fawqX2jBjdTVI5@nvx=G7%cN;H6f7{wv7 zF1*HuNA$f9kf)F1s4cOHzbos7iM(GWhuRR{gK1D561$1Zdtov+e93Yf-bl>yrM9f*Y5wu$D^#wYT$In(Rx zHP(tet1679Vj)Nr{WJKoAIQ#308}b+P50lc9u&Cc#Jwbpz&TcjK%A^*=e|4dy)?js z|508vJ!r4DPjAQQCZ8;9P5U{A&5R2xxp#Kqef9BWOo+NSJpb=s6JLyvzk|8B<3j#_zdr;9F** zwF0H}>l;TyldN9OK!i#tpAaNo09$fwHRvRxB}H!#rt|@i=~K2a%%t%~4LA{vgcUb1 z5jdHs?2~1{g3y4@8FnL^q}*QPMLmiL1cpNBmBbAP=7YqFu(B1X+1ELZag~=|{OR0H zYxqYuRp4wPfmwzYeP3!km}Y+kTZsBnHK3wl6_Dr~Xmhq)1k4F7p0nAwJjYy0iF^pw z+UkLPQn@xx*Y~xkA~2OeokRIXoRuWt5dY-mf>+#Wy;6(QH)|qG;yXjo*A%%o&B5`) zVYaI7Gr*GTO7+alWdeV6+-5`Erj9srgT~#6=n9sV9BhcFb!KUV@1_eDH^aJk{Frsg z5;Kj2DIfjNbj7BiWsD;&(DH66JOnkF{$Nv(}pnEn=#7d4kn$!o>u{N=jBPb{{BCSJ;tWWBllq)3xjk*i(HEfL}IjW9!T|#`XjQ@T#P7B*)dG5`~eX z8f3QUmJs=h$bq|#DvV+9feAj_7X>gvJ!p^G{A$S-hA&67C9(Q0>yW}SyR6ijd^!WG zAOhtUU&=+3nHlc)!ps=O%CB8UY6c5+Z}m$3(V=@O))%2lSs>M661qtCjNipy7$LAA zG;bIrR^%i0Oi$$UmrX6XhIvPwEz+=SqoZSQZG1&}gk9>_<9*S>i=Y0*zhPC?$JMCb z#g_cYsS>dt1F63ku%3kQ?~AO0s>yr?t?3##6W{60kwJt;F^3#2uE68I*gHrGv%(S+ zf)jFB5Nxp`s>sW|%=?{uH>>AEwZ}O`7R*-JxjSQd$vHhiPcjd7CBgpV>>XSqP3yxAr!!g8Oj5G~ax5@b2B~?VTU)_--u^#7WTe^9P$>-oEYXGN1>7z*_DFp9xI#zeAR}%glEm zYQ43e>`r%oxaw*-+gu@@-Rb>SWD-f>wv(bE<13W0uO;K(+nIvzG*Rt?HuQB^(c^B5 z8e4>Kv*`LechAJQLns!cW2Ug(e9bQaL+PPeE4CVFIDi}O{9<&LREvM=S6|AnN7Vv*;j1} zfJEu6J@9>emaMTrIr3fMRS9-Er~ADvzt9^Qp_#5ae-Easr?Jx8jLZ%V34pb>UtBj} zv9i8_O2JQtY22l5Q)<6MES70y&W})to*Wq3pH?TdpfdyWO$k*o9UKuw#NP{JGj+U; z*o!uSSB{=fzJ2o=lU@HZGpVVpHi*QK{aex03nS9a?KNmqQL zt<9VQL_s=K(|wL5?m-geN-6*orruQ$#7)D-m1s_^g-yB#40949sv#)7)_DG;2m4K|MgpjHIE zwnX;`Z)t}3#N{5OI#gwmp2|2%2F{Q~%5aGW$mw>^bw(7Gl*3D4d#M2kM1+9EG*9H- zRlJJJLW)fB!9{(G4?H#i(}LL$$SQzKiwX)k-3Oxr|4ej_=SC%@|NKa~ypVUZ_J1W5 zO1PVOzLR2=jk>NaAyvSlzd8VFdm8BB>IhPvDLyN8!Kh1&Vv^Q8h-l#X@lm}%U5Wa_ z=y@U@$K}B&S9%8PUM~y|b!`nk$x_r|`fPv?5^!H;ddLO1mYGKF%7fGo!>MZS3RXII z(;kl`ad*=emp0ygX1i;Q&uSSLM{%WinNzOxt`Th??wmEBRooB+j`7nuBYi8rvqrL} zX5?CxlA@^F(rDX7Te=P^=|*4P;>kJOJv!byK3Qv) z4@h`rxZx?_dK~|k9tXhtY(9QV$#yD#7ywv>a9fRtJ5uOZ*C+JCrc)eF7mYHpCY7dG zNZ{ST)>-1#z$&%P{Jd*|@zIjYDVWU^J}Jr#XmeKj(URpw7Q;T|2r1|EiG{fyMZ!qt z=urCjhQxIfDPACAlE6a+MJADbVNi9Lx?q%M90fL-5p0N!<;I0=ll|sFt$1)!-3ukn(z*WHj}WLnb##$H5&ro_k&SqV+z7 zV9*7yW9UNGvmvihH9x#O!7d%h$QWuN5gFc7M_HYL@tRi3{dPk&auCwJS(Z>cgX@Iy zL?!s2zS_b8uaYl~jL5+U$Z1(P)EDTo zw~Dw@kLBMd+(x`tOqwgW@0yS7*Wq++wyV!bbvwh1$u050;qJbO`+L4tPm;^P=Z43S zoMb78T{q}0!Th~q#O9~Hsblsz>$EMZNuxY^0Oo#|ytfqr_A6!QM5K09CO93TeM<;1 zZT?m>$CNA^f=H$p-SPI1yN3sR`zLC{?qz*(ox6_y$n7d-?}TlihQtH(Aer}4AtQG! zh3qG;0!P@+EXL}&Y=&d!gk30fPMD`FUhg$SWAG#aomnJ#)T)b%jqE)jVt9%V)L?Hi ztffY|6v^@auLzooxtFO7xR^V2&;-JQ;&LO2zH^jpS#Ac^;aJ}Jl>Ip%)9UGLIBkkBL|YvF@RY6 zAWUpz((LW_yW?HPCJTKPb=ILf!%1IV4|0>ZPnXXkY*=^?ye4s>Moe7FNaB1#4=v%) z26IHAZ#mJz=n7+m0RgpQ){~To`RGor;LP5;2m-|g_S8P^z)9pDN5G7PlPHF_H4{LX z>M!L4jz$hgI@DX@4TYnyA->h>p0-vxdq#wX~u-x$Jd2+qig08vI zdni?NZUZ30$Kt6qj}+QobcdAMy#66MwjM?KmZgXPD3N*GWcN=ikp)fY(Zpdn**!jK z!TwZDMH2WhBG_G`H#MskZ6jX~#2v@`>jcdhxWN3E!2ls{@?SPT#-SN24hu9GG#a#T zH?`Pmv~U+9K2ZBTj~hMy*pO)CK0`_R?@nOLo&)DwbQ863@?V}bJD@MV3BEA655GLM z-!u@GzTZ3HHT!nubMN<#kNLr8AGrb*gwEDlSWOS+!RHIEbCv({H{0p-$gx{q@6DBO zBitu*D)S~!JJc+0Tn8=D!1b(!jlYHtKOB>(7^d6Ha5C;63hiLP9{TIyfZ<@%&G{J) zYXa>EWzTUgihk>hu_y)iO@C-7SYz5rf#u~AGTpi86&qQ6l}N~pohyuNRLh{}4#o6G zDb>mtyUMk#8cp)$6;xh;vb=yD3smkD^z-v-KH{n>z+V)d7uQ$K{BE#(f(0HC;L@5|h{DOYPG19NJHjZBy(GZ_h`K(DM#x=3>QJ|%}K5HYq z?)LD*fl7=r@YWGO9IP5+C>XbQvbAzNVJ{&c8B&Rdh-nOm1AFm>4`83e;a2o9o{!=1 zG0&XNcYoMEY8VtBfQK<#!PXxY+Xg8&a>3gNC7h{QOu=VHCK8$Pf@45;G&}OOd?&$g zuXaMw=uHp(VFL({mm`JhfMaxvktLSX8{hC&Bmpw|BQ2;!nzW zh#l_mePOO|ea8#aTAoYp=p~j0p1a;Ty3<<&zLTiCmXVVI3If#~K|>9eqrjwy~z zK~0V*KOjGKlwzs%YECDK>*3~Xg`Hp*aR?3_hgmfPtPYA|Q6ED!?`&*rbh9xOFhvk$ zZ-}Kxwobg0U1o$wJhR9Mm7BvanqJUDcik_xL;;}14__Eo_pxhr`uc~%6N#>J%)(s@ zod?k77um6oXhrP!?)&mhH(PHROi-81?BNjSuXc7?JOi_9*tEN5&KC%cg>fLfjle!| z9l7+I423GdnUiVCz~OAl^5e!7a_W-RHEFF{6jIHQEyh@!?!_a-t)M0u@U8G3JR@<4;guQ%8}zKOrn9Sdk`IcGGm5KMsbvWsc4+ngGO-C}7r3pQw%O7?F4IRm}gUI9`lCnqu-3unZ@*fNRJ& z%lPa#tV)%S&GZryqY?oRpLA(b7&uCopw_CySucWD{OAc;XHe=5`xcdCWvEv-0xGIf+! z-5}YR8fj)Vs%9Z{-vQzR%fK`TEwE0SA#PXz4uhlF4kp%kX`IP>5~hYxi#TQW7RWuD zSsH0}O#r{&WdnD|bz!$qWiBD&UM3MHZNl7!Y-KPU-$0gEBJK z%Ah0JdPEubWqTlmEl;<%(rl8R8e`{lftEfoEXH>uCn@tT$lY zLz5{2iBH`-_bwc_eRC$rn^N4lSv(c5anoWr9B8rUWi8p8jN42j#;LF~*F7?)Qqhq6 z>9_`?FJrf3r(vCQ?xbT&Wi@x>fUGu+XMeo_IYWVQKTS=FIKBpY#(G8MKt`GQDxXVW z5VBD>hB}-0f z-R&!8O4zgU*55u?0I0p|Ov9`V68|X2y1St|w4~Ls%`OPMmktcdGqby|nAd;Kr{m<@ z+|{f)B_O)E?wj-d6(&q*watBZ@`@u*Z!X8z*l)XrV!0<|{C8&aA)e{o&oPV4c$9D5 z)8F`MiJr67KyhWZKb#!=xV`h?!+Rcf5L%A)+7}Q6%;pU!1#YwG4J&kqQG%hSRU&YZ z`s2zPRO_}$TTbA$TsIJ{X(8b zP(zCQND*nzq(HI2HOJ%~5uKRd%VHe0%>D3^^?JB2N++Kq1SDruV_JK$$orTEWHf4I z9MHB?Zn)Xu*IbjF$IC&fsQsb!Y^+m-=N1Y_P_ zHX!(Hy@uSd0l8(%+U}3kpkXTjiKmk|#mXc>TaF zsoC3qv-`6b8Q@DUWk=&RFHV?g>9t*B2qp*fat_vv`Q;MYIdZ58AfVR>L7RG6S`p&} zupq#s$^B(9FRJ-vK9#(XQCis_<|B@Zqr93Y-M zB+3iO=5WiUSaxSY^&zao;S=OyklL>?o3>j;@dF*aCdR$${iQ>?YM?RI7w?v8vEea`HLU=lE695wi|DY&VwWEwj-bF&V zu{4qkf}=sw=aZvxEl!=tl0V6$Ja{Qs>*1G{DX1|Y=fXiXan#Bs#?oF$9oPSN)imD& z7srTlp@2m(K(^2J4-0_EIY5@iYo+@C)^|=%F=VkSL&4WrfJrIxtU&vos_EI{> zm;cN|Wq4zX1){xu<=d#i6M_a!U#>Tla;U37zWIk~uD*ej1K+`#Snaqm=3v7bN0_U2 zJwRMQ9(FBIFVqW!ud9Kt5*HkL*L2BM7rq}2=l+_{@xyEMn(-rM^9nMe1t&(gherdn z=9EZG^<(@Bkr%RhmQ#6j8i=wZ-0U?*?@WYWW@l(Kul=r*fRWc#jF*GT#P3aGyjh@nx^nq- z2K-L|@8fc&jhW%0%eslnhs@dr*oW>-)K}bZeU>ALPDxOwk}Pgd5a$3mom>7Z&~l;B z+xEDw)WjLBE71?=2N1n?L5a@m>%8NztVU-3E4=Hk)*<7zA}p{4V?os!z+A-w!yeR#U!!Y&K|w`r)gw*wcQs*k2;LC#uy^)^wPR+=whR3-GUD){&Q{kH8BvxU}?xWb~%O zb2cjL^L#$y1Xd)Bw6I3uQBE#Hs~PtL_Ay}~qPJ7hQkMNEA!J*F2Dr#sjJeKlj9W5D zssr(W=NQ-3dMN(oAiOjLWS&>EaFu_T!y|Hd%mb2dHv|)YpMN6IXO|+ktbXhQd7Su)jg5|^{E<4si^%%i&b3_wlHd*r)Uq6LnZOkslMk7PKho;J$k=54srLXHky0ty) z&T0UGcJDwk4xHq6J}z>)5YBv>!A$ShUp`7Vm?W{0s7@pXAQ&7YbjjY5F{M-&Y7@y1 zD&0|4>{S(@nSRu*yD&wlTMA03FIZktxN%__N+#iPK7Ojs$5vdZWbV0P%SLi z;T^_~y=+*225jv80{*_w=82Uajz2hGd|_k4!3^*bGX>Y`5dxEfHH}K15WuPya$`rY zK@32!O@kP~x%;HyL88gt{&%S1{jU$ZNB`(0zSuuFdcXZH<5bb+_q#vuy!&vx_v7w{ zw-5&D@{3G5UvL;lV*;e3hxz!ruFcqoV&p^Q+0(mX+_wz7Cs*DW{ ziY75A5Z9M%WKQ#O5rkKM^+|Te*kgfaO_R-=-FLeuyRBcJ9DUf|*v!*W-yb+yZTlKxBm9}>1-P9Nh@{Kq0KH3Iv%~ls7G<55FFt#@oV*W!OvMIH)%|}v zX#)UT9wLKcAS)P5YJ^dDZe+R*>l_VLyDq%IhJ5$=lsEaP$QebZ}R26r_(O>dm%*Zi{Mr?M?bt1<(*W$1Sx}rAEcdJ7wq4Wj-Y*yeQ~PPKL#<<3Q62M- z@8s&2I0lhie*5kjSu4lkl#ajOK1xhT^M-EOGKvwSO!rlL6j4r;_Y>J~{o7XxnX%`! z{kW-Y@F;{`Ev^GOAizWp)L1LvCnL^96$!+OJLnzXteK%l^}doMJFGDj|ZVYsi$=iKM96y?y?dGpH3>0&sHzUABXyH z$y@Ugf1A>dDr-3zh15UL!4m=n|&QAtqL|sP#I7f5Oo<7MEsS)7(c?aD!^k(;biQf>S z0f129pRb1fL2O_8HR=o!(eanS=kilNrdNe1O8l0{6xG)C9W3M8{p-9YI2pc7b_w0Hr$1|9c5Fv~!f5)cFHD z$KEo0(@}wCz$ih@{DK3AU{W!yhJ+WzkSc6ObQPtO4j6bbe|LZ8_0&P4w+55dx&W9cd69=!8m zPn|AY;NIl~s*`OfVR45N zk$xm=S)5JT_<6*TsT3|-nKY3(-SXUZwmv#bG$-53nK)%7vj$fKxi#{N`Eq8_FLD0K z&d6GIGs9)^OX{1h&!+FH%XC{vTKI7CoQgRa0L}|och>kXgRXWyIY$3AUHKuQsKh;;Pj^|HSC9ye&-_1$>3hFOqCtFvUOJfa8N3>_O-uP*J|8N@mEtC!Gl(!a#3gPPMj<+aFxvpL+9C4^p23kYyW`)4)h zYIiwQTLj9xY(ex+%<`CCk*o?q*_Xna%Ib82+5V0WXYctpua{no+^qTIm>Q=QC~awZ ztku2Nk>2{RN-m4~itwua7hjIAChzl^UFmHvR4u61iYYT`Y!k6b0s+sQF7;+_|2uq+ zC1x^kpqqm$VVOF69$#)@(S#K}cvs$x`f_uHS0*xLE!A@y7E$Qjol&nf28J&BR{fi7 z$-o_G)2YLU^}=qt?fHBH*<%4&{Ept|1T&ri}Q zhWvoN%N_HX2xyw9LeaeAJ_5^;_!|V}EqS@8)qDbob%fDD$^OS^c`eQdi!0!T1%P|Ht0d}^g9%n>O{&)F0t;W(wH5l4a4W=Ou&c?P zlu+m$v;>9|JAutkoQY|5-IF+23w2KU`Vaz2IOkOm!c4L{Kx(AR;D+XHBM2n;lCcqq zMdmagci+%4JMN` z+C|b#U=Bc&T|=n2F!AfZp`?>srDnreMeP{{>nC;ssd$0w`nLSyuA{M0hKV>swqwE! zIsZnYD6XpUh{}-B30T1l7%p>7qGyG_B#X|jj9{c41p5(UvE}2yXhi51`&yTP<)Fe2*HK0j_7jrO@oXf#ZNQ709043+nDt{(Km^85Ry;BuPH6A-0n&1OkN$ zo(PLq_%%opKmYtQWCfCN(L$e&5uV}UC>54Op{#(y8kQj&^>ynlMW$k z#Gb81Ud`60Z93JxRwY4~DNdQ(_i zq(cLe4&@h7lL!ZmW(f~OwKavfhuL7IxVZv+94i;!a_xc=NFk&k`nmH=z+V`?fEAIe zu!wh5w+db%5{7gc*ZF3KTw5Iq@z*pYbG07Dj&DKn6Tuy>1{9T%n|64YUVk|LM>i-Z zEEfn2&#VLAA*P0VctK#BXo%c~)eTKIT3Pn0VdR1rHU#0GwN`zNRD4TbYY=I~SBGwW z@)|uucJ8h<%yzQCME&~4Nvf0Hnk2{Agm(;=GA1UIIcgRi{7OV*8oCrx7fFhAWfP=a zX{+}J@?4tVxMgz_NK~CiFXJeT71Fs;@*1|s)hfrGHxTS>!Oh^!mPz}e+2_Vj(zKYc zEOz7D04HZ)aofdy`koO?>}?zAW_Jz(5UL0-l_Ub|@$SjHA5Ks9-tRh@itio9>zMOY zNT|A&IBz8jU@&EDGZTA8j|>ao{jhEewVNxX~Gs z;TakWH4Yb`wF%gxrTD;x^%0)Pc+Y$a9_P_XvoR*9M9jz&{I+1R-XI3V!FZDxAh z@(>Z&V!B!i;n1?gY4F1cPXvu1ZTAjC{dL!^Q-u{KM;h5UzajVQsG!OUxR?l6Dr5ow z)`$`$C^vWV143b)vs`^uRviI>_N)m3AJa&4U6+y=juwHb zgNhnt-UtWxCpHR=QcXqKyEx5$>4g7?Yp=OYp*@WDDcmMgCMiW0e_$KWLj$_J?x;8i zEI6o`CylKw=-;>8@}gG%%GXo7bQ$^c{`m44W1nXZhyl?gY_Sko4!sfWL23!@Si<_6 zp8quLg{a}xX^W%x_wF8L^|)GyZiadsst>ieGnJx4TVw4O63UJnV;^eRJ|CCp9~bSPco3tX zx2{X~PNIplA(4DVm{Pb>FV<50_=63@wQ&I?mVkDbmPkO+^3U9h!j;gVxvKaAJHwH= zpi9#G7)T>DM(I^fN+5hWHP+`TsZ|YgzhQ5Rie&)v(4~OUEXwjVdJ+QmB;Q@$mz9$o z0$dsGSMgV|BYY=z*2EuaW0Nu3HeX3tBtVC>c}GRyExz21{SH(T2E5u}{6;v5@3uiV zD$T~^gOu@R@A!wk10;?|>%mX9J4KHr?%~FHw*GZLj~e~GE-u|h;Ep>@;cI(*#00vv zIoQnJ7H9J%7##*{KD{(wF0R~G0Wj7$FDC#8IlGx7RJp zZ3RT~Mf4U;eQ~Ob;~9>xnq=ko`Av3HEwfRTT~-yDAc1s>&*gX{dgh{>VstPD>OkNm zC;;w@d0mVzs4xM2Nf$yLw?|(wR*yowBFt)ZcQC2gXn}Ja4jzO)`0D#N{j6D(Vmzyr ziHZ#!)&$TT1r}u;cWk<(CUW4z{h%O=`}%%hcE-T&{`U8d+_QHF-*E?T_ulPhZy_W9 zWKB@EJp-vQFR!K%z^mN~QJys209fZq066ax1GtaNyqlk25l4W+iPd~0D4d@W(a^;G z=77X?DX3DSFRV3Fm9lMLva*3eL~1X*h(-p>#c0PjIZOUJrz$S6#s!=0Ke$BS|{4v@?oPgz?eTIk`KrI*RaJsdmTW#3ykKNk#&jpK?K)^-CMty7T0FqFrk8xtQj&6uT6YE5i2K$ zU(Ty*hU_~7o;YO!SX9@5=!X#>Q;1eV8KhoLXfWs1a!S^%#R9^i(XLf^`pxGOfj$Zi zFjOCahw1M_8q&PrWOYQ_f+vv|x{t@j#R4Y8Lq#u=SqY6DK9P7QI(Lp9A8&<4)p+>+ zkcK!01p*U-iKx8n!!6}j^6^$5P{fw5%_W6!Eeg0VQE)bp2U)iH+%ZbX{H91)w``kV z9)J7o#pcszTX5#}ugB8j3B=Bl9cGd*vdYU`QlYb)!p9{2T~L4SKDV$u_eL{%}R0g(orT_ihT>UuJx+hOZTA6`n| z^%HkRp1p)E?!y+p^5r2|5<<2`=_5f8AY7DRR#EU88p16V_dw;PSH~0$LYxq^C0nWq zH9=(mb7f_8$l^j+CJ`#LmXohW;k_cvR)LkZ0osDT)mk+ z9J<$)AG3#9J$Rv?5BT$k1N>%_zj2FuQOPOXuNGVy)OCZ0eSrIQ=9pi0jlu|=9F@I@ zGA_!qYMP&)m;6Xg{2Vj|w-B;1Sk8T%&mF^EG@59tzB84sEdS)tC*#03Wf(KQUVut@QaO1J}GNg5|e?NNSLNq8F{h~zcC zq3Lc>%s(sT36rHu2RhQnNSbrE`$%fvK`0!R6&bVDp}00#WNN5#$A@OjS73Ny=2Aj+ zQn14e-01YIj-1LvUKSt|pg5&hs-u&6USDbHE;3DRzx(dMDevFE7e3FvwLDar{bqM4 zR&x=+l^#MwFgE13BI&W~K&FQY&{9EJ)m`l7kZPIL23{Jv8Rzvvq=jj{$fxIp%5;aB z0HoxRD9FMVt}h-@j)JhC1D+Zfa?YI8G$|~+>YS2J_VgwSlyj&b0n$+&k0YUz(S^dV z^`dP>LU8+-c@4OC^ck?TQ!b2T-P9Av5dp!y>1*n-eFQHsYcio!2j)Gn+DyphNR~;d zlP@Rk1XHHDTp1fi?oYm;Me{x_BoQA;sP*!U7~6t|=GlSk6)<8Kfx(1~0vK5~A|Bwa zD-;Qr1Ku>ybZuwGdEB)JW9K3H5uqG$Ij!cr=k6dvzBj*0cp{as!BX-CZQ)c90<8bP zQNGJ}of(HiYvd!BMYyf&AuRT@1*%oaeKv8q6-AKmu_iI!DxXSb5@46pF?i3^5dl zSkXA;7BdIg^yZpj-K_CK%{V*~aE=0FfRhL~yxWKFe%!0_C@tA<^ z)deitLd}Y%W~&7KhM7gR0u``5=*!G0&I<(ssona4@duP{T4L0KsZQ_G%~T+NN&0dt z(5GU6fvt7NQByHnEWN=m7y?%hrep;89;HFZrwA>?M4~7PonKWI;oRvXQNJX1<=JEc zR4@|bD#tDg`&u;)j_X3Jrp?}n?aw%K%&(Xh3!qerWyDZeHs?YTf8&_=(vDP%3fCKL z^_nC{#tfEmii_NlloO`QFT~m1z`+t2E>dEBbrI-31P96$tlpIM;b2hsAp?ou@7Gt8 z`$&86&d~_vh_}^TO~r&En%YxGo@hO_gm)jii%OV=?Fb|f@U$|PhgevM-vOtlgW~rU zAe|92=;9qPC91b}17*Wn^A?S|7mm?W$4G6ya2j)ZDWW@fB3zE@6IqPBDZh-Wse^E znC4($z#a5DDzB>})P<;?b4xX|<$MN2+*tpTu<@t$b-_r&?v6v$MfXd2{%L&kJj=cV zUmA`*6drNvP^99EySFAPc|gDK1OIU#uBd<*NGcG|$SMJS{@&gn_8zL{+%@W#z999S z96nCcYu;~0SSQoEoAmqiu}b>4=1%p1lN$(sQ}&!Aqs6j#*a5~~0>LJ`=MDqc-lAHh za4NzJm{nl3k+5`xH4 zn$*T7Yd13U0S(%J>zey*y#}R;1mhl`n?BqtWCO|<0R@Nz;(Z=W3~`ZVRCnR1u);wH z5DJv_7kDw!RSkL#im6r}bq9NXLwTWoz$ocw${1&nDg1=vJap(KBP`AHo5cQMretDI zMWKtdE-w5qT``M4z{VFcC$192AFqD%fb7>{ZPJP8nlLBET$H3ke zGY4}xjiX%NsGjLgVr?D{y5a|gDmUwjuS~n^2;CMiri(JzLJWJhq8#~`bx9aLD))un z>7G?l@b3HAwN>+Kl)p!XAVXA|k{*;|wX5l1u(t| zl>X%ujiIo2rH6&v1#_!p+AcNS4y*hv@-t1l@mG|;NU(d-KrX7~6z>60OB5C$7?>~s zm`)L~3Y1?#?N@){BDJ|d0$ktMc&w2od&1uMo`~Pj^Zm003Ti1OJ0y9Kz2j^!uyl_c z#R+@)xCUjhN!V($kra7D34HSNg=#-S%6`d%Th|cY@w9_~Bu;wH{Hf zCcV!UYs(&I9JU_`j24&Dau2z9!;S6HHN+Faql;ZYWE%z!`G}#be0+gtk5?B|N4&@k zq?D5_N-_~ZS1PAKL=$Ug=zMa$55OG`W2AYA^yepmY#MqQ^v`k%2Vw~f{0)|uMN?9H zHt(mQC-=_mU9rf10P2Tl8htN}JzicS3@v((>#Xy(if&pHqAQ1?=UxW}9pVw_<2ftT z8`of4Pd5Mdv@20w$rA+~{h*n19Tuhj67|#t7r+N%9}rnxH`my38n-oC;%U>E^}rC4 zkU}k|5vdGCcD~B9@`vJvMXAFUw>3R8%sPkJdiMC)<8Jns_$c^;He~~&aw_JC%}Mnl zo&;}!PCD0fWwyxo_}nYg@QPe99VH2p6=3iVblq8Alw+VpX3_X0hOmSG1KzNKwB`kd zrQZzVR>0I)hoOxElHy<4?r~O_%MTY!HHB;PzQMHmG$ps=R>KSrQ|oc=34OEe$31(w z%$-8I;6z?@AkdBM6j3u}JRlo%r0}G@&%emYB5FD-7S{l+gd;}-D9x_NIx&V?%4awm zQi8sBL;nT3`#2mPs?AM{8RLuScy@F>IB9krFf+_r0Bx_}I8UKGr55;wZZ4u>ur7o0HU7MlUQ5eCCx zqb2g32$g8Ep#dc7nY(v*o25V}wFoP8%2vi&kKFq;np(3bo12>|b7k3a70xc;_^8u? z!R)+bzbty$v6P5df3v}+T7^}bgm9jEIf1nu{6IlB?p@E|HG@r&Z}WKxHG7;iJC*hB z^6Lt-R$N*>53~R=QPUk9t&)m7UYrfm`^D`-To3HVu%;JoE98C)ghsZV4>sSw#-?kr z?_7uq9aCUf^jq%E47xXS6l8yJuVqse7jI*8y)r}+coC4FxXcfmtVOa`!wtyd4wnJh z_i{u)&T#_Z!|afQ){O?keZakKeLVx*8EvkGp=9|R_cyW+lqlSo zr~+wa?kpM`+URTF3(6ksY$1Ci-3X`=$kC79!NpDNi#Ga)fpOP)QsQwV4I(AU7|C|HfJN02h%jhJ0vtz1!l&scisM#%3`sTj_pLih zm=QKA@H~M;@x9*y-aa+3cm|I`I+^T(m0pma(sfGxQ#d--ZpVv6!}QEPFUSasK1j@R zX#+%Fd$gYY2gQFC*?q|IxVq1oB`EdHG1p?bfJmcB4i;_h4O}B|YY4*2$?ow9rng6* zzuA5L;k)jNESsP5F}(%x7XE|V!#O`W+TPji{M^Niwdm=tG=Ec^EiVt}uEUG$=e7TU zOtfStiR!OnaPCMPVz=R41sfT*Nn}-_X z(T5}#8<&NRWGHn3f;~9t1(g9E+#3`Vdb-aMJ?vZbq3fWnOY*ERHWr)IlgEk>q+>3! z$820+=O@b^Jm=%@-=FRSUdeFy3_Gwd9}d4!y%i%JOuC5-{>Qh+EP_CGRKuHG7d*JD z>KZN=zFKdPw_iZqbM`%b(<9+*QJ$5K6Wmbkh4X3&@|m~n)9cuqho_XHPYRwSgcXfI zF4s{20ibH-{>Avh*!jx~BBp`T>=RB$DkbLZTD!OaQq!)nMa9UqY#MydsWhf2y463&r@179ma}EU@HG9Of(LefI6MhEh#olF-8uM? z%f0dgThRmC1hmuH>+%Dg#}C~f-QY1fM&_pzlYakk7x6u_0|L2mH~l!507o}uQ-4 z&2z9jnDFPYVUQwpZNuXhthey{tq_k0LXN9D1!5RqsBe`Qf%2H^Z1DIg^I)@H^>3I6 zLb95~vQ2NCEOt$L)|Ogiz8P%cs2^{A`}A3l!tiU(2h9%V9EN~rl0Z*pQ1Jrr!Lp~{ zeDnAz`SsBpp0QJBv0z|QF-@tS_ju#mjRD!$B&Y@s@zW=)_d){=HzBC#2K8bQ*2i0! zK((hZ%^x9qW9pFm81clQCFv+>Ec8d~Vk_;;K#HGUcKIUL<|P#>O11|GHA=S&B6ZRF zVJ~;;?3vrZy=l2th4IRg#8uL^>8Nu7SNka#EwcUvTh~n`|DN!ekO=e0S;bGzZ1iXxWW| z)QEHY{e_ky2smnk?Q;G=gKwJp0_4`V33IID+K$aJlweYR0|xqVYJ(4<5Rfk)8ZJy~ z3T1;Zdo~ai!^$Q?2q;5&cz(`W#*03g8NA_`Yr!}jba_C(>?u@Fo`*3FLKg0y@yOi6 z_a%G657%e&kR9D>$t+dr67eB$OXb^Z`83qmSUD$c4b_p@@fgY-XgTe$xquXA!u4S- zi8`UwN|jLaSp1=x6~L2r#=#neZ?|JjosxE8O2CtId-Wf zUPq?+C}9fIK-LxQP8_Ns0mDDbVL-S&4(u+j+mZ8CAYmzt&37`=LLm5fPkmrn%&Zu=$vD(O`-giingE2u{AGC_^|UM_w@UGjzbXd zwb2*J1!U7aNTl@OGe4N@AWny|-Tv^AT}Sc3UD#kW@$%0_@j21nKs0~9ee}cW{=v!V zhvVHhS!eUh1^;x{I64TZ$j*gI^r->-hAJeotIt2UiK9c2i2|AOF$z*IFr`4VduVNO zD<~;Zyc>w}g?7z8tV<#2%{f93ITp$e9F{Nb2=PX!Sul2kI$~oqGb6Ficn!uWXzazN zWCm;gM=?X9+2Keq*F{cSQY?QnugB7%GKgU7z|bY!lS{Bu?h3OsiB2wSU*I5Bl_#9Z z4_(~hWn@9cZLn`=ya>9aLiAF!a_zn&mOT z5_7*Qk~ODMqXw#5FF15P2*s12BlaCaZxBWS#}DFU*!4RPDVj5%*s2chiVlC&Ydrlc z9cH?>%z_1u#U_RQ+U;^~j(A2o91+&dW+m3{DS|PH2b4_f_NF1r32W!}PZkb44;huNlE3gNE(U^DJ+L~uaV5tER47ccM888}*s=sC$v8T|JCvMoX|a@o z@n=xgpqj)ZxqVWZlkD!E`XxnQI|?S0SP}3d+A!#uR+04EtAg@UJZF}u7WCeb)K$*y zxnFVUy^)#Oh>)i79wPkgyyl8Rnk;2g729kGLr07k9={%!yFdXq&yd2AC#t56CpVM zkv7pTBffqQrW#+JKIGAw1Jq0-<^bKaQ4E^!i;@Z%&+p9VmM(Kgu4jN2v^&8SS>y{ zCb!w5vu>+V9y7g`m@!sNufQla!O&OIGsQaDlzuWV{g6F!n*%&(sg2!N>Zh})Xvr&Z zk60ryYZka@x?CGhL5-v`x2k=s%V2Tt{ohNWw-4R(1>ulw(KWXpD^JZ;!U$@4}1my<1O$zG&$@WZM?ZvTx`YxdKpVuy(6G=z)@Z{D@t)EMJoer3YgR3dM&gZe zs@>4?Hxp#&UZez0$hZ`*F6b?IYQ|JPODjcl9)p2(Ftfl*Ccv&lhgP%y0O12gVDlc~ z^8wlkb=`D7!eV>Klej+Vl{%%w=986ggDk2D5RgKpa6}R=l}Gsz5^vAuZ?;XI_*V%) zF3WU$Cz9D++!66>4Tw%K$!kW>Jix9yH25CByPI{=_DcQv-)mWL5*}t9?xWiubk{rO z(^s0o4OyFJ8QG1?Ttk1(az0@uCiH zDOhkViUvV&sA^}kH)n50LH*@Z9N0R3@xr%9khKW&J`@*IodBAt^pfaA;~9({pKIwh z?7=@Gd%-}*8mR;e1o6|DP~v1TDo^tCi4!4zqSAeheoiEPlyxw|5(Oe%I;DqfX1-?G z^rsSR?D0))7%rXhd`1uYmi2FMfi1m;i|IwOC9y5Km=*Q0iWcQ_<+uR+1*@~ZF7J6k zT^)Mp{J`_Jpx{={UG~e{;!a3=5@;%er+6*DtKvOD*$405Ingu$SrhOGzzjP{zdyiz zo`O9|1hQI6v^2ZJk6|)PN+*X$<#uEQ80jS_k`b=&el_i*Jro=*K?SLxvdM%i!(n&V zQcR;cDDl})9uz^zB)mp|#Fyy6_Ta4wrs6oRn{)yzdEg|bL?@_vy!q*<$G;uyzxxMX z!0;!?we*p8C27(J(;dVRc@d3=s_glrAmS7wj@aG$9(SN|lHTI>sIJR~mJ2H0C+%nX z=%hM!TTsnkLl}HMr^#WJz)={~S@{6RDO7)`v6*+S9bZj8Oy|Y81mQT~Zf^db?Ah{& zk|!dfY8&dxIxeq9!Mp+=rQ!)HXn$hk!LL?MQ;s!osgd@q36-@6En*|9XM9IR%5C@v zp`2(>F!D;|0xPwEe2jW1_C|HP&#!W~a!|`^-wzEA2SUwUBv>yNO;36)QwW&n>QRm3 z%P0)c#1vwrA8jEJ`z~PUw;!`yeezVY2h@D@mCeb|%Heve>$!xR>;dnE^o~)wu)9fm z`~|8ZnDl+ytAZL!nJr%PLK=Es;Etoia+LdI`wI%?*a+BILtfhl+zuzU9lW8~moPTQ z7eb~72KY=U((i5`zTbU+aP$v)MkT((s;)~o5q3P=?>2-1#UlaEBb&7;q(rr(p~)lS zi-y}a+9PwqpMmW7Ran#%I>JL6wKdEw+cIt8(5Kq+6n8brt`XEC!P*8}+2lA+92o-$ zB3ql&>ByK2$arrF7+i?V!R?d~9dPDfElwc-`$bR-(u2YnAV44a2J)c9{t$v$Rn2M% zaS>gh>7RAKhH^Msbv7VO8Tik2477?~uOQ@D6}zAxGRNzXK9@BDE1{*EV>3x{m{b@> zeoh#?M!t~|HjHiF_AO!W);md&{MO!%qR$izh8$F6){^4h-~zy~P?W8Ge%rMVqJmJ5 zPB-gkJ0uY2Xl|4F^%~DZSt5M?7*Gt&?ld2LJ1+`+6n?Rf`bn6g3%SH9+A3T|PQY4b z9SC-GukakX)9psefQE`magXv4Via0qNZ#eOBqsPOoN9B?o%SN}ad8Qx*|( zkaL?~KC+siqvbC$UkR%tMmuyj_b=uCN2k}GgZ-L2L?Il%Y_r`7s|djcxH&H0F8CVT7SEl~XytGu zA1Q}M=4-ku|I10bZL9Uxc#;}e57hG}_x8Krqd`mX%fXbhm(i2-casvO-->ZSb+!$mKeV$A~|WRGeDx_l!to0tAy?!EdK@`9FU4IJtGl8pJ!BLv~eq zNO-5=PYfinzSRwelt+UCd!evpwKNAC5L2JG+nFsD4BZgCYC?sx(Eo|PMuvJoV5>|* z{JsB@f;%`;MY^sy-O;gG2EP^ZjirNC8-@Tfjn#21zSA%WKVq}5V;Nnx_nuru&`6{5 zb2$=62ZhI33;p4D$N$AfO&EJ@ur&{5x0<&6&;O>{aWp#Sklpo|3?9Z)UpMoy_N@b{ zjA+XE;l%-#hQBUaM6iu;G5CC+&8trsS$WHHY#1$#o?|d@qBgm|1o7M$fP>}twTe8A z@xZxTwGqSQIcFjgB_$e21IGvtQQ*r<%1+5IP~#pEu3QBnGr!t;aCN6JYo_P4BrG>1p;xd4D0sx#l;|>t2RQ{MQL&B6rAeu8 z_uIk2dl)VlAo0Vlq{p$8*H*eUstev6;wB3}j^UomVD=C8_8rMkGTAljfza-#Kp2<~ zsfT2q>@}IC=p|@S_+pHKNEs~+a7C^mLbLdkwA}H~sl`uPR|MP1(GewnRYmbfP|V2_ z3sHcW1%0~6g`(&An$7eqn>1eziO|DZlBe#iPoHGd*Ed-7-kdXhXXE1+^|gU z7uWO+{tDm`(IZ`ciR?oMBcRs1;T(GOc2gbt9(AZ?p=B*iA!Y`HQwngjfBO1|!xLMc zds0lmDS&TX?>@jze+ky)V=vnb3P&gB-w)b!d7$AW+}O;51P$C*+!2+)TVppg0^>FL zsBUA3y9`GOH&zRcg@k~w_=wemUj*BKJF}35PWA}f3cIOWtGoIhHxn$0{fc(x=MTWy-_`FS8USr2dR(YuvFv33 z8b(%?uvqzuj|}28$>WR zJJE7rvYUZc&G)82i)@$rW$+Pv@D%?VKT090o9Nxyn+}KIUui~8a~YXtC})1K1jAvX zFfu2$z{DoTGEtWcbnpu1yBor@@NkwRwW7M$LI-t6%$taRjJ~*@`lZl`jbGq0_R*N$ z%P#V9U5JOf&ku;Zay{>bx5*AWC>aErUp`R@9bOJY>G>wFC8Ejr^qr6o_$NBwaGKT! zNY=`|X^->!XkWteMoj4H1zd;KHiJI+Z~_(frp<;7{vo#-h8GNaS-tf_yJB${1;+Jm z?!SO?wEFpj{1=?}N7QfNc64J_y<`BQG}0Q08}$}{F!&hBhxjOdy{VG5@Kt=ltKl=^ zo$_f1Ki0#!`E6Gvv!LP2A*R*BH#|Z^B{I@cm5HE4rHg3(4Vlg)N(8t5gN`1h8% zWh^Qj%0uXJBt!-xXmP5Oi$?BR@#<;hr?3Bc#o!>*(Ic>Z%qw*5)Evs^RwtK$7p@+Z zI`mF&cun6%S8$7pbZ?c4WVI3L)o3KVXu2lbBjTp2>71S%Z|}qXGBeR`#NqmQ0b?+u zxQH-Q2ksigF`{ef3QaT$8YUII)w8Jp{Iw?HkjV;b6e9!cE62pqT<6GMHFy0Oz&P^D z{?_K!=H@qpzhP~^5bEdj^n9F8FHcVq=;vO9^uyEadib4a{->w;VlgkzmW$%_w9}bZ zr*#f<{H-|UDL~kA|5IVU`9x&TS?h7RsC6 zyof#OTsJ5c-t{<$KIc6DY?wr>frlIStGgRI%V(-$U%`;3e9vz7Oy@dI4sqj11zf_A zU?G3AL7jA$IYw|kyYa>zw*rny^`M9)EEj)lhLX?@x;&5QaO20R{x`qA|KEdH06o5d zS3_yUTr?;sHHe8*6b@ISIN^k2tVn~#~gGFeDh{K0{;8@Cb;oF9Bo$LzM3PL9O zOX6Y^U7_FoIvbtQo?)!5O1-v1S=}|#FWGY2#$_T`wG^*uOrGnu#we5$m#335(gPA1 z(2bmyih6Aq?oE81k&T7H8fN8DEUehrhz%bOx1JDpWtrh{xp)Gv>pY+?kb9JBscC!a ziF-=-Dl+X#456_RF`JUs&prl>7Kpug--RmSX zHu!y@NaY-f|4gnSa~<8GHPI3ch+>!%{aA^tv2KH>ALUVyl3%QRcx%%?Jop%k;p|7S zYwGT=!P8jU!wH${hGBe@ts6@neU#Gbl9df#u~&yuZc45|SaN+s1Jcr?y7%idG9_|Q z!um{Ug>%0t(PO@(baMPF7#e5Q(#s6@Vq5E*;@`@=c(}>da?bC{!OUD6{YhUfp#<6E2bI1_}$qyjir2)^Lxz!a^xyW_f`G6|Un0`7(UUoIMx6=*0s+;|9< zRpA}js_vcKL_=aK_=&%a+KKN_t_hLQIiw@ zO`doI2o;|A`}j>CzPYdBNVC01rHY!v7q_+!pfaNl_`9eNwu14jVZOiZBT;|zF_5rM z>*)-km?cFTAM5t$@g8)){RaE~h! zC8<=M4JKxH0I1vFMH4l<>u{HD?8)eT_U8hd@Ab zdmulbvepO54?P{16}ip`=n`FSQ|P!r{D=iJaZ|LElWM3=s%DP#NP(81S3Vdum%nyY z->+tMLJWlI9^(i*Mg(k-H%2h62tR?ykA^oo5$FN03nM-FHBRhqp%wRIFdvYj|7AZp z{(k#t_YG2xf`NDLyI=n@d!FUz7;}@+L;b(h* zv*+3U>eGE9(;t7_K82_XSr5&KLVw7!ZYPX=aQuxzJl?+T>gTUN9RH*HBI~ZD!y?4c z@Bt~}4%>9g=D@Jg&ei?%dt$fX!~R!pi=02*7QZLSeINr{lX7=unk}nBe@y?!Xn6Vu zX;_c(Eo7|E0VSVL7sJ1dzLub;|F5FyuiC(WH+8Srt=p*kwha>kPi$DrZnbS!U|Ze^ z%YR{YY+H#l;}Y-?q=CuX@Dw?D@v<4SH9_ts^5=J=kn#SY%RRX z2DJozQ1XY#_f=>>_yh}Ek!@Nl*ClQucu_~~pg}ARe)1~v=f?I$Ln7qA3q#)AGCDqQ6&;M+0fQeg8;x9`F2#)=kt=we+hUy zhr2K_*otIvWD^U{Bo@@hOG$gCzFOW8C)9VkLHeUl_>wXDUtg>>zYSbrK8*{$eql0r zn{efR5{Xzno4MuspbV(NM|Dwirb1Y=)pc7~r0HbB6{kl$e~|{p{7n2m~Ks}BrQG> zrb@IKE;+s)57;?_eu#t?gb%YEL6do4b|kn#!dPslLSh5DXVw}~)Ca0b+Y@4QBb2*! z?JIwY(yu=Hm~VWaF$!h@K@EeE|FSYK?cq9Df-@K zVXPQypF_H08L){`6&`rcJ@C9V%AcD&z%{mAnL5+VNo}k4DvJvChs=wSMcY{Gau##f zX5t!!To$W%ZhT(xtw^wV9}zy)KkZQj`l8PtMmy0@?3~-M>`}a>fy|^72h@)JzDiZ^ z7ReL@d^!}vfp7A1c&9cmZJSrgiso@K-PDV>Zh3K|lf*!_ZW~CW6f_RS%8l4lnudeR zJj#x3Vy`)>BJfqE2H1S126ud{F0_I$0s`V^M7@nU3s0gMO23k;I8MML?`Mq@9cMMb z8$bTS1L+S^^x2K8Cw~kU6yfsaz^01c(fuj{37lXmgUD#(q>kh!#7m0=q;MKCPM<`u z>4H$d8!dw}f7ys6WDL~t^#SKuoqsNZ3Jlu|g3VAkjj)0_uqNOP&DQ~bYwatya(tQ- z+qb7TTvgMi+6&BezFbrg7KhcivU8_=&UsoWPBva68k`7rw5WuEOGPN{TR10|>I6Ye z00fy$24cH6PnR=Pkiu{{BOTPBDkN_97Quk2{#`l20Ja3!s%wkaS*nU99=I?pyS>?jXk`pwoR?$r+fR_ z-O?Ec?h@)=UXJ1s(J0(2z&l0UM-a~e#mJqf&Y&wkw{#X!!0{VH>xTA`h(F)bR&tS8 zlokq8lkBRtPQ->It(VXK?vJ}io%wm!?;QrPIkjtA7fxvEkBZsi3T%5+$jVJT%g=!O zWAtq`y=20cgAKk7vz&5Aw3Sy?tO~gpWQ&qlgM=0cgK2WhKC-M0G8kC96gCmVlslcB za_HDo`7*NjxQ`w_96?3ssjYy8X=yqU$ZPi!KUOeiQ|DFoTxsFuuQlp z$@OYmDhpNboK2FUE!;owE~>&qd%#r>+} z#boIE7>Z5Rtn06CBqT744L^LPGNPDiqd zrDb*L-m;?zL$qdHxcM~PO0Tm~svvBm+ujH`%@<5%@QJC_14RjJs%dCf*v6s=Y0+$3(p9|5)4{+T$+|m ztZEUK$G!>9O47*EI12G<7-`X*4s14x0m4i(MIUAW*veikWWF&FUpwHi7$qdeKv=}t zsc)m^t;k>?fDw_tM9ekf9(y^A@tYoPIrVEGCuWUbD!4CfRwM%=OEH*@NYx-E8Q9N_ z!s&URaHqJMP-K}_m@?cu&Wphetzv`~si^rQZ^VM2lYzg!RLu7G1B6Zre@A{0P4#2D zAC7+dS8;;9?SEX0@B`Z81%L>3ZVYgj?A_)>!A zznm6dX2rStb?k4Oax@xq8kmJE?chBkT}h=7u#pR_Ld9D;iX>|$2N@;ctU=tE77>X^!`|qlFCRUP zM4F=J;@DGhuhBZ*Kc5{I5-n}01hz%TTchgaY{Ln43`6hM;O^uw{>EMQBD>|*L`V;L zMZe#*nv50~KR7!2aCp*yw}~gtFf%XAmwqI0$^`oh=W%B#DJdsSQ=pHr`12*l2q!A? zV@aj8btr2Egkt$dc?TKEf-kZ;pbe}t8nB63E#Y^HZQvNy+XK%P+Nnl-X;kMLHU2#w}ftRU_U?Bzm_94>rF%MkJff@LIUr_R{VQV0VUim6t}kT`k|1{!XBu z#<>l?y;bsUlYPrr_Vv>5D*3m}x}mWAbuutgRl}vC=2NUv8cAc9$jALK%DtGh^RSeWa8;ppQg-_G!dd-`0P`bim2>vblX3E@I zPRS%~)<(i%rUgt9;)%H~(!#E+z?+zGsWzR1_cTs#zq59+quK>j(wH`@XxKJV%tA|= zXrM$`-`Vlpe>#zB^Y<5OnN1W+u!kH$L@(F{k0hh%HDq^IV~;>krf3Xnzuqh~rbWQz z=TI-w77!#ogkxx<+}RWTJv8Ex9>8xaMqZtXV!6){)dNHeC<}=#kiLAgsHQM9*r2W) z(O8s5%6gedZC64op6dv-Se=Fglkg?BEbGW%l2WBAGyzIIiy`^r;t!*+Dj5FuyLXN* zPiW$CJp02zvw_Z+9uC^4tdfz58Yze}(4)2wqv2W`Wf%a;E`Nf9i{r}s__-P=lM3gm zZo~ctUHXK}*7XHPk-EOu>^e&YJl=J{-ttHNM=m`IX+?1(6^6*n63fADY;0)oVVCrN z$$&KJ?VD{G?rU)@EEE9(t|8%-KS7P4UiJVPjalr(id)*Bk$+ zoE8a6R1V?JVz-jxVBD=HjM{Of>J&*=CS4Jev^0x_tB6y#))>+@E`T02}5j&P0ZA0g8!-I0_-@yT(Tnx%%KM^y4st~UP`p92=0Ja{-d zb#N+rw&s~T$+z>RmUEb}k|b)uN!?x#A-=e-u#!<3x)MZd-~j->2>SnMm;fL&UXBW{ zB55rVjs2NcykgQ734VaHlJO7O{MP`)GEcgMDJKJpSx<36O|N`O$v3>zTTIz_sZhq9^+5RcaOE zhhBa&*rLzEtp>=U`l=WOaa`)>G0B(`@GpbbnvO3_8$bQuyn%vUmVn^cx-f$+Ss8&f zNF?*(gHJyiSc8N%Z4RWxo>Lx@ov1JOl$9VKlxBg zIw?$i>&eHi?rFMlI=K`ZKjX%$H@|I7nJ=m}$1^3V)=4F=5Qd6R5!P#Eg=jg2!pw`@ zSKIikAVcW^Kd}deAC}XhSVVp{7QA+6d;jFX>B`26cFT0>YFDTob8m6!okgW=m#=jt zaVL;AlH%EzFAtKXTGAya__C)@I^0tLhD}Y9(~5zwSF&n+KST6M_HARBA76xbjj1-I zu~yzDAh(;Bk-UMF1cISC3okPH^r6i2<&gDF`C=&F$aGi16xZxurd(KItraM-WWSPES@0V?rURd^g&O2`wky(ef#uTw&Iaj9*9yN2``2=fDeVwjGGMFn+&wc@0J&8 ziB~9ZWk|$*ExhyjDvdb}4LyT@UU=EqN(Ifi00d}aa&7a79+!z-$54FiQSuBA6_hJm zhfA?Vv;+-Q@Hi{ZbF5h!+5qL6^MyvF1SqAD^r$CB^JLcaFc&GWV&drl3g<{OWx^|3q72xjk9pjlF{m^39eQ ztkfuBpAv!Oz$QA0s948pw2=vk@qpVfRUD?gmb=knz4^-4^8)MEdtHQ#)8JN-W8fa{ zbUisN&}uv*gLF9p#sA_4gLaEK%0bg})gfl{%E>+xh$oh!Z&AM~YXWev)!=N5S znShHx`lcY|no|a_*Lg7k4+rDDaryOec~LCNi6#JRsU+9WI_KzVW&wjHkYA+Ma&YM3 zGAQtVHrEusVjKosq>GXtX!x_`drF$B>|Q&QhJT55pW9uOcOP-3da78M@#*_B}tEmJP*u9dR*J>%kH;TCyP zjY_A@Q2GUr@$hKx$L$lUlf_5IHG)F`xu9~CKVQ_YyB{y=D8bX68TiU|yd(u)I2hs6 z>JH-dqkI94yL=AA&VZh$;q}Kk8~ZKj$N#A+AxwCu$zq z$QqU{F7TmMOT~wber0lF)YKW2G)@m9zl5ke8>T=BbRaIA9=v^fynDjcPN=81Qt#PK zZ~=gOrGK}$PB8cE9Lkr9>;<)$rT)gKsLRVK^~Mz&F0#SaW)C3XrtH0j2nKo&hB-(T z&8e(?R|9@r-wjW(>kY+<=2U|H8$5n$9+Q+oc!q<{e%jkde3aMQ$GfJT{kZ)-VU_j| z`+Gm9`U*b3wKEBB_6Hz<+wgc5WCnzju_3T`c&J&7fs+P?0l1M9b<(`Y6p|)^$AWd7 zT%_s=y@#EI?%Q;!v^9RC6Lefxpb@!$Uic5uq6EVUxpDUae9u}jKZ+-ANGH#K3}OvC z-TMRou`)&Xx&H3I)-yiTBksSfZ>HzplTl4j=4k}^=%hM!jHsHwu9nkLj$wP|fe_8d zO^R5&llc>Z;d7G4502i0aoByJ%mhU~TnFZ^EDWV%o^Xqi^T8YCss}qV2>KX&@Gtx6 zj{7+J$PL8jOsSxX%#kixf4|vn>(Og_*#rEyB`CphQT+NrJTzO#&F>}FgQEZnUkXmW z=}G5bsE0sT-eah<@n6dD!zV~RfbU~$WmGuc?AWDwQ+zJZiye3O=jVW;6k z!SUp-(E~Xbdj~t)ho{H8|Leo<{>h%Zio5?zk=v%kWVUp0c<|Hi(ed_MH-D!Ab6ARK zI;+Uks4#{j;I)e%MJnv*IZKbEy~47@)!IUx5m`Qk0>P<+w1lhj{3?`vs8TFR4^sUY zMUa#Th?<(00Wm=+&@#cLkDmrQCfH(7v$8CJ(~JCg75{_E>^eyt@*JN529-*?U^H>M1)FX#@5J zL&GWJW5!Mlk2E9kgj|oD(#o+qpc@#5LP+f@Eh|FckYTrn`K7NA=+SFL&tQ>l6GqGm z289kTG`4Fh)sf92QAzix&kXCta$=rhZDV4B;H##B2zg-;zl&r>U90t3qD-Ry_I6xv zk!(+r=r-gx!Ov}9E%@152_PQ_Tjcr*`qBDS<@+)fw~>jpcR5}VHnUU{3o;v_wZVa+ zt6d%QZ*BG+*#7AU9TzC530%9K^&Qf}ACW9LuBsU+$&?UY7ne}KPqKz^Y>vhBUlEF! z6~ExSmu5sJ?bJO#J*J-eV6c6K2A+Oj>?kVd@I!7h>A%YP&tFQhsZ-@BdCZLm z$mpg2n?vvee_nZb34_;XC@kCjjaSYuQKui(KY{%F@bVR|LX?8&K7Uyn35vg=-E&{s z*lr~?I~c;ed6?ZgoK#eIGSx9^D9%7rKvkiWWj|r8e0?Zfocnt?^z_$WO=eQeF$?G# z;HKtqAB^2CT61+hDKTTd5?++QD=rpXmmoiavQd~VQ&7eX>O=0tx!bvBh}VODW=CZkbfi5ZUW4uftlxbDk;zWl*fpm9IZ`~K6t@MZkr z4#FTk7JxqG}VPQjB|=Oivlj zlVaf!P>OgRe|9Uy$Qc4B;`HAC=As0!KR+Y>$Vl$pcv0IsSX7m3`g*zGJC6#M5wwX- zadW!-Svh5AiCfQ~ai0J1GquzqqrNxf_y6M~g8iiCH5@iZ`wu07pU5zpL-HOtx}8j3 zfe#w@j=R8tkV8;6)V;6OwErGXXlE@f+{hz{?PP~?^@FLc52vkGlQ5n?yi`19A`Gc{ z5yQ2;|2%^)QS;$CkZ}49?n%0>?O=CY&^-hJ_?SnxKEqc=!*HMCGBk~dd;5>@7RRsK z$Fe?~raFjwvEz|<#w&6%nWZ~9DJHXOPLS>r5$geza8^kq8HC~IYK9B~HqFc`U~?Ku z8xl>kxfwdPhq|2Uw#MD+WEcnu=DZb=a z0CpBMc!|yA`juBXoqDFhe~3OYI-?I%BkP#v63>X}T=edte@}FTvE9dyFXJ;z4L`Kz+YfPT|@U+uoeUZ;n&U0I6b}L zkl)kIc*N4X;*7v{4XK;fReB}8ya*ewSmbaugAQ1JQ98m`y}-|u@?hfd5eIQHgMu~D z90FXR&5zx6c-9Iw$H3q)AJUw2WEA;3`0ujD%rF`1N2pe}FoMa3#SD`!@Xj7B$@7l5 z0FI~65btx&0p*{HVkQ?ED^>WyU*rx8Zc6?}a!PY77EX6P$y_=>8sZOp=tUVUpXW5^)wgEYx^X$;r~YpIftN|vh_yP9Jb8-J4@rXD zoTBH-`aGYHBpr@y1<4Ywcw54n{E-_ox(g`rBcarCMhI9Y9JeY!y>~Q>MCK&E2|737 zhL3Ms_dv^SOBWROu&B&c&9@tVk@_)>O}?_dcbQ=1wqmvIczK2=!&}zy9c?)fEBclY zl5m=d{1=mFQZLW?_Rd>Y&o zyai$;;Iu7hV-vRE?`~N18Yb6(&BS{jzKJo_qvwXh&fw+C4h{noz3>Hqs?I(XZU@#cTFVU255l)FC{uZ@4cyX~hF5#(F8o)G z5Br0UA5)-QCY0(exVynT zb3V(_b5SldiT$DfDQ;R zf*=+Y)da}RAOdi2U7s5HFza~VQ+J)8ZMdAerUAZ1o)q{h3<=>N8-KK#sdOIAjiPGq z7E+^9^DKgdGp;kZj^%X5>$*^rVo0C};N*#vNsRLd&VYo7dfbuXKtwT;!*wUH9=9QS zfThzTeWg}Kq^@vHv-OO&G{*V=d-V5n+W0jN+ouFYc&mlSXpdGRsU)BzWuOlSPI7F7 zx0EkEBlPmiPZ12}nt%CqjA~h0;NcZ{N(ubckYVgF1Xakdq#^k^Z&Oe$>KFzEvzt|V z^4t$~!kF(KlVONMrK@?P7uj9~yYiWbWMXxzJRB+^8y~4cr4bq_nzviPun--`DX`}!`6*rsXNF zz|t6esEmZ!er{H_%1ujrn3ce0l71#(QNN=a1Aoq%IWb8P!sFeOcR!q-?7iPT_;4ci z&nQO?fwTxx>rA3@$5iU~b?`TpX2mB*bRD~!xRZC;+IWNC*UQu9xNrA~m0_rs_Nfh~F+jChiR4#)?fJ$H@Uyxr;voTuDI+a!ae` z$pZa89Ceh+L#ygn86>HETo;M~8%+h`5_?*svrNWOhN(0^31C^Au!pZUNgRP<(h&6} z?D{1ZU^)u`*x+Q+MEGQeP2r^bBiv*dNY)XS#C1EGna6YMWdl8uD?}(c^d7oRt+~Nv z8lO3nxQwS-3zj#K;Pl#Q&&y1Wx;ZSpol+sU$D9ZrUjV+orlX(<7L`x3_<4b)c$4W@ zQS9xTGfOS}dA2?}!>Q`F4ztmjjranqPJn<&@yeu(>SgFgS6AlFYN_pwgxi83xt6uj z5#HxtO+l-6KiG=@03ulX4=&lB7{r%uwi$dM_xq(Ad~Ie*=b$le`aCsq-%+r0G*P!# z0?~?M`mIt8it0_##;{ehuiNj4C9!o3gcW6CwbUujxMuHkL)e|LYsiSMx!R4ezAvxc zjW5Vt`ybxD<0#=0c`a7SM2Uu|ey$p)>zoX4~SsSmM*fd(PZ6OrFGv zf@ntehu~#mElkzIgK;B+UAuGfN|T7IrlHO{u0WTsKkJfpumhQU9+`hh3rcHYIXmEsFz0wKUMqNVUPOQ_Y#Egf%BSPxlI4Q|2L z^~1yp>5X$QZ>*Gyur4`U$e~;9DFod}RSl$)d>o8)1$Fi$!I&(bOVDd1z(+D6Os>2w zJrW2a9ZLOScM>77Pm8WQx76X;&6=qYVbIEGD7G|na|XsK<1dRkA1?-4T$}@}5PuJF zSb`$%cmoyJjq`$1yhkD6G~qm()x~mD^&O#&+@?`iopOWF#wqq!ZVKF1u})Bfsk=`) z-J~z^sKA*5$WP?3!P(&XSpiJc2CH)iw?-4Ko??|?y+Y_E_~ZpOdR<=jfgw484#p?J zQ`p=fC6Z+;1!-k9)59gB=5?0OoT^DXwfWIWF^(g|$a>*3T`9ShLR-W#DGzY{df5|^ z<&ua>nUiX&NqK$@<;q=05#o@f5UxTZ+B6SDz(4pEnUc5uH0qG*Pfds;R=SLvd3FQz zKY_?OapJhYuM1Q@mGOYofi*w%*aZ*=Ym_)n_10=U;jr&a+HOftJtypRQI&ukIu?~c zv2f&3Ov7OP2~ZpbP!arMi5Mia(!%sG959YVg6y*~WbYNoY$3PKv9HgCutljJAs#XG zNlR++teeZ6u4p;Q`)FSp%3=?XF+<7Zb1PTLLQ# zu$IaZ4Eoz2S9J}`{BM$#X(oIsg5C&kd3 zL!1O!znpG^AaAJV18$Jc*3s;F(O4hcP+lQkn>EHB_HRt(6D^^@1!j&IVZjHF5Ex~P z1iGQUag8tXIdjjxzMUH}RwWK2F7zdCC7`3uHqMU_ORBj?*t(`thwk@<85tM6?Kzcb zfhwfDg_f^oWQ%ST$6@4Vai!PGi;MCcB_4*ztC${X4o*VzC_>)lZt87xuoA>gP_6@} zz(=r~Ndi<(MclzipOCS4Jj=bKYUv({RZC;MY18KLJ*W&~QnQViz*b?Po0wo?W-Nc2QNGSK{>K6a0~8?Xaz zkuD2U&$9L3UN0|JNMMbu9v`{gW`d2oXw+R?4NTueq9sL7Ab3m!5d0cO0y8aX;M_Sc zrH|ryBl#uG_+bIp4{_I3dGLL-Rx!{4keXxaA7kYJq*NY&_BQ!)>=4~eR#j#e%ybhK(_e@Gl(g-0qB6bASJr&!j3WJRuaMS`_Tx{AOn@m^OVy{^_l zE;DJ%2Hv3P$ee%sFW6~Mp8=QZVT_um5 zLhTfglrMk5)&72W=ZC|Cz5SC@WX^K%&72RbNrVLl%!pdSTIo;)-%ma8{wlOq@#4VIgs=lr;@(vNQXQ#B56i$E zWCr%?#=3)q0B&9m6EyllpA&1N8hGjUMVjbk{_Y8JH_NW|OWop`5=;m;dW=?qN=JVW zmh^d3MGPv%S*5nQAU*0kXtB~y)jkjJ|B5ZC!F)n;xUnxLQ>;SMXs5P0V#T`=dRBL; z5dhdA@Y{K4d>`xv$1nf`X<<)xpbh6^5ME2G(=-@7z?-uXx*u*fpqs*D>Mhk#)2O6` zDyEgDDUJwE=`Dta?G3tJ^G56~I5rkmiOcAIZPdB~n%KewS zA!LE2*0G#I*ejzVa`$JX(lG=6@$Io=;5VSua1R#Nz4bg}wYsC?zu_=<+#g+LeCvFr zTE4Kdu$@V#mQf}!De31cqd#cfK^ph4Sa+EfqoC_ zP5WR0rSJ56cPqoYU5DKiE3m|Z2e(j+8jOo3rMNcNFx2ju-KazgBWw3KzK3E#hvp^5!yp06|mB!A4o{i4s?g zy5aic4#RU4dixe}soj0k2#$5Pj-Zh3pX_3-U(3i_3y5OkIF9+{&~qKg!l!H4@?7|o zX7!2>NibH}v~s#ElCNR^qYnV54?0rlfe%}I%@d{;FY)djL+u=xuG9kocVPDDk%UbE zuX*xa`8oo2O&y&?1&!aZ1`iFZSw7F@TfNj`&U|_H#9tRjcQGhWBeLyF`;98l`WeicgU4M9Z?ugj+R@}IR*!)hdvTag55sevL(>xv3HnVs$PY)~m#@WH$qe zA048ah0t_RKM|*CGw(PW^Kg}l{KpjJwj#85VAotlqPYr6$N~3(!|?v_-R}F{{gdsJ zy@P$WHa&Ur^lyLbfAj6&$tDpQ`sCnVsnss;<^_&b)7$#`io>L++WCmU%-GPgKqpez z%YylO9Yj2c2ZQ5qkS!3RC^%!o9(>@MAU_A+hYu50c?GC;ZaC`gRDTjf#B)U#a{TaN z3_EH>9Dx@T<48C^tcNO@JLC28jBw`E$y&{$zA)yIBTH(D!>9{WOS3H~C+x^Z=pgSp zE2y}&)MBMvW%R58WXf_%6TbrWpcnS#Uf@=UN-((V<}>5lQe_74>7d!QApF%>wTSjO z6`|#p8g7P3zBo^7CSe~i>ps2RO~DZXIz3>sdhDJ{zh)898{+=Z)4a60ri$-}l*hF_ z(BNoq9QX+XSU4~^U?K3cT7Y3;cr$U=|H-m8zAL#28#W}U+jAXf2B`rj6>_&1RdN9H zf>zP8u(nfh3TT1k8cQ?CA!qL`_z=IiJKeSPPp9f@urM>K&=px}_17>9Tw;n4=J+^> z!y}+%cnNuyP*{~fq4^gRl=B)&Yrih0?hOP8-=U@WvdRv?d-$OK&EtQ6iSAG*+Gek4 zo~nU{y|z#Wj#^^i`QhE^s5wS@ZB%OqD@V=0^s@VG!NxEW_LBcrJjZHKQNbr$e+T1f zs1{OGe{MPQ| z+f1NTL2Et`D?FTQ7Q~x&(pHjcdIn9E6e`)1DD^@mHcWYHI%2y&@4Wkf@*4`J?EmvI z->K-1jtZsN7v{pb8zqN}&Z)2HlcI1QNo^pY@0zPaYPf2xoL4$Bj)-?;T^PoXVv1$_SCYT?C@EaN5MrGttbcXb83<% zhZA4LxGHSx4e~%$_lBEl{8qXc4m;sBqM~JNE5JN99Y;69R9snv%+z6MW(vi19iV}} z2HV8u4LjhUg2)ZY#^~A0y;Zxw1b=|VGUphNB3okMTkhwMQZriv zJZQJk971v9;}fjPmpzb|XyeFAB;Vf~4jMxG2_$SZBAX<_DuT8^Q%}LtUL-KNWpkfL ziJ3^yuAgfOu*QfeA3oN1#2)s8XS#DwhTIJ$A;X`{YR2hdT8-cpIDXO-78xO&a;OJ1 z79bLT?P^feSj!6V^nVD?Db})p)qwVkBZ)d+&?m*|`Q@B!3>4wGpoS-YH zlRGUgbF^V_40Ur|x=zU4uS76)15}|Y=qy~2yq3op7Zb*o7?k&pYeyv0=U8JM?oM6u z3X@SkZ8St)FJI9)PKmC8EAl$5O+xaRt@YO|QDP(@TTDc#EUs(VBDDoQQ&Z_0OS*(& zkDbXXIZI~OEO?1B%SdZocEic7D!!Pk!y=I+ZOM;(Vla{}8GD$es#YNRLdrWQA~WcX zR6VuP%DzJi)eRI|L=kU^=3_#GP-P$X3PWUV%*6U(pdVe(*m$&@bB&Z6qGbZ6g2KIv z9@kSLeVx6WCDio*Bxhbji+y-7bxldx5FSWXYDT8k;UG%D)`|I`7hEzhZZaK8&2P zB$Rn-*V3V)lVNX0n^XVW>B;f-zCwHfH9ESF5=IEBm1m}9MRF=Dz4b8-PqmZWzYrJo zC-45qt_HpAYO5)IUsq}BY3)cO+tzdU=L_lR`?LYcf?gGzTZn$oM#QlM?M?vyenf{1 zjuqUH8!4G=I&j~YV?04BXrsC!k{B_JhGELXq;oX$7RXZ2OJ5Nf0zG+s-q zmvT5S*9(Y=dyVCLV3he~e`|AVbMu?Q-}-~+Ya;TqXJXMt1kCBq;DW-@$GgUL1%IOA zKbR)hqXPt6K--PS{+Gc=saYh@)y!4gS%O-x2yaNey{9$hJPmqWQsSlZE3u2otQ?~$ zk_Mg6N7wK$@*eDJUSP+}OgD2DSo@ zJm>QLPE(Z|0>I_!4lE&N;lY^waQph}23 z@UdkUdTU`KsW+YTxTEDYvV$GAxsAGNjr5{{Dshbr!xi073wlxmuK!fhGxX=91Z>Yi zh<4jUL8$ic<__iUhj58NNCCQ1OdOJKa8-E+HseB0Y=w^Yb%kf~WCfz8$ij_jXnwL4Zz-LKT4Vk_WKoM- zp33iq((sg@?xAd}uU;dKc{37po6frgMW|R{z;zM3cfrs{N$8{$JT1Hl_VHHX_3jm< z!_1d6?7KBh1MS2B=_J!dMtVUJZ(+^_75H<9sDZt|bG4j8rDL;rCKrV}R*`krzcsU^Fhw~rLXOZ7pwkx?vDagqMrtDwU%IGtdhp3JKOswd;5DQLCDRCPx5F! z$dqf6XBRQf0r!NfjE9Sn%a#J?g@PV@CSfqh_C%Lm(&Or0B|E+oTPGrzlZk-p_MYc6 zeB4;=ukr-=g6|9lL@&N7B&jn}azoe#923h;MbCHSb3()C)%PFh54IpUC4*~6ELf72 zVp@sU9;Y(JoxLc(fNRnl&XnqamQ2ulYsAcoXS6=>1H3ArboP;u8aJQ^&zzw4L07^W zX4?(=QF&%*kdO?5Bn5Ar!n6a;@&rZ7kvV@|asY=OP+lJe68opPr*NIb9|f>Sa%;HR zLO0eFOul8pO$rxL95dWNj7O~h)Y>85WDq=Wg5-=u0b{u*`(f(<=r@qgklepD8>_!c zbJq|uVru3F&Q0K1^SYWiX%^gMma zMuQdEhT(2gC7*gCb!bwJ$UKBqe_M=#%7p2fLg^4U`tPx2hm%X>O3a>P9AaWMEp`?x zo5u2BxC^f6hk)zjSv|5FN*(H&ruI=M5+T zy#BWw+HUBYYxw)F3D@ZuSymFRtsBI%Yrx2=7E!Eoe0v=2?m%7be?&1P_Q0dC@sk1R zi|F6F;mmXHptQ}<;=Og7-p3?PVf&i3U*u8rzmno=3XDUGLmH5uN2>)(D&DC|C~%<= zus-MvP0XGkk+y*&qCpuhbbp^W4r;>>Nd6~QJ_H1UMSGB;;0OS4hT;iO44g#gz?(M0 z?j8ky2J3!AomgxyZPvUqn;0mOEx8#eA98MjF# z1XrPx2)LXyRD1yBSB_Jh$1!Tx93E}NE&~4Y=AzIJ=`1^yS6J(O4LV1I?k)TNw6p!sl zB}llJQOv+yLE(@n%2ul_O-~Y@D5=WQHC00S!d;{E0t^HUpi9?9T`|;STeipE!S2z~ zshLZcHdU<-*1_2>Cz?nRHLj#Qln3A%$lZcC{Uc{Yx@j0m=Ho^iay%TdKJYtnUeUAH zO5^0nQ${GB%(?(jv_;XXbP#Bn%Ii`@G8(~h)?ZY83@L4>0|8D9uw~js1QG(a3HIEc z0P-cKrUqY>nby#|0pImO03<}7^?rRd;nV?|c+RoUh8F58M_HrldMfBaV<;*Luk_8u zliy>*^EG}y0}vSu9nq~&uPd8N$nc&U)Cv$7$2s7?kZ)%O;JP(2plS5l4KYXN2cPw>1Cs0CIy(`nS1nP>IX-eihPwl1;teQW1C(;boy9$gi`?3q5*0zb@WQ@bbraho<3>pa z!(tl2v$~ao>pO^W;{wB4{i5S-OBwrT+3yResYq`*AGY}N995Z#hv}l=vU4jCENB>#3$oT2=AP zb*SbSo<7nmIGDzr$%wYQc4r$1>1inSTJMq+UM`FxxZQ5C5Ml(g`?9?Zid5>>%uq6C?;?#6SY2L2$UU7j|cC)>0{M*!)#Z%3F7jtHYF zCDJ6Y9h-PVxhod>UNoM##d`I}!V?fwz@;#*s!z4XtGQDWHQTmFb_q%aW2qvL5WTH}wU>GZvIVTV}nXmdbc3oXB|F>Y`!JoP7I4FmX-Q}{2sVK?;0hHXv-~#RrXXT}6L~LLIS#)&{x7x< z;$<6LLlGlJ?}q;yE&`20yQt<~Uv1VhxJY^j8y-Czdne)h%l>Wx1D?C*x_9RF#MOU7 zIr#j_gapR1spBR`Bb%k~nfGS9b`pS~yEWMsP}rheEEk2?B;o2M?u>D~d}gBv1>V0z z%n9RRHX@wb0#VjjMEq2cwGFA+UtZI{V#WkU8z3;QIAtxjp%Pbexs%;yS+lMJESa{r zP@Z%R|KnT=zJ+v7t6_wG()7Wf40d2r3b@nV4z01Tmqrek9s(n^&!?)~eL2YqGnPH@ zz^hHDh(aKweNk|VIT?O9-1K!yBq&ux)Vr0Ip%2@VieQvpQrOipc`S}LsfTBL{@PGPk7&5vQN3a_BMuU>@D4%(j` z;IjxhN~R#K{mUR?4G#2h&})#66OhE~K+PU9QM??ott$F@$ltGNhAJ2*W>D-jZOjO; zo5i~ZqL;DvFutQ?(>JXfqce;cA=q}j-KljDyXNyAkii#dKcSSGFAGXVhDPDRUC9F# zhK+v-fx~VA4Z{M?ZcpCeK(Gh4B0QL3VcQ2f;T|0nd1KdiWbS``n)Fu6ci>C=meV4v zD?Bs+mZBg<5ccU7#C_rE8evFa99;ImUbv3A&ipk9bM@m3(SRb>7{KmHnbEf60F`&` z$$8QG>>zq}fSjd`KS44`SdKU3glTgQLSo~ug!H=!NWX#IE5!P3CK1Ltguj#@BY&y+ z#yd-`Z?Dav>a(_Yrz0Td6Hf@%uiubZ+ENuw@jQ|$@{}B8(uy!7DTv(xxExS;DYyvQ zmF&MFhY%#kkRKs*s;bk$(;@|6dkC1y`Vj=92-F{zS;?nhqOHUsb>Ooqn?b_xZH_Lo zd|G&vv#e7?U78%7PEbvSod>*O_Mo*^LtljOm~ zH#*t1D!*=$SR~Ind9=c!}VRT_$WT)r6mMfd z)Y$|?u$+S7(2|O+1|rCQ=hKC0#*>|@2ZdbJv{`h{f?XUfHI>Yk9P;JdV7XKV(j)83 zs01aBh?gwLx;z2DV}5x#cZUS1e^TTOlLu%rMXseTk((&raI1EK21!ZOie<5y9Ov{D zm2#ywU==l;I36}G8w6cVkW)l_;qd6-%AxR#6Ryc*NXC0gQh4se4A3PvUXNxC>^?|(ePb4ilZZIYu7 zelFCU-7jEJqGNvMws*XA0=a}k(3{5<`H$I`jE-5(<5SWmw+n_mfq@o{ZKb=K$T+1Y z3+C7yFbrH9Af<}SvFP~VmUc?`=c38Ddm()i`i+j%n4fO%3TuIk2Ny9cM44OXk6AQ@aUwt7aV6P z)Ge3*H*p0Is>u+B_L7E-((-af1<|->m3YqSOFk98NLx6KkKuUGA>w)g64Dpc{tc%4 zCh%ezuhFYb+~9fh8*i6dgfAC7F}}tq!a;5-90A4$kH?yNFe<^OnW|#xV_*1kNnN)C zKMa_#Ej3o~U`DdGiw4)@N@u{3#Hu!;RadtoiSJ`@)lIjxe-N7B-wq-wro>tc*{W%RL^=SxUE4hPs}=DC z3r%G+@HxU#N0pWhL_p=-r z#H*};IG#C5V|TvJTpv za(=#?K+N;G$W5$4WhBpWh#1b1DiKLt^LbfZ6tz00qz^dGP=^j6nNU{)MU6rl2>_Mk zTsW?yYFc>jG<8I!^59!6uS|7>3;vh~!vHIY*$un;h^g9*g$`!-7E z-_R!4EbcjehP#81q3R7D7sae2!W!iex$#Rh2I(w~$2mX&u-I}`E(dPF=X0JhqAVfg zz7HipxoOSq{dW-VvZ`_N6Q>qp#ipY{LNU6+3!|1Cl`BVw}f zW7O8e6QGfod2u7PIKVRWM&Y*Hvu5=sYc)xxH~HzUg81Jv%ossTeA19az@b~cB?*u_ zA`=qA24T%od<|>R)@)2lkiNma^V1Zf-EF=xXrlDyUf7@O2>#WCwovayD**iId$Q!b>v<7mzhWR5*ekZj<4G9zdx0%wH; z9bxbsSq=oEp3Y5M7XwLLPyn7Fw!xoFewyp4gKFX%(OjI<8$HKnR|fYEE@B z8sUX=ccFnD!VZZeE5LQ*!DUI=!&2mE-@A-L&$WZ7QcuIP;=w!boR!Mw;H&adgElYj zJf;=(_TsV;Z3(Syez#^;yLmoBG)y(!K680bWRv^klYp?+&kQn_Is zJP1l<#YHZXdnPEzuvn7xXDgoN^*F|Nw0$;5}8aDAM z0*aLgVY7j5tKgY3y z1&|O%2oE_o@O%;Y!y-avXtWg^k{{Nx=-J-rCI+@$8l>GKvz!5cY<0zFF~c5FP-+gZC!P9pqy}JK69)XP2)_< z&x0jQ=EpM!!`Jyd$NEMz$Y4wht$wtTy({w1oQJ{q6XgW2vji@E@?KkY=`;?w;o8k> zC-AC=NfSZKxB`{AuI{C;tHdQ^QqG+^c3Cit=S4oJxbP6n$C|Mra-9R$*KB+~e1;b6 zg&MFaWyS3@p@&b(Ma^3Auhki5GKengEv=PLx3Cs7*Tq~L`0Os#r(zx1gkwzR($eh&;Poj%JOa3mA}XJw(_Y)`jJ+=dl^-zir?LA zL8_fza<|uX216k1HqZ7hg`KHnpM3mssLkC>M_vD{JzF^^Xrh+_Nl_6$fo`V74VN7F3^&VAIydo+c51LV)JI4RIRR& zHHjppu$0e*#H9pDX>@<{-Hn-GW=P3^kx@zJXX=fab+NcESbHZM+X7`i&83eq4RAfI zR7m|aoQ1F@!E-3OMgYFX!!H+DT%9WvTSXW`=QKri_c9TNROXeAFhM&T=L>?_mVVJh z*}Rj2H?6Vm-csQa-*1H^j09#np#4N|Dj*%N8F`X@uRfnT=v84SBvgh734M(@~UsTr2`?P6SGMGUELwQ`t!;ZdHXCrr;ZqL;*0e z6iIa#*c^Tp#FLyIegEGUA_4v`|4stMJe3(CiU;lP3^q2cUj zdI##Df@^_eQF7^=YXA~AroOhjVrX@gPi7_1aO#hCT%jw8b->&R(Js9<=bs1z$?JW z6sQ{l@$t0fN$WPEIv2MoGn%5nQw_^h<9wTwWR;x>!v{)X65w*Cnntv_!_@||hZynP zVi<}l(Kkd!xDM|Py^sj<2?)G@+Fayi<-4fADk!CuUjzClVxUzun$#4afEz`*Qx2YX zAuMAp6(hb{PisVwyU8p$N?9(%jDz6Bdyx0x7qaQznVx1CUmWvm?^yNadl8cG%Ats>WfSj*2 zz9D;rdwfHg7wHk;O>2YmXwj$(e*uFeM#i_`5|qK&Yh!fQgu()&(v+@7u#BOJvJ}Kl zt=!5u+gBMw1k>rIFl?%CL3iPeUecB+)RdK%Iv>FifF)ASC zt)?83f!WhQGYfg%9?tYiRLR@a`<)*SPXcJiR=s{j;98plMc{;_yn*|R zvvBA$eg@H*-kh~$u?aF0AD{q`$vY=n)5QtI-~qhgb{_;|3%y=m41AxQwb_xhy~eX! zw?2!eGw4;^JJ2d}4>vMC14D&>4vbzUSka;zR!Ps>JIMai{$N(VT6t%?2m1X0M%1n8 z_j!Hgs40V@nj!uYe3KE3#h8&YLg>@>d_{~@@kxqqk7c{V!ifOC_2%s0;v(+CbwC+{ zmQ>I(n&`pJqS-~zgR*k%!t^0$3g-J=Aq6_GIR_MhbiwlU09L30hPxtdk$zx-fS_FC zjr`F4@k`mqKg$0q=GDibKU@ktSx=vIJJ7N}=w|Dg9Ixoz^!!7q3Ib;$M&;$Tp$XcY z*0RUFcH45EqXk-(-ic>HI_$|yyTO2OF)`luCOY?c(9DZ)0V0^)-&1e3o8%7c=5WZu zCJ#O6xZ509V_Pj&Z}iUA0}4h@TW{3^?(#2T1w~MWjkoYbu44lbp0=@KM;<+z# zCNjf<#R_r!M0JbB(#X(B8taNx6gkrM#MqlSe2Y*G#HFmrpdiJGS;>QaQX9$RB>x{4 zB8&vw=J3vz3r%e)zPNSOCLmdIRs@Ibgd>dVx~TrCCRJlKtxZBdxPHrO$u;8O-F`FK zFqh8!YZScEd@eXWU}L-yr<|@8Ak9w2o?N1?!D)bQ3kXRBGs;XFprioaDqLy&zD?9^ z3+4Y)HD)0FFA2(+MNo=CAtX-kLlNgzuNUQQ6QKjUvkk9!-h4#4bqXkfY%%r(*`N zg3xl=DvZEJhcYQTjdJYvZ3y|t2yGg+Hd12{F$f<#A$=%+`dKiHf5yPzlr@XZ@P1j( zmcAov{gp)2_De>!e0Pd8%UimFlUE{JK;@ot4m23khwf3$d1Pgas^`Qetz;xUnK;;R zwIn7Vcoo@kbHV9@i--iAK7=?&#} z$6Xoq;_fkW;eqqe0RCu>s(%Kf3^I_y@Hhl#d-xENjj$I?u^=hRd+qQmU$dn%KZiPV z7u_gE@V2KA9X)=`$ZMJc+x`eeXWxmtBn82c?L2t!XW0$F0@*sS*3gTGT2sm(Bf+>P z>v6S+3R94c94#Qle?#hmJ6?b>IMGaZbAB}jf)28d+4qG*nk~n)G70}Mjp^Ug&1o;=6-$ z>QonvXNRPqY&nP3$4M$i@hSe)-38;QouePh3HYB*cnEQsaG6adLv3bBmg z91760Rg+x^(NLQEobZa$W|(sJi>sp9l^GAnK9s^tC~cgd%7QD&P~_%eTYlY$TmNdK z4!3KuI<>~GChBuVHvTy2`Q()waX=7^2uu1e@aRXTc&3Po<-4xPy zEN*91@m4Cekw;AcO>=v+mu|&%Fn~THskT_{taUHkJs(+QE+M&esD?t0pi?5LD)R$T z6bPO3@x8a+QX)GUljwvS>V{A}W5m7Xd`&|)D7$sk*Y`3jm4;rrad13WFBZFf?5jk+ zf;%~Jdf1b|fFW58(`=iw_LCcvoCh%c)lBEvdS(by5oEOHd7#2-;i?0Pz9FWp-di z8fDNugGOLkXSNm{MM2wXM_TMbi`{3TR}Couzw7bA1^{h!Q_EZtZHX#A-@&@$2yjH0 ze`E>~t4{Lg(K@HkOh@8u0GoS8IDu_VlE{h@HHDQdE~H{7)dr?{wDflH;pBPt)_R*E zrvcW!3w0{-5R(7HYL0iRGB6I=#5sPY{|f21P888|}fZDi`|`_#yEW9KqDDjohfo^G;t)AHX=8t;iI0i2(|%9jOz@LI}hVBG*E=j z98HKg?k+&TYqGCw`9%e(V+^&?=@LQL_+H>*Q^BzHukRp+y!ikrM!}lC-#-5S1Z^Gr zhuh!nvhdbzl%GIuO3F0Ag?Xdp_{PV-j0#&Idm9}Iov!RQgdL1Vwa-4OA}U5~1Gc5! zC`c&|o%?_ZNSzoDrA55@*QG#pD`A_aXdLO}aIk+Ve<*G~cH?xq(a5Ld!bV+?%~m5P zE%u%DAW0E!Q1E^vOd;w^d!P1s8?u|Z2gf4|JuG)uI6l)L5Y#BSa&uzHa5D( zbbC?cP%?8Q0zo;Q%5gvvZ;<~Pilc(s0eDfXaJtL?Oyjo@Zgc82zs8%SEKRFYsp@(rl8!3VIT19 zFnE$C_JZ!~S3|vP=>rY)Xb04xvZWvq!&pOeHqJ}bSJ(Jq<^xG=Xi`A>a5a}=YYBB=_l*rp`JNAB%H+a5 z&<*ZHfSrS*qYqBIeDm5GU*v)>gM_c&&CoisYK}hRfT=(nkQaEEeAAJx?0)fOfvXE2 zHIQ6rI3^~iE!uYX=fmCoUNjV&*J;b$jBy?7DY7ZPHe7p;YMywMH06Ldr5_JaCM(HecR$xoO_G}tR;ZH@rt zjKX8xCQa%@%;@1KOb0ZyphOG}heK}Pjs0?7K*fJwtffR$)$~bgk22RdkLReN6L6>_ z1U67{irE3hdvrM2-|6t~6JLT6ES24jyJ_iO0Y@%aiHYEL-5Lh^XLM_&tM(>uz3Q5e zylM!uZE0kqM9peNr8}Vz2Y%e%iLbWF7Icy57(Gx!LF(VoXk?0kf~o1ZM1c_fqEr6{ z{?lS}69VWu^ylX0=AirX<=|=LBCUUWIefhJ?bBzm@3j8y)$r*z-#mUwU+~)#(R#GT z^>3}wdTzSD+r8t{*L&Zc?(LsQNsBHP@OmUt99UMLd{@544W%+RL})9c{BX-Uuye26 z8vGp=;yG?)*A{fZ6OtJd6IwrcKLZaLWH({rir7a`$z4tn<*J*aUbN+S@_mEFEaG5l zw*4W-%e$Yp|8d-D*b2H)Qmo(RsqC^z)Y!yH$*fL-TE-~X)slaiiidMcEH=08rXGMe zMnMfgs&veV5|~=)QN;!Pb#>@d*F=Q1Vv%wEA5o8D?B-*v-GdKa2*Eo9i@A%U zCZs~ZnzH^uezDglW0AkS!GTOE8d74TNd_QIftE)pKOQS|PVp3B1mvye#snmlE<<1vbIcnn zsd((y&^>|Z0U@ z1*&*q11o5gnzI$zinqikt&G`ju5oG^#gZC>zFB8Sl zR1%Q7sknfTeiFj&2sRKcwIj!_1;QdHo?M_Ra7?Ptyu5TLh;JT%r?eimjSjF|D{{z) zY+sP3=;80N2YnBC5ugG!2Oy#8o75XA8o9o1quEU~SKHg=GSipwjczI%UFBvWdq%2| zv3RUc=*hY#YcC^siyhaFlfoB)^E5qg&5xFfLhSQQY(*rH9Q<%Qv45D3syH;gv;GA> z?lLFop_J>`2WOofO4O0lD%6^d zQ7jU>-{v~=L5BCoxCgdf7&cKF}{n=8C9MJ`FFVh2PKL^^TO%Ng*(SA zR3cp>$|ME1u|#P4amNT>1qf~9y69p^EFc%&pzUmIXD0R#8W1);>ju-JK2iakQch$x z)BKWBR0t=)RdkA1fOgmryd2A#re{u2{F0PyxDx(7*vPi0Cia#-ByKm>VB=K! zJ7R@|FUOrI`-iAT6i30#=lL@9Mmr%9Vn{mDfdn{-D4MdQku%}maNw=A$VRZ+jxyHu~e<6|D&+J;|_h+)#u4u_zbIp7O01k-|p!cs|VCl>J-YfZ|TFrIuE_| z`os#VHViV&D*oVd@S_x?T=)R(LS*heNx5FZ4d35kRli(LC6*gZjdLl%s|G+Z_+V%%Qw zDx-A7%7o&_^nnf-h*+i~Bn;N4Sv`>d%MPqEoPH=YL)rrk@L)Z)g zK%0+X(%uD?=9+3g%q{RKP84F~69_2cdQJc`K6iroe1!5TU?>nuKk`8W>QBC3;#ayL zDy4u}{L9xUjwFsMZPw@l9mK8nyXrD&PHpHzl&PCAwP_A49iTsiff8lBXyQTwGCrtP z5$iLfCj_j@^v*I)kIj@6=xhXVtZIjmfspV?;RcAj@}|NRH#a(@a43nUm&&aF$}dTF z26BEr*9!J~!IgzZVe@p!_DaH}mDmg{$xFXKgrWC5h@iiUW>l6AWm?}O-)=Be{#9F$ z?YdqhgdancM08Ao>$6^C<+c3DC+u8o zo@e8Ty>LtJ#H|lpcE@RgnNuMyP_4oTZaa1;6x`rdN{nnFjs|mZ?~aayp{S_Q(Z#wv z6WzWJ*bW#C+VGOl+(sggote}e2XaXbwqDFGFsSzwCkKA1+*sP!be zn%iMC(U79VXiR9XSx!*efSy3-6h$v|sa#7iZ48BG#)T>f+jrCmL%HZ!nWtq`{|=bh zF!naKV&E~`k;%rkTT1AF0|>>37a`bcfV0|2S;g?mKT?5PLuqq&npPxP__H>yG$$6* zHG|;hf78*e_3UbZaeG4QJ_`OplyNvRS{Go4XwL+wP_%-(L9`*grlM^1+(JV%B1MrO zi1Nw_3v`$vbvYn#V=i7&#%DR5Eqw`)dEt)VIXDVDLWhc%(uu}V1hpe-{$=2#8}Ppd zbrA&fFb;Ab0qn|+xC2j-9TkN*=)DRTTf67@em&N%j+=II_$7NusErMr)hB}5iAWv zqE~>U;_muZ&%c(6RkmB^x##bS#S;*&JJ8#THiJ}~2hivjGlGxom*FIbaH78RI0Onp zC0<18Jc!-U%}Y)CfWNd1l|<672xK>S%6DB$Z1b>jF6qj<9Sj;-$st|pZ_YqRRU_yj zWAwJII{a{()`foZ(W4o~k_9=^gLn5bYSv_tfrQaq9~Pa%1zI6-#1&QpAX%MZ(l1Z4 zNV_kFi;NHe8U?af<53i^OoBlW)s}Ul6sFr^sMDVC2quE;Ics;zW5Fa+G;%i7Wq<9a z+sBu0A1~i9IYrcicV(T-asfaF_Z5O$m-B@b@Ca3Cq{=qsAQ}jcLEN1f?&@^{vSm=* zV#{FMOT4+4;5MTUKuVUN+*yr&S9I1ny~6a70wZ@(T6! zs*$i0-fSg`F>MR+)(AOVL9%FjhZ@;wyz*h=7-t`z*lN*lPw)p9Jegzu*9v3syPeHC^7g*4#t=dBd$0r!u7=8X`_w|SGz(@2?b*-XQ;C=xJlGzX!>_z5|)eH=9 zvp2xgdhj5K1mtybv~qH^y|dft+;_kJW%k@e6SHx5Bm0Y#%H5Evk;A`?+{g9*p5FH* zlIe#y{P}c|aD?}i;bni%?$dAgv*+3U<5@W#-|seZKapO*#Ac`{5mPEs=ZZW4?CI9n zeg)4)IctRZ(JRSy{bw zcK6@xZSRZCx3z~SAIWC?e*5RsA9vjh5B6_s^6X=z5VSry*!tMBAyYQI!hcG-c_M`3 zSp&6_JCLw)eb3X634qII9&k?<80@Ka$LWaNlIG4k+uvG$f&k96SGP@W3zjYyCGgg# zpZTW;^7NYUMX?lt;$TYi_$i&0m%G!E=y~xj-yS(;BR*HhjoFCL71=Zc3)it)*^#9d zZHNAL>dq!FL-VRJXMmUr-6(vAxOci+0)ncG5#AEjr~BPNp}ZR^$QmC%kbG^>M`uYv z{_0iV**-iy-u+)6cK1*A2(SxKVZo?KPhv-G1_i+z*fcyurpW37TyELn(e`)mxAA)? zqE4%2Jv?~(w(Fz{HNj{<80O!vF8bBnuYpGZ%8}8rEr@FjGT20^@s*~o1lCohRI%fN zMUnFSQ?Yo?4@(>Pxmqk{_47xMXj3<;`Q@W}e*OrY;g2pZzBwzteLO07sE?xa43qnw z7BQ@F9XYE40zueIdfN<5h(0%-O18^fZ>T2@7DOk>-!;#FJGubN9swI>okDv^0}oiI zg)!ROdz=d|eaR7gtAZ>soIFU7Euy1w+lr}%PSz$PKtT$!ljb279K^Pvb&}~Vr&EWbll=;khsk#5KUvxSOfL3#Zm>>D-sX@E~$zTd31WTyYs{Ghxg!* zrs551$dyjKx5V3JK`mG!lzbw7E>nX*P)LD<6qLfC2)(X8IB`XMwg7&tuF+;|=u?*c z_~Z5|WGSOq*tI4ZMebzBnmE-SP$vx#@z8Py!@%bPz;PTke*9|4qqo>F?UqMubH}Pz z)_3XqPMDiF{U~2X=F^~tRKv7NZG7jxnv}XLjjJ-n`BHZyy92E+up3Sw#q{v4{a0k& zc`(fW&*67&MNVOTwhs@TNZ=onI!JL`9V<1I`xeF^FxwdplU&Et+@faQ&Z;^rrqT;_ zB1Qh)Ys~Jxwpq{(Pyd5!w=Bl&dbcnQvFgkkQ5#}wSqoO}U&Ac5XdVb!{5saz$^O%T z=Qv&^2}uTJAy|ndnR%5gaxw;4T&pJCqNYIsE3_LmZ5h`BV~Ldu(D)}f3K0WxEbtM8 zor++jy4sq@>^saygvS6N_AK-uI0wb?2@?;E(P|FK*BZVpjMTbF$w_ZNynBb%m*CUk z{=w0EQ8an9`kfQ4#DatK#G&#-IBLi##CzY)Y40Kw`VJ3%ayrrWTgTs=a)eAD^BBqA z!Y`2CDf5{PL?lwclyFT@`-RoSEJ)1A-@6D}Vgnyfy~d8jsg!6X@Aj;~0wf)DlVe#f zqO(ap|I{_Pix^#57w3zLp(G`g4(}F-xWk*}K*lzU6mx>G5urfqa#N2%XD}gu@K|S4S;x?ubgZ8REM2*GBms6h8t0)6`-AQy|5tb2|1O=#kUO@w;V@*0Hi(xR z_(4!mvV`IVV~R_krWrA?)gY)Qe)sBIs*Mlh#eoKOxqa*ngm1lPg$NrC4)5c6$`sP_ zNQ*-bH4qfs8_{x2&BIm)SYqHG+P~8k4uX}uis3*xPO2K4FEq?2v#*mAMpn%t)TD@dp+e< z)PdhY?Ea3uyfDPzn!JO_>p?`&wOec#oA&x7sAh$kTUdkyTW@+=Krj*T1`MjfA~gb# ztPS8hF2F9y{!EX@-@hlNf!banmiaV%9d)M3@O5Tt>PZefg+HT9rtS%X77d=AEzIxH z;R8V{P?%g49Ledyk|TH{+IXrvnMy-75C|tYbxFMtfJD8(+K{{mSu~PWL*Z0dlttIJ zl9DPbnz+zlCQk4tQd0HAO;BI}Z#75Dac@Mcf1UQ+-O3yM{lb z3|h@@!px)%(F*-0`9j~z!P9PsL!&T71W*tEmGLL9Ub(Lu`5#i1*x(*EzYfq3(+RB> zOEzFWde(ibl8W~DJHUT6<+NZ0pC#b06J|Ov zJijWphp6oM6n2G@|vk~6e`sgg#&{R@G#DAFHU#aLPnr+oaMzUz}z8bXzx}e8= z`xtPMd)ZrD$D`fjlkKAujDI~j`mnzPlhnRC>$vn?&QpjpP2S2HVr+-oc(hf)E(8JN z(8c!rG8ylJi2_a&QK%bmaN$e8r+rKXtR#EVfECoDq{2L^K|W%IO^_IV*1ANJ?F41Z zsySTf3|gzPwZE59Zn`^;=NI53WH<&Kuw^uo6!XW_z8Z`dW2>E~yZCuiIa16T*;@uMJ1#}$v zKqHpx8$L~Q0z{+tMv)^w*$P|3JD^0W8)5gyy*Io2JG=dZx6iYq{?o0$ZEg0SeEZ~^ zO^lkc%*vydDew@(qpkU>GAb#027Jn=8FKWCC}0Gqqi(K58z=7IdaOpVTmfL&yva<( zIE?@Bms!^@3qn(RehdHBp=tu$Kl~o0TOY13)piQ(iwkejZoA3Um5-ASRykhWjer6F z1n|QwnvKqIn{TO1%v#_3!*{#yclS@WPxcP>b+SHroZTT7vD9n&9D~sHPX? zB~(7?@iE}yusjq&5VSRy?hJXVrSt?zGMVU{DzqFrkDWF^gs0|+R>?i&CB{YGMnvEI z?b~Nt{l`zA4W1#(XrATZ61RRSy~`&UW{H(knfl0~CFFOXRK+yWNpC`X))O4Fx6P+d zw)&e-HlJ+;5XbX20+N0VC=jWudE?L;LSVs9!6Qlbl)mg69UaaAFN#c_jCa>y34-{z znN@S!lK?YYo})t#Fo9sZZ{@Y2uiKF&kPJ`(QzVg)W0fi^wZWa8bRmatp!)m8;sV_6~}CG{}lBuUQly0yByU0>AG;2j>g;(0iW^c~kj@&=*i^Wwns-4#NV=;$vH?M||jmb(3iXWyI#p3*`V;W-^ z(PqMixC4s3&&Cp$d%6~N`%3BPn;N*Ag_|>I&$ZaZy7z`46Gvp)TDT=BohvJDgfO{7 zdrVF#`nJ;iZ$2%<$K32093ylX&E=wpg>YIfq*;B==UC6A4m9_M*SVG8afLt@cY+QH z<&sREG;R4Ngn6bixMZMT#|T3PA1L1JkhZ*aXRlRQ20%2HmM!S2zsunP;b87s2kqOs zj4)ne-e>&Kx~|SkU#%VkS5U{kmM$P68xk7aLmPnK4;39U1;QC6;dY8CSH8&=Cl*~z z3h0evKtwpW@U<$Vzy5{nGVM$|!99)$2)+`%R#ul^|jR)a{N zd7;h?t*PSUyL|?sbYaQL+BIXKbmV>WVsVEobSx_l98XubUY=1kb20`3x2Hl%kQqY< z@f3vE;qK2n?>>M8Vr+!f4Em-@Gq_GU6`MEj!D}?#5yI6?*;}JuQ_uh-;w$zRmJg)( zto$6qIiNOJm<|^~OF?`u?YYd=RQiDQq2^l|i;uC)@kJp#D$1pBJnNV+hO@8N22Br*vR||2@6taQ-5W~f>3=3#vQhFoME!ISi=H9 zpJg+!5Z-8h(}(;yro?Inx!Gt?hq4DFgxmrhPvJj!3-jp>L`89ODNSfe6(vf8=n25` zz(Wb@OU_sz^oA4mAt*8{VV-_ycPLgNeZmzJ1Nm382)Agp-7o&WuzlY{*thR@w-4X% zzCSqn$LafnH)w=|(e?-4ZWz%h)K+JR81($ZVpEWoquTz!8&Ke)$=RGlOGCml9a?6L zoFAktY)%*eeJUx#koKsmuW_+t@K|bb1@F25N|lYa|ME97Ln$X1-X z>zd9rAk8e&S1oTVNWX~8nkilc1t+G}v=6>kEzJUVoZE)wxFDXy4A-fCv%b@}06kSu zPfUDFvqFn~3BG_WZ+wkLui(61euIiCSXg2syOq6v??(3?n?~}mh^{CEx1Hh?$0n5{ ztq*aLCRpK}IRs(`8t&Pzj(2J?Cc=QD1a5f*@8tZyQGG!O>d(bojQJ`j_sGE!YzR2j z!5(t$gbMO-Pz-Oq=DkP!{@dZ`c{EU4+1!VsL+N1G*Jm?%b_I6xPeB&<5trg593_H9 z!t6&VdHl;0NHF^+n#SmV+3yK_dwU#p=Mp}+WL|HS`qsl2_XbaG@nSPEQ<5w2gY6z2 z9URH=f>||Ejbj+17TW_}2S>%iyxy*%g&+!e0B1Nt(_Uun9BnU(r`3r!biFIPlSF*a zPAIYsEH@x%`o1(n1r0rox`b3v^A3eCxW5DUf+(EATT=}A=>W)o&Bj$b!(c!3n*Z~(Yq(#MP|!CY(2n5~U$JL{W=u`mce=EQRU7;;Utmw{t*fPccLb163f0iygG zdnC6H_v~@h>7D`=C)Qw)I+(L9T#@kPx&IEDi!x{)QTN}i=7U=zo?`ASB#m-lm5)24 zCBfoSqbyE?5aa$H2a2N;=X{P)N$zp1My57GZH4|stpQ<*RKjffuVgGQanSy6@3tmz z=R}iNtxX=rP1pb|FY$G8+TOuWylQJeZwPA9iq%BXcRZjv=C>v4Ao4kkqo*R%3y9j# z{`mXtqun=wKJI-xyGL0)t`-`~wWdjFa%uY`aa*A(G6*2%pHx!Uthyu;pHV)8H*vg| zsmE@4Z_q<_Fz@kMY)q`h{n)d%#0~MAqsoAqG*&KfdW`#!=sH!;&JKbg)`EAd0R$f- z`+{iV)C|<(J737?VOf18r!HiqHRBC$NUUl~UhTdPxx{{Py^6((D#G_KJkDn=k%!M$ zR-DSuAoif1VRJc$tDG#`q%X32IqA}6tw0Q3gDx`>5 zIX9*^sTmYnkHZbWQ_(1HK~soCT`N6tT=ShK3%*)1(PLCxQq;w8siZLcUwel?zCHG3 zGn@K_iRDDwIveX@lq9Q?jSTEvj)Sdn#R+SwXcTS?%tZ#vOE6ck5P6TSta3g3nv@-~ zy^1RghIeP6vS!_KyY544XK3h?fim*<5b)tSx|%$+P3Y_h0OxttL<^Igyu<`ToO+w! zJC0`&6jYZ4_TMdKxb2^s{XclWcXG;+g>JOL50_{t#Y{O`MC# za^Y0Yujuy?ljqjv=C|4Q@)FFfTi>o}Me!_OF0R~aj>`IcoR^at<()ZN-xi$3!LT#u z7=Z_Y#!;&u_AuY6;fX%c>f2?#9At zflwSUeC7gxNZm$XI$af@P;k@T7xTIpUtmlAlJ2cKZjV}Z29SXec0*Bdi=6G$afg1cBw5)6P71DD(DuYS_2CqW)2FgT_vfYjBhpF4*UUu^RZU*6l2XC{TgZGCY zKx#fbI{5Br`~Ca9{qK6&kJZ>++u7si(#8Gb3h}t1c4~I)#F}$(@IVj&qFz4v_HqBo zv&{`GOI=sf{!c|cE^egt;qq);*3cr`sU|ZgV)rl{%ze;vn^Zdu=gM(`#X@sWFkU*Z z0eO2=)WDzvKjL9;%nc zFg}41qY=dj^(#lJG#7W|6MbTTJV#8}U(~w3*dz49onE4mbZ$GvHe5lOKO7|9v_{@e zUZ~`IT3-T-3_ViDQ(XbOSX{~81I7tKC_%D%2^bG^c%`5?)F_3*69=7fb=i5}?K0VG zz#eo1XPD|4W$y)f!3UWLF_r@DQg~lDd&QJFb0ZKS&1=?yexnlavM><@9T zIWLe9Bnd6K9C>zsrx=g#%TCBt*sfE9eOLqhuzZIyFn9}7xV{49=LJ`7wE1=9^kl0H zCotKaQ}PDy&`I`Y_hftT-Lc`XVs9IjpRtxI23XkjpzL)Vx{v3fdfB}-w!E-CNT8Xv zD56`Bm?H*T0UgFjN*Dnn6}Un7p}yUcIs1JR2SM{k9Ust4k155Zt`rC{uw;Qe;C-UcD&6AcTP&6Y8w3N$NzhCbMwA5 zyz|cmG0ltRVu|HNby*&7 zMg0n(?6DKN*P{3wv5OSPG134r4 zjUxjiCQCOwg5&e6Vgmk->Qm`ol~^Z#&}wReJ!^|_y(HC?`P2E8cKuDbRPW%9s~31b z_wnhD)6c3$;6pk6oS!e36WzUU!nGR=Kb*YnKg+h@-@#Ki#K-j8nZE34IM)wu6XR3y zG@R<5_--6mqSs^Kk3Jnvb9*)$Bl4Zo1@_*^L*Mcg`M}Znk}v-j&L3D9kErjqupIS) z!sr^&CgHr<9L1Qmr~4n?zebaMBntyG2l0Uk1Mcv%^0E)stsG8ARYQdD<WS?g0b3g~s= zq#!JxRL+Us>>MU5*%S-0UWP--wE_xQV%$7R)5sn1((;Oh2zk}CUQXB=F4F9I0U(nQ z`nAXbSqUfbx{nuT2Vzj(?QXw)vwgDdt~k#0a6$yTWZcdF%{P2UxXbh}e7lZ{i+nl8 zimKC^DwDCi$I8hB>xY4f7{i@mF11Y@A(wv%o<0+5&?`I$F}H&F;2LGfeUbwo{ayj z5-Q;u3rVArjOkA1v)^Ywo_$W85^~ag&6;%&t2+j%>O7zQynj3B1hYpV%6LRZH4z2< z3J+$JDVpVO+0?a!mj%bMk!QhDl^=`yn?uF_^HnirUjpEw11+MPgpH3eK@v}_95vF% zGPx6QVC<6XFlh6Fw~W{a2NFFB?u?3xy2dfGDA1u2#te+z<2-wmS-sF$)#UQ|2l%d{ zSj_4<4VBu^lm^@YubRwq&ac$Xkr*Vm#rXz{U|WnK=X>gYERXQ|aG`0(8mfT%pddR&OqY$ic_lIagO@cj(vKA4?vnHuW1!4G`!X|<6q z#(LZF1M?NpYv1US2Hl7MpA2s?g~3(vYRHMw$?VPgx@r?e^rbJa>fv0aOdNRQss+`=HNPql!9KPw5YGPoLQfKAr z>`C|zHO+mdNrS%nZ8+y3W$Kz`9NZqf0s2}f3T9{MLAd%*js~R2vV{X#I)a@OtT7Cq zFRK-^5aos7HEC^(UJIaQv8IhQ9uabUDhRPCiysY1Summ*)Uw3)Wb@*8&5LBTVpHVk zjx3-CaE)7{6Om{KEt$wL#v+A6TVw>nNE#bS1iXDX)~hnO)aSj3(Y%XpWG%rj1Er46V0jOJDqrAMD^9dCqv&g--zIl z@&dtU$oE3F7LTwJ_*ro48Ny6Yaw-~_Fh0@Ng2Y`EQ%iXKa!{I{oxg~akibjV&`G~& zcZ7&k0=&GL#e@2cQ$|OCwTC^%uQSqHpQKB z-V8$uc_$Lo5dFF3r(zt5QjREV=ep%&HFYXkUJ=|cJ^8A*%CUT>X;#c4O=Bdv*~!dq zkrz;k#*t$%dSI|9+luss^cqrB8p)`*W_@}($V&kK#6>Ae?F!ZeWAbF&R-i&ki>&EeBjPQy5E7rUWvcnujj5tr%+vhyl_m(; zr{p$}rtaDj2mrTB<7>1r`>#U^THgR+1x0*&uo!{&56aurs%)`zxeoO++`JFp0?eDb|1Vj)2Vx@q85XxccXbjsX7iM^`Qc?2oQII z7iX_BHhai!>)@=Og~tBxV9a(=K<`$$f$~Dx3Y2G0ce*e?83*AW6j+iJ_nXIHF6HLu zO%YO~pFR|qaO1#7=ttlAcDUj@-wySiXItscYVSPr{XE-V?VT+%wr88^0WKX|?*8)~ z3~&Jd$*-V^XTdvL+mCmiJpJ}rIG^Z0n_J;Ko7(_&w8hK)Q^Pg#TMJ62W5(rxZYbED zC5>0(sgL;}Jt)F{O=Wa%p(5CdSWMx<=GKCLMu_GDcVMcSg{ zXaP|S3jm42{2k-s93`7zX_c+aD9+_-eSnj{BBxQ z&k@D^BR@gGANkNao@48ik5BPj053==ewub=9-jX z=fzmfc*rz-hyTbsNa#7*bo8*l8Z~lSJmQ%0&C<;8619(0eg9W@`;l6|Alq@x4&HO9~>QB z!n(DlujcIxN+kf+lKTTnGh7!~D&bkXtz(k*69y6WJJ^e^=`)7$!e}vZ#*I0eiF@lQ zQ=+W3W2}fO6%sYVlQwcP*>?1dBEkC?YN9sW?eoRe2V5VF5iwo~z^ibqg~UPh?*OCm z(Ej!Hqor%r7VVp-v}|uCGgJ}>#nmV$PzbEB40jY_yPZP3xSD5giyJ(i{O^nS`&R@# zME}&j1vwP5HuRSl0bC5mhTi1Y&sYge%tBHul zynM_Q8C1bFxb*}k2JQs7V2*=@lqViQ#$d9q^(7HtV|Ef3o zcEw0QJ+G0^*PY!G!%)PUILmK!AvL(FK#ccwR@rc9LGqA6r#55gD5;)_7ZuJiSxnN) zA<4kD49qhh<|NdQxBn}2@_rS;=Z9#0wa{lA&qiCOg9&DsPlZnG0#c}CP(+Ov6pat- zFq@#P$u|_!50LGs^@Pd&267KdPk=KQF$IJfd*&KF9G5}ec>@DJofV(T$)ZBkm~!qE zWXFe``1JPO`9=2XAbWFoc7E|dk=FYH*lpW7b!~u9Rse)+g|3__GIy?H8bTjc+L+tJ zAB($&fz1h(8UqhtQ{Di;1p5YoTk|(jV@FQtdXZ>M91kEjj`>;c0vkBJhN5HcKhbEc z>_^gqI2-UafOVIGT)`>IS|~ZSQ4WBUM%zh;;)>!x2vibfF3G@Fx8Mdw#PB)6OGt8^ zvLdrt;__8Qd$$@RvktY@u#&U9@L@2cB0ew73*h*LSyNEy26)*p{srJe^i5PnPvcpC$mPL@uyDSqa=b!Q{7~4G z`!HwCBFEwuP(K)awk=$ERS8Zh zn(xCdPllCUfpe_XTk&BILO<}MM>}EU2R8P)j}&-)O1~(5IYn;I?qXm&{`9ogKf`db zLSKtn;d*EBY`tA0h*$iaqh1h<`e8CKby8eAr%uf&ps}!_j;Kq}q-zEZf%>dz>37wq z_G-qEKvh=>pbDLdN-w6MzoFgiNI~1kZ3zKQ48q3Zl>%O2>0^Z~ZwuFfFd_F6OJ)FD zQD|i|Vu>ixXy%C@MR`H!5q=D_0%Ot0wTPk}hJsad>8zx=|W7a zytDAyXi}jQOl2HaZ2yi|4jzX4W(gov6tS&%L`)PS-MgOg)4W~;XX8w#KN(s{!5wde zHL4vZzwB-*e%XaA;BWz^;d8)Z;cp=E;ZD;M>IusB-5g4+l*Li8Lu4j+Ch3J{?}DDqLo2;83T>%{a8&EG*q|0aThCp1`s z6!jBU%vlTWHM@dXU5@*x~>ZepuPA`Y>f)@+54*vj}EZma1l?7(rp#5C`Hb;{K4vEFc+E$Rvy3cS zr`b{XKdN0=bOIA$2v=c4G$sy1do|Y+%@!KtR^%{l54Ahv^79oF(ke5)c}(vupuTRz z=D7$@P6g?4sC4rXW!il(A+1~5M5n;XTXpqLXdIJr#mN zK|A!kSF7?0GBf(4Nq>JadlBiRd`fM~s64F)LFIcuLb#YH>j~uXaZ$nTqM}BSKTW%b z+j#&7yA@PhbEj}IHLDUg^TGoU;ORjS;{hwrTqGOOkO?UrS~T z7vhZzaG^!+7KH)1uL)`hZ2D(R^tttZJ@d6hSi+`?>wr$P9ZHS48_tgGnG4NY1QvB@ z5mOyAj2|wN<1ccDh_h=1AHlpQn7hiP<1=?j;+%PoiqctmTIeTMR`umaq3H{lw&njD zY750*I^wp++%p&?!aAZ%t--8`_Mm}lM`ZJnT>ZE2E)IUVJcnvu`t}fMgk)LWNaYajjw)a%yh-29fnC{UYMko*HXFH9>|L2xa1Cp+RqXxuYJrq(o5ULTC+hR07G; zm&`Tt8^Z6lo5Yp9cNZr=?d`vN_m&!lB;=nk|2J4fvHZJlyPO{Er3WK%U(K3dhHsa= z+I5ZTa}fR%c@uw*5EI&Lp~69IPd+^=HYgFwb*iZ%(owwl+PXIou1 zeNrNZIv6-v{^uMrXXF&TE~*j^slkc?Z=lI4Gkz2Z447B-jeRwlIJz_TCA2|CICm%T z)y4TGaFZ+WMN&#;v!lXJj;!sPbUMy#YA$EyE^$;~QyfV1g-wwYB)oTxqq5nU#)ig2 zs<+cLq=t5!4kEELp^BCau%Boaw7yN|Zu@?q4zV>{U-w>KuT7L*|4&3)P4|mteP&G@h-xM|XR33s)W!cyQ5~{f< zq)sSIlDLdfb@?4?OFc_$LJq9YMqxH`f_Uaw^64A3FI1RGGBIbLzCi8WGfq6jHB~UC z-s{tgo9Q{6vw(XPH&Z@+)nYg-uTaXAcKnCly7&D71UO#4IsE0|wY0OH`IrEOJ{nI@;CAQ17z?B3 z&JXtAogG}hJ~%qKIM8A3aC2vS-@o01+;MkkE(ZmK97p`swsrE;!5JyUc8braEpU<3 zK2bXZHL>B2Qpiix;2Wpy@CZ$VSDCTr*eEHD7(w+mYU}X$@Zxaq=;*JP2X9X={z`3a zZDyfx28EFT6#5PoY_y4x+!?iYe1fpG{s&symewYyfcc}@%|DQeaqYuQY-?K0#kRJ? zt?@;mJo|B6*eX692gk1ukG~Jc^^9BkIWG~35fco&&I9%DAQOf`c$0RFq(_hnuM|E- z!9*dUvkb$ya>;EcahY9_kjdNjpv(}$o>02cqJvQA7`^3VoKVmKtAY*M(ugf9%4;Ag zqMSe7$;Ljghh=!o0dQ-=v2Y|-pxbZE;#(rN1Vn2S9Afwx$0*JM@H)#&&1;Gn6+Q=1 z4qhq(fxm`^hr|?x5kw}XvZ(6z_ss;cFM=UdOL4Q+;3#}aWeHFAM3fp7)A(&5qH$Q+?M7cl?LQZB59*kUFiMQVV z{~m8iihxFB5A!isH{2#k8=63XBtUUMt^F~50s0i`vEq^=oCjm|%n7|C2soxBt2xzU zU`!SY)Puw;gz3?W&Y8OQ8@y#*<*uc*qy)CHiw}}gUPFfjtAS{p5~y2pkPx074hxi+Cq9JOn)=L^ z8a~AdiFVFr3#VFvMIrX}9H<4!@GwgjIRP0oM;9*TRx+~}Eq#OB{2PP*KhBmobY};{ zEx`BJ-8Dg#8TV0rEXk_K#Uh`}MoIBV5Z~k(cXORoq-HLKMk>xhdG&@P`rFEuZ|kkm zqd)B(9lj34Q0=X(WDpp8Nv5%^ydFag3ETOOR|KXNNjj>Zj^PRHql>Vme~ z@;O=h_!yEOKlMX<(bKt_z8~~Bl zzlev#QCfV5nK1qG%P&-diEKfpWIV=3z_j2cdhoD@1J zQXh3A^9NGCo8qB>G^WJHyPZAIU4p0iB=mT}Y10FpDU37XAzi3<%`FG{9;lWkZMA^l z`pR1THF*oa-5EL(hGvGFY-GgxOwc+D@qE)`HxrH_frkH~ARrmU0-h4MR^cXADWde0L1W z2KwAdp9T+_hR80)Hb9!(E6wql;U;R>hTlFP3lp1+gLp2w98P|&>e-JN-eS$iDl>z~ z9gk#>g!n*=ye&AZ%#8(8oLHBSe(K+@LXjD+#;5cZZ@mRS%EM+OzK zpqJ0GvSz%Jmk$NaTHGTP>*~ax>8TAscV8dY@&T}gpM-(Z8^3P8@9uI0ze?cc=X&RK zow!#LlTi4iR&c~7EIcm{2cLhfOMu<2_b<|o=^TD7xg93(Ze+Nzcs~zQyF0r!fTxgy zmd^l}->Yf~2SaLt@xZ)kQs3nvHcSjo$Q;5XQ0bYW=RDr4Ks`Ca5)y$;h6OWWJdr^C z<`PwF_zDI~nfqZj0$D8hs>N^r1mL2_u-WwXcK9}2o((wt87Va7Al(8)b#n_lQU97K z-q^z4{0MFh{XoW*t~wJ#y^|A@LQX<_+?EFTP+MXg(b0@OM5$Zo!*5PZfOF8$TM6=@ zhQu!NHorqOZuS$>5Lpz(C0868&}-);2ZA4)W5ydbMMyr;$P?qXMYDqOUKevVNVxWk`PGKF`jah-5E?eF zhttAmqGU+RtFkCDyOIh91OKLG7}DKTx@X9rgfu^yH3;X_ltzb{Ojefuqp28i{kiwY z({}jm2R@{?xs67rvV{~#KzY@ghDa@G+=WC?7PcY0frM;x;lEL#2NcEplc+e3k_*60 zWi-tn8S+Cv0Xnlmu|2sFg-RI`E1>9GZ_-P&z=A-;nu_Wi#!!3=l@`9caM@%6(K@4) z$}7A#cG3^vMme&E3r$)`%k>M?g#JQ5C{@D6hz}=&)5*u+2G#v2-lH6%mt$^KbKE`D z^{X&Km)!Im=PRKZG!-^a(g>h4gfhXY;!D6#k^B+*5cF6H&B!vg_+ptFtShd4_~yYL z=GQZm`%mBV^3su=`I2p3OEVdky60XI_Y~8TfPfWm#*frh@2&Wex_-SKKT_9vAIFc> zmD3$9svAV@a$0YZu@(FB)n6|TaNDOPB;#Dzd?c#Hw2<73f00aV`z|_52+jb0a}vh? zxjg;;_yj*Pg;X)H5dGW+EmG7PbuO4%4#YpnWxr;U*g13ULUS&)ilN(bifWI`yLde8 zgey0W(P&ZV^w#F~PMf;%RWvwwY--X%G5&M%FL|OX55MIrB1le>xyCD&JJTafwUX;al!>3oIf!33CoMuR}GZMqA*a{8zX{NR zQXzJXqQ4}*Iak1-lH)Eq!9ZM_;IZJ@i?wGl9iSHgsu_uV&tw(y;e{i}F$*VUBJRO< z9v@>z3a>tn?jovtc5-q7_vm?o6XI3TA|4wWZrEi?OlKu&Hpa1t+u_P!)^N9P&JGTi zbvqVR(iViOw6pX8l3nu&zHbB&EAZy%MmRcT9kT+cwGGiAAA5@RSr z{U<1_MK&&U4TTf~!hmeI4U^nnGD&9OX#Sc@$ex|(v4X{7uj~pY93AM z)rC7ejpr3KJ2c2ybnR#>>VsH9{&`q^u6tMGi*kdqt@s-`<_Ejq+dEj55tyhzEq4?RuL5WXTIX zQo>G1G=3eVnrm@AbM&+|ZD;?!W(rEP(=do%eb6(RE>LQkAF|K%u;BFlZSD4^`U$+S zW;y@ixeo#+5nCxGdz$vV9Lk!=B- zDQ1;I8&K1jh(#i7))?ZMI#R+|s7c2XSZq3MS=6^P0rss&L! zEJ^1xbU#a$C)S@weSZv`8&5d!ZujjRGV5@+444{Xp+lSw+Hf%wnNwTn8km3{D?8+8 z#qihnj1F(zISQCQm-@h4h~$eVHr1JYYOcrX+p9Prfp1BdZYS1CDh5?2YJ!4efV`g9TiIh2->QF!B?=5&g)Wryy9H%+0+q)V!)5J`V)$_ zA=e!(GSxtoND;SyRC_)G(Nn6h|Iz;bVlDCg-;*9FcCjEW?-wv*oDbN+7VP7xr$_Kh zCai+Mg`hHPB|)?$MK9Y#Oasz!dTpXx0qzG^dTRJ1ZcLy2%nWGc-9t#`-rdt%QU*LnUZA0N0ZUDU-%OTAGaAJ%JGVbxW z)iu_?%nfu78N%LR-R2kMej{ixxfU1=r)Dd$kx>Kajz<{3Z2fPiLyB=GpE8dD1cPDu z+4uKptCM}&HcR)Dx0i#;Ho@qde;t_Qc4(OzIG@kMbmcj2^ z@4fy#UGSsR&L@Q9gh#Vp)>=Gkw_2atySvXECxVZ+^y5!Pe|KH&;K+DEzURMf2f+iU z{I@KCjCF5RUORHsa=k6ah*PVxXm@<6V+PKsj6FtuBuGi!nh}OMwFe+Ez>6JOkoIzl zj=->Izu81CXroYlhdt+)r5qQdvPiKJGOo_LB?x_&Mf)dwdt#hrnKuyiq!=TlKEgP-hxP?|&>-T08Lf5Fc;we}#7q8u+^ zU+`wa~IlP5owj?B| z{r6CUr`AZiH{S#)F_$O31(aDS{=n`?&>sc7qple*aBX4vj2xdF9v>Y#g~<`YB}*O1P&643rqY|R zb^nt7ndJ}q9Q1oVS>x2!VD@pVzAw51o4f-G0IexT**z+m-6GS z(Um51;TLXms;enr6!;FG-O{n zLc&+!^z87by^9079(4$ufP#S50i$v22=L~SvON)|4jtuNG*j{uFygA^O`&9o^RRyoIq!q z6MhMiO{k0@4CRD2T}^*ici{>>@C2HM7mA45nE z17k%Qrj_Tdi;5sOkQmfE6TS=j^#V`@q2yogPWg-tiDYiOxk1FlsxI+5 zBB$?gOfXZ>LxuA+kz;Jw&96{w@GRq&gUVsQ6V(|5WIPb?uMCOVqK4miW1c#8J~$vzQBL@TV6kPFE`1K!MCp#P?^y-lAAJFgWnK<}d&N&n)1ZBYJ zzgOxLyidwHLfs~*60fF5F(LPR9-WEw&IBKKyJov;%(r>N;-wM0#_{WeSMR=8jhJEv zO;LeJF)l6s0(%WH>!MVlmUU&;rEc=sM?&qAS$iir^8S(D z4QE2H7FUhI<*y~j1|Vw@+%btQpx9yThz)(8B62!J*5tE_1(n>N4GxvQEi^Nnb5DSy zsu*}R87*#{Uhgyuk~6L$Mq`fLhY)=!QPedvAP@%R&;&6k51=0l-Ud9zIZ8u#ZYd9U zVdI!)Y!wKderPG_LZ8aT^`&Sv**<+G0)S{){&s3rSYnN992JHnj3So6S4Oc?P?C@N zFZ-WvQPOaq5#MDyyQWh1Ny{q7B1fSw5u(Hd8kBvy<&2-jRW;a>1OqW&P4>dcJ58}= zd@y)<;gXjx)_lt3$w!eknbhipHVjQDEGAwv4Tlan zvkja~@KtvK%R!NhG6I&nGD~&yeM{Xfxt*Zi-m~X_HyQ$6hTrc!1@>rt;pKeza7~@) zt(w^6cw1_`A-iq+8*Yc~?=XM5<(VV;>+vvP4%y1*gX|4T`oX$|LRZp{scZ1M|6cLQ z41x-wIB-*Xc+diX&myTNKr+{n2XAOG=%=#tL7%_aZew2J>;8k@7F$y0;e&QWudJc|p@w=lVZoxe)C21FPDfA(avq8ZLQG{^Gn?>JVOfUnt)xPHt)6;l*e}L^Z=eI+L z_qF>)0N%LkK;ySGZQy3VX{367uZ!V9hy zbPAax8QmA&nLvQl`S4pyCCVkI98;IRS+6@q0W1Tnt!DM_pa%tK@R5HWE($JzEpSe; zBy{G`9jNhR6l6kzB^ahDbe)JTXd=_;s1&FHRQ(~~t}?k@5V^0Y%WGsg05_qNh@=lH zug)jlL&@i8Z0Q18ZE4C_$oa*u7w$!lov6qG4eI9yb4l!2FubpW9%xFX(^0~NUyyj2|QW9t0YMdWnB}G}($j37& zhEN(}Pqx%MLU^x5FbFZ`C{l>Uxz1-)=n&%t3pAQhY-}b+3j$C$VGI?Adm8GZY!6i9 zv0>7=lH^BI(cQdROq&TCK#S9(bgM!KeO-H%bV1f#d*NCd-6qcfsc_kYH;;R4! z9uNbt;P3!!>JzLYgJ-$;RE{>HXRzvwqc?a@;R*mZfm**RYF17q7Z%6JMU9ak5$xcnvbbeb z;hD!%|Hc-ExBYu)h6_K~KU>P%S}9EI>)+l&q3|EDk6$5HvRM>ISg7P74 z*{P-1!~y4g@*og~6(NOhgqY}#Tak~LlJWG(lgCe&YP+x!JRE4}D^3W8d>RW^2_+rB zqF$gWMFHh=gqe>v0ZH?P6(84ih@(-kLX$6uP#lym$o+elAihMNRrsD)jONR!&r<6k zoFS|M=YFgIG#~uOqMA$QiL6dNTKIS}N3g12FecOexNT``5biJSc6Y1&aP#xf{j?u# zY3?nDZc8!;_5K8GxHjK~vnvQr!z}_pX;=i7y`!U({mZ>$050Cl{14%BQL>{Zu_oR; z_+@YZBHLfz#30Oq%rt8j zMUfW*McWZ*O3cAVSb-TXFqcir&cTafjG187l1}jV)>HVz2iM?-m!Gyn+tl9ap|wk0 z64Sn<(OlwafHX5Rx9Z0CcmnqkRC1&8J9WTF>OFqPSaCFfBkjnY{C^`S^>K{JhVb)I*`MVEM@-3o%@<%}^~X~2pQ^5z}P zJN?d8+n*ToQq#^Zd1d)V=WX-oU~)Ug`p&C8?rwYYU^-5%*$N*%bK)G_nNjKPwR=M+gToD1XJ$1`5K`j7-SBN z;KusLeUd>nHqFd6T~L#M!NlSON0P%>o3Vp__2cQqMs_mm7`a3ncl&BA_)uAZQ|h20 z;+yU)JKi-|T#@hx^BojjA+^I)cc_Rju3_drbJ|PJj4gn=w7Y9#Dw|%fpzGHw!4=7e zQjX`6y$VlaQXI&5l00UPX%*Dw?dA^e8ttv)77UF~F>aM0Uka0lZ-eQ03P z#Nn}3lb<~+Af=raA>5XZE(pBV7Jr+}4a^lS{U+obc4Nt`#WyQ;Ii|ec?fR} z^0JfZL$PMLyv6uiMBw6YX^q>fOQgxu^bHwf*oY#*vOy}Lg^NiACv9Y8h=EhTFFD(g zTnuUnS0Yz`ubM}-f<~Aj$|(^jY^KWAmw;vKgkW(ZZm}ML@RD%7P_Y0+gEe2uo0W?W zg?>Os9B!J&opgOC*{6~q%4iBETAL8=o6b3^P>puL0Gf{9 zS_E_6v37tTD8CPn7_w*_q*TaZQ~;h)XhAr$=+RsSL$l$_3jM#G@D&C4#djIU2d6t3 z`r{tAg|oN-e3zhmOGyw%D{En?D7aNXQ0yIZZ6V)?T-}iUEg!XMafCT>;Wb?Wx118g z6c+80Xn4*;vxyjzSXWSHora7`S=Lf3aeHOqLoS3eA9UTZ#hQvJ=mOZX7hc93hGv{z zA}t5;6*o7<0E7$(crjt{Et#$HcLN{BTpL~RUeB-S!-xJQ@HtYIfrr9QK;nGI!)+r+ z58_?6Y)t%N!zyIL2he;j$3g6jmBdldEMaj0eOF~f0u-4~CJ1f{6-dZT=jaKc0EN71 zO(Wzb_=H%Jgr0!Qej>q;eTt&*W?*(yoKZ|BW{r`-x;)M?=EW_h8AgN>`eZ)7`!Kl; z_JQvSuI>Xlm6-2Dzq<{>e-VZI;p8n;)y5?r8UgI-SNEh9EmUqfDq zAM)zMfzxa>Yzk;d{~SPuH3$(y^m`-=!t;a^{ZJRZ9DIh4+b^=I`=5Cb!IY(j%*XCNm0XWPF3_!%Y|5)wV%F9F!wM}}8Mr=ML3Tk3haS0192HG46I0TLsi4%QZP&A=uv>1aJzO#kQfZDUK z?e;ud#|Pq2!z~-5!sHCWd=Lb)WTp^pD6Wf-4g0-rzYSs&S5$`>*uAC=HAR+Y>s}*@ zf*l>5yVVrp5jphH?(gf&pdQ4DgoRgxlxBKqljw%P-V=)w1Fxwio>Mu%s)UU9d|XTx z6$Yvh&n4_(ARJ*oDgomuUOHBWD3eSx4>^ztOr!x7$F3r8NJe(pAdu#^Mf650tRt(OCa4UV zDxgV6LvRZ{Nf7GufE(3sHUSY?zP(@Myq|_72?KG}1Sv4y&;JYNV`J1{n}z_R0CgbU zT2;g$=_5$t2nn%KGqLJq%?{ycs4xU$=5&XYk39Cq)JfI*R{su93*VbY4+XhxxJ?+$ z!E0|j364y&{ansY$7@L)EPn>y-h=9*YSf`56-UVvaaP+j%Ku{auqzx#znBt*-kI9fNMa0n^HrBqNCbiYWSobA!fH62EoNDv zy@d7Eu)=W1`_eofzus8(gvhN8ltR0%jxLJo-QATE*^UMV)sNc`d?qYko_!tUD+*wz zGu{arhfmrs64NJg!1iM_AM0`;2ROtWW-DzTQg$my|2lYP+*T_ zC8#GDzvhiH@ez@RV9(k9XGSs^QmlxOWswrq28W8ZZqxeTYRkfvp~V{AKSB0OEzpi;Ic#=>(ssQ?jOd}$3`|h>Fh(WZ< z4ae!11fGBt@0;=9J;hjxP=VD{>azGV)t03;qNK0i5{Q*RUk8vqR4p*X3t?e4e2(nf zgSQ!necJc60+p0(f=X0XEKxQIr3rZwG^#I^DDj`zTL0f9X0CDVPa`#$ZEsLY$tJ|1 z^r(E0AfbAOw<1X#wYfSJd%@`_YHeakgAKZOn4IqgnQ?tEH&{JaYhKfGUEUzjP-bkg z9X8SDb3Hk#j0lP!1{|PxhlOJU@sc&Yu)M9(iWU+W9?lY3F*Y1*9mR+%(3!kuUTH_Ik}1-CYE^11urwjL~H6J(&zDMlUWQ9%r zk119KgUumKelp}I+C~Bjn~FI;l2nd4@lr%!P6Z41g+x1Mq4^e;H~bi}3wxQ_-!+wB zbVuZKZ!n)T3xsbrh?U!14$OPbKbJR9JR;2Qhr_m}p3FL5lh}a*Dqi?1u|%Jsz@x(E z6{CS~$Wl9PutQKK(PU{a{mv6 zw=)A6=0!JhTDIsPCA$#2Vk3CxADROi+a8RiO%6a6?nIWlPe7AAPA7GJpfEr*HiV%) zYoS>KLs2DiXFRb%c}Ap0j=0A96T)u#y~c1$u3~6mJeG%Hu827-_j`ScM9Y2m&|ai3 z7b7ARNyqf0>G&~bl)EB6+~z z-FLt7wE-%_TDs7DhEvOIU=+f|S88J)R=;)BOE3GcRx7 z!Kf5hqX`y{UkNL0&3YO*7M^hsD5t|0X&p=!5VWKy^SWVu4jUg3WEDucRMstxdghmM zG40ML-2v4||E7M(PHxAQY=7;T2_dSTM-fL2)}^5?;r##pRY3Q=jHOFAfC z39K-I)#glxwY)J4QLIUHd})<@Rv2Mt`5fj_yFTGwk)a^;NIPQ$64$k5dHZiJe}b1z zJ`G3h`{sb9Khbo;nQm~&AYmS-Q=uY5Chye-Zi$^Aykm#q_yf+D3bgo=$|f3=abGY- z(_$)e;3_yjO_Cyqy*RpIvI-b?fNLtx#rp1Ux*rU>z#x^oKbrJ);Wa-RRY_WWij=tp zoe~T64;KN_32Xz$ z$mT#$toRsAYBbVGA=NYoO8kB>7Y6-pbjC>Nj7;eSWX;yjIC$c@nXt(GJ$h%Y%PVD1aY z`m6<6x%#W7e)085n zYY}Af8-_&$OH6oufXK5k{;{~jV6)q{wE(!Ui*qcY+ROIeot>YYIqLS)-qGRfM07C; z-6PZrv7qIm@97@u#R_EwE)Vva1ewRp=lizvxpUX~Tf0H54?wa!zz){(gtI*fp~^R= zKjhUuW4ySBJ{4D9#$)=7S*gCnJDpxBZ%tK_*?I^!i!1wp$`0ldVv%mCsff5O*?qBm z9HRO|xaef|QA*>2jj&(2Lqd|^;yS}9R>n=^^34*WG(;pq4mCeKaRg>w-jsi12*S#V zy3i&EyhX#sx~1N2yw&D9_gu<}iV4%LBdi`;9gA)wYoQ+3+M2*q9sfKV0!)=sEA?qJ zEx_(bj8?V+%WxGrfH%R!;r;domN)`fJ3pKX3V`H6*9AcC{l{d16|f;FFh_I`aw}5k zk?_inwsZU8PBLBORkHK^Mg7KEwk->o8ajD{VIMoFK?&>-j|xO_?M<n2wflS!1 zDIdTwucwt0AcQ)yrbCi~8*3l(Ug+K~rW*lx6EBWA6F>~mgFnA#81w)nAf}q&y@0%Y z0-%zcRBuR*hDs%qS?O42PG{Sg`JJ*hXYr%JvrGZ^j$MvM{TyQJAmP-9(TSePvgNEm zM2zrsfy@bVopgDHm?8_sTvK9JO-2imZSN(ra2L=`?>7|ZA*(3`(wZqosxCGM?n*pd zqO;)2En9fJ-u8%R+w5F5Ov}PB$0fR1gEm7-Ey#w%_gU##SO5q(?5)AGKWB-1pqO-l z0Xb58QPpzX&vzE8PaQArDTeCo%A?g$EGIc&QG7Am7?&e)ZM-B+3M*l2J(Bo61xa{? zGu(%~X08D_CNq}t`Zjc$1*1&4e}Ct3&#r7)B5<|iID;Xamw)2{n67+w;8i?ix1hDh zJG6*`mB6-w*_Ejv%E9nW*TOYC_h}JJoeE1B2;Ckz%OO)oOA^qL4MF*&v~PBDz=dhO=GT~aMobr>$#bzdTR<@=4fpG^*sw* zX!Y?qJ&ECR8+)S>N$~J`m4e9)Y66gbs)UDkz1m~2oy`Ll-#JSe%IR4idHLRyH(K)e z)KDYSnOmXmR?Q{UV8tW*r&t=$o#rc)XQ<&2X0xgo^M;F0fsL5-KzdlO$7&cVVGMT= zKsHqF;lQLVWBgcv)ktGgDxMx_eu6&EOW;1)XpVUF@r@Y;Pcb%X0T?c9@E(MB-`3IP z(UjJ*1BU>HH#a49MX3Rj5swfN%iBsKPpN|E@ zz9Cu>OWEvBuK8^+fm2)3YLq_>`i>&HCI;`u(;S0{f^1nZuVeHN3W0QZutF~7j88ST z91f2o$y<1h-QcExQ0jz8*kFxLF|DOdhGUlK~lA7rW zdqMCZ!r0O#JJ>)F1QW`O#{P8!y6?QzYAv3vxAC<{wjtN}caNUgYzKdjdYNC9C{iYl ztg*vM1lFt~_4)h{JJ6+ zA!EwHiDm+IcJP1S9iAPW9~}H>)k?tv0`^&qE3IG}(rx0VEpS~XIV7?*sR+kuo|&yU zyOCv$WcQRO-%NXh$hIW}*KGrTd;a6$>G8oY7yopM99WZ2%kkKk>x|*sj?XX7_70CP zE>91Sj}KmpKI5Blr2hbjHJH$Td&dGc~Cjq!j(6jxF6OHiGR0bo~8-+BkMqK^LA zeo?!w2?d~C^B0O7(v0xtZpv5ZTzc4uzTD$i9H%T01{_bETjD{? zo>bNXqSQ!yV|(mv&hZ;1FxN3FP^8;}5lfjMAR<&#uv`wM24bI+t2i4${hFBy$R>n= zh3o&II5+gd%4E2zk3oqi|7_sfq$Fa-FVK{Y*J#azAR10>Ivi7UL?{5y2${qdPgFmk zH&==XGZ))Cu95YNTEMzF)>Xul_;xXxms690#gH_lLsGGlwq1_`3Nl2DpA5`Uvm!MoalrH!I#V&x^b4anhFG~wt~OYRHU(FMJfIQU2GmQ_ zWEbdVNd z3F4zDz^H=q`)o1=Co{2AkdygcDjfhnuAxKY+vIL#!Ie*Y|uLS6AMv#(^BvCxlrl8CM96-tjQRAV1Z<&-B zYhENUa&Wa|F#OIrCDTBGiZ7`*881;P$&fceDCPr)=@LP8S=Mz$`32Fk&94I6p1{VNSK&!vnKG0}}vL41+To+?-_xc!y zlhez$`A0UCIJuPTdXdRQI}L=6)zC5(kiL3x`rI1=hAY^k8uKJMh zu}YBTG^DCu=2g_%EBBG+!P4@4D6c=Ddr{w8pPsp9g7+|8Kwfm5z%i|gimC|(VwE^c z{9rs#K3`O19L9cRr+B{+6cS7(^tgP>>jQI#*q*ux$o+cgWLR2p{HBA}ocU>KeEY+&u8Jv_CZjai{OEC#V3y6}cQt#)Yvt8I@kwOp7$vY;w`nq#MRB zcKFECQH68oCTTi-z81_k!tHt8e-jconk)gE_$6y{&z_mc2VwJ*K$FHWpd3y2EwC|H z6dI3Wi8uVV)s>TAdTnfgw5E;hcrsT@7AvD12}7bAQb~}NtnF<$5qC%bF4;xLBUyRf z8Nw|g;0A(!sT>1h-_k^fl7|fJ?xSC;1l^Kca-tGylL%hZHDm#eA5n34$jUZ zyBL0NITBwHJ=Ps#6i37JLm8uThL>9yc! z#8q`wK?93Q81Uf<#Vrs3j!^@eGs?mDjDhNiUZ@5#A85<&I6%(D?wsOVacxe~DuJLt zkKVI1LvSx}w?ZlhXkq9qn%n45r^`_!iW{WUC&^HE6WGq22*dP&qQWs`4tpxKu;Q9v z=JfLs#1Lw(!hXV-PdZkPPF^o~lad&OzDOhQDn^3ViV9W=#|C&O9f34@w?xdzuAmOf zHp*K{ZiNIdE>_zwNboZQmC+C=`qHZOW-LGC70`#lGNs_)@cSPe8~-bm5j#5k{`l>| z@dXi2Id^<@dp+C18z*_ARa=aNA*rSMlnB#74|Leyg4x=^qm1WaZ)96xANlSDm-s<1 zTPF{jdnI7b_-yX;*ucp?gj#z#e*>IL(YpEQHopVGy1FGh9)&uI?YMbK{r*Y`db9xK zlzYdANdqBlc_xiFHP?ueF>u&Jcl}aZ?DuflK7cks;XTB07te4^{A%6V@&y|vxozH| z@X$B?BFcUC2bZglDnXKSA4H2PNfN*yXvo;-Kd~r-Fp-Nnr4xdDQqJ$PmS~AmTvcy> zMprFI3iN@jFpNK>R3{=iJj^ya`Y0u6EI}+3QMx{TT@KMXGe5%=HvwiVO`u%pc7&i3 zH4-!J!wRDu^uT86TYxv>)~Rtt?Y}iGqVR~)B)8^P(;zG1%#d(iMa~x+egaELcI154 zzvJ|w`u?S{o@_uDT_yuK7{qh9eI${4!~#@H@^p&;Glqfc3t_KQ?*GF zP)snk@Dx9|b}zUceHttoTudBgG4H`7FV5M)0nX%-OI}m_p=({C^6s^#(J3v*^W<^U zVRbSK#+4hS}=yWmf^%#|eq+Tit_-bxT{XBXUTY+E+RKg+KCIA8ADN=Mh zv)f5#x|o6rRmIPm!)Wio*B^_!uhFV9(Le|HG?4)S!2h}cBJ?!{vF7MK2;PT9``Y-- z*QaOuh)Mw@6Ww$Wyo#=*7X0SbOL2ijk%a=7$V`>-~zD8B0D!v}Rs8xK=_meHsn)4K)rWfcWe`aOVzv=;Z$ZvVRZ-ei3T zzG#f|WyuKB*fc8_K4EO24Jh$d(!+wjMd3#|w@`9nU!Xu7wgq9#oKb{!7zzEi6<&71Rsi4o5_4FR(tLtLE13S=q7=HO^>%C+B zO!Rqz7iW9>2d&muygcttUptZTdG@b^?r!T}2c3T%wEunlRflLO6HsbEKvZFcdi8^j z+|CSIEUyh=(D5vK)R{PmoRrlxBOQ;mzpj}r0pE@t*}L(q7@Cn8Q&2we{Mi^jm-A=I zXSN)(lxU;j+kbUN&~6sP!raj)dKkG zWPIK6nKNF|i(M|Xgg~&CF;yNPe@Y{4V5ZBtDduPe+!Wo~@w3L0UFW~aH#`Tf^HRf1 zAytkAvtWdlp?(=N{C~(KHX{#{w-h&Z)c0Ldq8Rp%dcWmS4)umLo9K(msF#e^Hc%J<#p zr%pVD$+UemBU)2AfW0KAF$gPMQkAtIXk&-+psqfYqk&QijTgp0OD6f16vCS^Xn&F9 zAP_mkh<3s(Saau6w}L(5QQq7fssNNtX4X3G9I`vHb=r1fFWhja%+g;@EdPjP`5~P5 zZJ5a32yHp7hx9nKaX9$=>-KuHQ>Zr6H{wM%t$GIZmurDvS`c$s#Jf6;~2HB`AOrFFO&ObRikqfqIu+nVc(Denu0AMC}bvp1Z56*lm!vz6= zI(J`cE03UN8b!WwN@&*AZ`=Rc;#OkWWe3^44=LuBdp#Y%eGfd^@>UEPmy?wI`w}-t zgOgdc7F$o-vWRO@h+X1QyErIK@)r5*sk7?z{-04SZ2K z1){|yk|5zly)r`9MIUSCB#$9GyxqbGPXVp8@->7EuCKC%{+$F~=NOFu5brpJJCTags2z58etG_<@v~)W zpt|9j!iADg}+1L(yb5NvtDlpo{79-gm#@}?~dP{AG~&Y<=NibgNuW+mVk?} zXkNRsJMJ1faqK6|?RR$ojz6Mr63icw3;W?TdR9!7zb`)w z|KrX8_DR*5;ywW?qPoh*JklA2X%QLZ;XdBZWJx1C{joYT6)6FSEKH8x2P{+$WRJQ& zP~b5LwAR(LCcz{Jr;PGFdy(iO%HuTWlo6p}4=~GF$3OZ`Z?=N3|+s=N= zTI-J<(QF^$t6~i0l%f_5tj!~lx?nGH9Bt3s-Dlv${0A?(EO`Tg`BRHuQb=*Q@bKY% zi~cPyIyMk2IIY>1&sU=^TJZ1k+5yZ(rJEBDpd3c10WO@aS2(dF5DxQfaxrVoNL0& z&3i9*AT&MV#V?vgZ@VQ%Okc$|z`T>$;Z$>oe!q_cld$=}Y zg9ooxfBqZC*Y*qYk1)1Cld$}COUwS`X37Doj;hbWju8<}!gs)#Gpa%9P43VHI%nM| zaz!V`+5>!WVbtv5;g(CRbZ5*E+Q^3@hhTgOB$f++2dtCz7nDhX$rILC%fbHW0YYo8 z1-vJMuf`0V^c62hV7)-&kTLJn4LjyFZ%WGawOk!!_=cm8TuRi~meiKw?oQBNe592L zhwSkl9wGd4G?}2;dV&#J3f8wD@_0v*lS$ao%{V|aHlVj-@INC8dfrPt-`fll6H;Xf zK^Tq%*J(`{Mfgh63mOc8n_AXOQgb#>zwmy*yjoLu#g^RL4IFKonjb zWs}@PJN^hng2&s|C%*8ZroElJf_u_Y4wG& zm#AT->cjUTZ)P2LmdI>2zJ|x6cbv!@qDXRp%IjBQ4j;;Fq)+_bz>7Rf{BowW^QT$R zGKTZNtm6M6tDpi+_xUF3>TSaBp;V0xi`jSZ+3GY+dWg<>ua~+b_nrRQmEwG*+QAZS z4%eCrCXFK*a7l?&U+0nnP)2tfSz7$7T{G2EY=u+VJrU)Xs}F5kZE~e#EY*MLiV|)Z z*IR~!KXU9t;k@(N70TimdjODhH#r7<^eHnCr#qzaZU7 z8_(1DpmrrKb`Phx9qM$!hbBgj?uM17}nk(|F+XSr6(x;N)Y!vbzWl*-o1Wa%) z`uJ`B`HdTw7@=-z;W;vDcdAKUrh1E5A&OwIi>erFktB)%Wdz+iGKGxb;HSga2gmyd z-IF)Zv$O8b&XZ@`-KU#dkDp252k3z!^2-|nT7ZB3>d=kv`|!NxMUgd`>10U6=ztOq ztx$v)%N_YlO+pkxHAgI3k6BO4Fe|R9;uplbQZuw&2wp-UV{^bCf#9^7BtMOa1KjR` zo)9=vNjfjvWon!>DbPnwqH^j!K5heNxrso# z>d!u=N1kXyqL0wPrA>^{wVi6hPlXQ8#M~m1dnNN4GQ6^NFnpQRhYNYur#wV2IH|(s zN?f=cGd2SZN1U74Ih*s955c2$sL*u10?2pU1-l_tw5T%TLqEE5_Yz71gK;Ud8? zMyw$zgb}`5_r{>ia9CmSBj`*iILGZLJuHsA*YO_G+Tcs&I&b%W!PJh+^TU5TNWME3 z({&xnW_8yQY@Y_KBM~~kp1!#X5T&t%4N7?qewr-ZS*Rb9`FaatgBO8MPkXUAj!fp}# zmO#&k#Vv%t0XtxVkB|~fF-cc4k11C};t^L_o)bz-#nL3AN2%5Z9k!_YbzAz<8@#}9 z^_$`b-k|{XEFX}GTKq6P7+e&LJVs+O2q z`1yO4{q*haKiEAr0ocXVp*y}U-_iDaxUEj9G#|OCyAOj3#@1JgPX>n^kNEob`xoK! zz+wGI$Q1v!?a}f4hYgGHXxlFXJvyIE)0_1qc+$<+J-OS9Rvms;UNjGrZ1*5+Oh12A z{cTqs_>wL%UXj%7x5Me%Q9OdTb}d2q!d~UJ+QqK^2FlXWz}=u6FG*fR*v;WqsmRAidPAZ4aHu_UrUY=oTK4ZjW>!od$ebo5&-0#!8-l zZaR4ND|E`3Hr=e?i`}IguCMlbbz))9MdL&9g@YE2EC3>|!Q>#$_SrIPc%j#Gr?-uI zM>$?7OaRNrR{RGQ=Nwe@K&U2jqLP%)_wr3g1Fxoct%uOVub-9v!EY^HleW9cpY;_I z&{5+udms%3w3H7<2hV~!YK(kFa=}_ed!8rM3>3vg#en59tvrJMx_)~f^z2(rg}ahR z$~uzLr$+bLuBX{7=x()l|SGwHD49#QuY=n+_Fz z(42irsi0r3f_5@r5%3ee zQg9W8_37D_smvE1Fq|Sn>KgnC8O-@;G7qenXur&~yqIK9Zec5rdCf=p?3(kEXfF@~ zla2P}^_VKV4l^!8>CtX9g=wB{TFV|Xa(8sz zl;Z)+%G&j=*{TOaRb;9wyp>e+fz58nVy>-TpP8S)5>+$4LI2zuWrlNGWI4#9hE79c z5-MgaTEI9SWm`?LJD~}2I;R+iD{FcTXfF2uD>m+kZc{r{o;<7E!uggy-y4S{EkU&! z*N_xA#p@L`b(4QS-Ipb)`~GofG;tNq4GxSv&1`%O8*H$1CdPJd1{F+lEf7PPuuG{J zCxy_MeE>^jOW)r9c5Acy+MND6d5HHd|!sQ7F+kz(5#9a_M&E3+}} zT`M+tS>&@il53wo_MbzOpCP`)t0DEp+}hgt?pgQAv(4>oun^_hEm&n>iNJE?oev!! z5~;0uz)6jcbn7Ctqe2o3?s!i&WI<$jv<}3|cb|M4U?kc>pA}-DqC=G671=uk6~s?< zRCcJbMa;OJLR>ER5t+tbVkgzezPaDGjrL}zL2*CN+A83A<@oa>MvKww&28*i# z5v=jpf?N8E_=#P3MI)UdJF(%Y7 zetMNs6aA*z7;sRAP>rtw<%GVgZ62qU;c|&}^8>(}a6n2b)=dgsdGh*2TNurL(@$72 zm9KX3s69ej(%lKd@-0cGp)NUi_LQwKJcAdyY2?m5b}$A~Bvjc$*#xh&xstEC7wY(& z0=qyMl-#21IALgk_3Idjl+iQ~2cOBqhi(-7&^i--ea|5oVOSzpezh*p4FQ-eN=yg$ zAa9&q9)Og!u#n{FE?Szl7eBQ)^YtR1<&F~hC?-yIuNK2$c~#=E5Q*&uAX(TqZm&vI zEfXt2NZmlMRKana%myTV_h*dKhLt&06rWG7v1UdG07d}CGH#qI1W+}>$^gC5>Vda_ zHdBvzF$zWtrvwW?=!rM^pa=#op)E)+t}wi!ngE6hjEq`wf5VAg zOmPt?C{3PDW$$BbD(^RG(@B4{m0aDyY7ku`rxf2Z3U$14LP((@K<2TU_?q&3DUnGx zMiQ?IXYWSU-U-28Lt_R}z%O&E(mOB7(bWXQ@~j3F8~a1E zo@zSVV5eO-DSFi5HDc@4Uj*l7lLytk^RoB!$&<%V6*D)M+P{1JM0-L0G z=BRh(8NN>fG{w6>iVi`jj>W&|y8EOdDsGtxwV9+NDBUXIsk7+W_L_vW8h|W0U=zhl z1d@I;o!`*_ZgU2{a@sWxj$n(jABaqLhF84Dkcy816j8QKGm`*>H5*Tl z}5=^d)vS)S_jX1dNaP_S< zhnXQW!iTdfD<#t#fnobv{ent@@F|i)U-n=uj~Wl;n#jN)#JNMho%Mv^VJlsDJC+HG^nV4dRy4r$==Wd3iC52XAYhC#_>U;1T$Sa-6>iEiQ)|A~c4 z1{z|(?9#DxA(N_!RGjwNL}jsnB*a&Jh2|_xa!nB=spt&>wZeBgL=~C800~2A zJbl3k++af|wXaF*V}=LA*HHd`0YT#?4+G`;Pvv9*hH#knRpAe!Tk39)?TpPn6!Ekh z-t~wD9s$c;LNbJ0fcU%I_o21Xs)F1AGFK~3tC^hFT(ga9Q1YN)_<$@}?LgBk&*%AU z{(j9I4r^7^mr9%p#c8p&xHtF@cRI#%8{bQTyZNZ7Og+B?It|2Ttf`V53RprF$Oze7 z8qQ#cG&+Dqvnn4DD)x~;vcM=3**W4^#)oP7s2C&gXsPceo~6#*Npbyw$yHJnRA|G+ zz=cbP7H8QxmZ=6$2W%whM&4J0Gp-~LMN~~KREMso1am;w$@mUnS>5@%p%q6DQ>-}- zb?s_NVOvi#+IRUK9H2m2@vqZ)GR8Pis_JeAv@ZFbCB+e%gFSpTN`>zxo12TJDsJmp zQ}A=t)~WHnkn7LMs%~euHaE4UF$Ud%w{uxbXglOGy^+7kPw!+_UUL9tnaryO*O1iC zQ|XzmleTidHzjZ|HE6_;+g(yb9BnT|o}_}ejhgGRmg$ZD0t%Eh#yux=e+%Kjs&G=L zt;P5LAsyK;c*pK((7V0ZZt>`;$Zs~cZD~ueZZDgHVE?o}UQ(X+4(j8pD&#af&Ec)# znX(?u0v!3shn9k2(U(5jsd7h<$7pjxixr|}Fuh-6RNcv3aZHdblj1_hf-^C(Ef^f( znBZueqn?417^mf$35|fSD5lc~db*F^n;;Y+9DGf|TlZlyn_od0$Rwb&6*EXf#_<`^ zS@IW6({Y$145HnB$hji09DLxkvR_k~c!CVWz4_tsb0Pej&$c&|4$;r*Du4`y zR#oY$^&*&I>^7g8zt@Mg6%OkU1vqKXI6}Bnc12#0fsDvKXT_p~`kZX`>vqqdXM*P9 zxd4|NWxnN30NPbb2)q~G+sU+FR1 zZ6u3-M3t4+g=<0&U0yovy7`9kH}B0Elyh}Bq}u_Aykn}?>(5V%EMZg~Kpq3}(b5h% z1yLS=iRj>hYgh3xiRh#>wB)R~A=FQb`*0V{AW>w#`<%BBMqb}OAW8Ao(K~q9B61cy zuq)qwNysxD)<-I7bfq=_NW8%ySDG*JwO;VC59eiI2IyqhM&zwLM*9*dchHhJ{+0(G z;>s}R{Tw+YMVV5yNZf-$J&EEON<@v$>yR!qc<>2T*xm1f#L#{Gl z^GhHeGNH=LAWmmr%!*5TT=r@r(RpsOfOHOIU7*(t7atc5RfksHI}M)*nItnaP);!}a5)#C3d7P#%`xhk!C-?J zjTwlmRBVfCdvgVDkLhzYx#>H-ih|ui5v~?f2;l%&jcjjxM-{jRQgfNgSq{o8tn8VK z^y8g8P<)|!&i%>H>BXDNe>*rkdA)bB*YtVz8~%B8u=gf@1U@s593Ef%c<|Si9ts+b zvXo&zs7!FmB@CN{HcB|jK^-y8WY}}FpWYcaEqEQ1s+)@Ry`HK$Tu1jWs8m1CHrsz# zL9(trib`t9=y!J?gSI4%%36STaO>qujv|wX0ov-n!#qfa)0xg_Rkn-E_}xQ&Chr*kw3=)O=~>3JC7f4J?%dJ_VH$LaJTVj zY_E85xu(W_=R-#0&cb%{X?^nD)2%1no$Y7gRodFbA?5d<)-N1Qa6~toj_79MM2}G`Vd%u0U`KCV&dfQeGoN)xq!0mn@-a4tH>R`DVk`}D%h2$m_ zU1DQ<+G!E;W(5q106mKxv2pXda62m%xB;=+EAR`To z(a=I&thx{JV$g3gnEwH|a}wCB!5#iXG3YDAq=Cqlu4}zQI2&iY)LNh-s4Fx;C9j*X z+3{Gt++RRxgrcV;)+*PattU=k2Tuy99cv0( zSj|n4e8M5WM+QzycM(WXBDvN)Kb_7{In65$0ZRp8H3lFAKp|wSf0hO-PKMVlORuJd zs{>Y3Tz5=|X+p6a`uNGSXWhp;J5M(6Tjnjq@~V8~Q?SCr$ee6CMr*PJ>S^gv0%o z)k_m0lRUBRY;1O)Y=8H7^Zq=V83!&?V;H_HAe?T+oy>#@nNpOj7)}@@KU(GuX<&8F zLS`ggcGzsi*$t^2bE4{&_Abj2SXnUfgUQG*UE6n`mXS!K8pK&t{&27v#_S_oJzXy^ zdz{Su=y6=k29F**6MKH(v)#?$1o-6`Q`$%52K<8_AKC=Uk8i1$7(!rDz5!vB{)|f= z2Rff|S74X^$XFzTE$}FHcxe@w63Ol2M$W+`zzjnwvBqdXN{qXK9D$V{gS0JI||^QLCda_xra@G&Mx2>Q76@Tk z{+0q|5jOg_KMOMR`*I?8=>0Be4q1FIM`e!i%ifzs?wUbaeau*LTesn;Cb4krc;WiWV2AiNUZ2C;+La3pZ5)5Wkko&$nU1k=X2%{h0H%X5>V8J1L%hnF>Z zF&dR)lx7Gp{5j%$gWLX=0zMI~!ilkYIg&g@3=oBwOCPjO{Q*W zNOtCO#6j7j|Ftswc`Jih5>if|1R3?3a$rVCI8>fJ`EIAXx&7=rQe>U-M2aj}-;EZ# zDK1J#VpWkcwzqD0@ya>_nHC`_+I-*sVyQ~k1mT+8Hx#z`WNRCL|==63h-_P5{e+-Kl;92+>s&B(=Kr!XwJu9rUc5idb1&D&ot_YaPa zVEe59@&YowfevD4oJIyddbOipH0UW`>MkWhiGjmOJ!$LTllSc&r(K3;+q@ZPQbh_^cS}rJ6i<=) zS|?<&bidrW1z3!)$ow}54kS@qamnHVBzDx@9dcNX91>BMK1S3mp-P2kXeqwf9MbS1 z(CRh>t}iK1vT|zeN5B*d#FXsAWHexKf$;=GuS(2^2@6bs9WfyY_}Gk!WPtjKn z#*xSk)L_eo%mTE>y=a2zZsyNgG6|S^bKHI-k9M561&gsxSy4+{Nb=|&)9yc?GLRBz zVo63%;Qeu7LD1F*1l`%}#7x5Rx(|%(X+Z@6VXp<--Ns{p`cq(eZ(;OH_0ag2HzCYs zJA0lz!{*}dG2+e*U?;@)`&PmH8p7|Q0jKV`;o-r|hH6e#C)U?`+AjPkn>XGF;qhaOxPZ(OU?Q;R!X=eyORVlz}~C7?}sJwl2H%fO$k zx6@>UZ>-)y*Y1Om^so&f5cAU%#I&U^@P|Ml>9_D(BB`(D;iu4V562RG?uAhLG6;dI ziO^=ip;8o&H$cP0*Is0vRk^1{gbDW=!xjR?UW&)Utnx8}5y?liZUvQ`tuSk%C06dCp;UypuA)wBT=1;=w*Ao$?z(TP`+2+Gy&LE-OmV4#@fZ#dQ z!oI#66Riuf-FR}l!Smt=hYM7rZwUe^IAMt0)M}G_T~=zcAaeoD*S&{u%V<$2(*erA zS{5grO4-GTTR*<+)m*h#X^EqN@imLU3wJ0%+(F- z5Izt?cS4sJU({>8K4mhWafT!wT5n*{1(M=MYAq$PF6=jTn%v&_kIxSFUY{Hv{Z(r+ z6X*}zmxwL}A`bS&<=y%BR9C5QwZ|_OArMI*y5}u}d)(obXNtPM-hQYw)icdBngB1m zj}8k+v^K*9uwLEk_Hg^=Bv$|jPf-?vaN3YN&&Uw&bkQEGnN5(zjpK*k4X|zh5oBs9 zw>okH`(oOPE`c6)JUF%E@@1Rr*@)d??zpzeo}KY)3C(4-J#4_KGxyGB>j#1Cur079 z)kXkA0}A}d5}o4E5{Bw27I7=|=61K*cI9zJb?^wH*s6;F8Ze2=GRFBs1>t9#^wZ{x z*--J(zXkKAVK$(CUIuL^{rOPbF zBXHiqyOL#xDATw`gqc8(qxIdfyJ|8s%cZD=$OhmUp>QjN^+=sO0l-EqT`C?)Wt=0{dR@%jGN~=UiMfW1?4ox0n)&T2toK@cut~-n zwm`s=`nLFD@xHSwVILP5s#q>&^`StB7CnGf-mi-ClWz|f5%*3xdH>Aq9A@LB*J8F% z^O zc4Km4OsKO2DygrSiDgd0(|3utU`rXnpO7$gs)3a8_Z55g^2ZnIb1i{) zJonJeCQW;1D%2_U9zpe_HqLK5bfGHe@`ENduWkb~kF2QStx1M5sqTcPg?0(%CU|3r z6m~$HKsp>p?=ab2L{9x$`KK=gqq@_~NeXE@|%&sM$e~!;WtYHytc=E75x6>7~fxoI0t{@-Dd8WT| z{PS1y^!tP-0?$J1OhtnQl7-n-uNSUOAZGx@GXfk=%bRKh&(@#}K!wCH!|N)*Zf2QJ#-#R#Hf{63@nn9y7>!bH z?xa(;!TFs2oNmlgteAhA%~@^UiE)2{SKRjWZagc7vS3kna2y(zI2jZsUOH3`Yr8SM zuT9w3`?jnpR^Wd(5;szoF|mbOYWM*Ch=L?WumO~Hvw)5UB$slexSb5jgTtoN>2$9yV4I5t3Ixp&OIBl1OgTsnZa z0P|ffIMSOf)nfg-a!t+}%v8pp`2T;#Dv?`cn{m=C-qd_1B*paVQVe_%d+yGPAqkmQ zVBs^lyJaKEQaqHt^OBwBv8J8$UQnfAxSC`qO_(8U!o&B18KDehpuZ5n~elh48gpA*^XUox5{6W(B_LSBdK!KoJPv0$o8jY`i=81|4Jyp1I*d zJP3l`MYGxX+SFDF2T+f9HLo2N1u1!5-bqbql2-bx6Ub$C(pf^z9fO?;^ z>pE-(Tn+ia2_^2CnzMM&U(ICzAufU2fcBFguMg{?zSZ}iT9M;qT8wR=3YedeXT$&h z_Qw4+cI-_`M&a)%b1?<;2G4`pXH5|4!6rBTP}~$VM>_RQpn90kGT`X1#4~t*pq)Mt zy{nPaI6lEicKc6I#%id;i?%?u2pnVGK58h8cT7$R#FM33C$~94o~Qbhf^+#|J^^-d zg=J3!#Rr3Y5i8wTi1$bCfZBu3yd}-hkSswUbcmJ}^2U7|_J4i?ahKO1wS1xcomS z@6L|*&<^{JTXXv6?ZMlVv%f};UONwwG$-z)5#B#?Ojr(m%=J7bE+%L{x0FKZp04O3 z5l6n63~W{tv`M=KwrFB+`8bFGKR&-W+dDiKaWu<*#?p#FuQ3@$iq9i%zT8qQpws^k zH>B#m0dwJ(!31Owpk+vH-Hh4ItWdi+IEal0S_MQU@=jpRi#btnGh1GdxcoG%95wlA zSap;E{q*J>x)1>#B?^x9MOsKzS13SC4`GMoU~`kv3cKaUz{BHpe5$)(8E- z4h#u5RW-RP5zSlQAz~_4WE_+e>F~FXdG*wTDgtB|JxPn7fj?mGw%D7aRlbfa(EwjC zB`7C-&aK#+geXp*QOPAY*O?YD@C&{18CSop!gx&2H*1+q{JnT!67luA3QZ+!Tq{JO zNz_BiZWo@oLAH+nAmLVU)6<#blHl}&pu{Uv#(5*VD6c*`q48fHKY9G^O0{oL*{K$z zIaRx1N0lutszAtR6jqv=k89->qbsmJ+XU|rMl$~Gb^iy<4g7U$bMrmT?zJ8%LZJx3 zg2ii44v`+9E@0SA2kZGxX1S%W=6YbFS_L(SU-#Xb=sjU`z5e~{Cg978DfXP@@K5=y z#JJwFa?-D3y~Fo4IqQvr(TI4Bka`W?W=;l0R2M!%$`fFHX z3iLDLj(YOYla(_sJU=}C{^-DP2`b@BU%op&IeUF@cJMk3zHSXQU^IA29Np3P)J6M& zW||-xTe^E>zL)bV+lxKRhQrqYeTZ@oY`5bYgZI!!z7c=YA# zS2!_nHb}dsSM?)k6TP6h|4Ox&{T6g{aq#xkeJmp~mB-&=*$51ChoFebkfH+Gs(?P2 zrW0b0Puwikz=5rTE93%90Iqo_eH@>=hmH?k&{uc`2mKdtugCGlKL26Q?fvEc-u@2< z^f+eI5!VEV!wd6id4ZG%qdn!8xJI)F?A~rQwTv}#l25%pJpb|Vq>bl_Xq4oh(+E&> zbjNytr8~%MXyh|TYuyP0gBrw$;@19Co}xsM)idP>=Tq>ym*&SEq=&F3HZ zJ)lXB+I*Ie{L>`iRM-@K8%0fa!=s=!d>|Gr0;}!GRCIK^s zDmt^4HmOgUL%VV}Z}-kG4$kiHh?;FHt)#~x1Kp9=-uFi*ulA0-ou(t#9{=12>ULB@ z;sOSI!+&}dJaJrno|`QW%sNg$9_}i_pB$6TUQdOt;JjJ$qnz6?L}N20PI=i2pK|Bk zz6Aa(_fd3OK_GnHx90&<@g1cF5o!Fo4=Gyi&s|K;cYk)HV=TJNfe?3KYTz^L|LPup zzoB9AcIN(R$cKIB(e%RIbb9rtBHGOrpAU{%{Pexo>z)f%cYBE0A$;!l zO*=W>W1J+dDMh(7lIe%YGcJNw@w-Q)Gat9ReyH;m!^|;uMLK-TB0c$Ii z;6vBbo!7bTc_ z+5u#v4P$EVJDhT;tcUQ`mbaQck%tvn&><2w;OkjCN;*Zg`y3+)E+LcvRm?0>^C%tF zk@BO1i-WcwMBGa79NLrWZJGSm`x`v@>EP_=vqNf31+WCr;MTKmA9o*r_jK!-j}=D> z#UL|bnt~z+1Jugw2GbguB5sFJ2vh)b0Df}t#cE09t*4wP50*|#JZp71BA1s`kO;Cg z!Mx^8m`~roeEAHF5cb1w-G`211=Pi4hC;e1#0dvUq$2q4{epl8m*Msj=NF>j{L5qs}0PJY_kfA{XK;q|l@H~DpWMGisZ(n9Zt)*MM%Kf!t9 znJr2u3@kLC{FGlU7B?tGz&34WEzaPBFT0=cTSwqfQcwxrdwX6VyxDtqWQUFHZnkin zb;2GabpC;BqLXSNu&!dw(moV}7eU)kcs zFR%K1XhvAg7!atc|41i-hzs5TRY0o0wZA|EfIsU~nGkbVxDfKn8U>}1>tU=nhDw!U zp1r>@P@F+4OklKz57IDIzNNQw z+teRaKPCSac4@+X@pCg8c2)5;i4EJ~@Ua{4?%46bhruutW6Yu%A1khPcs&#INjz<) z70;M=pBjjV;0Ifuc{Bzy-*AESx4^XLD;k>nDKRwE!dgh8B#SAjG&4=~STxA4)2ctk zvqiRNt6+!rP}O~tW>PccILKR{$F$ceNVqT7gncsYc-6&VB&hVx*rCG(1i(>5Stpa2 zXbkr5QlJ>hjzloLf;h|}s)Z7FvxCo9js$S5xCD+&C{$6b)RhGFXv12GQIJW{YL@K2 zR-V&Fcb&VZZt~U?(U&Nzy~zZFl%0euj%St~iKKHR%cvRZPLbRIs~X8}@KIn*F!BU^ z=RSX1%s)&9Rc%}+6+GY=_k1=P{ZK-5G<=}Ld9#0faddh5`c+5ra3l&f2*Rb#yjSV| zkZy0s&!W@TZ0)z1nc<~yI&%=fsmx*@BfjO#Y7lxV5%0Aoy5l)zMz(=68U~Id(9X{s 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%0A@pG@O*X)D*-Rf0=k1Yl)x`s8p9sql|xdI6@6 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

    =yEf4j}8}3rvMNN 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 z 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